diff --git a/Makefile b/Makefile
index 07148d023ad..cf320c428f6 100644
--- a/Makefile
+++ b/Makefile
@@ -46,6 +46,10 @@
# This is faster than the depends target which does a complete dependency
# check of the ReactOS codebase.
#
+# bootcdregtest
+# This target builds an ISO (ReactOS-RegTest.ISO) which is used for unattended
+# regression testing.
+#
#
# Accepted environment variables:
#
diff --git a/ReactOS-amd64.rbuild b/ReactOS-amd64.rbuild
index 6d9f8640d08..b82bb361d0c 100644
--- a/ReactOS-amd64.rbuild
+++ b/ReactOS-amd64.rbuild
@@ -34,8 +34,8 @@
-U_X86_
+ -UWIN32
-Wno-format
- -fno-leading-underscore
@@ -44,14 +44,31 @@
-section-alignment=0x1000
--unique=.eh_frame
-static
- -fno-leading-underscore
- -shared
--exclude-all-symbols
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/base/applications/calc/convert.c b/base/applications/calc/convert.c
index c1de5558a94..26383080328 100644
--- a/base/applications/calc/convert.c
+++ b/base/applications/calc/convert.c
@@ -56,35 +56,35 @@ static const conv_t conv_ANGLE[] = {
/*
1 acre ................ = 4840 square yd = 4046,8564224 mq
- 1 acre brazil ......... =
- 1 acre france ......... =
+ 1 acre brazil ......... =
+ 1 acre france ......... =
1 acre scots .......... = 5000 mq
1 acre us ............. = 4840*(36/39.37)^2 m = 6272640/1549.9969 m
1 are ................. = 100 mq
1 chou ................ = 108000*(10/33)^2 mq
- 1 danbo ............... =
+ 1 danbo ............... =
1 ha .................. = 10000 mq
- 1 jeongbo ............. =
- 1 morgen hungary ...... =
- 1 mu .................. =
- 1 ping ................ =
- 1 pyeong .............. =
- 1 pyeongbangja ........ =
- 1 rai ................. =
+ 1 jeongbo ............. =
+ 1 morgen hungary ...... =
+ 1 mu .................. = 2000/3 mq
+ 1 ping ................ =
+ 1 pyeong .............. =
+ 1 pyeongbangja ........ =
+ 1 rai ................. = 1600 mq
1 se .................. = 1080*(10/33)^2 mq
1 square cm ........... = 0.0001 mq
- 1 square chr .......... =
+ 1 square chr .......... =
1 square fathom ....... = 1.8288^2 = 3.34450944 mq
1 square fathom hungary = 1.8964838^2 = 3.59665080366244 mq
1 square ft ........... = 0,09290304 mq
1 square in ........... = 0,00064516 mq
1 square km ........... = 1000000 mq
- 1 square lar .......... =
+ 1 square lar .......... =
1 square mile ......... = 1609.344^2 = 2589988.110336 mq
1 square mm ........... = 0,000001 mq
1 square shaku ........ = (10/33)^2 mq
- 1 square tsuen ........ =
- 1 square va ........... =
+ 1 square tsuen ........ =
+ 1 square va ........... =
1 square yard ......... = 0,83612736 mq
1 tan ................. = 10800*(10/33)^2 mq
1 tsubo ............... = 36*(10/33)^2 mq
@@ -101,11 +101,11 @@ static const conv_t conv_AREA[] = {
DECLARE_CONV_UNIT(AREA, HECTARES, "$*10000", "$/10000")
// DECLARE_CONV_UNIT(AREA, JEONGBO, "$", "$")
// DECLARE_CONV_UNIT(AREA, MORGEN_HUNGARY, "$", "$")
-// DECLARE_CONV_UNIT(AREA, MU, "$", "$")
+ DECLARE_CONV_UNIT(AREA, MU, "$*(2000/3)", "$/(2000/3)")
// DECLARE_CONV_UNIT(AREA, PING, "$", "$")
// DECLARE_CONV_UNIT(AREA, PYEONG, "$", "$")
// DECLARE_CONV_UNIT(AREA, PYEONGBANGJA, "$", "$")
-// DECLARE_CONV_UNIT(AREA, RAI, "$", "$")
+ DECLARE_CONV_UNIT(AREA, RAI, "$*1600", "$/1600")
DECLARE_CONV_UNIT(AREA, SE, "$*108000/1089", "$*1089/108000")
DECLARE_CONV_UNIT(AREA, SQUARE_CENTIMETERS, "$*0,0001", "$/0,0001")
// DECLARE_CONV_UNIT(AREA, SQUARE_CHR, "$", "$")
@@ -197,46 +197,47 @@ static const conv_t conv_ENERGY[] = {
1 barleycorn ..... = 1/3 inch = 0.9144/108 m
1 cm ............. = 1/100 m
1 chain uk ....... = 22 yards = 22*0.9144 m
- 1 chi ............ =
+ 1 chi ............ = 1/3 m
1 chou ........... = 3600/33 m
- 1 chr ............ =
+ 1 chr ............ =
+ 1 cun ............ = 1/10 chi = 1/30 m
1 fathom ......... = 2 yard = 2*0.9144 m
1 fathom ungary .. = 1.8964838 m (fixed)
1 feet ........... = 12 inch = 0.9144/3 m
1 furlong ........ = 10 chains = 220*0.9144 m
- 1 gan ............ =
+ 1 gan ............ =
1 hand ........... = 4 inches = 0.9144/9 m
- 1 hunh ........... =
+ 1 hunh ........... =
1 inch ........... = yard/36 = 0.9144/36 m
- 1 ja ............. =
- 1 jeong .......... =
- 1 kabiet ......... =
+ 1 ja ............. =
+ 1 jeong .......... =
+ 1 kabiet ......... =
1 ken ............ = 60/33 m
- 1 keub ........... =
+ 1 keub ........... =
1 km ............. = 1000 m
- 1 lar ............ =
+ 1 lar ............ =
1 light year ..... = 9460730472580800 m
1 link uk ........ = 0.01 chains = 0.22*0.9144 m
1 micron ......... = 0.000001 m
1 mile ........... = 1760 yards = 1609.344 m
1 millimeter ..... = 1/1000 m
1 nautical mile .. = 1852 m
- 1 nieu ........... =
+ 1 nieu ........... =
1 parsec ......... = 30856800000000000 m
1 pica ........... = yard/216 = 0.9144/216 m
- 1 ri japan ....... =
- 1 ri korea ....... =
+ 1 ri japan ....... =
+ 1 ri korea ....... =
1 rod ............ = 5.0292 m
- 1 sawk ........... =
- 1 sen ............ =
+ 1 sawk ........... =
+ 1 sen ............ =
1 shaku .......... = 10/33 m
1 span ........... = 9 inches = 0.9144/4 m
- 1 sun ............ = 10/330 m
- 1 tsuen .......... =
- 1 va ............. =
+ 1 sun ............ = 1/33 m
+ 1 tsuen .......... =
+ 1 va ............. =
1 yard ........... = 0.9144 m
- 1 yote ........... =
- 1 zhang .......... =
+ 1 yote ........... =
+ 1 zhang .......... =
*/
static const conv_t conv_LENGTH[] = {
DECLARE_CONV_UNIT(LENGTH, ANGSTROMS, "$*0.0000000001", "$/0.0000000001")
@@ -244,10 +245,10 @@ static const conv_t conv_LENGTH[] = {
DECLARE_CONV_UNIT(LENGTH, BARLEYCORNS, "$*0.9144/108", "$/0.9144*108")
DECLARE_CONV_UNIT(LENGTH, CENTIMETERS, "$/100", "$*100")
DECLARE_CONV_UNIT(LENGTH, CHAINS_UK, "$*20.1168", "$/20.1168")
-// DECLARE_CONV_UNIT(LENGTH, CHI, "$", "$")
+ DECLARE_CONV_UNIT(LENGTH, CHI, "$/3", "$*3")
DECLARE_CONV_UNIT(LENGTH, CHOU, "$*3600/33", "$*33/3600")
// DECLARE_CONV_UNIT(LENGTH, CHR, "$", "$")
-// DECLARE_CONV_UNIT(LENGTH, CUN, "$", "$")
+ DECLARE_CONV_UNIT(LENGTH, CUN, "$/30", "$*30")
DECLARE_CONV_UNIT(LENGTH, FATHOMS, "$*1.8288", "$/1.8288")
DECLARE_CONV_UNIT(LENGTH, FATHOMS_HUNGARY, "$*1.8964838", "$/1.8964838")
DECLARE_CONV_UNIT(LENGTH, FEET, "$*0.3048", "$/0.3048")
@@ -280,7 +281,7 @@ static const conv_t conv_LENGTH[] = {
// DECLARE_CONV_UNIT(LENGTH, SEN, "$", "$")
DECLARE_CONV_UNIT(LENGTH, SHAKU, "$*10/33", "$*33/10")
DECLARE_CONV_UNIT(LENGTH, SPAN, "$*0.9144/4", "$*4/0.9144")
- DECLARE_CONV_UNIT(LENGTH, SUN, "$*10/330", "$*330/10")
+ DECLARE_CONV_UNIT(LENGTH, SUN, "$*1/33", "$*33")
// DECLARE_CONV_UNIT(LENGTH, TSUEN, "$", "$")
// DECLARE_CONV_UNIT(LENGTH, VA, "$", "$")
DECLARE_CONV_UNIT(LENGTH, YARDS, "$*0.9144", "$/0.9144")
@@ -312,7 +313,7 @@ static const conv_t conv_POWER[] = {
1 hPa = 100 Pa
1 kPa = 1000 Pa
1 mm HG = 133.322 Pa
- 1 psi = 6894.757 Pa
+ 1 psi = 6894.757 Pa
*/
static const conv_t conv_PRESSURE[] = {
DECLARE_CONV_UNIT(PRESSURE, ATMOSPHERES, "$*101325", "$/101325")
@@ -330,18 +331,20 @@ static const conv_t conv_PRESSURE[] = {
1 hour ...... = 3600 s
1 microsecond = 0.000001 s
1 millisecond = 0.001 s
+ 1 nanosecond. = 0.000000001 s
1 minute .... = 60 s
1 week ...... = 669600 s
*/
static const conv_t conv_TIME[] = {
- DECLARE_CONV_UNIT(TIME, MINUTES, "$*60", "$/60")
- DECLARE_CONV_UNIT(TIME, DAYS, "$*86400", "$/86400")
- DECLARE_CONV_UNIT(TIME, HOURS, "$*3600", "$/3600")
- DECLARE_CONV_UNIT(TIME, MILLISECONDS, "$*0.001", "$/0.001")
- DECLARE_CONV_UNIT(TIME, MICROSECONDS, "$*0.000001", "$/0.000001")
- DECLARE_CONV_UNIT(TIME, SECONDS, "$", "$")
- DECLARE_CONV_UNIT(TIME, WEEKS, "$*604800", "$/604800")
- DECLARE_CONV_UNIT(TIME, YEARS, "$*31556952", "$/31556952")
+ DECLARE_CONV_UNIT(TIME, MINUTES, "$*60", "$/60")
+ DECLARE_CONV_UNIT(TIME, DAYS, "$*86400", "$/86400")
+ DECLARE_CONV_UNIT(TIME, HOURS, "$*3600", "$/3600")
+ DECLARE_CONV_UNIT(TIME, MILLISECONDS, "$*0.001", "$/0.001")
+ DECLARE_CONV_UNIT(TIME, MICROSECONDS, "$*0.000001", "$/0.000001")
+ DECLARE_CONV_UNIT(TIME, NANOSECONDS, "$*0.000000001", "$/0.000000001")
+ DECLARE_CONV_UNIT(TIME, SECONDS, "$", "$")
+ DECLARE_CONV_UNIT(TIME, WEEKS, "$*604800", "$/604800")
+ DECLARE_CONV_UNIT(TIME, YEARS, "$*31556952", "$/31556952")
DECLARE_CONV_END
};
@@ -382,7 +385,7 @@ static const conv_t conv_VELOCITY[] = {
/*
1 barrel uk ...... = 163.65924 l
1 barrel oil ..... = 158.987295 l
- 1 bun ............ =
+ 1 bun ............ =
1 bushel uk ...... = 36.36872 l
1 bushel us ...... = 35.23907017 l
1 cubic cm ...... = 0.001 l
@@ -390,17 +393,17 @@ static const conv_t conv_VELOCITY[] = {
1 cubic inch ..... = 0.016387064 l
1 cubic meter .... = 1000 l
1 cubic yard ..... = 764.554857 l
- 1 doe ............ =
+ 1 doe ............ =
1 fluid ounce uk = 0.0284130625 l
1 fluid ounce us = 0.0295735295625 l
1 gallon uk ...... = 4.54609 l
1 gallon dry us .. = 4.40488377086 l
1 gallon liquid us = 3.785411784 l
1 gou ............ = 0.1809 l
- 1 hop ............ =
- 1 icce ........... =
- 1 kwian .......... =
- 1 mal ............ =
+ 1 hop ............ =
+ 1 icce ........... =
+ 1 kwian .......... =
+ 1 mal ............ =
1 milliliter ..... = 0.001 l
1 pint uk ........ = 0.56826125 l
1 pint dry us .... = 0.5506104713575 l
@@ -408,10 +411,10 @@ static const conv_t conv_VELOCITY[] = {
1 quart uk ....... = 1.1365225 l
1 quart dry us ... = 1.101220942715 l
1 quart liquid us = 0.946352946 l
- 1 seki ........... =
- 1 syou ........... =
- 1 tananloung ..... =
- 1 tang ........... =
+ 1 seki ........... =
+ 1 syou ........... =
+ 1 tananloung ..... =
+ 1 tang ........... =
1 to ............. = 18040 l
*/
static const conv_t conv_VOLUME[] = {
@@ -455,16 +458,16 @@ static const conv_t conv_VOLUME[] = {
/*
1 baht ............ = 12.244 g
1 carat ........... = 0.2 g
- 1 chung ........... =
- 1 don ............. =
- 1 geun ............ =
- 1 gwan ............ =
- 1 harb ............ =
- 1 jin china ....... =
- 1 jin taiwan ...... =
- 1 Kan ............. =
+ 1 chung ........... =
+ 1 don ............. =
+ 1 geun ............ =
+ 1 gwan ............ =
+ 1 harb ............ =
+ 1 jin china ....... =
+ 1 jin taiwan ...... =
+ 1 Kan ............. = 3750 g
1 Kilograms ....... = 1000 g
- 1 Kin ............. =
+ 1 Kin ............. = 600 g
1 Liang China ..... =
1 Liang Taiwan .... =
1 monme ........... = 3.75 g
@@ -472,9 +475,9 @@ static const conv_t conv_VOLUME[] = {
1 ounce troy ...... = 31.1034768 g
1 pound ........... = 453.59237 g
1 quintal metric .. = 100000 g
- 1 saloung ......... =
+ 1 saloung ......... =
1 stone ........... = 6350.29318 g
- 1 tamlung ......... =
+ 1 tamlung ......... =
1 ton ............. = 1000000 g
1 ton uk .......... = 1016046.9088 g // long ton
1 ton us .......... = 907184.74 g // short ton
@@ -490,9 +493,9 @@ static const conv_t conv_WEIGHT[] = {
// DECLARE_CONV_UNIT(WEIGHT, HARB, "$", "$")
// DECLARE_CONV_UNIT(WEIGHT, JIN_CHINA, "$", "$")
// DECLARE_CONV_UNIT(WEIGHT, JIN_TAIWAN, "$", "$")
-// DECLARE_CONV_UNIT(WEIGHT, KAN, "$", "$")
+ DECLARE_CONV_UNIT(WEIGHT, KAN, "$*3750", "$/3750")
DECLARE_CONV_UNIT(WEIGHT, KILOGRAMS, "$*1000", "$/1000")
-// DECLARE_CONV_UNIT(WEIGHT, KIN, "$", "$")
+ DECLARE_CONV_UNIT(WEIGHT, KIN, "$*600", "$/600")
// DECLARE_CONV_UNIT(WEIGHT, LIANG_CHINA, "$", "$")
// DECLARE_CONV_UNIT(WEIGHT, LIANG_TAIWAN, "$", "$")
DECLARE_CONV_UNIT(WEIGHT, MONME, "$*3.75", "$/3.75")
@@ -548,7 +551,7 @@ void ConvExecute(HWND hWnd)
break;
}
}
-
+
/* The units can be sorted, so I must search the exact match */
item = items;
SendDlgItemMessage(hWnd, IDC_COMBO_FROM, CB_GETLBTEXT, from, (LPARAM)txt_cb);
diff --git a/base/applications/calc/lang/bg-BG.rc b/base/applications/calc/lang/bg-BG.rc
index dc9faab1628..19f411df033 100644
--- a/base/applications/calc/lang/bg-BG.rc
+++ b/base/applications/calc/lang/bg-BG.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Äíč"
IDS_TIME_HOURS "×ŕńč"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Ěčęđîńĺęóíäč"
IDS_TIME_MILLISECONDS "Ěčëčńĺęóíäč"
IDS_TIME_MINUTES "Ěčíóňč"
diff --git a/base/applications/calc/lang/cs-CZ.rc b/base/applications/calc/lang/cs-CZ.rc
index 278cc562783..c1f842282de 100644
--- a/base/applications/calc/lang/cs-CZ.rc
+++ b/base/applications/calc/lang/cs-CZ.rc
@@ -644,6 +644,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dny"
IDS_TIME_HOURS "Hodiny"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Mikrosekundy"
IDS_TIME_MILLISECONDS "Milisekundy"
IDS_TIME_MINUTES "Minuty"
diff --git a/base/applications/calc/lang/de-DE.rc b/base/applications/calc/lang/de-DE.rc
index f6513aa6dfe..d3aa5436a8f 100644
--- a/base/applications/calc/lang/de-DE.rc
+++ b/base/applications/calc/lang/de-DE.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Tagen"
IDS_TIME_HOURS "Stunden"
+ IDS_TIME_NANOSECONDS "Nanosekunden"
IDS_TIME_MICROSECONDS "Mikrosekunden"
IDS_TIME_MILLISECONDS "Millisekunden"
IDS_TIME_MINUTES "Minuten"
diff --git a/base/applications/calc/lang/el-GR.rc b/base/applications/calc/lang/el-GR.rc
index 89ce2d13c64..5f88a9465e1 100644
--- a/base/applications/calc/lang/el-GR.rc
+++ b/base/applications/calc/lang/el-GR.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "ĚÝńĺň"
IDS_TIME_HOURS "żńĺň"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Ěéęńďäĺőôĺńüëĺđôá"
IDS_TIME_MILLISECONDS "Ěéëéäĺőôĺńüëĺđôá"
IDS_TIME_MINUTES "ËĺđôÜ"
diff --git a/base/applications/calc/lang/en-US.rc b/base/applications/calc/lang/en-US.rc
index 756244ef64b..402991ab06d 100644
--- a/base/applications/calc/lang/en-US.rc
+++ b/base/applications/calc/lang/en-US.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Days"
IDS_TIME_HOURS "Hours"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconds"
IDS_TIME_MILLISECONDS "Milliseconds"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/es-ES.rc b/base/applications/calc/lang/es-ES.rc
index faba06c0b03..88e89a384fe 100644
--- a/base/applications/calc/lang/es-ES.rc
+++ b/base/applications/calc/lang/es-ES.rc
@@ -644,6 +644,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Días"
IDS_TIME_HOURS "Horas"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microsegundos"
IDS_TIME_MILLISECONDS "Milisegundos"
IDS_TIME_MINUTES "Minutos"
diff --git a/base/applications/calc/lang/fr-FR.rc b/base/applications/calc/lang/fr-FR.rc
index 4cd589992cb..8536cdb8d9d 100644
--- a/base/applications/calc/lang/fr-FR.rc
+++ b/base/applications/calc/lang/fr-FR.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Jours"
IDS_TIME_HOURS "Heures"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microsecondes"
IDS_TIME_MILLISECONDS "Millisecondes"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/it-IT.rc b/base/applications/calc/lang/it-IT.rc
index 0294303512a..2e96c209fb5 100644
--- a/base/applications/calc/lang/it-IT.rc
+++ b/base/applications/calc/lang/it-IT.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Giorni"
IDS_TIME_HOURS "Ore"
+ IDS_TIME_NANOSECONDS "Nanosecondi"
IDS_TIME_MICROSECONDS "Microsecondi"
IDS_TIME_MILLISECONDS "Millisecondi"
IDS_TIME_MINUTES "Minuti"
diff --git a/base/applications/calc/lang/ko-KR.rc b/base/applications/calc/lang/ko-KR.rc
index 51d70687527..8ab51ed6496 100644
--- a/base/applications/calc/lang/ko-KR.rc
+++ b/base/applications/calc/lang/ko-KR.rc
@@ -643,6 +643,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Days"
IDS_TIME_HOURS "Hours"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconds"
IDS_TIME_MILLISECONDS "Milliseconds"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/nl-NL.rc b/base/applications/calc/lang/nl-NL.rc
index 510352f6ee2..bad67ab7a32 100644
--- a/base/applications/calc/lang/nl-NL.rc
+++ b/base/applications/calc/lang/nl-NL.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dagen"
IDS_TIME_HOURS "Uren"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconden"
IDS_TIME_MILLISECONDS "Milliseconden"
IDS_TIME_MINUTES "Minuten"
diff --git a/base/applications/calc/lang/no-NO.rc b/base/applications/calc/lang/no-NO.rc
index 3bb0857dc8e..8e590be8ac3 100644
--- a/base/applications/calc/lang/no-NO.rc
+++ b/base/applications/calc/lang/no-NO.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "**"
IDS_TIME_HOURS "**"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "**"
IDS_TIME_MILLISECONDS "**"
IDS_TIME_MINUTES "**"
diff --git a/base/applications/calc/lang/pl-PL.rc b/base/applications/calc/lang/pl-PL.rc
index 8fdfa4bdad9..59cf444ef50 100644
--- a/base/applications/calc/lang/pl-PL.rc
+++ b/base/applications/calc/lang/pl-PL.rc
@@ -464,9 +464,9 @@ END
// TYPES OF ANGLES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_ANGLE_DEGREES "Stopni"
- IDS_ANGLE_GRADIANS "Gradianów"
- IDS_ANGLE_RADIANS "Radianów"
+ IDS_ANGLE_DEGREES "Stopnie"
+ IDS_ANGLE_GRADIANS "Gradiany"
+ IDS_ANGLE_RADIANS "Radiany"
END
// TYPES OF AREAS
@@ -489,21 +489,21 @@ BEGIN
IDS_AREA_PYEONGBANGJA "Pyeongbangja"
IDS_AREA_RAI "Rai"
IDS_AREA_SE "Se"
- IDS_AREA_SQUARE_CENTIMETERS "Centymetrów kwadratowych"
- IDS_AREA_SQUARE_CHR "Chr kwadratowych"
- IDS_AREA_SQUARE_FATHOMS "Sążni kwadratowych"
- IDS_AREA_SQUARE_FATHOMS_HUNGARY "Sążni kwadratowych (Węgry)"
- IDS_AREA_SQUARE_FEET "Stóp kwadratowych"
- IDS_AREA_SQUARE_INCHES "Cali kwadratowych"
- IDS_AREA_SQUARE_KILOMETERS "Kilometrów kwadratowych"
- IDS_AREA_SQUARE_LAR "Lar kwadratowych"
- IDS_AREA_SQUARE_METER "Metrów kwadratowych"
- IDS_AREA_SQUARE_MILES "Mil kwadratowych"
- IDS_AREA_SQUARE_MILLIMETERS "Milimetrów kwadratowych"
- IDS_AREA_SQUARE_SHAKU "Shaku kwadratowych"
- IDS_AREA_SQUARE_TSUEN "Tsuen kwadratowych"
- IDS_AREA_SQUARE_VA "Va kwadratowych"
- IDS_AREA_SQUARE_YARD "Jardów kwadratowych"
+ IDS_AREA_SQUARE_CENTIMETERS "Centymetry kwadratowe"
+ IDS_AREA_SQUARE_CHR "Chr kwadratowe"
+ IDS_AREA_SQUARE_FATHOMS "Sążnie kwadratowe"
+ IDS_AREA_SQUARE_FATHOMS_HUNGARY "Sążnie kwadratowe (Węgry)"
+ IDS_AREA_SQUARE_FEET "Stopy kwadratowe"
+ IDS_AREA_SQUARE_INCHES "Cale kwadratowe"
+ IDS_AREA_SQUARE_KILOMETERS "Kilometry kwadratowe"
+ IDS_AREA_SQUARE_LAR "Lar kwadratowe"
+ IDS_AREA_SQUARE_METER "Metry kwadratowe"
+ IDS_AREA_SQUARE_MILES "Mile kwadratowe"
+ IDS_AREA_SQUARE_MILLIMETERS "Milimetry kwadratowe"
+ IDS_AREA_SQUARE_SHAKU "Shaku kwadratowe"
+ IDS_AREA_SQUARE_TSUEN "Tsuen kwadratowe"
+ IDS_AREA_SQUARE_VA "Va kwadratowe"
+ IDS_AREA_SQUARE_YARD "Jardy kwadratowe"
IDS_AREA_TAN "Tan"
IDS_AREA_TSUBO "Tsubo"
END
@@ -511,10 +511,10 @@ END
// TYPES OF COMSUMPTIONS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_CONSUMPTION_KM_PER_L "Kilometrów/litr"
- IDS_CONSUMPTION_L_PER_100_KM "Litrów/100 kilometróws"
- IDS_CONSUMPTION_MILES_GALLON_UK "Mil/galon (UK)"
- IDS_CONSUMPTION_MILES_GALLON_US "Mil/galon (USA)"
+ IDS_CONSUMPTION_KM_PER_L "Kilometry/litr"
+ IDS_CONSUMPTION_L_PER_100_KM "Litry/100 kilometrów"
+ IDS_CONSUMPTION_MILES_GALLON_UK "Mile/galon (UK)"
+ IDS_CONSUMPTION_MILES_GALLON_US "Mile/galon (USA)"
END
// TYPES OF CURRENCIES
@@ -543,56 +543,56 @@ END
// TYPES OF ENERGIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_ENERGY_15_C_CALORIES "15 °C kalorii"
+ IDS_ENERGY_15_C_CALORIES "15 °C kalorie"
IDS_ENERGY_BTUS "British Thermal Unit"
- IDS_ENERGY_ERGS "Ergów"
- IDS_ENERGY_EVS "Elektronowolt"
- IDS_ENERGY_FOOT_POUNDS "Foot-pound"
+ IDS_ENERGY_ERGS "Ergi"
+ IDS_ENERGY_EVS "Elektronowolty"
+ IDS_ENERGY_FOOT_POUNDS "Stopo-funty"
IDS_ENERGY_IT_CALORIES "Międzynarodowa Tablica kalorii"
IDS_ENERGY_IT_KILOCALORIES "Międzynarodowa Tablica kilokalorii"
- IDS_ENERGY_JOULES "Dżuli"
- IDS_ENERGY_KILOJOULES "Kilodżuli"
- IDS_ENERGY_KILOWATT_HOURS "Kilowatogodzin"
- IDS_ENERGY_NUTRITION_CALORIES "Kalorii spożywczych"
- IDS_ENERGY_TH_CALORIES "Kalorii termochemicznych"
+ IDS_ENERGY_JOULES "Dżule"
+ IDS_ENERGY_KILOJOULES "Kilodżule"
+ IDS_ENERGY_KILOWATT_HOURS "Kilowatogodziny"
+ IDS_ENERGY_NUTRITION_CALORIES "Kalorie spożywcze"
+ IDS_ENERGY_TH_CALORIES "Kalorie termochemiczne"
END
// TYPES OF LENGTHS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_LENGTH_ANGSTROMS "Angsztremów"
- IDS_LENGTH_ASTRONOMICAL_UNITS "Jednostek Astronomicznych"
- IDS_LENGTH_BARLEYCORNS "Palców"
- IDS_LENGTH_CENTIMETERS "Centimetrów"
+ IDS_LENGTH_ANGSTROMS "Angsztremy"
+ IDS_LENGTH_ASTRONOMICAL_UNITS "Jednostki Astronomiczne"
+ IDS_LENGTH_BARLEYCORNS "Palce"
+ IDS_LENGTH_CENTIMETERS "Centymetry"
IDS_LENGTH_CHAINS_UK "Chains (UK)"
IDS_LENGTH_CHI "Chi"
IDS_LENGTH_CHOU "Chou"
IDS_LENGTH_CHR "Chr"
IDS_LENGTH_CUN "Cun"
- IDS_LENGTH_FATHOMS "Sążni"
- IDS_LENGTH_FATHOMS_HUNGARY "Sążni (Węgry)"
- IDS_LENGTH_FEET "Stóp"
+ IDS_LENGTH_FATHOMS "Sążnie"
+ IDS_LENGTH_FATHOMS_HUNGARY "Sążnie (Węgry)"
+ IDS_LENGTH_FEET "Stopy"
IDS_LENGTH_FURLONGS "Furlongs"
IDS_LENGTH_GAN "Gan"
- IDS_LENGTH_HANDS "Dłoni"
+ IDS_LENGTH_HANDS "Dłonie"
IDS_LENGTH_HUNH "Hunh"
- IDS_LENGTH_INCHES "Cali"
+ IDS_LENGTH_INCHES "Cale"
IDS_LENGTH_JA "Ja"
IDS_LENGTH_JEONG "Jeong"
IDS_LENGTH_KABIET "Kabiet"
IDS_LENGTH_KEN "Ken"
IDS_LENGTH_KEUB "Keub"
- IDS_LENGTH_KILOMETERS "Kilometerów"
+ IDS_LENGTH_KILOMETERS "Kilometry"
IDS_LENGTH_LAR "Lar"
- IDS_LENGTH_LIGHT_YEARS "Lat świetlnych"
+ IDS_LENGTH_LIGHT_YEARS "Lata świetlne"
IDS_LENGTH_LINKS_UK "Links (UK)"
- IDS_LENGTH_METERS "Metrów"
- IDS_LENGTH_MICRONS "Mikrometrów"
- IDS_LENGTH_MILES "Mil"
- IDS_LENGTH_MILLIMETERS "Millimetrów"
- IDS_LENGTH_NAUTICAL_MILES "Mil morskich"
+ IDS_LENGTH_METERS "Metry"
+ IDS_LENGTH_MICRONS "Mikrometry"
+ IDS_LENGTH_MILES "Mile"
+ IDS_LENGTH_MILLIMETERS "Milimetry"
+ IDS_LENGTH_NAUTICAL_MILES "Mile morskie"
IDS_LENGTH_NIEU "Nieu"
- IDS_LENGTH_PARSECS "Parseków"
+ IDS_LENGTH_PARSECS "Parseki"
IDS_LENGTH_PICAS "Picas"
IDS_LENGTH_RI_JAPAN "Ri (Japan)"
IDS_LENGTH_RI_KOREA "Ri (Korea)"
@@ -604,7 +604,7 @@ BEGIN
IDS_LENGTH_SUN "Sun"
IDS_LENGTH_TSUEN "Tsuen"
IDS_LENGTH_VA "Va"
- IDS_LENGTH_YARDS "Jardów"
+ IDS_LENGTH_YARDS "Jardy"
IDS_LENGTH_YOTE "Yote"
IDS_LENGTH_ZHANG "Zhang"
END
@@ -613,23 +613,23 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_POWER_BTUS_PER_MINUTE "BTU na minutę"
- IDS_POWER_FPS_PER_MINUTE "Foot-pound na minutę"
- IDS_POWER_HORSEPOWER "Koni mechanicznych"
- IDS_POWER_KILOWATTS "Kilowatów"
- IDS_POWER_MEGAWATTS "Megawatów"
- IDS_POWER_WATTS "Watów"
+ IDS_POWER_FPS_PER_MINUTE "Stopo-funty na minutę"
+ IDS_POWER_HORSEPOWER "Konie mechaniczne"
+ IDS_POWER_KILOWATTS "Kilowaty"
+ IDS_POWER_MEGAWATTS "Megawaty"
+ IDS_POWER_WATTS "Waty"
END
// TYPE OF PRESSURES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_PRESSURE_ATMOSPHERES "Atmosfer"
- IDS_PRESSURE_BARS "Barów"
- IDS_PRESSURE_HECTOPASCALS "Hektopaskali"
- IDS_PRESSURE_KILOPASCALS "Kilopaskali"
- IDS_PRESSURE_MM_OF_MERCURY "Millimetrów słupka rtęci"
- IDS_PRESSURE_PASCALS "Paskali"
- IDS_PRESSURE_PSI "Funtów na cal kwadratowy"
+ IDS_PRESSURE_ATMOSPHERES "Atmosfery"
+ IDS_PRESSURE_BARS "Bary"
+ IDS_PRESSURE_HECTOPASCALS "Hektopaskale"
+ IDS_PRESSURE_KILOPASCALS "Kilopaskale"
+ IDS_PRESSURE_MM_OF_MERCURY "Milimetry słupka rtęci"
+ IDS_PRESSURE_PASCALS "Paskale"
+ IDS_PRESSURE_PSI "Funty na cal kwadratowy"
END
// TYPES OF TEMPERATURES
@@ -645,60 +645,61 @@ END
STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dni"
- IDS_TIME_HOURS "Godzin"
- IDS_TIME_MICROSECONDS "Mikrosekund"
- IDS_TIME_MILLISECONDS "Milisekund"
- IDS_TIME_MINUTES "Minut"
- IDS_TIME_SECONDS "Sekund"
- IDS_TIME_WEEKS "Tygodni"
- IDS_TIME_YEARS "Lat"
+ IDS_TIME_HOURS "Godziny"
+ IDS_TIME_NANOSECONDS "Nanosekundy"
+ IDS_TIME_MICROSECONDS "Mikrosekundy"
+ IDS_TIME_MILLISECONDS "Milisekundy"
+ IDS_TIME_MINUTES "Minuty"
+ IDS_TIME_SECONDS "Sekundy"
+ IDS_TIME_WEEKS "Tygodnie"
+ IDS_TIME_YEARS "Lata"
END
// TYPES OF VELOCITIES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_VELOCITY_CMS_SECOND "Centimetrów/sekundę"
- IDS_VELOCITY_FEET_HOUR "Stóp/godzinę"
- IDS_VELOCITY_FEET_SECOND "Stóp/sekundę"
- IDS_VELOCITY_KILOMETERS_HOUR "Kilometrów/godzinę"
- IDS_VELOCITY_KNOTS "Węzłów"
- IDS_VELOCITY_MACH "Machów"
- IDS_VELOCITY_METERS_SECOND "Metrów/sekundę"
- IDS_VELOCITY_MILES_HOUR "Mil/godzinę"
+ IDS_VELOCITY_CMS_SECOND "Centymetry/sekundę"
+ IDS_VELOCITY_FEET_HOUR "Stopy/godzinę"
+ IDS_VELOCITY_FEET_SECOND "Stopy/sekundę"
+ IDS_VELOCITY_KILOMETERS_HOUR "Kilometry/godzinę"
+ IDS_VELOCITY_KNOTS "Węzły"
+ IDS_VELOCITY_MACH "Machy"
+ IDS_VELOCITY_METERS_SECOND "Metry/sekundę"
+ IDS_VELOCITY_MILES_HOUR "Mile/godzinę"
END
// TYPES OF VOLUMES
STRINGTABLE DISCARDABLE
BEGIN
- IDS_VOLUME_BARRELS_UK "Baryłek (UK)"
- IDS_VOLUME_BARRELS_OIL "Baryłek"
+ IDS_VOLUME_BARRELS_UK "Baryłki (UK)"
+ IDS_VOLUME_BARRELS_OIL "Baryłki"
IDS_VOLUME_BUN "Bun"
- IDS_VOLUME_BUSHELS_UK "Buszli (UK)"
- IDS_VOLUME_BUSHELS_US "Buszli (US)"
- IDS_VOLUME_CUBIC_CENTIMETERS "Centymetrów sześciennych"
- IDS_VOLUME_CUBIC_FEET "Stóp sześciennych"
- IDS_VOLUME_CUBIC_INCHES "Cali sześciennych"
- IDS_VOLUME_CUBIC_METERS "Metrów sześciennych"
- IDS_VOLUME_CUBIC_YARDS "Jardów sześciennych"
+ IDS_VOLUME_BUSHELS_UK "Buszle (UK)"
+ IDS_VOLUME_BUSHELS_US "Buszle (US)"
+ IDS_VOLUME_CUBIC_CENTIMETERS "Centymetry sześcienne"
+ IDS_VOLUME_CUBIC_FEET "Stopy sześcienne"
+ IDS_VOLUME_CUBIC_INCHES "Cale sześcienne"
+ IDS_VOLUME_CUBIC_METERS "Metry sześcienne"
+ IDS_VOLUME_CUBIC_YARDS "Jardy sześcienne"
IDS_VOLUME_DOE "Doe"
- IDS_VOLUME_FLUID_OUNCES_UK "Uncji, płyn (UK)"
- IDS_VOLUME_FLUID_OUNCES_US "Uncji, płyn (US)"
- IDS_VOLUME_GALLONS_UK "Galonów (UK)"
- IDS_VOLUME_GALLONS_DRY_US "Galonów, sypkie (US)"
- IDS_VOLUME_GALLONS_LIQUID_US "Gallons, płyn (US)"
+ IDS_VOLUME_FLUID_OUNCES_UK "Uncje, płyn (UK)"
+ IDS_VOLUME_FLUID_OUNCES_US "Uncje, płyn (US)"
+ IDS_VOLUME_GALLONS_UK "Galony (UK)"
+ IDS_VOLUME_GALLONS_DRY_US "Galony, sypkie (US)"
+ IDS_VOLUME_GALLONS_LIQUID_US "Galony, płyn (US)"
IDS_VOLUME_GOU "Gou"
IDS_VOLUME_HOP "Hop"
IDS_VOLUME_ICCE "Icce"
IDS_VOLUME_KWIAN "Kwian"
- IDS_VOLUME_LITERS "Litrów"
+ IDS_VOLUME_LITERS "Litry"
IDS_VOLUME_MAL "Mal"
- IDS_VOLUME_MILLILITERS "Milliliters"
- IDS_VOLUME_PINTS_UK "Pint (UK)"
- IDS_VOLUME_PINTS_DRY_US "Pint, sypkie (US)"
- IDS_VOLUME_PINTS_LIQUID_US "Pint, płyn (US)"
- IDS_VOLUME_QUARTS_UK "Kwart (UK)"
- IDS_VOLUME_QUARTS_DRY_US "Kwart, sypkie (US)"
- IDS_VOLUME_QUARTS_LIQUID_US "Kwart, płyn (US)"
+ IDS_VOLUME_MILLILITERS "Mililitry"
+ IDS_VOLUME_PINTS_UK "Pinty (UK)"
+ IDS_VOLUME_PINTS_DRY_US "Pinty, sypkie (US)"
+ IDS_VOLUME_PINTS_LIQUID_US "Pinty, płyn (US)"
+ IDS_VOLUME_QUARTS_UK "Kwarty (UK)"
+ IDS_VOLUME_QUARTS_DRY_US "Kwarty, sypkie (US)"
+ IDS_VOLUME_QUARTS_LIQUID_US "Kwarty, płyn (US)"
IDS_VOLUME_SEKI "Seki"
IDS_VOLUME_SYOU "Syou"
IDS_VOLUME_TANANLOUNG "Tananloung"
@@ -709,26 +710,26 @@ END
// TYPES OF WEIGHTS
STRINGTABLE DISCARDABLE
BEGIN
- IDS_WEIGHT_BAHT "Bahtów"
- IDS_WEIGHT_CARATS "Karatów"
+ IDS_WEIGHT_BAHT "Bahty"
+ IDS_WEIGHT_CARATS "Karaty"
IDS_WEIGHT_CHUNG "Chung"
IDS_WEIGHT_DON "Don"
IDS_WEIGHT_GEUN "Geun"
- IDS_WEIGHT_GRAMS "Gramów"
+ IDS_WEIGHT_GRAMS "Gramy"
IDS_WEIGHT_GWAN "Gwan"
IDS_WEIGHT_HARB "Harb"
IDS_WEIGHT_JIN_CHINA "Jin (China)"
IDS_WEIGHT_JIN_TAIWAN "Jin (Taiwan)"
IDS_WEIGHT_KAN "Kan"
- IDS_WEIGHT_KILOGRAMS "Kilogramów"
+ IDS_WEIGHT_KILOGRAMS "Kilogramy"
IDS_WEIGHT_KIN "Kin"
IDS_WEIGHT_LIANG_CHINA "Liang (China)"
IDS_WEIGHT_LIANG_TAIWAN "Liang (Taiwan)"
IDS_WEIGHT_MONME "Monme"
- IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Uncji, avoirdupois"
- IDS_WEIGHT_OUNCES_TROY "Uncji, aptekarskie"
- IDS_WEIGHT_POUNDS "Funtów"
- IDS_WEIGHT_QUINTAL_METRIC "Kwintali"
+ IDS_WEIGHT_OUNCES_AVOIRDUPOIS "Uncje, avoirdupois"
+ IDS_WEIGHT_OUNCES_TROY "Uncje, aptekarskie"
+ IDS_WEIGHT_POUNDS "Funty"
+ IDS_WEIGHT_QUINTAL_METRIC "Kwintale"
IDS_WEIGHT_SALOUNG "Saloung"
IDS_WEIGHT_STONES "Kamieni"
IDS_WEIGHT_TAMLUNG "Tamlung"
diff --git a/base/applications/calc/lang/ro-RO.rc b/base/applications/calc/lang/ro-RO.rc
index 1680780befb..4c353ea9c0f 100644
--- a/base/applications/calc/lang/ro-RO.rc
+++ b/base/applications/calc/lang/ro-RO.rc
@@ -641,6 +641,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Zile"
IDS_TIME_HOURS "Ore"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microsecunde"
IDS_TIME_MILLISECONDS "Milisecunde"
IDS_TIME_MINUTES "Minute"
diff --git a/base/applications/calc/lang/ru-RU.rc b/base/applications/calc/lang/ru-RU.rc
index 63b478b2f33..6d2d41c3612 100644
--- a/base/applications/calc/lang/ru-RU.rc
+++ b/base/applications/calc/lang/ru-RU.rc
@@ -639,6 +639,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "äĺíü"
IDS_TIME_HOURS "÷ŕń"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "ěčęđîńĺęóíäŕ"
IDS_TIME_MILLISECONDS "ěčëëčńĺęóíäŕ"
IDS_TIME_MINUTES "ěčíóňŕ"
diff --git a/base/applications/calc/lang/sk-SK.rc b/base/applications/calc/lang/sk-SK.rc
index 3f93b953ef0..4951a860320 100644
--- a/base/applications/calc/lang/sk-SK.rc
+++ b/base/applications/calc/lang/sk-SK.rc
@@ -647,6 +647,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Dni"
IDS_TIME_HOURS "Hodiny"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Mikrosekundy"
IDS_TIME_MILLISECONDS "Milisekundy"
IDS_TIME_MINUTES "Minúty"
diff --git a/base/applications/calc/lang/th-TH.rc b/base/applications/calc/lang/th-TH.rc
index 214bd80b185..ade4a12b17e 100644
--- a/base/applications/calc/lang/th-TH.rc
+++ b/base/applications/calc/lang/th-TH.rc
@@ -644,6 +644,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Days"
IDS_TIME_HOURS "Hours"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Microseconds"
IDS_TIME_MILLISECONDS "Milliseconds"
IDS_TIME_MINUTES "Minutes"
diff --git a/base/applications/calc/lang/uk-UA.rc b/base/applications/calc/lang/uk-UA.rc
index b4c7f19c933..9d73142142a 100644
--- a/base/applications/calc/lang/uk-UA.rc
+++ b/base/applications/calc/lang/uk-UA.rc
@@ -647,6 +647,7 @@ STRINGTABLE DISCARDABLE
BEGIN
IDS_TIME_DAYS "Äîáŕ"
IDS_TIME_HOURS "Ăîäčíŕ"
+ IDS_TIME_NANOSECONDS "Nanoseconds"
IDS_TIME_MICROSECONDS "Ěłęđîńĺęóíäŕ"
IDS_TIME_MILLISECONDS "Ěłëłńĺęóíäŕ"
IDS_TIME_MINUTES "Őâčëčíŕ"
diff --git a/base/applications/calc/resource.h b/base/applications/calc/resource.h
index 1886cc74109..8039671361e 100644
--- a/base/applications/calc/resource.h
+++ b/base/applications/calc/resource.h
@@ -276,10 +276,11 @@
#define IDS_TIME_HOURS 3002
#define IDS_TIME_MICROSECONDS 3003
#define IDS_TIME_MILLISECONDS 3004
-#define IDS_TIME_MINUTES 3005
-#define IDS_TIME_SECONDS 3006
-#define IDS_TIME_WEEKS 3007
-#define IDS_TIME_YEARS 3008
+#define IDS_TIME_NANOSECONDS 3005
+#define IDS_TIME_MINUTES 3006
+#define IDS_TIME_SECONDS 3007
+#define IDS_TIME_WEEKS 3008
+#define IDS_TIME_YEARS 3009
/* TYPES OF VELOCITIES */
#define IDS_VELOCITY_CMS_SECOND 3100
diff --git a/base/applications/calc/utl.c b/base/applications/calc/utl.c
index 599115e9883..9ec8bebcc8f 100644
--- a/base/applications/calc/utl.c
+++ b/base/applications/calc/utl.c
@@ -2,7 +2,6 @@
void prepare_rpn_result_2(calc_number_t *rpn, TCHAR *buffer, int size, int base)
{
- TCHAR *ptr, *dst;
calc_number_t tmp;
int width;
@@ -21,9 +20,12 @@ 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("%#e"), rpn->f);
+ _stprintf(buffer, TEXT("%#e"), rpn->f);
else {
+ TCHAR *ptr, *dst;
+
ptr = buffer + _stprintf(buffer, TEXT("%#*.*f"), width, ((MAX_LD_WIDTH-width-1)>=0) ? MAX_LD_WIDTH-width-1 : 0, rpn->f);
+ /* format sring ensures there is a '.': */
dst = _tcschr(buffer, TEXT('.'));
while (--ptr > dst)
if (*ptr != TEXT('0'))
diff --git a/base/applications/calc/winmain.c b/base/applications/calc/winmain.c
index 40a34682b62..6279d3d5091 100644
--- a/base/applications/calc/winmain.c
+++ b/base/applications/calc/winmain.c
@@ -861,18 +861,18 @@ static INT_PTR CALLBACK DlgStatProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
n = SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_GETCURSEL, 0, 0);
if (n == (DWORD)-1)
return TRUE;
- PostMessage(GetParent(hWnd), WM_LOAD_STAT, (WPARAM)n, 0);
+ PostMessage(GetParent(hWnd), WM_LOAD_STAT, (WPARAM)n, 0);
return TRUE;
case IDC_BUTTON_CD:
n = SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_GETCURSEL, 0, 0);
if (n == (DWORD)-1)
return TRUE;
- SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_DELETESTRING, (WPARAM)n, 0);
+ SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_DELETESTRING, (WPARAM)n, 0);
update_n_stats_items(hWnd, buffer);
delete_stat_item(n);
return TRUE;
case IDC_BUTTON_CAD:
- SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_RESETCONTENT, 0, 0);
+ SendDlgItemMessage(hWnd, IDC_LIST_STAT, LB_RESETCONTENT, 0, 0);
clean_stat_list();
update_n_stats_items(hWnd, buffer);
return TRUE;
@@ -910,20 +910,20 @@ static WPARAM idm_2_idc(int idm)
static void CopyMemToClipboard(void *ptr)
{
if(OpenClipboard(NULL)) {
- HGLOBAL clipbuffer;
- TCHAR *buffer;
+ HGLOBAL clipbuffer;
+ TCHAR *buffer;
- EmptyClipboard();
- clipbuffer = GlobalAlloc(GMEM_DDESHARE, (_tcslen(ptr)+1)*sizeof(TCHAR));
- buffer = (TCHAR *)GlobalLock(clipbuffer);
- _tcscpy(buffer, ptr);
- GlobalUnlock(clipbuffer);
+ EmptyClipboard();
+ clipbuffer = GlobalAlloc(GMEM_DDESHARE, (_tcslen(ptr)+1)*sizeof(TCHAR));
+ buffer = (TCHAR *)GlobalLock(clipbuffer);
+ _tcscpy(buffer, ptr);
+ GlobalUnlock(clipbuffer);
#ifdef UNICODE
- SetClipboardData(CF_UNICODETEXT,clipbuffer);
+ SetClipboardData(CF_UNICODETEXT,clipbuffer);
#else
- SetClipboardData(CF_TEXT,clipbuffer);
+ SetClipboardData(CF_TEXT,clipbuffer);
#endif
- CloseClipboard();
+ CloseClipboard();
}
}
@@ -942,16 +942,16 @@ static char *ReadClipboard(void)
char *buffer = NULL;
if (OpenClipboard(NULL)) {
- HANDLE hData = GetClipboardData(CF_TEXT);
+ HANDLE hData = GetClipboardData(CF_TEXT);
char *fromClipboard;
if (hData != NULL) {
fromClipboard = (char *)GlobalLock(hData);
if (strlen(fromClipboard))
- buffer = _strupr(_strdup(fromClipboard));
- GlobalUnlock( hData );
+ buffer = _strupr(_strdup(fromClipboard));
+ GlobalUnlock( hData );
}
- CloseClipboard();
+ CloseClipboard();
}
return buffer;
}
@@ -1110,20 +1110,20 @@ static void handle_context_menu(HWND hWnd, WPARAM wp, LPARAM lp)
{
TCHAR text[64];
HMENU hMenu = CreatePopupMenu();
- DWORD idm;
+ BOOL idm;
LoadString(calc.hInstance, IDS_QUICKHELP, text, SIZEOF(text));
AppendMenu(hMenu, MF_STRING | MF_ENABLED, IDM_HELP_HELP, text);
- idm = (DWORD)TrackPopupMenu(hMenu,
- TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
- LOWORD(lp),
- HIWORD(lp),
- 0,
- hWnd,
- NULL);
+ idm = TrackPopupMenu( hMenu,
+ TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | TPM_RIGHTBUTTON,
+ LOWORD(lp),
+ HIWORD(lp),
+ 0,
+ hWnd,
+ NULL);
DestroyMenu(hMenu);
#ifndef DISABLE_HTMLHELP_SUPPORT
- if (idm != 0) {
+ if (idm) {
HH_POPUP popup;
memset(&popup, 0, sizeof(popup));
@@ -1139,6 +1139,8 @@ static void handle_context_menu(HWND hWnd, WPARAM wp, LPARAM lp)
popup.idString = GetWindowLongPtr((HWND)wp, GWL_ID);
HtmlHelp((HWND)wp, HTMLHELP_PATH("/popups.txt"), HH_DISPLAY_TEXT_POPUP, (DWORD_PTR)&popup);
}
+#else
+ (void)idm;
#endif
}
diff --git a/base/applications/dxdiag/ddtest.c b/base/applications/dxdiag/ddtest.c
index 47f41a54ec0..734f166d9e5 100644
--- a/base/applications/dxdiag/ddtest.c
+++ b/base/applications/dxdiag/ddtest.c
@@ -151,7 +151,7 @@ BOOL DDPrimarySurfaceTest(HWND hWnd){
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
- if (msg.message == WM_TIMER && TimerID == msg.wParam)
+ if (msg.message == WM_TIMER && TimerID == msg.wParam)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
@@ -200,7 +200,7 @@ VOID DDRedrawFrame(LPDIRECTDRAWSURFACE lpDDSurface)
BOOL DDOffscreenBufferTest(HWND hWnd, BOOL Fullscreen){
- UINT TimerID, TimerIDUpdate;
+ UINT_PTR TimerID, TimerIDUpdate;
LPDIRECTDRAW lpDD;
LPDIRECTDRAWSURFACE lpDDPrimarySurface;
LPDIRECTDRAWSURFACE lpDDBackBuffer;
@@ -288,6 +288,7 @@ BOOL DDOffscreenBufferTest(HWND hWnd, BOOL Fullscreen){
/* set our timers, TimerID - for test timeout, TimerIDUpdate - for frame updating */
TimerID = SetTimer(hWnd, -1, (UINT)TEST_DURATION, NULL);
TimerIDUpdate = SetTimer(hWnd, 2, (UINT)10, NULL);
+ (void)TimerIDUpdate;
while (TRUE)
{
diff --git a/base/applications/dxdiag/input.c b/base/applications/dxdiag/input.c
index 08bb2b718b8..03d238a57ce 100644
--- a/base/applications/dxdiag/input.c
+++ b/base/applications/dxdiag/input.c
@@ -129,13 +129,13 @@ BOOL CALLBACK DirectInputEnumDevCb(
ZeroMemory(&GuidPath, sizeof(DIPROPGUIDANDPATH));
GuidPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH);
GuidPath.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- GuidPath.diph.dwHow = DIPH_DEVICE;
+ GuidPath.diph.dwHow = DIPH_DEVICE;
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_GUIDANDPATH, (LPDIPROPHEADER)&GuidPath);
ZeroMemory(&TypeName, sizeof(TypeName));
TypeName.diph.dwSize = sizeof(TypeName);
TypeName.diph.dwHeaderSize = sizeof(DIPROPHEADER);
- TypeName.diph.dwHow = DIPH_DEVICE;
+ TypeName.diph.dwHow = DIPH_DEVICE;
hResult = pDev->lpVtbl->GetProperty(pDev, DIPROP_GETPORTDISPLAYNAME, (LPDIPROPHEADER)&TypeName);
@@ -191,7 +191,7 @@ InitializeDirectInputDialog(HWND hwndDlg)
Context.pObj = pObj;
Context.hwndDlg = hwndDlg;
InitListViewColumns(&Context);
- hResult = pObj->lpVtbl->EnumDevices(pObj, DI8DEVCLASS_ALL, DirectInputEnumDevCb, (PVOID)&Context, DIEDFL_ALLDEVICES);
+ pObj->lpVtbl->EnumDevices(pObj, DI8DEVCLASS_ALL, DirectInputEnumDevCb, (PVOID)&Context, DIEDFL_ALLDEVICES);
pObj->lpVtbl->Release(pObj);
}
diff --git a/base/applications/dxdiag/network.c b/base/applications/dxdiag/network.c
index 5154c4eef87..3a4b7c666f2 100644
--- a/base/applications/dxdiag/network.c
+++ b/base/applications/dxdiag/network.c
@@ -178,10 +178,10 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
{
DWORD dwIndex = 0;
LONG result;
- WCHAR szName[50];
+ WCHAR szName[50];
WCHAR szGUID[40];
WCHAR szTemp[63];
- WCHAR szResult[MAX_PATH+20] = {0};
+ WCHAR szResult[MAX_PATH+20] = {0};
DWORD RegProviders = 0;
DWORD ProviderIndex;
DWORD dwName;
@@ -203,13 +203,12 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
szResult[0] = L'\0';
LoadStringW(hInst, PreDefProviders[dwIndex].ResourceID, szResult, sizeof(szResult)/sizeof(WCHAR));
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
- lResult = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item);
+ Item.iItem = SendMessageW(hDlgCtrl, LVM_INSERTITEM, 0, (LPARAM)&Item);
+ Item.iSubItem = 1;
szResult[0] = L'\0';
LoadStringW(hInst, IDS_REG_FAIL, szResult, sizeof(szResult)/sizeof(WCHAR));
szResult[(sizeof(szResult)/sizeof(WCHAR))-1] = L'\0';
- Item.iItem = lResult;
- Item.iSubItem = 1;
- lResult = SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
+ SendMessageW(hDlgCtrl, LVM_SETITEM, 0, (LPARAM)&Item);
}
dwIndex = 0;
@@ -228,8 +227,7 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
if (ProviderIndex == UINT_MAX)
{
/* a custom service provider was found */
- lResult = ListView_GetItemCount(hDlgCtrl);
- Item.iItem = lResult;
+ Item.iItem = ListView_GetItemCount(hDlgCtrl);
/* FIXME
* on Windows Vista we need to use RegLoadMUIString which is not available for older systems
@@ -291,7 +289,7 @@ EnumerateServiceProviders(HKEY hKey, HWND hDlgCtrl, DIRECTPLAY_GUID * PreDefProv
}
}
dwIndex++;
- }while(result != ERROR_NO_MORE_ITEMS);
+ }while(result != ERROR_NO_MORE_ITEMS);
/* check if all providers have been registered */
// if (RegProviders == 15)
@@ -330,7 +328,7 @@ InitializeDirectPlayDialog(HWND hwndDlg)
return;
/* enumerate providers */
- result = EnumerateServiceProviders(hKey, hDlgCtrl, DirectPlaySP);
+ EnumerateServiceProviders(hKey, hDlgCtrl, DirectPlaySP);
RegCloseKey(hKey);
}
diff --git a/base/applications/dxdiag/sound.c b/base/applications/dxdiag/sound.c
index 6db11c66540..4a84c9c6342 100644
--- a/base/applications/dxdiag/sound.c
+++ b/base/applications/dxdiag/sound.c
@@ -275,6 +275,7 @@ void InitializeDirectSoundPage(PDXDIAG_CONTEXT pContext)
/* release the DSound object */
// pObj->lpVtbl->Release(pObj);
+ (void)hResult;
}
diff --git a/base/applications/fontview/display.c b/base/applications/fontview/display.c
index 1362e4a822a..55272eec754 100644
--- a/base/applications/fontview/display.c
+++ b/base/applications/fontview/display.c
@@ -103,7 +103,7 @@ Display_DrawText(HDC hDC, DISPLAYDATA* pData, int nYPos)
/* TODO: Output font info */
/* Output Character set */
- hOldFont = SelectObject(hDC, pData->hCharSetFont);
+ SelectObject(hDC, pData->hCharSetFont);
GetTextMetrics(hDC, &tm);
swprintf(szCaption, L"abcdefghijklmnopqrstuvwxyz");
TextOutW(hDC, 0, y, szCaption, wcslen(szCaption));
diff --git a/base/applications/fontview/fontview.c b/base/applications/fontview/fontview.c
index 82fa44aff6a..72b183212ba 100644
--- a/base/applications/fontview/fontview.c
+++ b/base/applications/fontview/fontview.c
@@ -60,13 +60,10 @@ FormatString(
static void
ErrorMsgBox(HWND hParent, DWORD dwCaptionID, DWORD dwMessageId, ...)
{
- HMODULE hModule;
HLOCAL hMemCaption = NULL;
HLOCAL hMemText = NULL;
va_list args;
- hModule = GetModuleHandle(NULL);
-
va_start(args, dwMessageId);
FormatString(FORMAT_MESSAGE_ALLOCATE_BUFFER,
NULL, dwMessageId, 0, (LPWSTR)&hMemText, 0, &args);
diff --git a/base/applications/kbswitch/kbswitch.c b/base/applications/kbswitch/kbswitch.c
index 5c94c25f79a..03f196f7771 100644
--- a/base/applications/kbswitch/kbswitch.c
+++ b/base/applications/kbswitch/kbswitch.c
@@ -33,7 +33,6 @@ CreateTrayIcon(LPTSTR szLCID)
HDC hdc, hdcsrc;
HBITMAP hBitmap, hBmpNew, hBmpOld;
RECT rect;
- DWORD bkColor, bkText;
HFONT hFontOld, hFont = NULL;
ICONINFO IconInfo;
HICON hIcon = NULL;
@@ -63,8 +62,8 @@ CreateTrayIcon(LPTSTR szLCID)
rect.bottom = 16;
rect.top = 0;
- bkColor = SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
- bkText = SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
+ SetBkColor(hdc, GetSysColor(COLOR_HIGHLIGHT));
+ SetTextColor(hdc, GetSysColor(COLOR_HIGHLIGHTTEXT));
ExtTextOut(hdc, rect.left, rect.top, ETO_OPAQUE, &rect, _T(""), 0, NULL);
diff --git a/base/applications/magnify/magnifier.c b/base/applications/magnify/magnifier.c
index 43816d6b5aa..4c2b4f623e9 100644
--- a/base/applications/magnify/magnifier.c
+++ b/base/applications/magnify/magnifier.c
@@ -295,7 +295,7 @@ void Draw(HDC aDc)
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
- int wmId, wmEvent;
+ int wmId;
switch (message)
{
@@ -354,7 +354,6 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
case WM_COMMAND:
wmId = LOWORD(wParam);
- wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{
diff --git a/base/applications/mplay32/mplay32.c b/base/applications/mplay32/mplay32.c
index 9b1b564908a..f4bd117a65f 100644
--- a/base/applications/mplay32/mplay32.c
+++ b/base/applications/mplay32/mplay32.c
@@ -407,7 +407,7 @@ PlayFile(HWND hwnd, LPTSTR lpFileName)
MCI_PLAY_PARMS mciPlay;
TCHAR szLocalFileName[MAX_PATH];
UINT FileType;
- DWORD dwError;
+ MCIERROR mciError;
if (lpFileName == NULL)
{
@@ -449,14 +449,14 @@ PlayFile(HWND hwnd, LPTSTR lpFileName)
SetTimer(hwnd, IDT_PLAYTIMER, 100, (TIMERPROC) PlayTimerProc);
- dwError = mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0);
+ mciSendCommand(wDeviceId, MCI_SEEK, MCI_WAIT | MCI_SEEK_TO_START, 0);
mciPlay.dwCallback = (DWORD_PTR)hwnd;
mciPlay.dwFrom = 0;
mciPlay.dwTo = MaxFilePos;
- dwError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD_PTR)&mciPlay);
- if (dwError != 0)
+ mciError = mciSendCommand(wDeviceId, MCI_PLAY, MCI_NOTIFY | MCI_FROM | MCI_TO, (DWORD_PTR)&mciPlay);
+ if (mciError != 0)
{
MessageBox(hwnd, _T("Can't play!"), NULL, MB_OK);
}
@@ -641,12 +641,12 @@ MainWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
break;
case IDM_ABOUT:
- {
+ {
HICON mplayIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MAIN));
ShellAbout(hwnd, szAppTitle, 0, mplayIcon);
- DeleteObject(mplayIcon);
+ DeleteObject(mplayIcon);
break;
- }
+ }
case IDM_EXIT:
PostMessage(hwnd, WM_CLOSE, 0, 0);
return 0;
diff --git a/base/applications/msconfig/freeldrpage.h b/base/applications/msconfig/freeldrpage.h
index 6e0331b2a4f..23b046b1849 100644
--- a/base/applications/msconfig/freeldrpage.h
+++ b/base/applications/msconfig/freeldrpage.h
@@ -1,3 +1,8 @@
+#ifndef _FREELDRPAGE_H_
+#define _FREELDRPAGE_H_
+
extern HWND hFreeLdrPage;
INT_PTR CALLBACK FreeLdrPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/generalpage.h b/base/applications/msconfig/generalpage.h
index 408c4049dc1..19551866bc4 100644
--- a/base/applications/msconfig/generalpage.h
+++ b/base/applications/msconfig/generalpage.h
@@ -1,3 +1,8 @@
+#ifndef _GENERALPAGE_H_
+#define _GENERALPAGE_H_
+
extern HWND hGeneralPage;
INT_PTR CALLBACK GeneralPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/srvpage.h b/base/applications/msconfig/srvpage.h
index 89c8f3e6112..db51a1b2258 100644
--- a/base/applications/msconfig/srvpage.h
+++ b/base/applications/msconfig/srvpage.h
@@ -1,4 +1,9 @@
+#ifndef _SVRPAGE_H_
+#define _SVRPAGE_H_
+
extern HWND hServicesPage;
extern HWND hServicesListCtrl;
INT_PTR CALLBACK ServicesPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/startuppage.h b/base/applications/msconfig/startuppage.h
index 9ac644081f0..a016fb320fb 100644
--- a/base/applications/msconfig/startuppage.h
+++ b/base/applications/msconfig/startuppage.h
@@ -1,4 +1,9 @@
+#ifndef _STARTUPPAGE_H_
+#define _STARTUPPAGE_H_
+
extern HWND hStartupPage;
extern HWND hStartupPageListCtrl;
INT_PTR CALLBACK StartupPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/systempage.h b/base/applications/msconfig/systempage.h
index d928c77389c..1aa9dcafe8b 100644
--- a/base/applications/msconfig/systempage.h
+++ b/base/applications/msconfig/systempage.h
@@ -1,3 +1,8 @@
+#ifndef _SYSTEMPAGE_H_
+#define _SYSTEMPAGE_H_
+
extern HWND hSystemPage;
INT_PTR CALLBACK SystemPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+
+#endif
diff --git a/base/applications/msconfig/toolspage.h b/base/applications/msconfig/toolspage.h
index daa938fec80..4ec159358bf 100644
--- a/base/applications/msconfig/toolspage.h
+++ b/base/applications/msconfig/toolspage.h
@@ -1,5 +1,9 @@
+#ifndef _TOOLSPAGE_H_
+#define _TOOLSPAGE_H_
+
extern HWND hToolsPage;
extern HWND hToolsListCtrl;
INT_PTR CALLBACK ToolsPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
+#endif
diff --git a/base/applications/mscutils/eventvwr/eventvwr.c b/base/applications/mscutils/eventvwr/eventvwr.c
index dbe44a8b913..011c0ec5da6 100644
--- a/base/applications/mscutils/eventvwr/eventvwr.c
+++ b/base/applications/mscutils/eventvwr/eventvwr.c
@@ -506,7 +506,6 @@ QueryEventMessages(LPWSTR lpMachineName,
DWORD dwRead, dwNeeded, dwThisRecord, dwTotalRecords = 0, dwCurrentRecord = 1, dwRecordsToRead = 0, dwFlags;
LPWSTR lpSourceName;
LPWSTR lpComputerName;
- LPWSTR lpEventStr;
LPWSTR lpData;
BOOL bResult = TRUE; /* Read succeeded. */
@@ -609,9 +608,6 @@ QueryEventMessages(LPWSTR lpMachineName,
// This ist the data section of the current event
lpData = (LPWSTR)((LPBYTE)pevlr + pevlr->DataOffset);
- // This is the text of the current event
- lpEventStr = (LPWSTR)((LPBYTE)pevlr + pevlr->StringOffset);
-
// Compute the event type
EventTimeToSystemTime(pevlr->TimeWritten, &time);
diff --git a/base/applications/network/arp/arp.c b/base/applications/network/arp/arp.c
index 539d6cf98d7..3014b5823e0 100644
--- a/base/applications/network/arp/arp.c
+++ b/base/applications/network/arp/arp.c
@@ -170,9 +170,7 @@ INT DisplayArpEntries(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpNetTable, sizeof(*pIpNetTable));
- iRet = GetIpNetTable(pIpNetTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if (GetIpNetTable(pIpNetTable, &Size, TRUE) != NO_ERROR)
{
_tprintf(_T("failed to allocate memory for GetIpNetTable\n"));
DoFormatMessage();
@@ -201,9 +199,7 @@ INT DisplayArpEntries(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpAddrTable, sizeof(*pIpAddrTable));
- iRet = GetIpAddrTable(pIpAddrTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if ((iRet = GetIpAddrTable(pIpAddrTable, &Size, TRUE)) != NO_ERROR)
{
_tprintf(_T("GetIpAddrTable failed: %d\n"), iRet);
DoFormatMessage();
@@ -272,7 +268,7 @@ INT Addhost(PTCHAR pszInetAddr, PTCHAR pszEthAddr, PTCHAR pszIfAddr)
PMIB_IPNETTABLE pIpNetTable = NULL;
DWORD dwIpAddr = 0;
ULONG Size = 0;
- INT iRet, i, val, c;
+ INT i, val, c;
/* error checking */
@@ -320,9 +316,7 @@ INT Addhost(PTCHAR pszInetAddr, PTCHAR pszEthAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpNetTable, sizeof(*pIpNetTable));
- iRet = GetIpNetTable(pIpNetTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if (GetIpNetTable(pIpNetTable, &Size, TRUE) != NO_ERROR)
{
_tprintf(_T("failed to allocate memory for GetIpNetTable\n"));
DoFormatMessage();
@@ -382,7 +376,7 @@ INT Addhost(PTCHAR pszInetAddr, PTCHAR pszEthAddr, PTCHAR pszIfAddr)
/* Add the ARP entry */
- if ((iRet = SetIpNetEntry(pAddHost)) != NO_ERROR)
+ if (SetIpNetEntry(pAddHost) != NO_ERROR)
{
DoFormatMessage();
goto cleanup;
@@ -415,7 +409,6 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
PMIB_IPNETTABLE pIpNetTable = NULL;
ULONG Size = 0;
DWORD dwIpAddr = 0;
- INT iRet;
BOOL bFlushTable = FALSE;
/* error checking */
@@ -449,9 +442,7 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
ZeroMemory(pIpNetTable, sizeof(*pIpNetTable));
- iRet = GetIpNetTable(pIpNetTable, &Size, TRUE);
-
- if (iRet != NO_ERROR)
+ if (GetIpNetTable(pIpNetTable, &Size, TRUE) != NO_ERROR)
{
_tprintf(_T("failed to allocate memory for GetIpNetTable\n"));
DoFormatMessage();
@@ -485,7 +476,7 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
if (bFlushTable == TRUE)
{
/* delete arp cache */
- if ((iRet = FlushIpNetTable(pDelHost->dwIndex)) != NO_ERROR)
+ if (FlushIpNetTable(pDelHost->dwIndex) != NO_ERROR)
{
DoFormatMessage();
goto cleanup;
@@ -501,7 +492,7 @@ INT Deletehost(PTCHAR pszInetAddr, PTCHAR pszIfAddr)
pDelHost->dwAddr = dwIpAddr;
/* Add the ARP entry */
- if ((iRet = DeleteIpNetEntry(pDelHost)) != NO_ERROR)
+ if (DeleteIpNetEntry(pDelHost) != NO_ERROR)
{
DoFormatMessage();
goto cleanup;
diff --git a/base/applications/network/ftp/fake.c b/base/applications/network/ftp/fake.c
index f8d0c8cdadf..a00f30560be 100644
--- a/base/applications/network/ftp/fake.c
+++ b/base/applications/network/ftp/fake.c
@@ -29,10 +29,10 @@ int checkRecv(SOCKET s)
void blkfree(char **av0)
{
- register char **av = av0;
+ register char **av = av0;
- while (*av)
- free(*av++);
+ while (*av)
+ free(*av++);
}
char **glob(register char *v)
@@ -52,16 +52,16 @@ int herror(char *string)
#if 0
int gettimeofday(struct timeval *timenow,
- struct timezone *zone)
+ struct timezone *zone)
{
- time_t t;
+ time_t t;
- t = clock();
+ t = clock();
- timenow->tv_usec = t;
- timenow->tv_sec = t / CLK_TCK;
+ timenow->tv_usec = t;
+ timenow->tv_sec = t / CLK_TCK;
- return 0;
+ return 0;
}
int fgetcSocket(int s)
@@ -100,13 +100,13 @@ int fgetcSocket(int s)
total = recv(s, buffer, sizeof(buffer), 0);
if (total == SOCKET_ERROR)
- {
- total = 0;
- return ERROR;
- }
+ {
+ total = 0;
+ return ERROR;
+ }
if (total == 0)
- return EOF;
+ return EOF;
}
return buffer[index++];
}
@@ -142,29 +142,29 @@ int fputcSocket(int s, char putChar)
buffer[1] = '\0';
if(SOCKET_ERROR==send(s, buffer, 1, 0)) {
- int iret=WSAGetLastError ();
- fprintf(stdout,"fputcSocket: %d\n",iret);
- return 0;
+ int iret=WSAGetLastError ();
+ fprintf(stdout,"fputcSocket: %d\n",iret);
+ return 0;
}
else {
- return putChar;
+ return putChar;
}
}
int fputSocket(int s, char *buffer, int len)
{
- int iret;
- while(len) {
- if(SOCKET_ERROR==(iret=send(s, buffer, len, 0)))
- {
- iret=WSAGetLastError ();
- fprintf(stdout,"fputcSocket: %d\n",iret);
- return 0;
- }
- else {
- return len-=iret;
- }
- }
- return 0;
+ int iret;
+ while(len) {
+ if(SOCKET_ERROR==(iret=send(s, buffer, len, 0)))
+ {
+ iret=WSAGetLastError ();
+ fprintf(stdout,"fputcSocket: %d\n",iret);
+ return 0;
+ }
+ else {
+ return len-=iret;
+ }
+ }
+ return 0;
}
char *fgetsSocket(int s, char *string)
@@ -180,31 +180,31 @@ char *fgetsSocket(int s, char *string)
if (count == SOCKET_ERROR)
{
- printf("Error in fgetssocket");
- return NULL;
+ printf("Error in fgetssocket");
+ return NULL;
}
if (count == 1)
{
- string[i] = buffer[0];
+ string[i] = buffer[0];
- if (i == MAX_ASCII - 3)
- {
- count = 0;
- string[++i] = '\n';
- string[++i] = '\0';
- }
+ if (i == MAX_ASCII - 3)
+ {
+ count = 0;
+ string[++i] = '\n';
+ string[++i] = '\0';
+ }
}
else
{
- if (i == 0)
- return NULL;
- else
- {
- string[i] = '\n';
- string[i + 1] = '\0'; // This is risky
- return string;
- }
+ if (i == 0)
+ return NULL;
+ else
+ {
+ string[i] = '\n';
+ string[i + 1] = '\0'; // This is risky
+ return string;
+ }
}
@@ -250,44 +250,44 @@ char *getpass (const char * prompt)
int rc;
if (istty)
- {
- if (GetConsoleMode (in, &old_flags))
- SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
- else
- istty = 0;
- }
+ {
+ if (GetConsoleMode (in, &old_flags))
+ SetConsoleMode (in, ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT);
+ else
+ istty = 0;
+ }
/* Need to read line one byte at time to avoid blocking, if not a
tty, so always do it this way. */
count = 0;
while (1)
- {
- DWORD dummy;
- char one_char;
+ {
+ DWORD dummy;
+ char one_char;
- rc = ReadFile (in, &one_char, 1, &dummy, NULL);
- if (rc == 0)
- break;
- if (one_char == '\r')
- {
- /* CR is always followed by LF if reading from tty. */
- if (istty)
- continue;
- else
- break;
- }
- if (one_char == '\n')
- break;
- /* Silently truncate password string if overly long. */
- if (count < sizeof (input) - 1)
- input[count++] = one_char;
- }
+ rc = ReadFile (in, &one_char, 1, &dummy, NULL);
+ if (rc == 0)
+ break;
+ if (one_char == '\r')
+ {
+ /* CR is always followed by LF if reading from tty. */
+ if (istty)
+ continue;
+ else
+ break;
+ }
+ if (one_char == '\n')
+ break;
+ /* Silently truncate password string if overly long. */
+ if (count < sizeof (input) - 1)
+ input[count++] = one_char;
+ }
input[count] = '\0';
WriteFile (err, "\r\n", 2, &count, NULL);
if (istty)
- SetConsoleMode (in, old_flags);
+ SetConsoleMode (in, old_flags);
if (rc)
- return input;
+ return input;
}
return NULL;
diff --git a/base/applications/network/ftp/ftp.c b/base/applications/network/ftp/ftp.c
index 2b09522fb51..5fdc81ce9fa 100644
--- a/base/applications/network/ftp/ftp.c
+++ b/base/applications/network/ftp/ftp.c
@@ -345,7 +345,7 @@ getreply(expecteof)
cp = reply_string;
while ((c = fgetcSocket(cin)) != '\n') {
if (c == IAC) { /* handle telnet commands */
- switch (c = fgetcSocket(cin)) {
+ switch (fgetcSocket(cin)) {
case WILL:
case WONT:
c = fgetcSocket(cin);
@@ -745,7 +745,7 @@ void recvrequest(const char *cmd, const char *local, const char *remote, const c
long bytes = 0, hashbytes = HASHBYTES;
// struct
fd_set mask;
- register int c, d;
+ register int c;
struct timeval start, stop;
// struct stat st;
@@ -781,6 +781,7 @@ null();// (void) signal(SIGINT, oldintr);
null();// oldintr = signal(SIGINT, abortrecv);
if (strcmp(local, "-") && *local != '|') {
#ifndef _WIN32
+ register int d;
// This whole thing is a problem... access Won't work on non-existent files
if (access(local, 2) < 0) {
char *dir = rindex(local, '/');
@@ -919,7 +920,7 @@ null();// oldintp = signal(SIGPIPE, SIG_IGN);
(*closefunc)(fout);
return;
}
- errno = d = 0;
+ errno = 0;
// while ((c = recv(din, buf, bufsize, 1)) > 0) {
// if ((d = write(fileno(fout), buf, c)) != c)
// if ((d = write(fileno(fout), buf, c)) != c)
@@ -1106,10 +1107,10 @@ null();// (void) signal(SIGINT,oldintr);
lostpeer();
}
if (din && FD_ISSET(din, &mask)) {
- while ((c = recv(din, buf, bufsize, 0)) > 0)
+ while (recv(din, buf, bufsize, 0) > 0)
;
}
- if ((c = getreply(0)) == ERROR && code == 552) { /* needed for nic style abort */
+ if (getreply(0) == ERROR && code == 552) { /* needed for nic style abort */
if (data >= 0) {
(void) close(data);
data = -1;
diff --git a/base/applications/network/ftp/ftp.rbuild b/base/applications/network/ftp/ftp.rbuild
index fce05853523..60f7ea5c659 100644
--- a/base/applications/network/ftp/ftp.rbuild
+++ b/base/applications/network/ftp/ftp.rbuild
@@ -4,6 +4,17 @@
.
+
+ _chdir
+ _getcwd
+ _mktemp
+ _unlink
+ _close
+ _fileno
+ _read
+ _write
+ _lseek
+
ws2_32
iphlpapi
oldnames
diff --git a/base/applications/network/netstat/netstat.c b/base/applications/network/netstat/netstat.c
index 45ff2fd7fa4..fbffe08db8e 100644
--- a/base/applications/network/netstat/netstat.c
+++ b/base/applications/network/netstat/netstat.c
@@ -14,7 +14,7 @@
*/
#include
-#include
+#include
#include
#include
#include
diff --git a/base/applications/network/nslookup/nslookup.c b/base/applications/network/nslookup/nslookup.c
index 993ab04a650..3e7ce484fd9 100644
--- a/base/applications/network/nslookup/nslookup.c
+++ b/base/applications/network/nslookup/nslookup.c
@@ -90,11 +90,7 @@ BOOL PerformInternalLookup( PCHAR pAddr, PCHAR pResult )
BOOL bOk = FALSE;
/* Makes things easier when parsing the response packet. */
- UCHAR Header1, Header2;
USHORT NumQuestions;
- USHORT NumAnswers;
- USHORT NumAuthority;
- USHORT NumAdditional;
USHORT Type;
if( (strlen( pAddr ) + 1) > 255 ) return FALSE;
@@ -198,12 +194,7 @@ BOOL PerformInternalLookup( PCHAR pAddr, PCHAR pResult )
if( !bOk ) goto cleanup;
/* Start parsing the received packet. */
- Header1 = RecBuffer[2];
- Header2 = RecBuffer[3];
NumQuestions = ntohs( ((PSHORT)&RecBuffer[4])[0] );
- NumAnswers = ntohs( ((PSHORT)&RecBuffer[6])[0] );
- NumAuthority = ntohs( ((PUSHORT)&RecBuffer[8])[0] );
- NumAdditional = ntohs( ((PUSHORT)&RecBuffer[10])[0] );
k = 12;
@@ -257,11 +248,10 @@ void PerformLookup( PCHAR pAddr )
BOOL bOk = FALSE;
/* Makes things easier when parsing the response packet. */
- UCHAR Header1, Header2;
+ UCHAR Header2;
USHORT NumQuestions;
USHORT NumAnswers;
USHORT NumAuthority;
- USHORT NumAdditional;
USHORT Type;
if( (strlen( pAddr ) + 1) > 255 ) return;
@@ -368,19 +358,17 @@ void PerformLookup( PCHAR pAddr )
((PSHORT)&Buffer[i])[0] = htons( ClassNametoClassID( State.Class ) );
/* Ship off the request to the DNS server. */
- bOk = SendRequest( Buffer,
+ bOk = SendRequest( Buffer,
BufferLength,
RecBuffer,
&RecBufferLength );
if( !bOk ) goto cleanup;
/* Start parsing the received packet. */
- Header1 = RecBuffer[2];
Header2 = RecBuffer[3];
NumQuestions = ntohs( ((PSHORT)&RecBuffer[4])[0] );
NumAnswers = ntohs( ((PSHORT)&RecBuffer[6])[0] );
NumAuthority = ntohs( ((PUSHORT)&RecBuffer[8])[0] );
- NumAdditional = ntohs( ((PUSHORT)&RecBuffer[10])[0] );
Type = 0;
/* Check the RCODE for failure. */
diff --git a/base/applications/notepad/dialog.c b/base/applications/notepad/dialog.c
index 937dd5807de..d8c6adc04e6 100644
--- a/base/applications/notepad/dialog.c
+++ b/base/applications/notepad/dialog.c
@@ -400,7 +400,6 @@ static UINT_PTR CALLBACK DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wPar
{
TCHAR szText[128];
HWND hCombo;
- OFNOTIFY *pNotify;
UNREFERENCED_PARAMETER(wParam);
@@ -440,15 +439,13 @@ static UINT_PTR CALLBACK DIALOG_FileSaveAs_Hook(HWND hDlg, UINT msg, WPARAM wPar
case WM_NOTIFY:
if (((NMHDR *) lParam)->code == CDN_FILEOK)
{
- pNotify = (OFNOTIFY *) lParam;
-
hCombo = GetDlgItem(hDlg, ID_ENCODING);
- if (hCombo)
- Globals.iEncoding = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if (hCombo)
+ Globals.iEncoding = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
hCombo = GetDlgItem(hDlg, ID_EOLN);
- if (hCombo)
- Globals.iEoln = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
+ if (hCombo)
+ Globals.iEoln = (int) SendMessage(hCombo, CB_GETCURSEL, 0, 0);
}
break;
}
@@ -808,11 +805,11 @@ static INT_PTR CALLBACK DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARA
TCHAR szText[32];
switch(uMsg) {
- case WM_INITDIALOG:
+ case WM_INITDIALOG:
hTextBox = GetDlgItem(hwndDialog, ID_LINENUMBER);
- _sntprintf(szText, SIZEOF(szText), _T("%d"), lParam);
+ _sntprintf(szText, SIZEOF(szText), _T("%d"), lParam);
SetWindowText(hTextBox, szText);
- break;
+ break;
case WM_COMMAND:
if (HIWORD(wParam) == BN_CLICKED)
{
@@ -823,11 +820,11 @@ static INT_PTR CALLBACK DIALOG_GoTo_DialogProc(HWND hwndDialog, UINT uMsg, WPARA
EndDialog(hwndDialog, _ttoi(szText));
bResult = TRUE;
}
- else if (LOWORD(wParam) == IDCANCEL)
- {
+ else if (LOWORD(wParam) == IDCANCEL)
+ {
EndDialog(hwndDialog, 0);
bResult = TRUE;
- }
+ }
}
break;
}
@@ -862,7 +859,7 @@ VOID DIALOG_GoTo(VOID)
Globals.hMainWnd, DIALOG_GoTo_DialogProc, nLine);
if (nLine >= 1)
- {
+ {
for (i = 0; pszText[i] && (nLine > 1) && (i < nLength - 1); i++)
{
if (pszText[i] == '\n')
@@ -870,8 +867,8 @@ VOID DIALOG_GoTo(VOID)
}
SendMessage(Globals.hEdit, EM_SETSEL, i, i);
SendMessage(Globals.hEdit, EM_SCROLLCARET, 0, 0);
- }
- HeapFree(GetProcessHeap(), 0, pszText);
+ }
+ HeapFree(GetProcessHeap(), 0, pszText);
}
VOID DIALOG_StatusBarUpdateCaretPos(VOID)
diff --git a/base/applications/paint/definitions.h b/base/applications/paint/definitions.h
index 5fb041e7a4c..71ec94bf263 100644
--- a/base/applications/paint/definitions.h
+++ b/base/applications/paint/definitions.h
@@ -98,6 +98,24 @@
#define ID_ELLIPSE 614
#define ID_RRECT 615
+//the following 16 numbers need to be in order, increasing by 1
+#define TOOL_FREESEL 1
+#define TOOL_RECTSEL 2
+#define TOOL_RUBBER 3
+#define TOOL_FILL 4
+#define TOOL_COLOR 5
+#define TOOL_ZOOM 6
+#define TOOL_PEN 7
+#define TOOL_BRUSH 8
+#define TOOL_AIRBRUSH 9
+#define TOOL_TEXT 10
+#define TOOL_LINE 11
+#define TOOL_BEZIER 12
+#define TOOL_RECT 13
+#define TOOL_SHAPE 14
+#define TOOL_ELLIPSE 15
+#define TOOL_RRECT 16
+
#define ID_ACCELERATORS 800
#define IDD_MIRRORROTATE 700
diff --git a/base/applications/paint/main.c b/base/applications/paint/main.c
index 904220567d1..3c77cb23999 100644
--- a/base/applications/paint/main.c
+++ b/base/applications/paint/main.c
@@ -50,7 +50,7 @@ short lastY;
int lineWidth = 1;
int shapeStyle = 0;
int brushStyle = 0;
-int activeTool = 7;
+int activeTool = TOOL_PEN;
int airBrushWidth = 5;
int rubberRadius = 4;
int transpBg = 0;
diff --git a/base/applications/paint/mouse.c b/base/applications/paint/mouse.c
index 9165291594e..d46bbe35eaf 100644
--- a/base/applications/paint/mouse.c
+++ b/base/applications/paint/mouse.c
@@ -67,7 +67,7 @@ startPaintingL(HDC hdc, short x, short y, int fg, int bg)
lastY = y;
switch (activeTool)
{
- case 1:
+ case TOOL_FREESEL:
ShowWindow(hSelection, SW_HIDE);
if (ptStack != NULL)
HeapFree(GetProcessHeap(), 0, ptStack);
@@ -76,39 +76,39 @@ startPaintingL(HDC hdc, short x, short y, int fg, int bg)
ptStack[0].x = x;
ptStack[0].y = y;
break;
- case 10:
- case 11:
- case 13:
- case 15:
- case 16:
+ case TOOL_TEXT:
+ case TOOL_LINE:
+ case TOOL_RECT:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
newReversible();
break;
- case 2:
+ case TOOL_RECTSEL:
newReversible();
ShowWindow(hSelection, SW_HIDE);
rectSel_src[2] = rectSel_src[3] = 0;
break;
- case 3:
+ case TOOL_RUBBER:
newReversible();
Erase(hdc, x, y, x, y, bg, rubberRadius);
break;
- case 4:
+ case TOOL_FILL:
newReversible();
Fill(hdc, x, y, fg);
break;
- case 7:
+ case TOOL_PEN:
newReversible();
SetPixel(hdc, x, y, fg);
break;
- case 8:
+ case TOOL_BRUSH:
newReversible();
Brush(hdc, x, y, x, y, fg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
newReversible();
Airbrush(hdc, x, y, fg, airBrushWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP == 0)
@@ -117,7 +117,7 @@ startPaintingL(HDC hdc, short x, short y, int fg, int bg)
pointSP++;
}
break;
- case 14:
+ case TOOL_SHAPE:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP + 1 >= 2)
@@ -136,7 +136,7 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 1:
+ case TOOL_FREESEL:
if (ptSP == 0)
newReversible();
ptSP++;
@@ -147,7 +147,7 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
resetToU1();
Poly(hdc, ptStack, ptSP + 1, 0, 0, 2, 0, FALSE);
break;
- case 2:
+ case TOOL_RECTSEL:
{
short tempX;
short tempY;
@@ -161,25 +161,25 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
RectSel(hdc, startX, startY, tempX, tempY);
break;
}
- case 3:
+ case TOOL_RUBBER:
Erase(hdc, lastX, lastY, x, y, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, fg, 1);
break;
- case 8:
+ case TOOL_BRUSH:
Brush(hdc, lastX, lastY, x, y, fg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
Airbrush(hdc, x, y, fg, airBrushWidth);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, fg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -197,13 +197,13 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
break;
}
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -213,13 +213,13 @@ whilePaintingL(HDC hdc, short x, short y, int fg, int bg)
if (pointSP + 1 >= 2)
Poly(hdc, pointStack, pointSP + 1, fg, bg, lineWidth, shapeStyle, FALSE);
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
@@ -236,7 +236,7 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 1:
+ case TOOL_FREESEL:
{
POINT *ptStackCopy;
int i;
@@ -279,6 +279,9 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
Poly(hdc, ptStack, ptSP + 1, bg, bg, 1, 2, TRUE);
newReversible();
+ MaskBlt(hDrawingDC, rectSel_src[0], rectSel_src[1], rectSel_src[2], rectSel_src[3], hSelDC, 0,
+ 0, hSelMask, 0, 0, MAKEROP4(SRCCOPY, SRCAND));
+
placeSelWin();
ShowWindow(hSelection, SW_SHOW);
}
@@ -286,7 +289,7 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
ptStack = NULL;
break;
}
- case 2:
+ case TOOL_RECTSEL:
resetToU1();
if ((rectSel_src[2] != 0) && (rectSel_src[3] != 0))
{
@@ -302,35 +305,38 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
rectSel_src[1] + rectSel_src[3], bgColor, bgColor, 0, TRUE);
newReversible();
+ BitBlt(hDrawingDC, rectSel_src[0], rectSel_src[1], rectSel_src[2], rectSel_src[3], hSelDC, 0,
+ 0, SRCCOPY);
+
placeSelWin();
ShowWindow(hSelection, SW_SHOW);
}
break;
- case 3:
+ case TOOL_RUBBER:
Erase(hdc, lastX, lastY, x, y, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, fg, 1);
SetPixel(hdc, x, y, fg);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, fg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointSP++;
if (pointSP == 4)
pointSP = 0;
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -354,13 +360,13 @@ endPaintingL(HDC hdc, short x, short y, int fg, int bg)
if (pointSP == 255)
pointSP--;
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, fg, bg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
@@ -378,35 +384,35 @@ startPaintingR(HDC hdc, short x, short y, int fg, int bg)
lastY = y;
switch (activeTool)
{
- case 1:
- case 10:
- case 11:
- case 13:
- case 15:
- case 16:
+ case TOOL_FREESEL:
+ case TOOL_TEXT:
+ case TOOL_LINE:
+ case TOOL_RECT:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
newReversible();
break;
- case 3:
+ case TOOL_RUBBER:
newReversible();
Replace(hdc, x, y, x, y, fg, bg, rubberRadius);
break;
- case 4:
+ case TOOL_FILL:
newReversible();
Fill(hdc, x, y, bg);
break;
- case 7:
+ case TOOL_PEN:
newReversible();
SetPixel(hdc, x, y, bg);
break;
- case 8:
+ case TOOL_BRUSH:
newReversible();
Brush(hdc, x, y, x, y, bg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
newReversible();
Airbrush(hdc, x, y, bg, airBrushWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP == 0)
@@ -415,7 +421,7 @@ startPaintingR(HDC hdc, short x, short y, int fg, int bg)
pointSP++;
}
break;
- case 14:
+ case TOOL_SHAPE:
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
if (pointSP + 1 >= 2)
@@ -434,25 +440,25 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 3:
+ case TOOL_RUBBER:
Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, bg, 1);
break;
- case 8:
+ case TOOL_BRUSH:
Brush(hdc, lastX, lastY, x, y, bg, brushStyle);
break;
- case 9:
+ case TOOL_AIRBRUSH:
Airbrush(hdc, x, y, bg, airBrushWidth);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, bg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -470,13 +476,13 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
break;
}
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -486,13 +492,13 @@ whilePaintingR(HDC hdc, short x, short y, int fg, int bg)
if (pointSP + 1 >= 2)
Poly(hdc, pointStack, pointSP + 1, bg, fg, lineWidth, shapeStyle, FALSE);
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
@@ -509,31 +515,31 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
{
switch (activeTool)
{
- case 3:
+ case TOOL_RUBBER:
Replace(hdc, lastX, lastY, x, y, fg, bg, rubberRadius);
break;
- case 7:
+ case TOOL_PEN:
Line(hdc, lastX, lastY, x, y, bg, 1);
SetPixel(hdc, x, y, bg);
break;
- case 11:
+ case TOOL_LINE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
roundTo8Directions(startX, startY, &x, &y);
Line(hdc, startX, startY, x, y, bg, lineWidth);
break;
- case 12:
+ case TOOL_BEZIER:
pointSP++;
if (pointSP == 4)
pointSP = 0;
break;
- case 13:
+ case TOOL_RECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Rect(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 14:
+ case TOOL_SHAPE:
resetToU1();
pointStack[pointSP].x = x;
pointStack[pointSP].y = y;
@@ -557,13 +563,13 @@ endPaintingR(HDC hdc, short x, short y, int fg, int bg)
if (pointSP == 255)
pointSP--;
break;
- case 15:
+ case TOOL_ELLIPSE:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
Ellp(hdc, startX, startY, x, y, bg, fg, lineWidth, shapeStyle);
break;
- case 16:
+ case TOOL_RRECT:
resetToU1();
if (GetAsyncKeyState(VK_SHIFT) < 0)
regularize(startX, startY, &x, &y);
diff --git a/base/applications/paint/toolsettings.c b/base/applications/paint/toolsettings.c
index bfb2172f0bf..2e5cd67661d 100644
--- a/base/applications/paint/toolsettings.c
+++ b/base/applications/paint/toolsettings.c
@@ -34,13 +34,13 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DefWindowProc(hwnd, message, wParam, lParam);
- DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, (activeTool == 6) ? BF_RECT : BF_RECT | BF_MIDDLE);
- DrawEdge(hdc, &rect2, (activeTool >= 13) ? BDR_SUNKENOUTER : 0, BF_RECT | BF_MIDDLE);
+ DrawEdge(hdc, &rect1, BDR_SUNKENOUTER, (activeTool == TOOL_ZOOM) ? BF_RECT : BF_RECT | BF_MIDDLE);
+ DrawEdge(hdc, &rect2, (activeTool >= TOOL_RECT) ? BDR_SUNKENOUTER : 0, BF_RECT | BF_MIDDLE);
switch (activeTool)
{
- case 1:
- case 2:
- case 10:
+ case TOOL_FREESEL:
+ case TOOL_RECTSEL:
+ case TOOL_TEXT:
{
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT));
@@ -50,7 +50,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DrawIconEx(hdc, 1, 33, hTranspIcon, 40, 30, 0, NULL, DI_NORMAL);
break;
}
- case 3:
+ case TOOL_RUBBER:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -69,7 +69,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DeleteObject(SelectObject(hdc, oldPen));
break;
}
- case 8:
+ case TOOL_BRUSH:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -82,7 +82,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
GetSysColor((i == brushStyle) ? COLOR_HIGHLIGHTTEXT : COLOR_WINDOWTEXT), i);
break;
}
- case 9:
+ case TOOL_AIRBRUSH:
{
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
SelectObject(hdc, GetSysColorBrush(COLOR_HIGHLIGHT));
@@ -112,8 +112,8 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DeleteObject(SelectObject(hdc, oldPen));
break;
}
- case 11:
- case 12:
+ case TOOL_LINE:
+ case TOOL_BEZIER:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -132,10 +132,10 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
DeleteObject(SelectObject(hdc, oldPen));
break;
}
- case 13:
- case 14:
- case 15:
- case 16:
+ case TOOL_RECT:
+ case TOOL_SHAPE:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
{
int i;
HPEN oldPen = SelectObject(hdc, CreatePen(PS_NULL, 0, 0));
@@ -178,23 +178,23 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (activeTool)
{
- case 1:
- case 2:
- case 10:
+ case TOOL_FREESEL:
+ case TOOL_RECTSEL:
+ case TOOL_TEXT:
if ((HIWORD(lParam) > 1) && (HIWORD(lParam) < 64))
{
transpBg = (HIWORD(lParam) - 2) / 31;
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 3:
+ case TOOL_RUBBER:
if ((HIWORD(lParam) > 1) && (HIWORD(lParam) < 62))
{
rubberRadius = (HIWORD(lParam) - 2) / 15 + 2;
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 8:
+ case TOOL_BRUSH:
if ((LOWORD(lParam) > 1) && (LOWORD(lParam) < 40) && (HIWORD(lParam) > 1)
&& (HIWORD(lParam) < 62))
{
@@ -202,7 +202,7 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 9:
+ case TOOL_AIRBRUSH:
if (HIWORD(lParam) < 62)
{
if (HIWORD(lParam) < 30)
@@ -222,18 +222,18 @@ SettingsWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 11:
- case 12:
+ case TOOL_LINE:
+ case TOOL_BEZIER:
if (HIWORD(lParam) <= 62)
{
lineWidth = (HIWORD(lParam) - 2) / 12 + 1;
SendMessage(hwnd, WM_PAINT, 0, 0);
}
break;
- case 13:
- case 14:
- case 15:
- case 16:
+ case TOOL_RECT:
+ case TOOL_SHAPE:
+ case TOOL_ELLIPSE:
+ case TOOL_RRECT:
if (HIWORD(lParam) <= 60)
{
shapeStyle = (HIWORD(lParam) - 2) / 20;
diff --git a/base/applications/paint/winproc.c b/base/applications/paint/winproc.c
index 464b62c9842..18bbaa61a67 100644
--- a/base/applications/paint/winproc.c
+++ b/base/applications/paint/winproc.c
@@ -460,19 +460,19 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (activeTool)
{
- case 4:
+ case TOOL_FILL:
SetCursor(hCurFill);
break;
- case 5:
+ case TOOL_COLOR:
SetCursor(hCurColor);
break;
- case 6:
+ case TOOL_ZOOM:
SetCursor(hCurZoom);
break;
- case 7:
+ case TOOL_PEN:
SetCursor(hCurPen);
break;
- case 9:
+ case TOOL_AIRBRUSH:
SetCursor(hCurAirbrush);
break;
default:
@@ -486,7 +486,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_LBUTTONDOWN:
if (hwnd == hImageArea)
{
- if ((!drawing) || (activeTool == 5))
+ if ((!drawing) || (activeTool == TOOL_COLOR))
{
SetCapture(hImageArea);
drawing = TRUE;
@@ -499,7 +499,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
undo();
}
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if ((activeTool == 6) && (zoom < 8000))
+ if ((activeTool == TOOL_ZOOM) && (zoom < 8000))
zoomTo(zoom * 2, (short)LOWORD(lParam), (short)HIWORD(lParam));
}
break;
@@ -507,7 +507,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_RBUTTONDOWN:
if (hwnd == hImageArea)
{
- if ((!drawing) || (activeTool == 5))
+ if ((!drawing) || (activeTool == TOOL_COLOR))
{
SetCapture(hImageArea);
drawing = TRUE;
@@ -520,7 +520,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
undo();
}
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if ((activeTool == 6) && (zoom > 125))
+ if ((activeTool == TOOL_ZOOM) && (zoom > 125))
zoomTo(zoom / 2, (short)LOWORD(lParam), (short)HIWORD(lParam));
}
break;
@@ -533,7 +533,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
endPaintingL(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom, fgColor,
bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if (activeTool == 5)
+ if (activeTool == TOOL_COLOR)
{
int tempColor =
GetPixel(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom);
@@ -553,7 +553,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
endPaintingR(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom, fgColor,
bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if (activeTool == 5)
+ if (activeTool == TOOL_COLOR)
{
int tempColor =
GetPixel(hDrawingDC, LOWORD(lParam) * 1000 / zoom, HIWORD(lParam) * 1000 / zoom);
@@ -568,16 +568,13 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSEMOVE:
if (hwnd == hImageArea)
{
- if ((!drawing) || (activeTool <= 9))
+ short xNow = (short)LOWORD(lParam) * 1000 / zoom;
+ short yNow = (short)HIWORD(lParam) * 1000 / zoom;
+ if ((!drawing) || (activeTool <= TOOL_AIRBRUSH))
{
TRACKMOUSEEVENT tme;
- TCHAR coordStr[100];
- _stprintf(coordStr, _T("%d, %d"), (short)LOWORD(lParam) * 1000 / zoom,
- (short)HIWORD(lParam) * 1000 / zoom);
- SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
-
- if (activeTool == 6)
+ if (activeTool == TOOL_ZOOM)
{
SendMessage(hImageArea, WM_PAINT, 0, 0);
drawZoomFrame((short)LOWORD(lParam), (short)HIWORD(lParam));
@@ -588,32 +585,73 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
tme.hwndTrack = hImageArea;
tme.dwHoverTime = 0;
TrackMouseEvent(&tme);
+
+ if (!drawing)
+ {
+ TCHAR coordStr[100];
+ _stprintf(coordStr, _T("%d, %d"), xNow, yNow);
+ SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
+ }
}
if (drawing)
{
+ /* values displayed in statusbar */
+ short xRel = xNow - startX;
+ short yRel = yNow - startY;
+ /* freesel, rectsel and text tools always show numbers limited to fit into image area */
+ if ((activeTool == TOOL_FREESEL) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_TEXT))
+ {
+ if (xRel < 0)
+ xRel = (xNow < 0) ? -startX : xRel;
+ else if (xNow > imgXRes)
+ xRel = imgXRes-startX;
+ if (yRel < 0)
+ yRel = (yNow < 0) ? -startY : yRel;
+ else if (yNow > imgYRes)
+ yRel = imgYRes-startY;
+ }
+ /* rectsel and shape tools always show non-negative numbers when drawing */
+ if ((activeTool == TOOL_RECTSEL) || (activeTool == TOOL_SHAPE))
+ {
+ if (xRel < 0)
+ xRel = -xRel;
+ if (yRel < 0)
+ yRel = -yRel;
+ }
+ /* while drawing, update cursor coordinates only for tools 3, 7, 8, 9, 14 */
+ switch(activeTool)
+ {
+ case TOOL_RUBBER:
+ case TOOL_PEN:
+ case TOOL_BRUSH:
+ case TOOL_AIRBRUSH:
+ case TOOL_SHAPE:
+ {
+ TCHAR coordStr[100];
+ _stprintf(coordStr, _T("%d, %d"), xNow, yNow);
+ SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) coordStr);
+ break;
+ }
+ }
if ((wParam & MK_LBUTTON) != 0)
{
- whilePaintingL(hDrawingDC, (short)LOWORD(lParam) * 1000 / zoom,
- (short)HIWORD(lParam) * 1000 / zoom, fgColor, bgColor);
+ whilePaintingL(hDrawingDC, xNow, yNow, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if ((activeTool >= 10) || (activeTool == 2))
+ if ((activeTool >= TOOL_TEXT) || (activeTool == TOOL_RECTSEL) || (activeTool == TOOL_FREESEL))
{
TCHAR sizeStr[100];
- _stprintf(sizeStr, _T("%d x %d"), (short)LOWORD(lParam) * 1000 / zoom - startX,
- (short)HIWORD(lParam) * 1000 / zoom - startY);
+ _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
}
}
if ((wParam & MK_RBUTTON) != 0)
{
- whilePaintingR(hDrawingDC, (short)LOWORD(lParam) * 1000 / zoom,
- (short)HIWORD(lParam) * 1000 / zoom, fgColor, bgColor);
+ whilePaintingR(hDrawingDC, xNow, yNow, fgColor, bgColor);
SendMessage(hImageArea, WM_PAINT, 0, 0);
- if (activeTool >= 10)
+ if (activeTool >= TOOL_TEXT)
{
TCHAR sizeStr[100];
- _stprintf(sizeStr, _T("%d x %d"), (short)LOWORD(lParam) * 1000 / zoom - startX,
- (short)HIWORD(lParam) * 1000 / zoom - startY);
+ _stprintf(sizeStr, _T("%d x %d"), xRel, yRel);
SendMessage(hStatusBar, SB_SETTEXT, 2, (LPARAM) sizeStr);
}
}
@@ -623,7 +661,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
case WM_MOUSELEAVE:
SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM) _T(""));
- if (activeTool == 6)
+ if (activeTool == TOOL_ZOOM)
SendMessage(hImageArea, WM_PAINT, 0, 0);
break;
@@ -747,7 +785,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
/* remove selection window and already painted content using undo(),
paint Rect for rectangular selections and nothing for freeform selections */
undo();
- if (activeTool == 2)
+ if (activeTool == TOOL_RECTSEL)
{
newReversible();
Rect(hDrawingDC, rectSel_dest[0], rectSel_dest[1], rectSel_dest[2] + rectSel_dest[0],
@@ -756,7 +794,7 @@ WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
break;
}
case IDM_EDITSELECTALL:
- if (activeTool == 2)
+ if (activeTool == TOOL_RECTSEL)
{
startPaintingL(hDrawingDC, 0, 0, fgColor, bgColor);
whilePaintingL(hDrawingDC, imgXRes, imgYRes, fgColor, bgColor);
diff --git a/base/applications/rapps/lang/de-DE.rc b/base/applications/rapps/lang/de-DE.rc
index b48f0ea2229..ea4dbc80de6 100644
--- a/base/applications/rapps/lang/de-DE.rc
+++ b/base/applications/rapps/lang/de-DE.rc
@@ -185,7 +185,7 @@ BEGIN
IDS_UPDATES "Aktualisierungen"
IDS_APPLICATIONS "Anwendungen"
IDS_CHOOSE_FOLDER_TEXT "Wählen Sie ein Verzeichnis aus, das zum Herunterladen verwendet werden soll:"
- IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existentes Verzeichnis angegeben!"
+ IDS_CHOOSE_FOLDER_ERROR "Sie haben ein nicht existierendes Verzeichnis angegeben! Neu anlegen?"
IDS_USER_NOT_ADMIN "Sie müssen als Administrator angemeldet sein, um den Anwendungsmanager zu starten!"
IDS_APP_REG_REMOVE "Sind Sie sich sicher, dass Sie die Daten dieses Programms aus der Registry entfernen möchten?"
IDS_INFORMATION "Informationen"
diff --git a/base/applications/rapps/lang/en-US.rc b/base/applications/rapps/lang/en-US.rc
index f8d018923dc..677ca86c13b 100644
--- a/base/applications/rapps/lang/en-US.rc
+++ b/base/applications/rapps/lang/en-US.rc
@@ -185,7 +185,7 @@ BEGIN
IDS_UPDATES "Updates"
IDS_APPLICATIONS "Applications"
IDS_CHOOSE_FOLDER_TEXT "Choose a folder which will store Downloads:"
- IDS_CHOOSE_FOLDER_ERROR "The folder you have specified does not exist."
+ IDS_CHOOSE_FOLDER_ERROR "The folder you have specified does not exist. Create it?"
IDS_USER_NOT_ADMIN "You must be an administrator to start ""ReactOS Applications Manager""!"
IDS_APP_REG_REMOVE "Are you sure you want to delete the data on the installed program from the registry?"
IDS_INFORMATION "Information"
diff --git a/base/applications/rapps/lang/it-IT.rc b/base/applications/rapps/lang/it-IT.rc
index 44fcfab4a8a..35366716d7d 100644
--- a/base/applications/rapps/lang/it-IT.rc
+++ b/base/applications/rapps/lang/it-IT.rc
@@ -156,7 +156,7 @@ BEGIN
IDS_CAT_DEVEL "Sviluppo"
IDS_CAT_DRIVERS "Drivers"
IDS_CAT_EDU "Edutainment"
- IDS_CAT_ENGINEER "Engineering"
+ IDS_CAT_ENGINEER "Scienze"
IDS_CAT_FINANCE "Finanza"
IDS_CAT_GAMES "Giochi e divertimento"
IDS_CAT_GRAPHICS "Graphica"
@@ -174,18 +174,18 @@ BEGIN
IDS_APPTITLE "ReactOS Applications Manager"
IDS_SEARCH_TEXT "Cerca..."
IDS_INSTALL "Installa"
- IDS_UNINSTALL "Disinstall"
+ IDS_UNINSTALL "Disinstalla"
IDS_MODIFY "Modifica"
IDS_APPS_COUNT "Numero applicazioni: %d"
IDS_WELCOME_TITLE "Benvenuto!\n\n"
IDS_WELCOME_TEXT "Scegliere una categoria a sinistra, poi scegliere una applicazione da installare o disinstallare.\nReactOS Web Site: "
IDS_WELCOME_URL "http://www.reactos.org"
IDS_INSTALLED "Installato"
- IDS_AVAILABLEFORINST "Disponibile"
+ IDS_AVAILABLEFORINST "Disponibile per l'installazione"
IDS_UPDATES "Aggiornamenti"
IDS_APPLICATIONS "Applicazioni"
IDS_CHOOSE_FOLDER_TEXT "Scegliere una cartella dove scaricare le applicazioni:"
- IDS_CHOOSE_FOLDER_ERROR "La cartella indicata non esiste."
+ IDS_CHOOSE_FOLDER_ERROR "La cartella indicata non esiste. Vuoi crearla?"
IDS_USER_NOT_ADMIN "Dovete essere Amministratore per avviare ""ReactOS Applications Manager""!"
IDS_APP_REG_REMOVE "Sicuro di voler cancellare dal registry i dati sui programmi installati?"
IDS_INFORMATION "Informazioni"
diff --git a/base/applications/rapps/lang/pl-PL.rc b/base/applications/rapps/lang/pl-PL.rc
index 60fd20b7530..5b68948a7e7 100644
--- a/base/applications/rapps/lang/pl-PL.rc
+++ b/base/applications/rapps/lang/pl-PL.rc
@@ -187,7 +187,7 @@ BEGIN
IDS_UPDATES "Uaktualnienia"
IDS_APPLICATIONS "Aplikacje"
IDS_CHOOSE_FOLDER_TEXT "Wybierz katalog w którym będa zapisywane pobrane programy:"
- IDS_CHOOSE_FOLDER_ERROR "Wybrałeś nieistniejący katalog!"
+ IDS_CHOOSE_FOLDER_ERROR "Wybrałeś nieistniejący katalog! Czy chcesz utworzyć nowy?"
IDS_USER_NOT_ADMIN "Musisz mieć uprawnienia administratora aby uruchomić ""ReactOS Applications Manager""!"
IDS_APP_REG_REMOVE "Czy na pewno chcesz usunąć wpis tego programu z rejestru?"
IDS_INFORMATION "Informacja"
diff --git a/base/applications/rapps/rapps/firefox2.txt b/base/applications/rapps/rapps/firefox2.txt
index 3cf7dc27921..e0b62661193 100644
--- a/base/applications/rapps/rapps/firefox2.txt
+++ b/base/applications/rapps/rapps/firefox2.txt
@@ -8,35 +8,20 @@ Description = The most popular and one of the best free Web Browsers out there.
Size = 5.8M
Category = 5
URLSite = http://www.mozilla.com/en-US/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/en-US/Firefox%20Setup%202.0.0.20.exe
+URLDownload = http://svn.reactos.org/packages/Firefox%20Setup%202.0.0.20.exe
CDPath = none
[Section.0407]
Description = Der populärste und einer der besten freien Webbrowser.
-Size = 5.5M
-URLSite = http://www.mozilla-europe.org/de/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/de/Firefox%20Setup%202.0.0.20.exe
[Section.040a]
Description = El más popular y uno de los mejores navegadores web gratuitos que hay.
-Size = 5.6M
-URLSite = http://www.mozilla-europe.org/es/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/es-ES/Firefox%20Setup%202.0.0.20.exe
[Section.0414]
Description = Mest populære og best også gratis nettleserene der ute.
-Size = 5.6M
-URLSite = http://www.mozilla-europe.org/no/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/nb-NO/Firefox%20Setup%202.0.0.20.exe
[Section.0415]
Description = Najpopularniejsza i jedna z najlepszych darmowych przeglÄ…darek internetowych.
-Size = 6.3M
-URLSite = http://www.mozilla-europe.org/pl/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/pl/Firefox%20Setup%202.0.0.20.exe
[Section.0419]
Description = Один из Ńамых попŃлярных и Đ»ŃчŃих беŃплатных браŃзеров.
-Size = 6.4M
-URLSite = http://www.mozilla-europe.org/ru/
-URLDownload = http://194.71.11.70/pub/www/clients/mozilla.org/firefox/releases/2.0.0.20/win32/ru/Firefox%20Setup%202.0.0.20.exe
diff --git a/base/applications/rapps/rapps/mirandaim.txt b/base/applications/rapps/rapps/mirandaim.txt
index aadc724e326..5845bf7eb97 100644
--- a/base/applications/rapps/rapps/mirandaim.txt
+++ b/base/applications/rapps/rapps/mirandaim.txt
@@ -2,13 +2,13 @@
[Section]
Name = Miranda IM
-Version = 0.8.22
+Version = 0.8.24
Licence = GPL
Description = Open source multiprotocol instant messaging application - May not work completely.
-Size = 1.6MB
+Size = 1.7MB
Category = 5
URLSite = http://www.miranda-im.org/
-URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.22-unicode.exe
+URLDownload = http://miranda.googlecode.com/files/miranda-im-v0.8.24-unicode.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/openoffice3.0.txt b/base/applications/rapps/rapps/openoffice3.0.txt
index b9ee71bd025..9ae02ef5d4e 100644
--- a/base/applications/rapps/rapps/openoffice3.0.txt
+++ b/base/applications/rapps/rapps/openoffice3.0.txt
@@ -2,30 +2,29 @@
[Section]
Name = OpenOffice 3.0
-Version = 3.2.0
+Version = 3.2.1
Licence = LGPL
Description = THE Open Source Office Suite.
-Size = 135.4MB
+Size = 134.0MB
Category = 6
URLSite = http://www.openoffice.org/
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/stable/3.2.0/OOo_3.2.0_Win32Intel_install_en-US.exe
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/stable/3.2.1/OOo_3.2.1_Win_x86_install_en-US.exe
CDPath = none
[Section.0407]
Description = DIE Open Source Office Suite.
URLSite = http://de.openoffice.org/
-Size = 145.8MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/de/3.2.0/OOo_3.2.0_Win32Intel_install_de.exe
+Size = 144.0MB
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/de/3.2.1/OOo_3.2.1_Win_x86_install_de.exe
[Section.040a]
Description = La suite de ofimática de código abierto.
URLSite = http://es.openoffice.org/
-Version = 3.1.0
-Size = 119.4MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/es/3.2.0/OOo_3.2.0_Win32Intel_install_es.exe
+Size = 144.0MB
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/es/3.2.1/OOo_3.2.1_Win_x86_install-wJRE_es.exe
[Section.0415]
Description = Otwarty pakiet biurowy.
URLSite = http://pl.openoffice.org/
-Size = 133.2MB
-URLDownload = http://ftp.tu-chemnitz.de/pub/openoffice/localized/pl/3.2.0/OOo_3.2.0_Win32Intel_install_pl.exe
+Size = 130.0MB
+URLDownload = http://ftp3.gwdg.de/pub/openoffice/localized/pl/3.2.1/OOo_3.2.1_Win_x86_install_pl.exe
diff --git a/base/applications/rapps/rapps/rosbe.txt b/base/applications/rapps/rapps/rosbe.txt
index 384df84563a..a019299b9d1 100644
--- a/base/applications/rapps/rapps/rosbe.txt
+++ b/base/applications/rapps/rapps/rosbe.txt
@@ -2,13 +2,13 @@
[Section]
Name = ReactOS Build Environment
-Version = 1.5.1
+Version = 1.5.1.1
Licence = GPL
Description = Allows you to build the ReactOS Source. For more instructions see ReactOS wiki.
-Size = 13.5MB
+Size = 13.8MB
Category = 7
-URLSite = http://reactos.org/wiki/Build_Environment/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.1.exe
+URLSite = http://reactos.org/wiki/Build_Environment
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/reactos/RosBE-1.5.1.1.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/rapps/scite.txt b/base/applications/rapps/rapps/scite.txt
index c32df9cd195..2da34b49e95 100644
--- a/base/applications/rapps/rapps/scite.txt
+++ b/base/applications/rapps/rapps/scite.txt
@@ -2,13 +2,13 @@
[Section]
Name = SciTE
-Version = 2.11
+Version = 2.12
Licence = Freeware
Description = 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.
Size = 0.6M
Category = 7
URLSite = http://www.scintilla.org/
-URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc211.exe
+URLDownload = http://ovh.dl.sourceforge.net/sourceforge/scintilla/Sc212.exe
CDPath = none
[Section.0407]
diff --git a/base/applications/rapps/settingsdlg.c b/base/applications/rapps/settingsdlg.c
index 3764f0140bb..77034c51f5a 100644
--- a/base/applications/rapps/settingsdlg.c
+++ b/base/applications/rapps/settingsdlg.c
@@ -115,7 +115,14 @@ SettingsDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
IDS_CHOOSE_FOLDER_ERROR,
szMsgText, sizeof(szMsgText) / sizeof(WCHAR));
- MessageBoxW(hDlg, szMsgText, NULL, MB_OK | MB_ICONERROR);
+ if (MessageBoxW(hDlg, szMsgText, NULL, MB_YESNO) == IDYES)
+ {
+ if (CreateDirectoryW(szDir, NULL))
+ {
+ EndDialog(hDlg, LOWORD(wParam));
+ }
+ }
+
SetFocus(GetDlgItem(hDlg, IDC_DOWNLOAD_DIR_EDIT));
break;
}
diff --git a/base/applications/regedit/edit.c b/base/applications/regedit/edit.c
index ca4d5b3ac8f..6ed32b974bb 100644
--- a/base/applications/regedit/edit.c
+++ b/base/applications/regedit/edit.c
@@ -276,7 +276,6 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
{
WNDPROC oldproc;
HWND hwndValue;
- int len;
TCHAR ValueString[32];
LPTSTR Remainder;
DWORD Base;
@@ -319,7 +318,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
dwordEditMode = EDIT_MODE_HEX;
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
- if ((len = GetWindowTextLength(hwndValue)))
+ if (GetWindowTextLength(hwndValue))
{
if (GetWindowText(hwndValue, ValueString, 32))
{
@@ -339,7 +338,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
dwordEditMode = EDIT_MODE_DEC;
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
- if ((len = GetWindowTextLength(hwndValue)))
+ if (GetWindowTextLength(hwndValue))
{
if (GetWindowText(hwndValue, ValueString, 32))
{
@@ -356,7 +355,7 @@ INT_PTR CALLBACK modify_dword_dlgproc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LP
case IDOK:
if ((hwndValue = GetDlgItem(hwndDlg, IDC_VALUE_DATA)))
{
- if ((len = GetWindowTextLength(hwndValue)))
+ if (GetWindowTextLength(hwndValue))
{
if (!GetWindowText(hwndValue, ValueString, 32))
{
diff --git a/base/applications/regedit/lang/it-IT.rc b/base/applications/regedit/lang/it-IT.rc
index 47960b8da5b..f5a2fc96540 100644
--- a/base/applications/regedit/lang/it-IT.rc
+++ b/base/applications/regedit/lang/it-IT.rc
@@ -192,7 +192,7 @@ STYLE DS_SHELLFONT | DS_MODALFRAME | DS_NOIDLEMSG | DS_CONTEXTHELP |
CAPTION "Modifica Multi-Stringa"
FONT 8, "MS Shell Dlg"
BEGIN
- LTEXT "&Name:",IDC_STATIC,6,6,134,8
+ LTEXT "&Nome:",IDC_STATIC,6,6,134,8
EDITTEXT IDC_VALUE_NAME,6,17,240,12,ES_AUTOHSCROLL | ES_READONLY
LTEXT "&Dati:",IDC_STATIC,6,35,161,8
EDITTEXT IDC_VALUE_DATA,6,46,240,102,ES_MULTILINE |
diff --git a/base/setup/usetup/interface/usetup.c b/base/setup/usetup/interface/usetup.c
index 63738b320c4..57b4efca6bd 100644
--- a/base/setup/usetup/interface/usetup.c
+++ b/base/setup/usetup/interface/usetup.c
@@ -1418,7 +1418,7 @@ static BOOL IsDiskSizeValid(PPARTENTRY PartEntry)
if( m < RequiredPartitionDiskSpace)
{
/* partition is too small so ask for another partion */
- DPRINT1("Partition too small");
+ DPRINT1("Partition is too small, required disk space is %lu MB\n", RequiredPartitionDiskSpace);
return FALSE;
}
else
diff --git a/base/setup/usetup/lang/bg-BG.h b/base/setup/usetup/lang/bg-BG.h
index 074f6baac6e..b6b22fdbf13 100644
--- a/base/setup/usetup/lang/bg-BG.h
+++ b/base/setup/usetup/lang/bg-BG.h
@@ -1483,17 +1483,17 @@ MUI_ERROR bgBGErrorEntries[] =
"ŤĄăáŻĄč® ¤®ˇ ˘ďĄ Ş« ˘¨ âăŕ¨âĄ Ż®¤ŕĄ¤ˇ¨ ˘ ॣ¨áâęŕ .\n"
"ENTER = ŹŕĄ§ Żă᪠Ą Ş®¬Żîâęŕ "
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Ť áâŕ®©Ş â Ą ¬®¦ ¤ ăáâ ®˘¨ ®§ ç¨âĄ«ď ŁĄ®Łŕ äáŞ®â® Ż®«®¦Ą¨Ą.\n"
+ "ENTER = ŹŕĄ§ Żă᪠Ą Ş®¬Żîâęŕ "
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Ť â¨áĄâĄ Ş« ˘¨č, § ¤ Żŕ®¤ę«¦¨âĄ.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Ť áâŕ®©Ş â Ą ¬®¦ ¤ ăáâ ®˘¨ ®§ ç¨âĄ«ď ŁĄ®Łŕ äáŞ®â® Ż®«®¦Ą¨Ą.\n"
- "ENTER = ŹŕĄ§ Żă᪠Ą Ş®¬Żîâęŕ "
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/es-ES.h b/base/setup/usetup/lang/es-ES.h
index c01630efcb7..bc2fe1340af 100644
--- a/base/setup/usetup/lang/es-ES.h
+++ b/base/setup/usetup/lang/es-ES.h
@@ -1478,6 +1478,11 @@ MUI_ERROR esESErrorEntries[] =
"El instalador no ha podido agregar los layouts de teclado al registro.\n"
"ENTER = Reiniciar el equipo"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "El instalador no ha podido configurar el ID geogr fico.\n"
+ "ENTER = Reiniciar el equipo"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"No hay suficiente espacio disponible en la partici˘n seleccionada.\n"
@@ -1485,11 +1490,6 @@ MUI_ERROR esESErrorEntries[] =
NULL
},
{
- //ERROR_UPDATE_GEOID,
- "El instalador no ha podido configurar el ID geogr fico.\n"
- "ENTER = Reiniciar el equipo"
- },
-{
NULL,
NULL
}
diff --git a/base/setup/usetup/lang/et-EE.h b/base/setup/usetup/lang/et-EE.h
index 819a2d47f08..f0b7e8bd328 100644
--- a/base/setup/usetup/lang/et-EE.h
+++ b/base/setup/usetup/lang/et-EE.h
@@ -1468,17 +1468,17 @@ MUI_ERROR etEEErrorEntries[] =
"Klaviatuuriasetusi ei ännestunud registrisse lisada.\n"
"ENTER = Taask„ivita arvuti"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Geograafilist asukohta ei ännestunud seadistada.\n"
+ "ENTER = Taask„ivita arvuti"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Valitud partitsioonil pole piisavalt ruumi.\n"
" * Vajuta suvalist klahvi, et j„tkata.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Geograafilist asukohta ei ännestunud seadistada.\n"
- "ENTER = Taask„ivita arvuti"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/fr-FR.h b/base/setup/usetup/lang/fr-FR.h
index c1790341522..aa3b3df809a 100644
--- a/base/setup/usetup/lang/fr-FR.h
+++ b/base/setup/usetup/lang/fr-FR.h
@@ -1484,17 +1484,17 @@ MUI_ERROR frFRErrorEntries[] =
"Setup failed to add keyboard layouts to registry.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup could not set the geo id.\n"
+ "ENTER = Reboot computer"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/it-IT.h b/base/setup/usetup/lang/it-IT.h
index b3e6ef496ed..3b4ac5670cd 100644
--- a/base/setup/usetup/lang/it-IT.h
+++ b/base/setup/usetup/lang/it-IT.h
@@ -1472,17 +1472,17 @@ MUI_ERROR itITErrorEntries[] =
"Impossibile aggiungere le nazionalit… di tastiera al registro.\n"
"INVIO = Riavviare il computer"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup non ha potuto impostare l'id geografico.\n"
+ "INVIO = Riavviare il computer"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Lo spazio disponibile nella partizione selezionata Š insufficiente.\n"
" * Premere un tasto qualsiasi per continuare.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Setup non ha potuto impostare l'id geografico.\n"
- "INVIO = Riavviare il computer"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/lt-LT.h b/base/setup/usetup/lang/lt-LT.h
index bb0c26fcc20..7020ebbaba1 100644
--- a/base/setup/usetup/lang/lt-LT.h
+++ b/base/setup/usetup/lang/lt-LT.h
@@ -1481,17 +1481,17 @@ MUI_ERROR ltLTErrorEntries[] =
"Setup failed to add keyboard layouts to registry.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup could not set the geo id.\n"
+ "ENTER = Reboot computer"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/nl-NL.h b/base/setup/usetup/lang/nl-NL.h
index 2a0b2836b11..0141359d290 100644
--- a/base/setup/usetup/lang/nl-NL.h
+++ b/base/setup/usetup/lang/nl-NL.h
@@ -1499,17 +1499,17 @@ MUI_ERROR nlNLErrorEntries[] =
"Setup kan de toetsenbord indelingen niet toevoegen aan de registry.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup kan de geografische positie niet instellen.\n"
+ "ENTER = Reboot computer"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Setup kan de geografische positie niet instellen.\n"
- "ENTER = Reboot computer"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/pl-PL.h b/base/setup/usetup/lang/pl-PL.h
index 104f8a1e41b..de0a55fcd5c 100644
--- a/base/setup/usetup/lang/pl-PL.h
+++ b/base/setup/usetup/lang/pl-PL.h
@@ -1480,17 +1480,17 @@ MUI_ERROR plPLErrorEntries[] =
"Instalator nie m˘g doda† ukad˘w klawiatury do rejestru.\n"
"ENTER = Restart komputera"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Instalator nie m˘g ustawi† lokalizacji geograficznej.\n"
+ "ENTER = Restart komputera"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Brak wystarczajĄcej wolnej przestrzeni w wybranej partycji.\n"
" * Nacinij dowolny klawisz aby kontynuowa†.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Instalator nie m˘g ustawi† lokalizacji geograficznej.\n"
- "ENTER = Restart komputera"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/ru-RU.h b/base/setup/usetup/lang/ru-RU.h
index ddf6062b62a..b74d17b8e1a 100644
--- a/base/setup/usetup/lang/ru-RU.h
+++ b/base/setup/usetup/lang/ru-RU.h
@@ -1472,17 +1472,17 @@ MUI_ERROR ruRUErrorEntries[] =
"Setup failed to add keyboard layouts to registry.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup could not set the geo id.\n"
+ "ENTER = Reboot computer"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/sk-SK.h b/base/setup/usetup/lang/sk-SK.h
index 3a003761748..5bb0d60fb53 100644
--- a/base/setup/usetup/lang/sk-SK.h
+++ b/base/setup/usetup/lang/sk-SK.h
@@ -1482,17 +1482,17 @@ MUI_ERROR skSKErrorEntries[] =
"Inçtal tor zlyhal pri prid vanˇ rozlo§enˇ kl vesnice do registrov.\n"
"ENTER = Reçtart poźˇtaźa"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Inçtal tor nemohol nastaviś geo id.\n"
+ "ENTER = Reçtart poźˇtaźa"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Inçtal tor nemohol nastaviś geo id.\n"
- "ENTER = Reçtart poźˇtaźa"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/sv-SE.h b/base/setup/usetup/lang/sv-SE.h
index 352bb6c8124..17b0fa5ddad 100644
--- a/base/setup/usetup/lang/sv-SE.h
+++ b/base/setup/usetup/lang/sv-SE.h
@@ -1472,17 +1472,17 @@ MUI_ERROR svSEErrorEntries[] =
"Setup failed to add keyboard layouts to registry.\n"
"ENTER = Reboot computer"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "Setup could not set the geo id.\n"
+ "ENTER = Reboot computer"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "Setup could not set the geo id.\n"
- "ENTER = Reboot computer"
- },
{
NULL,
NULL
diff --git a/base/setup/usetup/lang/uk-UA.h b/base/setup/usetup/lang/uk-UA.h
index 1227dfe6188..7f7a7a7b7e1 100644
--- a/base/setup/usetup/lang/uk-UA.h
+++ b/base/setup/usetup/lang/uk-UA.h
@@ -1478,17 +1478,17 @@ MUI_ERROR ukUAErrorEntries[] =
"ŤĄ ˘¤ «®áě ¤®¤ â¨ ŕ®§Ş« ¤Ş¨ Ş« ˘i âăਠ¤® ŕĄóáâŕă.\n"
"ENTER = ŹĄŕĄ§ ˘ â ¦¨â¨ Ş®¬Ż'îâĄŕ"
},
+ {
+ //ERROR_UPDATE_GEOID,
+ "ŤĄ ˘¤ «®áě ˘áâ ®˘¨â¨ geo id.\n"
+ "ENTER = ŹĄŕĄ§ ˘ â ¦¨â¨ Ş®¬Ż'îâĄŕ"
+ },
{
//ERROR_INSUFFICIENT_DISKSPACE,
"Not enough free space in the selected partition.\n"
" * Press any key to continue.",
NULL
},
- {
- //ERROR_UPDATE_GEOID,
- "ŤĄ ˘¤ «®áě ˘áâ ®˘¨â¨ geo id.\n"
- "ENTER = ŹĄŕĄ§ ˘ â ¦¨â¨ Ş®¬Ż'îâĄŕ"
- },
{
NULL,
NULL
diff --git a/base/setup/vmwinst/vmwinst.c b/base/setup/vmwinst/vmwinst.c
index 8f513033ec3..e53860cc9d2 100644
--- a/base/setup/vmwinst/vmwinst.c
+++ b/base/setup/vmwinst/vmwinst.c
@@ -111,7 +111,7 @@ DetectVMware(int *Version)
/* try to open the file */
static BOOL
-FileExists(WCHAR *Path, WCHAR *File)
+DoesFileExist(WCHAR *Path, WCHAR *File)
{
WCHAR FileName[MAX_PATH + 1];
HANDLE FileHandle;
@@ -195,9 +195,9 @@ IsVMwareCDInDrive(WCHAR *Drv)
continue;
}
- if(FileExists(SrcPath, vmx_fb) &&
- (FileExists(SrcPath, vmx_mode) || FileExists(SrcPath, vmx_mode_v6)) &&
- FileExists(SrcPath, vmx_svga))
+ if(DoesFileExist(SrcPath, vmx_fb) &&
+ (DoesFileExist(SrcPath, vmx_mode) || DoesFileExist(SrcPath, vmx_mode_v6)) &&
+ DoesFileExist(SrcPath, vmx_svga))
{
*Drv = Current;
return TRUE;
@@ -1070,9 +1070,9 @@ wWinMain(HINSTANCE hInstance,
SetCurrentDirectory(DestinationPath);
- DriverFilesFound = FileExists(DestinationPath, vmx_fb) &&
- FileExists(DestinationPath, vmx_mode) &&
- FileExists(DestinationDriversPath, vmx_svga);
+ DriverFilesFound = DoesFileExist(DestinationPath, vmx_fb) &&
+ DoesFileExist(DestinationPath, vmx_mode) &&
+ DoesFileExist(DestinationDriversPath, vmx_svga);
StartVMwConfigWizard = DriverFilesFound && IsVmwSVGAEnabled();
diff --git a/base/shell/cmd/cmd.c b/base/shell/cmd/cmd.c
index 59f00eada0a..54ff9b23edc 100644
--- a/base/shell/cmd/cmd.c
+++ b/base/shell/cmd/cmd.c
@@ -156,7 +156,7 @@ BOOL bCanExit = TRUE; /* indicates if this shell is exitable */
BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */
BOOL bIgnoreEcho = FALSE; /* Set this to TRUE to prevent a newline, when executing a command */
INT nErrorLevel = 0; /* Errorlevel of last launched external program */
-BOOL bChildProcessRunning = FALSE;
+CRITICAL_SECTION ChildProcessRunningLock;
BOOL bUnicodeOutput = FALSE;
BOOL bDisableBatchEcho = FALSE;
BOOL bDelayedExpansion = FALSE;
@@ -436,14 +436,12 @@ Execute (LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd)
{
if (IsConsoleProcess(prci.hProcess))
{
- /* FIXME: Protect this with critical section */
- bChildProcessRunning = TRUE;
+ EnterCriticalSection(&ChildProcessRunningLock);
dwChildProcessId = prci.dwProcessId;
WaitForSingleObject (prci.hProcess, INFINITE);
- /* FIXME: Protect this with critical section */
- bChildProcessRunning = FALSE;
+ LeaveCriticalSection(&ChildProcessRunningLock);
GetExitCodeProcess (prci.hProcess, &dwExitCode);
nErrorLevel = (INT)dwExitCode;
@@ -665,9 +663,9 @@ ExecutePipeline(PARSED_COMMAND *Cmd)
SetStdHandle(STD_INPUT_HANDLE, hOldConIn);
/* Wait for all processes to complete */
- bChildProcessRunning = TRUE;
+ EnterCriticalSection(&ChildProcessRunningLock);
WaitForMultipleObjects(nProcesses, hProcess, TRUE, INFINITE);
- bChildProcessRunning = FALSE;
+ LeaveCriticalSection(&ChildProcessRunningLock);
/* Use the exit code of the last process in the pipeline */
GetExitCodeProcess(hProcess[nProcesses - 1], &dwExitCode);
@@ -1439,13 +1437,16 @@ BOOL WINAPI BreakHandler (DWORD dwCtrlType)
}
}
- if (bChildProcessRunning == TRUE)
+ if (!TryEnterCriticalSection(&ChildProcessRunningLock))
{
SelfGenerated = TRUE;
GenerateConsoleCtrlEvent (dwCtrlType, 0);
return TRUE;
}
-
+ else
+ {
+ LeaveCriticalSection(&ChildProcessRunningLock);
+ }
rec.EventType = KEY_EVENT;
rec.Event.KeyEvent.bKeyDown = TRUE;
@@ -1797,6 +1798,7 @@ static VOID Cleanup()
RemoveBreakHandler ();
SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ),
ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT );
+ DeleteCriticalSection(&ChildProcessRunningLock);
}
/*
@@ -1808,6 +1810,7 @@ int cmd_main (int argc, const TCHAR *argv[])
TCHAR startPath[MAX_PATH];
CONSOLE_SCREEN_BUFFER_INFO Info;
+ InitializeCriticalSection(&ChildProcessRunningLock);
lpOriginalEnvironment = DuplicateEnvironment();
GetCurrentDirectory(MAX_PATH,startPath);
diff --git a/base/shell/cmd/copy.c b/base/shell/cmd/copy.c
index d451fea09e8..a5bf33eefcb 100644
--- a/base/shell/cmd/copy.c
+++ b/base/shell/cmd/copy.c
@@ -604,28 +604,30 @@ INT cmd_copy (LPTSTR param)
bTouch = TRUE;
bDone = TRUE;
}
-
- if(_tcslen(tmpName) == 2)
- {
- if(tmpName[1] == _T(':'))
- {
- GetRootPath(tmpName,szSrcPath,MAX_PATH);
- }
- }
- else
- /* Get the full path to first file in the string of file names */
- GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL);
}
else
{
bDone = TRUE;
- if(_tcslen(arg[nSrc]) == 2 && arg[nSrc][1] == _T(':'))
+ _tcscpy(tmpName, arg[nSrc]);
+ }
+
+ /* Get full path or root names */
+ if(_tcslen(tmpName) == 2 && tmpName[1] == _T(':'))
+ {
+ GetRootPath(tmpName,szSrcPath,MAX_PATH);
+ }
+ else
+ {
+ /* Get the full path to first file in the string of file names */
+ GetFullPathName (tmpName, MAX_PATH, szSrcPath, NULL);
+
+ /* We got a device path of form \\.\x */
+ /* FindFirstFile cannot handle this, therefore use the short path */
+ if (szSrcPath[0] == _T('\\') && szSrcPath[1] == _T('\\') &&
+ szSrcPath[2] == _T('.') && szSrcPath[3] == _T('\\'))
{
- GetRootPath(arg[nSrc],szSrcPath,MAX_PATH);
+ _tcscpy(szSrcPath, tmpName);
}
- else
- /* Get the full path of the source file */
- GetFullPathName (arg[nSrc], MAX_PATH, szSrcPath, NULL);
}
/* From this point on, we can assume that the shortest path is 3 letters long
diff --git a/base/shell/cmd/filecomp.c b/base/shell/cmd/filecomp.c
index 7cb99a72f12..d2127fde250 100644
--- a/base/shell/cmd/filecomp.c
+++ b/base/shell/cmd/filecomp.c
@@ -590,10 +590,20 @@ VOID CompleteFilename (LPTSTR strIN, BOOL bNext, LPTSTR strOut, UINT cusor)
/* Start the search for all the files */
GetFullPathName(szBaseWord, MAX_PATH, szSearchPath, NULL);
+
+ /* Got a device path? Fallback to the the current dir plus the short path */
+ if (szSearchPath[0] == _T('\\') && szSearchPath[1] == _T('\\') &&
+ szSearchPath[2] == _T('.') && szSearchPath[3] == _T('\\'))
+ {
+ GetCurrentDirectory(MAX_PATH, szSearchPath);
+ _tcscat(szSearchPath, _T("\\"));
+ _tcscat(szSearchPath, szBaseWord);
+ }
+
if(StartLength > 0)
- {
+ {
_tcscat(szSearchPath,_T("*"));
- }
+ }
_tcscpy(LastSearch,szSearchPath);
_tcscpy(LastPrefix,szPrefix);
}
diff --git a/base/shell/explorer-new/explorer.c b/base/shell/explorer-new/explorer.c
index 9c31f33a0fe..8716edc021f 100644
--- a/base/shell/explorer-new/explorer.c
+++ b/base/shell/explorer-new/explorer.c
@@ -284,7 +284,9 @@ _tWinMain(IN HINSTANCE hInstance,
TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"),
&hkExplorer) != ERROR_SUCCESS)
{
- /* FIXME - display error */
+ TCHAR Message[256];
+ LoadString(hInstance, IDS_STARTUP_ERROR, Message, 256);
+ MessageBox(NULL, Message, NULL, MB_ICONERROR);
return 1;
}
diff --git a/base/shell/explorer-new/lang/bg-BG.rc b/base/shell/explorer-new/lang/bg-BG.rc
index 482ae13cede..f4c08db2f04 100644
--- a/base/shell/explorer-new/lang/bg-BG.rc
+++ b/base/shell/explorer-new/lang/bg-BG.rc
@@ -121,6 +121,7 @@ BEGIN
IDS_PROPERTIES "&Ńâîéńňâŕ"
IDS_OPEN_ALL_USERS "&Îňâŕđ˙íĺ íŕ âńč÷ęč ďîňđĺáčňĺëč"
IDS_EXPLORE_ALL_USERS "&Đŕçëčńňâŕíĺ íŕ âńč÷ęč ďîňđĺáčňĺëč"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/cs-CZ.rc b/base/shell/explorer-new/lang/cs-CZ.rc
index c82c31a89a0..5273c548ff1 100644
--- a/base/shell/explorer-new/lang/cs-CZ.rc
+++ b/base/shell/explorer-new/lang/cs-CZ.rc
@@ -126,6 +126,7 @@ BEGIN
IDS_PROPERTIES "Vl&astnosti"
IDS_OPEN_ALL_USERS "Ote&vřít složku All Users"
IDS_EXPLORE_ALL_USERS "Pro&cházet složku All Users"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/de-DE.rc b/base/shell/explorer-new/lang/de-DE.rc
index 80aefc0c32a..1173c3ffd90 100644
--- a/base/shell/explorer-new/lang/de-DE.rc
+++ b/base/shell/explorer-new/lang/de-DE.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "E&igenschaften"
IDS_OPEN_ALL_USERS "Öffnen (&Alle Benutzer)"
IDS_EXPLORE_ALL_USERS "Explorer (A&lle Benutzer)"
+ IDS_STARTUP_ERROR "Das System kann den Explorer nicht starten, weil die Registrierung nicht verfügbar bzw. fehlerhaft ist."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/en-US.rc b/base/shell/explorer-new/lang/en-US.rc
index 9e1d6876fde..c98a1face25 100644
--- a/base/shell/explorer-new/lang/en-US.rc
+++ b/base/shell/explorer-new/lang/en-US.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "P&roperties"
IDS_OPEN_ALL_USERS "O&pen All Users"
IDS_EXPLORE_ALL_USERS "E&xplore All Users"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/es-ES.rc b/base/shell/explorer-new/lang/es-ES.rc
index b0dcd7ef349..86e83e4ebf1 100644
--- a/base/shell/explorer-new/lang/es-ES.rc
+++ b/base/shell/explorer-new/lang/es-ES.rc
@@ -129,6 +129,7 @@ BEGIN
IDS_PROPERTIES "P&ropiedades"
IDS_OPEN_ALL_USERS "A&brir todos los usuarios"
IDS_EXPLORE_ALL_USERS "E&xplorar todos los usuarios"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/fr-FR.rc b/base/shell/explorer-new/lang/fr-FR.rc
index 57587e9882d..35227391c08 100644
--- a/base/shell/explorer-new/lang/fr-FR.rc
+++ b/base/shell/explorer-new/lang/fr-FR.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "P&ropriétés"
IDS_OPEN_ALL_USERS "Ouvrir tous les utilisateurs"
IDS_EXPLORE_ALL_USERS "E&xplorer tous les utilisateurs"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/it-IT.rc b/base/shell/explorer-new/lang/it-IT.rc
index 443c32d624e..eaf2c0b9328 100644
--- a/base/shell/explorer-new/lang/it-IT.rc
+++ b/base/shell/explorer-new/lang/it-IT.rc
@@ -78,11 +78,11 @@ BEGIN
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
+ LTEXT "Questo stile di menů ha funzionalitŕ e aspetto classici",-1,20,57,150,24, WS_DISABLED
+ PUSHBUTTON "&Personalizza...", 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
+ AUTOCHECKBOX "Memorizza e mostra un elenco di &file aperti di recente", IDC_TASKBARPROP_RECENTFILES, 14,114,224,10, WS_DISABLED
+ AUTOCHECKBOX "Memorizza e mostra un elenco di &programmi aperti di recente",IDC_TASKBARPROP_RECENTFOLDERS, 14,128,224,10, WS_DISABLED
END
IDD_TASKBARPROP_NOTIFICATION DIALOGEX 0, 0, 252, 218
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "&Proprietŕ"
IDS_OPEN_ALL_USERS "&Apri tutti gli utenti"
IDS_EXPLORE_ALL_USERS "&Esplora tutti gli utenti"
+ IDS_STARTUP_ERROR "Impossibile avviare explorer perché il registro č danneggiato o non disponibile."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ja-JP.rc b/base/shell/explorer-new/lang/ja-JP.rc
index 5084e2c79b2..66b55a294a9 100644
--- a/base/shell/explorer-new/lang/ja-JP.rc
+++ b/base/shell/explorer-new/lang/ja-JP.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "vŤpeB(&R)"
IDS_OPEN_ALL_USERS "ŠJ‚ - All Users(&P)"
IDS_EXPLORE_ALL_USERS "GNXvŤ[‰ - All Users(&E)"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ko-KR.rc b/base/shell/explorer-new/lang/ko-KR.rc
index 0232ae1d59b..adbafd39641 100644
--- a/base/shell/explorer-new/lang/ko-KR.rc
+++ b/base/shell/explorer-new/lang/ko-KR.rc
@@ -125,6 +125,7 @@ BEGIN
IDS_PROPERTIES "ĽÓĽş(&R)"
IDS_OPEN_ALL_USERS "ż±â - All Users(&P)"
IDS_EXPLORE_ALL_USERS "Ĺ˝»ö - All Users(&X)"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/lt-LT.rc b/base/shell/explorer-new/lang/lt-LT.rc
index 5c3c0c69efe..b0dd8e57f62 100644
--- a/base/shell/explorer-new/lang/lt-LT.rc
+++ b/base/shell/explorer-new/lang/lt-LT.rc
@@ -124,6 +124,7 @@ BEGIN
IDS_PROPERTIES "&Parametrai"
IDS_OPEN_ALL_USERS "&Atverti visus vartotojus"
IDS_EXPLORE_ALL_USERS "&Narđyti visus vartotojus"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/nl-NL.rc b/base/shell/explorer-new/lang/nl-NL.rc
index 3dcf5183a7e..135956e86c2 100644
--- a/base/shell/explorer-new/lang/nl-NL.rc
+++ b/base/shell/explorer-new/lang/nl-NL.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "&Eigenschappen"
IDS_OPEN_ALL_USERS "&Alle Gebruikers weergeven"
IDS_EXPLORE_ALL_USERS "Alle Gebruikers V&erkennen"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/no-NO.rc b/base/shell/explorer-new/lang/no-NO.rc
index 583fa140de8..d06d1aaf3f2 100644
--- a/base/shell/explorer-new/lang/no-NO.rc
+++ b/base/shell/explorer-new/lang/no-NO.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "E&genskaper"
IDS_OPEN_ALL_USERS "Ĺ&pne alle brukere"
IDS_EXPLORE_ALL_USERS "U&tforsk alle brukere"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/pl-PL.rc b/base/shell/explorer-new/lang/pl-PL.rc
index 22a67438dfa..7b8e9de9cb6 100644
--- a/base/shell/explorer-new/lang/pl-PL.rc
+++ b/base/shell/explorer-new/lang/pl-PL.rc
@@ -123,6 +123,7 @@ BEGIN
IDS_PROPERTIES "Właś&ciwości"
IDS_OPEN_ALL_USERS "&Otwórz - wszyscy użytkownicy"
IDS_EXPLORE_ALL_USERS "&Eksploruj - wszyscy użytkownicy"
+ IDS_STARTUP_ERROR "System nie może uruchomić eksploratora ponieważ rejestr jest niedostępny lub uszkodzony."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ro-RO.rc b/base/shell/explorer-new/lang/ro-RO.rc
index f18c0a8f57e..f583672499c 100644
--- a/base/shell/explorer-new/lang/ro-RO.rc
+++ b/base/shell/explorer-new/lang/ro-RO.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "P&roprietăţi"
IDS_OPEN_ALL_USERS "Deschidere& Toţi Utilizatorii"
IDS_EXPLORE_ALL_USERS "E&xplorare Toţi Utilizatorii"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/ru-RU.rc b/base/shell/explorer-new/lang/ru-RU.rc
index c5d54139dc4..7a21b150a74 100644
--- a/base/shell/explorer-new/lang/ru-RU.rc
+++ b/base/shell/explorer-new/lang/ru-RU.rc
@@ -122,6 +122,7 @@ BEGIN
IDS_PROPERTIES "&Ńâîéńňâŕ"
IDS_OPEN_ALL_USERS "&Âńĺ ďîëüçîâŕňĺëč"
IDS_EXPLORE_ALL_USERS "&Îáçîđ Âńĺő ďîëüçîâŕňĺëĺé"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/sk-SK.rc b/base/shell/explorer-new/lang/sk-SK.rc
index 8cd7c5b9aca..c6329c7e695 100644
--- a/base/shell/explorer-new/lang/sk-SK.rc
+++ b/base/shell/explorer-new/lang/sk-SK.rc
@@ -120,6 +120,7 @@ BEGIN
IDS_PROPERTIES "Vl&astnosti"
IDS_OPEN_ALL_USERS "&Otvoriť profil All Users"
IDS_EXPLORE_ALL_USERS "&Preskúmať profil All Users"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/lang/uk-UA.rc b/base/shell/explorer-new/lang/uk-UA.rc
index d02ee30f9e2..65462be70a4 100644
--- a/base/shell/explorer-new/lang/uk-UA.rc
+++ b/base/shell/explorer-new/lang/uk-UA.rc
@@ -128,6 +128,7 @@ BEGIN
IDS_PROPERTIES "Â&ëŕńňčâîńňł"
IDS_OPEN_ALL_USERS "&Âńł ęîđčńňóâŕ÷ł"
IDS_EXPLORE_ALL_USERS "&Îăë˙ä âńłő ęîđčńňóâŕ÷łâ"
+ IDS_STARTUP_ERROR "The system cannot start explorer because the registry is corrupted or unavailable."
END
STRINGTABLE DISCARDABLE
diff --git a/base/shell/explorer-new/resource.h b/base/shell/explorer-new/resource.h
index 0ab9222f778..dbdf9c1bef9 100644
--- a/base/shell/explorer-new/resource.h
+++ b/base/shell/explorer-new/resource.h
@@ -8,6 +8,7 @@
#define IDS_PROPERTIES 102
#define IDS_OPEN_ALL_USERS 103
#define IDS_EXPLORE_ALL_USERS 104
+#define IDS_STARTUP_ERROR 105
#define IDC_STARTBTN 304
diff --git a/base/system/format/format.c b/base/system/format/format.c
index ba9f42b3a05..4eae18bb614 100755
--- a/base/system/format/format.c
+++ b/base/system/format/format.c
@@ -185,7 +185,7 @@ FormatExCallback (
if( *status == FALSE ) {
LoadString( GetModuleHandle(NULL), STRING_FORMAT_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
Error = TRUE;
}
break;
@@ -204,7 +204,7 @@ FormatExCallback (
case STRUCTUREPROGRESS:
case CLUSTERSIZETOOSMALL:
LoadString( GetModuleHandle(NULL), STRING_NO_SUPPORT, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
return FALSE;
}
return TRUE;
@@ -320,7 +320,7 @@ _tmain(int argc, TCHAR *argv[])
//
if( !LoadFMIFSEntryPoints()) {
LoadString( GetModuleHandle(NULL), STRING_FMIFS_FAIL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
return -1;
}
@@ -422,7 +422,7 @@ _tmain(int argc, TCHAR *argv[])
break;
}
LoadString( GetModuleHandle(NULL), STRING_ERROR_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
}
}
@@ -471,7 +471,7 @@ _tmain(int argc, TCHAR *argv[])
((float)(LONGLONG)totalNumberOfBytes.QuadPart)/(float)(1024.0*1024.0));
}
LoadString( GetModuleHandle(NULL), STRING_CREATE_FSYS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
}
//
@@ -489,7 +489,7 @@ _tmain(int argc, TCHAR *argv[])
#endif
if( Error ) return -1;
LoadString( GetModuleHandle(NULL), STRING_FMT_COMPLETE, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
//
// Enable compression if desired
@@ -504,7 +504,7 @@ _tmain(int argc, TCHAR *argv[])
#endif
LoadString( GetModuleHandle(NULL), STRING_VOL_COMPRESS, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
}
}
@@ -514,7 +514,7 @@ _tmain(int argc, TCHAR *argv[])
if( !GotALabel ) {
LoadString( GetModuleHandle(NULL), STRING_ENTER_LABEL, (LPTSTR) szMsg,RC_STRING_MAX_SIZE);
- _tprintf(szMsg);
+ _tprintf("%s", szMsg);
_fgetts( input, sizeof(LabelString)/2, stdin );
input[ _tcslen(input)-1] = 0;
diff --git a/base/system/smss/initpage.c b/base/system/smss/initpage.c
index 9b889377de6..7ec19985463 100644
--- a/base/system/smss/initpage.c
+++ b/base/system/smss/initpage.c
@@ -225,34 +225,288 @@ Cleanup:
}
+static NTSTATUS
+SmpGetFreeDiskSpace(IN PWSTR PageFileName,
+ OUT PLARGE_INTEGER FreeDiskSpaceInMB)
+{
+ FILE_FS_SIZE_INFORMATION FileFsSize;
+ IO_STATUS_BLOCK IoStatusBlock;
+ HANDLE hFile;
+ UNICODE_STRING NtPathU;
+ LARGE_INTEGER FreeBytes;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ WCHAR RootPath[5];
+ NTSTATUS Status;
+
+ /*
+ * copy the drive letter, the colon and the slash,
+ * tack a null on the end
+ */
+ RootPath[0] = PageFileName[0];
+ RootPath[1] = L':';
+ RootPath[2] = L'\\';
+ RootPath[3] = L'\0';
+
+ DPRINT("Root drive X:\\...\"%S\"\n",RootPath);
+
+ if (!RtlDosPathNameToNtPathName_U(RootPath,
+ &NtPathU,
+ NULL,
+ NULL))
+ {
+ DPRINT1("Invalid path to root of drive\n");
+ return STATUS_OBJECT_PATH_INVALID;
+ }
+
+ InitializeObjectAttributes(&ObjectAttributes,
+ &NtPathU,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ /* Get a handle to the root to find the free space on the drive */
+ Status = NtCreateFile(&hFile,
+ 0,
+ &ObjectAttributes,
+ &IoStatusBlock,
+ NULL,
+ 0,
+ FILE_SHARE_READ | FILE_SHARE_WRITE,
+ FILE_OPEN,
+ 0,
+ NULL,
+ 0);
+
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ NtPathU.Buffer);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Could not open a handle to the volume.\n");
+ return Status;
+ }
+
+ Status = NtQueryVolumeInformationFile(hFile,
+ &IoStatusBlock,
+ &FileFsSize,
+ sizeof(FILE_FS_SIZE_INFORMATION),
+ FileFsSizeInformation);
+
+ NtClose(hFile);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Querying the volume free space failed!\n");
+ return Status;
+ }
+
+ FreeBytes.QuadPart = FileFsSize.BytesPerSector *
+ FileFsSize.SectorsPerAllocationUnit *
+ FileFsSize.AvailableAllocationUnits.QuadPart;
+
+ FreeDiskSpaceInMB->QuadPart = FreeBytes.QuadPart >> 20;
+
+ return STATUS_SUCCESS;
+}
+
+
+static NTSTATUS
+SmpSetDefaultPageFileData(IN PWSTR PageFileName,
+ IN PLARGE_INTEGER InitialSizeInMB,
+ IN PLARGE_INTEGER MaximumSizeInMB)
+{
+ WCHAR ValueString[MAX_PATH * 2];
+ ULONG ValueLength;
+
+ /* Format the value string */
+ swprintf(ValueString,
+ L"%s %I64u %I64u",
+ PageFileName,
+ InitialSizeInMB->QuadPart,
+ MaximumSizeInMB->QuadPart);
+
+ /*
+ * Append another zero character because it is a multi string value
+ * (REG_MULTI_SZ) and calculate the total string length.
+ */
+ ValueLength = wcslen(ValueString) + 1;
+ ValueString[ValueLength] = 0;
+ ValueLength++;
+
+ /* Write the page file data */
+ return RtlWriteRegistryValue(RTL_REGISTRY_CONTROL,
+ L"\\Session Manager\\Memory Management",
+ L"PagingFiles",
+ REG_MULTI_SZ,
+ ValueString,
+ ValueLength * sizeof(WCHAR));
+}
+
+
+static NTSTATUS
+SmpCreatePageFile(IN PWSTR PageFileName,
+ IN PLARGE_INTEGER InitialSizeInMB,
+ IN PLARGE_INTEGER MaximumSizeInMB)
+{
+ LARGE_INTEGER InitialSize;
+ LARGE_INTEGER MaximumSize;
+ UNICODE_STRING FileName;
+ NTSTATUS Status;
+
+ /* Get the NT path name of the page file */
+ if (!RtlDosPathNameToNtPathName_U(PageFileName,
+ &FileName,
+ NULL,
+ NULL))
+ {
+ return STATUS_OBJECT_PATH_INVALID;
+ }
+
+ /* Convert sizes in megabytes to sizes in bytes */
+ InitialSize.QuadPart = InitialSizeInMB->QuadPart << 20;
+ MaximumSize.QuadPart = MaximumSizeInMB->QuadPart << 20;
+
+ /* Create the pageing file */
+ Status = NtCreatePagingFile(&FileName,
+ &InitialSize,
+ &MaximumSize,
+ 0);
+ if (! NT_SUCCESS(Status))
+ {
+ DPRINT("Creation of paging file %wZ with size %I64d MB failed (status 0x%x)\n",
+ &FileName, InitialSizeInMB->QuadPart, Status);
+ }
+
+ /* Release the file name */
+ RtlFreeHeap(RtlGetProcessHeap(),
+ 0,
+ FileName.Buffer);
+
+ return Status;
+}
+
+
+static NTSTATUS
+SmpCreateDefaultPagingFile(VOID)
+{
+ SYSTEM_BASIC_INFORMATION SysBasicInfo;
+ LARGE_INTEGER MemorySizeInMB;
+ LARGE_INTEGER FreeDiskSpaceInMB;
+ LARGE_INTEGER InitialSizeInMB;
+ LARGE_INTEGER MaximumSizeInMB;
+ NTSTATUS Status = STATUS_SUCCESS;
+ WCHAR PageFileName[MAX_PATH];
+
+ DPRINT("Creating a default paging file\n");
+
+ Status = NtQuerySystemInformation(SystemBasicInformation,
+ &SysBasicInfo,
+ sizeof(SysBasicInfo),
+ NULL);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("Could not query for physical memory size.\n");
+ return Status;
+ }
+
+ DPRINT("PageSize: %d, PhysicalPages: %d, TotalMem: %d\n",
+ SysBasicInfo.PageSize,
+ SysBasicInfo.NumberOfPhysicalPages,
+ (SysBasicInfo.NumberOfPhysicalPages * SysBasicInfo.PageSize) / 1024);
+
+ MemorySizeInMB.QuadPart = (SysBasicInfo.NumberOfPhysicalPages * SysBasicInfo.PageSize) >> 20;
+
+ DPRINT("MemorySize %I64u MB\n",
+ MemorySizeInMB.QuadPart);
+
+ /* Build the default page file name */
+ PageFileName[0] = SharedUserData->NtSystemRoot[0];
+ PageFileName[1] = 0;
+ wcscat(PageFileName, L":\\pagefile.sys");
+
+ Status = SmpGetFreeDiskSpace(PageFileName,
+ &FreeDiskSpaceInMB);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ DPRINT("FreeDiskSpace %I64u MB\n",
+ FreeDiskSpaceInMB.QuadPart);
+
+ InitialSizeInMB.QuadPart = MemorySizeInMB.QuadPart + (MemorySizeInMB.QuadPart / 2);
+ MaximumSizeInMB.QuadPart = InitialSizeInMB.QuadPart * 2;
+
+ if (InitialSizeInMB.QuadPart > (FreeDiskSpaceInMB.QuadPart / 4))
+ {
+ DPRINT("Inital Size took more then 25%% of free disk space\n");
+
+ /*
+ * Set by percentage of free space
+ * intial is 20%, and max is 25%
+ */
+ InitialSizeInMB.QuadPart = FreeDiskSpaceInMB.QuadPart / 5;
+ MaximumSizeInMB.QuadPart = FreeDiskSpaceInMB.QuadPart / 4;
+
+ /* The page file is more then a gig, size it down */
+ if (InitialSizeInMB.QuadPart > 1024)
+ {
+ InitialSizeInMB.QuadPart = 1024; /* 1GB */
+ MaximumSizeInMB.QuadPart = 1536; /* 1.5GB */
+ }
+ }
+
+ DPRINT("InitialSize %I64u MB MaximumSize %I64u MB\n",
+ InitialSizeInMB.QuadPart,
+ MaximumSizeInMB.QuadPart);
+
+ Status = SmpSetDefaultPageFileData(PageFileName,
+ &InitialSizeInMB,
+ &MaximumSizeInMB);
+ if (!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+
+ return SmpCreatePageFile(PageFileName,
+ &InitialSizeInMB,
+ &MaximumSizeInMB);
+}
+
+
NTSTATUS
SmCreatePagingFiles(VOID)
{
- RTL_QUERY_REGISTRY_TABLE QueryTable[2];
- NTSTATUS Status;
+ RTL_QUERY_REGISTRY_TABLE QueryTable[2];
+ NTSTATUS Status;
- DPRINT("creating system paging files\n");
- /*
- * Disable paging file on MiniNT/Live CD.
- */
- if (RtlCheckRegistryKey(RTL_REGISTRY_CONTROL, L"MiniNT") == STATUS_SUCCESS)
+ DPRINT("creating system paging files\n");
+
+ /* Disable paging file on MiniNT/Live CD. */
+ if (RtlCheckRegistryKey(RTL_REGISTRY_CONTROL, L"MiniNT") == STATUS_SUCCESS)
{
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
}
- RtlZeroMemory(&QueryTable,
- sizeof(QueryTable));
+ RtlZeroMemory(&QueryTable,
+ sizeof(QueryTable));
- QueryTable[0].Name = L"PagingFiles";
- QueryTable[0].QueryRoutine = SmpPagingFilesQueryRoutine;
+ QueryTable[0].Name = L"PagingFiles";
+ QueryTable[0].QueryRoutine = SmpPagingFilesQueryRoutine;
+ QueryTable[0].Flags = RTL_QUERY_REGISTRY_REQUIRED;
- Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
- L"\\Session Manager\\Memory Management",
- QueryTable,
- NULL,
- NULL);
+ Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,
+ L"\\Session Manager\\Memory Management",
+ QueryTable,
+ NULL,
+ NULL);
+ if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
+ {
+ Status = SmpCreateDefaultPagingFile();
+ }
- return(Status);
+ return Status;
}
diff --git a/boot/bootdata/hivedef_arm.inf b/boot/bootdata/hivedef_arm.inf
index 086ee67f4fa..8d8c48935d1 100644
--- a/boot/bootdata/hivedef_arm.inf
+++ b/boot/bootdata/hivedef_arm.inf
@@ -1530,8 +1530,7 @@ HKCU,"Control Panel\Accessibility\Keyboard Preference","On",2,"0"
; Internet Explorer
HKCU,Software\Wine\MSHTML,"GeckoUrl",,"http://source.winehq.org/winegecko.php"
-;HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
-HKCU,Software\Wine\MSHTML,"GeckoCabDir",,"C:\ReactOS\"
+HKCU,Software\Wine\MSHTML,"GeckoCabDir",0x00020000,"%SystemRoot%\"
; Sound Schemes
HKCU,"AppEvents",,0x00000012
diff --git a/boot/bootdata/hivedef_i386.inf b/boot/bootdata/hivedef_i386.inf
index 905f5ef3daf..8fdc4bb0828 100644
Binary files a/boot/bootdata/hivedef_i386.inf and b/boot/bootdata/hivedef_i386.inf differ
diff --git a/boot/bootdata/hivesys_arm.inf b/boot/bootdata/hivesys_arm.inf
index dbe7d1b210c..51f2dc8dd63 100644
--- a/boot/bootdata/hivesys_arm.inf
+++ b/boot/bootdata/hivesys_arm.inf
@@ -783,9 +783,8 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","version",0x00
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wininet",0x00000000,"wininet.dll"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wldap32",0x00000000,"wldap32.dll"
-; Pagefile settings
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management","PagingFiles",0x00010000, \
- "C:\pagefile.sys"
+; Memory Management
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management",,0x00000012
; Subsystems
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Debug",0x00020000,""
diff --git a/boot/bootdata/hivesys_i386.inf b/boot/bootdata/hivesys_i386.inf
index 1ba67a682ae..1dfcda4497e 100644
--- a/boot/bootdata/hivesys_i386.inf
+++ b/boot/bootdata/hivesys_i386.inf
@@ -930,9 +930,8 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","version",0x00
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wininet",0x00000000,"wininet.dll"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\KnownDlls","wldap32",0x00000000,"wldap32.dll"
-; Pagefile settings
-HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management","PagingFiles",0x00010000, \
- "C:\pagefile.sys"
+; Memory Management
+HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management",,0x00000012
; Subsystems
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Debug",0x00020000,""
diff --git a/boot/bootdata/txtsetup.sif b/boot/bootdata/txtsetup.sif
index 704228d07f7..c822c2fbc3e 100644
--- a/boot/bootdata/txtsetup.sif
+++ b/boot/bootdata/txtsetup.sif
@@ -58,7 +58,7 @@ Cabinet=reactos.cab
[SetupData]
DefaultPath = \ReactOS
OsLoadOptions = "/NOGUIBOOT /NODEBUG"
-DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1"
+DbgOsLoadOptions = "/NOGUIBOOT /DEBUGPORT=COM1 /FIRSTCHANCE /KDSERIAL"
;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=SCREEN"
;OsLoadOptions = "/NOGUIBOOT /DEBUGPORT=BOCHS"
diff --git a/boot/freeldr/freeldr.rbuild b/boot/freeldr/freeldr.rbuild
index 422cd3cc1df..4f4763917aa 100644
--- a/boot/freeldr/freeldr.rbuild
+++ b/boot/freeldr/freeldr.rbuild
@@ -12,16 +12,16 @@
-
-
+
+
-
-
+
+
-
-
+
+
diff --git a/boot/freeldr/freeldr/arch/arm/macharm.c b/boot/freeldr/freeldr/arch/arm/macharm.c
index b0b8e27e2c7..ae5e96ecaa2 100644
--- a/boot/freeldr/freeldr/arch/arm/macharm.c
+++ b/boot/freeldr/freeldr/arch/arm/macharm.c
@@ -18,6 +18,8 @@ ULONG gDiskReadBuffer, gFileSysBuffer;
BOOLEAN ArmHwDetectRan;
PCONFIGURATION_COMPONENT_DATA RootNode;
+BOOLEAN AcpiPresent = FALSE;
+
ULONG FirstLevelDcacheSize;
ULONG FirstLevelDcacheFillSize;
ULONG FirstLevelIcacheSize;
diff --git a/boot/freeldr/freeldr/arch/i386/hardware.c b/boot/freeldr/freeldr/arch/i386/hardware.c
index 97577aa020c..f99e26780d6 100644
--- a/boot/freeldr/freeldr/arch/i386/hardware.c
+++ b/boot/freeldr/freeldr/arch/i386/hardware.c
@@ -433,41 +433,22 @@ static LONG DiskOpen(CHAR* Path, OPENMODE OpenMode, ULONG* FileId)
ULONGLONG SectorOffset = 0;
ULONGLONG SectorCount = 0;
PARTITION_TABLE_ENTRY PartitionTableEntry;
- GEOMETRY Geometry;
- EXTENDED_GEOMETRY ExtGeometry;
CHAR FileName[1];
if (!DissectArcPath(Path, FileName, &DriveNumber, &DrivePartition))
return EINVAL;
- ExtGeometry.Size = sizeof(EXTENDED_GEOMETRY);
- if (DiskGetExtendedDriveParameters(DriveNumber, &ExtGeometry, ExtGeometry.Size))
+ if (DrivePartition == 0xff)
{
- SectorSize = ExtGeometry.BytesPerSector;
- SectorCount = ExtGeometry.Sectors;
- }
- else if (MachDiskGetDriveGeometry(DriveNumber, &Geometry))
- {
- SectorSize = Geometry.BytesPerSector;
- SectorCount = Geometry.Sectors;
+ /* This is a CD-ROM device */
+ SectorSize = 2048;
}
else
{
- DPRINTM(DPRINT_HWDETECT, "Using legacy sector size detection\n");
-
- /* Fall back to legacy detection */
- if (DrivePartition == 0xff)
- {
- /* This is a CD-ROM device */
- SectorSize = 2048;
- }
- else
- {
- /* This is either a floppy disk device (DrivePartition == 0) or
- * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but
- * it doesn't matter which one because they both have 512 bytes per sector */
- SectorSize = 512;
- }
+ /* This is either a floppy disk device (DrivePartition == 0) or
+ * a hard disk device (DrivePartition != 0 && DrivePartition != 0xFF) but
+ * it doesn't matter which one because they both have 512 bytes per sector */
+ SectorSize = 512;
}
if (DrivePartition != 0xff && DrivePartition != 0)
diff --git a/boot/freeldr/freeldr/arch/i386/i386disk.c b/boot/freeldr/freeldr/arch/i386/i386disk.c
index a1e9877e50e..bcee4538a07 100644
--- a/boot/freeldr/freeldr/arch/i386/i386disk.c
+++ b/boot/freeldr/freeldr/arch/i386/i386disk.c
@@ -51,10 +51,32 @@ BOOLEAN DiskResetController(ULONG DriveNumber)
BOOLEAN DiskInt13ExtensionsSupported(ULONG DriveNumber)
{
+ static ULONG LastDriveNumber = 0xffffffff;
+ static BOOLEAN LastSupported;
REGS RegsIn;
REGS RegsOut;
- DPRINTM(DPRINT_DISK, "DiskInt13ExtensionsSupported()\n");
+ DPRINTM(DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n");
+
+ if (DriveNumber == LastDriveNumber)
+ {
+ DPRINTM(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 >= 0x8A. It's 0x90 on the Insyde BIOS, and 0x9F on most other BIOSes.
+ if (DriveNumber >= 0x8A)
+ {
+ LastSupported = TRUE;
+ return TRUE;
+ }
+
+ LastDriveNumber = DriveNumber;
// IBM/MS INT 13 Extensions - INSTALLATION CHECK
// AH = 41h
@@ -90,35 +112,27 @@ BOOLEAN DiskInt13ExtensionsSupported(ULONG DriveNumber)
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;
}
- // 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
+ DbgPrint("Suspicious API subset support bitmap 0x%x on device 0x%lx\n", RegsOut.w.cx, DriveNumber);
+ LastSupported = FALSE;
return FALSE;
}
+ LastSupported = TRUE;
return TRUE;
}
@@ -135,6 +149,9 @@ BOOLEAN DiskGetExtendedDriveParameters(ULONG DriveNumber, PVOID Buffer, USHORT B
DPRINTM(DPRINT_DISK, "DiskGetExtendedDriveParameters()\n");
+ if (!DiskInt13ExtensionsSupported(DriveNumber))
+ return FALSE;
+
// Initialize transfer buffer
*Ptr = BufferSize;
diff --git a/boot/freeldr/freeldr/arch/i386/pcdisk.c b/boot/freeldr/freeldr/arch/i386/pcdisk.c
index c0eeb0b7d41..304a8670107 100644
--- a/boot/freeldr/freeldr/arch/i386/pcdisk.c
+++ b/boot/freeldr/freeldr/arch/i386/pcdisk.c
@@ -264,93 +264,6 @@ static BOOLEAN PcDiskReadLogicalSectorsCHS(ULONG DriveNumber, ULONGLONG SectorNu
return TRUE;
}
-static BOOLEAN PcDiskInt13ExtensionsSupported(ULONG DriveNumber)
-{
- static ULONG LastDriveNumber = 0xffffffff;
- static BOOLEAN LastSupported;
- REGS RegsIn;
- REGS RegsOut;
-
- DPRINTM(DPRINT_DISK, "PcDiskInt13ExtensionsSupported()\n");
-
- if (DriveNumber == LastDriveNumber)
- {
- DPRINTM(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)
{
@@ -361,9 +274,9 @@ BOOLEAN PcDiskReadLogicalSectors(ULONG DriveNumber, ULONGLONG SectorNumber, ULON
// 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))
+ if ((DriveNumber >= 0x80) && DiskInt13ExtensionsSupported(DriveNumber))
{
- DPRINTM(DPRINT_DISK, "Using Int 13 Extensions for read. PcDiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, PcDiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE");
+ DPRINTM(DPRINT_DISK, "Using Int 13 Extensions for read. DiskInt13ExtensionsSupported(%d) = %s\n", DriveNumber, DiskInt13ExtensionsSupported(DriveNumber) ? "TRUE" : "FALSE");
//
// LBA is easy, nothing to calculate
diff --git a/boot/freeldr/freeldr/bootmgr.c b/boot/freeldr/freeldr/bootmgr.c
index 0959de69d69..3242a3e7329 100644
--- a/boot/freeldr/freeldr/bootmgr.c
+++ b/boot/freeldr/freeldr/bootmgr.c
@@ -119,11 +119,13 @@ VOID RunLoader(VOID)
return;
}
+#ifdef _M_IX86
// Load additional SCSI driver (if any)
if (LoadBootDeviceDriver() != ESUCCESS)
{
UiMessageBoxCritical("Unable to load additional boot device driver");
}
+#endif
if (!IniFileInitialize())
{
diff --git a/boot/freeldr/freeldr/freeldr.c b/boot/freeldr/freeldr/freeldr.c
index 5761ed9460c..04dae9b6541 100644
--- a/boot/freeldr/freeldr/freeldr.c
+++ b/boot/freeldr/freeldr/freeldr.c
@@ -47,7 +47,9 @@ VOID BootMain(LPSTR CmdLine)
return;
}
+#ifdef _M_IX86
HalpInitializePciStubs();
HalpInitBusHandler();
+#endif
RunLoader();
}
diff --git a/boot/freeldr/freeldr/include/options.h b/boot/freeldr/freeldr/include/options.h
index 124b64e2326..b00d9f58daf 100644
--- a/boot/freeldr/freeldr/include/options.h
+++ b/boot/freeldr/freeldr/include/options.h
@@ -20,3 +20,4 @@
#pragma once
VOID DoOptionsMenu(VOID);
+VOID AppendBootTimeOptions(PCHAR BootOptions);
diff --git a/boot/freeldr/freeldr/options.c b/boot/freeldr/freeldr/options.c
index 4dabc89c6f4..5b64b46a077 100644
--- a/boot/freeldr/freeldr/options.c
+++ b/boot/freeldr/freeldr/options.c
@@ -69,6 +69,15 @@ enum OptionMenuItems
ULONG OptionsMenuItemCount = sizeof(OptionsMenuList) / sizeof(OptionsMenuList[0]);
+BOOLEAN SafeMode = FALSE;
+BOOLEAN SafeModeWithNetworking = FALSE;
+BOOLEAN SafeModeWithCommandPrompt = FALSE;
+BOOLEAN BootLogging = FALSE;
+BOOLEAN VgaMode = FALSE;
+BOOLEAN LastKnownGoodConfiguration = FALSE;
+BOOLEAN DirectoryServicesRepairMode = FALSE;
+BOOLEAN DebuggingMode = FALSE;
+
VOID DoOptionsMenu(VOID)
{
ULONG SelectedMenuItem;
@@ -85,22 +94,33 @@ VOID DoOptionsMenu(VOID)
switch (SelectedMenuItem)
{
case SAFE_MODE:
+ SafeMode = TRUE;
+ BootLogging = TRUE;
break;
case SAFE_MODE_WITH_NETWORKING:
+ SafeModeWithNetworking = TRUE;
+ BootLogging = TRUE;
break;
case SAFE_MODE_WITH_COMMAND_PROMPT:
+ SafeModeWithCommandPrompt = TRUE;
+ BootLogging = TRUE;
break;
//case SEPARATOR1:
// break;
case ENABLE_BOOT_LOGGING:
+ BootLogging = TRUE;
break;
case ENABLE_VGA_MODE:
+ VgaMode = TRUE;
break;
case LAST_KNOWN_GOOD_CONFIGURATION:
+ LastKnownGoodConfiguration = TRUE;
break;
case DIRECTORY_SERVICES_RESTORE_MODE:
+ DirectoryServicesRepairMode = TRUE;
break;
case DEBUGGING_MODE:
+ DebuggingMode = TRUE;
break;
//case SEPARATOR2:
// break;
@@ -117,3 +137,29 @@ VOID DoOptionsMenu(VOID)
}
}
+VOID AppendBootTimeOptions(PCHAR BootOptions)
+{
+ if (SafeMode)
+ strcat(BootOptions, " /SAFEBOOT:MINIMAL /SOS"); //FIXME: NOGUIBOOT should also be specified
+
+ if (SafeModeWithNetworking)
+ strcat(BootOptions, " /SAFEBOOT:NETWORK /SOS"); //FIXME: NOGUIBOOT should also be specified
+
+ if (SafeModeWithCommandPrompt)
+ strcat(BootOptions, " /SAFEBOOT:MINIMAL(ALTERNATESHELL) /SOS"); //FIXME: NOGUIBOOT should also be specified
+
+ if (BootLogging)
+ strcat(BootOptions, " /BOOTLOG");
+
+ if (VgaMode)
+ strcat(BootOptions, " /BASEVIDEO");
+
+ if (LastKnownGoodConfiguration)
+ DbgPrint("Last known good configuration is not supported yet!\n");
+
+ if (DirectoryServicesRepairMode)
+ strcat(BootOptions, " /SAFEBOOT:DSREPAIR /SOS");
+
+ if (DebuggingMode)
+ strcat(BootOptions, " /DEBUG");
+}
diff --git a/boot/freeldr/freeldr/reactos/reactos.c b/boot/freeldr/freeldr/reactos/reactos.c
index 81b654b84b9..22f3771b28b 100644
--- a/boot/freeldr/freeldr/reactos/reactos.c
+++ b/boot/freeldr/freeldr/reactos/reactos.c
@@ -606,6 +606,11 @@ LoadAndBootReactOS(PCSTR OperatingSystemName)
//
if (IniReadSettingByName(SectionId, "Options", value, sizeof(value)))
{
+ //
+ // Append boot-time options
+ //
+ AppendBootTimeOptions(value);
+
//
// Check if a ramdisk file was given
//
diff --git a/boot/freeldr/freeldr/windows/winldr.c b/boot/freeldr/freeldr/windows/winldr.c
index d130472ebae..c068517dd2b 100644
--- a/boot/freeldr/freeldr/windows/winldr.c
+++ b/boot/freeldr/freeldr/windows/winldr.c
@@ -475,6 +475,9 @@ LoadAndBootWindows(PCSTR OperatingSystemName,
DPRINTM(DPRINT_WINDOWS,"BootOptions: '%s'\n", BootOptions);
}
+ /* Append boot-time options */
+ AppendBootTimeOptions(BootOptions);
+
//
// Check if a ramdisk file was given
//
diff --git a/dll/3rdparty/libjpeg/libjpeg.rbuild b/dll/3rdparty/libjpeg/libjpeg.rbuild
index 990e595377f..9749f7ab35e 100644
--- a/dll/3rdparty/libjpeg/libjpeg.rbuild
+++ b/dll/3rdparty/libjpeg/libjpeg.rbuild
@@ -1,11 +1,11 @@
- -Wno-main
+ mainptr
.
jcapimin.c
jcapistd.c
diff --git a/dll/cpl/desk/screensaver.c b/dll/cpl/desk/screensaver.c
index c24cf78620c..00ce09568b2 100644
--- a/dll/cpl/desk/screensaver.c
+++ b/dll/cpl/desk/screensaver.c
@@ -147,33 +147,32 @@ static BOOL
WaitForSettingsDialog(HWND hwndDlg,
HANDLE hProcess)
{
+ DWORD dwResult;
+ MSG msg;
+
while (TRUE)
{
- DWORD Ret;
- MSG msg;
-
- while (PeekMessage(&msg,
- NULL,
- 0,
- 0,
- PM_REMOVE))
+ dwResult = MsgWaitForMultipleObjects(1,
+ &hProcess,
+ FALSE,
+ INFINITE,
+ QS_ALLINPUT);
+ if (dwResult == WAIT_OBJECT_0 + 1)
{
- if (msg.message == WM_QUIT)
- return FALSE;
-
- if (IsDialogMessage(hwndDlg, &msg))
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
- TranslateMessage(&msg);
- DispatchMessage(&msg);
+ if (msg.message == WM_QUIT)
+ {
+ return FALSE;
+ }
+ if (IsDialogMessage(hwndDlg, &msg))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
}
}
-
- Ret = MsgWaitForMultipleObjects(1,
- &hProcess,
- FALSE,
- INFINITE,
- QS_ALLINPUT);
- if (Ret == (WAIT_OBJECT_0))
+ else
{
return TRUE;
}
diff --git a/dll/cpl/intl/lang/it-IT.rc b/dll/cpl/intl/lang/it-IT.rc
index ee1513a685c..eaaf6683f05 100644
--- a/dll/cpl/intl/lang/it-IT.rc
+++ b/dll/cpl/intl/lang/it-IT.rc
@@ -181,7 +181,7 @@ FONT 8, "MS Shell Dlg"
BEGIN
GROUPBOX "Ordinamento", -1, 7, 7, 230, 74
LTEXT "Il metodo di ordinamento definisce come considerare l'ordine di caratteri, parole, file e cartelle.", -1, 14, 17, 220, 25
- LTEXT "Scegliere il metodo di orinamento per il vostro linguaggio:", -1, 14, 37, 220, 22
+ LTEXT "Scegliere il metodo di ordinamento per il vostro linguaggio:", -1, 14, 37, 220, 22
COMBOBOX IDC_SORTLIST_COMBO, 14, 56, 217, 83, CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL
END
diff --git a/dll/cpl/mmsys/lang/de-DE.rc b/dll/cpl/mmsys/lang/de-DE.rc
index 81e3d437828..6ddf8ae5a35 100644
--- a/dll/cpl/mmsys/lang/de-DE.rc
+++ b/dll/cpl/mmsys/lang/de-DE.rc
@@ -36,9 +36,9 @@ BEGIN
LTEXT "&Programmereignisse:",-1,8,118,150,17
CONTROL "", IDC_SCHEME_LIST, "SysListView32", LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | WS_BORDER | WS_TABSTOP, 8, 130, 230, 60, WS_EX_CLIENTEDGE
LTEXT "&Klänge:", IDC_TEXT_SOUND,8,194,80,17, WS_DISABLED
- COMBOBOX IDC_SOUND_LIST, 8, 205, 155, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
- PUSHBUTTON "", IDC_PLAY_SOUND, 168,205,15,15, WS_DISABLED | BS_ICON
- PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 188,205,81,15, WS_DISABLED
+ COMBOBOX IDC_SOUND_LIST, 8, 205, 135, 146, CBS_DROPDOWNLIST | CBS_DISABLENOSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP | WS_DISABLED
+ PUSHBUTTON "", IDC_PLAY_SOUND, 148,205,15,15, WS_DISABLED | BS_ICON
+ PUSHBUTTON "&Durchsuchen...", IDC_BROWSE_SOUND, 168,205,70,15, WS_DISABLED
END
IDD_AUDIO DIALOGEX 0, 0, 246, 228
diff --git a/dll/cpl/mmsys/sounds.c b/dll/cpl/mmsys/sounds.c
index be314e181e0..c7ff17187a5 100644
--- a/dll/cpl/mmsys/sounds.c
+++ b/dll/cpl/mmsys/sounds.c
@@ -718,6 +718,14 @@ LoadSoundFiles(HWND hwndDlg)
LRESULT lResult;
UINT length;
+ /* Add no sound listview item */
+ if (LoadString(hApplet, IDS_NO_SOUND, szPath, MAX_PATH))
+ {
+ szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0';
+ SendDlgItemMessageW(hwndDlg, IDC_SOUND_LIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)szPath);
+ }
+
+ /* Load sound files */
length = GetWindowsDirectoryW(szPath, MAX_PATH);
if (length == 0 || length >= MAX_PATH - 9)
{
@@ -736,11 +744,6 @@ LoadSoundFiles(HWND hwndDlg)
{
return FALSE;
}
- if (LoadString(hApplet, IDS_NO_SOUND, szPath, MAX_PATH))
- {
- szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0';
- SendDlgItemMessageW(hwndDlg, IDC_SOUND_LIST, CB_ADDSTRING, (WPARAM)0, (LPARAM)szPath);
- }
do
{
@@ -1054,6 +1057,7 @@ SoundsDlgProc(HWND hwndDlg,
ZeroMemory(&item, sizeof(LVITEM));
item.mask = LVIF_PARAM;
item.iItem = nm->iItem;
+
if (ListView_GetItem(GetDlgItem(hwndDlg, IDC_SCHEME_LIST), &item))
{
LRESULT lCount, lIndex, lResult;
diff --git a/dll/cpl/sysdm/lang/bg-BG.rc b/dll/cpl/sysdm/lang/bg-BG.rc
index cd0cca37d03..c358cf4e3e1 100644
--- a/dll/cpl/sysdm/lang/bg-BG.rc
+++ b/dll/cpl/sysdm/lang/bg-BG.rc
@@ -284,4 +284,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Âčä"
IDS_USERPROFILE_STATUS "Ńúńňî˙íčĺ"
IDS_USERPROFILE_MODIFIED "Čçěĺíĺí"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/cs-CZ.rc b/dll/cpl/sysdm/lang/cs-CZ.rc
index 5be033c26d3..2e11444dea1 100644
--- a/dll/cpl/sysdm/lang/cs-CZ.rc
+++ b/dll/cpl/sysdm/lang/cs-CZ.rc
@@ -289,4 +289,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Upraveno"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/da-DK.rc b/dll/cpl/sysdm/lang/da-DK.rc
index 4e680cba885..136a1dec301 100644
--- a/dll/cpl/sysdm/lang/da-DK.rc
+++ b/dll/cpl/sysdm/lang/da-DK.rc
@@ -123,4 +123,9 @@ BEGIN
IDS_MINI_DUMP "Minidump(64KB)"
IDS_KERNEL_DUMP "Kernel dump"
IDS_FULL_DUMP "Complete dump"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/de-DE.rc b/dll/cpl/sysdm/lang/de-DE.rc
index 92282242d97..eec7d1eff51 100644
--- a/dll/cpl/sysdm/lang/de-DE.rc
+++ b/dll/cpl/sysdm/lang/de-DE.rc
@@ -202,7 +202,7 @@ BEGIN
LTEXT "", IDC_SPACEAVAIL, 105, 92, 104, 9
LTEXT "&Anfangsgröße (MB):", -1, 22, 118, 70, 9
LTEXT "Ma&ximale Größe (MB):", -1, 22, 131, 75, 9
- AUTORADIOBUTTON "&Benutzerdefinierte Größe", IDC_CUSTOM, 20, 105, 90, 9, WS_GROUP
+ AUTORADIOBUTTON "&Benutzerdefinierte Größe", IDC_CUSTOM, 20, 105, 95, 9, WS_GROUP
AUTORADIOBUTTON "Größe wird vom &System verwaltet", IDC_SYSMANSIZE, 20, 145, 120, 9
AUTORADIOBUTTON "&Keine Auslagerungsdatei", IDC_NOPAGEFILE, 20, 158, 90, 9
EDITTEXT IDC_INITIALSIZE, 100, 114, 44, 13, NOT WS_BORDER, WS_EX_CLIENTEDGE
@@ -289,5 +289,10 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Geändert"
+ IDS_MESSAGEBOXTITLE "Systemsteuerungsoption ""System"""
+ IDS_WARNINITIALSIZE "Geben Sie einen numerischen Wert für die Anfangsgröße der Auslagerungsdatei an."
+ IDS_WARNMAXIMUMSIZE "Geben Sie einen numerischen Wert für die Maximalgröße der Auslagerungsdatei an."
+ IDS_WARNINITIALRANGE "Die Anfangsgröße der Auslagerungsdatei darf nicht kleiner als 2 MB sein und darf den verfügbaren Speicherplatz auf dem gewählten Laufwerk nicht überschreiten."
+ IDS_WARNMAXIMUMRANGE "Die Maximalgröße der Auslagerungsdatei darf nicht kleiner als die Anfangsgröße sein und darf den verfügbaren Speicherplatz auf dem gewählten Laufwerk nicht überschreiten."
IDS_DEVS "\nReactOS Team\n\nProjektkoordinator\n\nAleksey Bragin\n\nEntwicklerteam\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Verantwortliche\n\nColin Finck\nZ98\n\nWebseitenteam\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedienteam\n\nMindflyer\nWierd_W\n\nweiterer Dank geht an\n\nalle Mitwirkenden\nWine Team\n\n"
END
diff --git a/dll/cpl/sysdm/lang/el-GR.rc b/dll/cpl/sysdm/lang/el-GR.rc
index 98ff6946bd1..426438a5853 100644
--- a/dll/cpl/sysdm/lang/el-GR.rc
+++ b/dll/cpl/sysdm/lang/el-GR.rc
@@ -285,4 +285,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ôýđďň"
IDS_USERPROFILE_STATUS "ĘáôÜóôáóç"
IDS_USERPROFILE_MODIFIED "ÔńďđďđďéŢčçęĺ"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/en-US.rc b/dll/cpl/sysdm/lang/en-US.rc
index 73b8a17d3aa..c1d7fa93eeb 100644
--- a/dll/cpl/sysdm/lang/en-US.rc
+++ b/dll/cpl/sysdm/lang/en-US.rc
@@ -284,5 +284,10 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Modified"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
IDS_DEVS "\nReactOS Team\n\nProject Coordinator\n\nAleksey Bragin\n\nDevelopment Team\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Engineers\n\nColin Finck\nZ98\n\nWebsite Team\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedia Team\n\nMindflyer\nWierd_W\n\nfurther thanks go to\n\nall Contributers\nWine Team\n\n"
END
diff --git a/dll/cpl/sysdm/lang/es-ES.rc b/dll/cpl/sysdm/lang/es-ES.rc
index 69e46cfc606..7383919a99b 100644
--- a/dll/cpl/sysdm/lang/es-ES.rc
+++ b/dll/cpl/sysdm/lang/es-ES.rc
@@ -287,4 +287,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Tipo"
IDS_USERPROFILE_STATUS "Estado"
IDS_USERPROFILE_MODIFIED "Modificado"
+ IDS_MESSAGEBOXTITLE "Applet de sistema del panel de control"
+ IDS_WARNINITIALSIZE "Ingresar el tamańo inicial del archivo de paginación."
+ IDS_WARNMAXIMUMSIZE "Ingresar el tamańo máximo del archivo de paginación."
+ IDS_WARNINITIALRANGE "El tamańo inicial del archivo de paginación no puede ser inferior a 2 MB y no puede exceder el espacio disponible en la unidad seleccionada."
+ IDS_WARNMAXIMUMRANGE "El tamańo máximo del archivo de paginación no puede ser inferior al tamańo inicial y no puede exceder el espacio disponible en la unidad seleccionada."
END
diff --git a/dll/cpl/sysdm/lang/fr-FR.rc b/dll/cpl/sysdm/lang/fr-FR.rc
index e649b59beff..17fe2e15d6b 100644
--- a/dll/cpl/sysdm/lang/fr-FR.rc
+++ b/dll/cpl/sysdm/lang/fr-FR.rc
@@ -287,4 +287,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Statut"
IDS_USERPROFILE_MODIFIED "Modifié"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/hu-HU.rc b/dll/cpl/sysdm/lang/hu-HU.rc
index 9b3a4624d62..1324096ab32 100644
--- a/dll/cpl/sysdm/lang/hu-HU.rc
+++ b/dll/cpl/sysdm/lang/hu-HU.rc
@@ -126,4 +126,9 @@ BEGIN
IDS_MINI_DUMP "Minidump(64KB)"
IDS_KERNEL_DUMP "Kernel dump"
IDS_FULL_DUMP "Complete dump"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/id-ID.rc b/dll/cpl/sysdm/lang/id-ID.rc
index 1025b1f5b6d..6bd09c9f406 100644
--- a/dll/cpl/sysdm/lang/id-ID.rc
+++ b/dll/cpl/sysdm/lang/id-ID.rc
@@ -281,4 +281,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Modified"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/it-IT.rc b/dll/cpl/sysdm/lang/it-IT.rc
index 253a4bd1084..0175497f2a9 100644
--- a/dll/cpl/sysdm/lang/it-IT.rc
+++ b/dll/cpl/sysdm/lang/it-IT.rc
@@ -284,5 +284,10 @@ BEGIN
IDS_USERPROFILE_TYPE "Tipo"
IDS_USERPROFILE_STATUS "Stato"
IDS_USERPROFILE_MODIFIED "Modificato"
+ IDS_MESSAGEBOXTITLE "Applet di sistema del pannello di controllo"
+ IDS_WARNINITIALSIZE "Immettere la dimensione iniziale del file di paging."
+ IDS_WARNMAXIMUMSIZE "Immettere la dimensione massima del file di paging."
+ IDS_WARNINITIALRANGE "La dimensione iniziale del file di paging non puň essere inferiore a 2 MB e non puň superare lo spazio disponibile nell'unitŕ selezionata."
+ IDS_WARNMAXIMUMRANGE "La dimensione massima del file di paging non puň essere inferiore a quella iniziale e non puň superare lo spazio disponibile nell'unitŕ selezionata."
IDS_DEVS "\nReactOS Team\n\nCoordinatore\n\nAleksey Bragin\n\nGruppo di sviluppo\n\nAleksey Bragin\nAndrew Greenwood\nAndrey Korotaev\nArt Yerkes\nChristoph von Wittich\nColin Finck\nDaniel Reimer\nDmitry Chapyshev\nEric Kohl\nGed Murphy\nGregor Brunmar\nHervé Poussineau\nJames Tabor\nJeffrey Morlan\nJohannes Anderwald\nKJK::Hyperion\nMaarten Bosma\nMagnus Olsen\nMarc Piulachs\nMatthias Kupfer\nMike Nordell\nPeter Ward\nPierre Schweitzer\nSaveliy Tretiakov\nStefan Ginsberg\nSylvain Petreolle\nThomas Blümel\nTimo Kreuzer \n\nAlex Ionescu\nFilip Navara\nGunnar Dalsnes\nMartin Fuchs\nRoyce Mitchell III\nBrandon Turner\nBrian Palmer\nCasper Hornstrup\nDavid Welch\nEmanuele Aliberti\nGé van Geldorp\nGregor Anich\nJason Filby\nJens Collin\nMichael Wirth\nNathan Woods\nRobert Dickenson\nRex Jolliff\nVizzini \n\nRelease Engineers\n\nColin Finck\nZ98\n\nWebsite Team\n\nColin Finck\nJaix Bly\nKlemens Friedl\nZ98\n\nMedia Team\n\nMindflyer\nWierd_W\n\nUlteriori ringraziamenti\n\na tutti i Contributers\nWine Team\n\n"
END
diff --git a/dll/cpl/sysdm/lang/ja-JP.rc b/dll/cpl/sysdm/lang/ja-JP.rc
index 2ce3b7c5f41..7b86e4e0f92 100644
--- a/dll/cpl/sysdm/lang/ja-JP.rc
+++ b/dll/cpl/sysdm/lang/ja-JP.rc
@@ -284,4 +284,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ží—Ţ"
IDS_USERPROFILE_STATUS "Źó‘Ô"
IDS_USERPROFILE_MODIFIED "•ĎŤX“ú"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/nl-NL.rc b/dll/cpl/sysdm/lang/nl-NL.rc
index 888857b6205..94eca7ef70b 100644
--- a/dll/cpl/sysdm/lang/nl-NL.rc
+++ b/dll/cpl/sysdm/lang/nl-NL.rc
@@ -125,5 +125,9 @@ BEGIN
IDS_MINI_DUMP "Minidump(64KB)"
IDS_KERNEL_DUMP "Kernel dump"
IDS_FULL_DUMP "Complete dump"
-
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/no-NO.rc b/dll/cpl/sysdm/lang/no-NO.rc
index 98beebe5b50..4c6d9997b75 100644
--- a/dll/cpl/sysdm/lang/no-NO.rc
+++ b/dll/cpl/sysdm/lang/no-NO.rc
@@ -283,4 +283,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Type"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Modifisert"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/pl-PL.rc b/dll/cpl/sysdm/lang/pl-PL.rc
index b138c0afd90..91f7db5ed4c 100644
--- a/dll/cpl/sysdm/lang/pl-PL.rc
+++ b/dll/cpl/sysdm/lang/pl-PL.rc
@@ -288,4 +288,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Stan"
IDS_USERPROFILE_MODIFIED "Zmodyfikowano"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/ro-RO.rc b/dll/cpl/sysdm/lang/ro-RO.rc
index 7e5de71be46..ea9ea85bf1c 100644
--- a/dll/cpl/sysdm/lang/ro-RO.rc
+++ b/dll/cpl/sysdm/lang/ro-RO.rc
@@ -1,4 +1,4 @@
-LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
+LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -284,6 +284,11 @@ BEGIN
IDS_USERPROFILE_TYPE "Tip"
IDS_USERPROFILE_STATUS "Stare"
IDS_USERPROFILE_MODIFIED "Modificat"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
#pragma code_page(default)
diff --git a/dll/cpl/sysdm/lang/ru-RU.rc b/dll/cpl/sysdm/lang/ru-RU.rc
index caaef697bf2..72ecb3cc417 100644
--- a/dll/cpl/sysdm/lang/ru-RU.rc
+++ b/dll/cpl/sysdm/lang/ru-RU.rc
@@ -282,4 +282,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ňčď"
IDS_USERPROFILE_STATUS "Ńîńňî˙íčĺ"
IDS_USERPROFILE_MODIFIED "Čçěĺíĺí"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/sk-SK.rc b/dll/cpl/sysdm/lang/sk-SK.rc
index 82fbc6035e9..497720ce90d 100644
--- a/dll/cpl/sysdm/lang/sk-SK.rc
+++ b/dll/cpl/sysdm/lang/sk-SK.rc
@@ -290,4 +290,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Stav"
IDS_USERPROFILE_MODIFIED "Modifikovaný"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/sv-SE.rc b/dll/cpl/sysdm/lang/sv-SE.rc
index c72592cdb89..124bbe935e9 100644
--- a/dll/cpl/sysdm/lang/sv-SE.rc
+++ b/dll/cpl/sysdm/lang/sv-SE.rc
@@ -284,4 +284,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Typ"
IDS_USERPROFILE_STATUS "Status"
IDS_USERPROFILE_MODIFIED "Ändrad"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/uk-UA.rc b/dll/cpl/sysdm/lang/uk-UA.rc
index 651a167d1ea..a92a15d4c0c 100644
--- a/dll/cpl/sysdm/lang/uk-UA.rc
+++ b/dll/cpl/sysdm/lang/uk-UA.rc
@@ -290,4 +290,9 @@ BEGIN
IDS_USERPROFILE_TYPE "Ňčď"
IDS_USERPROFILE_STATUS "Ńňŕí"
IDS_USERPROFILE_MODIFIED "Çěłíĺíî"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/lang/zh-CN.rc b/dll/cpl/sysdm/lang/zh-CN.rc
index 1abbce7477f..0ce9e187dd9 100644
--- a/dll/cpl/sysdm/lang/zh-CN.rc
+++ b/dll/cpl/sysdm/lang/zh-CN.rc
@@ -287,4 +287,9 @@ BEGIN
IDS_USERPROFILE_TYPE "ŔŕĐÍ"
IDS_USERPROFILE_STATUS "״̬"
IDS_USERPROFILE_MODIFIED "Đ޸Ä"
+ IDS_MESSAGEBOXTITLE "System control panel applet"
+ IDS_WARNINITIALSIZE "Enter a numeric value for the initial size of the paging file."
+ IDS_WARNMAXIMUMSIZE "Enter a numeric value for the maximum size of the paging file."
+ IDS_WARNINITIALRANGE "The initial size of the paging file must not be smaller than 2 MB and must not exceed the available space on the selected drive."
+ IDS_WARNMAXIMUMRANGE "The maximum size of the paging file must not be smaller than its initial size and must not exceed the available space on the selected drive."
END
diff --git a/dll/cpl/sysdm/precomp.h b/dll/cpl/sysdm/precomp.h
index 3ef2ee0d259..cf3afd6f62a 100644
--- a/dll/cpl/sysdm/precomp.h
+++ b/dll/cpl/sysdm/precomp.h
@@ -50,8 +50,9 @@ INT_PTR CALLBACK LicenceDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM l
typedef struct _PAGEFILE
{
TCHAR szDrive[3];
- INT InitialValue;
- INT MaxValue;
+ INT InitialSize;
+ INT MaximumSize;
+ INT FreeSize;
BOOL bUsed;
} PAGEFILE, *PPAGEFILE;
diff --git a/dll/cpl/sysdm/resource.h b/dll/cpl/sysdm/resource.h
index f0918a35d9f..885aae6c003 100644
--- a/dll/cpl/sysdm/resource.h
+++ b/dll/cpl/sysdm/resource.h
@@ -32,6 +32,11 @@
#define IDS_USERPROFILE_STATUS 75
#define IDS_USERPROFILE_MODIFIED 76
+#define IDS_MESSAGEBOXTITLE 77
+#define IDS_WARNINITIALSIZE 78
+#define IDS_WARNMAXIMUMSIZE 79
+#define IDS_WARNINITIALRANGE 80
+#define IDS_WARNMAXIMUMRANGE 81
/* propsheet - general */
#define IDD_PROPPAGEGENERAL 100
diff --git a/dll/cpl/sysdm/virtmem.c b/dll/cpl/sysdm/virtmem.c
index 6dcd9ad6457..c09b6e40dcf 100644
--- a/dll/cpl/sysdm/virtmem.c
+++ b/dll/cpl/sysdm/virtmem.c
@@ -110,7 +110,7 @@ ParseMemSettings(PVIRTMEM pVirtMem)
TCHAR szVolume[MAX_PATH];
TCHAR *szDisplayString;
INT InitialSize = 0;
- INT MaxSize = 0;
+ INT MaximumSize = 0;
INT DriveLen;
INT PgCnt = 0;
@@ -141,17 +141,17 @@ ParseMemSettings(PVIRTMEM pVirtMem)
/* FIXME: we only check the first available pagefile in the reg */
GetPageFileSizes(pVirtMem->szPagingFiles,
&InitialSize,
- &MaxSize);
+ &MaximumSize);
- pVirtMem->Pagefile[PgCnt].InitialValue = InitialSize;
- pVirtMem->Pagefile[PgCnt].MaxValue = MaxSize;
+ pVirtMem->Pagefile[PgCnt].InitialSize = InitialSize;
+ pVirtMem->Pagefile[PgCnt].MaximumSize = MaximumSize;
pVirtMem->Pagefile[PgCnt].bUsed = TRUE;
lstrcpy(pVirtMem->Pagefile[PgCnt].szDrive, szDrive);
}
else
{
- pVirtMem->Pagefile[PgCnt].InitialValue = 0;
- pVirtMem->Pagefile[PgCnt].MaxValue = 0;
+ pVirtMem->Pagefile[PgCnt].InitialSize = 0;
+ pVirtMem->Pagefile[PgCnt].MaximumSize = 0;
pVirtMem->Pagefile[PgCnt].bUsed = FALSE;
lstrcpy(pVirtMem->Pagefile[PgCnt].szDrive, szDrive);
}
@@ -177,11 +177,11 @@ ParseMemSettings(PVIRTMEM pVirtMem)
}
}
- if ((InitialSize != 0) || (MaxSize != 0))
+ if ((InitialSize != 0) || (MaximumSize != 0))
{
TCHAR szSize[64];
- _stprintf(szSize, _T("%i - %i"), InitialSize, MaxSize);
+ _stprintf(szSize, _T("%i - %i"), InitialSize, MaximumSize);
_tcscat(szDisplayString, _T("\t"));
_tcscat(szDisplayString, szSize);
}
@@ -216,11 +216,11 @@ WritePageFileSettings(PVIRTMEM pVirtMem)
{
_stprintf(szText, _T("%s\\pagefile.sys %i %i"),
pVirtMem->Pagefile[i].szDrive,
- pVirtMem->Pagefile[i].InitialValue,
- pVirtMem->Pagefile[i].MaxValue);
+ pVirtMem->Pagefile[i].InitialSize,
+ pVirtMem->Pagefile[i].MaximumSize);
/* Add it to our overall registry string */
- lstrcat(szPagingFiles + nPos, szText);
+ lstrcpy(szPagingFiles + nPos, szText);
/* Record the position where the next string will start */
nPos += (INT)lstrlen(szText) + 1;
@@ -299,8 +299,11 @@ static VOID
OnSet(PVIRTMEM pVirtMem)
{
INT Index;
- UINT Value;
+ UINT InitialSize;
+ UINT MaximumSize;
BOOL bTranslated;
+ TCHAR szTitle[64];
+ TCHAR szMessage[256];
pVirtMem->bSave = TRUE;
@@ -315,46 +318,109 @@ OnSet(PVIRTMEM pVirtMem)
if (IsDlgButtonChecked(pVirtMem->hSelf,
IDC_CUSTOM) == BST_CHECKED)
{
- Value = GetDlgItemInt(pVirtMem->hSelf,
- IDC_INITIALSIZE,
- &bTranslated,
- FALSE);
+ InitialSize = GetDlgItemInt(pVirtMem->hSelf,
+ IDC_INITIALSIZE,
+ &bTranslated,
+ FALSE);
if (!bTranslated)
{
- /* FIXME: Show error message instead of setting the edit
- field to the previous value */
- SetDlgItemInt(pVirtMem->hSelf,
- IDC_INITIALSIZE,
- pVirtMem->Pagefile[Index].InitialValue,
- FALSE);
- }
- else
- {
- pVirtMem->Pagefile[Index].InitialValue = Value;
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ if (LoadString(hApplet,
+ IDS_WARNINITIALSIZE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0])) == 0)
+ _tcscpy(szMessage, _T("Enter a numeric value for the initial size of the paging file."));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
}
- Value = GetDlgItemInt(pVirtMem->hSelf,
- IDC_MAXSIZE,
- &bTranslated,
- FALSE);
+ MaximumSize = GetDlgItemInt(pVirtMem->hSelf,
+ IDC_MAXSIZE,
+ &bTranslated,
+ FALSE);
if (!bTranslated)
{
- /* FIXME: Show error message instead of setting the edit
- field to the previous value */
- SetDlgItemInt(pVirtMem->hSelf,
- IDC_MAXSIZE,
- pVirtMem->Pagefile[Index].MaxValue,
- FALSE);
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ if (LoadString(hApplet,
+ IDS_WARNMAXIMUMSIZE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0])) == 0)
+ _tcscpy(szMessage, _T("Enter a numeric value for the maximum size of the paging file."));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
}
- else
+
+ /* Check the valid range of the inial size */
+ if (InitialSize < 2 ||
+ InitialSize > pVirtMem->Pagefile[Index].FreeSize)
{
- pVirtMem->Pagefile[Index].MaxValue = Value;
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ LoadString(hApplet,
+ IDS_WARNINITIALRANGE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0]));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
}
+
+ /* Check the valid range of the maximum size */
+ if (MaximumSize < InitialSize ||
+ MaximumSize > pVirtMem->Pagefile[Index].FreeSize)
+ {
+ if (LoadString(hApplet,
+ IDS_MESSAGEBOXTITLE,
+ szTitle,
+ sizeof(szTitle) / sizeof(szTitle[0])) == 0)
+ _tcscpy(szTitle, _T("System control panel applet"));
+
+ LoadString(hApplet,
+ IDS_WARNMAXIMUMRANGE,
+ szMessage,
+ sizeof(szMessage) / sizeof(szMessage[0]));
+
+ MessageBox(NULL,
+ szMessage,
+ szTitle,
+ MB_ICONWARNING | MB_OK);
+ return;
+ }
+
+ pVirtMem->Pagefile[Index].InitialSize = InitialSize;
+ pVirtMem->Pagefile[Index].MaximumSize = MaximumSize;
+ pVirtMem->Pagefile[Index].bUsed = TRUE;
}
else
{
/* set sizes to 0 */
- pVirtMem->Pagefile[Index].InitialValue = pVirtMem->Pagefile[Index].MaxValue = 0;
+ pVirtMem->Pagefile[Index].InitialSize = 0;
+ pVirtMem->Pagefile[Index].MaximumSize = 0;
// check to see if this drive is used for a paging file
if (IsDlgButtonChecked(pVirtMem->hSelf,
@@ -397,12 +463,13 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
if (GetDiskFreeSpaceEx(pVirtMem->Pagefile[Index].szDrive,
NULL, NULL, &FreeBytes))
{
+ pVirtMem->Pagefile[Index].FreeSize = FreeBytes.QuadPart >> 20;
_stprintf(szBuffer, _T("%I64u MB"), FreeBytes.QuadPart / (1024 * 1024));
SetDlgItemText(hwndDlg, IDC_SPACEAVAIL, szBuffer);
}
- if (pVirtMem->Pagefile[Index].InitialValue != 0 &&
- pVirtMem->Pagefile[Index].MaxValue != 0)
+ if (pVirtMem->Pagefile[Index].InitialSize != 0 &&
+ pVirtMem->Pagefile[Index].MaximumSize != 0)
{
/* enable and fill the custom values */
EnableWindow(GetDlgItem(pVirtMem->hSelf, IDC_MAXSIZE), TRUE);
@@ -410,12 +477,12 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
SetDlgItemInt(pVirtMem->hSelf,
IDC_INITIALSIZE,
- pVirtMem->Pagefile[Index].InitialValue,
+ pVirtMem->Pagefile[Index].InitialSize,
FALSE);
SetDlgItemInt(pVirtMem->hSelf,
IDC_MAXSIZE,
- pVirtMem->Pagefile[Index].MaxValue,
+ pVirtMem->Pagefile[Index].MaximumSize,
FALSE);
CheckDlgButton(pVirtMem->hSelf,
@@ -459,7 +526,7 @@ OnSelChange(HWND hwndDlg, PVIRTMEM pVirtMem)
FileSize = 0;
for (i = 0; i < 26; i++)
{
- FileSize += pVirtMem->Pagefile[i].InitialValue;
+ FileSize += pVirtMem->Pagefile[i].InitialSize;
}
_stprintf(szBuffer, _T("%u MB"), FileSize);
SetDlgItemText(hwndDlg, IDC_CURRENT, szBuffer);
diff --git a/dll/directx/qedit/mediadet.c b/dll/directx/qedit/mediadet.c
index 3a13f717bf6..9aeb9c017cc 100644
--- a/dll/directx/qedit/mediadet.c
+++ b/dll/directx/qedit/mediadet.c
@@ -38,8 +38,8 @@ typedef struct MediaDetImpl {
IGraphBuilder *graph;
IBaseFilter *source;
IBaseFilter *splitter;
- long num_streams;
- long cur_stream;
+ LONG num_streams;
+ LONG cur_stream;
IPin *cur_pin;
} MediaDetImpl;
@@ -168,7 +168,7 @@ static HRESULT WINAPI MediaDet_get_CurrentStream(IMediaDet* iface, LONG *pVal)
return S_OK;
}
-static HRESULT SetCurPin(MediaDetImpl *This, long strm)
+static HRESULT SetCurPin(MediaDetImpl *This, LONG strm)
{
IEnumPins *pins;
IPin *pin;
diff --git a/dll/directx/qedit/qedit.rbuild b/dll/directx/qedit/qedit.rbuild
index f3285f4ef48..0fd54bf8ea3 100644
--- a/dll/directx/qedit/qedit.rbuild
+++ b/dll/directx/qedit/qedit.rbuild
@@ -1,4 +1,4 @@
-
+
.
diff --git a/dll/directx/qedit/regsvr.c b/dll/directx/qedit/regsvr.c
index d70c8222ee8..d007311840a 100644
--- a/dll/directx/qedit/regsvr.c
+++ b/dll/directx/qedit/regsvr.c
@@ -326,5 +326,5 @@ HRESULT WINAPI DllUnregisterServer(void)
TRACE("\n");
hr = unregister_coclasses(coclass_list);
- return S_OK;
+ return hr;
}
diff --git a/dll/directx/qedit/samplegrabber.c b/dll/directx/qedit/samplegrabber.c
index 78a7306e10e..78979fecf28 100644
--- a/dll/directx/qedit/samplegrabber.c
+++ b/dll/directx/qedit/samplegrabber.c
@@ -489,7 +489,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
REFERENCE_TIME tStart, tEnd;
if (This->bufferLen >= 0) {
BYTE *data = 0;
- long size = IMediaSample_GetActualDataLength(sample);
+ LONG size = IMediaSample_GetActualDataLength(sample);
if (size >= 0 && SUCCEEDED(IMediaSample_GetPointer(sample, &data))) {
if (!data)
size = 0;
@@ -527,7 +527,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
case 1:
{
BYTE *data = 0;
- long size = IMediaSample_GetActualDataLength(sample);
+ LONG size = IMediaSample_GetActualDataLength(sample);
if (size && SUCCEEDED(IMediaSample_GetPointer(sample, &data)) && data)
ISampleGrabberCB_BufferCB(This->grabberIface, time, data, size);
}
@@ -535,7 +535,7 @@ static void SampleGrabber_callback(SG_Impl *This, IMediaSample *sample)
case -1:
break;
default:
- FIXME("unsupported method %ld\n", (long int)This->grabberMethod);
+ FIXME("unsupported method %d\n", This->grabberMethod);
/* do not bother us again */
This->grabberMethod = -1;
}
diff --git a/dll/directx/quartz/acmwrapper.c b/dll/directx/quartz/acmwrapper.c
index c275d833979..a0323911707 100644
--- a/dll/directx/quartz/acmwrapper.c
+++ b/dll/directx/quartz/acmwrapper.c
@@ -105,7 +105,7 @@ static HRESULT ACMWrapper_ProcessSampleData(InputPin *pin, IMediaSample *pSample
tMed = tStart;
- TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, (long)cbSrcStream);
+ TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream);
hr = IPin_ConnectionMediaType(This->tf.ppPins[0], &amt);
if (FAILED(hr))
diff --git a/dll/directx/quartz/avidec.c b/dll/directx/quartz/avidec.c
index 8469bbc9f29..b7d45e93890 100644
--- a/dll/directx/quartz/avidec.c
+++ b/dll/directx/quartz/avidec.c
@@ -101,7 +101,7 @@ static HRESULT AVIDec_ProcessSampleData(InputPin *pin, IMediaSample *pSample)
cbSrcStream = IMediaSample_GetActualDataLength(pSample);
- TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, (long)cbSrcStream);
+ TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream);
hr = IPin_ConnectionMediaType(This->tf.ppPins[0], &amt);
if (FAILED(hr)) {
diff --git a/dll/directx/quartz/avisplit.c b/dll/directx/quartz/avisplit.c
index 42ec2ae2b34..61078805903 100644
--- a/dll/directx/quartz/avisplit.c
+++ b/dll/directx/quartz/avisplit.c
@@ -178,7 +178,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
{
AVISTDINDEX *index = stream->stdindex[stream->index];
AVISTDINDEX_ENTRY *entry = &index->aIndex[stream->pos];
- BOOL keyframe;
/* End of file */
if (stream->index >= stream->entries)
@@ -189,7 +188,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
}
rtSampleStart = index->qwBaseOffset;
- keyframe = !(entry->dwSize >> 31);
rtSampleStart += entry->dwOffset;
rtSampleStart = MEDIATIME_FROM_BYTES(rtSampleStart);
@@ -208,7 +206,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
{
DWORD flags = This->oldindex->aIndex[stream->pos].dwFlags;
DWORD size = This->oldindex->aIndex[stream->pos].dwSize;
- BOOL keyframe;
/* End of file */
if (stream->index)
@@ -218,8 +215,6 @@ static HRESULT AVISplitter_next_request(AVISplitterImpl *This, DWORD streamnumbe
return S_FALSE;
}
- keyframe = !!(flags & AVIIF_KEYFRAME);
-
rtSampleStart = MEDIATIME_FROM_BYTES(This->offset);
rtSampleStart += MEDIATIME_FROM_BYTES(This->oldindex->aIndex[stream->pos].dwOffset);
rtSampleStop = rtSampleStart + MEDIATIME_FROM_BYTES(size);
@@ -775,7 +770,7 @@ static HRESULT AVISplitter_ProcessStreamList(AVISplitterImpl * This, const BYTE
{
const AVISUPERINDEX *pIndex = (const AVISUPERINDEX *)pChunk;
DWORD x;
- long rest = pIndex->cb - sizeof(AVISUPERINDEX) + sizeof(RIFFCHUNK) + sizeof(pIndex->aIndex[0]) * ANYSIZE_ARRAY;
+ UINT rest = pIndex->cb - sizeof(AVISUPERINDEX) + sizeof(RIFFCHUNK) + sizeof(pIndex->aIndex[0]) * ANYSIZE_ARRAY;
if (pIndex->cb < sizeof(AVISUPERINDEX) - sizeof(RIFFCHUNK))
{
diff --git a/dll/directx/quartz/dsoundrender.c b/dll/directx/quartz/dsoundrender.c
index 1d87a7f0047..b327c00da9b 100644
--- a/dll/directx/quartz/dsoundrender.c
+++ b/dll/directx/quartz/dsoundrender.c
@@ -78,8 +78,8 @@ typedef struct DSoundRenderImpl
HANDLE state_change, blocked;
- long volume;
- long pan;
+ LONG volume;
+ LONG pan;
} DSoundRenderImpl;
/* Seeking is not needed for a renderer, rely on newsegment for the appropriate changes */
@@ -238,7 +238,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
{
DSoundRenderImpl *This = iface;
LPBYTE pbSrcStream = NULL;
- long cbSrcStream = 0;
+ LONG cbSrcStream = 0;
REFERENCE_TIME tStart, tStop;
HRESULT hr;
AM_MEDIA_TYPE *amt;
@@ -344,7 +344,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
}
cbSrcStream = IMediaSample_GetActualDataLength(pSample);
- TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, cbSrcStream);
+ TRACE("Sample data ptr = %p, size = %d\n", pbSrcStream, cbSrcStream);
#if 0 /* For debugging purpose */
{
@@ -677,7 +677,7 @@ static HRESULT WINAPI DSoundRender_GetState(IBaseFilter * iface, DWORD dwMilliSe
}
LeaveCriticalSection(&This->csFilter);
- return S_OK;
+ return hr;
}
static HRESULT WINAPI DSoundRender_SetSyncSource(IBaseFilter * iface, IReferenceClock *pClock)
@@ -877,11 +877,11 @@ static HRESULT WINAPI DSoundRender_InputPin_ReceiveConnection(IPin * iface, IPin
{
hr = IDirectSoundBuffer_SetVolume(DSImpl->dsbuffer, DSImpl->volume);
if (FAILED(hr))
- ERR("Can't set volume to %ld (%x)\n", DSImpl->volume, hr);
+ ERR("Can't set volume to %d (%x)\n", DSImpl->volume, hr);
hr = IDirectSoundBuffer_SetPan(DSImpl->dsbuffer, DSImpl->pan);
if (FAILED(hr))
- ERR("Can't set pan to %ld (%x)\n", DSImpl->pan, hr);
+ ERR("Can't set pan to %d (%x)\n", DSImpl->pan, hr);
DSImpl->write_pos = 0;
hr = S_OK;
diff --git a/dll/directx/quartz/enumfilters.c b/dll/directx/quartz/enumfilters.c
index ca6a98941bc..ab1f6ec6a72 100644
--- a/dll/directx/quartz/enumfilters.c
+++ b/dll/directx/quartz/enumfilters.c
@@ -126,6 +126,9 @@ static HRESULT WINAPI IEnumFiltersImpl_Next(IEnumFilters * iface, ULONG cFilters
TRACE("(%p)->(%u, %p, %p)\n", iface, cFilters, ppFilters, pcFetched);
+ if (!ppFilters)
+ return E_POINTER;
+
for (i = 0; i < cFetched; i++)
{
ppFilters[i] = This->ppFilters[This->uIndex + i];
diff --git a/dll/directx/quartz/filtergraph.c b/dll/directx/quartz/filtergraph.c
index 3e9a1da1b82..18bf97c392b 100644
--- a/dll/directx/quartz/filtergraph.c
+++ b/dll/directx/quartz/filtergraph.c
@@ -45,14 +45,14 @@
WINE_DEFAULT_DEBUG_CHANNEL(quartz);
typedef struct {
- HWND hWnd; /* Target window */
- long msg; /* User window message */
- long instance; /* User data */
- int disabled; /* Disabled messages posting */
+ HWND hWnd; /* Target window */
+ UINT msg; /* User window message */
+ LONG_PTR instance; /* User data */
+ int disabled; /* Disabled messages posting */
} WndNotify;
typedef struct {
- long lEventCode; /* Event code */
+ LONG lEventCode; /* Event code */
LONG_PTR lParam1; /* Param1 */
LONG_PTR lParam2; /* Param2 */
} Event;
@@ -120,7 +120,7 @@ static int EventsQueue_PutEvent(EventsQueue* omr, const Event* evt)
return TRUE;
}
-static int EventsQueue_GetEvent(EventsQueue* omr, Event* evt, long msTimeOut)
+static int EventsQueue_GetEvent(EventsQueue* omr, Event* evt, LONG msTimeOut)
{
if (WaitForSingleObject(omr->msg_event, msTimeOut) != WAIT_OBJECT_0)
return FALSE;
@@ -182,7 +182,7 @@ typedef struct _IFilterGraphImpl {
LPWSTR * pFilterNames;
int nFilters;
int filterCapacity;
- long nameIndex;
+ LONG nameIndex;
IReferenceClock *refClock;
EventsQueue evqueue;
HANDLE hEventCompletion;
@@ -4970,7 +4970,7 @@ static HRESULT WINAPI MediaEvent_SetNotifyWindow(IMediaEventEx *iface,
This->notif.hWnd = (HWND)hwnd;
This->notif.msg = lMsg;
- This->notif.instance = (long) lInstanceData;
+ This->notif.instance = lInstanceData;
return S_OK;
}
@@ -5055,30 +5055,26 @@ static HRESULT WINAPI MediaFilter_GetClassID(IMediaFilter *iface, CLSID * pClass
static HRESULT WINAPI MediaFilter_Stop(IMediaFilter *iface)
{
- FIXME("(): stub\n");
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_Stop((IMediaControl*)&This->IMediaControl_vtbl);
}
static HRESULT WINAPI MediaFilter_Pause(IMediaFilter *iface)
{
- FIXME("(): stub\n");
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_Pause((IMediaControl*)&This->IMediaControl_vtbl);
}
static HRESULT WINAPI MediaFilter_Run(IMediaFilter *iface, REFERENCE_TIME tStart)
{
- FIXME("(0x%s): stub\n", wine_dbgstr_longlong(tStart));
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_Run((IMediaControl*)&This->IMediaControl_vtbl);
}
static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD dwMsTimeout, FILTER_STATE * pState)
{
- FIXME("(%d, %p): stub\n", dwMsTimeout, pState);
-
- return E_NOTIMPL;
+ ICOM_THIS_MULTI(IFilterGraphImpl, IMediaFilter_vtbl, iface);
+ return MediaControl_GetState((IMediaControl*)&This->IMediaControl_vtbl, dwMsTimeout, (OAFilterState*)pState);
}
static HRESULT WINAPI MediaFilter_SetSyncSource(IMediaFilter *iface, IReferenceClock *pClock)
diff --git a/dll/directx/quartz/filtermapper.c b/dll/directx/quartz/filtermapper.c
index bacb72950d6..aeacfac386e 100644
--- a/dll/directx/quartz/filtermapper.c
+++ b/dll/directx/quartz/filtermapper.c
@@ -1778,7 +1778,7 @@ static HRESULT WINAPI AMFilterData_ParseFilterData(IAMFilterData* iface,
prf2 = CoTaskMemAlloc(sizeof(*prf2));
if (!prf2)
return E_OUTOFMEMORY;
- *ppRegFilter2 = (BYTE *)&prf2;
+ *ppRegFilter2 = (BYTE *)prf2;
hr = FM2_ReadFilterData(pData, prf2);
if (FAILED(hr))
diff --git a/dll/directx/quartz/memallocator.c b/dll/directx/quartz/memallocator.c
index 7f799c93b7d..a1c4473238f 100644
--- a/dll/directx/quartz/memallocator.c
+++ b/dll/directx/quartz/memallocator.c
@@ -534,7 +534,7 @@ static HRESULT WINAPI StdMediaSample2_GetTime(IMediaSample2 * iface, REFERENCE_T
hr = S_OK;
}
- return S_OK;
+ return hr;
}
static HRESULT WINAPI StdMediaSample2_SetTime(IMediaSample2 * iface, REFERENCE_TIME * pStart, REFERENCE_TIME * pEnd)
@@ -785,7 +785,7 @@ static HRESULT StdMemAllocator_Alloc(IMemAllocator * iface)
StdMemAllocator *This = (StdMemAllocator *)iface;
StdMediaSample2 * pSample = NULL;
SYSTEM_INFO si;
- long i;
+ LONG i;
assert(list_empty(&This->base.free_list));
diff --git a/dll/directx/quartz/mpegsplit.c b/dll/directx/quartz/mpegsplit.c
index e44a10fcca1..7eb2d2c213f 100644
--- a/dll/directx/quartz/mpegsplit.c
+++ b/dll/directx/quartz/mpegsplit.c
@@ -246,11 +246,8 @@ static HRESULT MPEGSplitter_process_sample(LPVOID iface, IMediaSample * pSample,
BYTE *pbSrcStream;
DWORD cbSrcStream = 0;
REFERENCE_TIME tStart, tStop, tAviStart = This->position;
- Parser_OutputPin * pOutputPin;
HRESULT hr;
- pOutputPin = (Parser_OutputPin*)This->Parser.ppPins[1];
-
hr = IMediaSample_GetTime(pSample, &tStart, &tStop);
if (SUCCEEDED(hr))
{
diff --git a/dll/directx/quartz/pin.c b/dll/directx/quartz/pin.c
index ca34d9331c5..fd0d5a2e522 100644
--- a/dll/directx/quartz/pin.c
+++ b/dll/directx/quartz/pin.c
@@ -1834,7 +1834,7 @@ HRESULT InputPin_Construct(const IPinVtbl *InputPin_Vtbl, const PIN_INFO * pPinI
return E_FAIL;
}
-HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, long outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
+HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin)
{
OutputPin * pPinImpl;
diff --git a/dll/directx/quartz/pin.h b/dll/directx/quartz/pin.h
index 2cbaddba0f9..e356ef32f53 100644
--- a/dll/directx/quartz/pin.h
+++ b/dll/directx/quartz/pin.h
@@ -143,7 +143,7 @@ typedef struct PullPin
/*** Constructors ***/
HRESULT InputPin_Construct(const IPinVtbl *InputPin_Vtbl, const PIN_INFO * pPinInfo, SAMPLEPROC_PUSH pSampleProc, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, CLEANUPPROC pCleanUp, LPCRITICAL_SECTION pCritSec, IMemAllocator *, IPin ** ppPin);
-HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, long outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
+HRESULT OutputPin_Construct(const IPinVtbl *OutputPin_Vtbl, LONG outputpin_size, const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *props, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
HRESULT PullPin_Construct(const IPinVtbl *PullPin_Vtbl, const PIN_INFO * pPinInfo, SAMPLEPROC_PULL pSampleProc, LPVOID pUserData, QUERYACCEPTPROC pQueryAccept, CLEANUPPROC pCleanUp, STOPPROCESSPROC, REQUESTPROC pCustomRequest, LPCRITICAL_SECTION pCritSec, IPin ** ppPin);
/**************************/
diff --git a/dll/directx/quartz/quartz.rbuild b/dll/directx/quartz/quartz.rbuild
index b7097f6ff1f..4a86c54b112 100644
--- a/dll/directx/quartz/quartz.rbuild
+++ b/dll/directx/quartz/quartz.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/directx/quartz/videorenderer.c b/dll/directx/quartz/videorenderer.c
index b31959eed21..268373f1888 100644
--- a/dll/directx/quartz/videorenderer.c
+++ b/dll/directx/quartz/videorenderer.c
@@ -82,8 +82,8 @@ typedef struct VideoRendererImpl
RECT SourceRect;
RECT DestRect;
RECT WindowPos;
- long VideoWidth;
- long VideoHeight;
+ LONG VideoWidth;
+ LONG VideoHeight;
IUnknown * pUnkOuter;
BOOL bUnkOuterValid;
BOOL bAggregatable;
@@ -287,7 +287,6 @@ static DWORD VideoRenderer_SendSampleData(VideoRendererImpl* This, LPBYTE data,
return VFW_E_RUNTIME_ERROR;
}
-
TRACE("biSize = %d\n", bmiHeader->biSize);
TRACE("biWidth = %d\n", bmiHeader->biWidth);
TRACE("biHeight = %d\n", bmiHeader->biHeight);
@@ -344,7 +343,7 @@ static HRESULT VideoRenderer_Sample(LPVOID iface, IMediaSample * pSample)
{
VideoRendererImpl *This = iface;
LPBYTE pbSrcStream = NULL;
- long cbSrcStream = 0;
+ LONG cbSrcStream = 0;
REFERENCE_TIME tStart, tStop;
HRESULT hr;
@@ -396,7 +395,7 @@ static HRESULT VideoRenderer_Sample(LPVOID iface, IMediaSample * pSample)
cbSrcStream = IMediaSample_GetActualDataLength(pSample);
- TRACE("val %p %ld\n", pbSrcStream, cbSrcStream);
+ TRACE("val %p %d\n", pbSrcStream, cbSrcStream);
#if 0 /* For debugging purpose */
{
@@ -483,6 +482,7 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
IsEqualIID(&pmt->subtype, &MEDIASUBTYPE_RGB8))
{
VideoRendererImpl* This = iface;
+ LONG height;
if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo))
{
@@ -490,7 +490,11 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
This->SourceRect.left = 0;
This->SourceRect.top = 0;
This->SourceRect.right = This->VideoWidth = format->bmiHeader.biWidth;
- This->SourceRect.bottom = This->VideoHeight = format->bmiHeader.biHeight;
+ height = format->bmiHeader.biHeight;
+ if (height < 0)
+ This->SourceRect.bottom = This->VideoHeight = -height;
+ else
+ This->SourceRect.bottom = This->VideoHeight = height;
}
else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2))
{
@@ -499,7 +503,11 @@ static HRESULT VideoRenderer_QueryAccept(LPVOID iface, const AM_MEDIA_TYPE * pmt
This->SourceRect.left = 0;
This->SourceRect.top = 0;
This->SourceRect.right = This->VideoWidth = format2->bmiHeader.biWidth;
- This->SourceRect.bottom = This->VideoHeight = format2->bmiHeader.biHeight;
+ height = format2->bmiHeader.biHeight;
+ if (height < 0)
+ This->SourceRect.bottom = This->VideoHeight = -height;
+ else
+ This->SourceRect.bottom = This->VideoHeight = height;
}
else
{
@@ -1176,10 +1184,25 @@ static HRESULT WINAPI Basicvideo_Invoke(IBasicVideo *iface,
/*** IBasicVideo methods ***/
static HRESULT WINAPI Basicvideo_get_AvgTimePerFrame(IBasicVideo *iface,
REFTIME *pAvgTimePerFrame) {
+ AM_MEDIA_TYPE *pmt;
ICOM_THIS_MULTI(VideoRendererImpl, IBasicVideo_vtbl, iface);
- FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, pAvgTimePerFrame);
+ if (!This->pInputPin->pin.pConnectedTo)
+ return VFW_E_NOT_CONNECTED;
+ TRACE("(%p/%p)->(%p)\n", This, iface, pAvgTimePerFrame);
+
+ pmt = &This->pInputPin->pin.mtCurrent;
+ if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) {
+ VIDEOINFOHEADER *vih = (VIDEOINFOHEADER*)pmt->pbFormat;
+ *pAvgTimePerFrame = vih->AvgTimePerFrame;
+ } else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2)) {
+ VIDEOINFOHEADER2 *vih = (VIDEOINFOHEADER2*)pmt->pbFormat;
+ *pAvgTimePerFrame = vih->AvgTimePerFrame;
+ } else {
+ ERR("Unknown format type %s\n", qzdebugstr_guid(&pmt->formattype));
+ *pAvgTimePerFrame = 0;
+ }
return S_OK;
}
@@ -1779,9 +1802,6 @@ static HRESULT WINAPI Videowindow_put_WindowStyleEx(IVideoWindow *iface,
TRACE("(%p/%p)->(%d)\n", This, iface, WindowStyleEx);
- if (WindowStyleEx & (WS_DISABLED|WS_HSCROLL|WS_ICONIC|WS_MAXIMIZE|WS_MINIMIZE|WS_VSCROLL))
- return E_INVALIDARG;
-
if (!SetWindowLongA(This->hWnd, GWL_EXSTYLE, WindowStyleEx))
return E_FAIL;
@@ -1805,7 +1825,7 @@ static HRESULT WINAPI Videowindow_put_AutoShow(IVideoWindow *iface,
TRACE("(%p/%p)->(%d)\n", This, iface, AutoShow);
- This->AutoShow = 1; /* FIXME: Should be AutoShow */;
+ This->AutoShow = AutoShow;
return S_OK;
}
@@ -1825,16 +1845,20 @@ static HRESULT WINAPI Videowindow_put_WindowState(IVideoWindow *iface,
LONG WindowState) {
ICOM_THIS_MULTI(VideoRendererImpl, IVideoWindow_vtbl, iface);
- FIXME("(%p/%p)->(%d): stub !!!\n", This, iface, WindowState);
-
+ TRACE("(%p/%p)->(%d)\n", This, iface, WindowState);
+ ShowWindow(This->hWnd, WindowState);
return S_OK;
}
static HRESULT WINAPI Videowindow_get_WindowState(IVideoWindow *iface,
LONG *WindowState) {
+ WINDOWPLACEMENT place;
ICOM_THIS_MULTI(VideoRendererImpl, IVideoWindow_vtbl, iface);
- FIXME("(%p/%p)->(%p): stub !!!\n", This, iface, WindowState);
+ place.length = sizeof(place);
+ GetWindowPlacement(This->hWnd, &place);
+ TRACE("(%p/%p)->(%p)\n", This, iface, WindowState);
+ *WindowState = place.showCmd;
return S_OK;
}
diff --git a/dll/directx/wine/d3d8/device.c b/dll/directx/wine/d3d8/device.c
index 11697b2ff26..12ed0fbfd38 100644
--- a/dll/directx/wine/d3d8/device.c
+++ b/dll/directx/wine/d3d8/device.c
@@ -171,18 +171,19 @@ static DWORD d3d8_allocate_handle(struct d3d8_handle_table *t, void *object, enu
if (t->free_entries)
{
+ DWORD index = t->free_entries - t->entries;
/* Use a free handle */
entry = t->free_entries;
if (entry->type != D3D8_HANDLE_FREE)
{
- ERR("Handle %u(%p) is in the free list, but has type %#x.\n", (entry - t->entries), entry, entry->type);
+ ERR("Handle %u(%p) is in the free list, but has type %#x.\n", index, entry, entry->type);
return D3D8_INVALID_HANDLE;
}
t->free_entries = entry->object;
entry->object = object;
entry->type = type;
- return entry - t->entries;
+ return index;
}
if (!(t->entry_count < t->table_size))
@@ -324,6 +325,7 @@ static ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface) {
HeapFree(GetProcessHeap(), 0, This->decls);
IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D8CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(This->WineD3DDevice);
IWineD3DDevice_Release(This->WineD3DDevice);
HeapFree(GetProcessHeap(), 0, This->handle_table.entries);
HeapFree(GetProcessHeap(), 0, This);
@@ -2762,6 +2764,19 @@ static const IWineD3DDeviceParentVtbl d3d8_wined3d_device_parent_vtbl =
device_parent_CreateSwapChain,
};
+static void setup_fpu(void)
+{
+ WORD cw;
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ __asm__ volatile ("fnstcw %0" : "=m" (cw));
+ cw = (cw & ~0xf3f) | 0x3f;
+ __asm__ volatile ("fldcw %0" : : "m" (cw));
+#else
+ FIXME("FPU setup not implemented for this platform.\n");
+#endif
+}
+
HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapter,
D3DDEVTYPE device_type, HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters)
{
@@ -2780,6 +2795,8 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
}
device->handle_table.table_size = D3D8_INITIAL_HANDLE_TABLE_SIZE;
+ if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu();
+
wined3d_mutex_lock();
hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IUnknown *)device,
(IWineD3DDeviceParent *)&device->device_parent_vtbl, &device->WineD3DDevice);
@@ -2791,6 +2808,19 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
return hr;
}
+ if (!parameters->Windowed)
+ {
+ if (!focus_window) focus_window = parameters->hDeviceWindow;
+ if (FAILED(hr = IWineD3DDevice_AcquireFocusWindow(device->WineD3DDevice, focus_window)))
+ {
+ ERR("Failed to acquire focus window, hr %#x.\n", hr);
+ IWineD3DDevice_Release(device->WineD3DDevice);
+ wined3d_mutex_unlock();
+ HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
+ return hr;
+ }
+ }
+
if (flags & D3DCREATE_MULTITHREADED) IWineD3DDevice_SetMultithreaded(device->WineD3DDevice);
wined3d_parameters.BackBufferWidth = parameters->BackBufferWidth;
@@ -2813,6 +2843,7 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
if (FAILED(hr))
{
WARN("Failed to initialize 3D, hr %#x.\n", hr);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
@@ -2855,6 +2886,7 @@ HRESULT device_init(IDirect3DDevice8Impl *device, IWineD3D *wined3d, UINT adapte
err:
wined3d_mutex_lock();
IWineD3DDevice_Uninit3D(device->WineD3DDevice, D3D8CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
HeapFree(GetProcessHeap(), 0, device->handle_table.entries);
diff --git a/dll/directx/wine/d3d9/device.c b/dll/directx/wine/d3d9/device.c
index 79a9ba01834..b9f539e0b28 100644
--- a/dll/directx/wine/d3d9/device.c
+++ b/dll/directx/wine/d3d9/device.c
@@ -271,6 +271,7 @@ static ULONG WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_Release(LPDIRECT3DDEV
HeapFree(GetProcessHeap(), 0, This->convertedDecls);
IWineD3DDevice_Uninit3D(This->WineD3DDevice, D3D9CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(This->WineD3DDevice);
IWineD3DDevice_Release(This->WineD3DDevice);
wined3d_mutex_unlock();
@@ -2821,6 +2822,19 @@ static const IWineD3DDeviceParentVtbl d3d9_wined3d_device_parent_vtbl =
device_parent_CreateSwapChain,
};
+static void setup_fpu(void)
+{
+ WORD cw;
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ __asm__ volatile ("fnstcw %0" : "=m" (cw));
+ cw = (cw & ~0xf3f) | 0x3f;
+ __asm__ volatile ("fldcw %0" : : "m" (cw));
+#else
+ FIXME("FPU setup not implemented for this platform.\n");
+#endif
+}
+
HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapter, D3DDEVTYPE device_type,
HWND focus_window, DWORD flags, D3DPRESENT_PARAMETERS *parameters)
{
@@ -2832,6 +2846,8 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
device->device_parent_vtbl = &d3d9_wined3d_device_parent_vtbl;
device->ref = 1;
+ if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu();
+
wined3d_mutex_lock();
hr = IWineD3D_CreateDevice(wined3d, adapter, device_type, focus_window, flags, (IUnknown *)device,
(IWineD3DDeviceParent *)&device->device_parent_vtbl, &device->WineD3DDevice);
@@ -2842,6 +2858,18 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
return hr;
}
+ if (!parameters->Windowed)
+ {
+ if (!focus_window) focus_window = parameters->hDeviceWindow;
+ if (FAILED(hr = IWineD3DDevice_AcquireFocusWindow(device->WineD3DDevice, focus_window)))
+ {
+ ERR("Failed to acquire focus window, hr %#x.\n", hr);
+ IWineD3DDevice_Release(device->WineD3DDevice);
+ wined3d_mutex_unlock();
+ return hr;
+ }
+ }
+
if (flags & D3DCREATE_ADAPTERGROUP_DEVICE)
{
WINED3DCAPS caps;
@@ -2885,6 +2913,7 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
if (FAILED(hr))
{
WARN("Failed to initialize 3D, hr %#x.\n", hr);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
HeapFree(GetProcessHeap(), 0, wined3d_parameters);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
@@ -2921,6 +2950,7 @@ HRESULT device_init(IDirect3DDevice9Impl *device, IWineD3D *wined3d, UINT adapte
ERR("Failed to allocate FVF vertex declaration map memory.\n");
wined3d_mutex_lock();
IWineD3DDevice_Uninit3D(device->WineD3DDevice, D3D9CB_DestroySwapChain);
+ IWineD3DDevice_ReleaseFocusWindow(device->WineD3DDevice);
IWineD3DDevice_Release(device->WineD3DDevice);
wined3d_mutex_unlock();
return E_OUTOFMEMORY;
diff --git a/dll/directx/wine/ddraw/ddraw.c b/dll/directx/wine/ddraw/ddraw.c
index 122c31b8cb8..a7522f91789 100644
--- a/dll/directx/wine/ddraw/ddraw.c
+++ b/dll/directx/wine/ddraw/ddraw.c
@@ -264,8 +264,8 @@ IDirectDrawImpl_AddRef(IDirectDraw7 *iface)
void
IDirectDrawImpl_Destroy(IDirectDrawImpl *This)
{
- /* Clear the cooplevel to restore window and display mode */
IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)This, NULL, DDSCL_NORMAL);
+ IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)This);
/* Destroy the device window if we created one */
if(This->devicewindow != 0)
@@ -441,12 +441,11 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
/* Switching from fullscreen? */
if(This->cooperative_level & DDSCL_FULLSCREEN)
{
- /* Restore the display mode */
- IDirectDraw7_RestoreDisplayMode(iface);
-
This->cooperative_level &= ~DDSCL_FULLSCREEN;
This->cooperative_level &= ~DDSCL_EXCLUSIVE;
This->cooperative_level &= ~DDSCL_ALLOWMODEX;
+
+ IWineD3DDevice_ReleaseFocusWindow(This->wineD3DDevice);
}
/* Don't override focus windows or private device windows */
@@ -483,6 +482,13 @@ IDirectDrawImpl_SetCooperativeLevel(IDirectDraw7 *iface,
!(This->devicewindow) &&
(hwnd != window) )
{
+ HRESULT hr = IWineD3DDevice_AcquireFocusWindow(This->wineD3DDevice, hwnd);
+ if (FAILED(hr))
+ {
+ ERR("Failed to acquire focus window, hr %#x.\n", hr);
+ LeaveCriticalSection(&ddraw_cs);
+ return hr;
+ }
This->dest_window = hwnd;
}
}
@@ -1514,11 +1520,24 @@ IDirectDrawImpl_GetSurfaceFromDC(IDirectDraw7 *iface,
IDirectDrawSurface7 **Surface)
{
IDirectDrawImpl *This = (IDirectDrawImpl *)iface;
- FIXME("(%p)->(%p,%p): Stub!\n", This, hdc, Surface);
+ IWineD3DSurface *wined3d_surface;
+ HRESULT hr;
- /* Implementation idea if needed: Loop through all surfaces and compare
- * their hdc with hdc. Implement it in WineD3D! */
- return DDERR_NOTFOUND;
+ TRACE("iface %p, dc %p, surface %p.\n", iface, hdc, Surface);
+
+ if (!Surface) return E_INVALIDARG;
+
+ hr = IWineD3DDevice_GetSurfaceFromDC(This->wineD3DDevice, hdc, &wined3d_surface);
+ if (FAILED(hr))
+ {
+ TRACE("No surface found for dc %p.\n", hdc);
+ *Surface = NULL;
+ return DDERR_NOTFOUND;
+ }
+
+ IWineD3DSurface_GetParent(wined3d_surface, (IUnknown **)Surface);
+ TRACE("Returning surface %p.\n", Surface);
+ return DD_OK;
}
/*****************************************************************************
diff --git a/dll/directx/wine/ddraw/ddraw.rbuild b/dll/directx/wine/ddraw/ddraw.rbuild
index f8d9c92c279..962cd7a96ad 100644
--- a/dll/directx/wine/ddraw/ddraw.rbuild
+++ b/dll/directx/wine/ddraw/ddraw.rbuild
@@ -1,6 +1,6 @@
-
+
.
diff --git a/dll/directx/wine/ddraw/ddraw_thunks.c b/dll/directx/wine/ddraw/ddraw_thunks.c
index dc71bf55a9c..9d606245272 100644
--- a/dll/directx/wine/ddraw/ddraw_thunks.c
+++ b/dll/directx/wine/ddraw/ddraw_thunks.c
@@ -290,6 +290,7 @@ IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
set_surf_version(impl, 1);
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
impl->ifaceToRelease = NULL;
+
return hr;
}
@@ -309,11 +310,13 @@ IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
*ppSurface = NULL;
return hr;
}
+
impl = (IDirectDrawSurfaceImpl *)pSurface7;
*ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
set_surf_version(impl, 2);
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
impl->ifaceToRelease = NULL;
+
return hr;
}
diff --git a/dll/directx/wine/ddraw/device.c b/dll/directx/wine/ddraw/device.c
index 13ecfa133ac..9a4e5c73204 100644
--- a/dll/directx/wine/ddraw/device.c
+++ b/dll/directx/wine/ddraw/device.c
@@ -2409,22 +2409,60 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface,
case D3DRENDERSTATE_TEXTUREMIN:
{
WINED3DTEXTUREFILTERTYPE tex_min;
+ WINED3DTEXTUREFILTERTYPE tex_mip;
hr = IWineD3DDevice_GetSamplerState(This->wineD3DDevice,
- 0, WINED3DSAMP_MINFILTER,
- &tex_min);
+ 0, WINED3DSAMP_MINFILTER, &tex_min);
+ if (FAILED(hr))
+ {
+ LeaveCriticalSection(&ddraw_cs);
+ return hr;
+ }
+ hr = IWineD3DDevice_GetSamplerState(This->wineD3DDevice,
+ 0, WINED3DSAMP_MIPFILTER, &tex_mip);
switch (tex_min)
{
case WINED3DTEXF_POINT:
- *Value = D3DFILTER_NEAREST;
+ switch (tex_mip)
+ {
+ case WINED3DTEXF_NONE:
+ *Value = D3DFILTER_NEAREST;
+ break;
+ case WINED3DTEXF_POINT:
+ *Value = D3DFILTER_MIPNEAREST;
+ break;
+ case WINED3DTEXF_LINEAR:
+ *Value = D3DFILTER_LINEARMIPNEAREST;
+ break;
+ default:
+ ERR("Unhandled mip filter %#x.\n", tex_mip);
+ *Value = D3DFILTER_NEAREST;
+ break;
+ }
break;
case WINED3DTEXF_LINEAR:
- *Value = D3DFILTER_LINEAR;
+ switch (tex_mip)
+ {
+ case WINED3DTEXF_NONE:
+ *Value = D3DFILTER_LINEAR;
+ break;
+ case WINED3DTEXF_POINT:
+ *Value = D3DFILTER_MIPLINEAR;
+ break;
+ case WINED3DTEXF_LINEAR:
+ *Value = D3DFILTER_LINEARMIPLINEAR;
+ break;
+ default:
+ ERR("Unhandled mip filter %#x.\n", tex_mip);
+ *Value = D3DFILTER_LINEAR;
+ break;
+ }
break;
default:
- ERR("Unhandled texture mag %d !\n",tex_min);
- *Value = 0;
+ ERR("Unhandled texture min filter %#x.\n",tex_min);
+ *Value = D3DFILTER_NEAREST;
+ break;
}
break;
}
@@ -2441,8 +2479,20 @@ IDirect3DDeviceImpl_7_GetRenderState(IDirect3DDevice7 *iface,
Value);
break;
+ case D3DRENDERSTATE_BORDERCOLOR:
+ FIXME("Unhandled render state D3DRENDERSTATE_BORDERCOLOR.\n");
+ hr = E_NOTIMPL;
+ break;
+
default:
- /* FIXME: Unhandled: D3DRENDERSTATE_STIPPLEPATTERN00 - 31 */
+ if (RenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00
+ && RenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)
+ {
+ FIXME("Unhandled stipple pattern render state (%#x).\n",
+ RenderStateType);
+ hr = E_NOTIMPL;
+ break;
+ }
hr = IWineD3DDevice_GetRenderState(This->wineD3DDevice,
RenderStateType,
Value);
@@ -2640,22 +2690,39 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
/* Some render states need special care */
switch(RenderStateType)
{
+ /*
+ * The ddraw texture filter mapping works like this:
+ * D3DFILTER_NEAREST Point min/mag, no mip
+ * D3DFILTER_MIPNEAREST Point min/mag, point mip
+ * D3DFILTER_LINEARMIPNEAREST: Point min/mag, linear mip
+ *
+ * D3DFILTER_LINEAR Linear min/mag, no mip
+ * D3DFILTER_MIPLINEAR Linear min/mag, point mip
+ * D3DFILTER_LINEARMIPLINEAR Linear min/mag, linear mip
+ *
+ * This is the opposite of the GL naming convention,
+ * D3DFILTER_LINEARMIPNEAREST corresponds to GL_NEAREST_MIPMAP_LINEAR.
+ */
case D3DRENDERSTATE_TEXTUREMAG:
{
- WINED3DTEXTUREFILTERTYPE tex_mag = WINED3DTEXF_POINT;
+ WINED3DTEXTUREFILTERTYPE tex_mag;
- switch ((D3DTEXTUREFILTER) Value)
+ switch (Value)
{
case D3DFILTER_NEAREST:
+ case D3DFILTER_MIPNEAREST:
case D3DFILTER_LINEARMIPNEAREST:
tex_mag = WINED3DTEXF_POINT;
break;
case D3DFILTER_LINEAR:
+ case D3DFILTER_MIPLINEAR:
case D3DFILTER_LINEARMIPLINEAR:
tex_mag = WINED3DTEXF_LINEAR;
break;
default:
+ tex_mag = WINED3DTEXF_POINT;
ERR("Unhandled texture mag %d !\n",Value);
+ break;
}
hr = IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
@@ -2666,24 +2733,26 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
case D3DRENDERSTATE_TEXTUREMIN:
{
- WINED3DTEXTUREFILTERTYPE tex_min = WINED3DTEXF_POINT;
- WINED3DTEXTUREFILTERTYPE tex_mip = WINED3DTEXF_NONE;
+ WINED3DTEXTUREFILTERTYPE tex_min;
+ WINED3DTEXTUREFILTERTYPE tex_mip;
switch ((D3DTEXTUREFILTER) Value)
{
case D3DFILTER_NEAREST:
tex_min = WINED3DTEXF_POINT;
+ tex_mip = WINED3DTEXF_NONE;
break;
case D3DFILTER_LINEAR:
tex_min = WINED3DTEXF_LINEAR;
+ tex_mip = WINED3DTEXF_NONE;
break;
case D3DFILTER_MIPNEAREST:
tex_min = WINED3DTEXF_POINT;
tex_mip = WINED3DTEXF_POINT;
break;
case D3DFILTER_MIPLINEAR:
- tex_min = WINED3DTEXF_POINT;
- tex_mip = WINED3DTEXF_LINEAR;
+ tex_min = WINED3DTEXF_LINEAR;
+ tex_mip = WINED3DTEXF_POINT;
break;
case D3DFILTER_LINEARMIPNEAREST:
tex_min = WINED3DTEXF_POINT;
@@ -2696,11 +2765,13 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
default:
ERR("Unhandled texture min %d !\n",Value);
+ tex_min = WINED3DTEXF_POINT;
+ tex_mip = WINED3DTEXF_NONE;
+ break;
}
- IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
- 0, WINED3DSAMP_MIPFILTER,
- tex_mip);
+ IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
+ 0, WINED3DSAMP_MIPFILTER, tex_mip);
hr = IWineD3DDevice_SetSamplerState(This->wineD3DDevice,
0, WINED3DSAMP_MINFILTER,
tex_min);
@@ -2723,9 +2794,22 @@ IDirect3DDeviceImpl_7_SetRenderState(IDirect3DDevice7 *iface,
Value);
break;
- default:
+ case D3DRENDERSTATE_BORDERCOLOR:
+ /* This should probably just forward to the corresponding sampler
+ * state. Needs tests. */
+ FIXME("Unhandled render state D3DRENDERSTATE_BORDERCOLOR.\n");
+ hr = E_NOTIMPL;
+ break;
- /* FIXME: Unhandled: D3DRENDERSTATE_STIPPLEPATTERN00 - 31 */
+ default:
+ if (RenderStateType >= D3DRENDERSTATE_STIPPLEPATTERN00
+ && RenderStateType <= D3DRENDERSTATE_STIPPLEPATTERN31)
+ {
+ FIXME("Unhandled stipple pattern render state (%#x).\n",
+ RenderStateType);
+ hr = E_NOTIMPL;
+ break;
+ }
hr = IWineD3DDevice_SetRenderState(This->wineD3DDevice,
RenderStateType,
diff --git a/dll/directx/wine/ddraw/direct3d.c b/dll/directx/wine/ddraw/direct3d.c
index 80052adb83f..3f2410fe8a7 100644
--- a/dll/directx/wine/ddraw/direct3d.c
+++ b/dll/directx/wine/ddraw/direct3d.c
@@ -1273,6 +1273,7 @@ IDirect3DImpl_GetCaps(IWineD3D *WineD3D,
/* Copy the results into the d3d7 and d3d3 structures */
Desc7->dwDevCaps = WCaps.DevCaps;
+ Desc7->dpcLineCaps.dwMiscCaps = WCaps.PrimitiveMiscCaps;
Desc7->dpcLineCaps.dwRasterCaps = WCaps.RasterCaps;
Desc7->dpcLineCaps.dwZCmpCaps = WCaps.ZCmpCaps;
Desc7->dpcLineCaps.dwSrcBlendCaps = WCaps.SrcBlendCaps;
diff --git a/dll/directx/wine/ddraw/executebuffer.c b/dll/directx/wine/ddraw/executebuffer.c
index 2f426881cba..29fd65e25a9 100644
--- a/dll/directx/wine/ddraw/executebuffer.c
+++ b/dll/directx/wine/ddraw/executebuffer.c
@@ -489,7 +489,7 @@ IDirect3DExecuteBufferImpl_Execute(IDirect3DExecuteBufferImpl *This,
memcpy(dst, src, ci->dwCount * sizeof(D3DTLVERTEX));
} else {
- ERR("Unhandled vertex processing !\n");
+ ERR("Unhandled vertex processing flag %#x.\n", ci->dwFlags);
}
instr += size;
@@ -703,7 +703,6 @@ IDirect3DExecuteBufferImpl_Lock(IDirect3DExecuteBuffer *iface,
TRACE("(%p)->(%p)\n", This, lpDesc);
dwSize = lpDesc->dwSize;
- memset(lpDesc, 0, dwSize);
memcpy(lpDesc, &This->desc, dwSize);
if (TRACE_ON(d3d7)) {
@@ -789,7 +788,6 @@ IDirect3DExecuteBufferImpl_GetExecuteData(IDirect3DExecuteBuffer *iface,
TRACE("(%p)->(%p): stub!\n", This, lpData);
dwSize = lpData->dwSize;
- memset(lpData, 0, dwSize);
memcpy(lpData, &This->data, dwSize);
if (TRACE_ON(d3d7)) {
diff --git a/dll/directx/wine/ddraw/main.c b/dll/directx/wine/ddraw/main.c
index bc23987ed81..72426cdf26c 100644
--- a/dll/directx/wine/ddraw/main.c
+++ b/dll/directx/wine/ddraw/main.c
@@ -288,7 +288,7 @@ err_out:
/* Let's hope we never need this ;) */
if(wineD3DDevice) IWineD3DDevice_Release(wineD3DDevice);
if(wineD3D) IWineD3D_Release(wineD3D);
- if(This) HeapFree(GetProcessHeap(), 0, This->decls);
+ HeapFree(GetProcessHeap(), 0, This->decls);
HeapFree(GetProcessHeap(), 0, This);
return hr;
}
diff --git a/dll/directx/wine/ddraw/material.c b/dll/directx/wine/ddraw/material.c
index 6f162f7c828..d75501ecd95 100644
--- a/dll/directx/wine/ddraw/material.c
+++ b/dll/directx/wine/ddraw/material.c
@@ -294,7 +294,6 @@ IDirect3DMaterialImpl_GetMaterial(IDirect3DMaterial3 *iface,
/* Copies the material structure */
EnterCriticalSection(&ddraw_cs);
dwSize = lpMat->dwSize;
- memset(lpMat, 0, dwSize);
memcpy(lpMat, &This->mat, dwSize);
LeaveCriticalSection(&ddraw_cs);
diff --git a/dll/directx/wine/ddraw/utils.c b/dll/directx/wine/ddraw/utils.c
index cfb04049770..5166b167b4a 100644
--- a/dll/directx/wine/ddraw/utils.c
+++ b/dll/directx/wine/ddraw/utils.c
@@ -171,7 +171,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
DDPixelFormat->u2.dwRBitMask = 0x00E0;
DDPixelFormat->u3.dwGBitMask = 0x001C;
DDPixelFormat->u4.dwBBitMask = 0x0003;
- DDPixelFormat->u5.dwRGBAlphaBitMask = 0xF000;
+ DDPixelFormat->u5.dwRGBAlphaBitMask = 0xFF00;
break;
case WINED3DFMT_B4G4R4X4_UNORM:
@@ -182,7 +182,7 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
DDPixelFormat->u3.dwGBitMask = 0x00F0;
DDPixelFormat->u4.dwBBitMask = 0x000F;
DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0;
- return;
+ break;
/* How are Z buffer bit depth and Stencil buffer bit depth related?
*/
@@ -236,8 +236,8 @@ PixelFormat_WineD3DtoDD(DDPIXELFORMAT *DDPixelFormat,
DDPixelFormat->u3.dwZBitMask = 0x00FFFFFFFF;
DDPixelFormat->u4.dwStencilBitMask = 0x00000000;
DDPixelFormat->u5.dwRGBAlphaBitMask = 0x0;
-
break;
+
case WINED3DFMT_S1_UINT_D15_UNORM:
DDPixelFormat->dwFlags = DDPF_ZBUFFER | DDPF_STENCILBUFFER;
DDPixelFormat->dwFourCC = 0;
diff --git a/dll/directx/wine/wined3d/arb_program_shader.c b/dll/directx/wine/wined3d/arb_program_shader.c
index cf7638605eb..0824fedb571 100644
--- a/dll/directx/wine/wined3d/arb_program_shader.c
+++ b/dll/directx/wine/wined3d/arb_program_shader.c
@@ -39,8 +39,6 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_constants);
WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
/* Extract a line. Note that this modifies the source string. */
static char *get_line(char **ptr)
{
@@ -61,14 +59,14 @@ static char *get_line(char **ptr)
static void shader_arb_dump_program_source(const char *source)
{
- unsigned long source_size;
+ ULONG source_size;
char *ptr, *line, *tmp;
source_size = strlen(source) + 1;
tmp = HeapAlloc(GetProcessHeap(), 0, source_size);
if (!tmp)
{
- ERR("Failed to allocate %lu bytes for shader source.\n", source_size);
+ ERR("Failed to allocate %u bytes for shader source.\n", source_size);
return;
}
memcpy(tmp, source, source_size);
@@ -81,10 +79,13 @@ static void shader_arb_dump_program_source(const char *source)
}
/* GL locking for state handlers is done by the caller. */
-static BOOL need_mova_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
+static BOOL need_rel_addr_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
{
- IWineD3DBaseShaderImpl *This = (IWineD3DBaseShaderImpl *) shader;
- if(!This->baseShader.reg_maps.usesmova) return FALSE;
+ if (shader->baseShader.reg_maps.shader_version.type == WINED3D_SHADER_TYPE_VERTEX)
+ {
+ if (((IWineD3DVertexShaderImpl *)shader)->rel_offset) return TRUE;
+ }
+ if (!shader->baseShader.reg_maps.usesmova) return FALSE;
return !gl_info->supported[NV_VERTEX_PROGRAM2_OPTION];
}
@@ -95,29 +96,85 @@ static inline BOOL use_nv_clip(const struct wined3d_gl_info *gl_info)
&& !(gl_info->quirks & WINED3D_QUIRK_NV_CLIP_BROKEN);
}
-static BOOL need_helper_const(const struct wined3d_gl_info *gl_info)
+static BOOL need_helper_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
{
- if (!gl_info->supported[NV_VERTEX_PROGRAM] /* Need to init colors. */
- || gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT /* Load the immval offset. */
- || gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W /* Have to init texcoords. */
- || (!use_nv_clip(gl_info)) /* Init the clip texcoord */)
- {
- return TRUE;
- }
+ if (need_rel_addr_const(shader, gl_info)) return TRUE;
+ if (!gl_info->supported[NV_VERTEX_PROGRAM]) return TRUE; /* Need to init colors. */
+ if (gl_info->quirks & WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT) return TRUE; /* Load the immval offset. */
+ if (gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W) return TRUE; /* Have to init texcoords. */
+ if (!use_nv_clip(gl_info)) return TRUE; /* Init the clip texcoord */
+ if (shader->baseShader.reg_maps.usesnrm) return TRUE; /* 0.0 */
+ if (shader->baseShader.reg_maps.usesrcp) return TRUE; /* EPS */
return FALSE;
}
-static unsigned int reserved_vs_const(IWineD3DBaseShader *shader, const struct wined3d_gl_info *gl_info)
+static unsigned int reserved_vs_const(IWineD3DBaseShaderImpl *shader, const struct wined3d_gl_info *gl_info)
{
unsigned int ret = 1;
/* We use one PARAM for the pos fixup, and in some cases one to load
* some immediate values into the shader
*/
- if(need_helper_const(gl_info)) ret++;
- if(need_mova_const(shader, gl_info)) ret++;
+ if(need_helper_const(shader, gl_info)) ret++;
+ if(need_rel_addr_const(shader, gl_info)) ret++;
return ret;
}
+enum arb_helper_value
+{
+ ARB_ZERO,
+ ARB_ONE,
+ ARB_TWO,
+ ARB_0001,
+ ARB_EPS,
+
+ ARB_VS_REL_OFFSET
+};
+
+static const char *arb_get_helper_value(enum wined3d_shader_type shader, enum arb_helper_value value)
+{
+ if (shader == WINED3D_SHADER_TYPE_GEOMETRY)
+ {
+ ERR("Geometry shaders are unsupported\n");
+ return "bad";
+ }
+
+ if (shader == WINED3D_SHADER_TYPE_PIXEL)
+ {
+ switch (value)
+ {
+ case ARB_ZERO: return "ps_helper_const.x";
+ case ARB_ONE: return "ps_helper_const.y";
+ case ARB_TWO: return "coefmul.x";
+ case ARB_0001: return "helper_const.xxxy";
+ case ARB_EPS: return "ps_helper_const.z";
+ default: break;
+ }
+ }
+ else
+ {
+ switch (value)
+ {
+ case ARB_ZERO: return "helper_const.x";
+ case ARB_ONE: return "helper_const.y";
+ case ARB_TWO: return "helper_const.z";
+ case ARB_EPS: return "helper_const.w";
+ case ARB_0001: return "helper_const.xxxy";
+ case ARB_VS_REL_OFFSET: return "rel_addr_const.y";
+ }
+ }
+ FIXME("Unmanaged %s shader helper constant requested: %u\n",
+ shader == WINED3D_SHADER_TYPE_PIXEL ? "pixel" : "vertex", value);
+ switch (value)
+ {
+ case ARB_ZERO: return "0.0";
+ case ARB_ONE: return "1.0";
+ case ARB_TWO: return "2.0";
+ case ARB_0001: return "{0.0, 0.0, 0.0, 1.0}";
+ case ARB_EPS: return "1e-8";
+ default: return "bad";
+ }
+}
+
static inline BOOL ffp_clip_emul(IWineD3DStateBlockImpl *stateblock)
{
return stateblock->lowest_disabled_stage < 7;
@@ -287,7 +344,8 @@ struct shader_arb_priv
const struct arb_ps_compiled_shader *compiled_fprog;
const struct arb_vs_compiled_shader *compiled_vprog;
GLuint depth_blt_vprogram_id;
- GLuint depth_blt_fprogram_id[tex_type_count];
+ GLuint depth_blt_fprogram_id_full[tex_type_count];
+ GLuint depth_blt_fprogram_id_masked[tex_type_count];
BOOL use_arbfp_fixed_func;
struct wine_rb_tree fragment_shaders;
BOOL last_ps_const_clamped;
@@ -509,7 +567,7 @@ static inline void shader_arb_ps_local_constants(IWineD3DDeviceImpl* deviceImpl)
*/
float val[4];
val[0] = context->render_offscreen ? 0.0f
- : ((IWineD3DSurfaceImpl *) deviceImpl->render_targets[0])->currentDesc.Height;
+ : deviceImpl->render_targets[0]->currentDesc.Height;
val[1] = context->render_offscreen ? 1.0f : -1.0f;
val[2] = 1.0f;
val[3] = 0.0f;
@@ -576,7 +634,7 @@ static inline void shader_arb_vs_local_constants(IWineD3DDeviceImpl* deviceImpl)
/* GL locking is done by the caller (state handler) */
static void shader_arb_load_constants(const struct wined3d_context *context, char usePixelShader, char useVertexShader)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
+ IWineD3DDeviceImpl *device = context->swapchain->device;
IWineD3DStateBlockImpl* stateBlock = device->stateBlock;
const struct wined3d_gl_info *gl_info = context->gl_info;
@@ -606,7 +664,7 @@ static void shader_arb_update_float_vertex_constants(IWineD3DDevice *iface, UINT
/* We don't want shader constant dirtification to be an O(contexts), so just dirtify the active
* context. On a context switch the old context will be fully dirtified */
- if (!context || ((IWineD3DSurfaceImpl *)context->surface)->resource.device != This) return;
+ if (!context || context->swapchain->device != This) return;
memset(context->vshader_const_dirty + start, 1, sizeof(*context->vshader_const_dirty) * count);
This->highest_dirty_vs_const = max(This->highest_dirty_vs_const, start + count);
@@ -619,7 +677,7 @@ static void shader_arb_update_float_pixel_constants(IWineD3DDevice *iface, UINT
/* We don't want shader constant dirtification to be an O(contexts), so just dirtify the active
* context. On a context switch the old context will be fully dirtified */
- if (!context || ((IWineD3DSurfaceImpl *)context->surface)->resource.device != This) return;
+ if (!context || context->swapchain->device != This) return;
memset(context->pshader_const_dirty + start, 1, sizeof(*context->pshader_const_dirty) * count);
This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, start + count);
@@ -670,12 +728,23 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
if (pshader)
{
max_constantsF = gl_info->limits.arb_ps_native_constants;
+ /* 24 is the minimum MAX_PROGRAM_ENV_PARAMETERS_ARB value. */
+ if (max_constantsF < 24)
+ max_constantsF = gl_info->limits.arb_ps_float_constants;
}
else
{
+ max_constantsF = gl_info->limits.arb_vs_native_constants;
+ /* 96 is the minimum MAX_PROGRAM_ENV_PARAMETERS_ARB value.
+ * Also prevents max_constantsF from becoming less than 0 and
+ * wrapping . */
+ if (max_constantsF < 96)
+ max_constantsF = gl_info->limits.arb_vs_float_constants;
+
if(This->baseShader.reg_maps.usesrelconstF) {
DWORD highest_constf = 0, clip_limit;
- max_constantsF = gl_info->limits.arb_vs_native_constants - reserved_vs_const(iface, gl_info);
+
+ max_constantsF -= reserved_vs_const(This, gl_info);
max_constantsF -= count_bits(This->baseShader.reg_maps.integer_constants);
for(i = 0; i < This->baseShader.limits.constant_float; i++)
@@ -708,7 +777,6 @@ static DWORD shader_generate_arb_declarations(IWineD3DBaseShader *iface, const s
{
if (ctx->target_version >= NV2) *num_clipplanes = gl_info->limits.clipplanes;
else *num_clipplanes = min(gl_info->limits.clipplanes, 4);
- max_constantsF = gl_info->limits.arb_vs_native_constants;
}
}
@@ -1355,7 +1423,9 @@ static void shader_hw_sample(const struct wined3d_shader_instruction *ins, DWORD
if (pshader)
{
gen_color_correction(buffer, dst_str, ins->dst[0].write_mask,
- "one", "coefmul.x", priv->cur_ps_args->super.color_fixup[sampler_idx]);
+ arb_get_helper_value(WINED3D_SHADER_TYPE_PIXEL, ARB_ONE),
+ arb_get_helper_value(WINED3D_SHADER_TYPE_PIXEL, ARB_TWO),
+ priv->cur_ps_args->super.color_fixup[sampler_idx]);
}
}
@@ -1369,6 +1439,8 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
int insert_line;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
+ const char *two = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_TWO);
/* Assume a new line will be added */
insert_line = 1;
@@ -1394,13 +1466,13 @@ static void shader_arb_get_src_param(const struct wined3d_shader_instruction *in
shader_addline(buffer, "ADD T%c, -%s, coefdiv.x;\n", 'A' + tmpreg, regstr);
break;
case WINED3DSPSM_SIGN:
- shader_addline(buffer, "MAD T%c, %s, coefmul.x, -one.x;\n", 'A' + tmpreg, regstr);
+ shader_addline(buffer, "MAD T%c, %s, %s, -%s;\n", 'A' + tmpreg, regstr, two, one);
break;
case WINED3DSPSM_SIGNNEG:
- shader_addline(buffer, "MAD T%c, %s, -coefmul.x, one.x;\n", 'A' + tmpreg, regstr);
+ shader_addline(buffer, "MAD T%c, %s, %s, %s;\n", 'A' + tmpreg, regstr, two, one);
break;
case WINED3DSPSM_COMP:
- shader_addline(buffer, "SUB T%c, one.x, %s;\n", 'A' + tmpreg, regstr);
+ shader_addline(buffer, "SUB T%c, %s, %s;\n", 'A' + tmpreg, one, regstr);
break;
case WINED3DSPSM_X2:
shader_addline(buffer, "ADD T%c, %s, %s;\n", 'A' + tmpreg, regstr, regstr);
@@ -1671,12 +1743,16 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
BOOL pshader = shader_is_pshader_version(shader->baseShader.reg_maps.shader_version.type);
struct shader_arb_ctx_priv *ctx = ins->ctx->backend_data;
+ const char *zero = arb_get_helper_value(shader->baseShader.reg_maps.shader_version.type, ARB_ZERO);
+ const char *one = arb_get_helper_value(shader->baseShader.reg_maps.shader_version.type, ARB_ONE);
+ const char *two = arb_get_helper_value(shader->baseShader.reg_maps.shader_version.type, ARB_TWO);
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char src0_param[256];
if(ins->handler_idx == WINED3DSIH_MOVA) {
char write_mask[6];
+ const char *offset = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_VS_REL_OFFSET);
if(ctx->target_version >= NV2) {
shader_hw_map2gl(ins);
@@ -1695,15 +1771,15 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
* The ARL is performed when A0 is used - the requested component is read from A0_SHADOW into
* A0.x. We can use the overwritten component of A0_shadow as temporary storage for the sign.
*/
- shader_addline(buffer, "SGE A0_SHADOW%s, %s, mova_const.y;\n", write_mask, src0_param);
- shader_addline(buffer, "MAD A0_SHADOW%s, A0_SHADOW, mova_const.z, -mova_const.w;\n", write_mask);
+ shader_addline(buffer, "SGE A0_SHADOW%s, %s, %s;\n", write_mask, src0_param, zero);
+ shader_addline(buffer, "MAD A0_SHADOW%s, A0_SHADOW, %s, -%s;\n", write_mask, two, one);
shader_addline(buffer, "ABS TA%s, %s;\n", write_mask, src0_param);
- shader_addline(buffer, "ADD TA%s, TA, mova_const.x;\n", write_mask);
+ shader_addline(buffer, "ADD TA%s, TA, rel_addr_const.x;\n", write_mask);
shader_addline(buffer, "FLR TA%s, TA;\n", write_mask);
if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
{
- shader_addline(buffer, "ADD TA%s, TA, helper_const.z;\n", write_mask);
+ shader_addline(buffer, "ADD TA%s, TA, %s;\n", write_mask, offset);
}
shader_addline(buffer, "MUL A0_SHADOW%s, TA, A0_SHADOW;\n", write_mask);
@@ -1715,8 +1791,9 @@ static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
src0_param[0] = '\0';
if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
{
+ const char *offset = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_VS_REL_OFFSET);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0_param);
- shader_addline(buffer, "ADD TA.x, %s, helper_const.z;\n", src0_param);
+ shader_addline(buffer, "ADD TA.x, %s, %s;\n", src0_param, offset);
shader_addline(buffer, "ARL A0.x, TA.x;\n");
}
else
@@ -2170,6 +2247,8 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
char dst_name[50];
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
/* texdepth has an implicit destination, the fragment depth value. It's only parameter,
* which is essentially an input, is the destination register because it is the first
@@ -2181,7 +2260,7 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
/* According to the msdn, the source register(must be r5) is unusable after
* the texdepth instruction, so we're free to modify it
*/
- shader_addline(buffer, "MIN %s.y, %s.y, one.y;\n", dst_name, dst_name);
+ shader_addline(buffer, "MIN %s.y, %s.y, %s;\n", dst_name, dst_name, one);
/* How to deal with the special case dst_name.g == 0? if r != 0, then
* the r * (1 / 0) will give infinity, which is clamped to 1.0, the correct
@@ -2189,8 +2268,8 @@ static void pshader_hw_texdepth(const struct wined3d_shader_instruction *ins)
*/
shader_addline(buffer, "RCP %s.y, %s.y;\n", dst_name, dst_name);
shader_addline(buffer, "MUL TA.x, %s.x, %s.y;\n", dst_name, dst_name);
- shader_addline(buffer, "MIN TA.x, TA.x, one.x;\n");
- shader_addline(buffer, "MAX result.depth, TA.x, 0.0;\n");
+ shader_addline(buffer, "MIN TA.x, TA.x, %s;\n", one);
+ shader_addline(buffer, "MAX result.depth, TA.x, %s;\n", zero);
}
/** Process the WINED3DSIO_TEXDP3TEX instruction in ARB:
@@ -2254,6 +2333,8 @@ static void pshader_hw_texm3x2depth(const struct wined3d_shader_instruction *ins
const struct wined3d_shader_dst_param *dst = &ins->dst[0];
char src0[50], dst_name[50];
BOOL is_color;
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
shader_arb_get_src_param(ins, &ins->src[0], 0, src0);
shader_arb_get_register_name(ins, &ins->dst[0].reg, dst_name, &is_color);
@@ -2265,8 +2346,8 @@ static void pshader_hw_texm3x2depth(const struct wined3d_shader_instruction *ins
*/
shader_addline(buffer, "RCP %s.y, %s.y;\n", dst_name, dst_name);
shader_addline(buffer, "MUL %s.x, %s.x, %s.y;\n", dst_name, dst_name, dst_name);
- shader_addline(buffer, "MIN %s.x, %s.x, one.x;\n", dst_name, dst_name);
- shader_addline(buffer, "MAX result.depth, %s.x, 0.0;\n", dst_name);
+ shader_addline(buffer, "MIN %s.x, %s.x, %s;\n", dst_name, dst_name, one);
+ shader_addline(buffer, "MAX result.depth, %s.x, %s;\n", dst_name, zero);
}
/** Handles transforming all WINED3DSIO_M?x? opcodes for
@@ -2325,6 +2406,44 @@ static void shader_hw_mnxn(const struct wined3d_shader_instruction *ins)
}
}
+static void shader_hw_rcp(const struct wined3d_shader_instruction *ins)
+{
+ struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
+ struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
+ const char *flt_eps = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_EPS);
+
+ char dst[50];
+ char src[50];
+
+ shader_arb_get_dst_param(ins, &ins->dst[0], dst); /* Destination */
+ shader_arb_get_src_param(ins, &ins->src[0], 0, src);
+ if (ins->src[0].swizzle == WINED3DSP_NOSWIZZLE)
+ {
+ /* Dx sdk says .x is used if no swizzle is given, but our test shows that
+ * .w is used
+ */
+ strcat(src, ".w");
+ }
+
+ /* TODO: If the destination is readable, and not the same as the source, the destination
+ * can be used instead of TA
+ */
+ if (priv->target_version >= NV2)
+ {
+ shader_addline(buffer, "MOVC TA.x, %s;\n", src);
+ shader_addline(buffer, "MOV TA.x (EQ.x), %s;\n", flt_eps);
+ shader_addline(buffer, "RCP%s %s, TA.x;\n", shader_arb_get_modifier(ins), dst);
+ }
+ else
+ {
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
+ shader_addline(buffer, "ABS TA.x, %s;\n", src);
+ shader_addline(buffer, "SGE TA.y, -TA.x, %s;\n", zero);
+ shader_addline(buffer, "MAD TA.x, TA.y, %s, %s;\n", flt_eps, src);
+ shader_addline(buffer, "RCP%s %s, TA.x;\n", shader_arb_get_modifier(ins), dst);
+ }
+}
+
static void shader_hw_scalar_op(const struct wined3d_shader_instruction *ins)
{
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
@@ -2364,20 +2483,44 @@ static void shader_hw_nrm(const struct wined3d_shader_instruction *ins)
char src_name[50];
struct shader_arb_ctx_priv *priv = ins->ctx->backend_data;
BOOL pshader = shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type);
+ const char *zero = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ZERO);
shader_arb_get_dst_param(ins, &ins->dst[0], dst_name);
shader_arb_get_src_param(ins, &ins->src[0], 1 /* Use TB */, src_name);
+ /* In D3D, NRM of a vector with length zero returns zero. Catch this situation, as
+ * otherwise NRM or RSQ would return NaN */
if(pshader && priv->target_version >= NV3)
{
+ /* GL_NV_fragment_program2's NRM needs protection against length zero vectors too
+ *
+ * TODO: Find out if DP3+NRM+MOV is really faster than DP3+RSQ+MUL
+ */
+ shader_addline(buffer, "DP3C TA, %s, %s;\n", src_name, src_name);
shader_addline(buffer, "NRM%s %s, %s;\n", shader_arb_get_modifier(ins), dst_name, src_name);
+ shader_addline(buffer, "MOV %s (EQ), %s;\n", dst_name, zero);
+ }
+ else if(priv->target_version >= NV2)
+ {
+ shader_addline(buffer, "DP3C TA.x, %s, %s;\n", src_name, src_name);
+ shader_addline(buffer, "RSQ TA.x (NE), TA.x;\n");
+ shader_addline(buffer, "MUL%s %s, %s, TA.x;\n", shader_arb_get_modifier(ins), dst_name,
+ src_name);
}
else
{
- shader_addline(buffer, "DP3 TA, %s, %s;\n", src_name, src_name);
- shader_addline(buffer, "RSQ TA, TA.x;\n");
+ const char *one = arb_get_helper_value(ins->ctx->reg_maps->shader_version.type, ARB_ONE);
+
+ shader_addline(buffer, "DP3 TA.x, %s, %s;\n", src_name, src_name);
+ /* Pass any non-zero value to RSQ if the input vector has a length of zero. The
+ * RSQ result doesn't matter, as long as multiplying it by 0 returns 0.
+ */
+ shader_addline(buffer, "SGE TA.y, -TA.x, %s;\n", zero);
+ shader_addline(buffer, "MAD TA.x, %s, TA.y, TA.x;\n", one);
+
+ shader_addline(buffer, "RSQ TA.x, TA.x;\n");
/* dst.w = src[0].w * 1 / (src.x^2 + src.y^2 + src.z^2)^(1/2) according to msdn*/
- shader_addline(buffer, "MUL%s %s, %s, TA;\n", shader_arb_get_modifier(ins), dst_name,
+ shader_addline(buffer, "MUL%s %s, %s, TA.x;\n", shader_arb_get_modifier(ins), dst_name,
src_name);
}
}
@@ -2997,6 +3140,7 @@ static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_sh
{
unsigned int cur_clip = 0;
char component[4] = {'x', 'y', 'z', 'w'};
+ const char *zero = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_ZERO);
for (i = 0; i < gl_info->limits.clipplanes; ++i)
{
@@ -3009,16 +3153,16 @@ static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_sh
switch(cur_clip)
{
case 0:
- shader_addline(buffer, "MOV TA, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA, %s;\n", zero);
break;
case 1:
- shader_addline(buffer, "MOV TA.yzw, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA.yzw, %s;\n", zero);
break;
case 2:
- shader_addline(buffer, "MOV TA.zw, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA.zw, %s;\n", zero);
break;
case 3:
- shader_addline(buffer, "MOV TA.w, -helper_const.w;\n");
+ shader_addline(buffer, "MOV TA.w, %s;\n", zero);
break;
}
shader_addline(buffer, "MOV result.texcoord[%u], TA;\n",
@@ -3028,8 +3172,9 @@ static void vshader_add_footer(IWineD3DVertexShaderImpl *This, struct wined3d_sh
/* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
* and the glsl equivalent
*/
- if(need_helper_const(gl_info)) {
- shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, helper_const.x, -TMP_OUT.w;\n");
+ if(need_helper_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
+ const char *two = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_TWO);
+ shader_addline(buffer, "MAD TMP_OUT.z, TMP_OUT.z, %s, -TMP_OUT.w;\n", two);
} else {
shader_addline(buffer, "ADD TMP_OUT.z, TMP_OUT.z, TMP_OUT.z;\n");
shader_addline(buffer, "ADD TMP_OUT.z, TMP_OUT.z, -TMP_OUT.w;\n");
@@ -3103,12 +3248,14 @@ static GLuint create_arb_blt_vertex_program(const struct wined3d_gl_info *gl_inf
}
/* GL locking is done by the caller */
-static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_info, enum tex_types tex_type)
+static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_info,
+ enum tex_types tex_type, BOOL masked)
{
GLuint program_id = 0;
+ const char *fprogram;
GLint pos;
- static const char * const blt_fprograms[tex_type_count] =
+ static const char * const blt_fprograms_full[tex_type_count] =
{
/* tex_1d */
NULL,
@@ -3134,16 +3281,55 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
"END\n",
};
- if (!blt_fprograms[tex_type])
+ static const char * const blt_fprograms_masked[tex_type_count] =
{
- FIXME("tex_type %#x not supported\n", tex_type);
+ /* tex_1d */
+ NULL,
+ /* tex_2d */
+ "!!ARBfp1.0\n"
+ "PARAM mask = program.local[0];\n"
+ "TEMP R0;\n"
+ "SLT R0.xy, fragment.position, mask.zwzw;\n"
+ "MUL R0.x, R0.x, R0.y;\n"
+ "KIL -R0.x;\n"
+ "TEX R0.x, fragment.texcoord[0], texture[0], 2D;\n"
+ "MOV result.depth.z, R0.x;\n"
+ "END\n",
+ /* tex_3d */
+ NULL,
+ /* tex_cube */
+ "!!ARBfp1.0\n"
+ "PARAM mask = program.local[0];\n"
+ "TEMP R0;\n"
+ "SLT R0.xy, fragment.position, mask.zwzw;\n"
+ "MUL R0.x, R0.x, R0.y;\n"
+ "KIL -R0.x;\n"
+ "TEX R0.x, fragment.texcoord[0], texture[0], CUBE;\n"
+ "MOV result.depth.z, R0.x;\n"
+ "END\n",
+ /* tex_rect */
+ "!!ARBfp1.0\n"
+ "PARAM mask = program.local[0];\n"
+ "TEMP R0;\n"
+ "SLT R0.xy, fragment.position, mask.zwzw;\n"
+ "MUL R0.x, R0.x, R0.y;\n"
+ "KIL -R0.x;\n"
+ "TEX R0.x, fragment.texcoord[0], texture[0], RECT;\n"
+ "MOV result.depth.z, R0.x;\n"
+ "END\n",
+ };
+
+ fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type];
+ if (!fprogram)
+ {
+ FIXME("tex_type %#x not supported, falling back to tex_2d\n", tex_type);
tex_type = tex_2d;
+ fprogram = masked ? blt_fprograms_masked[tex_type] : blt_fprograms_full[tex_type];
}
GL_EXTCALL(glGenProgramsARB(1, &program_id));
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id));
- GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB,
- strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type]));
+ GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(fprogram), fprogram));
checkGLcall("glProgramStringARB()");
glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos);
@@ -3151,7 +3337,7 @@ static GLuint create_arb_blt_fragment_program(const struct wined3d_gl_info *gl_i
{
FIXME("Fragment program error at position %d: %s\n\n", pos,
debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB)));
- shader_arb_dump_program_source(blt_fprograms[tex_type]);
+ shader_arb_dump_program_source(fprogram);
}
else
{
@@ -3309,7 +3495,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
char fragcolor[16];
DWORD *lconst_map = local_const_mapping((IWineD3DBaseShaderImpl *) This), next_local, cur;
struct shader_arb_ctx_priv priv_ctx;
- BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE;
+ BOOL dcl_td = FALSE;
BOOL want_nv_prog = FALSE;
struct arb_pshader_private *shader_priv = This->baseShader.backend_data;
GLint errPos;
@@ -3331,7 +3517,6 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
}
switch(found) {
- case 4: dcl_tmp = FALSE; break;
case 0:
sprintf(srgbtmp[0], "TA");
sprintf(srgbtmp[1], "TB");
@@ -3351,6 +3536,8 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
case 3:
sprintf(srgbtmp[3], "TA");
break;
+ case 4:
+ break;
}
/* Create the hw ARB shader */
@@ -3432,7 +3619,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct
if(dcl_td) shader_addline(buffer, "TEMP TD;\n"); /* Used for sRGB writing */
shader_addline(buffer, "PARAM coefdiv = { 0.5, 0.25, 0.125, 0.0625 };\n");
shader_addline(buffer, "PARAM coefmul = { 2, 4, 8, 16 };\n");
- shader_addline(buffer, "PARAM one = { 1.0, 1.0, 1.0, 1.0 };\n");
+ shader_addline(buffer, "PARAM ps_helper_const = { 0.0, 1.0, %1.10f, 0.0 };\n", eps);
if (reg_maps->shader_version.major < 2)
{
@@ -3927,11 +4114,11 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
}
shader_addline(buffer, "TEMP TMP_OUT;\n");
- if(need_helper_const(gl_info)) {
- shader_addline(buffer, "PARAM helper_const = { 2.0, -1.0, %d.0, 0.0 };\n", This->rel_offset);
+ if(need_helper_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
+ shader_addline(buffer, "PARAM helper_const = { 0.0, 1.0, 2.0, %1.10f};\n", eps);
}
- if(need_mova_const((IWineD3DBaseShader *) This, gl_info)) {
- shader_addline(buffer, "PARAM mova_const = { 0.5, 0.0, 2.0, 1.0 };\n");
+ if(need_rel_addr_const((IWineD3DBaseShaderImpl *) This, gl_info)) {
+ shader_addline(buffer, "PARAM rel_addr_const = { 0.5, %d.0, 0.0, 0.0 };\n", This->rel_offset);
shader_addline(buffer, "TEMP A0_SHADOW;\n");
}
@@ -3979,15 +4166,18 @@ static GLuint shader_arb_generate_vshader(IWineD3DVertexShaderImpl *This, struct
*/
if (!gl_info->supported[NV_VERTEX_PROGRAM])
{
- shader_addline(buffer, "MOV result.color.secondary, -helper_const.wwwy;\n");
+ const char *color_init = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_0001);
+ shader_addline(buffer, "MOV result.color.secondary, %s;\n", color_init);
if (gl_info->quirks & WINED3D_QUIRK_SET_TEXCOORD_W && !device->frag_pipe->ffp_proj_control)
{
int i;
- for(i = 0; i < min(8, MAX_REG_TEXCRD); i++) {
- if(This->baseShader.reg_maps.texcoord_mask[i] != 0 &&
+ const char *one = arb_get_helper_value(WINED3D_SHADER_TYPE_VERTEX, ARB_ONE);
+ for(i = 0; i < min(8, MAX_REG_TEXCRD); i++)
+ {
+ if (This->baseShader.reg_maps.texcoord_mask[i] != 0 &&
This->baseShader.reg_maps.texcoord_mask[i] != WINED3DSP_WRITEMASK_ALL) {
- shader_addline(buffer, "MOV result.texcoord[%u].w, -helper_const.y;\n", i);
+ shader_addline(buffer, "MOV result.texcoord[%u].w, %s\n", i, one);
}
}
}
@@ -4339,7 +4529,7 @@ static inline void find_arb_vs_compile_args(IWineD3DVertexShaderImpl *shader, IW
/* GL locking is done by the caller */
static void shader_arb_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS)
{
- IWineD3DDeviceImpl *This = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
+ IWineD3DDeviceImpl *This = context->swapchain->device;
struct shader_arb_priv *priv = This->shader_priv;
const struct wined3d_gl_info *gl_info = context->gl_info;
int i;
@@ -4443,18 +4633,23 @@ static void shader_arb_select(const struct wined3d_context *context, BOOL usePS,
}
/* GL locking is done by the caller */
-static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
+static void shader_arb_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type, const SIZE *ds_mask_size)
+{
+ const float mask[] = {0.0f, 0.0f, (float)ds_mask_size->cx, (float)ds_mask_size->cy};
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ BOOL masked = ds_mask_size->cx && ds_mask_size->cy;
struct shader_arb_priv *priv = This->shader_priv;
- GLuint *blt_fprogram = &priv->depth_blt_fprogram_id[tex_type];
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ GLuint *blt_fprogram;
if (!priv->depth_blt_vprogram_id) priv->depth_blt_vprogram_id = create_arb_blt_vertex_program(gl_info);
GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, priv->depth_blt_vprogram_id));
glEnable(GL_VERTEX_PROGRAM_ARB);
- if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type);
+ blt_fprogram = masked ? &priv->depth_blt_fprogram_id_masked[tex_type] : &priv->depth_blt_fprogram_id_full[tex_type];
+ if (!*blt_fprogram) *blt_fprogram = create_arb_blt_fragment_program(gl_info, tex_type, masked);
GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, *blt_fprogram));
+ if (masked) GL_EXTCALL(glProgramLocalParameter4fvARB(GL_FRAGMENT_PROGRAM_ARB, 0, mask));
glEnable(GL_FRAGMENT_PROGRAM_ARB);
}
@@ -4499,7 +4694,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
if (shader_data->num_gl_shaders)
{
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
for (i = 0; i < shader_data->num_gl_shaders; ++i)
@@ -4525,7 +4720,7 @@ static void shader_arb_destroy(IWineD3DBaseShader *iface) {
if (shader_data->num_gl_shaders)
{
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
for (i = 0; i < shader_data->num_gl_shaders; ++i)
@@ -4594,9 +4789,15 @@ static void shader_arb_free(IWineD3DDevice *iface) {
if(priv->depth_blt_vprogram_id) {
GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_vprogram_id));
}
- for (i = 0; i < tex_type_count; ++i) {
- if (priv->depth_blt_fprogram_id[i]) {
- GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id[i]));
+ for (i = 0; i < tex_type_count; ++i)
+ {
+ if (priv->depth_blt_fprogram_id_full[i])
+ {
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id_full[i]));
+ }
+ if (priv->depth_blt_fprogram_id_masked[i])
+ {
+ GL_EXTCALL(glDeleteProgramsARB(1, &priv->depth_blt_fprogram_id_masked[i]));
}
}
LEAVE_GL();
@@ -4611,16 +4812,19 @@ static BOOL shader_arb_dirty_const(IWineD3DDevice *iface) {
static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps)
{
- DWORD vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants);
- DWORD ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants);
-
- /* We don't have an ARB fixed function pipeline yet, so let the none backend set its caps,
- * then overwrite the shader specific ones
- */
- none_shader_backend.shader_get_caps(gl_info, pCaps);
-
if (gl_info->supported[ARB_VERTEX_PROGRAM])
{
+ DWORD vs_consts;
+
+ /* 96 is the minimum allowed value of MAX_PROGRAM_ENV_PARAMETERS_ARB
+ * for vertex programs. If the native limit is less than that it's
+ * not very useful, and e.g. Mesa swrast returns 0, probably to
+ * indicate it's a software implementation. */
+ if (gl_info->limits.arb_vs_native_constants < 96)
+ vs_consts = gl_info->limits.arb_vs_float_constants;
+ else
+ vs_consts = min(gl_info->limits.arb_vs_float_constants, gl_info->limits.arb_vs_native_constants);
+
if (gl_info->supported[NV_VERTEX_PROGRAM3])
{
pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0);
@@ -4639,9 +4843,23 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
}
pCaps->MaxVertexShaderConst = vs_consts;
}
+ else
+ {
+ pCaps->VertexShaderVersion = 0;
+ pCaps->MaxVertexShaderConst = 0;
+ }
if (gl_info->supported[ARB_FRAGMENT_PROGRAM])
{
+ DWORD ps_consts;
+
+ /* Similar as above for vertex programs, but the minimum for fragment
+ * programs is 24. */
+ if (gl_info->limits.arb_ps_native_constants < 24)
+ ps_consts = gl_info->limits.arb_ps_float_constants;
+ else
+ ps_consts = min(gl_info->limits.arb_ps_float_constants, gl_info->limits.arb_ps_native_constants);
+
if (gl_info->supported[NV_FRAGMENT_PROGRAM2])
{
pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0);
@@ -4661,6 +4879,12 @@ static void shader_arb_get_caps(const struct wined3d_gl_info *gl_info, struct sh
pCaps->PixelShader1xMaxValue = 8.0f;
pCaps->MaxPixelShaderConst = ps_consts;
}
+ else
+ {
+ pCaps->PixelShaderVersion = 0;
+ pCaps->PixelShader1xMaxValue = 0.0f;
+ pCaps->MaxPixelShaderConst = 0;
+ }
pCaps->VSClipping = use_nv_clip(gl_info);
}
@@ -4766,7 +4990,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
/* WINED3DSIH_NRM */ shader_hw_nrm,
/* WINED3DSIH_PHASE */ NULL,
/* WINED3DSIH_POW */ shader_hw_log_pow,
- /* WINED3DSIH_RCP */ shader_hw_scalar_op,
+ /* WINED3DSIH_RCP */ shader_hw_rcp,
/* WINED3DSIH_REP */ shader_hw_rep,
/* WINED3DSIH_RET */ shader_hw_ret,
/* WINED3DSIH_RSQ */ shader_hw_scalar_op,
@@ -5279,6 +5503,7 @@ static void arbfp_free(IWineD3DDevice *iface) {
static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
+ caps->PrimitiveMiscCaps = WINED3DPMISCCAPS_TSSARGTEMP;
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
WINED3DTEXOPCAPS_SELECTARG2 |
@@ -5309,14 +5534,11 @@ static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
caps->MaxTextureBlendStages = 8;
caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, 8);
-
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
}
-#undef GLINFO_LOCATION
-#define GLINFO_LOCATION stateblock->device->adapter->gl_info
static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float col[4];
@@ -5338,6 +5560,7 @@ static void state_texfactor_arbfp(DWORD state, IWineD3DStateBlockImpl *statebloc
static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float col[4];
@@ -5366,6 +5589,7 @@ static void state_arb_specularenable(DWORD state, IWineD3DStateBlockImpl *stateb
static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float mat[2][2];
@@ -5377,9 +5601,8 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s
/* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled
* anyway
*/
- if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT)) {
- device->StateTable[STATE_PIXELSHADERCONSTANT].apply(STATE_PIXELSHADERCONSTANT, stateblock, context);
- }
+ if (!isStateDirty(context, STATE_PIXELSHADERCONSTANT))
+ stateblock_apply_state(STATE_PIXELSHADERCONSTANT, stateblock, context);
}
if(device->shader_backend == &arb_program_shader_backend) {
@@ -5403,6 +5626,7 @@ static void set_bumpmat_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
float param[4];
@@ -5414,9 +5638,8 @@ static void tex_bumpenvlum_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock
/* The pixel shader has to know the luminance offset. Do a constants update if it
* isn't scheduled anyway
*/
- if(!isStateDirty(context, STATE_PIXELSHADERCONSTANT)) {
- device->StateTable[STATE_PIXELSHADERCONSTANT].apply(STATE_PIXELSHADERCONSTANT, stateblock, context);
- }
+ if (!isStateDirty(context, STATE_PIXELSHADERCONSTANT))
+ stateblock_apply_state(STATE_PIXELSHADERCONSTANT, stateblock, context);
}
if(device->shader_backend == &arb_program_shader_backend) {
@@ -5648,9 +5871,9 @@ static void gen_ffp_instr(struct wined3d_shader_buffer *buffer, unsigned int sta
}
}
-/* The stateblock is passed for GLINFO_LOCATION */
static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWineD3DStateBlockImpl *stateblock)
{
+ const struct wined3d_gl_info *gl_info = &stateblock->device->adapter->gl_info;
unsigned int stage;
struct wined3d_shader_buffer buffer;
BOOL tex_read[MAX_TEXTURES] = {FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE};
@@ -5925,6 +6148,7 @@ static GLuint gen_arbfp_ffp_shader(const struct ffp_frag_settings *settings, IWi
static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *device = stateblock->device;
struct shader_arb_priv *priv = device->fragment_priv;
BOOL use_pshader = use_ps(stateblock);
@@ -5961,7 +6185,7 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
return;
}
new_desc->num_textures_used = 0;
- for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ for (i = 0; i < gl_info->limits.texture_stages; ++i)
{
if(settings.op[i].cop == WINED3DTOP_DISABLE) break;
new_desc->num_textures_used = i;
@@ -6007,13 +6231,10 @@ static void fragment_prog_arbfp(DWORD state, IWineD3DStateBlockImpl *stateblock,
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
device->shader_backend->shader_select(context, use_pshader, use_vshader);
- if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader)) {
- device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
- }
- }
- if(use_pshader) {
- device->StateTable[STATE_PIXELSHADERCONSTANT].apply(STATE_PIXELSHADERCONSTANT, stateblock, context);
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && (use_vshader || use_pshader))
+ stateblock_apply_state(STATE_VERTEXSHADERCONSTANT, stateblock, context);
}
+ if (use_pshader) stateblock_apply_state(STATE_PIXELSHADERCONSTANT, stateblock, context);
}
/* We can't link the fog states to the fragment state directly since the vertex pipeline links them
@@ -6060,130 +6281,128 @@ static void textransform(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
}
}
-#undef GLINFO_LOCATION
-
static const struct StateEntryTemplate arbfp_fragmentstate_template[] = {
{STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlum_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
@@ -6194,11 +6413,11 @@ static const struct StateEntryTemplate arbfp_fragmentstate_template[] = {
{STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE },
{STATE_PIXELSHADER, { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_arbfp_fog }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, fragment_prog_arbfp }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS),{STATE_TEXTURESTAGE(0, WINED3DTSS_TEXTURETRANSFORMFLAGS), textransform }, WINED3D_GL_EXT_NONE },
@@ -6223,13 +6442,12 @@ const struct fragment_pipeline arbfp_fragment_pipeline = {
TRUE /* We can disable projected textures */
};
-#define GLINFO_LOCATION device->adapter->gl_info
-
struct arbfp_blit_priv {
GLenum yuy2_rect_shader, yuy2_2d_shader;
GLenum uyvy_rect_shader, uyvy_2d_shader;
GLenum yv12_rect_shader, yv12_2d_shader;
GLenum p8_rect_shader, p8_2d_shader;
+ GLuint palette_texture;
};
static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
@@ -6245,6 +6463,7 @@ static HRESULT arbfp_blit_alloc(IWineD3DDevice *iface) {
/* Context activation is done by the caller. */
static void arbfp_blit_free(IWineD3DDevice *iface) {
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
struct arbfp_blit_priv *priv = device->blit_priv;
ENTER_GL();
@@ -6257,6 +6476,8 @@ static void arbfp_blit_free(IWineD3DDevice *iface) {
GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_rect_shader));
GL_EXTCALL(glDeleteProgramsARB(1, &priv->p8_2d_shader));
checkGLcall("Delete yuv and p8 programs");
+
+ if(priv->palette_texture) glDeleteTextures(1, &priv->palette_texture);
LEAVE_GL();
HeapFree(GetProcessHeap(), 0, device->blit_priv);
@@ -6499,6 +6720,7 @@ static BOOL gen_yv12_read(struct wined3d_shader_buffer *buffer, GLenum textype,
static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
GLenum shader;
struct wined3d_shader_buffer buffer;
struct arbfp_blit_priv *priv = device->blit_priv;
@@ -6563,9 +6785,43 @@ static GLuint gen_p8_shader(IWineD3DDeviceImpl *device, GLenum textype)
return shader;
}
+/* Context activation is done by the caller. */
+static void upload_palette(IWineD3DSurfaceImpl *surface)
+{
+ BYTE table[256][4];
+ IWineD3DDeviceImpl *device = surface->resource.device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ struct arbfp_blit_priv *priv = device->blit_priv;
+ BOOL colorkey = (surface->CKeyFlags & WINEDDSD_CKSRCBLT) ? TRUE : FALSE;
+
+ d3dfmt_p8_init_palette(surface, table, colorkey);
+
+ ENTER_GL();
+ if (!priv->palette_texture)
+ glGenTextures(1, &priv->palette_texture);
+
+ GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
+ glBindTexture(GL_TEXTURE_1D, priv->palette_texture);
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ /* Make sure we have discrete color levels. */
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ /* Upload the palette */
+ /* TODO: avoid unneeed uploads in the future by adding some SFLAG_PALETTE_DIRTY mechanism */
+ glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, table);
+
+ /* Switch back to unit 0 in which the 2D texture will be stored. */
+ GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0));
+ LEAVE_GL();
+}
+
/* Context activation is done by the caller. */
static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_fixup, GLenum textype)
{
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
GLenum shader;
struct wined3d_shader_buffer buffer;
char luminance_component;
@@ -6720,19 +6976,20 @@ static GLuint gen_yuv_shader(IWineD3DDeviceImpl *device, enum complex_fixup yuv_
}
/* Context activation is done by the caller. */
-static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height)
+static HRESULT arbfp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
{
GLenum shader;
IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
- float size[4] = {width, height, 1, 1};
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ float size[4] = {surface->pow2Width, surface->pow2Height, 1, 1};
struct arbfp_blit_priv *priv = device->blit_priv;
enum complex_fixup fixup;
+ GLenum textype = surface->texture_target;
- if (!is_complex_fixup(format_desc->color_fixup))
+ if (!is_complex_fixup(surface->resource.format_desc->color_fixup))
{
TRACE("Fixup:\n");
- dump_color_fixup_desc(format_desc->color_fixup);
+ dump_color_fixup_desc(surface->resource.format_desc->color_fixup);
/* Don't bother setting up a shader for unconverted formats */
ENTER_GL();
glEnable(textype);
@@ -6741,7 +6998,7 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
return WINED3D_OK;
}
- fixup = get_complex_fixup(format_desc->color_fixup);
+ fixup = get_complex_fixup(surface->resource.format_desc->color_fixup);
switch(fixup)
{
@@ -6760,6 +7017,8 @@ static HRESULT arbfp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatD
case COMPLEX_FIXUP_P8:
shader = textype == GL_TEXTURE_RECTANGLE_ARB ? priv->p8_rect_shader : priv->p8_2d_shader;
if (!shader) shader = gen_p8_shader(device, textype);
+
+ upload_palette(surface);
break;
default:
@@ -6808,31 +7067,47 @@ static void arbfp_blit_unset(IWineD3DDevice *iface) {
LEAVE_GL();
}
-static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
+static BOOL arbfp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
{
- enum complex_fixup complex_fixup;
+ enum complex_fixup src_fixup;
+ if (blit_op != BLIT_OP_BLIT)
+ {
+ TRACE("Unsupported blit_op=%d\n", blit_op);
+ return FALSE;
+ }
+
+ src_fixup = get_complex_fixup(src_format_desc->color_fixup);
if (TRACE_ON(d3d_shader) && TRACE_ON(d3d))
{
TRACE("Checking support for fixup:\n");
- dump_color_fixup_desc(fixup);
+ dump_color_fixup_desc(src_format_desc->color_fixup);
}
- if (is_identity_fixup(fixup))
+ if (!is_identity_fixup(dst_format_desc->color_fixup))
+ {
+ TRACE("Destination fixups are not supported\n");
+ return FALSE;
+ }
+
+ if (is_identity_fixup(src_format_desc->color_fixup))
{
TRACE("[OK]\n");
return TRUE;
}
- /* We only support YUV conversions. */
- if (!is_complex_fixup(fixup))
+ /* We only support YUV conversions. */
+ if (!is_complex_fixup(src_format_desc->color_fixup))
{
TRACE("[FAILED]\n");
return FALSE;
}
- complex_fixup = get_complex_fixup(fixup);
- switch(complex_fixup)
+ switch(src_fixup)
{
case COMPLEX_FIXUP_YUY2:
case COMPLEX_FIXUP_UYVY:
@@ -6842,18 +7117,70 @@ static BOOL arbfp_blit_color_fixup_supported(struct color_fixup_desc fixup)
return TRUE;
default:
- FIXME("Unsupported YUV fixup %#x\n", complex_fixup);
+ FIXME("Unsupported YUV fixup %#x\n", src_fixup);
TRACE("[FAILED]\n");
return FALSE;
}
}
+HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
+ IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, enum blit_operation blit_op,
+ DWORD Filter)
+{
+ IWineD3DSwapChainImpl *dst_swapchain;
+ struct wined3d_context *context;
+ RECT dst_rect = *dst_rect_in;
+
+ /* Now load the surface */
+ surface_internal_preload(src_surface, SRGB_RGB);
+
+ /* Activate the destination context, set it up for blitting */
+ context = context_acquire(device, dst_surface);
+ context_apply_blit_state(context, device);
+
+ /* The coordinates of the ddraw front buffer are always fullscreen ('screen coordinates',
+ * while OpenGL coordinates are window relative.
+ * Also beware of the origin difference(top left vs bottom left).
+ * Also beware that the front buffer's surface size is screen width x screen height,
+ * whereas the real gl drawable size is the size of the window. */
+ dst_swapchain = (dst_surface->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)dst_surface->container : NULL;
+ if (dst_swapchain && dst_surface == dst_swapchain->front_buffer)
+ surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect);
+
+ arbfp_blit_set((IWineD3DDevice *)device, src_surface);
+
+ ENTER_GL();
+
+ /* Draw a textured quad */
+ draw_textured_quad(src_surface, src_rect, &dst_rect, Filter);
+
+ LEAVE_GL();
+
+ /* Leave the opengl state valid for blitting */
+ arbfp_blit_unset((IWineD3DDevice *)device);
+
+ if (wined3d_settings.strict_draw_ordering || (dst_swapchain
+ && (dst_surface == dst_swapchain->front_buffer
+ || dst_swapchain->num_contexts > 1)))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
+
+ context_release(context);
+
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE);
+ return WINED3D_OK;
+}
+
+static HRESULT arbfp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color)
+{
+ FIXME("Color filling not implemented by arbfp_blit\n");
+ return WINED3DERR_INVALIDCALL;
+}
+
const struct blit_shader arbfp_blit = {
arbfp_blit_alloc,
arbfp_blit_free,
arbfp_blit_set,
arbfp_blit_unset,
- arbfp_blit_color_fixup_supported,
+ arbfp_blit_supported,
+ arbfp_blit_color_fill
};
-
-#undef GLINFO_LOCATION
diff --git a/dll/directx/wine/wined3d/ati_fragment_shader.c b/dll/directx/wine/wined3d/ati_fragment_shader.c
index 0f911e9dc15..993ece0be8d 100644
--- a/dll/directx/wine/wined3d/ati_fragment_shader.c
+++ b/dll/directx/wine/wined3d/ati_fragment_shader.c
@@ -190,7 +190,6 @@ static const char *debug_mask(GLuint mask) {
default: return "Unexpected writemask";
}
}
-#define GLINFO_LOCATION (*gl_info)
static void wrap_op1(const struct wined3d_gl_info *gl_info, GLuint op, GLuint dst, GLuint dstMask, GLuint dstMod,
GLuint arg1, GLuint arg1Rep, GLuint arg1Mod)
@@ -796,11 +795,10 @@ static GLuint gen_ati_shader(const struct texture_stage_op op[MAX_TEXTURES], con
checkGLcall("GL_EXTCALL(glEndFragmentShaderATI())");
return ret;
}
-#undef GLINFO_LOCATION
-#define GLINFO_LOCATION stateblock->device->adapter->gl_info
static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
IWineD3DDeviceImpl *This = stateblock->device;
const struct atifs_ffp_desc *desc;
struct ffp_frag_settings settings;
@@ -818,14 +816,14 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, st
return;
}
new_desc->num_textures_used = 0;
- for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ for (i = 0; i < gl_info->limits.texture_stages; ++i)
{
if(settings.op[i].cop == WINED3DTOP_DISABLE) break;
new_desc->num_textures_used = i;
}
memcpy(&new_desc->parent.settings, &settings, sizeof(settings));
- new_desc->shader = gen_ati_shader(settings.op, context->gl_info);
+ new_desc->shader = gen_ati_shader(settings.op, gl_info);
add_ffp_frag_shader(&priv->fragment_shaders, &new_desc->parent);
TRACE("Allocated fixed function replacement shader descriptor %p\n", new_desc);
desc = new_desc;
@@ -849,6 +847,7 @@ static void set_tex_op_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, st
static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
@@ -859,6 +858,7 @@ static void state_texfactor_atifs(DWORD state, IWineD3DStateBlockImpl *statebloc
static void set_bumpmat(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float mat[2][2];
mat[0][0] = *((float *) &stateblock->textureState[stage][WINED3DTSS_BUMPENVMAT00]);
@@ -907,127 +907,124 @@ static void atifs_apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *statebl
if(!isStateDirty(context, device->StateTable[STATE_VSHADER].representative)) {
device->shader_backend->shader_select(context, FALSE, use_vshader);
- if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader) {
- device->StateTable[STATE_VERTEXSHADERCONSTANT].apply(STATE_VERTEXSHADERCONSTANT, stateblock, context);
- }
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT) && use_vshader)
+ stateblock_apply_state(STATE_VERTEXSHADERCONSTANT, stateblock, context);
}
}
-#undef GLINFO_LOCATION
-
static const struct StateEntryTemplate atifs_fragmentstate_template[] = {
{STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor_atifs }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ {STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), set_tex_op_atifs }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
- {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), set_bumpmat }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ {STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
@@ -1063,6 +1060,7 @@ static void atifs_enable(IWineD3DDevice *iface, BOOL enable) {
static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *caps)
{
+ caps->PrimitiveMiscCaps = WINED3DPMISCCAPS_TSSARGTEMP;
caps->TextureOpCaps = WINED3DTEXOPCAPS_DISABLE |
WINED3DTEXOPCAPS_SELECTARG1 |
WINED3DTEXOPCAPS_SELECTARG2 |
@@ -1105,8 +1103,6 @@ static void atifs_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen
*/
caps->MaxTextureBlendStages = 8;
caps->MaxSimultaneousTextures = 6;
-
- caps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
}
static HRESULT atifs_alloc(IWineD3DDevice *iface) {
@@ -1128,11 +1124,11 @@ static HRESULT atifs_alloc(IWineD3DDevice *iface) {
return WINED3D_OK;
}
-#define GLINFO_LOCATION This->adapter->gl_info
/* Context activation is done by the caller. */
static void atifs_free_ffpshader(struct wine_rb_entry *entry, void *context)
{
IWineD3DDeviceImpl *This = context;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
struct atifs_ffp_desc *entry_ati = WINE_RB_ENTRY_VALUE(entry, struct atifs_ffp_desc, parent.entry);
ENTER_GL();
@@ -1152,7 +1148,6 @@ static void atifs_free(IWineD3DDevice *iface) {
HeapFree(GetProcessHeap(), 0, priv);
This->fragment_priv = NULL;
}
-#undef GLINFO_LOCATION
static BOOL atifs_color_fixup_supported(struct color_fixup_desc fixup)
{
diff --git a/dll/directx/wine/wined3d/basetexture.c b/dll/directx/wine/wined3d/basetexture.c
index f3c3fe74e1b..deab4fb2362 100644
--- a/dll/directx/wine/wined3d/basetexture.c
+++ b/dll/directx/wine/wined3d/basetexture.c
@@ -27,9 +27,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_texture);
-HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
- WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count,
+ WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage,
+ const struct wined3d_format_desc *format_desc, WINED3DPOOL pool, IUnknown *parent,
+ const struct wined3d_parent_ops *parent_ops)
{
HRESULT hr;
@@ -41,7 +42,17 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DR
return hr;
}
- texture->baseTexture.levels = levels;
+ texture->baseTexture.sub_resources = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ level_count * layer_count * sizeof(*texture->baseTexture.sub_resources));
+ if (!texture->baseTexture.sub_resources)
+ {
+ ERR("Failed to allocate sub-resource array.\n");
+ resource_cleanup((IWineD3DResource *)texture);
+ return E_OUTOFMEMORY;
+ }
+
+ texture->baseTexture.layer_count = layer_count;
+ texture->baseTexture.level_count = level_count;
texture->baseTexture.filterType = (usage & WINED3DUSAGE_AUTOGENMIPMAP) ? WINED3DTEXF_LINEAR : WINED3DTEXF_NONE;
texture->baseTexture.LOD = 0;
texture->baseTexture.texture_rgb.dirty = TRUE;
@@ -66,9 +77,27 @@ HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DR
void basetexture_cleanup(IWineD3DBaseTexture *iface)
{
basetexture_unload(iface);
+ HeapFree(GetProcessHeap(), 0, ((IWineD3DBaseTextureImpl *)iface)->baseTexture.sub_resources);
resource_cleanup((IWineD3DResource *)iface);
}
+IWineD3DResourceImpl *basetexture_get_sub_resource(IWineD3DBaseTextureImpl *texture, UINT layer, UINT level)
+{
+ if (layer >= texture->baseTexture.layer_count)
+ {
+ WARN("layer %u >= layer_count %u.\n", layer, texture->baseTexture.layer_count);
+ return NULL;
+ }
+
+ if (level >= texture->baseTexture.level_count)
+ {
+ WARN("level %u >= level_count %u.\n", level, texture->baseTexture.level_count);
+ return NULL;
+ }
+
+ return texture->baseTexture.sub_resources[layer * texture->baseTexture.level_count + level];
+}
+
/* A GL context is provided by the caller */
static void gltexture_delete(struct gl_texture *tex)
{
@@ -86,7 +115,7 @@ void basetexture_unload(IWineD3DBaseTexture *iface)
if (This->baseTexture.texture_rgb.name || This->baseTexture.texture_srgb.name)
{
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
if(This->baseTexture.texture_rgb.name) {
@@ -115,8 +144,8 @@ DWORD basetexture_set_lod(IWineD3DBaseTexture *iface, DWORD LODNew)
return 0;
}
- if(LODNew >= This->baseTexture.levels)
- LODNew = This->baseTexture.levels - 1;
+ if (LODNew >= This->baseTexture.level_count)
+ LODNew = This->baseTexture.level_count - 1;
if(This->baseTexture.LOD != LODNew) {
This->baseTexture.LOD = LODNew;
@@ -145,8 +174,8 @@ DWORD basetexture_get_lod(IWineD3DBaseTexture *iface)
DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface)
{
IWineD3DBaseTextureImpl *This = (IWineD3DBaseTextureImpl *)iface;
- TRACE("(%p) : returning %d\n", This, This->baseTexture.levels);
- return This->baseTexture.levels;
+ TRACE("iface %p, returning %u.\n", iface, This->baseTexture.level_count);
+ return This->baseTexture.level_count;
}
HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DTEXTUREFILTERTYPE FilterType)
@@ -164,7 +193,7 @@ HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface, WINED3DT
* Or should we delay the applying until the texture is used for drawing? For now, apply
* immediately.
*/
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
glBindTexture(textureDimensions, This->baseTexture.texture_rgb.name);
@@ -270,9 +299,7 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac
gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] = 0;
gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = 1;
gl_tex->states[WINED3DTEXSTA_SRGBTEXTURE] = 0;
- gl_tex->states[WINED3DTEXSTA_ELEMENTINDEX] = 0;
- gl_tex->states[WINED3DTEXSTA_DMAPOFFSET] = 0;
- gl_tex->states[WINED3DTEXSTA_TSSADDRESSW] = WINED3DTADDRESS_WRAP;
+ gl_tex->states[WINED3DTEXSTA_SHADOW] = FALSE;
IWineD3DBaseTexture_SetDirty(iface, TRUE);
isNewTexture = TRUE;
@@ -301,10 +328,11 @@ HRESULT basetexture_bind(IWineD3DBaseTexture *iface, BOOL srgb, BOOL *set_surfac
* relying on the partial GL_ARB_texture_non_power_of_two emulation with texture rectangles
* (ie, do not care for cond_np2 here, just look for GL_TEXTURE_RECTANGLE_ARB)
*/
- if(textureDimensions != GL_TEXTURE_RECTANGLE_ARB) {
- TRACE("Setting GL_TEXTURE_MAX_LEVEL to %d\n", This->baseTexture.levels - 1);
- glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.levels - 1);
- checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.levels)");
+ if (textureDimensions != GL_TEXTURE_RECTANGLE_ARB)
+ {
+ TRACE("Setting GL_TEXTURE_MAX_LEVEL to %u.\n", This->baseTexture.level_count - 1);
+ glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.level_count - 1);
+ checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_MAX_LEVEL, This->baseTexture.level_count)");
}
if(textureDimensions==GL_TEXTURE_CUBE_MAP_ARB) {
/* Cubemaps are always set to clamp, regardless of the sampler state. */
@@ -444,17 +472,18 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
glTexParameteri(textureDimensions, GL_TEXTURE_MIN_FILTER, glValue);
checkGLcall("glTexParameter GL_TEXTURE_MIN_FILTER, ...");
- if(!cond_np2) {
- if(gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE) {
+ if (!cond_np2)
+ {
+ if (gl_tex->states[WINED3DTEXSTA_MIPFILTER] == WINED3DTEXF_NONE)
glValue = This->baseTexture.LOD;
- } else if(gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.levels) {
- glValue = This->baseTexture.levels - 1;
- } else if(gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD) {
+ else if (gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] >= This->baseTexture.level_count)
+ glValue = This->baseTexture.level_count - 1;
+ else if (gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL] < This->baseTexture.LOD)
/* baseTexture.LOD is already clamped in the setter */
glValue = This->baseTexture.LOD;
- } else {
+ else
glValue = gl_tex->states[WINED3DTEXSTA_MAXMIPLEVEL];
- }
+
/* Note that D3DSAMP_MAXMIPLEVEL specifies the biggest mipmap(default 0), while
* GL_TEXTURE_MAX_LEVEL specifies the smallest mimap used(default 1000).
* So D3DSAMP_MAXMIPLEVEL is the same as GL_TEXTURE_BASE_LEVEL.
@@ -488,4 +517,22 @@ void basetexture_apply_state_changes(IWineD3DBaseTexture *iface,
}
gl_tex->states[WINED3DTEXSTA_MAXANISOTROPY] = aniso;
}
+
+ if (!(This->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW)
+ != !gl_tex->states[WINED3DTEXSTA_SHADOW])
+ {
+ if (This->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW)
+ {
+ glTexParameteri(textureDimensions, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
+ glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
+ checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB)");
+ gl_tex->states[WINED3DTEXSTA_SHADOW] = TRUE;
+ }
+ else
+ {
+ glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ checkGLcall("glTexParameteri(textureDimensions, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE)");
+ gl_tex->states[WINED3DTEXSTA_SHADOW] = FALSE;
+ }
+ }
}
diff --git a/dll/directx/wine/wined3d/buffer.c b/dll/directx/wine/wined3d/buffer.c
index e22d311beb9..daece20c33d 100644
--- a/dll/directx/wine/wined3d/buffer.c
+++ b/dll/directx/wine/wined3d/buffer.c
@@ -29,8 +29,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->resource.device->adapter->gl_info
-
#define VB_MAXDECLCHANGES 100 /* After that number of decl changes we stop converting */
#define VB_RESETDECLCHANGE 1000 /* Reset the decl changecount after that number of draws */
#define VB_MAXFULLCONVERSIONS 5 /* Number of full conversions before we stop converting */
@@ -97,11 +95,29 @@ static inline BOOL buffer_is_fully_dirty(struct wined3d_buffer *This)
return FALSE;
}
+/* Context activation is done by the caller */
+static void delete_gl_buffer(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
+{
+ if(!This->buffer_object) return;
+
+ ENTER_GL();
+ GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
+ checkGLcall("glDeleteBuffersARB");
+ LEAVE_GL();
+ This->buffer_object = 0;
+
+ if(This->query)
+ {
+ wined3d_event_query_destroy(This->query);
+ This->query = NULL;
+ }
+ This->flags &= ~WINED3D_BUFFER_APPLESYNC;
+}
+
/* Context activation is done by the caller. */
-static void buffer_create_buffer_object(struct wined3d_buffer *This)
+static void buffer_create_buffer_object(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
GLenum error, gl_usage;
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
TRACE("Creating an OpenGL vertex buffer object for IWineD3DVertexBuffer %p Usage(%s)\n",
This, debug_d3dusage(This->resource.usage));
@@ -157,6 +173,10 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE));
checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_FLUSHING_UNMAP_APPLE, GL_FALSE)");
This->flags |= WINED3D_BUFFER_FLUSH;
+
+ GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE));
+ checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_FALSE)");
+ This->flags |= WINED3D_BUFFER_APPLESYNC;
}
/* No setup is needed here for GL_ARB_map_buffer_range */
}
@@ -203,13 +223,7 @@ static void buffer_create_buffer_object(struct wined3d_buffer *This)
fail:
/* Clean up all vbo init, but continue because we can work without a vbo :-) */
ERR("Failed to create a vertex buffer object. Continuing, but performance issues may occur\n");
- if (This->buffer_object)
- {
- ENTER_GL();
- GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
- LEAVE_GL();
- }
- This->buffer_object = 0;
+ delete_gl_buffer(This, gl_info);
buffer_clear_dirty_areas(This);
}
@@ -258,12 +272,13 @@ static BOOL buffer_process_converted_attribute(struct wined3d_buffer *This,
attrib_size = attrib->format_desc->component_count * attrib->format_desc->component_size;
for (i = 0; i < attrib_size; ++i)
{
- if (This->conversion_map[data + i] != conversion_type)
+ DWORD_PTR idx = (data + i) % This->stride;
+ if (This->conversion_map[idx] != conversion_type)
{
- TRACE("Byte %ld in vertex changed\n", i + data);
- TRACE("It was type %d, is %d now\n", This->conversion_map[data + i], conversion_type);
+ TRACE("Byte %ld in vertex changed\n", idx);
+ TRACE("It was type %d, is %d now\n", This->conversion_map[idx], conversion_type);
ret = TRUE;
- This->conversion_map[data + i] = conversion_type;
+ This->conversion_map[idx] = conversion_type;
}
}
@@ -534,7 +549,7 @@ static BOOL buffer_find_decl(struct wined3d_buffer *This)
}
/* Context activation is done by the caller. */
-static void buffer_check_buffer_object_size(struct wined3d_buffer *This)
+static void buffer_check_buffer_object_size(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
UINT size = This->conversion_stride ?
This->conversion_stride * (This->resource.size / This->stride) : This->resource.size;
@@ -550,7 +565,7 @@ static void buffer_check_buffer_object_size(struct wined3d_buffer *This)
/* Rescue the data before resizing the buffer object if we do not have our backup copy */
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- buffer_get_sysmem(This);
+ buffer_get_sysmem(This, gl_info);
}
ENTER_GL();
@@ -595,7 +610,7 @@ static inline void fixup_transformed_pos(float *p)
}
/* Context activation is done by the caller. */
-const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object)
+const BYTE *buffer_get_memory(IWineD3DBuffer *iface, const struct wined3d_gl_info *gl_info, GLuint *buffer_object)
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
@@ -604,19 +619,19 @@ const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer
{
if (This->flags & WINED3D_BUFFER_CREATEBO)
{
- buffer_create_buffer_object(This);
+ buffer_create_buffer_object(This, gl_info);
This->flags &= ~WINED3D_BUFFER_CREATEBO;
if (This->buffer_object)
{
*buffer_object = This->buffer_object;
- return (const BYTE *)offset;
+ return NULL;
}
}
- return This->resource.allocatedMemory + offset;
+ return This->resource.allocatedMemory;
}
else
{
- return (const BYTE *)offset;
+ return NULL;
}
}
@@ -655,7 +670,7 @@ static ULONG STDMETHODCALLTYPE buffer_AddRef(IWineD3DBuffer *iface)
}
/* Context activation is done by the caller. */
-BYTE *buffer_get_sysmem(struct wined3d_buffer *This)
+BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info)
{
/* AllocatedMemory exists if the buffer is double buffered or has no buffer object at all */
if(This->resource.allocatedMemory) return This->resource.allocatedMemory;
@@ -682,20 +697,16 @@ static void STDMETHODCALLTYPE buffer_UnLoad(IWineD3DBuffer *iface)
IWineD3DDeviceImpl *device = This->resource.device;
struct wined3d_context *context;
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
/* Download the buffer, but don't permanently enable double buffering */
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- buffer_get_sysmem(This);
+ buffer_get_sysmem(This, context->gl_info);
This->flags &= ~WINED3D_BUFFER_DOUBLEBUFFER;
}
- ENTER_GL();
- GL_EXTCALL(glDeleteBuffersARB(1, &This->buffer_object));
- checkGLcall("glDeleteBuffersARB");
- LEAVE_GL();
- This->buffer_object = 0;
+ delete_gl_buffer(This, context->gl_info);
This->flags |= WINED3D_BUFFER_CREATEBO; /* Recreate the buffer object next load */
buffer_clear_dirty_areas(This);
@@ -766,26 +777,171 @@ static DWORD STDMETHODCALLTYPE buffer_GetPriority(IWineD3DBuffer *iface)
return resource_get_priority((IWineD3DResource *)iface);
}
+/* The caller provides a context and binds the buffer */
+static void buffer_sync_apple(struct wined3d_buffer *This, DWORD flags, const struct wined3d_gl_info *gl_info)
+{
+ enum wined3d_event_query_result ret;
+
+ /* No fencing needs to be done if the app promises not to overwrite
+ * existing data */
+ if(flags & WINED3DLOCK_NOOVERWRITE) return;
+ if(flags & WINED3DLOCK_DISCARD)
+ {
+ ENTER_GL();
+ GL_EXTCALL(glBufferDataARB(This->buffer_type_hint, This->resource.size, NULL, This->buffer_object_usage));
+ checkGLcall("glBufferDataARB\n");
+ LEAVE_GL();
+ return;
+ }
+
+ if(!This->query)
+ {
+ TRACE("Creating event query for buffer %p\n", This);
+
+ if (!wined3d_event_query_supported(gl_info))
+ {
+ FIXME("Event queries not supported, dropping async buffer locks.\n");
+ goto drop_query;
+ }
+
+ This->query = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This->query));
+ if (!This->query)
+ {
+ ERR("Failed to allocate event query memory, dropping async buffer locks.\n");
+ goto drop_query;
+ }
+
+ /* Since we don't know about old draws a glFinish is needed once */
+ wglFinish();
+ return;
+ }
+ TRACE("Synchronizing buffer %p\n", This);
+ ret = wined3d_event_query_finish(This->query, This->resource.device);
+ switch(ret)
+ {
+ case WINED3D_EVENT_QUERY_NOT_STARTED:
+ case WINED3D_EVENT_QUERY_OK:
+ /* All done */
+ return;
+
+ case WINED3D_EVENT_QUERY_WRONG_THREAD:
+ WARN("Cannot synchronize buffer lock due to a thread conflict\n");
+ goto drop_query;
+
+ default:
+ ERR("wined3d_event_query_finish returned %u, dropping async buffer locks\n", ret);
+ goto drop_query;
+ }
+
+drop_query:
+ if(This->query)
+ {
+ wined3d_event_query_destroy(This->query);
+ This->query = NULL;
+ }
+
+ wglFinish();
+ ENTER_GL();
+ GL_EXTCALL(glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE));
+ checkGLcall("glBufferParameteriAPPLE(This->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)");
+ LEAVE_GL();
+ This->flags &= ~WINED3D_BUFFER_APPLESYNC;
+}
+
+/* The caller provides a GL context */
+static void buffer_direct_upload(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info, DWORD flags)
+{
+ BYTE *map;
+ UINT start = 0, len = 0;
+
+ ENTER_GL();
+ GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
+ checkGLcall("glBindBufferARB");
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GLbitfield mapflags;
+ mapflags = GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT;
+ if (flags & WINED3D_BUFFER_DISCARD)
+ {
+ mapflags |= GL_MAP_UNSYNCHRONIZED_BIT | GL_MAP_INVALIDATE_BUFFER_BIT;
+ }
+ else if (flags & WINED3D_BUFFER_NOSYNC)
+ {
+ mapflags |= GL_MAP_UNSYNCHRONIZED_BIT;
+ }
+ map = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
+ This->resource.size, mapflags));
+ checkGLcall("glMapBufferRange");
+ }
+ else
+ {
+ if (This->flags & WINED3D_BUFFER_APPLESYNC)
+ {
+ DWORD syncflags = 0;
+ if (flags & WINED3D_BUFFER_DISCARD) syncflags |= WINED3DLOCK_DISCARD;
+ if (flags & WINED3D_BUFFER_NOSYNC) syncflags |= WINED3DLOCK_NOOVERWRITE;
+ LEAVE_GL();
+ buffer_sync_apple(This, syncflags, gl_info);
+ ENTER_GL();
+ }
+ map = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_WRITE_ONLY_ARB));
+ checkGLcall("glMapBufferARB");
+ }
+ if (!map)
+ {
+ LEAVE_GL();
+ ERR("Failed to map opengl buffer\n");
+ return;
+ }
+
+ while(This->modified_areas)
+ {
+ This->modified_areas--;
+ start = This->maps[This->modified_areas].offset;
+ len = This->maps[This->modified_areas].size;
+
+ memcpy(map + start, This->resource.allocatedMemory + start, len);
+
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GL_EXTCALL(glFlushMappedBufferRange(This->buffer_type_hint, start, len));
+ checkGLcall("glFlushMappedBufferRange");
+ }
+ else if (This->flags & WINED3D_BUFFER_FLUSH)
+ {
+ GL_EXTCALL(glFlushMappedBufferRangeAPPLE(This->buffer_type_hint, start, len));
+ checkGLcall("glFlushMappedBufferRangeAPPLE");
+ }
+ }
+ GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
+ checkGLcall("glUnmapBufferARB");
+ LEAVE_GL();
+}
+
static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
IWineD3DDeviceImpl *device = This->resource.device;
UINT start = 0, end = 0, len = 0, vertices;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
BOOL decl_changed = FALSE;
unsigned int i, j;
BYTE *data;
+ DWORD flags = This->flags & (WINED3D_BUFFER_NOSYNC | WINED3D_BUFFER_DISCARD);
TRACE("iface %p\n", iface);
+ This->flags &= ~(WINED3D_BUFFER_NOSYNC | WINED3D_BUFFER_DISCARD);
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
if (!This->buffer_object)
{
/* TODO: Make converting independent from VBOs */
if (This->flags & WINED3D_BUFFER_CREATEBO)
{
- buffer_create_buffer_object(This);
+ buffer_create_buffer_object(This, gl_info);
This->flags &= ~WINED3D_BUFFER_CREATEBO;
}
else
@@ -836,7 +992,20 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
IWineD3DDeviceImpl_MarkStateDirty(device, STATE_STREAMSRC);
goto end;
}
- buffer_check_buffer_object_size(This);
+ buffer_check_buffer_object_size(This, gl_info);
+
+ /* The declaration changed, reload the whole buffer */
+ WARN("Reloading buffer because of decl change\n");
+ buffer_clear_dirty_areas(This);
+ if(!buffer_add_dirty_area(This, 0, 0))
+ {
+ ERR("buffer_add_dirty_area failed, this is not expected\n");
+ return;
+ }
+ /* Avoid unfenced updates, we might overwrite more areas of the buffer than the application
+ * cleared for unsynchronized updates
+ */
+ flags = 0;
}
else
{
@@ -864,18 +1033,6 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
}
}
- if (decl_changed)
- {
- /* The declaration changed, reload the whole buffer */
- WARN("Reloading buffer because of decl change\n");
- buffer_clear_dirty_areas(This);
- if(!buffer_add_dirty_area(This, 0, 0))
- {
- ERR("buffer_add_dirty_area failed, this is not expected\n");
- return;
- }
- }
-
if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
{
IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
@@ -896,18 +1053,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
return;
}
- ENTER_GL();
- GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
- checkGLcall("glBindBufferARB");
- while(This->modified_areas)
- {
- This->modified_areas--;
- start = This->maps[This->modified_areas].offset;
- len = This->maps[This->modified_areas].size;
- GL_EXTCALL(glBufferSubDataARB(This->buffer_type_hint, start, len, This->resource.allocatedMemory + start));
- checkGLcall("glBufferSubDataARB");
- }
- LEAVE_GL();
+ buffer_direct_upload(This, context->gl_info, flags);
context_release(context);
return;
@@ -915,7 +1061,7 @@ static void STDMETHODCALLTYPE buffer_PreLoad(IWineD3DBuffer *iface)
if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- buffer_get_sysmem(This);
+ buffer_get_sysmem(This, gl_info);
}
/* Now for each vertex in the buffer that needs conversion */
@@ -1033,7 +1179,7 @@ static WINED3DRESOURCETYPE STDMETHODCALLTYPE buffer_GetType(IWineD3DBuffer *ifac
/* IWineD3DBuffer methods */
-static DWORD buffer_sanitize_flags(DWORD flags)
+static DWORD buffer_sanitize_flags(struct wined3d_buffer *buffer, DWORD flags)
{
/* Not all flags make sense together, but Windows never returns an error. Catch the
* cases that could cause issues */
@@ -1055,6 +1201,11 @@ static DWORD buffer_sanitize_flags(DWORD flags)
WARN("WINED3DLOCK_DISCARD and WINED3DLOCK_NOOVERWRITE used together, ignoring\n");
return 0;
}
+ else if (flags & (WINED3DLOCK_DISCARD | WINED3DLOCK_NOOVERWRITE) && !(buffer->resource.usage & WINED3DUSAGE_DYNAMIC))
+ {
+ WARN("DISCARD or NOOVERWRITE lock on non-dynamic buffer, ignoring\n");
+ return 0;
+ }
return flags;
}
@@ -1082,10 +1233,11 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
{
struct wined3d_buffer *This = (struct wined3d_buffer *)iface;
LONG count;
+ BOOL dirty = buffer_is_dirty(This);
TRACE("iface %p, offset %u, size %u, data %p, flags %#x\n", iface, offset, size, data, flags);
- flags = buffer_sanitize_flags(flags);
+ flags = buffer_sanitize_flags(This, flags);
if (!(flags & WINED3DLOCK_READONLY))
{
if (!buffer_add_dirty_area(This, offset, size)) return E_OUTOFMEMORY;
@@ -1093,36 +1245,81 @@ static HRESULT STDMETHODCALLTYPE buffer_Map(IWineD3DBuffer *iface, UINT offset,
count = InterlockedIncrement(&This->lock_count);
- if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER) && This->buffer_object)
+ if (This->buffer_object)
{
- if(count == 1)
+ if(!(This->flags & WINED3D_BUFFER_DOUBLEBUFFER))
{
- IWineD3DDeviceImpl *device = This->resource.device;
- struct wined3d_context *context;
- const struct wined3d_gl_info *gl_info;
-
- if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
+ if(count == 1)
{
- IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
+ IWineD3DDeviceImpl *device = This->resource.device;
+ struct wined3d_context *context;
+ const struct wined3d_gl_info *gl_info;
+
+ if(This->buffer_type_hint == GL_ELEMENT_ARRAY_BUFFER_ARB)
+ {
+ IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
+ }
+
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+ ENTER_GL();
+ GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
+
+ if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ {
+ GLbitfield mapflags = buffer_gl_map_flags(flags);
+ This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
+ This->resource.size, mapflags));
+ checkGLcall("glMapBufferRange");
+ }
+ else
+ {
+ if(This->flags & WINED3D_BUFFER_APPLESYNC)
+ {
+ LEAVE_GL();
+ buffer_sync_apple(This, flags, gl_info);
+ ENTER_GL();
+ }
+ This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
+ checkGLcall("glMapBufferARB");
+ }
+ LEAVE_GL();
+
+ if (((DWORD_PTR) This->resource.allocatedMemory) & (RESOURCE_ALIGNMENT - 1))
+ {
+ WARN("Pointer %p is not %u byte aligned, falling back to double buffered operation\n",
+ This->resource.allocatedMemory, RESOURCE_ALIGNMENT);
+
+ ENTER_GL();
+ GL_EXTCALL(glUnmapBufferARB(This->buffer_type_hint));
+ checkGLcall("glUnmapBufferARB");
+ LEAVE_GL();
+ This->resource.allocatedMemory = NULL;
+
+ buffer_get_sysmem(This, gl_info);
+ TRACE("New pointer is %p\n", This->resource.allocatedMemory);
+ }
+ context_release(context);
+ }
+ }
+ else
+ {
+ if (dirty)
+ {
+ if (This->flags & WINED3D_BUFFER_NOSYNC && !(flags & WINED3DLOCK_NOOVERWRITE))
+ {
+ This->flags &= ~WINED3D_BUFFER_NOSYNC;
+ }
+ }
+ else if(flags & WINED3DLOCK_NOOVERWRITE)
+ {
+ This->flags |= WINED3D_BUFFER_NOSYNC;
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
- gl_info = context->gl_info;
- ENTER_GL();
- GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
-
- if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ if (flags & WINED3DLOCK_DISCARD)
{
- GLbitfield mapflags = buffer_gl_map_flags(flags);
- This->resource.allocatedMemory = GL_EXTCALL(glMapBufferRange(This->buffer_type_hint, 0,
- This->resource.size, mapflags));
+ This->flags |= WINED3D_BUFFER_DISCARD;
}
- else
- {
- This->resource.allocatedMemory = GL_EXTCALL(glMapBufferARB(This->buffer_type_hint, GL_READ_WRITE_ARB));
- }
- LEAVE_GL();
- context_release(context);
}
}
@@ -1169,7 +1366,7 @@ static HRESULT STDMETHODCALLTYPE buffer_Unmap(IWineD3DBuffer *iface)
IWineD3DDeviceImpl_MarkStateDirty(This->resource.device, STATE_INDEXBUFFER);
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
ENTER_GL();
GL_EXTCALL(glBindBufferARB(This->buffer_type_hint, This->buffer_object));
@@ -1251,7 +1448,7 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint,
const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, &device->adapter->gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, &device->adapter->gl_info);
HRESULT hr;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
BOOL dynamic_buffer_ok;
@@ -1276,7 +1473,8 @@ HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
TRACE("size %#x, usage %#x, format %s, memory @ %p, iface @ %p.\n", buffer->resource.size, buffer->resource.usage,
debug_d3dformat(buffer->resource.format_desc->format), buffer->resource.allocatedMemory, buffer);
- dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE] || gl_info->supported[ARB_MAP_BUFFER_RANGE];
+ /* GL_ARB_map_buffer_range is disabled for now due to numerous bugs and no gains */
+ dynamic_buffer_ok = gl_info->supported[APPLE_FLUSH_BUFFER_RANGE];
/* Observations show that drawStridedSlow is faster on dynamic VBs than converting +
* drawStridedFast (half-life 2 and others).
diff --git a/dll/directx/wine/wined3d/context.c b/dll/directx/wine/wined3d/context.c
index 08789855812..5304af2f408 100644
--- a/dll/directx/wine/wined3d/context.c
+++ b/dll/directx/wine/wined3d/context.c
@@ -28,8 +28,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
static DWORD wined3d_context_tls_idx;
/* FBO helper functions */
@@ -84,19 +82,19 @@ void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fb
}
/* GL locking is done by the caller */
-static void context_clean_fbo_attachments(const struct wined3d_gl_info *gl_info)
+static void context_clean_fbo_attachments(const struct wined3d_gl_info *gl_info, GLenum target)
{
unsigned int i;
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(target, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, 0, 0);
checkGLcall("glFramebufferTexture2D()");
}
- gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(target, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
checkGLcall("glFramebufferTexture2D()");
- gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glFramebufferTexture2D(target, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
checkGLcall("glFramebufferTexture2D()");
}
@@ -106,7 +104,7 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
const struct wined3d_gl_info *gl_info = context->gl_info;
context_bind_fbo(context, GL_FRAMEBUFFER, fbo);
- context_clean_fbo_attachments(gl_info);
+ context_clean_fbo_attachments(gl_info, GL_FRAMEBUFFER);
context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
gl_info->fbo_ops.glDeleteFramebuffers(1, fbo);
@@ -114,17 +112,18 @@ static void context_destroy_fbo(struct wined3d_context *context, GLuint *fbo)
}
/* GL locking is done by the caller */
-static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
+static void context_apply_attachment_filter_states(IWineD3DSurfaceImpl *surface)
{
- const IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
- IWineD3DDeviceImpl *device = surface_impl->resource.device;
IWineD3DBaseTextureImpl *texture_impl;
- BOOL update_minfilter = FALSE;
- BOOL update_magfilter = FALSE;
/* Update base texture states array */
- if (SUCCEEDED(IWineD3DSurface_GetContainer(surface, &IID_IWineD3DBaseTexture, (void **)&texture_impl)))
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&texture_impl)))
{
+ IWineD3DDeviceImpl *device = surface->resource.device;
+ BOOL update_minfilter = FALSE;
+ BOOL update_magfilter = FALSE;
+
if (texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] != WINED3DTEXF_POINT
|| texture_impl->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] != WINED3DTEXF_NONE)
{
@@ -146,82 +145,85 @@ static void context_apply_attachment_filter_states(IWineD3DSurface *surface)
}
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture_impl);
- }
- if (update_minfilter || update_magfilter)
- {
- GLenum target, bind_target;
- GLint old_binding;
-
- target = surface_impl->texture_target;
- if (target == GL_TEXTURE_2D)
+ if (update_minfilter || update_magfilter)
{
- bind_target = GL_TEXTURE_2D;
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
- } else if (target == GL_TEXTURE_RECTANGLE_ARB) {
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
- } else {
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
+ GLenum target, bind_target;
+ GLint old_binding;
+
+ target = surface->texture_target;
+ if (target == GL_TEXTURE_2D)
+ {
+ bind_target = GL_TEXTURE_2D;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
+ }
+ else if (target == GL_TEXTURE_RECTANGLE_ARB)
+ {
+ bind_target = GL_TEXTURE_RECTANGLE_ARB;
+ glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
+ }
+ else
+ {
+ bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ glGetIntegerv(GL_TEXTURE_BINDING_CUBE_MAP_ARB, &old_binding);
+ }
+
+ glBindTexture(bind_target, surface->texture_name);
+ if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glBindTexture(bind_target, old_binding);
}
- glBindTexture(bind_target, surface_impl->texture_name);
- if (update_minfilter) glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- if (update_magfilter) glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glBindTexture(bind_target, old_binding);
+ checkGLcall("apply_attachment_filter_states()");
}
-
- checkGLcall("apply_attachment_filter_states()");
}
/* GL locking is done by the caller */
void context_attach_depth_stencil_fbo(struct wined3d_context *context,
- GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer)
+ GLenum fbo_target, IWineD3DSurfaceImpl *depth_stencil, BOOL use_render_buffer)
{
- IWineD3DSurfaceImpl *depth_stencil_impl = (IWineD3DSurfaceImpl *)depth_stencil;
const struct wined3d_gl_info *gl_info = context->gl_info;
TRACE("Attach depth stencil %p\n", depth_stencil);
if (depth_stencil)
{
- DWORD format_flags = depth_stencil_impl->resource.format_desc->Flags;
+ DWORD format_flags = depth_stencil->resource.format_desc->Flags;
- if (use_render_buffer && depth_stencil_impl->current_renderbuffer)
+ if (use_render_buffer && depth_stencil->current_renderbuffer)
{
if (format_flags & WINED3DFMT_FLAG_DEPTH)
{
gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_DEPTH_ATTACHMENT,
- GL_RENDERBUFFER, depth_stencil_impl->current_renderbuffer->id);
+ GL_RENDERBUFFER, depth_stencil->current_renderbuffer->id);
checkGLcall("glFramebufferRenderbuffer()");
}
if (format_flags & WINED3DFMT_FLAG_STENCIL)
{
gl_info->fbo_ops.glFramebufferRenderbuffer(fbo_target, GL_STENCIL_ATTACHMENT,
- GL_RENDERBUFFER, depth_stencil_impl->current_renderbuffer->id);
+ GL_RENDERBUFFER, depth_stencil->current_renderbuffer->id);
checkGLcall("glFramebufferRenderbuffer()");
}
}
else
{
- surface_prepare_texture(depth_stencil_impl, FALSE);
+ surface_prepare_texture(depth_stencil, gl_info, FALSE);
context_apply_attachment_filter_states(depth_stencil);
if (format_flags & WINED3DFMT_FLAG_DEPTH)
{
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_DEPTH_ATTACHMENT,
- depth_stencil_impl->texture_target, depth_stencil_impl->texture_name,
- depth_stencil_impl->texture_level);
+ depth_stencil->texture_target, depth_stencil->texture_name,
+ depth_stencil->texture_level);
checkGLcall("glFramebufferTexture2D()");
}
if (format_flags & WINED3DFMT_FLAG_STENCIL)
{
gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_STENCIL_ATTACHMENT,
- depth_stencil_impl->texture_target, depth_stencil_impl->texture_name,
- depth_stencil_impl->texture_level);
+ depth_stencil->texture_target, depth_stencil->texture_name,
+ depth_stencil->texture_level);
checkGLcall("glFramebufferTexture2D()");
}
}
@@ -249,21 +251,20 @@ void context_attach_depth_stencil_fbo(struct wined3d_context *context,
}
/* GL locking is done by the caller */
-void context_attach_surface_fbo(const struct wined3d_context *context,
- GLenum fbo_target, DWORD idx, IWineD3DSurface *surface)
+static void context_attach_surface_fbo(const struct wined3d_context *context,
+ GLenum fbo_target, DWORD idx, IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *surface_impl = (IWineD3DSurfaceImpl *)surface;
const struct wined3d_gl_info *gl_info = context->gl_info;
TRACE("Attach surface %p to %u\n", surface, idx);
if (surface)
{
- surface_prepare_texture(surface_impl, FALSE);
+ surface_prepare_texture(surface, gl_info, FALSE);
context_apply_attachment_filter_states(surface);
- gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface_impl->texture_target,
- surface_impl->texture_name, surface_impl->texture_level);
+ gl_info->fbo_ops.glFramebufferTexture2D(fbo_target, GL_COLOR_ATTACHMENT0 + idx, surface->texture_target,
+ surface->texture_name, surface->texture_level);
checkGLcall("glFramebufferTexture2D()");
}
else
@@ -274,12 +275,12 @@ void context_attach_surface_fbo(const struct wined3d_context *context,
}
/* GL locking is done by the caller */
-static void context_check_fbo_status(struct wined3d_context *context)
+static void context_check_fbo_status(struct wined3d_context *context, GLenum target)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
GLenum status;
- status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ status = gl_info->fbo_ops.glCheckFramebufferStatus(target);
if (status == GL_FRAMEBUFFER_COMPLETE)
{
TRACE("FBO complete\n");
@@ -297,7 +298,7 @@ static void context_check_fbo_status(struct wined3d_context *context)
/* Dump the FBO attachments */
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- attachment = (IWineD3DSurfaceImpl *)context->current_fbo->render_targets[i];
+ attachment = context->current_fbo->render_targets[i];
if (attachment)
{
FIXME("\tColor attachment %d: (%p) %s %ux%u\n",
@@ -305,7 +306,7 @@ static void context_check_fbo_status(struct wined3d_context *context)
attachment->pow2Width, attachment->pow2Height);
}
}
- attachment = (IWineD3DSurfaceImpl *)context->current_fbo->depth_stencil;
+ attachment = context->current_fbo->depth_stencil;
if (attachment)
{
FIXME("\tDepth attachment: (%p) %s %ux%u\n",
@@ -315,16 +316,16 @@ static void context_check_fbo_status(struct wined3d_context *context)
}
}
-static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *context)
+static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *context,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry;
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(*entry));
entry->render_targets = HeapAlloc(GetProcessHeap(), 0, gl_info->limits.buffers * sizeof(*entry->render_targets));
- memcpy(entry->render_targets, device->render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
- entry->depth_stencil = device->stencilBufferTarget;
+ memcpy(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
+ entry->depth_stencil = depth_stencil;
entry->attached = FALSE;
entry->id = 0;
@@ -332,16 +333,17 @@ static struct fbo_entry *context_create_fbo_entry(struct wined3d_context *contex
}
/* GL locking is done by the caller */
-static void context_reuse_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
+static void context_reuse_fbo_entry(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil,
+ struct fbo_entry *entry)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
- context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id);
- context_clean_fbo_attachments(gl_info);
+ context_bind_fbo(context, target, &entry->id);
+ context_clean_fbo_attachments(gl_info, target);
- memcpy(entry->render_targets, device->render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
- entry->depth_stencil = device->stencilBufferTarget;
+ memcpy(entry->render_targets, render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets));
+ entry->depth_stencil = depth_stencil;
entry->attached = FALSE;
}
@@ -361,17 +363,17 @@ static void context_destroy_fbo_entry(struct wined3d_context *context, struct fb
/* GL locking is done by the caller */
-static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
+static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry;
LIST_FOR_EACH_ENTRY(entry, &context->fbo_list, struct fbo_entry, entry)
{
if (!memcmp(entry->render_targets,
- device->render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets))
- && entry->depth_stencil == device->stencilBufferTarget)
+ render_targets, gl_info->limits.buffers * sizeof(*entry->render_targets))
+ && entry->depth_stencil == depth_stencil)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_list, &entry->entry);
@@ -381,14 +383,14 @@ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
if (context->fbo_entry_count < WINED3D_MAX_FBO_ENTRIES)
{
- entry = context_create_fbo_entry(context);
+ entry = context_create_fbo_entry(context, render_targets, depth_stencil);
list_add_head(&context->fbo_list, &entry->entry);
++context->fbo_entry_count;
}
else
{
entry = LIST_ENTRY(list_tail(&context->fbo_list), struct fbo_entry, entry);
- context_reuse_fbo_entry(context, entry);
+ context_reuse_fbo_entry(context, target, render_targets, depth_stencil, entry);
list_remove(&entry->entry);
list_add_head(&context->fbo_list, &entry->entry);
}
@@ -397,32 +399,28 @@ static struct fbo_entry *context_find_fbo_entry(struct wined3d_context *context)
}
/* GL locking is done by the caller */
-static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_entry *entry)
+static void context_apply_fbo_entry(struct wined3d_context *context, GLenum target, struct fbo_entry *entry)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i;
- context_bind_fbo(context, GL_FRAMEBUFFER, &entry->id);
+ context_bind_fbo(context, target, &entry->id);
if (!entry->attached)
{
/* Apply render targets */
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- IWineD3DSurface *render_target = device->render_targets[i];
- context_attach_surface_fbo(context, GL_FRAMEBUFFER, i, render_target);
+ context_attach_surface_fbo(context, target, i, entry->render_targets[i]);
}
/* Apply depth targets */
- if (device->stencilBufferTarget)
+ if (entry->depth_stencil)
{
- unsigned int w = ((IWineD3DSurfaceImpl *)device->render_targets[0])->pow2Width;
- unsigned int h = ((IWineD3DSurfaceImpl *)device->render_targets[0])->pow2Height;
-
- surface_set_compatible_renderbuffer(device->stencilBufferTarget, w, h);
+ surface_set_compatible_renderbuffer(entry->depth_stencil,
+ entry->render_targets[0]->pow2Width, entry->render_targets[0]->pow2Height);
}
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, device->stencilBufferTarget, TRUE);
+ context_attach_depth_stencil_fbo(context, target, entry->depth_stencil, TRUE);
entry->attached = TRUE;
}
@@ -430,24 +428,17 @@ static void context_apply_fbo_entry(struct wined3d_context *context, struct fbo_
{
for (i = 0; i < gl_info->limits.buffers; ++i)
{
- if (device->render_targets[i])
- context_apply_attachment_filter_states(device->render_targets[i]);
+ if (entry->render_targets[i])
+ context_apply_attachment_filter_states(entry->render_targets[i]);
}
- if (device->stencilBufferTarget)
- context_apply_attachment_filter_states(device->stencilBufferTarget);
- }
-
- for (i = 0; i < gl_info->limits.buffers; ++i)
- {
- if (device->render_targets[i])
- device->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
- else
- device->draw_buffers[i] = GL_NONE;
+ if (entry->depth_stencil)
+ context_apply_attachment_filter_states(entry->depth_stencil);
}
}
/* GL locking is done by the caller */
-static void context_apply_fbo_state(struct wined3d_context *context)
+static void context_apply_fbo_state(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl **render_targets, IWineD3DSurfaceImpl *depth_stencil)
{
struct fbo_entry *entry, *entry2;
@@ -456,16 +447,39 @@ static void context_apply_fbo_state(struct wined3d_context *context)
context_destroy_fbo_entry(context, entry);
}
- if (context->render_offscreen)
+ if (context->rebind_fbo)
{
- context->current_fbo = context_find_fbo_entry(context);
- context_apply_fbo_entry(context, context->current_fbo);
- } else {
- context->current_fbo = NULL;
context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ context->rebind_fbo = FALSE;
}
- context_check_fbo_status(context);
+ if (render_targets)
+ {
+ context->current_fbo = context_find_fbo_entry(context, target, render_targets, depth_stencil);
+ context_apply_fbo_entry(context, target, context->current_fbo);
+ }
+ else
+ {
+ context->current_fbo = NULL;
+ context_bind_fbo(context, target, NULL);
+ }
+
+ context_check_fbo_status(context, target);
+}
+
+/* GL locking is done by the caller */
+void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil)
+{
+ if (surface_is_offscreen(render_target))
+ {
+ context->blit_targets[0] = render_target;
+ context_apply_fbo_state(context, target, context->blit_targets, depth_stencil);
+ }
+ else
+ {
+ context_apply_fbo_state(context, target, NULL, NULL);
+ }
}
/* Context activation is done by the caller. */
@@ -614,13 +628,13 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
const struct wined3d_gl_info *gl_info = context->gl_info;
struct fbo_entry *entry, *entry2;
- if (context->current_rt == (IWineD3DSurface *)resource) context->current_rt = NULL;
+ if (context->current_rt == (IWineD3DSurfaceImpl *)resource) context->current_rt = NULL;
LIST_FOR_EACH_ENTRY_SAFE(entry, entry2, &context->fbo_list, struct fbo_entry, entry)
{
UINT j;
- if (entry->depth_stencil == (IWineD3DSurface *)resource)
+ if (entry->depth_stencil == (IWineD3DSurfaceImpl *)resource)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_destroy_list, &entry->entry);
@@ -629,7 +643,7 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
for (j = 0; j < gl_info->limits.buffers; ++j)
{
- if (entry->render_targets[j] == (IWineD3DSurface *)resource)
+ if (entry->render_targets[j] == (IWineD3DSurfaceImpl *)resource)
{
list_remove(&entry->entry);
list_add_head(&context->fbo_destroy_list, &entry->entry);
@@ -647,6 +661,115 @@ void context_resource_released(IWineD3DDevice *iface, IWineD3DResource *resource
}
}
+void context_surface_update(struct wined3d_context *context, IWineD3DSurfaceImpl *surface)
+{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ struct fbo_entry *entry = context->current_fbo;
+ unsigned int i;
+
+ if (!entry || context->rebind_fbo) return;
+
+ for (i = 0; i < gl_info->limits.buffers; ++i)
+ {
+ if (surface == entry->render_targets[i])
+ {
+ TRACE("Updated surface %p is bound as color attachment %u to the current FBO.\n", surface, i);
+ context->rebind_fbo = TRUE;
+ return;
+ }
+ }
+
+ if (surface == entry->depth_stencil)
+ {
+ TRACE("Updated surface %p is bound as depth attachment to the current FBO.\n", surface);
+ context->rebind_fbo = TRUE;
+ }
+}
+
+static BOOL context_set_pixel_format(const struct wined3d_gl_info *gl_info, HDC dc, int format)
+{
+ int current = GetPixelFormat(dc);
+
+ if (current == format) return TRUE;
+
+ if (!current)
+ {
+ if (!SetPixelFormat(dc, format, NULL))
+ {
+ ERR("Failed to set pixel format %d on device context %p, last error %#x.\n",
+ format, dc, GetLastError());
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ /* By default WGL doesn't allow pixel format adjustments but we need it
+ * here. For this reason there's a Wine specific wglSetPixelFormat()
+ * which allows us to set the pixel format multiple times. Only use it
+ * when really needed. */
+ if (gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH])
+ {
+ if (!GL_EXTCALL(wglSetPixelFormatWINE(dc, format, NULL)))
+ {
+ ERR("wglSetPixelFormatWINE failed to set pixel format %d on device context %p.\n",
+ format, dc);
+ return FALSE;
+ }
+ return TRUE;
+ }
+
+ /* OpenGL doesn't allow pixel format adjustments. Print an error and
+ * continue using the old format. There's a big chance that the old
+ * format works although with a performance hit and perhaps rendering
+ * errors. */
+ ERR("Unable to set pixel format %d on device context %p. Already using format %d.\n",
+ format, dc, current);
+ return TRUE;
+}
+
+static void context_update_window(struct wined3d_context *context)
+{
+ TRACE("Updating context %p window from %p to %p.\n",
+ context, context->win_handle, context->swapchain->win_handle);
+
+ if (context->valid)
+ {
+ if (!ReleaseDC(context->win_handle, context->hdc))
+ {
+ ERR("Failed to release device context %p, last error %#x.\n",
+ context->hdc, GetLastError());
+ }
+ }
+ else context->valid = 1;
+
+ context->win_handle = context->swapchain->win_handle;
+
+ if (!(context->hdc = GetDC(context->win_handle)))
+ {
+ ERR("Failed to get a device context for window %p.\n", context->win_handle);
+ goto err;
+ }
+
+ if (!context_set_pixel_format(context->gl_info, context->hdc, context->pixel_format))
+ {
+ ERR("Failed to set pixel format %d on device context %p.\n",
+ context->pixel_format, context->hdc);
+ goto err;
+ }
+
+ if (!pwglMakeCurrent(context->hdc, context->glCtx))
+ {
+ ERR("Failed to make GL context %p current on device context %p, last error %#x.\n",
+ context->glCtx, context->hdc, GetLastError());
+ goto err;
+ }
+
+ return;
+
+err:
+ context->valid = 0;
+}
+
static void context_validate(struct wined3d_context *context)
{
HWND wnd = WindowFromDC(context->hdc);
@@ -657,6 +780,9 @@ static void context_validate(struct wined3d_context *context)
context->hdc, wnd, context->win_handle);
context->valid = 0;
}
+
+ if (context->win_handle != context->swapchain->win_handle)
+ context_update_window(context);
}
static void context_destroy_gl_resources(struct wined3d_context *context)
@@ -713,11 +839,6 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
if (context->valid)
{
- if (context->src_fbo)
- {
- TRACE("Destroy src FBO %d\n", context->src_fbo);
- context_destroy_fbo(context, &context->src_fbo);
- }
if (context->dst_fbo)
{
TRACE("Destroy dst FBO %d\n", context->dst_fbo);
@@ -772,15 +893,7 @@ static void context_destroy_gl_resources(struct wined3d_context *context)
ERR("Failed to disable GL context.\n");
}
- if (context->pbuffer)
- {
- GL_EXTCALL(wglReleasePbufferDCARB(context->pbuffer, context->hdc));
- GL_EXTCALL(wglDestroyPbufferARB(context->pbuffer));
- }
- else
- {
- ReleaseDC(context->win_handle, context->hdc);
- }
+ ReleaseDC(context->win_handle, context->hdc);
if (!pwglDeleteContext(context->glCtx))
{
@@ -928,68 +1041,10 @@ static void Context_MarkStateDirty(struct wined3d_context *context, DWORD state,
context->isStateDirty[idx] |= (1 << shift);
}
-/*****************************************************************************
- * AddContextToArray
- *
- * Adds a context to the context array. Helper function for context_create().
- *
- * This method is not called in performance-critical code paths, only when a
- * new render target or swapchain is created. Thus performance is not an issue
- * here.
- *
- * Params:
- * This: Device to add the context for
- * hdc: device context
- * glCtx: WGL context to add
- * pbuffer: optional pbuffer used with this context
- *
- *****************************************************************************/
-static struct wined3d_context *AddContextToArray(IWineD3DDeviceImpl *This,
- HWND win_handle, HDC hdc, HGLRC glCtx, HPBUFFERARB pbuffer)
-{
- struct wined3d_context **oldArray = This->contexts;
- DWORD state;
-
- This->contexts = HeapAlloc(GetProcessHeap(), 0, sizeof(*This->contexts) * (This->numContexts + 1));
- if(This->contexts == NULL) {
- ERR("Unable to grow the context array\n");
- This->contexts = oldArray;
- return NULL;
- }
- if(oldArray) {
- memcpy(This->contexts, oldArray, sizeof(*This->contexts) * This->numContexts);
- }
-
- This->contexts[This->numContexts] = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(**This->contexts));
- if(This->contexts[This->numContexts] == NULL) {
- ERR("Unable to allocate a new context\n");
- HeapFree(GetProcessHeap(), 0, This->contexts);
- This->contexts = oldArray;
- return NULL;
- }
-
- This->contexts[This->numContexts]->hdc = hdc;
- This->contexts[This->numContexts]->glCtx = glCtx;
- This->contexts[This->numContexts]->pbuffer = pbuffer;
- This->contexts[This->numContexts]->win_handle = win_handle;
- HeapFree(GetProcessHeap(), 0, oldArray);
-
- /* Mark all states dirty to force a proper initialization of the states on the first use of the context
- */
- for(state = 0; state <= STATE_HIGHEST; state++) {
- if (This->StateTable[state].representative)
- Context_MarkStateDirty(This->contexts[This->numContexts], state, This->StateTable);
- }
-
- This->numContexts++;
- TRACE("Created context %p\n", This->contexts[This->numContexts - 1]);
- return This->contexts[This->numContexts - 1];
-}
-
/* This function takes care of WineD3D pixel format selection. */
static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
- const struct GlPixelFormatDesc *color_format_desc, const struct GlPixelFormatDesc *ds_format_desc,
- BOOL auxBuffers, int numSamples, BOOL pbuffer, BOOL findCompatible)
+ const struct wined3d_format_desc *color_format_desc, const struct wined3d_format_desc *ds_format_desc,
+ BOOL auxBuffers, int numSamples, BOOL findCompatible)
{
int iPixelFormat=0;
unsigned int matchtry;
@@ -1019,9 +1074,9 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
int i = 0;
int nCfgs = This->adapter->nCfgs;
- TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, pbuffer=%d, findCompatible=%d\n",
+ TRACE("ColorFormat=%s, DepthStencilFormat=%s, auxBuffers=%d, numSamples=%d, findCompatible=%d\n",
debug_d3dformat(color_format_desc->format), debug_d3dformat(ds_format_desc->format),
- auxBuffers, numSamples, pbuffer, findCompatible);
+ auxBuffers, numSamples, findCompatible);
if (!getColorBits(color_format_desc, &redBits, &greenBits, &blueBits, &alphaBits, &colorBits))
{
@@ -1030,23 +1085,6 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
return 0;
}
- /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate.
- * You are able to add a depth + stencil surface at a later stage when you need it.
- * In order to support this properly in WineD3D we need the ability to recreate the opengl context and
- * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new
- * context, need torecreate shaders, textures and other resources.
- *
- * The context manager already takes care of the state problem and for the other tasks code from Reset
- * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now.
- * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the
- * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this
- * issue needs to be fixed. */
- if (ds_format_desc->format != WINED3DFMT_D24_UNORM_S8_UINT)
- {
- FIXME("Add OpenGL context recreation support to SetDepthStencilSurface\n");
- ds_format_desc = getFormatDescEntry(WINED3DFMT_D24_UNORM_S8_UINT, &This->adapter->gl_info);
- }
-
getDepthStencilBits(ds_format_desc, &depthBits, &stencilBits);
for(matchtry = 0; matchtry < (sizeof(matches) / sizeof(matches[0])) && !iPixelFormat; matchtry++) {
@@ -1059,18 +1097,14 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
if(cfg->iPixelType != WGL_TYPE_RGBA_ARB)
continue;
- /* In window mode (!pbuffer) we need a window drawable format and double buffering. */
- if(!pbuffer && !(cfg->windowDrawable && cfg->doubleBuffer))
+ /* In window mode we need a window drawable format and double buffering. */
+ if(!(cfg->windowDrawable && cfg->doubleBuffer))
continue;
/* We like to have aux buffers in backbuffer mode */
if(auxBuffers && !cfg->auxBuffers && matches[matchtry].require_aux)
continue;
- /* In pbuffer-mode we need a pbuffer-capable format but we don't want double buffering */
- if(pbuffer && (!cfg->pbufferDrawable || cfg->doubleBuffer))
- continue;
-
if(matches[matchtry].exact_color) {
if(cfg->redSize != redBits)
continue;
@@ -1167,227 +1201,174 @@ static int WineD3D_ChoosePixelFormat(IWineD3DDeviceImpl *This, HDC hdc,
/*****************************************************************************
* context_create
*
- * Creates a new context for a window, or a pbuffer context.
+ * Creates a new context.
*
* * Params:
* This: Device to activate the context for
* target: Surface this context will render to
* win_handle: handle to the window which we are drawing to
- * create_pbuffer: tells whether to create a pbuffer or not
* pPresentParameters: contains the pixelformats to use for onscreen rendering
*
*****************************************************************************/
-struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target,
- HWND win_handle, BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *pPresentParms)
+struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target,
+ const struct wined3d_format_desc *ds_format_desc)
{
- const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
- struct wined3d_context *ret = NULL;
- HPBUFFERARB pbuffer = NULL;
+ IWineD3DDeviceImpl *device = swapchain->device;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ const struct wined3d_format_desc *color_format_desc;
+ struct wined3d_context *ret;
+ PIXELFORMATDESCRIPTOR pfd;
+ BOOL auxBuffers = FALSE;
+ int numSamples = 0;
+ int pixel_format;
unsigned int s;
+ DWORD state;
HGLRC ctx;
HDC hdc;
- TRACE("(%p): Creating a %s context for render target %p\n", This, create_pbuffer ? "offscreen" : "onscreen", target);
+ TRACE("swapchain %p, target %p, window %p.\n", swapchain, target, swapchain->win_handle);
- if(create_pbuffer) {
- HDC hdc_parent = GetDC(win_handle);
- int iPixelFormat = 0;
+ ret = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*ret));
+ if (!ret)
+ {
+ ERR("Failed to allocate context memory.\n");
+ return NULL;
+ }
- IWineD3DSurface *StencilSurface = This->stencilBufferTarget;
- const struct GlPixelFormatDesc *ds_format_desc = StencilSurface
- ? ((IWineD3DSurfaceImpl *)StencilSurface)->resource.format_desc
- : getFormatDescEntry(WINED3DFMT_UNKNOWN, &This->adapter->gl_info);
+ if (!(hdc = GetDC(swapchain->win_handle)))
+ {
+ ERR("Failed to retrieve a device context.\n");
+ goto out;
+ }
- /* Try to find a pixel format with pbuffer support. */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format_desc,
- ds_format_desc, FALSE /* auxBuffers */, 0 /* numSamples */, TRUE /* PBUFFER */,
- FALSE /* findCompatible */);
- if(!iPixelFormat) {
- TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
+ color_format_desc = target->resource.format_desc;
- /* For some reason we weren't able to find a format, try to find something instead of crashing.
- * A reason for failure could have been wglChoosePixelFormatARB strictness. */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc_parent, target->resource.format_desc,
- ds_format_desc, FALSE /* auxBuffer */, 0 /* numSamples */, TRUE /* PBUFFER */,
- TRUE /* findCompatible */);
- }
+ /* In case of ORM_BACKBUFFER, make sure to request an alpha component for
+ * X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
+ if (wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER)
+ {
+ auxBuffers = TRUE;
- /* This shouldn't happen as ChoosePixelFormat always returns something */
- if(!iPixelFormat) {
- ERR("Unable to locate a pixel format for a pbuffer\n");
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
+ if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, gl_info);
+ else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
+ }
- TRACE("Creating a pBuffer drawable for the new context\n");
- pbuffer = GL_EXTCALL(wglCreatePbufferARB(hdc_parent, iPixelFormat, target->currentDesc.Width, target->currentDesc.Height, 0));
- if(!pbuffer) {
- ERR("Cannot create a pbuffer\n");
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
+ /* DirectDraw supports 8bit paletted render targets and these are used by
+ * old games like Starcraft and C&C. Most modern hardware doesn't support
+ * 8bit natively so we perform some form of 8bit -> 32bit conversion. The
+ * conversion (ab)uses the alpha component for storing the palette index.
+ * For this reason we require a format with 8bit alpha, so request
+ * A8R8G8B8. */
+ if (color_format_desc->format == WINED3DFMT_P8_UINT)
+ color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
- /* In WGL a pbuffer is 'wrapped' inside a HDC to 'fool' wglMakeCurrent */
- hdc = GL_EXTCALL(wglGetPbufferDCARB(pbuffer));
- if(!hdc) {
- ERR("Cannot get a HDC for pbuffer (%p)\n", pbuffer);
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- ReleaseDC(win_handle, hdc_parent);
- goto out;
- }
- ReleaseDC(win_handle, hdc_parent);
- } else {
- PIXELFORMATDESCRIPTOR pfd;
- int iPixelFormat;
- int res;
- const struct GlPixelFormatDesc *color_format_desc = target->resource.format_desc;
- const struct GlPixelFormatDesc *ds_format_desc = getFormatDescEntry(WINED3DFMT_UNKNOWN,
- &This->adapter->gl_info);
- BOOL auxBuffers = FALSE;
- int numSamples = 0;
-
- hdc = GetDC(win_handle);
- if(hdc == NULL) {
- ERR("Cannot retrieve a device context!\n");
- goto out;
- }
-
- /* In case of ORM_BACKBUFFER, make sure to request an alpha component for X4R4G4B4/X8R8G8B8 as we might need it for the backbuffer. */
- if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) {
- auxBuffers = TRUE;
-
- if (color_format_desc->format == WINED3DFMT_B4G4R4X4_UNORM)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B4G4R4A4_UNORM, &This->adapter->gl_info);
- else if (color_format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
- }
-
- /* DirectDraw supports 8bit paletted render targets and these are used by old games like Starcraft and C&C.
- * Most modern hardware doesn't support 8bit natively so we perform some form of 8bit -> 32bit conversion.
- * The conversion (ab)uses the alpha component for storing the palette index. For this reason we require
- * a format with 8bit alpha, so request A8R8G8B8. */
- if (color_format_desc->format == WINED3DFMT_P8_UINT)
- color_format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, &This->adapter->gl_info);
-
- /* Retrieve the depth stencil format from the present parameters.
- * The choice of the proper format can give a nice performance boost
- * in case of GPU limited programs. */
- if(pPresentParms->EnableAutoDepthStencil) {
- TRACE("pPresentParms->EnableAutoDepthStencil=enabled; using AutoDepthStencilFormat=%s\n", debug_d3dformat(pPresentParms->AutoDepthStencilFormat));
- ds_format_desc = getFormatDescEntry(pPresentParms->AutoDepthStencilFormat, &This->adapter->gl_info);
- }
-
- /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD */
- if(pPresentParms->MultiSampleType && (pPresentParms->SwapEffect == WINED3DSWAPEFFECT_DISCARD)) {
- if (!gl_info->supported[ARB_MULTISAMPLE])
- ERR("The program is requesting multisampling without support!\n");
- else
- {
- TRACE("Requesting multisample type %#x.\n", pPresentParms->MultiSampleType);
- numSamples = pPresentParms->MultiSampleType;
- }
- }
-
- /* Try to find a pixel format which matches our requirements */
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
- auxBuffers, numSamples, FALSE /* PBUFFER */, FALSE /* findCompatible */);
-
- /* Try to locate a compatible format if we weren't able to find anything */
- if(!iPixelFormat) {
- TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
- iPixelFormat = WineD3D_ChoosePixelFormat(This, hdc, color_format_desc, ds_format_desc,
- auxBuffers, 0 /* numSamples */, FALSE /* PBUFFER */, TRUE /* findCompatible */ );
- }
-
- /* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
- if(!iPixelFormat) {
- ERR("Can't find a suitable iPixelFormat\n");
- return NULL;
- }
-
- DescribePixelFormat(hdc, iPixelFormat, sizeof(pfd), &pfd);
- res = SetPixelFormat(hdc, iPixelFormat, NULL);
- if(!res) {
- int oldPixelFormat = GetPixelFormat(hdc);
-
- /* By default WGL doesn't allow pixel format adjustments but we need it here.
- * For this reason there is a WINE-specific wglSetPixelFormat which allows you to
- * set the pixel format multiple times. Only use it when it is really needed. */
-
- if(oldPixelFormat == iPixelFormat) {
- /* We don't have to do anything as the formats are the same :) */
- }
- else if (oldPixelFormat && gl_info->supported[WGL_WINE_PIXEL_FORMAT_PASSTHROUGH])
- {
- res = GL_EXTCALL(wglSetPixelFormatWINE(hdc, iPixelFormat, NULL));
-
- if(!res) {
- ERR("wglSetPixelFormatWINE failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return NULL;
- }
- } else if(oldPixelFormat) {
- /* OpenGL doesn't allow pixel format adjustments. Print an error and continue using the old format.
- * There's a big chance that the old format works although with a performance hit and perhaps rendering errors. */
- ERR("HDC=%p is already set to iPixelFormat=%d and OpenGL doesn't allow changes!\n", hdc, oldPixelFormat);
- } else {
- ERR("SetPixelFormat failed on HDC=%p for iPixelFormat=%d\n", hdc, iPixelFormat);
- return NULL;
- }
+ /* D3D only allows multisampling when SwapEffect is set to WINED3DSWAPEFFECT_DISCARD. */
+ if (swapchain->presentParms.MultiSampleType && (swapchain->presentParms.SwapEffect == WINED3DSWAPEFFECT_DISCARD))
+ {
+ if (!gl_info->supported[ARB_MULTISAMPLE])
+ WARN("The application is requesting multisampling without support.\n");
+ else
+ {
+ TRACE("Requesting multisample type %#x.\n", swapchain->presentParms.MultiSampleType);
+ numSamples = swapchain->presentParms.MultiSampleType;
}
}
- ctx = pwglCreateContext(hdc);
- if (This->numContexts)
+ /* Try to find a pixel format which matches our requirements. */
+ pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format_desc, ds_format_desc,
+ auxBuffers, numSamples, FALSE /* findCompatible */);
+
+ /* Try to locate a compatible format if we weren't able to find anything. */
+ if (!pixel_format)
{
- if (!pwglShareLists(This->contexts[0]->glCtx, ctx))
+ TRACE("Trying to locate a compatible pixel format because an exact match failed.\n");
+ pixel_format = WineD3D_ChoosePixelFormat(device, hdc, color_format_desc, ds_format_desc,
+ auxBuffers, 0 /* numSamples */, TRUE /* findCompatible */);
+ }
+
+ /* If we still don't have a pixel format, something is very wrong as ChoosePixelFormat barely fails */
+ if (!pixel_format)
+ {
+ ERR("Can't find a suitable pixel format.\n");
+ goto out;
+ }
+
+ DescribePixelFormat(hdc, pixel_format, sizeof(pfd), &pfd);
+ if (!context_set_pixel_format(gl_info, hdc, pixel_format))
+ {
+ ERR("Failed to set pixel format %d on device context %p.\n", pixel_format, hdc);
+ goto out;
+ }
+
+ ctx = pwglCreateContext(hdc);
+ if (device->numContexts)
+ {
+ if (!pwglShareLists(device->contexts[0]->glCtx, ctx))
{
DWORD err = GetLastError();
ERR("wglShareLists(%p, %p) failed, last error %#x.\n",
- This->contexts[0]->glCtx, ctx, err);
+ device->contexts[0]->glCtx, ctx, err);
}
}
if(!ctx) {
ERR("Failed to create a WGL context\n");
- if(create_pbuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- }
goto out;
}
- ret = AddContextToArray(This, win_handle, hdc, ctx, pbuffer);
- if(!ret) {
+
+ if (!device_context_add(device, ret))
+ {
ERR("Failed to add the newly created context to the context list\n");
if (!pwglDeleteContext(ctx))
{
DWORD err = GetLastError();
ERR("wglDeleteContext(%p) failed, last error %#x.\n", ctx, err);
}
- if(create_pbuffer) {
- GL_EXTCALL(wglReleasePbufferDCARB(pbuffer, hdc));
- GL_EXTCALL(wglDestroyPbufferARB(pbuffer));
- }
goto out;
}
- ret->valid = 1;
- ret->gl_info = &This->adapter->gl_info;
- ret->surface = (IWineD3DSurface *) target;
- ret->current_rt = (IWineD3DSurface *)target;
- ret->render_offscreen = surface_is_offscreen((IWineD3DSurface *) target);
- ret->draw_buffer_dirty = TRUE;
+
+ ret->gl_info = gl_info;
+
+ /* Mark all states dirty to force a proper initialization of the states
+ * on the first use of the context. */
+ for (state = 0; state <= STATE_HIGHEST; ++state)
+ {
+ if (device->StateTable[state].representative)
+ Context_MarkStateDirty(ret, state, device->StateTable);
+ }
+
+ ret->swapchain = swapchain;
+ ret->current_rt = target;
ret->tid = GetCurrentThreadId();
- if(This->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *) This)) {
+
+ ret->render_offscreen = surface_is_offscreen(target);
+ ret->draw_buffer_dirty = TRUE;
+ ret->valid = 1;
+
+ ret->glCtx = ctx;
+ ret->win_handle = swapchain->win_handle;
+ ret->hdc = hdc;
+ ret->pixel_format = pixel_format;
+
+ if (device->shader_backend->shader_dirtifyable_constants((IWineD3DDevice *)device))
+ {
/* Create the dirty constants array and initialize them to dirty */
ret->vshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
- sizeof(*ret->vshader_const_dirty) * This->d3d_vshader_constantF);
+ sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
ret->pshader_const_dirty = HeapAlloc(GetProcessHeap(), 0,
- sizeof(*ret->pshader_const_dirty) * This->d3d_pshader_constantF);
+ sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
memset(ret->vshader_const_dirty, 1,
- sizeof(*ret->vshader_const_dirty) * This->d3d_vshader_constantF);
+ sizeof(*ret->vshader_const_dirty) * device->d3d_vshader_constantF);
memset(ret->pshader_const_dirty, 1,
- sizeof(*ret->pshader_const_dirty) * This->d3d_pshader_constantF);
+ sizeof(*ret->pshader_const_dirty) * device->d3d_pshader_constantF);
}
+ ret->blit_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ gl_info->limits.buffers * sizeof(*ret->blit_targets));
+ if (!ret->blit_targets) goto out;
+
ret->free_occlusion_query_size = 4;
ret->free_occlusion_queries = HeapAlloc(GetProcessHeap(), 0,
ret->free_occlusion_query_size * sizeof(*ret->free_occlusion_queries));
@@ -1440,10 +1421,10 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
checkGLcall("glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);");
- glPixelStorei(GL_PACK_ALIGNMENT, This->surface_alignment);
- checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, This->surface_alignment);");
- glPixelStorei(GL_UNPACK_ALIGNMENT, This->surface_alignment);
- checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, This->surface_alignment);");
+ glPixelStorei(GL_PACK_ALIGNMENT, device->surface_alignment);
+ checkGLcall("glPixelStorei(GL_PACK_ALIGNMENT, device->surface_alignment);");
+ glPixelStorei(GL_UNPACK_ALIGNMENT, device->surface_alignment);
+ checkGLcall("glPixelStorei(GL_UNPACK_ALIGNMENT, device->surface_alignment);");
if (gl_info->supported[APPLE_CLIENT_STORAGE])
{
@@ -1512,83 +1493,22 @@ struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurface
LEAVE_GL();
- This->frag_pipe->enable_extension((IWineD3DDevice *) This, TRUE);
+ device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+
+ TRACE("Created context %p.\n", ret);
return ret;
out:
- if (ret)
- {
- HeapFree(GetProcessHeap(), 0, ret->free_event_queries);
- HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries);
- HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty);
- HeapFree(GetProcessHeap(), 0, ret->vshader_const_dirty);
- HeapFree(GetProcessHeap(), 0, ret);
- }
+ HeapFree(GetProcessHeap(), 0, ret->free_event_queries);
+ HeapFree(GetProcessHeap(), 0, ret->free_occlusion_queries);
+ HeapFree(GetProcessHeap(), 0, ret->blit_targets);
+ HeapFree(GetProcessHeap(), 0, ret->pshader_const_dirty);
+ HeapFree(GetProcessHeap(), 0, ret->vshader_const_dirty);
+ HeapFree(GetProcessHeap(), 0, ret);
return NULL;
}
-/*****************************************************************************
- * RemoveContextFromArray
- *
- * Removes a context from the context manager. The opengl context is not
- * destroyed or unset. context is not a valid pointer after that call.
- *
- * Similar to the former call this isn't a performance critical function. A
- * helper function for context_destroy().
- *
- * Params:
- * This: Device to activate the context for
- * context: Context to remove
- *
- *****************************************************************************/
-static void RemoveContextFromArray(IWineD3DDeviceImpl *This, struct wined3d_context *context)
-{
- struct wined3d_context **new_array;
- BOOL found = FALSE;
- UINT i;
-
- TRACE("Removing ctx %p\n", context);
-
- for (i = 0; i < This->numContexts; ++i)
- {
- if (This->contexts[i] == context)
- {
- found = TRUE;
- break;
- }
- }
-
- if (!found)
- {
- ERR("Context %p doesn't exist in context array\n", context);
- return;
- }
-
- while (i < This->numContexts - 1)
- {
- This->contexts[i] = This->contexts[i + 1];
- ++i;
- }
-
- --This->numContexts;
- if (!This->numContexts)
- {
- HeapFree(GetProcessHeap(), 0, This->contexts);
- This->contexts = NULL;
- return;
- }
-
- new_array = HeapReAlloc(GetProcessHeap(), 0, This->contexts, This->numContexts * sizeof(*This->contexts));
- if (!new_array)
- {
- ERR("Failed to shrink context array. Oh well.\n");
- return;
- }
-
- This->contexts = new_array;
-}
-
/*****************************************************************************
* context_destroy
*
@@ -1617,9 +1537,10 @@ void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context)
destroy = FALSE;
}
+ HeapFree(GetProcessHeap(), 0, context->blit_targets);
HeapFree(GetProcessHeap(), 0, context->vshader_const_dirty);
HeapFree(GetProcessHeap(), 0, context->pshader_const_dirty);
- RemoveContextFromArray(This, context);
+ device_context_remove(This, context);
if (destroy) HeapFree(GetProcessHeap(), 0, context);
}
@@ -1657,8 +1578,8 @@ static void SetupForBlit(IWineD3DDeviceImpl *This, struct wined3d_context *conte
int i;
const struct StateEntry *StateTable = This->StateTable;
const struct wined3d_gl_info *gl_info = context->gl_info;
- UINT width = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Width;
- UINT height = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Height;
+ UINT width = context->current_rt->currentDesc.Width;
+ UINT height = context->current_rt->currentDesc.Height;
DWORD sampler;
TRACE("Setting up context %p for blitting\n", context);
@@ -1811,6 +1732,9 @@ static void SetupForBlit(IWineD3DDeviceImpl *This, struct wined3d_context *conte
glColorMask(GL_TRUE, GL_TRUE,GL_TRUE,GL_TRUE);
checkGLcall("glColorMask");
Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), StateTable);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), StateTable);
if (gl_info->supported[EXT_SECONDARY_COLOR])
{
glDisable(GL_COLOR_SUM_EXT);
@@ -1882,14 +1806,12 @@ static struct wined3d_context *findThreadContextForSwapChain(IWineD3DSwapChain *
* Returns: The needed context
*
*****************************************************************************/
-static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurface *target)
+static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target)
{
IWineD3DSwapChain *swapchain = NULL;
struct wined3d_context *current_context = context_get_current();
- const struct StateEntry *StateTable = This->StateTable;
DWORD tid = GetCurrentThreadId();
struct wined3d_context *context;
- BOOL old_render_offscreen;
if (current_context && current_context->destroyed) current_context = NULL;
@@ -1897,15 +1819,15 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
{
if (current_context
&& current_context->current_rt
- && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.device == This)
+ && current_context->swapchain->device == This)
{
target = current_context->current_rt;
}
else
{
IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)This->swapchains[0];
- if (swapchain->backBuffer) target = swapchain->backBuffer[0];
- else target = swapchain->frontBuffer;
+ if (swapchain->back_buffers) target = swapchain->back_buffers[0];
+ else target = swapchain->front_buffer;
}
}
@@ -1915,165 +1837,36 @@ static struct wined3d_context *FindContext(IWineD3DDeviceImpl *This, IWineD3DSur
return current_context;
}
- if (SUCCEEDED(IWineD3DSurface_GetContainer(target, &IID_IWineD3DSwapChain, (void **)&swapchain))) {
+ if (target->Flags & SFLAG_SWAPCHAIN)
+ {
TRACE("Rendering onscreen\n");
+ swapchain = (IWineD3DSwapChain *)target->container;
context = findThreadContextForSwapChain(swapchain, tid);
-
- old_render_offscreen = context->render_offscreen;
- context->render_offscreen = surface_is_offscreen(target);
- /* The context != This->activeContext will catch a NOP context change. This can occur
- * if we are switching back to swapchain rendering in case of FBO or Back Buffer offscreen
- * rendering. No context change is needed in that case
- */
-
- if(wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER) {
- if(This->pbufferContext && tid == This->pbufferContext->tid) {
- This->pbufferContext->tid = 0;
- }
- }
- IWineD3DSwapChain_Release(swapchain);
}
else
{
TRACE("Rendering offscreen\n");
-retry:
- if (wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER)
+ /* Stay with the currently active context. */
+ if (current_context && current_context->swapchain->device == This)
{
- IWineD3DSurfaceImpl *targetimpl = (IWineD3DSurfaceImpl *)target;
- if (!This->pbufferContext
- || This->pbufferWidth < targetimpl->currentDesc.Width
- || This->pbufferHeight < targetimpl->currentDesc.Height)
- {
- if (This->pbufferContext) context_destroy(This, This->pbufferContext);
-
- /* The display is irrelevant here, the window is 0. But
- * context_create() needs a valid X connection. Create the context
- * on the same server as the primary swapchain. The primary
- * swapchain is exists at this point. */
- This->pbufferContext = context_create(This, targetimpl,
- ((IWineD3DSwapChainImpl *)This->swapchains[0])->context[0]->win_handle,
- TRUE /* pbuffer */, &((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms);
- This->pbufferWidth = targetimpl->currentDesc.Width;
- This->pbufferHeight = targetimpl->currentDesc.Height;
- if (This->pbufferContext) context_release(This->pbufferContext);
- }
-
- if (This->pbufferContext)
- {
- if (This->pbufferContext->tid && This->pbufferContext->tid != tid)
- {
- FIXME("The PBuffer context is only supported for one thread for now!\n");
- }
- This->pbufferContext->tid = tid;
- context = This->pbufferContext;
- }
- else
- {
- ERR("Failed to create a buffer context and drawable, falling back to back buffer offscreen rendering.\n");
- wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
- goto retry;
- }
+ context = current_context;
}
else
{
- /* Stay with the currently active context. */
- if (current_context
- && ((IWineD3DSurfaceImpl *)current_context->surface)->resource.device == This)
- {
- context = current_context;
- }
- else
- {
- /* This may happen if the app jumps straight into offscreen rendering
- * Start using the context of the primary swapchain. tid == 0 is no problem
- * for findThreadContextForSwapChain.
- *
- * Can also happen on thread switches - in that case findThreadContextForSwapChain
- * is perfect to call. */
- context = findThreadContextForSwapChain(This->swapchains[0], tid);
- }
+ /* This may happen if the app jumps straight into offscreen rendering
+ * Start using the context of the primary swapchain. tid == 0 is no problem
+ * for findThreadContextForSwapChain.
+ *
+ * Can also happen on thread switches - in that case findThreadContextForSwapChain
+ * is perfect to call. */
+ context = findThreadContextForSwapChain(This->swapchains[0], tid);
}
-
- old_render_offscreen = context->render_offscreen;
- context->render_offscreen = TRUE;
}
context_validate(context);
- if (context->render_offscreen != old_render_offscreen)
- {
- Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
- Context_MarkStateDirty(context, STATE_VDECL, StateTable);
- Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
- Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
- Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
- }
-
- /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
- * the alpha blend state changes with different render target formats. */
- if (!context->current_rt)
- {
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
- }
- else
- {
- const struct GlPixelFormatDesc *old = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.format_desc;
- const struct GlPixelFormatDesc *new = ((IWineD3DSurfaceImpl *)target)->resource.format_desc;
-
- if (old->format != new->format)
- {
- /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
- if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
- || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
- {
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
- }
- }
-
- /* When switching away from an offscreen render target, and we're not
- * using FBOs, we have to read the drawable into the texture. This is
- * done via PreLoad (and SFLAG_INDRAWABLE set on the surface). There
- * are some things that need care though. PreLoad needs a GL context,
- * and FindContext is called before the context is activated. It also
- * has to be called with the old rendertarget active, otherwise a
- * wrong drawable is read. */
- if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
- && old_render_offscreen && context->current_rt != target)
- {
- BOOL oldInDraw = This->isInDraw;
-
- /* surface_internal_preload() requires a context to load the
- * texture, so it will call context_acquire(). Set isInDraw to true
- * to signal surface_internal_preload() that it has a context. */
-
- /* FIXME: This is just broken. There's no guarantee whatsoever
- * that the currently active context, if any, is appropriate for
- * reading back the render target. We should probably call
- * context_set_current(context) here and then rely on
- * context_acquire() doing the right thing. */
- This->isInDraw = TRUE;
-
- /* Read the back buffer of the old drawable into the destination texture. */
- if (((IWineD3DSurfaceImpl *)context->current_rt)->texture_name_srgb)
- {
- surface_internal_preload(context->current_rt, SRGB_BOTH);
- }
- else
- {
- surface_internal_preload(context->current_rt, SRGB_RGB);
- }
-
- IWineD3DSurface_ModifyLocation(context->current_rt, SFLAG_INDRAWABLE, FALSE);
-
- This->isInDraw = oldInDraw;
- }
- }
-
- context->draw_buffer_dirty = TRUE;
- context->current_rt = target;
-
return context;
}
@@ -2081,10 +1874,10 @@ retry:
static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit)
{
const struct wined3d_gl_info *gl_info = context->gl_info;
- IWineD3DSurface *rt = context->current_rt;
+ IWineD3DSurfaceImpl *rt = context->current_rt;
IWineD3DDeviceImpl *device;
- device = ((IWineD3DSurfaceImpl *)rt)->resource.device;
+ device = rt->resource.device;
if (!surface_is_offscreen(rt))
{
ENTER_GL();
@@ -2099,6 +1892,16 @@ static void context_apply_draw_buffer(struct wined3d_context *context, BOOL blit
{
if (!blit)
{
+ unsigned int i;
+
+ for (i = 0; i < gl_info->limits.buffers; ++i)
+ {
+ if (device->render_targets[i])
+ device->draw_buffers[i] = GL_COLOR_ATTACHMENT0 + i;
+ else
+ device->draw_buffers[i] = GL_NONE;
+ }
+
if (gl_info->supported[ARB_DRAW_BUFFERS])
{
GL_EXTCALL(glDrawBuffersARB(gl_info->limits.buffers, device->draw_buffers));
@@ -2131,116 +1934,268 @@ void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer)
context->draw_buffer_dirty = TRUE;
}
+static inline void context_set_render_offscreen(struct wined3d_context *context, const struct StateEntry *StateTable,
+ BOOL offscreen)
+{
+ if (context->render_offscreen == offscreen) return;
+
+ Context_MarkStateDirty(context, STATE_TRANSFORM(WINED3DTS_PROJECTION), StateTable);
+ Context_MarkStateDirty(context, STATE_VDECL, StateTable);
+ Context_MarkStateDirty(context, STATE_VIEWPORT, StateTable);
+ Context_MarkStateDirty(context, STATE_SCISSORRECT, StateTable);
+ Context_MarkStateDirty(context, STATE_FRONTFACE, StateTable);
+ context->render_offscreen = offscreen;
+}
+
+static BOOL match_depth_stencil_format(const struct wined3d_format_desc *existing,
+ const struct wined3d_format_desc *required)
+{
+ short existing_depth, existing_stencil, required_depth, required_stencil;
+
+ if(existing == required) return TRUE;
+ if((existing->Flags & WINED3DFMT_FLAG_FLOAT) != (required->Flags & WINED3DFMT_FLAG_FLOAT)) return FALSE;
+
+ getDepthStencilBits(existing, &existing_depth, &existing_stencil);
+ getDepthStencilBits(required, &required_depth, &required_stencil);
+
+ if(existing_depth < required_depth) return FALSE;
+ /* If stencil bits are used the exact amount is required - otherwise wrapping
+ * won't work correctly */
+ if(required_stencil && required_stencil != existing_stencil) return FALSE;
+ return TRUE;
+}
+/* The caller provides a context */
+static void context_validate_onscreen_formats(IWineD3DDeviceImpl *device,
+ struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil)
+{
+ /* Onscreen surfaces are always in a swapchain */
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)context->current_rt->container;
+
+ if (context->render_offscreen || !depth_stencil) return;
+ if (match_depth_stencil_format(swapchain->ds_format, depth_stencil->resource.format_desc)) return;
+
+ /* TODO: If the requested format would satisfy the needs of the existing one(reverse match),
+ * or no onscreen depth buffer was created, the OpenGL drawable could be changed to the new
+ * format. */
+ WARN("Depth stencil format is not supported by WGL, rendering the backbuffer in an FBO\n");
+
+ /* The currently active context is the necessary context to access the swapchain's onscreen buffers */
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)context->current_rt, SFLAG_INTEXTURE, NULL);
+ swapchain->render_to_fbo = TRUE;
+ context_set_render_offscreen(context, device->StateTable, TRUE);
+}
+
/* Context activation is done by the caller. */
-static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceImpl *device, enum ContextUsage usage)
+void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
+{
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ context_validate_onscreen_formats(device, context, NULL);
+
+ if (context->render_offscreen)
+ {
+ FIXME("Applying blit state for an offscreen target with ORM_FBO. This should be avoided.\n");
+ surface_internal_preload(context->current_rt, SRGB_RGB);
+
+ ENTER_GL();
+ context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, context->current_rt, NULL);
+ LEAVE_GL();
+ }
+ else
+ {
+ ENTER_GL();
+ context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ LEAVE_GL();
+ }
+
+ context->draw_buffer_dirty = TRUE;
+ }
+
+ if (context->draw_buffer_dirty)
+ {
+ context_apply_draw_buffer(context, TRUE);
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO)
+ context->draw_buffer_dirty = FALSE;
+ }
+
+ SetupForBlit(device, context);
+}
+
+/* Context activation is done by the caller. */
+void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil)
+{
+ const struct StateEntry *state_table = device->StateTable;
+ GLenum buffer;
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ context_validate_onscreen_formats(device, context, depth_stencil);
+
+ ENTER_GL();
+ context_apply_fbo_state_blit(context, GL_FRAMEBUFFER, render_target, depth_stencil);
+ LEAVE_GL();
+ }
+
+ if (!surface_is_offscreen(render_target))
+ buffer = surface_get_gl_buffer(render_target);
+ else if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ buffer = GL_COLOR_ATTACHMENT0;
+ else
+ buffer = device->offscreenBuffer;
+
+ ENTER_GL();
+ context_set_draw_buffer(context, buffer);
+ LEAVE_GL();
+
+ if (context->last_was_blit)
+ {
+ device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+ }
+
+ /* Blending and clearing should be orthogonal, but tests on the nvidia
+ * driver show that disabling blending when clearing improves the clearing
+ * performance incredibly. */
+ ENTER_GL();
+ glDisable(GL_BLEND);
+ glEnable(GL_SCISSOR_TEST);
+ checkGLcall("glEnable GL_SCISSOR_TEST");
+ LEAVE_GL();
+
+ context->last_was_blit = FALSE;
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_table);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_table);
+ Context_MarkStateDirty(context, STATE_SCISSORRECT, state_table);
+}
+
+/* Context activation is done by the caller. */
+void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImpl *device)
{
const struct StateEntry *state_table = device->StateTable;
unsigned int i;
- switch (usage) {
- case CTXUSAGE_CLEAR:
- case CTXUSAGE_DRAWPRIM:
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- ENTER_GL();
- context_apply_fbo_state(context);
- LEAVE_GL();
- }
- if (context->draw_buffer_dirty) {
- context_apply_draw_buffer(context, FALSE);
- context->draw_buffer_dirty = FALSE;
- }
- break;
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ context_validate_onscreen_formats(device, context, device->depth_stencil);
- case CTXUSAGE_BLIT:
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- if (context->render_offscreen)
- {
- FIXME("Activating for CTXUSAGE_BLIT for an offscreen target with ORM_FBO. This should be avoided.\n");
- surface_internal_preload(context->current_rt, SRGB_RGB);
-
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
- context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, context->current_rt);
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE);
- LEAVE_GL();
- } else {
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- LEAVE_GL();
- }
- context->draw_buffer_dirty = TRUE;
- }
- if (context->draw_buffer_dirty) {
- context_apply_draw_buffer(context, TRUE);
- if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) {
- context->draw_buffer_dirty = FALSE;
- }
- }
- break;
-
- default:
- break;
+ if (!context->render_offscreen)
+ {
+ ENTER_GL();
+ context_apply_fbo_state(context, GL_FRAMEBUFFER, NULL, NULL);
+ LEAVE_GL();
+ }
+ else
+ {
+ ENTER_GL();
+ context_apply_fbo_state(context, GL_FRAMEBUFFER, device->render_targets, device->depth_stencil);
+ LEAVE_GL();
+ }
}
- switch(usage) {
- case CTXUSAGE_RESOURCELOAD:
- /* This does not require any special states to be set up */
- break;
+ if (context->draw_buffer_dirty)
+ {
+ context_apply_draw_buffer(context, FALSE);
+ context->draw_buffer_dirty = FALSE;
+ }
- case CTXUSAGE_CLEAR:
- if(context->last_was_blit) {
- device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
- }
+ if (context->last_was_blit)
+ {
+ device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
+ }
- /* Blending and clearing should be orthogonal, but tests on the nvidia driver show that disabling
- * blending when clearing improves the clearing performance incredibly.
- */
- ENTER_GL();
- glDisable(GL_BLEND);
- LEAVE_GL();
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_table);
+ IWineD3DDeviceImpl_FindTexUnitMap(device);
+ device_preload_textures(device);
+ if (isStateDirty(context, STATE_VDECL))
+ device_update_stream_info(device, context->gl_info);
- ENTER_GL();
- glEnable(GL_SCISSOR_TEST);
- checkGLcall("glEnable GL_SCISSOR_TEST");
- LEAVE_GL();
- context->last_was_blit = FALSE;
- Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_table);
- Context_MarkStateDirty(context, STATE_SCISSORRECT, state_table);
- break;
+ ENTER_GL();
+ for (i = 0; i < context->numDirtyEntries; ++i)
+ {
+ DWORD rep = context->dirtyArray[i];
+ DWORD idx = rep / (sizeof(*context->isStateDirty) * CHAR_BIT);
+ BYTE shift = rep & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
+ context->isStateDirty[idx] &= ~(1 << shift);
+ state_table[rep].apply(rep, device->stateBlock, context);
+ }
+ LEAVE_GL();
+ context->numDirtyEntries = 0; /* This makes the whole list clean */
+ context->last_was_blit = FALSE;
+}
- case CTXUSAGE_DRAWPRIM:
- /* This needs all dirty states applied */
- if(context->last_was_blit) {
- device->frag_pipe->enable_extension((IWineD3DDevice *)device, TRUE);
- }
+static void context_setup_target(IWineD3DDeviceImpl *device,
+ struct wined3d_context *context, IWineD3DSurfaceImpl *target)
+{
+ BOOL old_render_offscreen = context->render_offscreen, render_offscreen;
+ const struct StateEntry *StateTable = device->StateTable;
- IWineD3DDeviceImpl_FindTexUnitMap(device);
- device_preload_textures(device);
- if (isStateDirty(context, STATE_VDECL))
- device_update_stream_info(device, context->gl_info);
+ if (!target) return;
+ else if (context->current_rt == target) return;
+ render_offscreen = surface_is_offscreen(target);
- ENTER_GL();
- for (i = 0; i < context->numDirtyEntries; ++i)
+ context_set_render_offscreen(context, StateTable, render_offscreen);
+
+ /* To compensate the lack of format switching with some offscreen rendering methods and on onscreen buffers
+ * the alpha blend state changes with different render target formats. */
+ if (!context->current_rt)
+ {
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
+ }
+ else
+ {
+ const struct wined3d_format_desc *old = context->current_rt->resource.format_desc;
+ const struct wined3d_format_desc *new = target->resource.format_desc;
+
+ if (old->format != new->format)
+ {
+ /* Disable blending when the alpha mask has changed and when a format doesn't support blending. */
+ if ((old->alpha_mask && !new->alpha_mask) || (!old->alpha_mask && new->alpha_mask)
+ || !(new->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING))
{
- DWORD rep = context->dirtyArray[i];
- DWORD idx = rep / (sizeof(*context->isStateDirty) * CHAR_BIT);
- BYTE shift = rep & ((sizeof(*context->isStateDirty) * CHAR_BIT) - 1);
- context->isStateDirty[idx] &= ~(1 << shift);
- state_table[rep].apply(rep, device->stateBlock, context);
+ Context_MarkStateDirty(context, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), StateTable);
}
- LEAVE_GL();
- context->numDirtyEntries = 0; /* This makes the whole list clean */
- context->last_was_blit = FALSE;
- break;
+ }
- case CTXUSAGE_BLIT:
- SetupForBlit(device, context);
- break;
+ /* When switching away from an offscreen render target, and we're not
+ * using FBOs, we have to read the drawable into the texture. This is
+ * done via PreLoad (and SFLAG_INDRAWABLE set on the surface). There
+ * are some things that need care though. PreLoad needs a GL context,
+ * and FindContext is called before the context is activated. It also
+ * has to be called with the old rendertarget active, otherwise a
+ * wrong drawable is read. */
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO
+ && old_render_offscreen && context->current_rt != target)
+ {
+ BOOL oldInDraw = device->isInDraw;
- default:
- FIXME("Unexpected context usage requested\n");
+ /* surface_internal_preload() requires a context to load the
+ * texture, so it will call context_acquire(). Set isInDraw to true
+ * to signal surface_internal_preload() that it has a context. */
+
+ /* FIXME: This is just broken. There's no guarantee whatsoever
+ * that the currently active context, if any, is appropriate for
+ * reading back the render target. We should probably call
+ * context_set_current(context) here and then rely on
+ * context_acquire() doing the right thing. */
+ device->isInDraw = TRUE;
+
+ /* Read the back buffer of the old drawable into the destination texture. */
+ if (context->current_rt->texture_name_srgb)
+ {
+ surface_internal_preload(context->current_rt, SRGB_BOTH);
+ }
+ else
+ {
+ surface_internal_preload(context->current_rt, SRGB_RGB);
+ }
+
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)context->current_rt, SFLAG_INDRAWABLE, FALSE);
+
+ device->isInDraw = oldInDraw;
+ }
}
+
+ context->draw_buffer_dirty = TRUE;
+ context->current_rt = target;
}
/*****************************************************************************
@@ -2256,14 +2211,15 @@ static void context_apply_state(struct wined3d_context *context, IWineD3DDeviceI
* usage: Prepares the context for blitting, drawing or other actions
*
*****************************************************************************/
-struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurface *target, enum ContextUsage usage)
+struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *target)
{
struct wined3d_context *current_context = context_get_current();
struct wined3d_context *context;
- TRACE("device %p, target %p, usage %#x.\n", device, target, usage);
+ TRACE("device %p, target %p.\n", device, target);
context = FindContext(device, target);
+ context_setup_target(device, context, target);
context_enter(context);
if (!context->valid) return context;
@@ -2295,7 +2251,5 @@ struct wined3d_context *context_acquire(IWineD3DDeviceImpl *device, IWineD3DSurf
}
}
- context_apply_state(context, device, usage);
-
return context;
}
diff --git a/dll/directx/wine/wined3d/cubetexture.c b/dll/directx/wine/wined3d/cubetexture.c
index c5fa6ba280f..12acee26573 100644
--- a/dll/directx/wine/wined3d/cubetexture.c
+++ b/dll/directx/wine/wined3d/cubetexture.c
@@ -31,11 +31,12 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
{
/* Override the IWineD3DResource Preload method. */
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
IWineD3DDeviceImpl *device = This->resource.device;
struct wined3d_context *context = NULL;
- unsigned int i, j;
BOOL srgb_mode;
BOOL *dirty;
+ UINT i;
switch (srgb)
{
@@ -66,25 +67,24 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
{
/* No danger of recursive calls, context_acquire() sets isInDraw to true
* when loading offscreen render targets into their texture. */
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|| This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < sub_count; ++i)
{
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j)
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+
+ if (palette9_changed(surface))
{
- if (palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[j][i]))
- {
- TRACE("Reloading surface because the d3d8/9 palette was changed.\n");
- /* TODO: This is not necessarily needed with hw palettized texture support. */
- IWineD3DSurface_LoadLocation(This->surfaces[j][i], SFLAG_INSYSMEM, NULL);
- /* Make sure the texture is reloaded because of the palette change,
- * this kills performance though :( */
- IWineD3DSurface_ModifyLocation(This->surfaces[j][i], SFLAG_INTEXTURE, FALSE);
- }
+ TRACE("Reloading surface %p because the d3d8/9 palette was changed.\n", surface);
+ /* TODO: This is not necessarily needed with hw palettized texture support. */
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
+ /* Make sure the texture is reloaded because of the palette change,
+ * this kills performance though :( */
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
}
}
}
@@ -93,12 +93,9 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
* since the last load then reload the surfaces. */
if (*dirty)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < sub_count; ++i)
{
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j)
- {
- IWineD3DSurface_LoadTexture(This->surfaces[j][i], srgb_mode);
- }
+ IWineD3DSurface_LoadTexture((IWineD3DSurface *)This->baseTexture.sub_resources[i], srgb_mode);
}
}
else
@@ -114,26 +111,24 @@ static void cubetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3
static void cubetexture_cleanup(IWineD3DCubeTextureImpl *This)
{
- unsigned int i, j;
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
+ UINT i;
TRACE("(%p) : Cleaning up.\n", This);
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < sub_count; ++i)
{
- for (j = 0; j < 6; ++j)
- {
- IWineD3DSurface *surface = This->surfaces[j][i];
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
- if (surface)
- {
- /* Clean out the texture name we gave to the surface so that the
- * surface doesn't try and release it. */
- surface_set_texture_name(surface, 0, TRUE);
- surface_set_texture_name(surface, 0, FALSE);
- surface_set_texture_target(surface, 0);
- IWineD3DSurface_SetContainer(surface, NULL);
- IWineD3DSurface_Release(surface);
- }
+ if (surface)
+ {
+ /* Clean out the texture name we gave to the surface so that the
+ * surface doesn't try and release it. */
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
+ surface_set_texture_target(surface, 0);
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL);
+ IWineD3DSurface_Release((IWineD3DSurface *)surface);
}
}
basetexture_cleanup((IWineD3DBaseTexture *)This);
@@ -207,21 +202,25 @@ static void WINAPI IWineD3DCubeTextureImpl_PreLoad(IWineD3DCubeTexture *iface) {
cubetexture_internal_preload((IWineD3DBaseTexture *) iface, SRGB_ANY);
}
-static void WINAPI IWineD3DCubeTextureImpl_UnLoad(IWineD3DCubeTexture *iface) {
- unsigned int i, j;
+static void WINAPI IWineD3DCubeTextureImpl_UnLoad(IWineD3DCubeTexture *iface)
+{
IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- TRACE("(%p)\n", This);
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
+ UINT i;
+
+ TRACE("iface %p.\n", iface);
/* Unload all the surfaces and reset the texture name. If UnLoad was called on the
* surface before, this one will be a NOP and vice versa. Unloading an unloaded
- * surface is fine
- */
- for (i = 0; i < This->baseTexture.levels; i++) {
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z ; j++) {
- IWineD3DSurface_UnLoad(This->surfaces[j][i]);
- surface_set_texture_name(This->surfaces[j][i], 0, TRUE);
- surface_set_texture_name(This->surfaces[j][i], 0, FALSE);
- }
+ * surface is fine. */
+
+ for (i = 0; i < sub_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+
+ IWineD3DSurface_UnLoad((IWineD3DSurface *)surface);
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
}
basetexture_unload((IWineD3DBaseTexture *)iface);
@@ -281,16 +280,19 @@ static HRESULT WINAPI IWineD3DCubeTextureImpl_BindTexture(IWineD3DCubeTexture *i
TRACE("(%p) : relay to BaseTexture\n", This);
hr = basetexture_bind((IWineD3DBaseTexture *)iface, srgb, &set_gl_texture_desc);
- if (set_gl_texture_desc && SUCCEEDED(hr)) {
- UINT i, j;
- for (i = 0; i < This->baseTexture.levels; ++i) {
- for (j = WINED3DCUBEMAP_FACE_POSITIVE_X; j <= WINED3DCUBEMAP_FACE_NEGATIVE_Z; ++j) {
- if(This->baseTexture.is_srgb) {
- surface_set_texture_name(This->surfaces[j][i], This->baseTexture.texture_srgb.name, TRUE);
- } else {
- surface_set_texture_name(This->surfaces[j][i], This->baseTexture.texture_rgb.name, FALSE);
- }
- }
+ if (set_gl_texture_desc && SUCCEEDED(hr))
+ {
+ UINT sub_count = This->baseTexture.level_count * This->baseTexture.layer_count;
+ UINT i;
+
+ for (i = 0; i < sub_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+
+ if (This->baseTexture.is_srgb)
+ surface_set_texture_name(surface, This->baseTexture.texture_srgb.name, TRUE);
+ else
+ surface_set_texture_name(surface, This->baseTexture.texture_rgb.name, FALSE);
}
}
@@ -314,82 +316,102 @@ static BOOL WINAPI IWineD3DCubeTextureImpl_IsCondNP2(IWineD3DCubeTexture *iface)
/* *******************************************
IWineD3DCubeTexture IWineD3DCubeTexture parts follow
******************************************* */
-static HRESULT WINAPI IWineD3DCubeTextureImpl_GetLevelDesc(IWineD3DCubeTexture *iface, UINT Level, WINED3DSURFACE_DESC* pDesc) {
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_GetLevelDesc(IWineD3DCubeTexture *iface,
+ UINT level, WINED3DSURFACE_DESC *desc)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- TRACE("(%p) level (%d)\n", This, Level);
- return IWineD3DSurface_GetDesc(This->surfaces[0][Level], pDesc);
+ TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+
+ return IWineD3DSurface_GetDesc(surface, desc);
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_GetCubeMapSurface(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, UINT Level, IWineD3DSurface** ppCubeMapSurface) {
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_GetCubeMapSurface(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, UINT level, IWineD3DSurface **surface)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *s;
- if (Level < This->baseTexture.levels && FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- *ppCubeMapSurface = This->surfaces[FaceType][Level];
- IWineD3DSurface_AddRef(*ppCubeMapSurface);
+ TRACE("iface %p, face %u, level %u, surface %p.\n",
+ iface, face, level, surface);
- hr = WINED3D_OK;
- }
- if (WINED3D_OK == hr) {
- TRACE("(%p) -> faceType(%d) level(%d) returning surface@%p\n", This, FaceType, Level, This->surfaces[FaceType][Level]);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d) Or FaceType(%d)\n", This, Level, This->baseTexture.levels, FaceType);
+ if (!(s = (IWineD3DSurface *)basetexture_get_sub_resource(texture, face, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+ IWineD3DSurface_AddRef(s);
+ *surface = s;
+
+ TRACE("Returning surface %p.\n", *surface);
+
+ return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_LockRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, UINT Level, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
- HRESULT hr = WINED3DERR_INVALIDCALL;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_LockRect(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, UINT level, WINED3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels && FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- hr = IWineD3DSurface_LockRect(This->surfaces[FaceType][Level], pLockedRect, pRect, Flags);
+ TRACE("iface %p, face %u, level %u, locked_rect %p, rect %s, flags %#x.\n",
+ iface, face, level, locked_rect, wine_dbgstr_rect(rect), flags);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, face, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (WINED3D_OK == hr) {
- TRACE("(%p) -> faceType(%d) level(%d) returning memory@%p success(%u)\n", This, FaceType, Level, pLockedRect->pBits, hr);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d) Or FaceType(%d)\n", This, Level, This->baseTexture.levels, FaceType);
- }
-
- return hr;
+ return IWineD3DSurface_LockRect(surface, locked_rect, rect, flags);
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_UnlockRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, UINT Level) {
- HRESULT hr = WINED3DERR_INVALIDCALL;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DCubeTextureImpl_UnlockRect(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, UINT level)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels && FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- hr = IWineD3DSurface_UnlockRect(This->surfaces[FaceType][Level]);
+ TRACE("iface %p, face %u, level %u.\n",
+ iface, face, level);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, face, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (WINED3D_OK == hr) {
- TRACE("(%p) -> faceType(%d) level(%d) success(%u)\n", This, FaceType, Level, hr);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d) Or FaceType(%d)\n", This, Level, This->baseTexture.levels, FaceType);
- }
- return hr;
+ return IWineD3DSurface_UnlockRect(surface);
}
-static HRESULT WINAPI IWineD3DCubeTextureImpl_AddDirtyRect(IWineD3DCubeTexture *iface, WINED3DCUBEMAP_FACES FaceType, CONST RECT* pDirtyRect) {
- HRESULT hr = WINED3DERR_INVALIDCALL;
- IWineD3DCubeTextureImpl *This = (IWineD3DCubeTextureImpl *)iface;
- This->baseTexture.texture_rgb.dirty = TRUE;
- This->baseTexture.texture_srgb.dirty = TRUE;
- TRACE("(%p) : dirtyfication of faceType(%d) Level (0)\n", This, FaceType);
- if (FaceType <= WINED3DCUBEMAP_FACE_NEGATIVE_Z) {
- surface_add_dirty_rect(This->surfaces[FaceType][0], pDirtyRect);
- hr = WINED3D_OK;
- } else {
- WARN("(%p) overflow FaceType(%d)\n", This, FaceType);
+static HRESULT WINAPI IWineD3DCubeTextureImpl_AddDirtyRect(IWineD3DCubeTexture *iface,
+ WINED3DCUBEMAP_FACES face, const RECT *dirty_rect)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurfaceImpl *surface;
+
+ TRACE("iface %p, face %u, dirty_rect %s.\n",
+ iface, face, wine_dbgstr_rect(dirty_rect));
+
+ if (!(surface = (IWineD3DSurfaceImpl *)basetexture_get_sub_resource(texture, face, 0)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+
+ texture->baseTexture.texture_rgb.dirty = TRUE;
+ texture->baseTexture.texture_srgb.dirty = TRUE;
+ surface_add_dirty_rect(surface, dirty_rect);
+
+ return WINED3D_OK;
}
static const IWineD3DCubeTextureVtbl IWineD3DCubeTexture_Vtbl =
@@ -433,7 +455,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
UINT pow2_edge_length;
unsigned int i, j;
UINT tmp_w;
@@ -478,8 +500,8 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
texture->lpVtbl = &IWineD3DCubeTexture_Vtbl;
- hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_CUBETEXTURE,
- device, 0, usage, format_desc, pool, parent, parent_ops);
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 6, levels,
+ WINED3DRTYPE_CUBETEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize basetexture, returning %#x\n", hr);
@@ -510,7 +532,7 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
/* Generate all the surfaces. */
tmp_w = edge_length;
- for (i = 0; i < texture->baseTexture.levels; ++i)
+ for (i = 0; i < texture->baseTexture.level_count; ++i)
{
/* Create the 6 faces. */
for (j = 0; j < 6; ++j)
@@ -524,20 +546,22 @@ HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UIN
GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB,
};
+ UINT idx = j * texture->baseTexture.level_count + i;
+ IWineD3DSurface *surface;
hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_w,
- format, usage, pool, i /* Level */, j, &texture->surfaces[j][i]);
+ format, usage, pool, i /* Level */, j, &surface);
if (FAILED(hr))
{
FIXME("(%p) Failed to create surface, hr %#x.\n", texture, hr);
- texture->surfaces[j][i] = NULL;
cubetexture_cleanup(texture);
return hr;
}
- IWineD3DSurface_SetContainer(texture->surfaces[j][i], (IWineD3DBase *)texture);
- TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[j][i]);
- surface_set_texture_target(texture->surfaces[j][i], cube_targets[j]);
+ IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture);
+ surface_set_texture_target((IWineD3DSurfaceImpl *)surface, cube_targets[j]);
+ texture->baseTexture.sub_resources[idx] = (IWineD3DResourceImpl *)surface;
+ TRACE("Created surface level %u @ %p.\n", i, surface);
}
tmp_w = max(1, tmp_w >> 1);
}
diff --git a/dll/directx/wine/wined3d/device.c b/dll/directx/wine/wined3d/device.c
index 6682aa4635e..7eb9153fca9 100644
--- a/dll/directx/wine/wined3d/device.c
+++ b/dll/directx/wine/wined3d/device.c
@@ -34,7 +34,6 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION This->adapter->gl_info
/* Define the default light parameters as specified by MSDN */
const WINED3DLIGHT WINED3D_default_light = {
@@ -213,7 +212,8 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
else
{
TRACE("Stream %u isn't UP, %p\n", element->input_slot, This->stateBlock->streamSource[element->input_slot]);
- data = buffer_get_memory(This->stateBlock->streamSource[element->input_slot], 0, &buffer_object);
+ data = buffer_get_memory(This->stateBlock->streamSource[element->input_slot],
+ &This->adapter->gl_info, &buffer_object);
/* Can't use vbo's if the base vertex index is negative. OpenGL doesn't accept negative offsets
* (or rather offsets bigger than the vbo, because the pointer is unsigned), so use system memory
@@ -224,7 +224,8 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
{
WARN("loadBaseVertexIndex is < 0 (%d), not using vbos\n", This->stateBlock->loadBaseVertexIndex);
buffer_object = 0;
- data = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->streamSource[element->input_slot]);
+ data = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->streamSource[element->input_slot],
+ &This->adapter->gl_info);
if ((UINT_PTR)data < -This->stateBlock->loadBaseVertexIndex * stride)
{
FIXME("System memory vertex data load offset is negative!\n");
@@ -305,6 +306,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
}
}
+ This->num_buffer_queries = 0;
if (!This->stateBlock->streamIsUP)
{
WORD map = stream_info->use_map;
@@ -314,6 +316,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
{
struct wined3d_stream_info_element *element;
struct wined3d_buffer *buffer;
+ struct wined3d_event_query *query;
if (!(map & 1)) continue;
@@ -325,7 +328,13 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
if (buffer->buffer_object != element->buffer_object)
{
element->buffer_object = 0;
- element->data = buffer_get_sysmem(buffer) + (ptrdiff_t)element->data;
+ element->data = buffer_get_sysmem(buffer, &This->adapter->gl_info) + (ptrdiff_t)element->data;
+ }
+
+ query = ((struct wined3d_buffer *) buffer)->query;
+ if(query)
+ {
+ This->buffer_queries[This->num_buffer_queries++] = query;
}
}
}
@@ -334,7 +343,7 @@ void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
static void stream_info_element_from_strided(const struct wined3d_gl_info *gl_info,
const struct WineDirect3DStridedData *strided, struct wined3d_stream_info_element *e)
{
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(strided->format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(strided->format, gl_info);
e->format_desc = format_desc;
e->stride = strided->dwStride;
e->data = strided->lpData;
@@ -494,6 +503,95 @@ void device_preload_textures(IWineD3DDeviceImpl *device)
}
}
+BOOL device_context_add(IWineD3DDeviceImpl *device, struct wined3d_context *context)
+{
+ struct wined3d_context **new_array;
+
+ TRACE("Adding context %p.\n", context);
+
+ if (!device->contexts) new_array = HeapAlloc(GetProcessHeap(), 0, sizeof(*new_array));
+ else new_array = HeapReAlloc(GetProcessHeap(), 0, device->contexts, sizeof(*new_array) * (device->numContexts + 1));
+
+ if (!new_array)
+ {
+ ERR("Failed to grow the context array.\n");
+ return FALSE;
+ }
+
+ new_array[device->numContexts++] = context;
+ device->contexts = new_array;
+ return TRUE;
+}
+
+void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *context)
+{
+ struct wined3d_context **new_array;
+ BOOL found = FALSE;
+ UINT i;
+
+ TRACE("Removing context %p.\n", context);
+
+ for (i = 0; i < device->numContexts; ++i)
+ {
+ if (device->contexts[i] == context)
+ {
+ found = TRUE;
+ break;
+ }
+ }
+
+ if (!found)
+ {
+ ERR("Context %p doesn't exist in context array.\n", context);
+ return;
+ }
+
+ if (!--device->numContexts)
+ {
+ HeapFree(GetProcessHeap(), 0, device->contexts);
+ device->contexts = NULL;
+ return;
+ }
+
+ memmove(&device->contexts[i], &device->contexts[i + 1], (device->numContexts - i) * sizeof(*device->contexts));
+ new_array = HeapReAlloc(GetProcessHeap(), 0, device->contexts, device->numContexts * sizeof(*device->contexts));
+ if (!new_array)
+ {
+ ERR("Failed to shrink context array. Oh well.\n");
+ return;
+ }
+
+ device->contexts = new_array;
+}
+
+void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect)
+{
+ IWineD3DStateBlockImpl *stateblock = device->stateBlock;
+ WINED3DVIEWPORT *vp = &stateblock->viewport;
+
+ SetRect(rect, vp->X, vp->Y, vp->X + vp->Width, vp->Y + vp->Height);
+
+ if (stateblock->renderState[WINED3DRS_SCISSORTESTENABLE])
+ {
+ IntersectRect(rect, rect, &stateblock->scissorRect);
+ }
+}
+
+void device_switch_onscreen_ds(IWineD3DDeviceImpl *device,
+ struct wined3d_context *context, IWineD3DSurfaceImpl *depth_stencil)
+{
+ if (device->onscreen_depth_stencil)
+ {
+ surface_load_ds_location(device->onscreen_depth_stencil, context, SFLAG_DS_OFFSCREEN);
+ surface_modify_ds_location(device->onscreen_depth_stencil, SFLAG_DS_OFFSCREEN,
+ device->onscreen_depth_stencil->ds_current_size.cx,
+ device->onscreen_depth_stencil->ds_current_size.cy);
+ IWineD3DSurface_Release((IWineD3DSurface *)device->onscreen_depth_stencil);
+ }
+ device->onscreen_depth_stencil = depth_stencil;
+ IWineD3DSurface_AddRef((IWineD3DSurface *)device->onscreen_depth_stencil);
+}
+
/**********************************************************
* IUnknown parts follows
**********************************************************/
@@ -540,9 +638,17 @@ static ULONG WINAPI IWineD3DDeviceImpl_Release(IWineD3DDevice *iface) {
/* NOTE: You must release the parent if the object was created via a callback
** ***************************/
- if (!list_empty(&This->resources)) {
+ if (!list_empty(&This->resources))
+ {
+ IWineD3DResourceImpl *resource;
FIXME("(%p) Device released with resources still bound, acceptable but unexpected\n", This);
- dumpResources(&This->resources);
+
+ LIST_FOR_EACH_ENTRY(resource, &This->resources, IWineD3DResourceImpl, resource.resource_list_entry)
+ {
+ WINED3DRESOURCETYPE type = IWineD3DResource_GetType((IWineD3DResource *)resource);
+ FIXME("Leftover resource %p with type %s (%#x).\n",
+ resource, debug_d3dresourcetype(type), type);
+ }
}
if(This->contexts) ERR("Context array not freed!\n");
@@ -760,6 +866,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice *
{
struct wined3d_rendertarget_view *object;
+ TRACE("iface %p, resource %p, parent %p, rendertarget_view %p.\n",
+ iface, resource, parent, rendertarget_view);
+
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
if (!object)
{
@@ -767,12 +876,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateRendertargetView(IWineD3DDevice *
return E_OUTOFMEMORY;
}
- object->vtbl = &wined3d_rendertarget_view_vtbl;
- object->refcount = 1;
- IWineD3DResource_AddRef(resource);
- object->resource = resource;
- object->parent = parent;
+ wined3d_rendertarget_view_init(object, resource, parent);
+ TRACE("Created render target view %p.\n", object);
*rendertarget_view = (IWineD3DRendertargetView *)object;
return WINED3D_OK;
@@ -1030,11 +1136,39 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVertexDeclaration(IWineD3DDevice
return WINED3D_OK;
}
-static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the GL info, which has the type table */
- DWORD fvf, WINED3DVERTEXELEMENT** ppVertexElements) {
+struct wined3d_fvf_convert_state
+{
+ const struct wined3d_gl_info *gl_info;
+ WINED3DVERTEXELEMENT *elements;
+ UINT offset;
+ UINT idx;
+};
- unsigned int idx, idx2;
- unsigned int offset;
+static void append_decl_element(struct wined3d_fvf_convert_state *state,
+ WINED3DFORMAT format, WINED3DDECLUSAGE usage, UINT usage_idx)
+{
+ WINED3DVERTEXELEMENT *elements = state->elements;
+ const struct wined3d_format_desc *format_desc;
+ UINT offset = state->offset;
+ UINT idx = state->idx;
+
+ elements[idx].format = format;
+ elements[idx].input_slot = 0;
+ elements[idx].offset = offset;
+ elements[idx].output_slot = 0;
+ elements[idx].method = WINED3DDECLMETHOD_DEFAULT;
+ elements[idx].usage = usage;
+ elements[idx].usage_idx = usage_idx;
+
+ format_desc = getFormatDescEntry(format, state->gl_info);
+ state->offset += format_desc->component_count * format_desc->component_size;
+ ++state->idx;
+}
+
+static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the GL info, which has the type table */
+ DWORD fvf, WINED3DVERTEXELEMENT **ppVertexElements)
+{
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
BOOL has_pos = (fvf & WINED3DFVF_POSITION_MASK) != 0;
BOOL has_blend = (fvf & WINED3DFVF_XYZB5) > WINED3DFVF_XYZRHW;
BOOL has_blend_idx = has_blend &&
@@ -1048,9 +1182,9 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the
DWORD num_textures = (fvf & WINED3DFVF_TEXCOUNT_MASK) >> WINED3DFVF_TEXCOUNT_SHIFT;
DWORD texcoords = (fvf & 0xFFFF0000) >> 16;
- WINED3DVERTEXELEMENT *elements = NULL;
-
+ struct wined3d_fvf_convert_state state;
unsigned int size;
+ unsigned int idx;
DWORD num_blends = 1 + (((fvf & WINED3DFVF_XYZB5) - WINED3DFVF_XYZB1) >> 1);
if (has_blend_idx) num_blends--;
@@ -1058,112 +1192,84 @@ static unsigned int ConvertFvfToDeclaration(IWineD3DDeviceImpl *This, /* For the
size = has_pos + (has_blend && num_blends > 0) + has_blend_idx + has_normal +
has_psize + has_diffuse + has_specular + num_textures;
- /* convert the declaration */
- elements = HeapAlloc(GetProcessHeap(), 0, size * sizeof(WINED3DVERTEXELEMENT));
- if (!elements) return ~0U;
+ state.gl_info = gl_info;
+ state.elements = HeapAlloc(GetProcessHeap(), 0, size * sizeof(*state.elements));
+ if (!state.elements) return ~0U;
+ state.offset = 0;
+ state.idx = 0;
- idx = 0;
- if (has_pos) {
- if (!has_blend && (fvf & WINED3DFVF_XYZRHW)) {
- elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_POSITIONT;
- }
- else if ((fvf & WINED3DFVF_XYZW) == WINED3DFVF_XYZW) {
- elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_POSITION;
- }
- else {
- elements[idx].format = WINED3DFMT_R32G32B32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_POSITION;
- }
- elements[idx].usage_idx = 0;
- idx++;
+ if (has_pos)
+ {
+ if (!has_blend && (fvf & WINED3DFVF_XYZRHW))
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_POSITIONT, 0);
+ else if ((fvf & WINED3DFVF_XYZW) == WINED3DFVF_XYZW)
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_POSITION, 0);
+ else
+ append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_POSITION, 0);
}
- if (has_blend && (num_blends > 0)) {
- if (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2) && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR))
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
- else {
- switch(num_blends) {
- case 1: elements[idx].format = WINED3DFMT_R32_FLOAT; break;
- case 2: elements[idx].format = WINED3DFMT_R32G32_FLOAT; break;
- case 3: elements[idx].format = WINED3DFMT_R32G32B32_FLOAT; break;
- case 4: elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT; break;
+
+ if (has_blend && (num_blends > 0))
+ {
+ if ((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2 && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR))
+ append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ else
+ {
+ switch (num_blends)
+ {
+ case 1:
+ append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
+ case 2:
+ append_decl_element(&state, WINED3DFMT_R32G32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
+ case 3:
+ append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
+ case 4:
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_BLENDWEIGHT, 0);
+ break;
default:
ERR("Unexpected amount of blend values: %u\n", num_blends);
}
}
- elements[idx].usage = WINED3DDECLUSAGE_BLENDWEIGHT;
- elements[idx].usage_idx = 0;
- idx++;
}
- if (has_blend_idx) {
- if (fvf & WINED3DFVF_LASTBETA_UBYTE4 ||
- (((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2) && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)))
- elements[idx].format = WINED3DFMT_R8G8B8A8_UINT;
+
+ if (has_blend_idx)
+ {
+ if ((fvf & WINED3DFVF_LASTBETA_UBYTE4)
+ || ((fvf & WINED3DFVF_XYZB5) == WINED3DFVF_XYZB2 && (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)))
+ append_decl_element(&state, WINED3DFMT_R8G8B8A8_UINT, WINED3DDECLUSAGE_BLENDINDICES, 0);
else if (fvf & WINED3DFVF_LASTBETA_D3DCOLOR)
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
+ append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_BLENDINDICES, 0);
else
- elements[idx].format = WINED3DFMT_R32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_BLENDINDICES;
- elements[idx].usage_idx = 0;
- idx++;
+ append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_BLENDINDICES, 0);
}
- if (has_normal) {
- elements[idx].format = WINED3DFMT_R32G32B32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_NORMAL;
- elements[idx].usage_idx = 0;
- idx++;
- }
- if (has_psize) {
- elements[idx].format = WINED3DFMT_R32_FLOAT;
- elements[idx].usage = WINED3DDECLUSAGE_PSIZE;
- elements[idx].usage_idx = 0;
- idx++;
- }
- if (has_diffuse) {
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
- elements[idx].usage = WINED3DDECLUSAGE_COLOR;
- elements[idx].usage_idx = 0;
- idx++;
- }
- if (has_specular) {
- elements[idx].format = WINED3DFMT_B8G8R8A8_UNORM;
- elements[idx].usage = WINED3DDECLUSAGE_COLOR;
- elements[idx].usage_idx = 1;
- idx++;
- }
- for (idx2 = 0; idx2 < num_textures; idx2++) {
- unsigned int numcoords = (texcoords >> (idx2*2)) & 0x03;
- switch (numcoords) {
+
+ if (has_normal) append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_NORMAL, 0);
+ if (has_psize) append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_PSIZE, 0);
+ if (has_diffuse) append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_COLOR, 0);
+ if (has_specular) append_decl_element(&state, WINED3DFMT_B8G8R8A8_UNORM, WINED3DDECLUSAGE_COLOR, 1);
+
+ for (idx = 0; idx < num_textures; ++idx)
+ {
+ switch ((texcoords >> (idx * 2)) & 0x03)
+ {
case WINED3DFVF_TEXTUREFORMAT1:
- elements[idx].format = WINED3DFMT_R32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
case WINED3DFVF_TEXTUREFORMAT2:
- elements[idx].format = WINED3DFMT_R32G32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32G32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
case WINED3DFVF_TEXTUREFORMAT3:
- elements[idx].format = WINED3DFMT_R32G32B32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32G32B32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
case WINED3DFVF_TEXTUREFORMAT4:
- elements[idx].format = WINED3DFMT_R32G32B32A32_FLOAT;
+ append_decl_element(&state, WINED3DFMT_R32G32B32A32_FLOAT, WINED3DDECLUSAGE_TEXCOORD, idx);
break;
}
- elements[idx].usage = WINED3DDECLUSAGE_TEXCOORD;
- elements[idx].usage_idx = idx2;
- idx++;
}
- /* Now compute offsets, and initialize the rest of the fields */
- for (idx = 0, offset = 0; idx < size; ++idx)
- {
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(elements[idx].format, &This->adapter->gl_info);
- elements[idx].input_slot = 0;
- elements[idx].method = WINED3DDECLMETHOD_DEFAULT;
- elements[idx].offset = offset;
- offset += format_desc->component_count * format_desc->component_size;
- }
-
- *ppVertexElements = elements;
+ *ppVertexElements = state.elements;
return size;
}
@@ -1282,35 +1388,27 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreatePalette(IWineD3DDevice *iface, DW
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
IWineD3DPaletteImpl *object;
HRESULT hr;
- TRACE("(%p)->(%x, %p, %p, %p)\n", This, Flags, PalEnt, Palette, Parent);
- /* Create the new object */
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DPaletteImpl));
- if(!object) {
- ERR("Out of memory when allocating memory for a IWineD3DPalette implementation\n");
+ TRACE("iface %p, flags %#x, entries %p, palette %p, parent %p.\n",
+ iface, Flags, PalEnt, Palette, Parent);
+
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
+ {
+ ERR("Failed to allocate palette memory.\n");
return E_OUTOFMEMORY;
}
- object->lpVtbl = &IWineD3DPalette_Vtbl;
- object->ref = 1;
- object->Flags = Flags;
- object->parent = Parent;
- object->device = This;
- object->palNumEntries = IWineD3DPaletteImpl_Size(Flags);
- object->hpal = CreatePalette((const LOGPALETTE*)&(object->palVersion));
-
- if(!object->hpal) {
- HeapFree( GetProcessHeap(), 0, object);
- return E_OUTOFMEMORY;
- }
-
- hr = IWineD3DPalette_SetEntries((IWineD3DPalette *) object, 0, 0, IWineD3DPaletteImpl_Size(Flags), PalEnt);
- if(FAILED(hr)) {
- IWineD3DPalette_Release((IWineD3DPalette *) object);
+ hr = wined3d_palette_init(object, This, Flags, PalEnt, Parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize palette, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
return hr;
}
- *Palette = (IWineD3DPalette *) object;
+ TRACE("Created palette %p.\n", object);
+ *Palette = (IWineD3DPalette *)object;
return WINED3D_OK;
}
@@ -1429,6 +1527,30 @@ static void destroy_dummy_textures(IWineD3DDeviceImpl *device, const struct wine
memset(device->dummyTextureName, 0, gl_info->limits.textures * sizeof(*device->dummyTextureName));
}
+static HRESULT WINAPI IWineD3DDeviceImpl_AcquireFocusWindow(IWineD3DDevice *iface, HWND window)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
+
+ if (!wined3d_register_window(window, device))
+ {
+ ERR("Failed to register window %p.\n", window);
+ return E_FAIL;
+ }
+
+ device->focus_window = window;
+ SetForegroundWindow(window);
+
+ return WINED3D_OK;
+}
+
+static void WINAPI IWineD3DDeviceImpl_ReleaseFocusWindow(IWineD3DDevice *iface)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *)iface;
+
+ if (device->focus_window) wined3d_unregister_window(device->focus_window);
+ device->focus_window = NULL;
+}
+
static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
WINED3DPRESENT_PARAMETERS *pPresentationParameters)
{
@@ -1445,17 +1567,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
if(This->d3d_initialized) return WINED3DERR_INVALIDCALL;
if(!This->adapter->opengl) return WINED3DERR_INVALIDCALL;
- if (!pPresentationParameters->Windowed)
- {
- This->focus_window = This->createParms.hFocusWindow;
- if (!This->focus_window) This->focus_window = pPresentationParameters->hDeviceWindow;
- if (!wined3d_register_window(This->focus_window, This))
- {
- ERR("Failed to register window %p.\n", This->focus_window);
- return E_FAIL;
- }
- }
-
TRACE("(%p) : Creating stateblock\n", This);
/* Creating the startup stateBlock - Note Special Case: 0 => Don't fill in yet! */
hr = IWineD3DDevice_CreateStateBlock(iface,
@@ -1471,7 +1582,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
IWineD3DStateBlock_AddRef((IWineD3DStateBlock*)This->updateStateBlock);
This->render_targets = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(IWineD3DSurface *) * gl_info->limits.buffers);
+ sizeof(*This->render_targets) * gl_info->limits.buffers);
This->draw_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
sizeof(GLenum) * gl_info->limits.buffers);
@@ -1509,8 +1620,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
}
}
- if (This->focus_window) SetFocus(This->focus_window);
-
/* Setup the implicit swapchain. This also initializes a context. */
TRACE("Creating implicit swapchain\n");
hr = IWineD3DDeviceParent_CreateSwapChain(This->device_parent,
@@ -1529,21 +1638,22 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
}
This->swapchains[0] = (IWineD3DSwapChain *) swapchain;
- if(swapchain->backBuffer && swapchain->backBuffer[0]) {
- TRACE("Setting rendertarget to %p\n", swapchain->backBuffer);
- This->render_targets[0] = swapchain->backBuffer[0];
+ if (swapchain->back_buffers && swapchain->back_buffers[0])
+ {
+ TRACE("Setting rendertarget to %p.\n", swapchain->back_buffers);
+ This->render_targets[0] = swapchain->back_buffers[0];
}
- else {
- TRACE("Setting rendertarget to %p\n", swapchain->frontBuffer);
- This->render_targets[0] = swapchain->frontBuffer;
+ else
+ {
+ TRACE("Setting rendertarget to %p.\n", swapchain->front_buffer);
+ This->render_targets[0] = swapchain->front_buffer;
}
- IWineD3DSurface_AddRef(This->render_targets[0]);
+ IWineD3DSurface_AddRef((IWineD3DSurface *)This->render_targets[0]);
/* Depth Stencil support */
- This->stencilBufferTarget = This->auto_depth_stencil_buffer;
- if (NULL != This->stencilBufferTarget) {
- IWineD3DSurface_AddRef(This->stencilBufferTarget);
- }
+ This->depth_stencil = This->auto_depth_stencil;
+ if (This->depth_stencil)
+ IWineD3DSurface_AddRef((IWineD3DSurface *)This->depth_stencil);
hr = This->shader_backend->shader_alloc_private(iface);
if(FAILED(hr)) {
@@ -1566,7 +1676,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
/* Setup all the devices defaults */
IWineD3DStateBlock_InitStartupStateBlock((IWineD3DStateBlock *)This->stateBlock);
- context = context_acquire(This, swapchain->frontBuffer, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, swapchain->front_buffer);
create_dummy_textures(This);
@@ -1583,10 +1693,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Init3D(IWineD3DDevice *iface,
This->offscreenBuffer = GL_COLOR_ATTACHMENT0;
break;
- case ORM_PBUFFER:
- This->offscreenBuffer = GL_BACK;
- break;
-
case ORM_BACKBUFFER:
{
if (context_get_current()->aux_buffers > 0)
@@ -1645,7 +1751,6 @@ err_out:
if (This->shader_priv) {
This->shader_backend->shader_free_private(iface);
}
- if (This->focus_window) wined3d_unregister_window(This->focus_window);
return hr;
}
@@ -1702,7 +1807,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
/* I don't think that the interface guarantees that the device is destroyed from the same thread
* it was created. Thus make sure a context is active for the glDelete* calls
*/
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
gl_info = context->gl_info;
if(This->logo_surface) IWineD3DSurface_Release(This->logo_surface);
@@ -1720,9 +1825,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
}
}
- /* Delete the pbuffer context if there is any */
- if(This->pbufferContext) context_destroy(This, This->pbufferContext);
-
/* Delete the mouse cursor texture */
if(This->cursorTexture) {
ENTER_GL();
@@ -1781,26 +1883,33 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
This->shader_backend->shader_free_private(iface);
/* Release the buffers (with sanity checks)*/
- TRACE("Releasing the depth stencil buffer at %p\n", This->stencilBufferTarget);
- if(This->stencilBufferTarget != NULL && (IWineD3DSurface_Release(This->stencilBufferTarget) >0)){
- if(This->auto_depth_stencil_buffer != This->stencilBufferTarget)
- FIXME("(%p) Something's still holding the stencilBufferTarget\n",This);
+ if (This->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+ This->onscreen_depth_stencil = NULL;
}
- This->stencilBufferTarget = NULL;
+
+ TRACE("Releasing the depth stencil buffer at %p\n", This->depth_stencil);
+ if (This->depth_stencil && IWineD3DSurface_Release((IWineD3DSurface *)This->depth_stencil))
+ {
+ if (This->auto_depth_stencil != This->depth_stencil)
+ FIXME("(%p) Something is still holding the depth/stencil buffer.\n",This);
+ }
+ This->depth_stencil = NULL;
TRACE("Releasing the render target at %p\n", This->render_targets[0]);
- if(IWineD3DSurface_Release(This->render_targets[0]) >0){
- /* This check is a bit silly, it should be in swapchain_release FIXME("(%p) Something's still holding the renderTarget\n",This); */
- }
+ IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[0]);
+
TRACE("Setting rendertarget to NULL\n");
This->render_targets[0] = NULL;
- if (This->auto_depth_stencil_buffer) {
- if (IWineD3DSurface_Release(This->auto_depth_stencil_buffer) > 0)
+ if (This->auto_depth_stencil)
+ {
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->auto_depth_stencil))
{
FIXME("(%p) Something's still holding the auto depth stencil buffer\n", This);
}
- This->auto_depth_stencil_buffer = NULL;
+ This->auto_depth_stencil = NULL;
}
context_release(context);
@@ -1828,8 +1937,6 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Uninit3D(IWineD3DDevice *iface,
This->d3d_initialized = FALSE;
- if (This->focus_window) wined3d_unregister_window(This->focus_window);
-
return WINED3D_OK;
}
@@ -1867,8 +1974,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U
const WINED3DDISPLAYMODE* pMode) {
DEVMODEW devmode;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(pMode->Format, &This->adapter->gl_info);
LONG ret;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(pMode->Format, &This->adapter->gl_info);
RECT clip_rc;
TRACE("(%p)->(%d,%p) Mode=%dx%dx@%d, %s\n", This, iSwapChain, pMode, pMode->Width, pMode->Height, pMode->RefreshRate, debug_d3dformat(pMode->Format));
@@ -2982,7 +3089,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetVertexShaderConstantI(
TRACE("(iface %p, dstData %p, start %d, count %d)\n",
iface, dstData, start, count);
- if (dstData == NULL || ((signed int) MAX_CONST_I - (signed int) start) <= (signed int) 0)
+ if (dstData == NULL || ((signed int) MAX_CONST_I - (signed int) start) <= 0)
return WINED3DERR_INVALIDCALL;
memcpy(dstData, &This->stateBlock->vertexShaderConstantI[start * 4], cnt * sizeof(int) * 4);
@@ -3469,9 +3576,8 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
/* We might access VBOs from this code, so hold the lock */
ENTER_GL();
- if (dest->resource.allocatedMemory == NULL) {
- buffer_get_sysmem(dest);
- }
+ if (!dest->resource.allocatedMemory)
+ buffer_get_sysmem(dest, gl_info);
/* Get a pointer into the destination vbo(create one if none exists) and
* write correct opengl data into it. It's cheap and allows us to run drawStridedFast
@@ -3518,7 +3624,7 @@ static HRESULT process_vertices_strided(IWineD3DDeviceImpl *This, DWORD dwDestIn
FIXME("Clipping is broken and disabled for now\n");
}
} else doClip = FALSE;
- dest_ptr = ((char *) buffer_get_sysmem(dest)) + dwDestIndex * get_flexible_vertex_size(DestFVF);
+ dest_ptr = ((char *)buffer_get_sysmem(dest, gl_info)) + dwDestIndex * get_flexible_vertex_size(DestFVF);
IWineD3DDevice_GetTransform( (IWineD3DDevice *) This,
WINED3DTS_VIEW,
@@ -3794,6 +3900,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
struct wined3d_stream_info stream_info;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
BOOL vbo = FALSE, streamWasUP = This->stateBlock->streamIsUP;
HRESULT hr;
@@ -3805,7 +3912,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
}
/* Need any context to write to the vbo. */
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
+ gl_info = context->gl_info;
/* ProcessVertices reads from vertex buffers, which have to be assigned. DrawPrimitive and DrawPrimitiveUP
* control the streamIsUP flag, thus restore it afterwards.
@@ -3832,7 +3940,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ProcessVertices(IWineD3DDevice *iface,
{
struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
e->buffer_object = 0;
- e->data = (BYTE *)((unsigned long)e->data + (unsigned long)buffer_get_sysmem(vb));
+ e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info));
ENTER_GL();
GL_EXTCALL(glDeleteBuffersARB(1, &vb->buffer_object));
vb->buffer_object = 0;
@@ -4218,7 +4326,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EndScene(IWineD3DDevice *iface)
return WINED3DERR_INVALIDCALL;
}
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
/* We only have to do this if we need to read the, swapbuffers performs a flush for us */
wglFlush();
/* No checkGLcall here to avoid locking the lock just for checking a call that hardly ever
@@ -4250,18 +4358,81 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Present(IWineD3DDevice *iface,
return WINED3D_OK;
}
+static BOOL is_full_clear(IWineD3DSurfaceImpl *target, const RECT *draw_rect, const RECT *clear_rect)
+{
+ /* partial draw rect */
+ if (draw_rect->left || draw_rect->top
+ || draw_rect->right < target->currentDesc.Width
+ || draw_rect->bottom < target->currentDesc.Height)
+ return FALSE;
+
+ /* partial clear rect */
+ if (clear_rect && (clear_rect->left > 0 || clear_rect->top > 0
+ || clear_rect->right < target->currentDesc.Width
+ || clear_rect->bottom < target->currentDesc.Height))
+ return FALSE;
+
+ return TRUE;
+}
+
+static void prepare_ds_clear(IWineD3DSurfaceImpl *ds, struct wined3d_context *context,
+ DWORD location, const RECT *draw_rect, UINT rect_count, const RECT *clear_rect)
+{
+ RECT current_rect, r;
+
+ if (ds->Flags & location)
+ SetRect(¤t_rect, 0, 0,
+ ds->ds_current_size.cx,
+ ds->ds_current_size.cy);
+ else
+ SetRectEmpty(¤t_rect);
+
+ IntersectRect(&r, draw_rect, ¤t_rect);
+ if (EqualRect(&r, draw_rect))
+ {
+ /* current_rect ⊇ draw_rect, modify only. */
+ surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
+ return;
+ }
+
+ if (EqualRect(&r, ¤t_rect))
+ {
+ /* draw_rect ⊇ current_rect, test if we're doing a full clear. */
+
+ if (!clear_rect)
+ {
+ /* Full clear, modify only. */
+ surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom);
+ return;
+ }
+
+ IntersectRect(&r, draw_rect, clear_rect);
+ if (EqualRect(&r, draw_rect))
+ {
+ /* clear_rect ⊇ draw_rect, modify only. */
+ surface_modify_ds_location(ds, location, draw_rect->right, draw_rect->bottom);
+ return;
+ }
+ }
+
+ /* Full load. */
+ surface_load_ds_location(ds, context, location);
+ surface_modify_ds_location(ds, location, ds->ds_current_size.cx, ds->ds_current_size.cy);
+}
+
/* Not called from the VTable (internal subroutine) */
-HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
- CONST WINED3DRECT* pRects, DWORD Flags, WINED3DCOLOR Color,
- float Z, DWORD Stencil) {
+HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
+ const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil)
+{
+ const RECT *clear_rect = (Count > 0 && pRects) ? (const RECT *)pRects : NULL;
+ IWineD3DSurfaceImpl *depth_stencil = This->depth_stencil;
GLbitfield glMask = 0;
unsigned int i;
- WINED3DRECT curRect;
- RECT vp_rect;
- const WINED3DVIEWPORT *vp = &This->stateBlock->viewport;
UINT drawable_width, drawable_height;
- IWineD3DSurfaceImpl *depth_stencil = (IWineD3DSurfaceImpl *) This->stencilBufferTarget;
struct wined3d_context *context;
+ RECT draw_rect;
+
+ device_get_draw_rect(This, &draw_rect);
/* When we're clearing parts of the drawable, make sure that the target surface is well up to date in the
* drawable. After the clear we'll mark the drawable up to date, so we have to make sure that this is true
@@ -4272,132 +4443,119 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
* the drawable up to date. We have to check all settings that limit the clear area though. Do not bother
* checking all this if the dest surface is in the drawable anyway.
*/
- if((Flags & WINED3DCLEAR_TARGET) && !(target->Flags & SFLAG_INDRAWABLE)) {
- while(1) {
- if(vp->X != 0 || vp->Y != 0 ||
- vp->Width < target->currentDesc.Width || vp->Height < target->currentDesc.Height) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- break;
- }
- if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
- This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
- This->stateBlock->scissorRect.right < target->currentDesc.Width ||
- This->stateBlock->scissorRect.bottom < target->currentDesc.Height)) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- break;
- }
- if(Count > 0 && pRects && (
- pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
- pRects[0].x2 < target->currentDesc.Width ||
- pRects[0].y2 < target->currentDesc.Height)) {
- IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
- break;
- }
- break;
- }
+ if (Flags & WINED3DCLEAR_TARGET && !(target->Flags & SFLAG_INDRAWABLE))
+ {
+ if (!is_full_clear(target, &draw_rect, clear_rect))
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, NULL);
}
- context = context_acquire(This, (IWineD3DSurface *)target, CTXUSAGE_CLEAR);
+ context = context_acquire(This, target);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping clear.\n");
+ return WINED3D_OK;
+ }
+
+ context_apply_clear_state(context, This, target, depth_stencil);
target->get_drawable_size(context, &drawable_width, &drawable_height);
ENTER_GL();
/* Only set the values up once, as they are not changing */
- if (Flags & WINED3DCLEAR_STENCIL) {
+ if (Flags & WINED3DCLEAR_STENCIL)
+ {
+ if (context->gl_info->supported[EXT_STENCIL_TWO_SIDE])
+ {
+ glDisable(GL_STENCIL_TEST_TWO_SIDE_EXT);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE));
+ }
+ glStencilMask(~0U);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
glClearStencil(Stencil);
checkGLcall("glClearStencil");
glMask = glMask | GL_STENCIL_BUFFER_BIT;
- glStencilMask(0xFFFFFFFF);
}
- if (Flags & WINED3DCLEAR_ZBUFFER) {
+ if (Flags & WINED3DCLEAR_ZBUFFER)
+ {
DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
+
+ if (location == SFLAG_DS_ONSCREEN && depth_stencil != This->onscreen_depth_stencil)
+ device_switch_onscreen_ds(This, context, depth_stencil);
+ prepare_ds_clear(depth_stencil, context, location, &draw_rect, Count, clear_rect);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)depth_stencil, SFLAG_INDRAWABLE, TRUE);
+
glDepthMask(GL_TRUE);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE));
glClearDepth(Z);
checkGLcall("glClearDepth");
glMask = glMask | GL_DEPTH_BUFFER_BIT;
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZWRITEENABLE));
-
- if (vp->X != 0 || vp->Y != 0 ||
- vp->Width < depth_stencil->currentDesc.Width || vp->Height < depth_stencil->currentDesc.Height) {
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- }
- else if (This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
- This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
- This->stateBlock->scissorRect.right < depth_stencil->currentDesc.Width ||
- This->stateBlock->scissorRect.bottom < depth_stencil->currentDesc.Height)) {
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- }
- else if (Count > 0 && pRects && (
- pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
- pRects[0].x2 < depth_stencil->currentDesc.Width ||
- pRects[0].y2 < depth_stencil->currentDesc.Height)) {
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- }
}
- if (Flags & WINED3DCLEAR_TARGET) {
- TRACE("Clearing screen with glClear to color %x\n", Color);
- glClearColor(D3DCOLOR_R(Color),
- D3DCOLOR_G(Color),
- D3DCOLOR_B(Color),
- D3DCOLOR_A(Color));
- checkGLcall("glClearColor");
+ if (Flags & WINED3DCLEAR_TARGET)
+ {
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
- /* Clear ALL colors! */
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3));
+ glClearColor(D3DCOLOR_R(Color), D3DCOLOR_G(Color), D3DCOLOR_B(Color), D3DCOLOR_A(Color));
+ checkGLcall("glClearColor");
glMask = glMask | GL_COLOR_BUFFER_BIT;
}
- vp_rect.left = vp->X;
- vp_rect.top = vp->Y;
- vp_rect.right = vp->X + vp->Width;
- vp_rect.bottom = vp->Y + vp->Height;
- if (!(Count > 0 && pRects)) {
- if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
- IntersectRect(&vp_rect, &vp_rect, &This->stateBlock->scissorRect);
- }
+ if (!clear_rect)
+ {
if (context->render_offscreen)
{
- glScissor(vp_rect.left, vp_rect.top,
- vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
- } else {
- glScissor(vp_rect.left, drawable_height - vp_rect.bottom,
- vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
+ glScissor(draw_rect.left, draw_rect.top,
+ draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top);
+ }
+ else
+ {
+ glScissor(draw_rect.left, drawable_height - draw_rect.bottom,
+ draw_rect.right - draw_rect.left, draw_rect.bottom - draw_rect.top);
}
checkGLcall("glScissor");
glClear(glMask);
checkGLcall("glClear");
- } else {
- /* Now process each rect in turn */
- for (i = 0; i < Count; i++) {
+ }
+ else
+ {
+ RECT current_rect;
+
+ /* Now process each rect in turn. */
+ for (i = 0; i < Count; ++i)
+ {
/* Note gl uses lower left, width/height */
- IntersectRect((RECT *)&curRect, &vp_rect, (const RECT *)&pRects[i]);
- if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
- IntersectRect((RECT *) &curRect, (RECT *) &curRect, &This->stateBlock->scissorRect);
- }
- TRACE("(%p) Rect=(%d,%d)->(%d,%d) glRect=(%d,%d), len=%d, hei=%d\n", This,
- pRects[i].x1, pRects[i].y1, pRects[i].x2, pRects[i].y2,
- curRect.x1, (target->currentDesc.Height - curRect.y2),
- curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
+ IntersectRect(¤t_rect, &draw_rect, &clear_rect[i]);
+
+ TRACE("clear_rect[%u] %s, current_rect %s.\n", i,
+ wine_dbgstr_rect(&clear_rect[i]),
+ wine_dbgstr_rect(¤t_rect));
/* Tests show that rectangles where x1 > x2 or y1 > y2 are ignored silently.
* The rectangle is not cleared, no error is returned, but further rectanlges are
- * still cleared if they are valid
- */
- if(curRect.x1 > curRect.x2 || curRect.y1 > curRect.y2) {
- TRACE("Rectangle with negative dimensions, ignoring\n");
+ * still cleared if they are valid. */
+ if (current_rect.left > current_rect.right || current_rect.top > current_rect.bottom)
+ {
+ TRACE("Rectangle with negative dimensions, ignoring.\n");
continue;
}
if (context->render_offscreen)
{
- glScissor(curRect.x1, curRect.y1,
- curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
- } else {
- glScissor(curRect.x1, drawable_height - curRect.y2,
- curRect.x2 - curRect.x1, curRect.y2 - curRect.y1);
+ glScissor(current_rect.left, current_rect.top,
+ current_rect.right - current_rect.left, current_rect.bottom - current_rect.top);
+ }
+ else
+ {
+ glScissor(current_rect.left, drawable_height - current_rect.bottom,
+ current_rect.right - current_rect.left, current_rect.bottom - current_rect.top);
}
checkGLcall("glScissor");
@@ -4406,52 +4564,33 @@ HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfa
}
}
- /* Restore the old values (why..?) */
- if (Flags & WINED3DCLEAR_STENCIL) {
- glStencilMask(This->stateBlock->renderState[WINED3DRS_STENCILWRITEMASK]);
- }
- if (Flags & WINED3DCLEAR_TARGET) {
- DWORD mask = This->stateBlock->renderState[WINED3DRS_COLORWRITEENABLE];
- glColorMask(mask & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
- mask & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
- mask & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
- mask & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
-
- /* Dirtify the target surface for now. If the surface is locked regularly, and an up to date sysmem copy exists,
- * it is most likely more efficient to perform a clear on the sysmem copy too instead of downloading it
- */
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
- }
- if (Flags & WINED3DCLEAR_ZBUFFER) {
- /* Note that WINED3DCLEAR_ZBUFFER implies a depth stencil exists on the device */
- DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
- surface_modify_ds_location(This->stencilBufferTarget, location);
- }
-
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering || ((target->Flags & SFLAG_SWAPCHAIN)
+ && ((IWineD3DSwapChainImpl *)target->container)->front_buffer == target))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count, CONST WINED3DRECT* pRects,
- DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) {
+static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Count,
+ const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)This->render_targets[0];
TRACE("(%p) Count (%d), pRects (%p), Flags (%x), Color (0x%08x), Z (%f), Stencil (%d)\n", This,
Count, pRects, Flags, Color, Z, Stencil);
- if(Flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && This->stencilBufferTarget == NULL) {
+ if (Flags & (WINED3DCLEAR_ZBUFFER | WINED3DCLEAR_STENCIL) && !This->depth_stencil)
+ {
WARN("Clearing depth and/or stencil without a depth stencil buffer attached, returning WINED3DERR_INVALIDCALL\n");
/* TODO: What about depth stencil buffers without stencil bits? */
return WINED3DERR_INVALIDCALL;
}
- return IWineD3DDeviceImpl_ClearSurface(This, target, Count, pRects, Flags, Color, Z, Stencil);
+ return IWineD3DDeviceImpl_ClearSurface(This, This->render_targets[0], Count, pRects, Flags, Color, Z, Stencil);
}
/*****
@@ -5083,71 +5222,58 @@ static float WINAPI IWineD3DDeviceImpl_GetNPatchMode(IWineD3DDevice *iface)
return 0.0f;
}
-static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface, IWineD3DSurface *pSourceSurface, CONST RECT* pSourceRect, IWineD3DSurface *pDestinationSurface, CONST POINT* pDestPoint) {
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- /** TODO: remove casts to IWineD3DSurfaceImpl
- * NOTE: move code to surface to accomplish this
- ****************************************/
- IWineD3DSurfaceImpl *pSrcSurface = (IWineD3DSurfaceImpl *)pSourceSurface;
- IWineD3DSurfaceImpl *dst_impl = (IWineD3DSurfaceImpl *)pDestinationSurface;
- int srcWidth, srcHeight;
- unsigned int srcSurfaceWidth, srcSurfaceHeight, destSurfaceWidth, destSurfaceHeight;
- WINED3DFORMAT destFormat, srcFormat;
- UINT destSize;
- int srcLeft, destLeft, destTop;
- WINED3DPOOL srcPool, destPool;
- int offset = 0;
- int rowoffset = 0; /* how many bytes to add onto the end of a row to wraparound to the beginning of the next */
- const struct GlPixelFormatDesc *src_format_desc, *dst_format_desc;
- GLenum dummy;
- DWORD sampler;
- int bpp;
- CONVERT_TYPES convert = NO_CONVERSION;
+static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
+ IWineD3DSurface *src_surface, const RECT *src_rect,
+ IWineD3DSurface *dst_surface, const POINT *dst_point)
+{
+ IWineD3DSurfaceImpl *src_impl = (IWineD3DSurfaceImpl *)src_surface;
+ IWineD3DSurfaceImpl *dst_impl = (IWineD3DSurfaceImpl *)dst_surface;
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
+ const struct wined3d_format_desc *src_format;
+ const struct wined3d_format_desc *dst_format;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
+ const unsigned char *data;
+ UINT update_w, update_h;
+ CONVERT_TYPES convert;
+ UINT src_w, src_h;
+ UINT dst_x, dst_y;
+ DWORD sampler;
+ struct wined3d_format_desc desc;
- WINED3DSURFACE_DESC winedesc;
+ TRACE("iface %p, src_surface %p, src_rect %s, dst_surface %p, dst_point %s.\n",
+ iface, src_surface, wine_dbgstr_rect(src_rect),
+ dst_surface, wine_dbgstr_point(dst_point));
- TRACE("(%p) : Source (%p) Rect (%p) Destination (%p) Point(%p)\n", This, pSourceSurface, pSourceRect, pDestinationSurface, pDestPoint);
-
- IWineD3DSurface_GetDesc(pSourceSurface, &winedesc);
- srcSurfaceWidth = winedesc.width;
- srcSurfaceHeight = winedesc.height;
- srcPool = winedesc.pool;
- srcFormat = winedesc.format;
-
- IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc);
- destSurfaceWidth = winedesc.width;
- destSurfaceHeight = winedesc.height;
- destPool = winedesc.pool;
- destFormat = winedesc.format;
- destSize = winedesc.size;
-
- if(srcPool != WINED3DPOOL_SYSTEMMEM || destPool != WINED3DPOOL_DEFAULT){
- WARN("source %p must be SYSTEMMEM and dest %p must be DEFAULT, returning WINED3DERR_INVALIDCALL\n", pSourceSurface, pDestinationSurface);
+ if (src_impl->resource.pool != WINED3DPOOL_SYSTEMMEM || dst_impl->resource.pool != WINED3DPOOL_DEFAULT)
+ {
+ WARN("source %p must be SYSTEMMEM and dest %p must be DEFAULT, returning WINED3DERR_INVALIDCALL\n",
+ src_surface, dst_surface);
return WINED3DERR_INVALIDCALL;
}
- /* This call loads the opengl surface directly, instead of copying the surface to the
- * destination's sysmem copy. If surface conversion is needed, use BltFast instead to
- * copy in sysmem and use regular surface loading.
- */
- d3dfmt_get_conv(dst_impl, FALSE, TRUE, &dummy, &dummy, &dummy, &convert, &bpp, FALSE);
- if(convert != NO_CONVERSION) {
- return IWineD3DSurface_BltFast(pDestinationSurface,
- pDestPoint ? pDestPoint->x : 0,
- pDestPoint ? pDestPoint->y : 0,
- pSourceSurface, pSourceRect, 0);
+ src_format = src_impl->resource.format_desc;
+ dst_format = dst_impl->resource.format_desc;
+
+ if (src_format->format != dst_format->format)
+ {
+ WARN("Source and destination surfaces should have the same format.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (destFormat == WINED3DFMT_UNKNOWN) {
- TRACE("(%p) : Converting destination surface from WINED3DFMT_UNKNOWN to the source format\n", This);
- IWineD3DSurface_SetFormat(pDestinationSurface, srcFormat);
+ dst_x = dst_point ? dst_point->x : 0;
+ dst_y = dst_point ? dst_point->y : 0;
- /* Get the update surface description */
- IWineD3DSurface_GetDesc(pDestinationSurface, &winedesc);
- }
+ /* This call loads the OpenGL surface directly, instead of copying the
+ * surface to the destination's sysmem copy. If surface conversion is
+ * needed, use BltFast instead to copy in sysmem and use regular surface
+ * loading. */
+ d3dfmt_get_conv(dst_impl, FALSE, TRUE, &desc, &convert);
+ if (convert != NO_CONVERSION || desc.convert)
+ return IWineD3DSurface_BltFast(dst_surface, dst_x, dst_y, src_surface, src_rect, 0);
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
+ gl_info = context->gl_info;
ENTER_GL();
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));
@@ -5155,92 +5281,79 @@ static HRESULT WINAPI IWineD3DDeviceImpl_UpdateSurface(IWineD3DDevice *iface,
LEAVE_GL();
/* Make sure the surface is loaded and up to date */
- surface_internal_preload(pDestinationSurface, SRGB_RGB);
- IWineD3DSurface_BindTexture(pDestinationSurface, FALSE);
+ surface_internal_preload(dst_impl, SRGB_RGB);
+ IWineD3DSurface_BindTexture(dst_surface, FALSE);
- src_format_desc = ((IWineD3DSurfaceImpl *)pSrcSurface)->resource.format_desc;
- dst_format_desc = dst_impl->resource.format_desc;
+ src_w = src_impl->currentDesc.Width;
+ src_h = src_impl->currentDesc.Height;
+ update_w = src_rect ? src_rect->right - src_rect->left : src_w;
+ update_h = src_rect ? src_rect->bottom - src_rect->top : src_h;
- /* this needs to be done in lines if the sourceRect != the sourceWidth */
- srcWidth = pSourceRect ? pSourceRect->right - pSourceRect->left : srcSurfaceWidth;
- srcHeight = pSourceRect ? pSourceRect->bottom - pSourceRect->top : srcSurfaceHeight;
- srcLeft = pSourceRect ? pSourceRect->left : 0;
- destLeft = pDestPoint ? pDestPoint->x : 0;
- destTop = pDestPoint ? pDestPoint->y : 0;
-
-
- /* This function doesn't support compressed textures
- the pitch is just bytesPerPixel * width */
- if(srcWidth != srcSurfaceWidth || srcLeft ){
- rowoffset = srcSurfaceWidth * src_format_desc->byte_count;
- offset += srcLeft * src_format_desc->byte_count;
- /* TODO: do we ever get 3bpp?, would a shift and an add be quicker than a mul (well maybe a cycle or two) */
- }
- /* TODO DXT formats */
-
- if(pSourceRect != NULL && pSourceRect->top != 0){
- offset += pSourceRect->top * srcSurfaceWidth * src_format_desc->byte_count;
- }
- TRACE("(%p) glTexSubImage2D, level %d, left %d, top %d, width %d, height %d, fmt %#x, type %#x, memory %p+%#x\n",
- This, dst_impl->texture_level, destLeft, destTop, srcWidth, srcHeight, dst_format_desc->glFormat,
- dst_format_desc->glType, IWineD3DSurface_GetData(pSourceSurface), offset);
-
- /* Sanity check */
- if (IWineD3DSurface_GetData(pSourceSurface) == NULL) {
-
- /* need to lock the surface to get the data */
- FIXME("Surfaces has no allocated memory, but should be an in memory only surface\n");
- }
+ data = IWineD3DSurface_GetData(src_surface);
+ if (!data) ERR("Source surface has no allocated memory, but should be a sysmem surface.\n");
ENTER_GL();
- /* TODO: Cube and volume support */
- if(rowoffset != 0){
- /* not a whole row so we have to do it a line at a time */
- int j;
+ if (dst_format->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ {
+ UINT row_length = (update_w / src_format->block_width) * src_format->block_byte_count;
+ UINT row_count = update_h / src_format->block_height;
+ UINT src_pitch = IWineD3DSurface_GetPitch(src_surface);
- /* hopefully using pointer addition will be quicker than using a point + j * rowoffset */
- const unsigned char* data =((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
-
- for (j = destTop; j < (srcHeight + destTop); ++j)
+ if (src_rect)
{
- glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, j,
- srcWidth, 1, dst_format_desc->glFormat, dst_format_desc->glType,data);
- data += rowoffset;
+ data += (src_rect->top / src_format->block_height) * src_pitch;
+ data += (src_rect->left / src_format->block_width) * src_format->block_byte_count;
}
- } else { /* Full width, so just write out the whole texture */
- const unsigned char* data = ((const unsigned char *)IWineD3DSurface_GetData(pSourceSurface)) + offset;
+ TRACE("glCompressedTexSubImage2DARB, target %#x, level %d, x %d, y %d, w %d, h %d, "
+ "format %#x, image_size %#x, data %p.\n", dst_impl->texture_target, dst_impl->texture_level,
+ dst_x, dst_y, update_w, update_h, dst_format->glFormat, row_count * row_length, data);
- if (dst_format_desc->Flags & WINED3DFMT_FLAG_COMPRESSED)
+ if (row_length == src_pitch)
{
- if (destSurfaceHeight != srcHeight || destSurfaceWidth != srcWidth)
- {
- /* FIXME: The easy way to do this is to lock the destination, and copy the bits across. */
- FIXME("Updating part of a compressed texture is not supported.\n");
- }
- if (destFormat != srcFormat)
- {
- FIXME("Updating mixed format compressed textures is not supported.\n");
- }
- else
- {
- GL_EXTCALL(glCompressedTexImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
- dst_format_desc->glInternal, srcWidth, srcHeight, 0, destSize, data));
- }
+ GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
+ dst_x, dst_y, update_w, update_h, dst_format->glInternal, row_count * row_length, data));
}
else
{
- glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, destLeft, destTop,
- srcWidth, srcHeight, dst_format_desc->glFormat, dst_format_desc->glType, data);
+ UINT row, y;
+
+ /* glCompressedTexSubImage2DARB() ignores pixel store state, so we
+ * can't use the unpack row length like below. */
+ for (row = 0, y = dst_y; row < row_count; ++row)
+ {
+ GL_EXTCALL(glCompressedTexSubImage2DARB(dst_impl->texture_target, dst_impl->texture_level,
+ dst_x, y, update_w, src_format->block_height, dst_format->glInternal, row_length, data));
+ y += src_format->block_height;
+ data += src_pitch;
+ }
}
- }
- checkGLcall("glTexSubImage2D");
+ checkGLcall("glCompressedTexSubImage2DARB");
+ }
+ else
+ {
+ if (src_rect)
+ {
+ data += src_rect->top * src_w * src_format->byte_count;
+ data += src_rect->left * src_format->byte_count;
+ }
+
+ TRACE("glTexSubImage2D, target %#x, level %d, x %d, y %d, w %d, h %d, format %#x, type %#x, data %p.\n",
+ dst_impl->texture_target, dst_impl->texture_level, dst_x, dst_y,
+ update_w, update_h, dst_format->glFormat, dst_format->glType, data);
+
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, src_w);
+ glTexSubImage2D(dst_impl->texture_target, dst_impl->texture_level, dst_x, dst_y,
+ update_w, update_h, dst_format->glFormat, dst_format->glType, data);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ checkGLcall("glTexSubImage2D");
+ }
LEAVE_GL();
context_release(context);
- IWineD3DSurface_ModifyLocation(pDestinationSurface, SFLAG_INTEXTURE, TRUE);
+ IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INTEXTURE, TRUE);
sampler = This->rev_tex_unit_map[0];
if (sampler != WINED3D_UNMAPPED_STAGE)
{
@@ -5370,68 +5483,39 @@ static HRESULT WINAPI IWineD3DDeviceImpl_DeletePatch(IWineD3DDevice *iface, UINT
return WINED3DERR_INVALIDCALL;
}
-static IWineD3DSwapChain *get_swapchain(IWineD3DSurface *target) {
- HRESULT hr;
- IWineD3DSwapChain *swapchain;
-
- hr = IWineD3DSurface_GetContainer(target, &IID_IWineD3DSwapChain, (void **)&swapchain);
- if (SUCCEEDED(hr)) {
- IWineD3DSwapChain_Release((IUnknown *)swapchain);
- return swapchain;
- }
-
- return NULL;
-}
-
-static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
+static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface,
const WINED3DRECT *rect, const float color[4])
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
struct wined3d_context *context;
- if (rect) IWineD3DSurface_LoadLocation(surface, SFLAG_INDRAWABLE, NULL);
- IWineD3DSurface_ModifyLocation(surface, SFLAG_INDRAWABLE, TRUE);
+ if (rect) IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INDRAWABLE, TRUE);
- if (!surface_is_offscreen(surface))
+ context = context_acquire(This, surface);
+ context_apply_clear_state(context, This, surface, NULL);
+
+ ENTER_GL();
+
+ if (rect)
{
- TRACE("Surface %p is onscreen\n", surface);
-
- context = context_acquire(This, surface, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- context_set_draw_buffer(context, surface_get_gl_buffer(surface));
+ if (surface_is_offscreen(surface))
+ glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1);
+ else
+ glScissor(rect->x1, surface->currentDesc.Height - rect->y2,
+ rect->x2 - rect->x1, rect->y2 - rect->y1);
+ checkGLcall("glScissor");
}
else
{
- TRACE("Surface %p is offscreen\n", surface);
-
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
- ENTER_GL();
- context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
- context_attach_surface_fbo(context, GL_FRAMEBUFFER, 0, surface);
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, NULL, FALSE);
- }
-
- if (rect) {
- glEnable(GL_SCISSOR_TEST);
- if(surface_is_offscreen(surface)) {
- glScissor(rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1);
- } else {
- glScissor(rect->x1, ((IWineD3DSurfaceImpl *)surface)->currentDesc.Height - rect->y2,
- rect->x2 - rect->x1, rect->y2 - rect->y1);
- }
- checkGLcall("glScissor");
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_SCISSORRECT);
- } else {
glDisable(GL_SCISSOR_TEST);
}
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
-
- glDisable(GL_BLEND);
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ALPHABLENDENABLE));
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE1));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE2));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_COLORWRITEENABLE3));
glClearColor(color[0], color[1], color[2], color[3]);
glClear(GL_COLOR_BUFFER_BIT);
@@ -5439,119 +5523,11 @@ static void color_fill_fbo(IWineD3DDevice *iface, IWineD3DSurface *surface,
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
}
-static inline DWORD argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) {
- unsigned int r, g, b, a;
- DWORD ret;
-
- if (destfmt == WINED3DFMT_B8G8R8A8_UNORM
- || destfmt == WINED3DFMT_B8G8R8X8_UNORM
- || destfmt == WINED3DFMT_B8G8R8_UNORM)
- return color;
-
- TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt));
-
- a = (color & 0xff000000) >> 24;
- r = (color & 0x00ff0000) >> 16;
- g = (color & 0x0000ff00) >> 8;
- b = (color & 0x000000ff) >> 0;
-
- switch(destfmt)
- {
- case WINED3DFMT_B5G6R5_UNORM:
- if(r == 0xff && g == 0xff && b == 0xff) return 0xffff;
- r = (r * 32) / 256;
- g = (g * 64) / 256;
- b = (b * 32) / 256;
- ret = r << 11;
- ret |= g << 5;
- ret |= b;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_B5G5R5X1_UNORM:
- case WINED3DFMT_B5G5R5A1_UNORM:
- a = (a * 2) / 256;
- r = (r * 32) / 256;
- g = (g * 32) / 256;
- b = (b * 32) / 256;
- ret = a << 15;
- ret |= r << 10;
- ret |= g << 5;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_A8_UNORM:
- TRACE("Returning %08x\n", a);
- return a;
-
- case WINED3DFMT_B4G4R4X4_UNORM:
- case WINED3DFMT_B4G4R4A4_UNORM:
- a = (a * 16) / 256;
- r = (r * 16) / 256;
- g = (g * 16) / 256;
- b = (b * 16) / 256;
- ret = a << 12;
- ret |= r << 8;
- ret |= g << 4;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_B2G3R3_UNORM:
- r = (r * 8) / 256;
- g = (g * 8) / 256;
- b = (b * 4) / 256;
- ret = r << 5;
- ret |= g << 2;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_R8G8B8X8_UNORM:
- case WINED3DFMT_R8G8B8A8_UNORM:
- ret = a << 24;
- ret |= b << 16;
- ret |= g << 8;
- ret |= r << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_B10G10R10A2_UNORM:
- a = (a * 4) / 256;
- r = (r * 1024) / 256;
- g = (g * 1024) / 256;
- b = (b * 1024) / 256;
- ret = a << 30;
- ret |= r << 20;
- ret |= g << 10;
- ret |= b << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- case WINED3DFMT_R10G10B10A2_UNORM:
- a = (a * 4) / 256;
- r = (r * 1024) / 256;
- g = (g * 1024) / 256;
- b = (b * 1024) / 256;
- ret = a << 30;
- ret |= b << 20;
- ret |= g << 10;
- ret |= r << 0;
- TRACE("Returning %08x\n", ret);
- return ret;
-
- default:
- FIXME("Add a COLORFILL conversion for format %s\n", debug_d3dformat(destfmt));
- return 0;
- }
-}
-
static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface,
IWineD3DSurface *pSurface, const WINED3DRECT *pRect, WINED3DCOLOR color)
{
@@ -5567,13 +5543,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_ColorFill(IWineD3DDevice *iface,
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
const float c[4] = {D3DCOLOR_R(color), D3DCOLOR_G(color), D3DCOLOR_B(color), D3DCOLOR_A(color)};
- color_fill_fbo(iface, pSurface, pRect, c);
+ color_fill_fbo(iface, surface, pRect, c);
return WINED3D_OK;
} else {
/* Just forward this to the DirectDraw blitting engine */
memset(&BltFx, 0, sizeof(BltFx));
BltFx.dwSize = sizeof(BltFx);
- BltFx.u5.dwFillColor = argb_to_fmt(color, surface->resource.format_desc->format);
+ BltFx.u5.dwFillColor = color_convert_argb_to_fmt(color, surface->resource.format_desc->format);
return IWineD3DSurface_Blt(pSurface, (const RECT *)pRect, NULL, NULL,
WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
}
@@ -5583,7 +5559,7 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
IWineD3DRendertargetView *rendertarget_view, const float color[4])
{
IWineD3DResource *resource;
- IWineD3DSurface *surface;
+ IWineD3DSurfaceImpl *surface;
HRESULT hr;
hr = IWineD3DRendertargetView_GetResource(rendertarget_view, &resource);
@@ -5600,7 +5576,7 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
return;
}
- surface = (IWineD3DSurface *)resource;
+ surface = (IWineD3DSurfaceImpl *)resource;
if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
@@ -5621,8 +5597,9 @@ static void WINAPI IWineD3DDeviceImpl_ClearRendertargetView(IWineD3DDevice *ifac
/* Just forward this to the DirectDraw blitting engine */
memset(&BltFx, 0, sizeof(BltFx));
BltFx.dwSize = sizeof(BltFx);
- BltFx.u5.dwFillColor = argb_to_fmt(c, ((IWineD3DSurfaceImpl *)surface)->resource.format_desc->format);
- hr = IWineD3DSurface_Blt(surface, NULL, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
+ BltFx.u5.dwFillColor = color_convert_argb_to_fmt(c, surface->resource.format_desc->format);
+ hr = IWineD3DSurface_Blt((IWineD3DSurface *)surface, NULL, NULL, NULL,
+ WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
if (FAILED(hr))
{
ERR("Blt failed, hr %#x\n", hr);
@@ -5643,7 +5620,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface
return WINED3DERR_INVALIDCALL;
}
- *ppRenderTarget = This->render_targets[RenderTargetIndex];
+ *ppRenderTarget = (IWineD3DSurface *)This->render_targets[RenderTargetIndex];
TRACE("(%p) : RenderTarget %d Index returning %p\n", This, RenderTargetIndex, *ppRenderTarget);
/* Note inc ref on returned surface */
if(*ppRenderTarget != NULL)
@@ -5652,110 +5629,103 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetRenderTarget(IWineD3DDevice* iface
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetFrontBackBuffers(IWineD3DDevice *iface,
- IWineD3DSurface *Front, IWineD3DSurface *Back)
+ IWineD3DSurface *front, IWineD3DSurface *back)
{
- IWineD3DSurfaceImpl *FrontImpl = (IWineD3DSurfaceImpl *) Front;
- IWineD3DSurfaceImpl *BackImpl = (IWineD3DSurfaceImpl *) Back;
- IWineD3DSwapChainImpl *Swapchain;
+ IWineD3DSurfaceImpl *front_impl = (IWineD3DSurfaceImpl *)front;
+ IWineD3DSurfaceImpl *back_impl = (IWineD3DSurfaceImpl *)back;
+ IWineD3DSwapChainImpl *swapchain;
HRESULT hr;
- TRACE("iface %p, front %p, back %p.\n", iface, Front, Back);
+ TRACE("iface %p, front %p, back %p.\n", iface, front, back);
- hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **) &Swapchain);
- if(hr != WINED3D_OK) {
- ERR("Can't get the swapchain\n");
+ if (FAILED(hr = IWineD3DDevice_GetSwapChain(iface, 0, (IWineD3DSwapChain **)&swapchain)))
+ {
+ ERR("Failed to get the swapchain, hr %#x.\n", hr);
return hr;
}
- /* Make sure to release the swapchain */
- IWineD3DSwapChain_Release((IWineD3DSwapChain *) Swapchain);
-
- if(FrontImpl && !(FrontImpl->resource.usage & WINED3DUSAGE_RENDERTARGET) ) {
- ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
- return WINED3DERR_INVALIDCALL;
- }
- else if(BackImpl && !(BackImpl->resource.usage & WINED3DUSAGE_RENDERTARGET)) {
- ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage\n");
+ if (front_impl && !(front_impl->resource.usage & WINED3DUSAGE_RENDERTARGET))
+ {
+ ERR("Trying to set a front buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n");
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
return WINED3DERR_INVALIDCALL;
}
- if(Swapchain->frontBuffer != Front) {
- TRACE("Changing the front buffer from %p to %p\n", Swapchain->frontBuffer, Front);
-
- if(Swapchain->frontBuffer)
+ if (back_impl)
+ {
+ if (!(back_impl->resource.usage & WINED3DUSAGE_RENDERTARGET))
{
- IWineD3DSurface_SetContainer(Swapchain->frontBuffer, NULL);
- ((IWineD3DSurfaceImpl *)Swapchain->frontBuffer)->Flags &= ~SFLAG_SWAPCHAIN;
+ ERR("Trying to set a back buffer which doesn't have WINED3DUSAGE_RENDERTARGET usage.\n");
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
+ return WINED3DERR_INVALIDCALL;
}
- Swapchain->frontBuffer = Front;
- if(Swapchain->frontBuffer) {
- IWineD3DSurface_SetContainer(Swapchain->frontBuffer, (IWineD3DBase *) Swapchain);
- ((IWineD3DSurfaceImpl *)Swapchain->frontBuffer)->Flags |= SFLAG_SWAPCHAIN;
- }
- }
-
- if(Back && !Swapchain->backBuffer) {
- /* We need memory for the back buffer array - only one back buffer this way */
- Swapchain->backBuffer = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DSurface *));
- if(!Swapchain->backBuffer) {
- ERR("Out of memory\n");
- return E_OUTOFMEMORY;
- }
- }
-
- if(Swapchain->backBuffer[0] != Back) {
- TRACE("Changing the back buffer from %p to %p\n", Swapchain->backBuffer, Back);
-
- /* What to do about the context here in the case of multithreading? Not sure.
- * This function is called by IDirect3D7::CreateDevice so in theory its initialization code
- */
- WARN("No active context?\n");
-
- ENTER_GL();
- if(!Swapchain->backBuffer[0]) {
- /* GL was told to draw to the front buffer at creation,
- * undo that
- */
- glDrawBuffer(GL_BACK);
- checkGLcall("glDrawBuffer(GL_BACK)");
- /* Set the backbuffer count to 1 because other code uses it to fing the back buffers */
- Swapchain->presentParms.BackBufferCount = 1;
- } else if (!Back) {
- /* That makes problems - disable for now */
- /* glDrawBuffer(GL_FRONT); */
- checkGLcall("glDrawBuffer(GL_FRONT)");
- /* We have lost our back buffer, set this to 0 to avoid confusing other code */
- Swapchain->presentParms.BackBufferCount = 0;
- }
- LEAVE_GL();
-
- if(Swapchain->backBuffer[0])
+ if (!swapchain->back_buffers)
{
- IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], NULL);
- ((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags &= ~SFLAG_SWAPCHAIN;
+ swapchain->back_buffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*swapchain->back_buffers));
+ if (!swapchain->back_buffers)
+ {
+ ERR("Failed to allocate back buffer array memory.\n");
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
+ return E_OUTOFMEMORY;
+ }
}
- Swapchain->backBuffer[0] = Back;
-
- if(Swapchain->backBuffer[0]) {
- IWineD3DSurface_SetContainer(Swapchain->backBuffer[0], (IWineD3DBase *) Swapchain);
- ((IWineD3DSurfaceImpl *)Swapchain->backBuffer[0])->Flags |= SFLAG_SWAPCHAIN;
- Swapchain->presentParms.BackBufferWidth = BackImpl->currentDesc.Width;
- Swapchain->presentParms.BackBufferHeight = BackImpl->currentDesc.Height;
- Swapchain->presentParms.BackBufferFormat = BackImpl->resource.format_desc->format;
- } else {
- HeapFree(GetProcessHeap(), 0, Swapchain->backBuffer);
- Swapchain->backBuffer = NULL;
- }
-
}
+ if (swapchain->front_buffer != front_impl)
+ {
+ TRACE("Changing the front buffer from %p to %p.\n", swapchain->front_buffer, front_impl);
+
+ if (swapchain->front_buffer)
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, NULL);
+ swapchain->front_buffer->Flags &= ~SFLAG_SWAPCHAIN;
+ }
+ swapchain->front_buffer = front_impl;
+
+ if (front)
+ {
+ IWineD3DSurface_SetContainer(front, (IWineD3DBase *)swapchain);
+ front_impl->Flags |= SFLAG_SWAPCHAIN;
+ }
+ }
+
+ if (swapchain->back_buffers[0] != back_impl)
+ {
+ TRACE("Changing the back buffer from %p to %p.\n", swapchain->back_buffers[0], back_impl);
+
+ if (swapchain->back_buffers[0])
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[0], NULL);
+ swapchain->back_buffers[0]->Flags &= ~SFLAG_SWAPCHAIN;
+ }
+ swapchain->back_buffers[0] = back_impl;
+
+ if (back)
+ {
+ swapchain->presentParms.BackBufferWidth = back_impl->currentDesc.Width;
+ swapchain->presentParms.BackBufferHeight = back_impl->currentDesc.Height;
+ swapchain->presentParms.BackBufferFormat = back_impl->resource.format_desc->format;
+ swapchain->presentParms.BackBufferCount = 1;
+
+ IWineD3DSurface_SetContainer(back, (IWineD3DBase *)swapchain);
+ back_impl->Flags |= SFLAG_SWAPCHAIN;
+ }
+ else
+ {
+ swapchain->presentParms.BackBufferCount = 0;
+ HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
+ swapchain->back_buffers = NULL;
+ }
+ }
+
+ IWineD3DSwapChain_Release((IWineD3DSwapChain *)swapchain);
return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice* iface, IWineD3DSurface **ppZStencilSurface) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- *ppZStencilSurface = This->stencilBufferTarget;
+ *ppZStencilSurface = (IWineD3DSurface *)This->depth_stencil;
TRACE("(%p) : zStencilSurface returning %p\n", This, *ppZStencilSurface);
if(*ppZStencilSurface != NULL) {
@@ -5767,21 +5737,21 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetDepthStencilSurface(IWineD3DDevice
}
}
-void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED3DRECT *src_rect,
- IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect, const WINED3DTEXTUREFILTERTYPE filter, BOOL flip)
+void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect_in,
+ IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, const WINED3DTEXTUREFILTERTYPE filter)
{
- IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
GLbitfield mask = GL_COLOR_BUFFER_BIT; /* TODO: Support blitting depth/stencil surfaces */
- IWineD3DSwapChain *src_swapchain, *dst_swapchain;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
GLenum gl_filter;
- POINT offset = {0, 0};
+ RECT src_rect, dst_rect;
- TRACE("(%p) : src_surface %p, src_rect %p, dst_surface %p, dst_rect %p, filter %s (0x%08x), flip %u\n",
- This, src_surface, src_rect, dst_surface, dst_rect, debug_d3dtexturefiltertype(filter), filter, flip);
- TRACE("src_rect [%u, %u]->[%u, %u]\n", src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2);
- TRACE("dst_rect [%u, %u]->[%u, %u]\n", dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2);
+ TRACE("device %p, src_surface %p, src_rect_in %s, dst_surface %p, dst_rect_in %s, filter %s (0x%08x).\n",
+ device, src_surface, wine_dbgstr_rect(src_rect_in), dst_surface,
+ wine_dbgstr_rect(dst_rect_in), debug_d3dtexturefiltertype(filter), filter);
+
+ src_rect = *src_rect_in;
+ dst_rect = *dst_rect_in;
switch (filter) {
case WINED3DTEXF_LINEAR:
@@ -5799,16 +5769,19 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
/* Make sure the drawables are up-to-date. Note that loading the
* destination surface isn't strictly required if we overwrite the
* entire surface. */
- IWineD3DSurface_LoadLocation(src_surface, SFLAG_INDRAWABLE, NULL);
- IWineD3DSurface_LoadLocation(dst_surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)src_surface, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, NULL);
- /* Attach src surface to src fbo */
- src_swapchain = get_swapchain(src_surface);
- dst_swapchain = get_swapchain(dst_surface);
+ if (!surface_is_offscreen(src_surface)) context = context_acquire(device, src_surface);
+ else if (!surface_is_offscreen(dst_surface)) context = context_acquire(device, dst_surface);
+ else context = context_acquire(device, NULL);
- if (src_swapchain) context = context_acquire(This, src_surface, CTXUSAGE_RESOURCELOAD);
- else if (dst_swapchain) context = context_acquire(This, dst_surface, CTXUSAGE_RESOURCELOAD);
- else context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping blit.\n");
+ return;
+ }
gl_info = context->gl_info;
@@ -5818,19 +5791,11 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
TRACE("Source surface %p is onscreen\n", src_surface);
- if(buffer == GL_FRONT) {
- RECT windowsize;
- UINT h;
- ClientToScreen(((IWineD3DSwapChainImpl *)src_swapchain)->win_handle, &offset);
- GetClientRect(((IWineD3DSwapChainImpl *)src_swapchain)->win_handle, &windowsize);
- h = windowsize.bottom - windowsize.top;
- src_rect->x1 -= offset.x; src_rect->x2 -=offset.x;
- src_rect->y1 = offset.y + h - src_rect->y1;
- src_rect->y2 = offset.y + h - src_rect->y2;
- } else {
- src_rect->y1 = ((IWineD3DSurfaceImpl *)src_surface)->currentDesc.Height - src_rect->y1;
- src_rect->y2 = ((IWineD3DSurfaceImpl *)src_surface)->currentDesc.Height - src_rect->y2;
- }
+ if (buffer == GL_FRONT)
+ surface_translate_frontbuffer_coords(src_surface, context->win_handle, &src_rect);
+
+ src_rect.top = src_surface->currentDesc.Height - src_rect.top;
+ src_rect.bottom = src_surface->currentDesc.Height - src_rect.bottom;
ENTER_GL();
context_bind_fbo(context, GL_READ_FRAMEBUFFER, NULL);
@@ -5839,11 +5804,9 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
} else {
TRACE("Source surface %p is offscreen\n", src_surface);
ENTER_GL();
- context_bind_fbo(context, GL_READ_FRAMEBUFFER, &context->src_fbo);
- context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER, 0, src_surface);
+ context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, src_surface, NULL);
glReadBuffer(GL_COLOR_ATTACHMENT0);
checkGLcall("glReadBuffer()");
- context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER, NULL, FALSE);
}
LEAVE_GL();
@@ -5854,20 +5817,11 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
TRACE("Destination surface %p is onscreen\n", dst_surface);
- if(buffer == GL_FRONT) {
- RECT windowsize;
- UINT h;
- ClientToScreen(((IWineD3DSwapChainImpl *)dst_swapchain)->win_handle, &offset);
- GetClientRect(((IWineD3DSwapChainImpl *)dst_swapchain)->win_handle, &windowsize);
- h = windowsize.bottom - windowsize.top;
- dst_rect->x1 -= offset.x; dst_rect->x2 -=offset.x;
- dst_rect->y1 = offset.y + h - dst_rect->y1;
- dst_rect->y2 = offset.y + h - dst_rect->y2;
- } else {
- /* Screen coords = window coords, surface height = window height */
- dst_rect->y1 = ((IWineD3DSurfaceImpl *)dst_surface)->currentDesc.Height - dst_rect->y1;
- dst_rect->y2 = ((IWineD3DSurfaceImpl *)dst_surface)->currentDesc.Height - dst_rect->y2;
- }
+ if (buffer == GL_FRONT)
+ surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect);
+
+ dst_rect.top = dst_surface->currentDesc.Height - dst_rect.top;
+ dst_rect.bottom = dst_surface->currentDesc.Height - dst_rect.bottom;
ENTER_GL();
context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL);
@@ -5878,31 +5832,23 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface, WINED
TRACE("Destination surface %p is offscreen\n", dst_surface);
ENTER_GL();
- context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, &context->dst_fbo);
- context_attach_surface_fbo(context, GL_DRAW_FRAMEBUFFER, 0, dst_surface);
+ context_apply_fbo_state_blit(context, GL_DRAW_FRAMEBUFFER, dst_surface, NULL);
context_set_draw_buffer(context, GL_COLOR_ATTACHMENT0);
- context_attach_depth_stencil_fbo(context, GL_DRAW_FRAMEBUFFER, NULL, FALSE);
}
glDisable(GL_SCISSOR_TEST);
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_RENDER(WINED3DRS_SCISSORTESTENABLE));
- if (flip) {
- gl_info->fbo_ops.glBlitFramebuffer(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2,
- dst_rect->x1, dst_rect->y2, dst_rect->x2, dst_rect->y1, mask, gl_filter);
- checkGLcall("glBlitFramebuffer()");
- } else {
- gl_info->fbo_ops.glBlitFramebuffer(src_rect->x1, src_rect->y1, src_rect->x2, src_rect->y2,
- dst_rect->x1, dst_rect->y1, dst_rect->x2, dst_rect->y2, mask, gl_filter);
- checkGLcall("glBlitFramebuffer()");
- }
+ gl_info->fbo_ops.glBlitFramebuffer(src_rect.left, src_rect.top, src_rect.right, src_rect.bottom,
+ dst_rect.left, dst_rect.top, dst_rect.right, dst_rect.bottom, mask, gl_filter);
+ checkGLcall("glBlitFramebuffer()");
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
- IWineD3DSurface_ModifyLocation(dst_surface, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE);
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface, DWORD RenderTargetIndex, IWineD3DSurface *pRenderTarget,
@@ -5932,13 +5878,16 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
}
/* If we are trying to set what we already have, don't bother */
- if (pRenderTarget == This->render_targets[RenderTargetIndex]) {
+ if (pRenderTarget == (IWineD3DSurface *)This->render_targets[RenderTargetIndex])
+ {
TRACE("Trying to do a NOP SetRenderTarget operation\n");
return WINED3D_OK;
}
- if(pRenderTarget) IWineD3DSurface_AddRef(pRenderTarget);
- if(This->render_targets[RenderTargetIndex]) IWineD3DSurface_Release(This->render_targets[RenderTargetIndex]);
- This->render_targets[RenderTargetIndex] = pRenderTarget;
+ if (pRenderTarget)
+ IWineD3DSurface_AddRef(pRenderTarget);
+ if (This->render_targets[RenderTargetIndex])
+ IWineD3DSurface_Release((IWineD3DSurface *)This->render_targets[RenderTargetIndex]);
+ This->render_targets[RenderTargetIndex] = (IWineD3DSurfaceImpl *)pRenderTarget;
/* Render target 0 is special */
if(RenderTargetIndex == 0 && set_viewport) {
@@ -5946,8 +5895,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
* Tests show that stateblock recording is ignored, the change goes
* directly into the primary stateblock.
*/
- This->stateBlock->viewport.Height = ((IWineD3DSurfaceImpl *)This->render_targets[0])->currentDesc.Height;
- This->stateBlock->viewport.Width = ((IWineD3DSurfaceImpl *)This->render_targets[0])->currentDesc.Width;
+ This->stateBlock->viewport.Height = This->render_targets[0]->currentDesc.Height;
+ This->stateBlock->viewport.Width = This->render_targets[0]->currentDesc.Width;
This->stateBlock->viewport.X = 0;
This->stateBlock->viewport.Y = 0;
This->stateBlock->viewport.MaxZ = 1.0f;
@@ -5965,49 +5914,46 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetRenderTarget(IWineD3DDevice *iface,
static HRESULT WINAPI IWineD3DDeviceImpl_SetDepthStencilSurface(IWineD3DDevice *iface, IWineD3DSurface *pNewZStencil) {
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- HRESULT hr = WINED3D_OK;
- IWineD3DSurface *tmp;
+ IWineD3DSurfaceImpl *tmp;
- TRACE("(%p) Swapping z-buffer. Old = %p, new = %p\n",This, This->stencilBufferTarget, pNewZStencil);
+ TRACE("device %p, depth_stencil %p, old depth_stencil %p.\n", This, pNewZStencil, This->depth_stencil);
- if (pNewZStencil == This->stencilBufferTarget) {
- TRACE("Trying to do a NOP SetRenderTarget operation\n");
- } else {
- /** OpenGL doesn't support 'sharing' of the stencilBuffer so we may incur an extra memory overhead
- * depending on the renter target implementation being used.
- * A shared context implementation will share all buffers between all rendertargets (including swapchains),
- * implementations that use separate pbuffers for different swapchains or rendertargets will have to duplicate the
- * stencil buffer and incur an extra memory overhead
- ******************************************************/
+ if (This->depth_stencil == (IWineD3DSurfaceImpl *)pNewZStencil)
+ {
+ TRACE("Trying to do a NOP SetRenderTarget operation.\n");
+ return WINED3D_OK;
+ }
- if (This->stencilBufferTarget) {
- if (((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
- || ((IWineD3DSurfaceImpl *)This->stencilBufferTarget)->Flags & SFLAG_DISCARD) {
- surface_modify_ds_location(This->stencilBufferTarget, SFLAG_DS_DISCARDED);
- } else {
- struct wined3d_context *context = context_acquire(This, This->render_targets[0], CTXUSAGE_RESOURCELOAD);
- surface_load_ds_location(This->stencilBufferTarget, context, SFLAG_DS_OFFSCREEN);
- surface_modify_ds_location(This->stencilBufferTarget, SFLAG_DS_OFFSCREEN);
- context_release(context);
+ if (This->depth_stencil)
+ {
+ if (((IWineD3DSwapChainImpl *)This->swapchains[0])->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
+ || This->depth_stencil->Flags & SFLAG_DISCARD)
+ {
+ surface_modify_ds_location(This->depth_stencil, SFLAG_DS_DISCARDED,
+ This->depth_stencil->currentDesc.Width,
+ This->depth_stencil->currentDesc.Height);
+ if (This->depth_stencil == This->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+ This->onscreen_depth_stencil = NULL;
}
}
-
- tmp = This->stencilBufferTarget;
- This->stencilBufferTarget = pNewZStencil;
- /* should we be calling the parent or the wined3d surface? */
- if (NULL != This->stencilBufferTarget) IWineD3DSurface_AddRef(This->stencilBufferTarget);
- if (NULL != tmp) IWineD3DSurface_Release(tmp);
- hr = WINED3D_OK;
-
- if((!tmp && pNewZStencil) || (!pNewZStencil && tmp)) {
- /* Swapping NULL / non NULL depth stencil affects the depth and tests */
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE));
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILENABLE));
- IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
- }
}
- return hr;
+ tmp = This->depth_stencil;
+ This->depth_stencil = (IWineD3DSurfaceImpl *)pNewZStencil;
+ if (This->depth_stencil) IWineD3DSurface_AddRef((IWineD3DSurface *)This->depth_stencil);
+ if (tmp) IWineD3DSurface_Release((IWineD3DSurface *)tmp);
+
+ if ((!tmp && pNewZStencil) || (!pNewZStencil && tmp))
+ {
+ /* Swapping NULL / non NULL depth stencil affects the depth and tests */
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_ZENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILENABLE));
+ IWineD3DDeviceImpl_MarkStateDirty(This, STATE_RENDER(WINED3DRS_STENCILWRITEMASK));
+ }
+
+ return WINED3D_OK;
}
static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* iface, UINT XHotSpot,
@@ -6020,8 +5966,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot);
/* some basic validation checks */
- if(This->cursorTexture) {
- struct wined3d_context *context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ if (This->cursorTexture)
+ {
+ struct wined3d_context *context = context_acquire(This, NULL);
ENTER_GL();
glDeleteTextures(1, &This->cursorTexture);
LEAVE_GL();
@@ -6065,15 +6012,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
if (SUCCEEDED(IWineD3DSurface_LockRect(pCursorBitmap, &rect, NULL, WINED3DLOCK_READONLY)))
{
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
- const struct GlPixelFormatDesc *glDesc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
struct wined3d_context *context;
char *mem, *bits = rect.pBits;
- GLint intfmt = glDesc->glInternal;
- GLint format = glDesc->glFormat;
- GLint type = glDesc->glType;
+ GLint intfmt = format_desc->glInternal;
+ GLint format = format_desc->glFormat;
+ GLint type = format_desc->glType;
INT height = This->cursorHeight;
INT width = This->cursorWidth;
- INT bpp = glDesc->byte_count;
+ INT bpp = format_desc->byte_count;
DWORD sampler;
INT i;
@@ -6084,7 +6031,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetCursorProperties(IWineD3DDevice* i
memcpy(&mem[width * bpp * i], &bits[rect.Pitch * i], width * bpp);
IWineD3DSurface_UnlockRect(pCursorBitmap);
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
ENTER_GL();
@@ -6258,14 +6205,10 @@ static HRESULT updateSurfaceDesc(IWineD3DSurfaceImpl *surface, const WINED3DPRES
while (surface->pow2Width < pPresentationParameters->BackBufferWidth) surface->pow2Width <<= 1;
while (surface->pow2Height < pPresentationParameters->BackBufferHeight) surface->pow2Height <<= 1;
}
- surface->glRect.left = 0;
- surface->glRect.top = 0;
- surface->glRect.right = surface->pow2Width;
- surface->glRect.bottom = surface->pow2Height;
if (surface->texture_name)
{
- struct wined3d_context *context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ struct wined3d_context *context = context_acquire(device, NULL);
ENTER_GL();
glDeleteTextures(1, &surface->texture_name);
LEAVE_GL();
@@ -6286,7 +6229,7 @@ static HRESULT updateSurfaceDesc(IWineD3DSurfaceImpl *surface, const WINED3DPRES
/* Put all surfaces into sysmem - the drawable might disappear if the backbuffer was rendered
* to a FBO */
- if(!surface_init_sysmem((IWineD3DSurface *) surface))
+ if (!surface_init_sysmem(surface))
{
return E_OUTOFMEMORY;
}
@@ -6327,14 +6270,14 @@ static BOOL is_display_mode_supported(IWineD3DDeviceImpl *This, const WINED3DPRE
return FALSE;
}
-void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_iface) {
+static void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChainImpl *swapchain)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) swapchain_iface;
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
IWineD3DBaseShaderImpl *shader;
- context = context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This, NULL);
gl_info = context->gl_info;
IWineD3DDevice_EnumResources(iface, reset_unload_resources, NULL);
@@ -6371,9 +6314,9 @@ void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_
swapchain->num_contexts = 0;
}
-HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain_iface) {
+static HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChainImpl *swapchain)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) swapchain_iface;
struct wined3d_context *context;
HRESULT hr;
IWineD3DSurfaceImpl *target;
@@ -6386,9 +6329,8 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *
return E_OUTOFMEMORY;
}
- target = (IWineD3DSurfaceImpl *)(swapchain->backBuffer ? swapchain->backBuffer[0] : swapchain->frontBuffer);
- context = context_create(This, target, swapchain->win_handle, FALSE, &swapchain->presentParms);
- if (!context)
+ target = swapchain->back_buffers ? swapchain->back_buffers[0] : swapchain->front_buffer;
+ if (!(context = context_create(swapchain, target, swapchain->ds_format)))
{
WARN("Failed to create context.\n");
HeapFree(GetProcessHeap(), 0, swapchain->context);
@@ -6427,7 +6369,7 @@ HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *
return WINED3D_OK;
err:
- context_acquire(This, NULL, CTXUSAGE_RESOURCELOAD);
+ context_acquire(This, NULL);
destroy_dummy_textures(This, context->gl_info);
context_release(context);
context_destroy(This, context);
@@ -6499,7 +6441,8 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
pPresentationParameters->hDeviceWindow != swapchain->presentParms.hDeviceWindow) {
ERR("Cannot change the device window yet\n");
}
- if (pPresentationParameters->EnableAutoDepthStencil && !This->auto_depth_stencil_buffer) {
+ if (pPresentationParameters->EnableAutoDepthStencil && !This->auto_depth_stencil)
+ {
HRESULT hrc;
TRACE("Creating the depth stencil buffer\n");
@@ -6512,7 +6455,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
pPresentationParameters->MultiSampleType,
pPresentationParameters->MultiSampleQuality,
FALSE,
- &This->auto_depth_stencil_buffer);
+ (IWineD3DSurface **)&This->auto_depth_stencil);
if (FAILED(hrc)) {
ERR("Failed to create the depth stencil buffer\n");
@@ -6521,9 +6464,15 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
}
}
+ if (This->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->onscreen_depth_stencil);
+ This->onscreen_depth_stencil = NULL;
+ }
+
/* Reset the depth stencil */
if (pPresentationParameters->EnableAutoDepthStencil)
- IWineD3DDevice_SetDepthStencilSurface(iface, This->auto_depth_stencil_buffer);
+ IWineD3DDevice_SetDepthStencilSurface(iface, (IWineD3DSurface *)This->auto_depth_stencil);
else
IWineD3DDevice_SetDepthStencilSurface(iface, NULL);
@@ -6531,7 +6480,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->updateStateBlock);
IWineD3DStateBlock_Release((IWineD3DStateBlock *)This->stateBlock);
- delete_opengl_contexts(iface, (IWineD3DSwapChain *) swapchain);
+ delete_opengl_contexts(iface, swapchain);
if(pPresentationParameters->Windowed) {
mode.Width = swapchain->orig_width;
@@ -6558,23 +6507,25 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
swapchain->presentParms.BackBufferWidth = pPresentationParameters->BackBufferWidth;
swapchain->presentParms.BackBufferHeight = pPresentationParameters->BackBufferHeight;
- hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->frontBuffer, pPresentationParameters);
+ hr = updateSurfaceDesc(swapchain->front_buffer, pPresentationParameters);
if(FAILED(hr))
{
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
- for(i = 0; i < swapchain->presentParms.BackBufferCount; i++) {
- hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)swapchain->backBuffer[i], pPresentationParameters);
+ for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
+ {
+ hr = updateSurfaceDesc(swapchain->back_buffers[i], pPresentationParameters);
if(FAILED(hr))
{
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
}
- if(This->auto_depth_stencil_buffer) {
- hr = updateSurfaceDesc((IWineD3DSurfaceImpl *)This->auto_depth_stencil_buffer, pPresentationParameters);
+ if (This->auto_depth_stencil)
+ {
+ hr = updateSurfaceDesc(This->auto_depth_stencil, pPresentationParameters);
if(FAILED(hr))
{
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
@@ -6583,24 +6534,26 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
}
}
- if((pPresentationParameters->Windowed && !swapchain->presentParms.Windowed) ||
- (swapchain->presentParms.Windowed && !pPresentationParameters->Windowed) ||
- DisplayModeChanged) {
-
+ if (!pPresentationParameters->Windowed != !swapchain->presentParms.Windowed
+ || DisplayModeChanged)
+ {
IWineD3DDevice_SetDisplayMode(iface, 0, &mode);
- if(swapchain->win_handle && !pPresentationParameters->Windowed) {
+ if (!pPresentationParameters->Windowed)
+ {
if(swapchain->presentParms.Windowed) {
/* switch from windowed to fs */
swapchain_setup_fullscreen_window(swapchain, pPresentationParameters->BackBufferWidth,
pPresentationParameters->BackBufferHeight);
} else {
/* Fullscreen -> fullscreen mode change */
- MoveWindow(swapchain->win_handle, 0, 0,
+ MoveWindow(swapchain->device_window, 0, 0,
pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight,
TRUE);
}
- } else if(swapchain->win_handle && !swapchain->presentParms.Windowed) {
+ }
+ else if (!swapchain->presentParms.Windowed)
+ {
/* Fullscreen -> windowed switch */
swapchain_restore_fullscreen_window(swapchain);
}
@@ -6657,7 +6610,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Reset(IWineD3DDevice* iface, WINED3DPRE
}
}
- hr = create_primary_opengl_context(iface, (IWineD3DSwapChain *) swapchain);
+ hr = create_primary_opengl_context(iface, swapchain);
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
/* All done. There is no need to reload resources or shaders, this will happen automatically on the
@@ -6747,13 +6700,11 @@ void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resour
{
for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i)
{
- if (This->render_targets[i] == (IWineD3DSurface *)resource) {
+ if (This->render_targets[i] == (IWineD3DSurfaceImpl *)resource)
This->render_targets[i] = NULL;
- }
- }
- if (This->stencilBufferTarget == (IWineD3DSurface *)resource) {
- This->stencilBufferTarget = NULL;
}
+ if (This->depth_stencil == (IWineD3DSurfaceImpl *)resource)
+ This->depth_stencil = NULL;
}
break;
@@ -6845,6 +6796,28 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EnumResources(IWineD3DDevice *iface, D3
return WINED3D_OK;
}
+static HRESULT WINAPI IWineD3DDeviceImpl_GetSurfaceFromDC(IWineD3DDevice *iface, HDC dc, IWineD3DSurface **surface)
+{
+ IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
+ IWineD3DResourceImpl *resource;
+
+ LIST_FOR_EACH_ENTRY(resource, &This->resources, IWineD3DResourceImpl, resource.resource_list_entry)
+ {
+ WINED3DRESOURCETYPE type = IWineD3DResource_GetType((IWineD3DResource *)resource);
+ if (type == WINED3DRTYPE_SURFACE)
+ {
+ if (((IWineD3DSurfaceImpl *)resource)->hDC == dc)
+ {
+ TRACE("Found surface %p for dc %p.\n", resource, dc);
+ *surface = (IWineD3DSurface *)resource;
+ return WINED3D_OK;
+ }
+ }
+ }
+
+ return WINED3DERR_INVALIDCALL;
+}
+
/**********************************************************
* IWineD3DDevice VTbl follows
**********************************************************/
@@ -6993,7 +6966,10 @@ static const IWineD3DDeviceVtbl IWineD3DDevice_Vtbl =
IWineD3DDeviceImpl_UpdateSurface,
IWineD3DDeviceImpl_GetFrontBufferData,
/*** object tracking ***/
- IWineD3DDeviceImpl_EnumResources
+ IWineD3DDeviceImpl_EnumResources,
+ IWineD3DDeviceImpl_GetSurfaceFromDC,
+ IWineD3DDeviceImpl_AcquireFocusWindow,
+ IWineD3DDeviceImpl_ReleaseFocusWindow,
};
HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
@@ -7045,27 +7021,29 @@ HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
select_shader_mode(&adapter->gl_info, &device->ps_selected_mode, &device->vs_selected_mode);
device->shader_backend = adapter->shader_backend;
- memset(&shader_caps, 0, sizeof(shader_caps));
- device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
- device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
- device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
- device->vs_clipping = shader_caps.VSClipping;
-
- memset(&ffp_caps, 0, sizeof(ffp_caps));
+ if (device->shader_backend)
+ {
+ device->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
+ device->d3d_vshader_constantF = shader_caps.MaxVertexShaderConst;
+ device->d3d_pshader_constantF = shader_caps.MaxPixelShaderConst;
+ device->vs_clipping = shader_caps.VSClipping;
+ }
fragment_pipeline = adapter->fragment_pipe;
device->frag_pipe = fragment_pipeline;
- fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
- device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
-
- hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
- ffp_vertexstate_template, fragment_pipeline, misc_state_template);
- if (FAILED(hr))
+ if (fragment_pipeline)
{
- ERR("Failed to compile state table, hr %#x.\n", hr);
- IWineD3D_Release(device->wined3d);
- return hr;
- }
+ fragment_pipeline->get_caps(&adapter->gl_info, &ffp_caps);
+ device->max_ffp_textures = ffp_caps.MaxSimultaneousTextures;
+ hr = compile_state_table(device->StateTable, device->multistate_funcs, &adapter->gl_info,
+ ffp_vertexstate_template, fragment_pipeline, misc_state_template);
+ if (FAILED(hr))
+ {
+ ERR("Failed to compile state table, hr %#x.\n", hr);
+ IWineD3D_Release(device->wined3d);
+ return hr;
+ }
+ }
device->blitter = adapter->blitter;
return WINED3D_OK;
@@ -7090,31 +7068,21 @@ void IWineD3DDeviceImpl_MarkStateDirty(IWineD3DDeviceImpl *This, DWORD state) {
}
}
-void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height)
-{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->current_rt)->resource.device;
- /* The drawable size of a pbuffer render target is the current pbuffer size. */
- *width = device->pbufferWidth;
- *height = device->pbufferHeight;
-}
-
void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height)
{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
/* The drawable size of a fbo target is the opengl texture size, which is the power of two size. */
- *width = surface->pow2Width;
- *height = surface->pow2Height;
+ *width = context->current_rt->pow2Width;
+ *height = context->current_rt->pow2Height;
}
void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height)
{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->surface;
+ IWineD3DSwapChainImpl *swapchain = context->swapchain;
/* The drawable size of a backbuffer / aux buffer offscreen target is the size of the
* current context's drawable, which is the size of the back buffer of the swapchain
- * the active context belongs to. The back buffer of the swapchain is stored as the
- * surface the context belongs to. */
- *width = surface->currentDesc.Width;
- *height = surface->currentDesc.Height;
+ * the active context belongs to. */
+ *width = swapchain->presentParms.BackBufferWidth;
+ *height = swapchain->presentParms.BackBufferHeight;
}
LRESULT device_process_message(IWineD3DDeviceImpl *device, HWND window,
diff --git a/dll/directx/wine/wined3d/directx.c b/dll/directx/wine/wined3d/directx.c
index 812e5ccc9e8..29061476ddd 100644
--- a/dll/directx/wine/wined3d/directx.c
+++ b/dll/directx/wine/wined3d/directx.c
@@ -24,14 +24,13 @@
*/
#include "config.h"
+#include
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
-#define GLINFO_LOCATION (*gl_info)
#define WINE_DEFAULT_VIDMEM (64 * 1024 * 1024)
-#define MAKEDWORD_VERSION(maj, min) ((maj & 0xffff) << 16) | (min & 0xffff)
/* The d3d device ID */
static const GUID IID_D3DDEVICE_D3DUID = { 0xaeb2cdd4, 0x6e41, 0x43ea, { 0x94,0x1c,0x83,0x61,0xcc,0x76,0x07,0x81 } };
@@ -74,6 +73,7 @@ static const struct {
{"GL_ARB_shader_objects", ARB_SHADER_OBJECTS, 0 },
{"GL_ARB_shader_texture_lod", ARB_SHADER_TEXTURE_LOD, 0 },
{"GL_ARB_shading_language_100", ARB_SHADING_LANGUAGE_100, 0 },
+ {"GL_ARB_shadow", ARB_SHADOW, 0 },
{"GL_ARB_sync", ARB_SYNC, 0 },
{"GL_ARB_texture_border_clamp", ARB_TEXTURE_BORDER_CLAMP, 0 },
{"GL_ARB_texture_compression", ARB_TEXTURE_COMPRESSION, 0 },
@@ -104,6 +104,7 @@ static const struct {
{"GL_EXT_blend_equation_separate", EXT_BLEND_EQUATION_SEPARATE, 0 },
{"GL_EXT_blend_func_separate", EXT_BLEND_FUNC_SEPARATE, 0 },
{"GL_EXT_blend_minmax", EXT_BLEND_MINMAX, 0 },
+ {"GL_EXT_draw_buffers2", EXT_DRAW_BUFFERS2, 0 },
{"GL_EXT_fog_coord", EXT_FOG_COORD, 0 },
{"GL_EXT_framebuffer_blit", EXT_FRAMEBUFFER_BLIT, 0 },
{"GL_EXT_framebuffer_multisample", EXT_FRAMEBUFFER_MULTISAMPLE, 0 },
@@ -325,12 +326,12 @@ fail:
}
/* Adjust the amount of used texture memory */
-long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram)
+unsigned int WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *device, unsigned int glram)
{
- struct wined3d_adapter *adapter = D3DDevice->adapter;
+ struct wined3d_adapter *adapter = device->adapter;
adapter->UsedTextureRam += glram;
- TRACE("Adjusted gl ram by %ld to %d\n", glram, adapter->UsedTextureRam);
+ TRACE("Adjusted gl ram by %d to %d\n", glram, adapter->UsedTextureRam);
return adapter->UsedTextureRam;
}
@@ -528,9 +529,12 @@ static void test_pbo_functionality(struct wined3d_gl_info *gl_info)
checkGLcall("Loading the PBO test texture");
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0));
+ LEAVE_GL();
+
wglFinish(); /* just to be sure */
memset(check, 0, sizeof(check));
+ ENTER_GL();
glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, check);
checkGLcall("Reading back the PBO test texture");
@@ -570,7 +574,7 @@ static BOOL match_apple_nonr500ati(const struct wined3d_gl_info *gl_info, const
static BOOL match_fglrx(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
{
- return (gl_vendor == GL_VENDOR_ATI);
+ return gl_vendor == GL_VENDOR_FGLRX;
}
@@ -669,6 +673,61 @@ static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const ch
return ret;
}
+/* Context activation is done by the caller. */
+static BOOL match_fbo_tex_update(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
+ enum wined3d_gl_vendor gl_vendor, enum wined3d_pci_vendor card_vendor, enum wined3d_pci_device device)
+{
+ char data[4 * 4 * 4];
+ GLuint tex, fbo;
+ GLenum status;
+
+ if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return FALSE;
+
+ memset(data, 0xcc, sizeof(data));
+
+ ENTER_GL();
+
+ glGenTextures(1, &tex);
+ glBindTexture(GL_TEXTURE_2D, tex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 4, 4, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
+ checkGLcall("glTexImage2D");
+
+ gl_info->fbo_ops.glGenFramebuffers(1, &fbo);
+ gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, fbo);
+ gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
+ checkGLcall("glFramebufferTexture2D");
+
+ status = gl_info->fbo_ops.glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE) ERR("FBO status %#x\n", status);
+ checkGLcall("glCheckFramebufferStatus");
+
+ memset(data, 0x11, sizeof(data));
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
+ checkGLcall("glTexSubImage2D");
+
+ glClearColor(0.996, 0.729, 0.745, 0.792);
+ glClear(GL_COLOR_BUFFER_BIT);
+ checkGLcall("glClear");
+
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data);
+ checkGLcall("glGetTexImage");
+
+ gl_info->fbo_ops.glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 0, 0);
+ gl_info->fbo_ops.glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glBindTexture(GL_TEXTURE_2D, 0);
+ checkGLcall("glBindTexture");
+
+ gl_info->fbo_ops.glDeleteFramebuffers(1, &fbo);
+ glDeleteTextures(1, &tex);
+ checkGLcall("glDeleteTextures");
+
+ LEAVE_GL();
+
+ return *(DWORD *)data == 0x11111111;
+}
+
static void quirk_arb_constants(struct wined3d_gl_info *gl_info)
{
TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->limits.arb_vs_native_constants);
@@ -797,6 +856,11 @@ static void quirk_disable_nvvp_clip(struct wined3d_gl_info *gl_info)
gl_info->quirks |= WINED3D_QUIRK_NV_CLIP_BROKEN;
}
+static void quirk_fbo_tex_update(struct wined3d_gl_info *gl_info)
+{
+ gl_info->quirks |= WINED3D_QUIRK_FBO_TEX_UPDATE;
+}
+
struct driver_quirk
{
BOOL (*match)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
@@ -876,6 +940,11 @@ static const struct driver_quirk quirk_table[] =
quirk_disable_nvvp_clip,
"Apple NV_vertex_program clip bug quirk"
},
+ {
+ match_fbo_tex_update,
+ quirk_fbo_tex_update,
+ "FBO rebind for attachment updates"
+ },
};
/* Certain applications (Steam) complain if we report an outdated driver version. In general,
@@ -955,7 +1024,7 @@ static const struct driver_version_information driver_version_table[] =
{HW_VENDOR_ATI, CARD_ATI_RADEON_9500, "ATI Radeon 9500", 14, 10, 6764 },
{HW_VENDOR_ATI, CARD_ATI_RADEON_X700, "ATI Radeon X700 SE", 14, 10, 6764 },
{HW_VENDOR_ATI, CARD_ATI_RADEON_X1600, "ATI Radeon X1600 Series", 14, 10, 6764 },
- {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2300, "ATI Mobility Radeon HD 2300", 14, 10, 6764 },
+ {HW_VENDOR_ATI, CARD_ATI_RADEON_HD2350, "ATI Mobility Radeon HD 2350", 14, 10, 6764 },
{HW_VENDOR_ATI, CARD_ATI_RADEON_HD2600, "ATI Mobility Radeon HD 2600", 14, 10, 6764 },
{HW_VENDOR_ATI, CARD_ATI_RADEON_HD2900, "ATI Radeon HD 2900 XT", 14, 10, 6764 },
{HW_VENDOR_ATI, CARD_ATI_RADEON_HD4350, "ATI Radeon HD 4350", 14, 10, 6764 },
@@ -1131,10 +1200,11 @@ static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl
return GL_VENDOR_NVIDIA;
if (strstr(gl_vendor_string, "ATI"))
- return GL_VENDOR_ATI;
+ return GL_VENDOR_FGLRX;
if (strstr(gl_vendor_string, "Intel(R)")
- || strstr(gl_renderer, "Intel(R)")
+ /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
+ || strstr(gl_renderer, "Intel")
|| strstr(gl_vendor_string, "Intel Inc."))
return GL_VENDOR_INTEL;
@@ -1148,9 +1218,10 @@ static enum wined3d_gl_vendor wined3d_guess_gl_vendor(struct wined3d_gl_info *gl
|| strstr(gl_renderer, "Gallium"))
return GL_VENDOR_MESA;
- FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_WINE.\n", debugstr_a(gl_vendor_string));
+ FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning GL_VENDOR_UNKNOWN.\n",
+ debugstr_a(gl_vendor_string));
- return GL_VENDOR_WINE;
+ return GL_VENDOR_UNKNOWN;
}
static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_string, const char *gl_renderer)
@@ -1165,14 +1236,15 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
return HW_VENDOR_ATI;
if (strstr(gl_vendor_string, "Intel(R)")
- || strstr(gl_renderer, "Intel(R)")
+ /* Intel switched from Intel(R) to Intel® recently, so just match Intel. */
+ || strstr(gl_renderer, "Intel")
|| strstr(gl_vendor_string, "Intel Inc."))
return HW_VENDOR_INTEL;
if (strstr(gl_vendor_string, "Mesa")
|| strstr(gl_vendor_string, "Tungsten Graphics, Inc")
|| strstr(gl_vendor_string, "VMware, Inc."))
- return HW_VENDOR_WINE;
+ return HW_VENDOR_SOFTWARE;
FIXME_(d3d_caps)("Received unrecognized GL_VENDOR %s. Returning HW_VENDOR_NVIDIA.\n", debugstr_a(gl_vendor_string));
@@ -1181,13 +1253,10 @@ static enum wined3d_pci_vendor wined3d_guess_card_vendor(const char *gl_vendor_s
-enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *gl_info,
+ const char *gl_renderer, unsigned int *vidmem)
{
- /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
- * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
- */
- if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
+ if (WINE_D3D10_CAPABLE(gl_info))
{
/* Geforce 200 - highend */
if (strstr(gl_renderer, "GTX 280")
@@ -1293,6 +1362,16 @@ enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *
return CARD_NVIDIA_GEFORCE_8300GS;
}
+ /* Geforce8-compatible fall back if the GPU is not in the list yet */
+ *vidmem = 128;
+ return CARD_NVIDIA_GEFORCE_8300GS;
+ }
+
+ /* Both the GeforceFX, 6xxx and 7xxx series support D3D9. The last two types have more
+ * shader capabilities, so we use the shader capabilities to distinguish between FX and 6xxx/7xxx.
+ */
+ if (WINE_D3D9_CAPABLE(gl_info) && gl_info->supported[NV_VERTEX_PROGRAM3])
+ {
/* Geforce7 - highend */
if (strstr(gl_renderer, "7800")
|| strstr(gl_renderer, "7900")
@@ -1425,14 +1504,14 @@ enum wined3d_pci_device select_card_nvidia_binary(const struct wined3d_gl_info *
}
-enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_info,
+ const char *gl_renderer, unsigned int *vidmem)
{
/* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
*
* Beware: renderer string do not match exact card model,
* eg HD 4800 is returned for multiple cards, even for RV790 based ones. */
- if (WINE_D3D9_CAPABLE(gl_info))
+ if (WINE_D3D10_CAPABLE(gl_info))
{
/* Radeon EG CYPRESS XT / PRO HD5800 - highend */
if (strstr(gl_renderer, "HD 5800") /* Radeon EG CYPRESS HD58xx generic renderer string */
@@ -1507,16 +1586,17 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_HD2600;
}
- /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
- if (strstr(gl_renderer, "HD 2300")
+ /* Radeon R6xx HD2350/HD2400/HD3400 - lowend
+ * Note HD2300=DX9, HD2350=DX10 */
+ if (strstr(gl_renderer, "HD 2350")
|| strstr(gl_renderer, "HD 2400")
|| strstr(gl_renderer, "HD 3470")
|| strstr(gl_renderer, "HD 3450")
|| strstr(gl_renderer, "HD 3430")
|| strstr(gl_renderer, "HD 3400"))
{
- *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
- return CARD_ATI_RADEON_HD2300;
+ *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
+ return CARD_ATI_RADEON_HD2350;
}
/* Radeon R6xx/R7xx integrated */
@@ -1528,6 +1608,13 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_HD3200;
}
+ /* Default for when no GPU has been found */
+ *vidmem = 128; /* 128MB */
+ return CARD_ATI_RADEON_HD3200;
+ }
+
+ if (WINE_D3D8_CAPABLE(gl_info))
+ {
/* Radeon R5xx */
if (strstr(gl_renderer, "X1600")
|| strstr(gl_renderer, "X1650")
@@ -1539,14 +1626,19 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_X1600;
}
- /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300 (lowend R5xx) */
+ /* Radeon R4xx + X1300/X1400/X1450/X1550/X2300/X2500/HD2300 (lowend R5xx)
+ * Note X2300/X2500/HD2300 are R5xx GPUs with a 2xxx naming but they are still DX9-only */
if (strstr(gl_renderer, "X700")
|| strstr(gl_renderer, "X800")
|| strstr(gl_renderer, "X850")
|| strstr(gl_renderer, "X1300")
|| strstr(gl_renderer, "X1400")
|| strstr(gl_renderer, "X1450")
- || strstr(gl_renderer, "X1550"))
+ || strstr(gl_renderer, "X1550")
+ || strstr(gl_renderer, "X2300")
+ || strstr(gl_renderer, "X2500")
+ || strstr(gl_renderer, "HD 2300")
+ )
{
*vidmem = 128; /* x700/x8*0 use 128-256MB, >=x1300 128-512MB */
return CARD_ATI_RADEON_X700;
@@ -1581,8 +1673,8 @@ enum wined3d_pci_device select_card_ati_binary(const struct wined3d_gl_info *gl_
}
-enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *gl_info,
+ const char *gl_renderer, unsigned int *vidmem)
{
if (strstr(gl_renderer, "X3100"))
{
@@ -1607,8 +1699,8 @@ enum wined3d_pci_device select_card_intel_binary(const struct wined3d_gl_info *g
}
-enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static enum wined3d_pci_device select_card_ati_mesa(const struct wined3d_gl_info *gl_info,
+ const char *gl_renderer, unsigned int *vidmem)
{
/* See http://developer.amd.com/drivers/pc_vendor_id/Pages/default.aspx
*
@@ -1663,12 +1755,12 @@ enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_
return CARD_ATI_RADEON_HD2600;
}
- /* Radeon R6xx HD2300/HD2400/HD3400 - lowend */
+ /* Radeon R6xx HD2350/HD2400/HD3400 - lowend */
if (strstr(gl_renderer, "RV610")
|| strstr(gl_renderer, "RV620"))
{
- *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
- return CARD_ATI_RADEON_HD2300;
+ *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
+ return CARD_ATI_RADEON_HD2350;
}
/* Radeon R6xx/R7xx integrated */
@@ -1786,8 +1878,8 @@ enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_
if (strstr(gl_renderer, "(RV610")
|| strstr(gl_renderer, "(RV620"))
{
- *vidmem = 128; /* HD2300 uses at least 128MB, HD2400 uses 256MB */
- return CARD_ATI_RADEON_HD2300;
+ *vidmem = 256; /* HD2350/2400 use 256MB, HD34xx use 256-512MB */
+ return CARD_ATI_RADEON_HD2350;
}
/* Radeon R6xx/R7xx integrated */
@@ -1816,8 +1908,8 @@ enum wined3d_pci_device (select_card_ati_mesa)(const struct wined3d_gl_info *gl_
}
-enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static enum wined3d_pci_device select_card_nvidia_mesa(const struct wined3d_gl_info *gl_info,
+ const char *gl_renderer, unsigned int *vidmem)
{
FIXME_(d3d_caps)("Card selection not handled for Mesa Nouveau driver\n");
if (WINE_D3D9_CAPABLE(gl_info)) return CARD_NVIDIA_GEFORCEFX_5600;
@@ -1827,8 +1919,8 @@ enum wined3d_pci_device (select_card_nvidia_mesa)(const struct wined3d_gl_info *
return CARD_NVIDIA_RIVA_128;
}
-enum wined3d_pci_device (select_card_intel_mesa)(const struct wined3d_gl_info *gl_info, const char *gl_renderer,
- unsigned int *vidmem )
+static enum wined3d_pci_device select_card_intel_mesa(const struct wined3d_gl_info *gl_info,
+ const char *gl_renderer, unsigned int *vidmem)
{
FIXME_(d3d_caps)("Card selection not handled for Mesa Intel driver\n");
return CARD_INTEL_I915G;
@@ -1850,10 +1942,11 @@ static const struct vendor_card_selection vendor_card_select_table[] =
{GL_VENDOR_APPLE, HW_VENDOR_NVIDIA, "Apple OSX NVidia binary driver", select_card_nvidia_binary},
{GL_VENDOR_APPLE, HW_VENDOR_ATI, "Apple OSX AMD/ATI binary driver", select_card_ati_binary},
{GL_VENDOR_APPLE, HW_VENDOR_INTEL, "Apple OSX Intel binary driver", select_card_intel_binary},
- {GL_VENDOR_ATI, HW_VENDOR_ATI, "AMD/ATI binary driver", select_card_ati_binary},
+ {GL_VENDOR_FGLRX, HW_VENDOR_ATI, "AMD/ATI binary driver", select_card_ati_binary},
{GL_VENDOR_MESA, HW_VENDOR_ATI, "Mesa AMD/ATI driver", select_card_ati_mesa},
{GL_VENDOR_MESA, HW_VENDOR_NVIDIA, "Mesa Nouveau driver", select_card_nvidia_mesa},
- {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa}
+ {GL_VENDOR_MESA, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa},
+ {GL_VENDOR_INTEL, HW_VENDOR_INTEL, "Mesa Intel driver", select_card_intel_mesa}
};
@@ -2034,6 +2127,7 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
* with Default values
*/
memset(gl_info->supported, 0, sizeof(gl_info->supported));
+ gl_info->limits.blends = 1;
gl_info->limits.buffers = 1;
gl_info->limits.textures = 1;
gl_info->limits.fragment_samplers = 1;
@@ -2347,7 +2441,13 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
if (gl_info->supported[ARB_SHADING_LANGUAGE_100])
{
const char *str = (const char *)glGetString(GL_SHADING_LANGUAGE_VERSION_ARB);
+ unsigned int major, minor;
+
TRACE_(d3d_caps)("GLSL version string: %s.\n", debugstr_a(str));
+
+ /* The format of the GLSL version string is "major.minor[.release] [vendor info]". */
+ sscanf(str, "%u.%u", &major, &minor);
+ gl_info->glsl_version = MAKEDWORD_VERSION(major, minor);
}
if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
{
@@ -2522,10 +2622,6 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_adapter *adapter)
ThisExtn[len] = '\0';
TRACE_(d3d_caps)("- %s\n", debugstr_a(ThisExtn));
- if (!strcmp(ThisExtn, "WGL_ARB_pbuffer")) {
- gl_info->supported[WGL_ARB_PBUFFER] = TRUE;
- TRACE_(d3d_caps)("FOUND: WGL_ARB_pbuffer support\n");
- }
if (!strcmp(ThisExtn, "WGL_ARB_pixel_format")) {
gl_info->supported[WGL_ARB_PIXEL_FORMAT] = TRUE;
TRACE_(d3d_caps)("FOUND: WGL_ARB_pixel_format support\n");
@@ -2590,7 +2686,7 @@ static UINT WINAPI IWineD3DImpl_GetAdapterModeCount(IWineD3D *iface, UINT Ad
/* TODO: Store modes per adapter and read it from the adapter structure */
if (Adapter == 0) { /* Display */
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
UINT format_bits = format_desc->byte_count * CHAR_BIT;
unsigned int i = 0;
unsigned int j = 0;
@@ -2637,7 +2733,7 @@ static HRESULT WINAPI IWineD3DImpl_EnumAdapterModes(IWineD3D *iface, UINT Adapte
/* TODO: Store modes per adapter and read it from the adapter structure */
if (Adapter == 0)
{
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(Format, &This->adapters[Adapter].gl_info);
UINT format_bits = format_desc->byte_count * CHAR_BIT;
DEVMODEW DevModeW;
int ModeIdx = 0;
@@ -2802,13 +2898,16 @@ static HRESULT WINAPI IWineD3DImpl_GetAdapterIdentifier(IWineD3D *iface, UINT Ad
}
static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined3d_gl_info *gl_info,
- const WineD3D_PixelFormat *cfg, const struct GlPixelFormatDesc *format_desc)
+ const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc)
{
short redSize, greenSize, blueSize, alphaSize, colorBits;
if(!cfg)
return FALSE;
+ /* Float formats need FBOs. If FBOs are used this function isn't called */
+ if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
+
if(cfg->iPixelType == WGL_TYPE_RGBA_ARB) { /* Integer RGBA formats */
if (!getColorBits(format_desc, &redSize, &greenSize, &blueSize, &alphaSize, &colorBits))
{
@@ -2829,29 +2928,14 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(const struct wined
return FALSE;
return TRUE;
- } else if(cfg->iPixelType == WGL_TYPE_RGBA_FLOAT_ARB) { /* Float RGBA formats; TODO: WGL_NV_float_buffer */
- if (format_desc->format == WINED3DFMT_R16_FLOAT)
- return (cfg->redSize == 16 && cfg->greenSize == 0 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R16G16_FLOAT)
- return (cfg->redSize == 16 && cfg->greenSize == 16 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R16G16B16A16_FLOAT)
- return (cfg->redSize == 16 && cfg->greenSize == 16 && cfg->blueSize == 16 && cfg->alphaSize == 16);
- if (format_desc->format == WINED3DFMT_R32_FLOAT)
- return (cfg->redSize == 32 && cfg->greenSize == 0 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R32G32_FLOAT)
- return (cfg->redSize == 32 && cfg->greenSize == 32 && cfg->blueSize == 0 && cfg->alphaSize == 0);
- if (format_desc->format == WINED3DFMT_R32G32B32A32_FLOAT)
- return (cfg->redSize == 32 && cfg->greenSize == 32 && cfg->blueSize == 32 && cfg->alphaSize == 32);
- } else {
- /* Probably a color index mode */
- return FALSE;
}
+ /* Probably a RGBA_float or color index mode */
return FALSE;
}
static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3d_gl_info *gl_info,
- const WineD3D_PixelFormat *cfg, const struct GlPixelFormatDesc *format_desc)
+ const WineD3D_PixelFormat *cfg, const struct wined3d_format_desc *format_desc)
{
short depthSize, stencilSize;
BOOL lockable = FALSE;
@@ -2865,6 +2949,9 @@ static BOOL IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(const struct wined3
return FALSE;
}
+ /* Float formats need FBOs. If FBOs are used this function isn't called */
+ if (format_desc->Flags & WINED3DFMT_FLAG_FLOAT) return FALSE;
+
if ((format_desc->format == WINED3DFMT_D16_LOCKABLE) || (format_desc->format == WINED3DFMT_D32_FLOAT))
lockable = TRUE;
@@ -2890,8 +2977,8 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
int nCfgs;
const WineD3D_PixelFormat *cfgs;
const struct wined3d_adapter *adapter;
- const struct GlPixelFormatDesc *rt_format_desc;
- const struct GlPixelFormatDesc *ds_format_desc;
+ const struct wined3d_format_desc *rt_format_desc;
+ const struct wined3d_format_desc *ds_format_desc;
int it;
WARN_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%x,%s), AdptFmt:(%x,%s), RendrTgtFmt:(%x,%s), DepthStencilFmt:(%x,%s))\n",
@@ -2909,15 +2996,26 @@ static HRESULT WINAPI IWineD3DImpl_CheckDepthStencilMatch(IWineD3D *iface, UINT
adapter = &This->adapters[Adapter];
rt_format_desc = getFormatDescEntry(RenderTargetFormat, &adapter->gl_info);
ds_format_desc = getFormatDescEntry(DepthStencilFormat, &adapter->gl_info);
- cfgs = adapter->cfgs;
- nCfgs = adapter->nCfgs;
- for (it = 0; it < nCfgs; ++it) {
- if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format_desc))
- {
- if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format_desc))
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ if ((rt_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET) &&
+ (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL))) {
+ TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
+ return WINED3D_OK;
+ }
+ }
+ else
+ {
+ cfgs = adapter->cfgs;
+ nCfgs = adapter->nCfgs;
+ for (it = 0; it < nCfgs; ++it) {
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, &cfgs[it], rt_format_desc))
{
- TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
- return WINED3D_OK;
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, &cfgs[it], ds_format_desc))
+ {
+ TRACE_(d3d_caps)("(%p) : Formats matched\n", This);
+ return WINED3D_OK;
+ }
}
}
}
@@ -2930,7 +3028,7 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceMultiSampleType(IWineD3D *iface, U
WINED3DFORMAT SurfaceFormat, BOOL Windowed, WINED3DMULTISAMPLE_TYPE MultiSampleType, DWORD *pQualityLevels)
{
IWineD3DImpl *This = (IWineD3DImpl *)iface;
- const struct GlPixelFormatDesc *glDesc;
+ const struct wined3d_format_desc *glDesc;
const struct wined3d_adapter *adapter;
TRACE_(d3d_caps)("(%p)-> (Adptr:%d, DevType:(%x,%s), SurfFmt:(%x,%s), Win?%d, MultiSamp:%x, pQual:%p)\n",
@@ -3109,51 +3207,41 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceType(IWineD3D *iface, UINT Adapter
/* Check if we support bumpmapping for a format */
-static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckBumpMapCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
- switch(format_desc->format)
- {
- case WINED3DFMT_R8G8_SNORM:
- case WINED3DFMT_R16G16_SNORM:
- case WINED3DFMT_R5G5_SNORM_L6_UNORM:
- case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
- case WINED3DFMT_R8G8B8A8_SNORM:
- /* Ask the fixed function pipeline implementation if it can deal
- * with the conversion. If we've got a GL extension giving native
- * support this will be an identity conversion. */
- if (adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup))
- {
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
- }
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
-
- default:
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
+ /* Ask the fixed function pipeline implementation if it can deal
+ * with the conversion. If we've got a GL extension giving native
+ * support this will be an identity conversion. */
+ return (format_desc->Flags & WINED3DFMT_FLAG_BUMPMAP)
+ && adapter->fragment_pipe->color_fixup_supported(format_desc->color_fixup);
}
/* Check if the given DisplayFormat + DepthStencilFormat combination is valid for the Adapter */
static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter,
- const struct GlPixelFormatDesc *display_format_desc, const struct GlPixelFormatDesc *ds_format_desc)
+ const struct wined3d_format_desc *display_format_desc, const struct wined3d_format_desc *ds_format_desc)
{
int it=0;
/* Only allow depth/stencil formats */
if (!(ds_format_desc->depth_size || ds_format_desc->stencil_size)) return FALSE;
- /* Walk through all WGL pixel formats to find a match */
- for (it = 0; it < adapter->nCfgs; ++it)
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
- WineD3D_PixelFormat *cfg = &adapter->cfgs[it];
- if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format_desc))
+ /* With FBOs WGL limitations do not apply, but the format needs to be FBO attachable */
+ if (ds_format_desc->Flags & (WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL)) return TRUE;
+ }
+ else
+ {
+ /* Walk through all WGL pixel formats to find a match */
+ for (it = 0; it < adapter->nCfgs; ++it)
{
- if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format_desc))
+ WineD3D_PixelFormat *cfg = &adapter->cfgs[it];
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info, cfg, display_format_desc))
{
- return TRUE;
+ if (IWineD3DImpl_IsPixelFormatCompatibleWithDepthFmt(&adapter->gl_info, cfg, ds_format_desc))
+ {
+ return TRUE;
+ }
}
}
}
@@ -3161,7 +3249,7 @@ static BOOL CheckDepthStencilCapability(struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
/* The flags entry of a format contains the filtering capability */
if (format_desc->Flags & WINED3DFMT_FLAG_FILTERING) return TRUE;
@@ -3171,11 +3259,10 @@ static BOOL CheckFilterCapability(struct wined3d_adapter *adapter, const struct
/* Check the render target capabilities of a format */
static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
- const struct GlPixelFormatDesc *adapter_format_desc, const struct GlPixelFormatDesc *check_format_desc)
+ const struct wined3d_format_desc *adapter_format_desc, const struct wined3d_format_desc *check_format_desc)
{
/* Filter out non-RT formats */
if (!(check_format_desc->Flags & WINED3DFMT_FLAG_RENDERTARGET)) return FALSE;
-
if(wined3d_settings.offscreen_rendering_mode == ORM_BACKBUFFER) {
WineD3D_PixelFormat *cfgs = adapter->cfgs;
int it;
@@ -3204,23 +3291,9 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
return TRUE;
}
}
- } else if(wined3d_settings.offscreen_rendering_mode == ORM_PBUFFER) {
- /* We can probably use this function in FBO mode too on some drivers to get some basic indication of the capabilities. */
- WineD3D_PixelFormat *cfgs = adapter->cfgs;
- int it;
-
- /* Check if there is a WGL pixel format matching the requirements, the pixel format should also be usable with pbuffers */
- for (it = 0; it < adapter->nCfgs; ++it)
- {
- if (cfgs[it].pbufferDrawable && IWineD3DImpl_IsPixelFormatCompatibleWithRenderFmt(&adapter->gl_info,
- &cfgs[it], check_format_desc))
- {
- TRACE_(d3d_caps)("iPixelFormat=%d is compatible with CheckFormat=%s\n",
- cfgs[it].iPixelFormat, debug_d3dformat(check_format_desc->format));
- return TRUE;
- }
- }
- } else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO){
+ }
+ else if(wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
/* For now return TRUE for FBOs until we have some proper checks.
* Note that this function will only be called when the format is around for texturing. */
return TRUE;
@@ -3228,46 +3301,18 @@ static BOOL CheckRenderTargetCapability(struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckSrgbReadCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
- const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-
- /* Check for supported sRGB formats (Texture loading and framebuffer) */
- if (!gl_info->supported[EXT_TEXTURE_SRGB])
- {
- TRACE_(d3d_caps)("[FAILED] GL_EXT_texture_sRGB not supported\n");
- return FALSE;
- }
-
- switch (format_desc->format)
- {
- case WINED3DFMT_B8G8R8A8_UNORM:
- case WINED3DFMT_B8G8R8X8_UNORM:
- case WINED3DFMT_B4G4R4A4_UNORM:
- case WINED3DFMT_L8_UNORM:
- case WINED3DFMT_L8A8_UNORM:
- case WINED3DFMT_DXT1:
- case WINED3DFMT_DXT2:
- case WINED3DFMT_DXT3:
- case WINED3DFMT_DXT4:
- case WINED3DFMT_DXT5:
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
-
- default:
- TRACE_(d3d_caps)("[FAILED] Gamma texture format %s not supported.\n", debug_d3dformat(format_desc->format));
- return FALSE;
- }
- return FALSE;
+ return adapter->gl_info.supported[EXT_TEXTURE_SRGB]
+ && (format_desc->Flags & WINED3DFMT_FLAG_SRGB_READ);
}
-static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
/* Only offer SRGB writing on X8R8G8B8/A8R8G8B8 when we use ARB or GLSL shaders as we are
* doing the color fixup in shaders.
* Note Windows drivers (at least on the Geforce 8800) also offer this on R5G6B5. */
- if ((format_desc->format == WINED3DFMT_B8G8R8X8_UNORM) || (format_desc->format == WINED3DFMT_B8G8R8A8_UNORM))
+ if (format_desc->Flags & WINED3DFMT_FLAG_SRGB_WRITE)
{
int vs_selected_mode;
int ps_selected_mode;
@@ -3285,7 +3330,7 @@ static BOOL CheckSrgbWriteCapability(struct wined3d_adapter *adapter,
/* Check if a format support blending in combination with pixel shaders */
static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapter,
- const struct GlPixelFormatDesc *format_desc)
+ const struct wined3d_format_desc *format_desc)
{
/* The flags entry of a format contains the post pixel shader blending capability */
if (format_desc->Flags & WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING) return TRUE;
@@ -3293,7 +3338,7 @@ static BOOL CheckPostPixelShaderBlendingCapability(struct wined3d_adapter *adapt
return FALSE;
}
-static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
/* OpenGL supports mipmapping on all formats basically. Wrapping is unsupported,
* but we have to report mipmapping so we cannot reject this flag. Tests show that
@@ -3308,8 +3353,7 @@ static BOOL CheckWrapAndMipCapability(struct wined3d_adapter *adapter, const str
}
/* Check if a texture format is supported on the given adapter */
-static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckTextureCapability(struct wined3d_adapter *adapter, const struct wined3d_format_desc *format_desc)
{
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
@@ -3340,12 +3384,12 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
return FALSE;
/*****
- * supported: Palettized
+ * Not supported: Palettized
+ * Only some Geforce/Voodoo3/G400 cards offer 8-bit textures in case of <=Direct3D7.
+ * Since it is not widely available, don't offer it. Further no Windows driver offers
+ * WINED3DFMT_P8_UINT_A8_NORM, so don't offer it either.
*/
case WINED3DFMT_P8_UINT:
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
- /* No Windows driver offers WINED3DFMT_P8_UINT_A8_UNORM, so don't offer it either */
case WINED3DFMT_P8_UINT_A8_UNORM:
return FALSE;
@@ -3539,8 +3583,10 @@ static BOOL CheckTextureCapability(struct wined3d_adapter *adapter,
return FALSE;
}
-static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *adapter_format_desc,
- WINED3DDEVTYPE DeviceType, const struct GlPixelFormatDesc *check_format_desc, WINED3DSURFTYPE SurfaceType)
+static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter,
+ const struct wined3d_format_desc *adapter_format_desc,
+ const struct wined3d_format_desc *check_format_desc,
+ WINED3DSURFTYPE SurfaceType)
{
if(SurfaceType == SURFACE_GDI) {
switch(check_format_desc->format)
@@ -3572,12 +3618,14 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
}
/* All format that are supported for textures are supported for surfaces as well */
- if (CheckTextureCapability(adapter, DeviceType, check_format_desc)) return TRUE;
+ if (CheckTextureCapability(adapter, check_format_desc)) return TRUE;
/* All depth stencil formats are supported on surfaces */
if (CheckDepthStencilCapability(adapter, adapter_format_desc, check_format_desc)) return TRUE;
/* If opengl can't process the format natively, the blitter may be able to convert it */
- if (adapter->blitter->color_fixup_supported(check_format_desc->color_fixup))
+ if (adapter->blitter->blit_supported(&adapter->gl_info, BLIT_OP_BLIT,
+ NULL, WINED3DPOOL_DEFAULT, 0, check_format_desc,
+ NULL, WINED3DPOOL_DEFAULT, 0, adapter_format_desc))
{
TRACE_(d3d_caps)("[OK]\n");
return TRUE;
@@ -3588,32 +3636,11 @@ static BOOL CheckSurfaceCapability(struct wined3d_adapter *adapter, const struct
return FALSE;
}
-static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter, const struct GlPixelFormatDesc *format_desc)
+static BOOL CheckVertexTextureCapability(struct wined3d_adapter *adapter,
+ const struct wined3d_format_desc *format_desc)
{
- const struct wined3d_gl_info *gl_info = &adapter->gl_info;
-
- if (!gl_info->limits.vertex_samplers)
- {
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
-
- switch (format_desc->format)
- {
- case WINED3DFMT_R32G32B32A32_FLOAT:
- if (!gl_info->supported[ARB_TEXTURE_FLOAT])
- {
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
- TRACE_(d3d_caps)("[OK]\n");
- return TRUE;
-
- default:
- TRACE_(d3d_caps)("[FAILED]\n");
- return FALSE;
- }
- return FALSE;
+ return adapter->gl_info.limits.vertex_samplers
+ && (format_desc->Flags & WINED3DFMT_FLAG_VTF);
}
static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapter, WINED3DDEVTYPE DeviceType,
@@ -3623,8 +3650,8 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt
IWineD3DImpl *This = (IWineD3DImpl *)iface;
struct wined3d_adapter *adapter = &This->adapters[Adapter];
const struct wined3d_gl_info *gl_info = &adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(CheckFormat, gl_info);
- const struct GlPixelFormatDesc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(CheckFormat, gl_info);
+ const struct wined3d_format_desc *adapter_format_desc = getFormatDescEntry(AdapterFormat, gl_info);
DWORD UsageCaps = 0;
TRACE_(d3d_caps)("(%p)-> (STUB) (Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%u,%s,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s))\n",
@@ -3640,484 +3667,476 @@ static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormat(IWineD3D *iface, UINT Adapt
return WINED3DERR_INVALIDCALL;
}
- if(RType == WINED3DRTYPE_CUBETEXTURE) {
-
- if(SurfaceType != SURFACE_OPENGL) {
- TRACE("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
- /* Cubetexture allows:
- * - D3DUSAGE_AUTOGENMIPMAP
- * - D3DUSAGE_DEPTHSTENCIL
- * - D3DUSAGE_DYNAMIC
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_RENDERTARGET
- * - D3DUSAGE_SOFTWAREPROCESSING
- * - D3DUSAGE_QUERY_WRAPANDMIP
- */
- if (gl_info->supported[ARB_TEXTURE_CUBE_MAP])
- {
- /* Check if the texture format is around */
- if (CheckTextureCapability(adapter, DeviceType, format_desc))
+ switch (RType)
+ {
+ case WINED3DRTYPE_CUBETEXTURE:
+ /* Cubetexture allows:
+ * - WINED3DUSAGE_AUTOGENMIPMAP
+ * - WINED3DUSAGE_DEPTHSTENCIL
+ * - WINED3DUSAGE_DYNAMIC
+ * - WINED3DUSAGE_NONSECURE (d3d9ex)
+ * - WINED3DUSAGE_RENDERTARGET
+ * - WINED3DUSAGE_SOFTWAREPROCESSING
+ * - WINED3DUSAGE_QUERY_WRAPANDMIP
+ */
+ if (SurfaceType != SURFACE_OPENGL)
{
- if(Usage & WINED3DUSAGE_AUTOGENMIPMAP) {
- /* Check for automatic mipmap generation support */
- if (gl_info->supported[SGIS_GENERATE_MIPMAP])
- {
- UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
- } else {
- /* When autogenmipmap isn't around continue and return WINED3DOK_NOAUTOGEN instead of D3D_OK */
- TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
- }
- }
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
- /* Always report dynamic locking */
- if(Usage & WINED3DUSAGE_DYNAMIC)
- UsageCaps |= WINED3DUSAGE_DYNAMIC;
+ if (!gl_info->supported[ARB_TEXTURE_CUBE_MAP])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No cube texture support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
- if(Usage & WINED3DUSAGE_RENDERTARGET) {
- if(CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_RENDERTARGET;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Always report software processing */
- if(Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
- UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
-
- /* Check QUERY_FILTER support */
- if(Usage & WINED3DUSAGE_QUERY_FILTER) {
- if (CheckFilterCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_SRGBREAD support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) {
- if (CheckSrgbReadCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_SRGBWRITE support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBWRITE) {
- if (CheckSrgbWriteCapability(adapter, DeviceType, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_VERTEXTEXTURE support */
- if(Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) {
- if (CheckVertexTextureCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_WRAPANDMIP support */
- if(Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) {
- if (CheckWrapAndMipCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
- } else {
+ if (!CheckTextureCapability(adapter, format_desc))
+ {
TRACE_(d3d_caps)("[FAILED] - Cube texture format not supported\n");
return WINED3DERR_NOTAVAILABLE;
}
- } else {
- TRACE_(d3d_caps)("[FAILED] - No cube texture support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- } else if(RType == WINED3DRTYPE_SURFACE) {
- /* Surface allows:
- * - D3DUSAGE_DEPTHSTENCIL
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_RENDERTARGET
- */
- if (CheckSurfaceCapability(adapter, adapter_format_desc, DeviceType, format_desc, SurfaceType))
- {
- if(Usage & WINED3DUSAGE_DEPTHSTENCIL) {
- if (CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- if(Usage & WINED3DUSAGE_RENDERTARGET) {
- if (CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_RENDERTARGET;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
- } else {
- TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
- } else if(RType == WINED3DRTYPE_TEXTURE) {
- /* Texture allows:
- * - D3DUSAGE_AUTOGENMIPMAP
- * - D3DUSAGE_DEPTHSTENCIL
- * - D3DUSAGE_DMAP
- * - D3DUSAGE_DYNAMIC
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_RENDERTARGET
- * - D3DUSAGE_SOFTWAREPROCESSING
- * - D3DUSAGE_TEXTAPI (d3d9ex)
- * - D3DUSAGE_QUERY_WRAPANDMIP
- */
-
- if(SurfaceType != SURFACE_OPENGL) {
- TRACE("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
-
- /* Check if the texture format is around */
- if (CheckTextureCapability(adapter, DeviceType, format_desc))
- {
- if(Usage & WINED3DUSAGE_AUTOGENMIPMAP) {
- /* Check for automatic mipmap generation support */
- if (gl_info->supported[SGIS_GENERATE_MIPMAP])
- {
- UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
- } else {
- /* When autogenmipmap isn't around continue and return WINED3DOK_NOAUTOGEN instead of D3D_OK */
+ if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
+ /* When autogenmipmap isn't around continue and return
+ * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
- }
+ else
+ UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
}
- /* Always report dynamic locking */
- if(Usage & WINED3DUSAGE_DYNAMIC)
+ /* Always report dynamic locking. */
+ if (Usage & WINED3DUSAGE_DYNAMIC)
UsageCaps |= WINED3DUSAGE_DYNAMIC;
- if(Usage & WINED3DUSAGE_RENDERTARGET) {
- if (CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
+ if (Usage & WINED3DUSAGE_RENDERTARGET)
+ {
+ if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
{
- UsageCaps |= WINED3DUSAGE_RENDERTARGET;
- } else {
TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_RENDERTARGET;
}
- /* Always report software processing */
- if(Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
+ /* Always report software processing. */
+ if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
- /* Check QUERY_FILTER support */
- if(Usage & WINED3DUSAGE_QUERY_FILTER) {
- if (CheckFilterCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_FILTER)
+ {
+ if (!CheckFilterCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
}
- /* Check QUERY_LEGACYBUMPMAP support */
- if(Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP) {
- if (CheckBumpMapCapability(adapter, DeviceType, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
- } else {
- TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- }
-
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
- {
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
}
- /* Check QUERY_SRGBREAD support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) {
- if (CheckSrgbReadCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
+ {
+ if (!CheckSrgbReadCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
}
- /* Check QUERY_SRGBWRITE support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBWRITE) {
- if (CheckSrgbWriteCapability(adapter, DeviceType, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
+ {
+ if (!CheckSrgbWriteCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
}
- /* Check QUERY_VERTEXTEXTURE support */
- if(Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) {
- if (CheckVertexTextureCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
+ {
+ if (!CheckVertexTextureCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
}
- /* Check QUERY_WRAPANDMIP support */
- if(Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) {
- if (CheckWrapAndMipCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
+ {
+ if (!CheckWrapAndMipCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
- } else {
TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
+ }
+ break;
+
+ case WINED3DRTYPE_SURFACE:
+ /* Surface allows:
+ * - WINED3DUSAGE_DEPTHSTENCIL
+ * - WINED3DUSAGE_NONSECURE (d3d9ex)
+ * - WINED3DUSAGE_RENDERTARGET
+ */
+ if (!CheckSurfaceCapability(adapter, adapter_format_desc, format_desc, SurfaceType))
+ {
+ TRACE_(d3d_caps)("[FAILED] - Not supported for plain surfaces\n");
+ return WINED3DERR_NOTAVAILABLE;
}
- if(Usage & WINED3DUSAGE_DEPTHSTENCIL) {
- if (CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
+ if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
+ {
+ if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No depthstencil support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
+ }
+
+ if (Usage & WINED3DUSAGE_RENDERTARGET)
+ {
+ if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_RENDERTARGET;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
+ }
+ break;
+
+ case WINED3DRTYPE_TEXTURE:
+ /* Texture allows:
+ * - WINED3DUSAGE_AUTOGENMIPMAP
+ * - WINED3DUSAGE_DEPTHSTENCIL
+ * - WINED3DUSAGE_DMAP
+ * - WINED3DUSAGE_DYNAMIC
+ * - WINED3DUSAGE_NONSECURE (d3d9ex)
+ * - WINED3DUSAGE_RENDERTARGET
+ * - WINED3DUSAGE_SOFTWAREPROCESSING
+ * - WINED3DUSAGE_TEXTAPI (d3d9ex)
+ * - WINED3DUSAGE_QUERY_WRAPANDMIP
+ */
+ if (SurfaceType != SURFACE_OPENGL)
+ {
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (!CheckTextureCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (Usage & WINED3DUSAGE_AUTOGENMIPMAP)
+ {
+ if (!gl_info->supported[SGIS_GENERATE_MIPMAP])
+ /* When autogenmipmap isn't around continue and return
+ * WINED3DOK_NOAUTOGEN instead of D3D_OK. */
+ TRACE_(d3d_caps)("[FAILED] - No autogenmipmap support, but continuing\n");
+ else
+ UsageCaps |= WINED3DUSAGE_AUTOGENMIPMAP;
+ }
+
+ /* Always report dynamic locking. */
+ if (Usage & WINED3DUSAGE_DYNAMIC)
+ UsageCaps |= WINED3DUSAGE_DYNAMIC;
+
+ if (Usage & WINED3DUSAGE_RENDERTARGET)
+ {
+ if (!CheckRenderTargetCapability(adapter, adapter_format_desc, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No rendertarget support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_RENDERTARGET;
+ }
+
+ /* Always report software processing. */
+ if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
+ UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
+
+ if (Usage & WINED3DUSAGE_QUERY_FILTER)
+ {
+ if (!CheckFilterCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_LEGACYBUMPMAP)
+ {
+ if (!CheckBumpMapCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No legacy bumpmap support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_LEGACYBUMPMAP;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
+ {
+ if (!CheckSrgbReadCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
+ {
+ if (!CheckSrgbWriteCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
+ {
+ if (!CheckVertexTextureCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
+ }
+
+ if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
+ {
+ if (!CheckWrapAndMipCapability(adapter, format_desc))
+ {
+ TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
+ }
+
+ if (Usage & WINED3DUSAGE_DEPTHSTENCIL)
+ {
+ if (!CheckDepthStencilCapability(adapter, adapter_format_desc, format_desc))
{
- UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
- } else {
TRACE_(d3d_caps)("[FAILED] - No depth stencil support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ if ((format_desc->Flags & WINED3DFMT_FLAG_SHADOW) && !gl_info->supported[ARB_SHADOW])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No shadow sampler support.\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ UsageCaps |= WINED3DUSAGE_DEPTHSTENCIL;
}
- } else {
- TRACE_(d3d_caps)("[FAILED] - Texture format not supported\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- } else if((RType == WINED3DRTYPE_VOLUME) || (RType == WINED3DRTYPE_VOLUMETEXTURE)) {
- /* Volume is to VolumeTexture what Surface is to Texture but its usage caps are not documented.
- * Most driver seem to offer (nearly) the same on Volume and VolumeTexture, so do that too.
- *
- * Volumetexture allows:
- * - D3DUSAGE_DYNAMIC
- * - D3DUSAGE_NONSECURE (d3d9ex)
- * - D3DUSAGE_SOFTWAREPROCESSING
- * - D3DUSAGE_QUERY_WRAPANDMIP
- */
+ break;
- if(SurfaceType != SURFACE_OPENGL) {
- TRACE("[FAILED]\n");
- return WINED3DERR_NOTAVAILABLE;
- }
+ case WINED3DRTYPE_VOLUMETEXTURE:
+ case WINED3DRTYPE_VOLUME:
+ /* Volume is to VolumeTexture what Surface is to Texture, but its
+ * usage caps are not documented. Most driver seem to offer
+ * (nearly) the same on Volume and VolumeTexture, so do that too.
+ *
+ * Volumetexture allows:
+ * - D3DUSAGE_DYNAMIC
+ * - D3DUSAGE_NONSECURE (d3d9ex)
+ * - D3DUSAGE_SOFTWAREPROCESSING
+ * - D3DUSAGE_QUERY_WRAPANDMIP
+ */
+ if (SurfaceType != SURFACE_OPENGL)
+ {
+ TRACE_(d3d_caps)("[FAILED]\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
- /* Check volume texture and volume usage caps */
- if (gl_info->supported[EXT_TEXTURE3D])
- {
- if (!CheckTextureCapability(adapter, DeviceType, format_desc))
+ if (!gl_info->supported[EXT_TEXTURE3D])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No volume texture support\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+
+ if (!CheckTextureCapability(adapter, format_desc))
{
TRACE_(d3d_caps)("[FAILED] - Format not supported\n");
return WINED3DERR_NOTAVAILABLE;
}
- /* Always report dynamic locking */
- if(Usage & WINED3DUSAGE_DYNAMIC)
+ /* Filter formats that need conversion; For one part, this
+ * conversion is unimplemented, and volume textures are huge, so
+ * it would be a big performance hit. Unless we hit an application
+ * needing one of those formats, don't advertize them to avoid
+ * leading applications into temptation. The windows drivers don't
+ * support most of those formats on volumes anyway, except for
+ * WINED3DFMT_R32_FLOAT. */
+ switch (CheckFormat)
+ {
+ case WINED3DFMT_P8_UINT:
+ case WINED3DFMT_L4A4_UNORM:
+ case WINED3DFMT_R32_FLOAT:
+ case WINED3DFMT_R16_FLOAT:
+ case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
+ case WINED3DFMT_R5G5_SNORM_L6_UNORM:
+ case WINED3DFMT_R16G16_UNORM:
+ TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
+ return WINED3DERR_NOTAVAILABLE;
+
+ case WINED3DFMT_R8G8B8A8_SNORM:
+ case WINED3DFMT_R16G16_SNORM:
+ if (!gl_info->supported[NV_TEXTURE_SHADER])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ break;
+
+ case WINED3DFMT_R8G8_SNORM:
+ if (!gl_info->supported[NV_TEXTURE_SHADER])
+ {
+ TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
+ return WINED3DERR_NOTAVAILABLE;
+ }
+ break;
+
+ case WINED3DFMT_DXT1:
+ case WINED3DFMT_DXT2:
+ case WINED3DFMT_DXT3:
+ case WINED3DFMT_DXT4:
+ case WINED3DFMT_DXT5:
+ /* The GL_EXT_texture_compression_s3tc spec requires that
+ * loading an s3tc compressed texture results in an error.
+ * While the D3D refrast does support s3tc volumes, at
+ * least the nvidia windows driver does not, so we're free
+ * not to support this format. */
+ TRACE_(d3d_caps)("[FAILED] - DXTn does not support 3D textures\n");
+ return WINED3DERR_NOTAVAILABLE;
+
+ default:
+ /* Do nothing, continue with checking the format below */
+ break;
+ }
+
+ /* Always report dynamic locking. */
+ if (Usage & WINED3DUSAGE_DYNAMIC)
UsageCaps |= WINED3DUSAGE_DYNAMIC;
- /* Always report software processing */
- if(Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
+ /* Always report software processing. */
+ if (Usage & WINED3DUSAGE_SOFTWAREPROCESSING)
UsageCaps |= WINED3DUSAGE_SOFTWAREPROCESSING;
- /* Check QUERY_FILTER support */
- if(Usage & WINED3DUSAGE_QUERY_FILTER) {
- if (CheckFilterCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_FILTER)
+ {
+ if (!CheckFilterCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query filter support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_FILTER;
}
- /* Check QUERY_POSTPIXELSHADER_BLENDING support */
- if(Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING) {
- if (CheckPostPixelShaderBlendingCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING)
+ {
+ if (!CheckPostPixelShaderBlendingCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query post pixelshader blending support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING;
}
- /* Check QUERY_SRGBREAD support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBREAD) {
- if (CheckSrgbReadCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBREAD)
+ {
+ if (!CheckSrgbReadCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbread support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBREAD;
}
- /* Check QUERY_SRGBWRITE support */
- if(Usage & WINED3DUSAGE_QUERY_SRGBWRITE) {
- if (CheckSrgbWriteCapability(adapter, DeviceType, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_SRGBWRITE)
+ {
+ if (!CheckSrgbWriteCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query srgbwrite support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_SRGBWRITE;
}
- /* Check QUERY_VERTEXTEXTURE support */
- if(Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE) {
- if (CheckVertexTextureCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_VERTEXTEXTURE)
+ {
+ if (!CheckVertexTextureCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
- } else {
TRACE_(d3d_caps)("[FAILED] - No query vertextexture support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_VERTEXTEXTURE;
}
- /* Check QUERY_WRAPANDMIP support */
- if(Usage & WINED3DUSAGE_QUERY_WRAPANDMIP) {
- if (CheckWrapAndMipCapability(adapter, format_desc))
+ if (Usage & WINED3DUSAGE_QUERY_WRAPANDMIP)
+ {
+ if (!CheckWrapAndMipCapability(adapter, format_desc))
{
- UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
- } else {
TRACE_(d3d_caps)("[FAILED] - No wrapping and mipmapping support\n");
return WINED3DERR_NOTAVAILABLE;
}
+ UsageCaps |= WINED3DUSAGE_QUERY_WRAPANDMIP;
}
- } else {
- TRACE_(d3d_caps)("[FAILED] - No volume texture support\n");
+ break;
+
+ default:
+ FIXME_(d3d_caps)("Unhandled resource type %s.\n", debug_d3dresourcetype(RType));
return WINED3DERR_NOTAVAILABLE;
- }
-
- /* Filter formats that need conversion; For one part, this conversion is unimplemented,
- * and volume textures are huge, so it would be a big performance hit. Unless we hit an
- * app needing one of those formats, don't advertize them to avoid leading apps into
- * temptation. The windows drivers don't support most of those formats on volumes anyway,
- * except of R32F.
- */
- switch(CheckFormat) {
- case WINED3DFMT_P8_UINT:
- case WINED3DFMT_L4A4_UNORM:
- case WINED3DFMT_R32_FLOAT:
- case WINED3DFMT_R16_FLOAT:
- case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
- case WINED3DFMT_R5G5_SNORM_L6_UNORM:
- case WINED3DFMT_R16G16_UNORM:
- TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
- return WINED3DERR_NOTAVAILABLE;
-
- case WINED3DFMT_R8G8B8A8_SNORM:
- case WINED3DFMT_R16G16_SNORM:
- if (!gl_info->supported[NV_TEXTURE_SHADER])
- {
- TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- break;
-
- case WINED3DFMT_R8G8_SNORM:
- if (!gl_info->supported[NV_TEXTURE_SHADER])
- {
- TRACE_(d3d_caps)("[FAILED] - No converted formats on volumes\n");
- return WINED3DERR_NOTAVAILABLE;
- }
- break;
-
- case WINED3DFMT_DXT1:
- case WINED3DFMT_DXT2:
- case WINED3DFMT_DXT3:
- case WINED3DFMT_DXT4:
- case WINED3DFMT_DXT5:
- /* The GL_EXT_texture_compression_s3tc spec requires that loading an s3tc
- * compressed texture results in an error. While the D3D refrast does
- * support s3tc volumes, at least the nvidia windows driver does not, so
- * we're free not to support this format.
- */
- TRACE_(d3d_caps)("[FAILED] - DXTn does not support 3D textures\n");
- return WINED3DERR_NOTAVAILABLE;
-
- default:
- /* Do nothing, continue with checking the format below */
- break;
- }
- } else if(RType == WINED3DRTYPE_BUFFER){
- /* For instance vertexbuffer/indexbuffer aren't supported yet because no Windows drivers seem to offer it */
- TRACE_(d3d_caps)("Unhandled resource type D3DRTYPE_INDEXBUFFER / D3DRTYPE_VERTEXBUFFER\n");
- return WINED3DERR_NOTAVAILABLE;
}
- /* When the UsageCaps exactly matches Usage return WINED3D_OK except for the situation in which
- * WINED3DUSAGE_AUTOGENMIPMAP isn't around, then WINED3DOK_NOAUTOGEN is returned if all the other
- * usage flags match. */
- if(UsageCaps == Usage) {
+ /* When the UsageCaps exactly matches Usage return WINED3D_OK except for
+ * the situation in which WINED3DUSAGE_AUTOGENMIPMAP isn't around, then
+ * WINED3DOK_NOAUTOGEN is returned if all the other usage flags match. */
+ if (UsageCaps == Usage)
return WINED3D_OK;
- } else if((UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP)) && (Usage & WINED3DUSAGE_AUTOGENMIPMAP)){
+ if (UsageCaps == (Usage & ~WINED3DUSAGE_AUTOGENMIPMAP))
return WINED3DOK_NOAUTOGEN;
- } else {
- TRACE_(d3d_caps)("[FAILED] - Usage=%#08x requested for CheckFormat=%s and RType=%d but only %#08x is available\n", Usage, debug_d3dformat(CheckFormat), RType, UsageCaps);
- return WINED3DERR_NOTAVAILABLE;
- }
+
+ TRACE_(d3d_caps)("[FAILED] - Usage %#x requested for CheckFormat %s and RType %s but only %#x is available\n",
+ Usage, debug_d3dformat(CheckFormat), debug_d3dresourcetype(RType), UsageCaps);
+
+ return WINED3DERR_NOTAVAILABLE;
}
static HRESULT WINAPI IWineD3DImpl_CheckDeviceFormatConversion(IWineD3D *iface, UINT adapter_idx,
@@ -4204,13 +4223,14 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
WINED3DPMISCCAPS_MRTPOSTPIXELSHADERBLENDING;
/* TODO:
WINED3DPMISCCAPS_NULLREFERENCE
- WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS
WINED3DPMISCCAPS_FOGANDSPECULARALPHA
WINED3DPMISCCAPS_MRTINDEPENDENTBITDEPTHS
WINED3DPMISCCAPS_FOGVERTEXCLAMPED */
if (gl_info->supported[EXT_BLEND_EQUATION_SEPARATE] && gl_info->supported[EXT_BLEND_FUNC_SEPARATE])
pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_SEPARATEALPHABLEND;
+ if (gl_info->supported[EXT_DRAW_BUFFERS2])
+ pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_INDEPENDENTWRITEMASKS;
pCaps->RasterCaps = WINED3DPRASTERCAPS_DITHER |
WINED3DPRASTERCAPS_PAT |
@@ -4517,10 +4537,7 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
WINED3DPTFILTERCAPS_MAGFLINEAR;
pCaps->VertexTextureFilterCaps = 0;
- memset(&shader_caps, 0, sizeof(shader_caps));
adapter->shader_backend->shader_get_caps(&adapter->gl_info, &shader_caps);
-
- memset(&fragment_caps, 0, sizeof(fragment_caps));
adapter->fragment_pipe->get_caps(&adapter->gl_info, &fragment_caps);
/* Add shader misc caps. Only some of them belong to the shader parts of the pipeline */
@@ -4551,13 +4568,6 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter,
pCaps->MaxTextureBlendStages = fragment_caps.MaxTextureBlendStages;
pCaps->MaxSimultaneousTextures = fragment_caps.MaxSimultaneousTextures;
- pCaps->VS20Caps = shader_caps.VS20Caps;
- pCaps->MaxVShaderInstructionsExecuted = shader_caps.MaxVShaderInstructionsExecuted;
- pCaps->MaxVertexShader30InstructionSlots= shader_caps.MaxVertexShader30InstructionSlots;
- pCaps->PS20Caps = shader_caps.PS20Caps;
- pCaps->MaxPShaderInstructionsExecuted = shader_caps.MaxPShaderInstructionsExecuted;
- pCaps->MaxPixelShader30InstructionSlots = shader_caps.MaxPixelShader30InstructionSlots;
-
/* The following caps are shader specific, but they are things we cannot detect, or which
* are the same among all shader models. So to avoid code duplication set the shader version
* specific, but otherwise constant caps here
@@ -4959,7 +4969,7 @@ static void fillGLAttribFuncs(const struct wined3d_gl_info *gl_info)
}
}
-BOOL InitAdapters(IWineD3DImpl *This)
+static BOOL InitAdapters(IWineD3DImpl *This)
{
static HMODULE mod_gl;
BOOL ret;
@@ -5120,17 +5130,6 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->doubleBuffer = values[9];
cfgs->auxBuffers = values[10];
- cfgs->pbufferDrawable = FALSE;
- /* Check for pbuffer support when it is around as
- * wglGetPixelFormatAttribiv fails for unknown attributes. */
- if (gl_info->supported[WGL_ARB_PBUFFER])
- {
- int attrib = WGL_DRAW_TO_PBUFFER_ARB;
- int value;
- if(GL_EXTCALL(wglGetPixelFormatAttribivARB(hdc, iPixelFormat, 0, 1, &attrib, &value)))
- cfgs->pbufferDrawable = value;
- }
-
cfgs->numSamples = 0;
/* Check multisample support */
if (gl_info->supported[ARB_MULTISAMPLE])
@@ -5145,7 +5144,11 @@ BOOL InitAdapters(IWineD3DImpl *This)
}
}
- TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, samples=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable, cfgs->pbufferDrawable);
+ TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
+ "depth=%d, stencil=%d, samples=%d, windowDrawable=%d\n",
+ cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
+ cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
+ cfgs->depthSize, cfgs->stencilSize, cfgs->numSamples, cfgs->windowDrawable);
cfgs++;
}
}
@@ -5182,14 +5185,17 @@ BOOL InitAdapters(IWineD3DImpl *This)
cfgs->colorSize = ppfd.cColorBits;
cfgs->depthSize = ppfd.cDepthBits;
cfgs->stencilSize = ppfd.cStencilBits;
- cfgs->pbufferDrawable = 0;
cfgs->windowDrawable = (ppfd.dwFlags & PFD_DRAW_TO_WINDOW) ? 1 : 0;
cfgs->iPixelType = (ppfd.iPixelType == PFD_TYPE_RGBA) ? WGL_TYPE_RGBA_ARB : WGL_TYPE_COLORINDEX_ARB;
cfgs->doubleBuffer = (ppfd.dwFlags & PFD_DOUBLEBUFFER) ? 1 : 0;
cfgs->auxBuffers = ppfd.cAuxBuffers;
cfgs->numSamples = 0;
- TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, depth=%d, stencil=%d, windowDrawable=%d, pbufferDrawable=%d\n", cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer, cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize, cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable, cfgs->pbufferDrawable);
+ TRACE("iPixelFormat=%d, iPixelType=%#x, doubleBuffer=%d, RGBA=%d/%d/%d/%d, "
+ "depth=%d, stencil=%d, windowDrawable=%d\n",
+ cfgs->iPixelFormat, cfgs->iPixelType, cfgs->doubleBuffer,
+ cfgs->redSize, cfgs->greenSize, cfgs->blueSize, cfgs->alphaSize,
+ cfgs->depthSize, cfgs->stencilSize, cfgs->windowDrawable);
cfgs++;
adapter->nCfgs++;
}
@@ -5261,7 +5267,7 @@ nogl_adapter:
* IWineD3D VTbl follows
**********************************************************/
-const IWineD3DVtbl IWineD3D_Vtbl =
+static const struct IWineD3DVtbl IWineD3D_Vtbl =
{
/* IUnknown */
IWineD3DImpl_QueryInterface,
@@ -5291,3 +5297,23 @@ const struct wined3d_parent_ops wined3d_null_parent_ops =
{
wined3d_null_wined3d_object_destroyed,
};
+
+HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent)
+{
+ wined3d->lpVtbl = &IWineD3D_Vtbl;
+ wined3d->dxVersion = version;
+ wined3d->ref = 1;
+ wined3d->parent = parent;
+
+ if (!InitAdapters(wined3d))
+ {
+ WARN("Failed to initialize adapters.\n");
+ if (version > 7)
+ {
+ MESSAGE("Direct3D%u is not available without OpenGL.\n", version);
+ return E_FAIL;
+ }
+ }
+
+ return WINED3D_OK;
+}
diff --git a/dll/directx/wine/wined3d/drawprim.c b/dll/directx/wine/wined3d/drawprim.c
index b29d012b9d1..b36ef5b49ae 100644
--- a/dll/directx/wine/wined3d/drawprim.c
+++ b/dll/directx/wine/wined3d/drawprim.c
@@ -28,7 +28,6 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_draw);
-#define GLINFO_LOCATION This->adapter->gl_info
#include
#include
@@ -71,7 +70,7 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
UINT vx_index;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
const UINT *streamOffset = This->stateBlock->streamOffset;
- long SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
+ LONG SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
BOOL pixelShader = use_ps(This->stateBlock);
BOOL specular_fog = FALSE;
const BYTE *texCoords[WINED3DDP_MAXTEXCOORD];
@@ -85,14 +84,14 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
TRACE("Using slow vertex array code\n");
/* Variable Initialization */
- if (idxSize != 0) {
- /* Immediate mode drawing can't make use of indices in a vbo - get the data from the index buffer.
- * If the index buffer has no vbo(not supported or other reason), or with user pointer drawing
- * idxData will be != NULL
- */
- if(idxData == NULL) {
- idxData = buffer_get_sysmem((struct wined3d_buffer *) This->stateBlock->pIndexData);
- }
+ if (idxSize)
+ {
+ /* Immediate mode drawing can't make use of indices in a vbo - get the
+ * data from the index buffer. If the index buffer has no vbo (not
+ * supported or other reason), or with user pointer drawing idxData
+ * will be non-NULL. */
+ if (!idxData)
+ idxData = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->pIndexData, gl_info);
if (idxSize == 2) pIdxBufS = idxData;
else pIdxBufL = idxData;
@@ -102,7 +101,6 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
}
/* Start drawing in GL */
- VTRACE(("glBegin(%x)\n", glPrimType));
glBegin(glPrimType);
if (si->use_map & (1 << WINED3D_FFP_POSITION))
@@ -226,13 +224,10 @@ static void drawStridedSlow(IWineD3DDevice *iface, const struct wined3d_context
if (idxData != NULL) {
/* Indexed so work out the number of strides to skip */
- if (idxSize == 2) {
- VTRACE(("Idx for vertex %u = %u\n", vx_index, pIdxBufS[startIdx+vx_index]));
+ if (idxSize == 2)
SkipnStrides = pIdxBufS[startIdx + vx_index] + This->stateBlock->loadBaseVertexIndex;
- } else {
- VTRACE(("Idx for vertex %u = %u\n", vx_index, pIdxBufL[startIdx+vx_index]));
+ else
SkipnStrides = pIdxBufL[startIdx + vx_index] + This->stateBlock->loadBaseVertexIndex;
- }
}
tmp_tex_mask = tex_mask;
@@ -426,7 +421,8 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
GLenum glPrimitiveType, const void *idxData, UINT idxSize, UINT startIdx)
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *) iface;
- long SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
+ const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ LONG SkipnStrides = startIdx + This->stateBlock->loadBaseVertexIndex;
const WORD *pIdxBufS = NULL;
const DWORD *pIdxBufL = NULL;
UINT vx_index;
@@ -434,14 +430,14 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
IWineD3DStateBlockImpl *stateblock = This->stateBlock;
const BYTE *ptr;
- if (idxSize != 0) {
- /* Immediate mode drawing can't make use of indices in a vbo - get the data from the index buffer.
- * If the index buffer has no vbo(not supported or other reason), or with user pointer drawing
- * idxData will be != NULL
- */
- if(idxData == NULL) {
- idxData = buffer_get_sysmem((struct wined3d_buffer *) This->stateBlock->pIndexData);
- }
+ if (idxSize)
+ {
+ /* Immediate mode drawing can't make use of indices in a vbo - get the
+ * data from the index buffer. If the index buffer has no vbo (not
+ * supported or other reason), or with user pointer drawing idxData
+ * will be non-NULL. */
+ if (!idxData)
+ idxData = buffer_get_sysmem((struct wined3d_buffer *)This->stateBlock->pIndexData, gl_info);
if (idxSize == 2) pIdxBufS = idxData;
else pIdxBufL = idxData;
@@ -451,20 +447,16 @@ static void drawStridedSlowVs(IWineD3DDevice *iface, const struct wined3d_stream
}
/* Start drawing in GL */
- VTRACE(("glBegin(%x)\n", glPrimitiveType));
glBegin(glPrimitiveType);
for (vx_index = 0; vx_index < numberOfVertices; ++vx_index) {
if (idxData != NULL) {
/* Indexed so work out the number of strides to skip */
- if (idxSize == 2) {
- VTRACE(("Idx for vertex %d = %d\n", vx_index, pIdxBufS[startIdx+vx_index]));
+ if (idxSize == 2)
SkipnStrides = pIdxBufS[startIdx + vx_index] + stateblock->loadBaseVertexIndex;
- } else {
- VTRACE(("Idx for vertex %d = %d\n", vx_index, pIdxBufL[startIdx+vx_index]));
+ else
SkipnStrides = pIdxBufL[startIdx + vx_index] + stateblock->loadBaseVertexIndex;
- }
}
for (i = MAX_ATTRIBS - 1; i >= 0; i--)
@@ -543,7 +535,7 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine
{
struct wined3d_buffer *vb =
(struct wined3d_buffer *)stateblock->streamSource[si->elements[instancedData[j]].stream_idx];
- ptr += (long) buffer_get_sysmem(vb);
+ ptr += (ULONG_PTR)buffer_get_sysmem(vb, &This->adapter->gl_info);
}
send_attribute(This, si->elements[instancedData[j]].format_desc->format, instancedData[j], ptr);
@@ -555,7 +547,8 @@ static inline void drawStridedInstanced(IWineD3DDevice *iface, const struct wine
}
}
-static inline void remove_vbos(IWineD3DDeviceImpl *This, struct wined3d_stream_info *s)
+static inline void remove_vbos(IWineD3DDeviceImpl *This, const struct wined3d_gl_info *gl_info,
+ struct wined3d_stream_info *s)
{
unsigned int i;
@@ -570,7 +563,7 @@ static inline void remove_vbos(IWineD3DDeviceImpl *This, struct wined3d_stream_i
{
struct wined3d_buffer *vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
e->buffer_object = 0;
- e->data = (BYTE *)((unsigned long)e->data + (unsigned long)buffer_get_sysmem(vb));
+ e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, gl_info));
}
}
}
@@ -580,7 +573,6 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
- IWineD3DSurfaceImpl *target;
struct wined3d_context *context;
unsigned int i;
@@ -591,11 +583,11 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Invalidate the back buffer memory so LockRect will read it the next time */
for (i = 0; i < This->adapter->gl_info.limits.buffers; ++i)
{
- target = (IWineD3DSurfaceImpl *)This->render_targets[i];
+ IWineD3DSurface *target = (IWineD3DSurface *)This->render_targets[i];
if (target)
{
- IWineD3DSurface_LoadLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, NULL);
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *)target, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_LoadLocation(target, SFLAG_INDRAWABLE, NULL);
+ IWineD3DSurface_ModifyLocation(target, SFLAG_INDRAWABLE, TRUE);
}
}
}
@@ -603,9 +595,18 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Signals other modules that a drawing is in progress and the stateblock finalized */
This->isInDraw = TRUE;
- context = context_acquire(This, This->render_targets[0], CTXUSAGE_DRAWPRIM);
+ context = context_acquire(This, This->render_targets[0]);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping draw.\n");
+ return;
+ }
- if (This->stencilBufferTarget) {
+ context_apply_draw_state(context, This);
+
+ if (This->depth_stencil)
+ {
/* Note that this depends on the context_acquire() call above to set
* This->render_offscreen properly. We don't currently take the
* Z-compare function into account, but we could skip loading the
@@ -614,9 +615,33 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
DWORD location = context->render_offscreen ? SFLAG_DS_OFFSCREEN : SFLAG_DS_ONSCREEN;
if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE]
|| This->stateBlock->renderState[WINED3DRS_ZENABLE])
- surface_load_ds_location(This->stencilBufferTarget, context, location);
- if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE])
- surface_modify_ds_location(This->stencilBufferTarget, location);
+ {
+ RECT current_rect, draw_rect, r;
+
+ if (location == SFLAG_DS_ONSCREEN && This->depth_stencil != This->onscreen_depth_stencil)
+ device_switch_onscreen_ds(This, context, This->depth_stencil);
+
+ if (This->depth_stencil->Flags & location)
+ SetRect(¤t_rect, 0, 0,
+ This->depth_stencil->ds_current_size.cx,
+ This->depth_stencil->ds_current_size.cy);
+ else
+ SetRectEmpty(¤t_rect);
+
+ device_get_draw_rect(This, &draw_rect);
+
+ IntersectRect(&r, &draw_rect, ¤t_rect);
+ if (!EqualRect(&r, &draw_rect))
+ surface_load_ds_location(This->depth_stencil, context, location);
+
+ if (This->stateBlock->renderState[WINED3DRS_ZWRITEENABLE])
+ {
+ surface_modify_ds_location(This->depth_stencil, location,
+ This->depth_stencil->ds_current_size.cx,
+ This->depth_stencil->ds_current_size.cy);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->depth_stencil, SFLAG_INDRAWABLE, TRUE);
+ }
+ }
}
/* Ok, we will be updating the screen from here onwards so grab the lock */
@@ -659,7 +684,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
if(emulation) {
stream_info = &stridedlcl;
memcpy(&stridedlcl, &This->strided_streams, sizeof(stridedlcl));
- remove_vbos(This, &stridedlcl);
+ remove_vbos(This, context->gl_info, &stridedlcl);
}
}
@@ -691,7 +716,12 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Finished updating the screen, restore lock */
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ for(i = 0; i < This->num_buffer_queries; i++)
+ {
+ wined3d_event_query_issue(This->buffer_queries[i], This);
+ }
+
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
@@ -700,14 +730,14 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
/* Diagnostics */
#ifdef SHOW_FRAME_MAKEUP
{
- static long int primCounter = 0;
+ static LONG primCounter = 0;
/* NOTE: set primCounter to the value reported by drawprim
before you want to to write frame makeup to /tmp */
if (primCounter >= 0) {
WINED3DLOCKED_RECT r;
char buffer[80];
IWineD3DSurface_LockRect(This->render_targets[0], &r, NULL, WINED3DLOCK_READONLY);
- sprintf(buffer, "/tmp/backbuffer_%ld.tga", primCounter);
+ sprintf(buffer, "/tmp/backbuffer_%d.tga", primCounter);
TRACE("Saving screenshot %s\n", buffer);
IWineD3DSurface_SaveSnapshot(This->render_targets[0], buffer);
IWineD3DSurface_UnlockRect(This->render_targets[0]);
@@ -718,7 +748,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
int textureNo;
for (textureNo = 0; textureNo < MAX_COMBINED_SAMPLERS; ++textureNo) {
if (This->stateBlock->textures[textureNo] != NULL) {
- sprintf(buffer, "/tmp/texture_%p_%ld_%d.tga", This->stateBlock->textures[textureNo], primCounter, textureNo);
+ sprintf(buffer, "/tmp/texture_%p_%d_%d.tga", This->stateBlock->textures[textureNo], primCounter, textureNo);
TRACE("Saving texture %s\n", buffer);
if (IWineD3DBaseTexture_GetType(This->stateBlock->textures[textureNo]) == WINED3DRTYPE_TEXTURE) {
IWineD3DTexture_GetSurfaceLevel(This->stateBlock->textures[textureNo], 0, &pSur);
@@ -732,7 +762,7 @@ void drawPrimitive(IWineD3DDevice *iface, UINT index_count, UINT StartIdx, UINT
}
#endif
}
- TRACE("drawprim #%ld\n", primCounter);
+ TRACE("drawprim #%d\n", primCounter);
++primCounter;
}
#endif
@@ -788,7 +818,8 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
/* Simply activate the context for blitting. This disables all the things we don't want and
* takes care of dirtifying. Dirtifying is preferred over pushing / popping, since drawing the
* patch (as opposed to normal draws) will most likely need different changes anyway. */
- context = context_acquire(This, NULL, CTXUSAGE_BLIT);
+ context = context_acquire(This, NULL);
+ context_apply_blit_state(context, This);
/* First, locate the position data. This is provided in a vertex buffer in the stateblock.
* Beware of vbos
@@ -800,7 +831,7 @@ HRESULT tesselate_rectpatch(IWineD3DDeviceImpl *This,
{
struct wined3d_buffer *vb;
vb = (struct wined3d_buffer *)This->stateBlock->streamSource[e->stream_idx];
- e->data = (BYTE *)((unsigned long)e->data + (unsigned long)buffer_get_sysmem(vb));
+ e->data = (BYTE *)((ULONG_PTR)e->data + (ULONG_PTR)buffer_get_sysmem(vb, context->gl_info));
}
vtxStride = e->stride;
data = e->data +
diff --git a/dll/directx/wine/wined3d/glsl_shader.c b/dll/directx/wine/wined3d/glsl_shader.c
index cb23ee6aa0e..056e9adb45a 100644
--- a/dll/directx/wine/wined3d/glsl_shader.c
+++ b/dll/directx/wine/wined3d/glsl_shader.c
@@ -39,8 +39,6 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_constants);
WINE_DECLARE_DEBUG_CHANNEL(d3d_caps);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
#define WINED3D_GLSL_SAMPLE_PROJECTED 0x1
#define WINED3D_GLSL_SAMPLE_RECT 0x2
#define WINED3D_GLSL_SAMPLE_LOD 0x4
@@ -89,7 +87,8 @@ struct shader_glsl_priv {
struct constant_heap vconst_heap;
struct constant_heap pconst_heap;
unsigned char *stack;
- GLhandleARB depth_blt_program[tex_type_count];
+ GLhandleARB depth_blt_program_full[tex_type_count];
+ GLhandleARB depth_blt_program_masked[tex_type_count];
UINT next_constant_version;
};
@@ -255,7 +254,7 @@ static void print_glsl_info_log(const struct wined3d_gl_info *gl_info, GLhandleA
/* GL locking is done by the caller. */
static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_info, GLhandleARB program)
{
- GLint i, object_count, source_size;
+ GLint i, object_count, source_size = -1;
GLhandleARB *objects;
char *source = NULL;
@@ -275,7 +274,7 @@ static void shader_glsl_dump_program_source(const struct wined3d_gl_info *gl_inf
GL_EXTCALL(glGetObjectParameterivARB(objects[i], GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &tmp));
- if (!source || source_size < tmp)
+ if (source_size < tmp)
{
HeapFree(GetProcessHeap(), 0, source);
@@ -719,8 +718,8 @@ static void shader_glsl_load_np2fixup_constants(
static void shader_glsl_load_constants(const struct wined3d_context *context,
char usePixelShader, char useVertexShader)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ IWineD3DDeviceImpl *device = context->swapchain->device;
IWineD3DStateBlockImpl* stateBlock = device->stateBlock;
struct shader_glsl_priv *priv = device->shader_priv;
@@ -807,7 +806,7 @@ static void shader_glsl_load_constants(const struct wined3d_context *context,
correction_params[1] = 1.0f;
} else {
/* position is window relative, not viewport relative */
- correction_params[0] = ((IWineD3DSurfaceImpl *)context->current_rt)->currentDesc.Height;
+ correction_params[0] = context->current_rt->currentDesc.Height;
correction_params[1] = -1.0f;
}
GL_EXTCALL(glUniform4fvARB(prog->ycorrection_location, 1, correction_params));
@@ -1034,7 +1033,7 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
*/
FIXME("Cannot find a free uniform for vpos correction params\n");
shader_addline(buffer, "const vec4 ycorrection = vec4(%f, %f, 0.0, 0.0);\n",
- context->render_offscreen ? 0.0f : ((IWineD3DSurfaceImpl *)device->render_targets[0])->currentDesc.Height,
+ context->render_offscreen ? 0.0f : device->render_targets[0]->currentDesc.Height,
context->render_offscreen ? 1.0f : -1.0f);
}
shader_addline(buffer, "vec4 vpos;\n");
@@ -1048,20 +1047,37 @@ static void shader_generate_glsl_declarations(const struct wined3d_context *cont
switch (reg_maps->sampler_type[i])
{
case WINED3DSTT_1D:
- shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
+ if (pshader && ps_args->shadow & (1 << i))
+ shader_addline(buffer, "uniform sampler1DShadow %csampler%u;\n", prefix, i);
+ else
+ shader_addline(buffer, "uniform sampler1D %csampler%u;\n", prefix, i);
break;
case WINED3DSTT_2D:
- if(device->stateBlock->textures[i] &&
- IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i]) == GL_TEXTURE_RECTANGLE_ARB) {
- shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
- } else {
- shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
+ if (pshader && ps_args->shadow & (1 << i))
+ {
+ if (device->stateBlock->textures[i]
+ && IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i])
+ == GL_TEXTURE_RECTANGLE_ARB)
+ shader_addline(buffer, "uniform sampler2DRectShadow %csampler%u;\n", prefix, i);
+ else
+ shader_addline(buffer, "uniform sampler2DShadow %csampler%u;\n", prefix, i);
+ }
+ else
+ {
+ if (device->stateBlock->textures[i]
+ && IWineD3DBaseTexture_GetTextureDimensions(device->stateBlock->textures[i])
+ == GL_TEXTURE_RECTANGLE_ARB)
+ shader_addline(buffer, "uniform sampler2DRect %csampler%u;\n", prefix, i);
+ else
+ shader_addline(buffer, "uniform sampler2D %csampler%u;\n", prefix, i);
}
break;
case WINED3DSTT_CUBE:
+ if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported Cube shadow sampler.\n");
shader_addline(buffer, "uniform samplerCube %csampler%u;\n", prefix, i);
break;
case WINED3DSTT_VOLUME:
+ if (pshader && ps_args->shadow & (1 << i)) FIXME("Unsupported 3D shadow sampler.\n");
shader_addline(buffer, "uniform sampler3D %csampler%u;\n", prefix, i);
break;
default:
@@ -1642,9 +1658,13 @@ static inline const char *shader_get_comp_op(DWORD op)
}
}
-static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_info,
- DWORD sampler_type, DWORD flags, glsl_sample_function_t *sample_function)
+static void shader_glsl_get_sample_function(const struct wined3d_shader_context *ctx,
+ DWORD sampler_idx, DWORD flags, glsl_sample_function_t *sample_function)
{
+ WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ctx->reg_maps->sampler_type[sampler_idx];
+ const struct wined3d_gl_info *gl_info = ctx->gl_info;
+ BOOL shadow = shader_is_pshader_version(ctx->reg_maps->shader_version.type)
+ && (((const struct shader_glsl_ctx_priv *)ctx->backend_data)->cur_ps_args->shadow & (1 << sampler_idx));
BOOL projected = flags & WINED3D_GLSL_SAMPLE_PROJECTED;
BOOL texrect = flags & WINED3D_GLSL_SAMPLE_RECT;
BOOL lod = flags & WINED3D_GLSL_SAMPLE_LOD;
@@ -1653,115 +1673,225 @@ static void shader_glsl_get_sample_function(const struct wined3d_gl_info *gl_inf
/* Note that there's no such thing as a projected cube texture. */
switch(sampler_type) {
case WINED3DSTT_1D:
- if(lod) {
- sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
- }
- else if (grad)
+ if (shadow)
{
- if (gl_info->supported[EXT_GPU_SHADER4])
- sample_function->name = projected ? "texture1DProjGrad" : "texture1DGrad";
- else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
- sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
+ if (lod)
+ {
+ sample_function->name = projected ? "shadow1DProjLod" : "shadow1DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "shadow1DProjGrad" : "shadow1DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "shadow1DProjGradARB" : "shadow1DGradARB";
+ else
+ {
+ FIXME("Unsupported 1D shadow grad function.\n");
+ sample_function->name = "unsupported1DGrad";
+ }
+ }
else
{
- FIXME("Unsupported 1D grad function.\n");
- sample_function->name = "unsupported1DGrad";
+ sample_function->name = projected ? "shadow1DProj" : "shadow1D";
}
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
}
else
{
- sample_function->name = projected ? "texture1DProj" : "texture1D";
+ if (lod)
+ {
+ sample_function->name = projected ? "texture1DProjLod" : "texture1DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture1DProjGrad" : "texture1DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture1DProjGradARB" : "texture1DGradARB";
+ else
+ {
+ FIXME("Unsupported 1D grad function.\n");
+ sample_function->name = "unsupported1DGrad";
+ }
+ }
+ else
+ {
+ sample_function->name = projected ? "texture1DProj" : "texture1D";
+ }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0;
break;
+
case WINED3DSTT_2D:
- if(texrect) {
- if(lod) {
- sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
- }
- else if (grad)
+ if (shadow)
+ {
+ if (texrect)
{
- if (gl_info->supported[EXT_GPU_SHADER4])
- sample_function->name = projected ? "texture2DRectProjGrad" : "texture2DRectGrad";
- else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
- sample_function->name = projected ? "texture2DRectProjGradARB" : "texture2DRectGradARB";
+ if (lod)
+ {
+ sample_function->name = projected ? "shadow2DRectProjLod" : "shadow2DRectLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "shadow2DRectProjGrad" : "shadow2DRectGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "shadow2DRectProjGradARB" : "shadow2DRectGradARB";
+ else
+ {
+ FIXME("Unsupported RECT shadow grad function.\n");
+ sample_function->name = "unsupported2DRectGrad";
+ }
+ }
else
{
- FIXME("Unsupported RECT grad function.\n");
- sample_function->name = "unsupported2DRectGrad";
+ sample_function->name = projected ? "shadow2DRectProj" : "shadow2DRect";
}
}
else
{
- sample_function->name = projected ? "texture2DRectProj" : "texture2DRect";
- }
- } else {
- if(lod) {
- sample_function->name = projected ? "texture2DProjLod" : "texture2DLod";
- }
- else if (grad)
- {
- if (gl_info->supported[EXT_GPU_SHADER4])
- sample_function->name = projected ? "texture2DProjGrad" : "texture2DGrad";
- else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
- sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
+ if (lod)
+ {
+ sample_function->name = projected ? "shadow2DProjLod" : "shadow2DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "shadow2DProjGrad" : "shadow2DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "shadow2DProjGradARB" : "shadow2DGradARB";
+ else
+ {
+ FIXME("Unsupported 2D shadow grad function.\n");
+ sample_function->name = "unsupported2DGrad";
+ }
+ }
else
{
- FIXME("Unsupported 2D grad function.\n");
- sample_function->name = "unsupported2DGrad";
+ sample_function->name = projected ? "shadow2DProj" : "shadow2D";
}
}
- else
- {
- sample_function->name = projected ? "texture2DProj" : "texture2D";
- }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+ }
+ else
+ {
+ if (texrect)
+ {
+ if (lod)
+ {
+ sample_function->name = projected ? "texture2DRectProjLod" : "texture2DRectLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture2DRectProjGrad" : "texture2DRectGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture2DRectProjGradARB" : "texture2DRectGradARB";
+ else
+ {
+ FIXME("Unsupported RECT grad function.\n");
+ sample_function->name = "unsupported2DRectGrad";
+ }
+ }
+ else
+ {
+ sample_function->name = projected ? "texture2DRectProj" : "texture2DRect";
+ }
+ }
+ else
+ {
+ if (lod)
+ {
+ sample_function->name = projected ? "texture2DProjLod" : "texture2DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture2DProjGrad" : "texture2DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture2DProjGradARB" : "texture2DGradARB";
+ else
+ {
+ FIXME("Unsupported 2D grad function.\n");
+ sample_function->name = "unsupported2DGrad";
+ }
+ }
+ else
+ {
+ sample_function->name = projected ? "texture2DProj" : "texture2D";
+ }
+ }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1;
break;
+
case WINED3DSTT_CUBE:
- if(lod) {
- sample_function->name = "textureCubeLod";
- }
- else if (grad)
+ if (shadow)
{
- if (gl_info->supported[EXT_GPU_SHADER4])
- sample_function->name = "textureCubeGrad";
- else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
- sample_function->name = "textureCubeGradARB";
- else
- {
- FIXME("Unsupported Cube grad function.\n");
- sample_function->name = "unsupportedCubeGrad";
- }
+ FIXME("Unsupported Cube shadow function.\n ");
+ sample_function->name = "unsupportedCubeShadow";
+ sample_function->coord_mask = 0;
}
else
{
- sample_function->name = "textureCube";
+ if (lod)
+ {
+ sample_function->name = "textureCubeLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = "textureCubeGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = "textureCubeGradARB";
+ else
+ {
+ FIXME("Unsupported Cube grad function.\n");
+ sample_function->name = "unsupportedCubeGrad";
+ }
+ }
+ else
+ {
+ sample_function->name = "textureCube";
+ }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
break;
+
case WINED3DSTT_VOLUME:
- if(lod) {
- sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
- }
- else if (grad)
+ if (shadow)
{
- if (gl_info->supported[EXT_GPU_SHADER4])
- sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad";
- else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
- sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
- else
- {
- FIXME("Unsupported 3D grad function.\n");
- sample_function->name = "unsupported3DGrad";
- }
+ FIXME("Unsupported 3D shadow function.\n ");
+ sample_function->name = "unsupported3DShadow";
+ sample_function->coord_mask = 0;
}
else
{
- sample_function->name = projected ? "texture3DProj" : "texture3D";
+ if (lod)
+ {
+ sample_function->name = projected ? "texture3DProjLod" : "texture3DLod";
+ }
+ else if (grad)
+ {
+ if (gl_info->supported[EXT_GPU_SHADER4])
+ sample_function->name = projected ? "texture3DProjGrad" : "texture3DGrad";
+ else if (gl_info->supported[ARB_SHADER_TEXTURE_LOD])
+ sample_function->name = projected ? "texture3DProjGradARB" : "texture3DGradARB";
+ else
+ {
+ FIXME("Unsupported 3D grad function.\n");
+ sample_function->name = "unsupported3DGrad";
+ }
+ }
+ else
+ {
+ sample_function->name = projected ? "texture3DProj" : "texture3D";
+ }
+ sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
}
- sample_function->coord_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
break;
+
default:
sample_function->name = "";
sample_function->coord_mask = 0;
@@ -2164,16 +2294,26 @@ static void shader_glsl_nrm(const struct wined3d_shader_instruction *ins)
{
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src_param;
+ unsigned int mask_size;
DWORD write_mask;
char dst_mask[6];
write_mask = shader_glsl_get_write_mask(ins->dst, dst_mask);
+ mask_size = shader_glsl_get_write_mask_size(write_mask);
shader_glsl_add_src_param(ins, &ins->src[0], write_mask, &src_param);
shader_addline(buffer, "tmp0.x = length(%s);\n", src_param.param_str);
shader_glsl_append_dst(buffer, ins);
- shader_addline(buffer, "tmp0.x == 0.0 ? (%s * FLT_MAX) : (%s / tmp0.x));",
- src_param.param_str, src_param.param_str);
+ if (mask_size > 1)
+ {
+ shader_addline(buffer, "tmp0.x == 0.0 ? vec%u(0.0) : (%s / tmp0.x));\n",
+ mask_size, src_param.param_str);
+ }
+ else
+ {
+ shader_addline(buffer, "tmp0.x == 0.0 ? 0.0 : (%s / tmp0.x));\n",
+ src_param.param_str);
+ }
}
/** Process the WINED3DSIO_EXPP instruction in GLSL:
@@ -2868,10 +3008,8 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
DWORD shader_version = WINED3D_SHADER_VERSION(ins->ctx->reg_maps->shader_version.major,
ins->ctx->reg_maps->shader_version.minor);
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_sample_function_t sample_function;
DWORD sample_flags = 0;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
DWORD sampler_idx;
DWORD mask = 0, swizzle;
@@ -2879,11 +3017,11 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
* 2.0+: Use provided sampler source. */
if (shader_version < WINED3D_SHADER_VERSION(2,0)) sampler_idx = ins->dst[0].reg.idx;
else sampler_idx = ins->src[1].reg.idx;
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
if (shader_version < WINED3D_SHADER_VERSION(1,4))
{
DWORD flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS];
+ WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
/* Projected cube textures don't make a lot of sense, the resulting coordinates stay the same. */
if (flags & WINED3DTTFF_PROJECTED && sampler_type != WINED3DSTT_CUBE) {
@@ -2922,7 +3060,7 @@ static void shader_glsl_tex(const struct wined3d_shader_instruction *ins)
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
mask |= sample_function.coord_mask;
if (shader_version < WINED3D_SHADER_VERSION(2,0)) swizzle = WINED3DSP_NOSWIZZLE;
@@ -2960,7 +3098,6 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, dx_param, dy_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_GRAD;
- DWORD sampler_type;
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
@@ -2971,13 +3108,12 @@ static void shader_glsl_texldd(const struct wined3d_shader_instruction *ins)
}
sampler_idx = ins->src[1].reg.idx;
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
if(deviceImpl->stateBlock->textures[sampler_idx] &&
IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
shader_glsl_add_src_param(ins, &ins->src[2], sample_function.coord_mask, &dx_param);
shader_glsl_add_src_param(ins, &ins->src[3], sample_function.coord_mask, &dy_param);
@@ -2994,17 +3130,15 @@ static void shader_glsl_texldl(const struct wined3d_shader_instruction *ins)
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param, lod_param;
DWORD sample_flags = WINED3D_GLSL_SAMPLE_LOD;
- DWORD sampler_type;
DWORD sampler_idx;
DWORD swizzle = ins->src[1].swizzle;
sampler_idx = ins->src[1].reg.idx;
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
if(deviceImpl->stateBlock->textures[sampler_idx] &&
IWineD3DBaseTexture_GetTextureDimensions(deviceImpl->stateBlock->textures[sampler_idx]) == GL_TEXTURE_RECTANGLE_ARB) {
sample_flags |= WINED3D_GLSL_SAMPLE_RECT;
}
- shader_glsl_get_sample_function(gl_info, sampler_type, sample_flags, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, sample_flags, &sample_function);
shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &coord_param);
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_3, &lod_param);
@@ -3071,12 +3205,10 @@ static void shader_glsl_texcoord(const struct wined3d_shader_instruction *ins)
* then perform a 1D texture lookup from stage dstregnum, place into dst. */
static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
{
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
glsl_sample_function_t sample_function;
DWORD sampler_idx = ins->dst[0].reg.idx;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
UINT mask_size;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
@@ -3086,7 +3218,7 @@ static void shader_glsl_texdp3tex(const struct wined3d_shader_instruction *ins)
*
* It is a dependent read - not valid with conditional NP2 textures
*/
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
mask_size = shader_glsl_get_write_mask_size(sample_function.coord_mask);
switch(mask_size)
@@ -3199,18 +3331,16 @@ static void shader_glsl_texm3x3pad(const struct wined3d_shader_instruction *ins)
static void shader_glsl_texm3x2tex(const struct wined3d_shader_instruction *ins)
{
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
glsl_src_param_t src0_param;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
shader_addline(buffer, "tmp0.y = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 0, &sample_function);
/* Sample the texture using the calculated coordinates */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xy");
@@ -3223,17 +3353,15 @@ static void shader_glsl_texm3x3tex(const struct wined3d_shader_instruction *ins)
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
SHADER_PARSE_STATE *current_state = &shader->baseShader.parse_state;
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD reg = ins->dst[0].reg.idx;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
shader_addline(ins->ctx->buffer, "tmp0.z = dot(T%u.xyz, %s);\n", reg, src0_param.param_str);
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 0, &sample_function);
/* Sample the texture using the calculated coordinates */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3266,13 +3394,11 @@ static void shader_glsl_texm3x3(const struct wined3d_shader_instruction *ins)
static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins)
{
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
DWORD reg = ins->dst[0].reg.idx;
glsl_src_param_t src0_param;
glsl_src_param_t src1_param;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
- WINED3DSAMPLER_TEXTURE_TYPE stype = ins->ctx->reg_maps->sampler_type[reg];
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
glsl_sample_function_t sample_function;
@@ -3285,7 +3411,7 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
shader_addline(buffer, "tmp0.xyz = -reflect((%s), normalize(tmp0.xyz));\n", src1_param.param_str);
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(gl_info, stype, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 0, &sample_function);
/* Sample the texture */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3298,13 +3424,11 @@ static void shader_glsl_texm3x3spec(const struct wined3d_shader_instruction *ins
static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *ins)
{
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
DWORD reg = ins->dst[0].reg.idx;
struct wined3d_shader_buffer *buffer = ins->ctx->buffer;
SHADER_PARSE_STATE* current_state = &shader->baseShader.parse_state;
glsl_src_param_t src0_param;
DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[reg];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], src_mask, &src0_param);
@@ -3318,7 +3442,7 @@ static void shader_glsl_texm3x3vspec(const struct wined3d_shader_instruction *in
shader_addline(buffer, "tmp0.xyz = -reflect(tmp1.xyz, normalize(tmp0.xyz));\n");
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, reg, 0, &sample_function);
/* Sample the texture using the calculated coordinates */
shader_glsl_gen_sample_code(ins, reg, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL, "tmp0.xyz");
@@ -3334,10 +3458,8 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
{
IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl *)ins->ctx->shader;
IWineD3DDeviceImpl *deviceImpl = (IWineD3DDeviceImpl *)shader->baseShader.device;
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_sample_function_t sample_function;
glsl_src_param_t coord_param;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type;
DWORD sampler_idx;
DWORD mask;
DWORD flags;
@@ -3346,9 +3468,8 @@ static void shader_glsl_texbem(const struct wined3d_shader_instruction *ins)
sampler_idx = ins->dst[0].reg.idx;
flags = deviceImpl->stateBlock->textureState[sampler_idx][WINED3DTSS_TEXTURETRANSFORMFLAGS];
- sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
mask = sample_function.coord_mask;
shader_glsl_write_mask_to_str(mask, coord_mask);
@@ -3407,15 +3528,13 @@ static void shader_glsl_bem(const struct wined3d_shader_instruction *ins)
* Sample 2D texture at dst using the alpha & red (wx) components of src as texture coordinates */
static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
{
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
"%s.wx", src0_param.reg_name);
}
@@ -3424,15 +3543,13 @@ static void shader_glsl_texreg2ar(const struct wined3d_shader_instruction *ins)
* Sample 2D texture at dst using the green & blue (yz) components of src as texture coordinates */
static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
{
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
glsl_sample_function_t sample_function;
shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_ALL, &src0_param);
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
"%s.yz", src0_param.reg_name);
}
@@ -3441,14 +3558,12 @@ static void shader_glsl_texreg2gb(const struct wined3d_shader_instruction *ins)
* Sample texture at dst using the rgb (xyz) components of src as texture coordinates */
static void shader_glsl_texreg2rgb(const struct wined3d_shader_instruction *ins)
{
- const struct wined3d_gl_info *gl_info = ins->ctx->gl_info;
glsl_src_param_t src0_param;
DWORD sampler_idx = ins->dst[0].reg.idx;
- WINED3DSAMPLER_TEXTURE_TYPE sampler_type = ins->ctx->reg_maps->sampler_type[sampler_idx];
glsl_sample_function_t sample_function;
/* Dependent read, not valid with conditional NP2 */
- shader_glsl_get_sample_function(gl_info, sampler_type, 0, &sample_function);
+ shader_glsl_get_sample_function(ins->ctx, sampler_idx, 0, &sample_function);
shader_glsl_add_src_param(ins, &ins->src[0], sample_function.coord_mask, &src0_param);
shader_glsl_gen_sample_code(ins, sampler_idx, &sample_function, WINED3DSP_NOSWIZZLE, NULL, NULL, NULL,
@@ -4453,10 +4568,12 @@ static void set_glsl_shader_program(const struct wined3d_context *context,
}
/* GL locking is done by the caller */
-static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum tex_types tex_type)
+static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info, enum tex_types tex_type, BOOL masked)
{
GLhandleARB program_id;
GLhandleARB vshader_id, pshader_id;
+ const char *blt_pshader;
+
static const char *blt_vshader[] =
{
"#version 120\n"
@@ -4468,7 +4585,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
"}\n"
};
- static const char *blt_pshaders[tex_type_count] =
+ static const char *blt_pshaders_full[tex_type_count] =
{
/* tex_1d */
NULL,
@@ -4498,7 +4615,44 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
"}\n",
};
- if (!blt_pshaders[tex_type])
+ static const char *blt_pshaders_masked[tex_type_count] =
+ {
+ /* tex_1d */
+ NULL,
+ /* tex_2d */
+ "#version 120\n"
+ "uniform sampler2D sampler;\n"
+ "uniform vec4 mask;\n"
+ "void main(void)\n"
+ "{\n"
+ " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
+ " gl_FragDepth = texture2D(sampler, gl_TexCoord[0].xy).x;\n"
+ "}\n",
+ /* tex_3d */
+ NULL,
+ /* tex_cube */
+ "#version 120\n"
+ "uniform samplerCube sampler;\n"
+ "uniform vec4 mask;\n"
+ "void main(void)\n"
+ "{\n"
+ " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
+ " gl_FragDepth = textureCube(sampler, gl_TexCoord[0].xyz).x;\n"
+ "}\n",
+ /* tex_rect */
+ "#version 120\n"
+ "#extension GL_ARB_texture_rectangle : enable\n"
+ "uniform sampler2DRect sampler;\n"
+ "uniform vec4 mask;\n"
+ "void main(void)\n"
+ "{\n"
+ " if (all(lessThan(gl_FragCoord.xy, mask.zw))) discard;\n"
+ " gl_FragDepth = texture2DRect(sampler, gl_TexCoord[0].xy).x;\n"
+ "}\n",
+ };
+
+ blt_pshader = masked ? blt_pshaders_masked[tex_type] : blt_pshaders_full[tex_type];
+ if (!blt_pshader)
{
FIXME("tex_type %#x not supported\n", tex_type);
tex_type = tex_2d;
@@ -4509,7 +4663,7 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
GL_EXTCALL(glCompileShaderARB(vshader_id));
pshader_id = GL_EXTCALL(glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB));
- GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshaders[tex_type], NULL));
+ GL_EXTCALL(glShaderSourceARB(pshader_id, 1, &blt_pshader, NULL));
GL_EXTCALL(glCompileShaderARB(pshader_id));
program_id = GL_EXTCALL(glCreateProgramObjectARB());
@@ -4530,8 +4684,8 @@ static GLhandleARB create_glsl_blt_shader(const struct wined3d_gl_info *gl_info,
/* GL locking is done by the caller */
static void shader_glsl_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS)
{
- IWineD3DDeviceImpl *device = ((IWineD3DSurfaceImpl *)context->surface)->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ IWineD3DDeviceImpl *device = context->swapchain->device;
struct shader_glsl_priv *priv = device->shader_priv;
GLhandleARB program_id = 0;
GLenum old_vertex_color_clamp, current_vertex_color_clamp;
@@ -4571,21 +4725,34 @@ static void shader_glsl_select(const struct wined3d_context *context, BOOL usePS
}
/* GL locking is done by the caller */
-static void shader_glsl_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {
+static void shader_glsl_select_depth_blt(IWineD3DDevice *iface,
+ enum tex_types tex_type, const SIZE *ds_mask_size)
+{
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
const struct wined3d_gl_info *gl_info = &This->adapter->gl_info;
+ BOOL masked = ds_mask_size->cx && ds_mask_size->cy;
struct shader_glsl_priv *priv = This->shader_priv;
- GLhandleARB *blt_program = &priv->depth_blt_program[tex_type];
+ GLhandleARB *blt_program;
+ GLint loc;
- if (!*blt_program) {
- GLint loc;
- *blt_program = create_glsl_blt_shader(gl_info, tex_type);
+ blt_program = masked ? &priv->depth_blt_program_masked[tex_type] : &priv->depth_blt_program_full[tex_type];
+ if (!*blt_program)
+ {
+ *blt_program = create_glsl_blt_shader(gl_info, tex_type, masked);
loc = GL_EXTCALL(glGetUniformLocationARB(*blt_program, "sampler"));
GL_EXTCALL(glUseProgramObjectARB(*blt_program));
GL_EXTCALL(glUniform1iARB(loc, 0));
- } else {
+ }
+ else
+ {
GL_EXTCALL(glUseProgramObjectARB(*blt_program));
}
+
+ if (masked)
+ {
+ loc = GL_EXTCALL(glGetUniformLocationARB(*blt_program, "mask"));
+ GL_EXTCALL(glUniform4fARB(loc, 0.0f, 0.0f, (float)ds_mask_size->cx, (float)ds_mask_size->cy));
+ }
}
/* GL locking is done by the caller */
@@ -4625,7 +4792,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
return;
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->pshader == iface)
@@ -4644,7 +4811,7 @@ static void shader_glsl_destroy(IWineD3DBaseShader *iface) {
return;
}
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
if (priv->glsl_program && (IWineD3DBaseShader *)priv->glsl_program->vshader == iface)
@@ -4821,9 +4988,13 @@ static void shader_glsl_free(IWineD3DDevice *iface) {
ENTER_GL();
for (i = 0; i < tex_type_count; ++i)
{
- if (priv->depth_blt_program[i])
+ if (priv->depth_blt_program_full[i])
{
- GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program[i]));
+ GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program_full[i]));
+ }
+ if (priv->depth_blt_program_masked[i])
+ {
+ GL_EXTCALL(glDeleteObjectARB(priv->depth_blt_program_masked[i]));
}
}
LEAVE_GL();
diff --git a/dll/directx/wine/wined3d/nvidia_texture_shader.c b/dll/directx/wine/wined3d/nvidia_texture_shader.c
index 64bb883d6c8..24cba329f20 100644
--- a/dll/directx/wine/wined3d/nvidia_texture_shader.c
+++ b/dll/directx/wine/wined3d/nvidia_texture_shader.c
@@ -28,8 +28,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION stateblock->device->adapter->gl_info
-
/* GL locking for state handlers is done by the caller. */
static void nvts_activate_dimensions(DWORD stage, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -137,7 +135,6 @@ void set_tex_op_nvrc(IWineD3DDevice *iface, BOOL is_alpha, int stage, WINED3DTEX
GLenum portion = is_alpha ? GL_ALPHA : GL_RGB;
GLenum target = GL_COMBINER0_NV + stage;
GLenum output;
- IWineD3DStateBlockImpl *stateblock = This->stateBlock; /* For GLINFO_LOCATION */
TRACE("stage %d, is_alpha %d, op %s, arg1 %#x, arg2 %#x, arg3 %#x, texture_idx %d\n",
stage, is_alpha, debug_d3dtop(op), arg1, arg2, arg3, texture_idx);
@@ -579,6 +576,7 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str
{
DWORD stage = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->device->texUnitMap[stage + 1];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float mat[2][2];
/* Direct3D sets the matrix in the stage reading the perturbation map. The result is used to
@@ -587,7 +585,7 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str
* map is read from a specified source stage(always stage - 1 for d3d). Thus set the matrix
* for stage + 1. Keep the nvrc tex unit mapping in mind too
*/
- if (mapped_stage < context->gl_info->limits.textures)
+ if (mapped_stage < gl_info->limits.textures)
{
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage))");
@@ -606,6 +604,7 @@ static void nvts_bumpenvmat(DWORD state, IWineD3DStateBlockImpl *stateblock, str
static void nvrc_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float col[4];
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
GL_EXTCALL(glCombinerParameterfvNV(GL_CONSTANT_COLOR0_NV, &col[0]));
@@ -629,6 +628,15 @@ static void nvts_enable(IWineD3DDevice *iface, BOOL enable) {
static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
+ pCaps->PrimitiveMiscCaps = WINED3DPMISCCAPS_TSSARGTEMP;
+
+ /* The caps below can be supported but aren't handled yet in utils.c
+ * 'd3dta_to_combiner_input', disable them until support is fixed */
+#if 0
+ if (gl_info->supported[NV_REGISTER_COMBINERS2])
+ pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT;
+#endif
+
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
WINED3DTEXOPCAPS_ADDSIGNED2X |
@@ -672,14 +680,6 @@ static void nvrc_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct
pCaps->MaxTextureBlendStages = min(MAX_TEXTURES, gl_info->limits.general_combiners);
pCaps->MaxSimultaneousTextures = gl_info->limits.textures;
-
- pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_TSSARGTEMP;
-
- /* The caps below can be supported but aren't handled yet in utils.c 'd3dta_to_combiner_input', disable them until support is fixed */
-#if 0
- if (gl_info->supported[NV_REGISTER_COMBINERS2])
- pCaps->PrimitiveMiscCaps |= WINED3DPMISCCAPS_PERSTAGECONSTANT;
-#endif
}
static HRESULT nvrc_fragment_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
@@ -713,119 +713,119 @@ static BOOL nvts_color_fixup_supported(struct color_fixup_desc fixup)
static const struct StateEntryTemplate nvrc_fragmentstate_template[] = {
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), nvts_bumpenvmat }, NV_TEXTURE_SHADER2 },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), nvrc_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, NV_TEXTURE_SHADER2 },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), nvrc_texfactor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), nvts_texdim }, NV_TEXTURE_SHADER2 },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), nvts_texdim }, NV_TEXTURE_SHADER2 },
diff --git a/dll/directx/wine/wined3d/palette.c b/dll/directx/wine/wined3d/palette.c
index 553a08a787b..3fd8be9dd10 100644
--- a/dll/directx/wine/wined3d/palette.c
+++ b/dll/directx/wine/wined3d/palette.c
@@ -74,7 +74,8 @@ static ULONG WINAPI IWineD3DPaletteImpl_Release(IWineD3DPalette *iface) {
}
/* Not called from the vtable */
-DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) {
+static DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags)
+{
switch (dwFlags & SIZE_BITS) {
case WINEDDPCAPS_1BIT: return 2;
case WINEDDPCAPS_2BIT: return 4;
@@ -183,7 +184,7 @@ static HRESULT WINAPI IWineD3DPaletteImpl_GetParent(IWineD3DPalette *iface, IUn
return WINED3D_OK;
}
-const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
+static const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
{
/*** IUnknown ***/
IWineD3DPaletteImpl_QueryInterface,
@@ -195,3 +196,33 @@ const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl =
IWineD3DPaletteImpl_GetCaps,
IWineD3DPaletteImpl_SetEntries
};
+
+HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device,
+ DWORD flags, const PALETTEENTRY *entries, IUnknown *parent)
+{
+ HRESULT hr;
+
+ palette->lpVtbl = &IWineD3DPalette_Vtbl;
+ palette->ref = 1;
+ palette->parent = parent;
+ palette->device = device;
+ palette->Flags = flags;
+
+ palette->palNumEntries = IWineD3DPaletteImpl_Size(flags);
+ palette->hpal = CreatePalette((const LOGPALETTE *)&palette->palVersion);
+ if (!palette->hpal)
+ {
+ WARN("Failed to create palette.\n");
+ return E_FAIL;
+ }
+
+ hr = IWineD3DPalette_SetEntries((IWineD3DPalette *)palette, 0, 0, IWineD3DPaletteImpl_Size(flags), entries);
+ if (FAILED(hr))
+ {
+ WARN("Failed to set palette entries, hr %#x.\n", hr);
+ DeleteObject(palette->hpal);
+ return hr;
+ }
+
+ return WINED3D_OK;
+}
diff --git a/dll/directx/wine/wined3d/query.c b/dll/directx/wine/wined3d/query.c
index 3860e2c95b5..b3c77eae692 100644
--- a/dll/directx/wine/wined3d/query.c
+++ b/dll/directx/wine/wined3d/query.c
@@ -25,33 +25,19 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-static HRESULT wined3d_event_query_init(const struct wined3d_gl_info *gl_info, struct wined3d_event_query **query)
+BOOL wined3d_event_query_supported(const struct wined3d_gl_info *gl_info)
{
- struct wined3d_event_query *ret;
- *query = NULL;
- if (!gl_info->supported[ARB_SYNC] && !gl_info->supported[NV_FENCE]
- && !gl_info->supported[APPLE_FENCE]) return E_NOTIMPL;
-
- ret = HeapAlloc(GetProcessHeap(), 0, sizeof(*ret));
- if (!ret)
- {
- ERR("Failed to allocate a wined3d event query structure.\n");
- return E_OUTOFMEMORY;
- }
- ret->context = NULL;
- *query = ret;
- return WINED3D_OK;
+ return gl_info->supported[ARB_SYNC] || gl_info->supported[NV_FENCE] || gl_info->supported[APPLE_FENCE];
}
-static void wined3d_event_query_destroy(struct wined3d_event_query *query)
+void wined3d_event_query_destroy(struct wined3d_event_query *query)
{
if (query->context) context_free_event_query(query);
HeapFree(GetProcessHeap(), 0, query);
}
-static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
{
struct wined3d_context *context;
const struct wined3d_gl_info *gl_info;
@@ -72,7 +58,7 @@ static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_e
return WINED3D_EVENT_QUERY_WRONG_THREAD;
}
- context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, query->context->current_rt);
gl_info = context->gl_info;
ENTER_GL();
@@ -125,7 +111,75 @@ static enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_e
return ret;
}
-static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+enum wined3d_event_query_result wined3d_event_query_finish(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
+{
+ struct wined3d_context *context;
+ const struct wined3d_gl_info *gl_info;
+ enum wined3d_event_query_result ret;
+
+ TRACE("(%p)\n", query);
+
+ if (!query->context)
+ {
+ TRACE("Query not started\n");
+ return WINED3D_EVENT_QUERY_NOT_STARTED;
+ }
+ gl_info = query->context->gl_info;
+
+ if (query->context->tid != GetCurrentThreadId() && !gl_info->supported[ARB_SYNC])
+ {
+ /* A glFinish does not reliably wait for draws in other contexts. The caller has
+ * to find its own way to cope with the thread switch
+ */
+ WARN("Event query finished from wrong thread\n");
+ return WINED3D_EVENT_QUERY_WRONG_THREAD;
+ }
+
+ context = context_acquire(device, query->context->current_rt);
+
+ ENTER_GL();
+ if (gl_info->supported[ARB_SYNC])
+ {
+ GLenum gl_ret = GL_EXTCALL(glClientWaitSync(query->object.sync, 0, ~(GLuint64)0));
+ checkGLcall("glClientWaitSync");
+
+ switch (gl_ret)
+ {
+ case GL_ALREADY_SIGNALED:
+ case GL_CONDITION_SATISFIED:
+ ret = WINED3D_EVENT_QUERY_OK;
+ break;
+
+ /* We don't expect a timeout for a ~584 year wait */
+ default:
+ ERR("glClientWaitSync returned %#x.\n", gl_ret);
+ ret = WINED3D_EVENT_QUERY_ERROR;
+ }
+ }
+ else if (context->gl_info->supported[APPLE_FENCE])
+ {
+ GL_EXTCALL(glFinishFenceAPPLE(query->object.id));
+ checkGLcall("glFinishFenceAPPLE");
+ ret = WINED3D_EVENT_QUERY_OK;
+ }
+ else if (context->gl_info->supported[NV_FENCE])
+ {
+ GL_EXTCALL(glFinishFenceNV(query->object.id));
+ checkGLcall("glFinishFenceNV");
+ ret = WINED3D_EVENT_QUERY_OK;
+ }
+ else
+ {
+ ERR("Event query created without GL support\n");
+ ret = WINED3D_EVENT_QUERY_ERROR;
+ }
+ LEAVE_GL();
+
+ context_release(context);
+ return ret;
+}
+
+void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device)
{
const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
@@ -135,17 +189,17 @@ static void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3
if (!query->context->gl_info->supported[ARB_SYNC] && query->context->tid != GetCurrentThreadId())
{
context_free_event_query(query);
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
context_alloc_event_query(context, query);
}
else
{
- context = context_acquire(device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, query->context->current_rt);
}
}
else
{
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
context_alloc_event_query(context, query);
}
@@ -293,7 +347,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_GetData(IWineD3DQuery* iface,
return S_OK;
}
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, query->context->current_rt);
ENTER_GL();
@@ -430,12 +484,12 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
FIXME("Wrong thread, can't restart query.\n");
context_free_occlusion_query(query);
- context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, NULL);
context_alloc_occlusion_query(context, query);
}
else
{
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, query->context->current_rt);
ENTER_GL();
GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
@@ -446,7 +500,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
else
{
if (query->context) context_free_occlusion_query(query);
- context = context_acquire(This->device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, NULL);
context_alloc_occlusion_query(context, query);
}
@@ -470,7 +524,7 @@ static HRESULT WINAPI IWineD3DOcclusionQueryImpl_Issue(IWineD3DQuery* iface, D
}
else
{
- context = context_acquire(This->device, query->context->current_rt, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, query->context->current_rt);
ENTER_GL();
GL_EXTCALL(glEndQueryARB(GL_SAMPLES_PASSED_ARB));
@@ -525,7 +579,6 @@ HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
WINED3DQUERYTYPE type, IUnknown *parent)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- HRESULT hr;
switch (type)
{
@@ -548,9 +601,7 @@ HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
case WINED3DQUERYTYPE_EVENT:
TRACE("Event query.\n");
- query->lpVtbl = &IWineD3DEventQuery_Vtbl;
- hr = wined3d_event_query_init(gl_info, (struct wined3d_event_query **) &query->extendedData);
- if (hr == E_NOTIMPL)
+ if (!wined3d_event_query_supported(gl_info))
{
/* Half-Life 2 needs this query. It does not render the main
* menu correctly otherwise. Pretend to support it, faking
@@ -558,9 +609,12 @@ HRESULT query_init(IWineD3DQueryImpl *query, IWineD3DDeviceImpl *device,
* lowering performance. */
FIXME("Event query: Unimplemented, but pretending to be supported.\n");
}
- else if(FAILED(hr))
+ query->lpVtbl = &IWineD3DEventQuery_Vtbl;
+ query->extendedData = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct wined3d_event_query));
+ if (!query->extendedData)
{
- return hr;
+ ERR("Failed to allocate event query memory.\n");
+ return E_OUTOFMEMORY;
}
break;
diff --git a/dll/directx/wine/wined3d/resource.c b/dll/directx/wine/wined3d/resource.c
index b867586096d..67622a38942 100644
--- a/dll/directx/wine/wined3d/resource.c
+++ b/dll/directx/wine/wined3d/resource.c
@@ -28,7 +28,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
+ IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format_desc *format_desc,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
struct IWineD3DResourceClass *resource = &((IWineD3DResourceImpl *)iface)->resource;
@@ -247,11 +247,3 @@ HRESULT resource_get_parent(IWineD3DResource *iface, IUnknown **pParent)
*pParent = This->resource.parent;
return WINED3D_OK;
}
-
-void dumpResources(struct list *list) {
- IWineD3DResourceImpl *resource;
-
- LIST_FOR_EACH_ENTRY(resource, list, IWineD3DResourceImpl, resource.resource_list_entry) {
- FIXME("Leftover resource %p with type %d,%s\n", resource, IWineD3DResource_GetType((IWineD3DResource *) resource), debug_d3dresourcetype(IWineD3DResource_GetType((IWineD3DResource *) resource)));
- }
-}
diff --git a/dll/directx/wine/wined3d/shader.c b/dll/directx/wine/wined3d/shader.c
index 307cadf804c..f26122af869 100644
--- a/dll/directx/wine/wined3d/shader.c
+++ b/dll/directx/wine/wined3d/shader.c
@@ -721,6 +721,7 @@ static HRESULT shader_get_registers_used(IWineD3DBaseShader *iface, const struct
else if (ins.handler_idx == WINED3DSIH_MOVA) reg_maps->usesmova = 1;
else if (ins.handler_idx == WINED3DSIH_IFC) reg_maps->usesifc = 1;
else if (ins.handler_idx == WINED3DSIH_CALL) reg_maps->usescall = 1;
+ else if (ins.handler_idx == WINED3DSIH_RCP) reg_maps->usesrcp = 1;
limit = ins.src_count + (ins.predicate ? 1 : 0);
for (i = 0; i < limit; ++i)
@@ -1150,7 +1151,11 @@ void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffe
if (ins.dst_count) fe->shader_read_dst_param(fe_data, &ptr, &dst_param, &dst_rel_addr);
/* Predication token */
- if (ins.predicate) ins.predicate = *ptr++;
+ if (ins.predicate)
+ {
+ FIXME("Predicates not implemented.\n");
+ ins.predicate = *ptr++;
+ }
/* Other source tokens */
for (i = 0; i < ins.src_count; ++i)
@@ -1399,7 +1404,7 @@ static void shader_cleanup(IWineD3DBaseShader *iface)
static void shader_none_handle_instruction(const struct wined3d_shader_instruction *ins) {}
static void shader_none_select(const struct wined3d_context *context, BOOL usePS, BOOL useVS) {}
-static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type) {}
+static void shader_none_select_depth_blt(IWineD3DDevice *iface, enum tex_types tex_type, const SIZE *ds_mask_size) {}
static void shader_none_deselect_depth_blt(IWineD3DDevice *iface) {}
static void shader_none_update_float_vertex_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
static void shader_none_update_float_pixel_constants(IWineD3DDevice *iface, UINT start, UINT count) {}
@@ -1414,8 +1419,11 @@ static void shader_none_get_caps(const struct wined3d_gl_info *gl_info, struct s
{
/* Set the shader caps to 0 for the none shader backend */
caps->VertexShaderVersion = 0;
+ caps->MaxVertexShaderConst = 0;
caps->PixelShaderVersion = 0;
caps->PixelShader1xMaxValue = 0.0f;
+ caps->MaxPixelShaderConst = 0;
+ caps->VSClipping = FALSE;
}
static BOOL shader_none_color_fixup_supported(struct color_fixup_desc fixup)
@@ -2017,6 +2025,9 @@ void find_ps_compile_args(IWineD3DPixelShaderImpl *shader,
}
args->color_fixup[i] = texture->resource.format_desc->color_fixup;
+ if (texture->resource.format_desc->Flags & WINED3DFMT_FLAG_SHADOW)
+ args->shadow |= 1 << i;
+
/* Flag samplers that need NP2 texcoord fixup. */
if (!texture->baseTexture.pow2Matrix_identity)
{
diff --git a/dll/directx/wine/wined3d/state.c b/dll/directx/wine/wined3d/state.c
index 5efe069bb19..4c6d5bfe025 100644
--- a/dll/directx/wine/wined3d/state.c
+++ b/dll/directx/wine/wined3d/state.c
@@ -35,31 +35,20 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
-#define GLINFO_LOCATION (*context->gl_info)
-
/* GL locking for state handlers is done by the caller. */
static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context);
-static void state_nogl(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
-{
- /* Used for states which are not mapped to a gl state as-is, but used somehow different,
- * e.g as a parameter for drawing, or which are unimplemented in windows d3d
- */
- if(STATE_IS_RENDER(state)) {
- WINED3DRENDERSTATETYPE RenderState = state - STATE_RENDER(0);
- TRACE("(%s,%d) no direct mapping to gl\n", debug_d3drenderstate(RenderState), stateblock->renderState[RenderState]);
- } else {
- /* Shouldn't have an unknown type here */
- FIXME("%d no direct mapping to gl of state with unknown type\n", state);
- }
-}
-
static void state_undefined(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
ERR("Undefined state.\n");
}
+static void state_nop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ TRACE("%s: nop in current pipe config.\n", debug_d3dstate(state));
+}
+
static void state_fillmode(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
WINED3DFILLMODE Value = stateblock->renderState[WINED3DRS_FILLMODE];
@@ -108,7 +97,7 @@ static void state_lighting(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
static void state_zenable(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
/* No z test without depth stencil buffers */
- if (!stateblock->device->stencilBufferTarget)
+ if (!stateblock->device->depth_stencil)
{
TRACE("No Z buffer - disabling depth test\n");
glDisable(GL_DEPTH_TEST); /* This also disables z writing in gl */
@@ -242,7 +231,8 @@ static void state_ambient(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)stateblock->device->render_targets[0];
+ IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
int srcBlend = GL_ZERO;
int dstBlend = GL_ZERO;
@@ -450,10 +440,7 @@ static void state_blend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
/* colorkey fixup for stage 0 alphaop depends on WINED3DRS_ALPHABLENDENABLE state,
so it may need updating */
if (stateblock->renderState[WINED3DRS_COLORKEYENABLE])
- {
- const struct StateEntry *StateTable = stateblock->device->StateTable;
- StateTable[STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP)].apply(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
- }
+ stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
}
static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -463,6 +450,7 @@ static void state_blendfactor_w(DWORD state, IWineD3DStateBlockImpl *stateblock,
static void state_blendfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
float col[4];
TRACE("Setting BlendFactor to %d\n", stateblock->renderState[WINED3DRS_BLENDFACTOR]);
@@ -491,9 +479,8 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DSurfaceImpl *surf;
-
- surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *)stateblock->textures[0])->surfaces[0];
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT)
{
@@ -506,10 +493,7 @@ static void state_alpha(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
}
if (enable_ckey || context->last_was_ckey)
- {
- const struct StateEntry *StateTable = stateblock->device->StateTable;
- StateTable[STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP)].apply(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
- }
+ stateblock_apply_state(STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), stateblock, context);
context->last_was_ckey = enable_ckey;
if (stateblock->renderState[WINED3DRS_ALPHATESTENABLE] ||
@@ -621,12 +605,13 @@ static void state_blendop_w(DWORD state, IWineD3DStateBlockImpl *stateblock, str
static void state_blendop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
int blendEquation = GL_FUNC_ADD;
int blendEquationAlpha = GL_FUNC_ADD;
/* BLENDOPALPHA requires GL_EXT_blend_equation_separate, so make sure it is around */
if (stateblock->renderState[WINED3DRS_BLENDOPALPHA]
- && !context->gl_info->supported[EXT_BLEND_EQUATION_SEPARATE])
+ && !gl_info->supported[EXT_BLEND_EQUATION_SEPARATE])
{
WARN("Unsupported in local OpenGL implementation: glBlendEquationSeparateEXT\n");
return;
@@ -779,6 +764,7 @@ static void state_specularenable(DWORD state, IWineD3DStateBlockImpl *stateblock
static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
unsigned int i;
/* Note the texture color applies to all textures whereas
@@ -788,7 +774,7 @@ static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, str
D3DCOLORTOGLFLOAT4(stateblock->renderState[WINED3DRS_TEXTUREFACTOR], col);
/* And now the default texture color as well */
- for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
+ for (i = 0; i < gl_info->limits.texture_stages; ++i)
{
/* Note the WINED3DRS value applies to all textures, but GL has one
* per texture, so apply it now ready to be used!
@@ -804,6 +790,8 @@ static void state_texfactor(DWORD state, IWineD3DStateBlockImpl *stateblock, str
static void renderstate_stencil_twosided(struct wined3d_context *context, GLint face,
GLint func, GLint ref, GLuint mask, GLint stencilFail, GLint depthFail, GLint stencilPass)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);
checkGLcall("glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT)");
GL_EXTCALL(glActiveStencilFaceEXT(face));
@@ -831,7 +819,7 @@ static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
GLint stencilPass_ccw = GL_KEEP;
/* No stencil test without a stencil buffer. */
- if (!stateblock->device->stencilBufferTarget)
+ if (!stateblock->device->depth_stencil)
{
glDisable(GL_STENCIL_TEST);
checkGLcall("glDisable GL_STENCIL_TEST");
@@ -914,7 +902,8 @@ static void state_stencil(DWORD state, IWineD3DStateBlockImpl *stateblock, struc
static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- DWORD mask = stateblock->device->stencilBufferTarget ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
+ DWORD mask = stateblock->device->depth_stencil ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
+ const struct wined3d_gl_info *gl_info = context->gl_info;
GL_EXTCALL(glActiveStencilFaceEXT(GL_BACK));
checkGLcall("glActiveStencilFaceEXT(GL_BACK)");
@@ -927,7 +916,7 @@ static void state_stencilwrite2s(DWORD state, IWineD3DStateBlockImpl *stateblock
static void state_stencilwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- DWORD mask = stateblock->device->stencilBufferTarget ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
+ DWORD mask = stateblock->device->depth_stencil ? stateblock->renderState[WINED3DRS_STENCILWRITEMASK] : 0;
glStencilMask(mask);
checkGLcall("glStencilMask");
@@ -1402,7 +1391,9 @@ static void state_psizemin_w(DWORD state, IWineD3DStateBlockImpl *stateblock, st
static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- union {
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ union
+ {
DWORD d;
float f;
} min, max;
@@ -1423,7 +1414,9 @@ static void state_psizemin_ext(DWORD state, IWineD3DStateBlockImpl *stateblock,
static void state_psizemin_arb(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- union {
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ union
+ {
DWORD d;
float f;
} min, max;
@@ -1525,30 +1518,60 @@ static void state_debug_monitor(DWORD state, IWineD3DStateBlockImpl *stateblock,
static void state_colorwrite(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- DWORD Value = stateblock->renderState[WINED3DRS_COLORWRITEENABLE];
+ DWORD mask0 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE];
+ DWORD mask1 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE1];
+ DWORD mask2 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE2];
+ DWORD mask3 = stateblock->renderState[WINED3DRS_COLORWRITEENABLE3];
TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n",
- Value & WINED3DCOLORWRITEENABLE_RED ? 1 : 0,
- Value & WINED3DCOLORWRITEENABLE_GREEN ? 1 : 0,
- Value & WINED3DCOLORWRITEENABLE_BLUE ? 1 : 0,
- Value & WINED3DCOLORWRITEENABLE_ALPHA ? 1 : 0);
- glColorMask(Value & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
- Value & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
- Value & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
- Value & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
+ mask0 & WINED3DCOLORWRITEENABLE_RED ? 1 : 0,
+ mask0 & WINED3DCOLORWRITEENABLE_GREEN ? 1 : 0,
+ mask0 & WINED3DCOLORWRITEENABLE_BLUE ? 1 : 0,
+ mask0 & WINED3DCOLORWRITEENABLE_ALPHA ? 1 : 0);
+ glColorMask(mask0 & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
+ mask0 & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
+ mask0 & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
+ mask0 & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE);
checkGLcall("glColorMask(...)");
- /* depends on WINED3DRS_COLORWRITEENABLE. */
- if(stateblock->renderState[WINED3DRS_COLORWRITEENABLE1] != 0x0000000F ||
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE2] != 0x0000000F ||
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE3] != 0x0000000F ) {
- ERR("(WINED3DRS_COLORWRITEENABLE1/2/3,%d,%d,%d) not yet implemented. Missing of cap D3DPMISCCAPS_INDEPENDENTWRITEMASKS wasn't honored?\n",
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE1],
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE2],
- stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]);
+ if (!((mask1 == mask0 && mask2 == mask0 && mask3 == mask0)
+ || (mask1 == 0xf && mask2 == 0xf && mask3 == 0xf)))
+ {
+ FIXME("WINED3DRS_COLORWRITEENABLE/1/2/3, %#x/%#x/%#x/%#x not yet implemented.\n",
+ mask0, mask1, mask2, mask3);
+ FIXME("Missing of cap D3DPMISCCAPS_INDEPENDENTWRITEMASKS wasn't honored?\n");
}
}
+static void set_color_mask(const struct wined3d_gl_info *gl_info, UINT index, DWORD mask)
+{
+ GL_EXTCALL(glColorMaskIndexedEXT(index,
+ mask & WINED3DCOLORWRITEENABLE_RED ? GL_TRUE : GL_FALSE,
+ mask & WINED3DCOLORWRITEENABLE_GREEN ? GL_TRUE : GL_FALSE,
+ mask & WINED3DCOLORWRITEENABLE_BLUE ? GL_TRUE : GL_FALSE,
+ mask & WINED3DCOLORWRITEENABLE_ALPHA ? GL_TRUE : GL_FALSE));
+}
+
+static void state_colorwrite0(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 0, stateblock->renderState[WINED3DRS_COLORWRITEENABLE]);
+}
+
+static void state_colorwrite1(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 1, stateblock->renderState[WINED3DRS_COLORWRITEENABLE1]);
+}
+
+static void state_colorwrite2(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 2, stateblock->renderState[WINED3DRS_COLORWRITEENABLE2]);
+}
+
+static void state_colorwrite3(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ set_color_mask(context->gl_info, 3, stateblock->renderState[WINED3DRS_COLORWRITEENABLE3]);
+}
+
static void state_localviewer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
if(stateblock->renderState[WINED3DRS_LOCALVIEWER]) {
@@ -1706,6 +1729,12 @@ static void state_depthbias(DWORD state, IWineD3DStateBlockImpl *stateblock, str
}
}
+static void state_zvisible(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+{
+ if (stateblock->renderState[WINED3DRS_ZVISIBLE])
+ FIXME("WINED3DRS_ZVISIBLE not implemented.\n");
+}
+
static void state_perspective(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
if (stateblock->renderState[WINED3DRS_TEXTUREPERSPECTIVE]) {
@@ -1843,13 +1872,6 @@ static void state_stippleenable(DWORD state, IWineD3DStateBlockImpl *stateblock,
}
}
-static void state_bordercolor(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
-{
- if(stateblock->renderState[WINED3DRS_BORDERCOLOR]) {
- FIXME("Render state WINED3DRS_BORDERCOLOR not implemented yet\n");
- }
-}
-
static void state_mipmaplodbias(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
if(stateblock->renderState[WINED3DRS_MIPMAPLODBIAS]) {
@@ -3083,9 +3105,8 @@ void tex_alphaop(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DSurfaceImpl *surf;
-
- surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *) stateblock->textures[0])->surfaces[0];
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format_desc->alpha_mask)
{
@@ -3157,6 +3178,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
{
DWORD texUnit = (state - STATE_TEXTURESTAGE(0, 0)) / (WINED3D_HIGHEST_TEXTURE_STATE + 1);
DWORD mapped_stage = stateblock->device->texUnitMap[texUnit];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
BOOL generated;
int coordIdx;
@@ -3168,7 +3190,7 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
}
if (mapped_stage == WINED3D_UNMAPPED_STAGE) return;
- if (mapped_stage >= context->gl_info->limits.textures) return;
+ if (mapped_stage >= gl_info->limits.textures) return;
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB + mapped_stage));
checkGLcall("glActiveTextureARB");
@@ -3197,21 +3219,20 @@ static void transform_texture(DWORD state, IWineD3DStateBlockImpl *stateblock, s
}
}
-static void unloadTexCoords(const struct wined3d_context *context)
+static void unloadTexCoords(const struct wined3d_gl_info *gl_info)
{
unsigned int texture_idx;
- for (texture_idx = 0; texture_idx < context->gl_info->limits.texture_stages; ++texture_idx)
+ for (texture_idx = 0; texture_idx < gl_info->limits.texture_stages; ++texture_idx)
{
GL_EXTCALL(glClientActiveTextureARB(GL_TEXTURE0_ARB + texture_idx));
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}
}
-static void loadTexCoords(const struct wined3d_context *context, IWineD3DStateBlockImpl *stateblock,
+static void loadTexCoords(const struct wined3d_gl_info *gl_info, IWineD3DStateBlockImpl *stateblock,
const struct wined3d_stream_info *si, GLuint *curVBO)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
const UINT *offset = stateblock->streamOffset;
unsigned int mapped_stage = 0;
unsigned int textureNo = 0;
@@ -3431,8 +3452,8 @@ static void tex_coordindex(DWORD state, IWineD3DStateBlockImpl *stateblock, stru
*/
GLuint curVBO = gl_info->supported[ARB_VERTEX_BUFFER_OBJECT] ? ~0U : 0;
- unloadTexCoords(context);
- loadTexCoords(context, stateblock, &stateblock->device->strided_streams, &curVBO);
+ unloadTexCoords(gl_info);
+ loadTexCoords(gl_info, stateblock, &stateblock->device->strided_streams, &curVBO);
}
}
@@ -3603,10 +3624,8 @@ void apply_pixelshader(DWORD state, IWineD3DStateBlockImpl *stateblock, struct w
* while it was enabled, so re-apply them. */
for (i = 0; i < context->gl_info->limits.texture_stages; ++i)
{
- if(!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP))) {
- device->StateTable[STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)].apply
- (STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
- }
+ if (!isStateDirty(context, STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP)))
+ stateblock_apply_state(STATE_TEXTURESTAGE(i, WINED3DTSS_COLOROP), stateblock, context);
}
context->last_was_pshader = FALSE;
}
@@ -3750,27 +3769,20 @@ static void transform_worldex(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void state_vertexblend_w(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- static BOOL once = FALSE;
+ WINED3DVERTEXBLENDFLAGS f = stateblock->renderState[WINED3DRS_VERTEXBLEND];
+ static unsigned int once;
- switch(stateblock->renderState[WINED3DRS_VERTEXBLEND]) {
- case WINED3DVBF_1WEIGHTS:
- case WINED3DVBF_2WEIGHTS:
- case WINED3DVBF_3WEIGHTS:
- if(!once) {
- once = TRUE;
- /* TODO: Implement vertex blending in drawStridedSlow */
- FIXME("Vertex blending enabled, but not supported by hardware\n");
- }
- break;
+ if (f == WINED3DVBF_DISABLE) return;
- case WINED3DVBF_TWEENING:
- WARN("Tweening not supported yet\n");
- }
+ if (!once++) FIXME("Vertex blend flags %#x not supported.\n", f);
+ else WARN("Vertex blend flags %#x not supported.\n", f);
}
static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
WINED3DVERTEXBLENDFLAGS val = stateblock->renderState[WINED3DRS_VERTEXBLEND];
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+ static unsigned int once;
switch(val) {
case WINED3DVBF_1WEIGHTS:
@@ -3787,7 +3799,7 @@ static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, s
if (!stateblock->device->vertexBlendUsed)
{
unsigned int i;
- for (i = 1; i < context->gl_info->limits.blends; ++i)
+ for (i = 1; i < gl_info->limits.blends; ++i)
{
if (!isStateDirty(context, STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(i))))
{
@@ -3798,19 +3810,15 @@ static void state_vertexblend(DWORD state, IWineD3DStateBlockImpl *stateblock, s
}
break;
+ case WINED3DVBF_TWEENING:
+ case WINED3DVBF_0WEIGHTS: /* Indexed vertex blending, not supported. */
+ if (!once++) FIXME("Vertex blend flags %#x not supported.\n", val);
+ else WARN("Vertex blend flags %#x not supported.\n", val);
+ /* Fall through. */
case WINED3DVBF_DISABLE:
- case WINED3DVBF_0WEIGHTS: /* for Indexed vertex blending - not supported */
glDisable(GL_VERTEX_BLEND_ARB);
checkGLcall("glDisable(GL_VERTEX_BLEND_ARB)");
break;
-
- case WINED3DVBF_TWEENING:
- /* Just set the vertex weight for weight 0, enable vertex blending and hope the app doesn't have
- * vertex weights in the vertices?
- * For now we don't report that as supported, so a warn should suffice
- */
- WARN("Tweening not supported yet\n");
- break;
}
}
@@ -3975,10 +3983,8 @@ static void transform_projection(DWORD state, IWineD3DStateBlockImpl *stateblock
/* This should match any arrays loaded in loadVertexData.
* TODO: Only load / unload arrays if we have to.
*/
-static inline void unloadVertexData(const struct wined3d_context *context)
+static inline void unloadVertexData(const struct wined3d_gl_info *gl_info)
{
- const struct wined3d_gl_info *gl_info = context->gl_info;
-
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
@@ -3990,11 +3996,13 @@ static inline void unloadVertexData(const struct wined3d_context *context)
{
glDisableClientState(GL_WEIGHT_ARRAY_ARB);
}
- unloadTexCoords(context);
+ unloadTexCoords(gl_info);
}
-static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context, int i)
+static inline void unload_numbered_array(struct wined3d_context *context, int i)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
GL_EXTCALL(glDisableVertexAttribArrayARB(i));
checkGLcall("glDisableVertexAttribArrayARB(reg)");
@@ -4004,7 +4012,7 @@ static inline void unload_numbered_array(IWineD3DStateBlockImpl *stateblock, str
/* This should match any arrays loaded in loadNumberedArrays
* TODO: Only load / unload arrays if we have to.
*/
-static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
+static inline void unloadNumberedArrays(struct wined3d_context *context)
{
/* disable any attribs (this is the same for both GLSL and ARB modes) */
GLint maxAttribs = 16;
@@ -4016,7 +4024,7 @@ static inline void unloadNumberedArrays(IWineD3DStateBlockImpl *stateblock, stru
if (glGetError() != GL_NO_ERROR)
maxAttribs = 16;
for (i = 0; i < maxAttribs; ++i) {
- unload_numbered_array(stateblock, context, i);
+ unload_numbered_array(context, i);
}
}
@@ -4036,14 +4044,14 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
for (i = 0; i < MAX_ATTRIBS; i++) {
if (!(stream_info->use_map & (1 << i)))
{
- if (context->numbered_array_mask & (1 << i)) unload_numbered_array(stateblock, context, i);
+ if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
continue;
}
/* Do not load instance data. It will be specified using glTexCoord by drawprim */
if (stateblock->streamFlags[stream_info->elements[i].stream_idx] & WINED3DSTREAMSOURCE_INSTANCEDATA)
{
- if (context->numbered_array_mask & (1 << i)) unload_numbered_array(stateblock, context, i);
+ if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
stateblock->device->instancedDraw = TRUE;
continue;
}
@@ -4102,10 +4110,10 @@ static inline void loadNumberedArrays(IWineD3DStateBlockImpl *stateblock,
if (stream_info->elements[i].buffer_object)
{
vb = (struct wined3d_buffer *)stateblock->streamSource[stream_info->elements[i].stream_idx];
- ptr += (long) buffer_get_sysmem(vb);
+ ptr += (ULONG_PTR)buffer_get_sysmem(vb, gl_info);
}
- if (context->numbered_array_mask & (1 << i)) unload_numbered_array(stateblock, context, i);
+ if (context->numbered_array_mask & (1 << i)) unload_numbered_array(context, i);
switch (stream_info->elements[i].format_desc->format)
{
@@ -4225,11 +4233,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
GL_EXTCALL(glVertexBlendARB(e->format_desc->component_count + 1));
- VTRACE(("glWeightPointerARB(%d, GL_FLOAT, %d, %p)\n",
- WINED3D_ATR_FORMAT(sd->u.s.blendWeights.dwType) ,
- sd->u.s.blendWeights.dwStride,
- sd->u.s.blendWeights.lpData + stateblock->loadBaseVertexIndex * sd->u.s.blendWeights.dwStride + offset[sd->u.s.blendWeights.streamNo]));
-
if (curVBO != e->buffer_object)
{
GL_EXTCALL(glBindBufferARB(GL_ARRAY_BUFFER_ARB, e->buffer_object));
@@ -4237,8 +4240,13 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
curVBO = e->buffer_object;
}
- GL_EXTCALL(glWeightPointerARB)(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
- e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glWeightPointerARB(%#x, %#x, %#x, %p);\n",
+ e->format_desc->gl_vtx_format,
+ e->format_desc->gl_vtx_type,
+ e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glWeightPointerARB(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glWeightPointerARB");
@@ -4279,8 +4287,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
/* Vertex Pointers -----------------------------------------*/
if (si->use_map & (1 << WINED3D_FFP_POSITION))
{
- VTRACE(("glVertexPointer(%d, GL_FLOAT, %d, %p)\n", e->stride, e->size, e->data));
-
e = &si->elements[WINED3D_FFP_POSITION];
if (curVBO != e->buffer_object)
{
@@ -4299,9 +4305,16 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
*/
if (!e->buffer_object)
{
+ TRACE("glVertexPointer(3, %#x, %#x, %p);\n", e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glVertexPointer(3 /* min(e->format_desc->gl_vtx_format, 3) */, e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
- } else {
+ }
+ else
+ {
+ TRACE("glVertexPointer(%#x, %#x, %#x, %p);\n",
+ e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glVertexPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
}
@@ -4313,8 +4326,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
/* Normals -------------------------------------------------*/
if (si->use_map & (1 << WINED3D_FFP_NORMAL))
{
- VTRACE(("glNormalPointer(GL_FLOAT, %d, %p)\n", e->stride, e->data));
-
e = &si->elements[WINED3D_FFP_NORMAL];
if (curVBO != e->buffer_object)
{
@@ -4322,6 +4333,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
checkGLcall("glBindBufferARB");
curVBO = e->buffer_object;
}
+
+ TRACE("glNormalPointer(%#x, %#x, %p);\n", e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glNormalPointer(e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
checkGLcall("glNormalPointer(...)");
@@ -4344,8 +4358,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
if (si->use_map & (1 << WINED3D_FFP_DIFFUSE))
{
- VTRACE(("glColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n", e->stride, e->data));
-
e = &si->elements[WINED3D_FFP_DIFFUSE];
if (curVBO != e->buffer_object)
{
@@ -4354,6 +4366,9 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
curVBO = e->buffer_object;
}
+ TRACE("glColorPointer(%#x, %#x %#x, %p);\n",
+ e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
glColorPointer(e->format_desc->gl_vtx_format, e->format_desc->gl_vtx_type, e->stride,
e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
checkGLcall("glColorPointer(4, GL_UNSIGNED_BYTE, ...)");
@@ -4369,7 +4384,6 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
if (si->use_map & (1 << WINED3D_FFP_SPECULAR))
{
TRACE("setting specular colour\n");
- VTRACE(("glSecondaryColorPointer(4, GL_UNSIGNED_BYTE, %d, %p)\n", e->stride, e->data));
e = &si->elements[WINED3D_FFP_SPECULAR];
if (gl_info->supported[EXT_SECONDARY_COLOR])
@@ -4391,8 +4405,10 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
* vertex pipeline can pass the specular alpha through, and pixel shaders can read it. So it GL accepts
* 4 component secondary colors use it
*/
- GL_EXTCALL(glSecondaryColorPointerEXT)(format, type,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glSecondaryColorPointer(%#x, %#x, %#x, %p);\n", format, type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glSecondaryColorPointerEXT(format, type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glSecondaryColorPointerEXT(format, type, ...)");
}
else
@@ -4400,25 +4416,29 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
switch(type)
{
case GL_UNSIGNED_BYTE:
- GL_EXTCALL(glSecondaryColorPointerEXT)(3, GL_UNSIGNED_BYTE,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glSecondaryColorPointer(3, GL_UNSIGNED_BYTE, %#x, %p);\n", e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glSecondaryColorPointerEXT(3, GL_UNSIGNED_BYTE, ...)");
break;
default:
FIXME("Add 4 component specular color pointers for type %x\n", type);
/* Make sure that the right color component is dropped */
- GL_EXTCALL(glSecondaryColorPointerEXT)(3, type,
- e->stride, e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ TRACE("glSecondaryColorPointer(3, %#x, %#x, %p);\n", type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]);
+ GL_EXTCALL(glSecondaryColorPointerEXT(3, type, e->stride,
+ e->data + stateblock->loadBaseVertexIndex * e->stride + offset[e->stream_idx]));
checkGLcall("glSecondaryColorPointerEXT(3, type, ...)");
}
}
glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
- } else {
-
- /* Missing specular color is not critical, no warnings */
- VTRACE(("Specular colour is not supported in this GL implementation\n"));
+ }
+ else
+ {
+ WARN("Specular colour is not supported in this GL implementation.\n");
}
}
else
@@ -4427,15 +4447,15 @@ static void loadVertexData(const struct wined3d_context *context, IWineD3DStateB
{
GL_EXTCALL(glSecondaryColor3fEXT)(0, 0, 0);
checkGLcall("glSecondaryColor3fEXT(0, 0, 0)");
- } else {
-
- /* Missing specular color is not critical, no warnings */
- VTRACE(("Specular colour is not supported in this GL implementation\n"));
+ }
+ else
+ {
+ WARN("Specular colour is not supported in this GL implementation.\n");
}
}
/* Texture coords -------------------------------------------*/
- loadTexCoords(context, stateblock, si, &curVBO);
+ loadTexCoords(gl_info, stateblock, si, &curVBO);
}
static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -4446,13 +4466,13 @@ static void streamsrc(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
if (context->numberedArraysLoaded && !load_numbered)
{
- unloadNumberedArrays(stateblock, context);
+ unloadNumberedArrays(context);
context->numberedArraysLoaded = FALSE;
context->numbered_array_mask = 0;
}
else if (context->namedArraysLoaded)
{
- unloadVertexData(context);
+ unloadVertexData(context->gl_info);
context->namedArraysLoaded = FALSE;
}
@@ -4618,9 +4638,8 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s
context->last_was_vshader = useVertexShaderFunction;
- if(updateFog) {
- device->StateTable[STATE_RENDER(WINED3DRS_FOGVERTEXMODE)].apply(STATE_RENDER(WINED3DRS_FOGVERTEXMODE), stateblock, context);
- }
+ if (updateFog) stateblock_apply_state(STATE_RENDER(WINED3DRS_FOGVERTEXMODE), stateblock, context);
+
if(!useVertexShaderFunction) {
int i;
for(i = 0; i < MAX_TEXTURES; i++) {
@@ -4633,7 +4652,7 @@ static void vertexdeclaration(DWORD state, IWineD3DStateBlockImpl *stateblock, s
static void viewport_miscpart(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)stateblock->device->render_targets[0];
+ IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0];
UINT width, height;
WINED3DVIEWPORT vp = stateblock->viewport;
@@ -4671,6 +4690,8 @@ static void viewport_vertexpart(DWORD state, IWineD3DStateBlockImpl *stateblock,
if(!isStateDirty(context, STATE_RENDER(WINED3DRS_POINTSCALEENABLE))) {
state_pscale(STATE_RENDER(WINED3DRS_POINTSCALEENABLE), stateblock, context);
}
+ if (!isStateDirty(context, STATE_VERTEXSHADERCONSTANT))
+ shaderconstant(STATE_VERTEXSHADERCONSTANT, stateblock, context);
}
static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
@@ -4789,7 +4810,7 @@ static void light(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3
static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
- IWineD3DSurfaceImpl *target = (IWineD3DSurfaceImpl *)stateblock->device->render_targets[0];
+ IWineD3DSurfaceImpl *target = stateblock->device->render_targets[0];
RECT *pRect = &stateblock->scissorRect;
UINT height;
UINT width;
@@ -4812,6 +4833,8 @@ static void scissorrect(DWORD state, IWineD3DStateBlockImpl *stateblock, struct
static void indexbuffer(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wined3d_context *context)
{
+ const struct wined3d_gl_info *gl_info = context->gl_info;
+
if(stateblock->streamIsUP || stateblock->pIndexData == NULL ) {
GL_EXTCALL(glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0));
} else {
@@ -4833,17 +4856,17 @@ static void frontface(DWORD state, IWineD3DStateBlockImpl *stateblock, struct wi
}
const struct StateEntryTemplate misc_state_template[] = {
- { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRCBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLEND), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_EDGEANTIALIAS), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), state_blend }, WINED3D_GL_EXT_NONE },
- { STATE_STREAMSRC, { STATE_VDECL, streamsrc }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_EDGEANTIALIAS), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ANTIALIASEDLINEENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SEPARATEALPHABLENDENABLE), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRCBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DESTBLENDALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_BLENDOPALPHA), { STATE_RENDER(WINED3DRS_ALPHABLENDENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_STREAMSRC, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_VDECL, { STATE_VDECL, streamsrc }, WINED3D_GL_EXT_NONE },
{ STATE_FRONTFACE, { STATE_FRONTFACE, frontface }, WINED3D_GL_EXT_NONE },
{ STATE_SCISSORRECT, { STATE_SCISSORRECT, scissorrect }, WINED3D_GL_EXT_NONE },
@@ -4851,58 +4874,59 @@ const struct StateEntryTemplate misc_state_template[] = {
* vshader loadings are untied from each other
*/
{ STATE_VERTEXSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, WINED3D_GL_EXT_NONE },
- { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, shaderconstant }, WINED3D_GL_EXT_NONE },
+ { STATE_PIXELSHADERCONSTANT, { STATE_VERTEXSHADERCONSTANT, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), shader_bumpenvmat }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT01), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT10), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT11), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVMAT00), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(0, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(1, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(2, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(3, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(4, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(5, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(6, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), tex_bumpenvlscale }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLOFFSET), { STATE_TEXTURESTAGE(7, WINED3DTSS_BUMPENVLSCALE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_VIEWPORT, { STATE_VIEWPORT, viewport_miscpart }, WINED3D_GL_EXT_NONE },
{ STATE_INDEXBUFFER, { STATE_INDEXBUFFER, indexbuffer }, ARB_VERTEX_BUFFER_OBJECT },
+ { STATE_INDEXBUFFER, { STATE_INDEXBUFFER, state_nop }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ANTIALIAS), { STATE_RENDER(WINED3DRS_ANTIALIAS), state_antialias }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), { STATE_RENDER(WINED3DRS_TEXTUREPERSPECTIVE), state_perspective }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ZENABLE), { STATE_RENDER(WINED3DRS_ZENABLE), state_zenable }, WINED3D_GL_EXT_NONE },
@@ -4916,9 +4940,9 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_PLANEMASK), { STATE_RENDER(WINED3DRS_PLANEMASK), state_planemask }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ZWRITEENABLE), { STATE_RENDER(WINED3DRS_ZWRITEENABLE), state_zwritenable }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ALPHATESTENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ALPHAREF), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), state_alpha }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ALPHAREF), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ALPHAFUNC), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORKEYENABLE), { STATE_RENDER(WINED3DRS_ALPHATESTENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_LASTPIXEL), { STATE_RENDER(WINED3DRS_LASTPIXEL), state_lastpixel }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_CULLMODE), { STATE_RENDER(WINED3DRS_CULLMODE), state_cullmode }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ZFUNC), { STATE_RENDER(WINED3DRS_ZFUNC), state_zfunc }, WINED3D_GL_EXT_NONE },
@@ -4933,35 +4957,35 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_FLUSHBATCH), { STATE_RENDER(WINED3DRS_FLUSHBATCH), state_flushbatch }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), { STATE_RENDER(WINED3DRS_TRANSLUCENTSORTINDEPENDENT), state_translucentsi }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_STENCILENABLE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILREF), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_STENCILMASK), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite2s}, EXT_STENCIL_TWO_SIDE },
{ STATE_RENDER(WINED3DRS_STENCILWRITEMASK), { STATE_RENDER(WINED3DRS_STENCILWRITEMASK), state_stencilwrite }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), state_stencil }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_TWOSIDEDSTENCILMODE), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILZFAIL), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILPASS), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CCW_STENCILFUNC), { STATE_RENDER(WINED3DRS_STENCILENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_WRAP0), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP1), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), state_wrap }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP1), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP2), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP3), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP4), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP5), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP6), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP7), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP8), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP9), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP10), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP11), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP12), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP13), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP14), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_WRAP15), { STATE_RENDER(WINED3DRS_WRAP0), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_EXTENTS), { STATE_RENDER(WINED3DRS_EXTENTS), state_extents }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), { STATE_RENDER(WINED3DRS_COLORKEYBLENDENABLE), state_ckeyblend }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), { STATE_RENDER(WINED3DRS_SOFTWAREVERTEXPROCESSING), state_swvp }, WINED3D_GL_EXT_NONE },
@@ -4969,28 +4993,33 @@ const struct StateEntryTemplate misc_state_template[] = {
{ STATE_RENDER(WINED3DRS_PATCHSEGMENTS), { STATE_RENDER(WINED3DRS_PATCHSEGMENTS), state_patchsegments }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POSITIONDEGREE), { STATE_RENDER(WINED3DRS_POSITIONDEGREE), state_positiondegree}, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_NORMALDEGREE), { STATE_RENDER(WINED3DRS_NORMALDEGREE), state_normaldegree }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_MINTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_MINTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_MAXTESSELLATIONLEVEL), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_X), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Y), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_Z), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ADAPTIVETESS_W), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), { STATE_RENDER(WINED3DRS_ENABLEADAPTIVETESSELLATION), state_tessellation }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa }, ARB_MULTISAMPLE },
{ STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), { STATE_RENDER(WINED3DRS_MULTISAMPLEANTIALIAS), state_msaa_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), { STATE_RENDER(WINED3DRS_MULTISAMPLEMASK), state_multisampmask }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), { STATE_RENDER(WINED3DRS_DEBUGMONITORTOKEN), state_debug_monitor }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite0 }, EXT_DRAW_BUFFERS2 },
{ STATE_RENDER(WINED3DRS_COLORWRITEENABLE), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_BLENDOP), { STATE_RENDER(WINED3DRS_BLENDOP), state_blendop }, EXT_BLEND_MINMAX },
{ STATE_RENDER(WINED3DRS_BLENDOP), { STATE_RENDER(WINED3DRS_BLENDOP), state_blendop_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), { STATE_RENDER(WINED3DRS_SCISSORTESTENABLE), state_scissor }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SLOPESCALEDEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), state_colorwrite }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SLOPESCALEDEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), state_colorwrite1 }, EXT_DRAW_BUFFERS2 },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE1), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), state_colorwrite2 }, EXT_DRAW_BUFFERS2 },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE2), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), state_colorwrite3 }, EXT_DRAW_BUFFERS2 },
+ { STATE_RENDER(WINED3DRS_COLORWRITEENABLE3), { STATE_RENDER(WINED3DRS_COLORWRITEENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_BLENDFACTOR), { STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor }, EXT_BLEND_COLOR },
{ STATE_RENDER(WINED3DRS_BLENDFACTOR), { STATE_RENDER(WINED3DRS_BLENDFACTOR), state_blendfactor_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_DEPTHBIAS), { STATE_RENDER(WINED3DRS_DEPTHBIAS), state_depthbias }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_ZVISIBLE), { STATE_RENDER(WINED3DRS_ZVISIBLE), state_zvisible }, WINED3D_GL_EXT_NONE },
/* Samplers */
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler }, WINED3D_GL_EXT_NONE },
@@ -5017,8 +5046,8 @@ const struct StateEntryTemplate misc_state_template[] = {
const struct StateEntryTemplate ffp_vertexstate_template[] = {
{ STATE_VDECL, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE },
- { STATE_VSHADER, { STATE_VDECL, vertexdeclaration }, WINED3D_GL_EXT_NONE },
- { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, WINED3D_GL_EXT_NONE },
+ { STATE_VSHADER, { STATE_VDECL, NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_MATERIAL, { STATE_RENDER(WINED3DRS_SPECULARENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_SPECULARENABLE), { STATE_RENDER(WINED3DRS_SPECULARENABLE), state_specularenable}, WINED3D_GL_EXT_NONE },
/* Clip planes */
{ STATE_CLIPPLANE(0), { STATE_CLIPPLANE(0), clipplane }, WINED3D_GL_EXT_NONE },
@@ -5067,14 +5096,14 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = {
/* Transform states follow */
{ STATE_TRANSFORM(WINED3DTS_VIEW), { STATE_TRANSFORM(WINED3DTS_VIEW), transform_view }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_PROJECTION), { STATE_TRANSFORM(WINED3DTS_PROJECTION), transform_projection}, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
- { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), transform_texture }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE0), { STATE_TEXTURESTAGE(0,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE1), { STATE_TEXTURESTAGE(1,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE2), { STATE_TEXTURESTAGE(2,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE3), { STATE_TEXTURESTAGE(3,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE4), { STATE_TEXTURESTAGE(4,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE5), { STATE_TEXTURESTAGE(5,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE6), { STATE_TEXTURESTAGE(6,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TRANSFORM(WINED3DTS_TEXTURE7), { STATE_TEXTURESTAGE(7,WINED3DTSS_TEXTURETRANSFORMFLAGS), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 0)), transform_world }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 1)), transform_worldex }, WINED3D_GL_EXT_NONE },
{ STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), { STATE_TRANSFORM(WINED3DTS_WORLDMATRIX( 2)), transform_worldex }, WINED3D_GL_EXT_NONE },
@@ -5349,36 +5378,39 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = {
{ STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), { STATE_TEXTURESTAGE(7, WINED3DTSS_TEXCOORDINDEX), tex_coordindex }, WINED3D_GL_EXT_NONE },
/* Fog */
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_vertexpart}, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog }, NV_FOG_DISTANCE },
{ STATE_RENDER(WINED3DRS_RANGEFOGENABLE), { STATE_RENDER(WINED3DRS_RANGEFOGENABLE), state_rangefog_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_CLIPPING), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), state_clipping }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_CLIPPLANEENABLE), { STATE_RENDER(WINED3DRS_CLIPPING), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_LIGHTING), { STATE_RENDER(WINED3DRS_LIGHTING), state_lighting }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_AMBIENT), { STATE_RENDER(WINED3DRS_AMBIENT), state_ambient }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_COLORVERTEX), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_LOCALVIEWER), { STATE_RENDER(WINED3DRS_LOCALVIEWER), state_localviewer }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_NORMALIZENORMALS), { STATE_RENDER(WINED3DRS_NORMALIZENORMALS), state_normalize }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_DIFFUSEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), state_colormat }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_DIFFUSEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SPECULARMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_AMBIENTMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_EMISSIVEMATERIALSOURCE), { STATE_RENDER(WINED3DRS_COLORVERTEX), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend }, ARB_VERTEX_BLEND },
{ STATE_RENDER(WINED3DRS_VERTEXBLEND), { STATE_RENDER(WINED3DRS_VERTEXBLEND), state_vertexblend_w }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSIZE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_arb }, ARB_POINT_PARAMETERS },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_ext }, EXT_POINT_PARAMETERS },
{ STATE_RENDER(WINED3DRS_POINTSIZE_MIN), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite }, ARB_POINT_SPRITE },
{ STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), { STATE_RENDER(WINED3DRS_POINTSPRITEENABLE), state_pointsprite_w }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_POINTSCALEENABLE), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSCALE_A), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), state_pscale }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_arb }, ARB_POINT_PARAMETERS },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_ext }, EXT_POINT_PARAMETERS },
- { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), state_psizemin_w }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_A), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_B), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSCALE_C), { STATE_RENDER(WINED3DRS_POINTSCALEENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, ARB_POINT_PARAMETERS },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, EXT_POINT_PARAMETERS },
+ { STATE_RENDER(WINED3DRS_POINTSIZE_MAX), { STATE_RENDER(WINED3DRS_POINTSIZE_MIN), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_TWEENFACTOR), { STATE_RENDER(WINED3DRS_VERTEXBLEND), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_INDEXEDVERTEXBLENDENABLE), { STATE_RENDER(WINED3DRS_VERTEXBLEND), NULL }, WINED3D_GL_EXT_NONE },
+
/* Samplers for NP2 texture matrix adjustions. They are not needed if GL_ARB_texture_non_power_of_two is supported,
* so register a NULL state handler in that case to get the vertex part of sampler() skipped(VTF is handled in the misc states.
* otherwise, register sampler_texmatrix, which takes care of updating the texture matrix
@@ -5412,96 +5444,95 @@ const struct StateEntryTemplate ffp_vertexstate_template[] = {
static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
{ STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(0, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(0, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(0, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(1, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(1, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(1, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(2, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(2, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(2, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(3, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(3, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(3, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(4, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(4, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(4, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(5, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(5, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(5, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(6, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(6, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(6, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), tex_alphaop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), tex_colorop }, WINED3D_GL_EXT_NONE },
- { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, state_nogl }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG1), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG2), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_COLORARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAARG0), { STATE_TEXTURESTAGE(7, WINED3DTSS_ALPHAOP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_RESULTARG), { STATE_TEXTURESTAGE(7, WINED3DTSS_COLOROP), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_TEXTURESTAGE(7, WINED3DTSS_CONSTANT), { 0 /* As long as we don't support D3DTA_CONSTANT */, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_PIXELSHADER, { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, apply_pixelshader }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_BORDERCOLOR), { STATE_RENDER(WINED3DRS_BORDERCOLOR), state_bordercolor }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_SRGBWRITEENABLE), { STATE_PIXELSHADER, NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_TEXTUREFACTOR), { STATE_RENDER(WINED3DRS_TEXTUREFACTOR), state_texfactor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGCOLOR), { STATE_RENDER(WINED3DRS_FOGCOLOR), state_fogcolor }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGDENSITY), { STATE_RENDER(WINED3DRS_FOGDENSITY), state_fogdensity }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGENABLE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), state_fog_fragpart }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGTABLEMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGVERTEXMODE), { STATE_RENDER(WINED3DRS_FOGENABLE), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_RENDER(WINED3DRS_FOGSTART), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
- { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), state_fogstartend }, WINED3D_GL_EXT_NONE },
+ { STATE_RENDER(WINED3DRS_FOGEND), { STATE_RENDER(WINED3DRS_FOGSTART), NULL }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(0), { STATE_SAMPLER(0), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(1), { STATE_SAMPLER(1), sampler_texdim }, WINED3D_GL_EXT_NONE },
{ STATE_SAMPLER(2), { STATE_SAMPLER(2), sampler_texdim }, WINED3D_GL_EXT_NONE },
@@ -5512,13 +5543,13 @@ static const struct StateEntryTemplate ffp_fragmentstate_template[] = {
{ STATE_SAMPLER(7), { STATE_SAMPLER(7), sampler_texdim }, WINED3D_GL_EXT_NONE },
{0 /* Terminate */, { 0, 0 }, WINED3D_GL_EXT_NONE },
};
-#undef GLINFO_LOCATION
/* Context activation is done by the caller. */
static void ffp_enable(IWineD3DDevice *iface, BOOL enable) { }
static void ffp_fragment_get_caps(const struct wined3d_gl_info *gl_info, struct fragment_caps *pCaps)
{
+ pCaps->PrimitiveMiscCaps = 0;
pCaps->TextureOpCaps = WINED3DTEXOPCAPS_ADD |
WINED3DTEXOPCAPS_ADDSIGNED |
WINED3DTEXOPCAPS_ADDSIGNED2X |
@@ -5626,20 +5657,94 @@ static void prune_invalid_states(struct StateEntry *state_table, const struct wi
state_table[i].representative = 0;
state_table[i].apply = state_undefined;
}
+
+ start = STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(gl_info->limits.blends));
+ last = STATE_TRANSFORM(WINED3DTS_WORLDMATRIX(255));
+ for (i = start; i <= last; ++i)
+ {
+ state_table[i].representative = 0;
+ state_table[i].apply = state_undefined;
+ }
}
static void validate_state_table(struct StateEntry *state_table)
{
- unsigned int i;
+ static const struct
+ {
+ DWORD first;
+ DWORD last;
+ }
+ rs_holes[] =
+ {
+ { 1, 1},
+ { 3, 3},
+ { 17, 18},
+ { 21, 21},
+ { 42, 45},
+ { 61, 127},
+ {149, 150},
+ {169, 169},
+ {177, 177},
+ {196, 197},
+ { 0, 0},
+ };
+ static const DWORD simple_states[] =
+ {
+ STATE_MATERIAL,
+ STATE_VDECL,
+ STATE_STREAMSRC,
+ STATE_INDEXBUFFER,
+ STATE_VERTEXSHADERCONSTANT,
+ STATE_PIXELSHADERCONSTANT,
+ STATE_VSHADER,
+ STATE_PIXELSHADER,
+ STATE_VIEWPORT,
+ STATE_SCISSORRECT,
+ STATE_FRONTFACE,
+ };
+ unsigned int i, current;
+
+ for (i = STATE_RENDER(1), current = 0; i <= STATE_RENDER(WINEHIGHEST_RENDER_STATE); ++i)
+ {
+ if (!rs_holes[current].first || i < STATE_RENDER(rs_holes[current].first))
+ {
+ if (!state_table[i].representative)
+ ERR("State %s (%#x) should have a representative.\n", debug_d3dstate(i), i);
+ }
+ else if (state_table[i].representative)
+ ERR("State %s (%#x) shouldn't have a representative.\n", debug_d3dstate(i), i);
+
+ if (i == STATE_RENDER(rs_holes[current].last)) ++current;
+ }
+
+ for (i = 0; i < sizeof(simple_states) / sizeof(*simple_states); ++i)
+ {
+ if (!state_table[simple_states[i]].representative)
+ ERR("State %s (%#x) should have a representative.\n",
+ debug_d3dstate(simple_states[i]), simple_states[i]);
+ }
for (i = 0; i < STATE_HIGHEST + 1; ++i)
{
DWORD rep = state_table[i].representative;
- if (rep && !state_table[rep].representative)
+ if (rep)
{
- ERR("State %s (%#x) has invalid representative %s (%#x).\n",
- debug_d3dstate(i), i, debug_d3dstate(rep), rep);
- state_table[i].representative = 0;
+ if (state_table[rep].representative != rep)
+ {
+ ERR("State %s (%#x) has invalid representative %s (%#x).\n",
+ debug_d3dstate(i), i, debug_d3dstate(rep), rep);
+ state_table[i].representative = 0;
+ }
+
+ if (rep != i)
+ {
+ if (state_table[i].apply)
+ ERR("State %s (%#x) has both a handler and representative.\n", debug_d3dstate(i), i);
+ }
+ else if (!state_table[i].apply)
+ {
+ ERR("Self representing state %s (%#x) has no handler.\n", debug_d3dstate(i), i);
+ }
}
}
}
@@ -5696,7 +5801,7 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
* applying later lines, but do not record anything in the state
* table
*/
- if(!cur[i].content.apply) continue;
+ if (!cur[i].content.representative) continue;
handlers = num_handlers(multistate_funcs[cur[i].state]);
multistate_funcs[cur[i].state][handlers] = cur[i].content.apply;
diff --git a/dll/directx/wine/wined3d/stateblock.c b/dll/directx/wine/wined3d/stateblock.c
index 48f9eacc453..1696646849e 100644
--- a/dll/directx/wine/wined3d/stateblock.c
+++ b/dll/directx/wine/wined3d/stateblock.c
@@ -757,7 +757,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
{
TRACE("Updating scissor rect.\n");
- targetStateBlock->scissorRect = This->scissorRect;
+ This->scissorRect = targetStateBlock->scissorRect;
}
map = This->changed.streamSource;
@@ -866,7 +866,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Capture(IWineD3DStateBlock *iface)
return WINED3D_OK;
}
-static void apply_lights(IWineD3DDevice *pDevice, const IWineD3DStateBlockImpl *This)
+static void apply_lights(IWineD3DDevice *device, const IWineD3DStateBlockImpl *This)
{
UINT i;
for(i = 0; i < LIGHTMAP_SIZE; i++) {
@@ -876,8 +876,8 @@ static void apply_lights(IWineD3DDevice *pDevice, const IWineD3DStateBlockImpl *
{
const struct wined3d_light_info *light = LIST_ENTRY(e, struct wined3d_light_info, entry);
- IWineD3DDevice_SetLight(pDevice, light->OriginalIndex, &light->OriginalParms);
- IWineD3DDevice_SetLightEnable(pDevice, light->OriginalIndex, light->glIndex != -1);
+ IWineD3DDevice_SetLight(device, light->OriginalIndex, &light->OriginalParms);
+ IWineD3DDevice_SetLightEnable(device, light->OriginalIndex, light->glIndex != -1);
}
}
}
@@ -885,58 +885,58 @@ static void apply_lights(IWineD3DDevice *pDevice, const IWineD3DStateBlockImpl *
static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
{
IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
- IWineD3DDevice *pDevice = (IWineD3DDevice *)This->device;
+ IWineD3DDevice *device = (IWineD3DDevice *)This->device;
unsigned int i;
DWORD map;
- TRACE("(%p) : Applying state block %p ------------------v\n", This, pDevice);
+ TRACE("(%p) : Applying state block %p ------------------v\n", This, device);
TRACE("Blocktype: %d\n", This->blockType);
- if (This->changed.vertexShader) IWineD3DDevice_SetVertexShader(pDevice, This->vertexShader);
+ if (This->changed.vertexShader) IWineD3DDevice_SetVertexShader(device, This->vertexShader);
/* Vertex Shader Constants */
for (i = 0; i < This->num_contained_vs_consts_f; ++i)
{
- IWineD3DDevice_SetVertexShaderConstantF(pDevice, This->contained_vs_consts_f[i],
+ IWineD3DDevice_SetVertexShaderConstantF(device, This->contained_vs_consts_f[i],
This->vertexShaderConstantF + This->contained_vs_consts_f[i] * 4, 1);
}
for (i = 0; i < This->num_contained_vs_consts_i; ++i)
{
- IWineD3DDevice_SetVertexShaderConstantI(pDevice, This->contained_vs_consts_i[i],
+ IWineD3DDevice_SetVertexShaderConstantI(device, This->contained_vs_consts_i[i],
This->vertexShaderConstantI + This->contained_vs_consts_i[i] * 4, 1);
}
for (i = 0; i < This->num_contained_vs_consts_b; ++i)
{
- IWineD3DDevice_SetVertexShaderConstantB(pDevice, This->contained_vs_consts_b[i],
+ IWineD3DDevice_SetVertexShaderConstantB(device, This->contained_vs_consts_b[i],
This->vertexShaderConstantB + This->contained_vs_consts_b[i], 1);
}
- apply_lights(pDevice, This);
+ apply_lights(device, This);
- if (This->changed.pixelShader) IWineD3DDevice_SetPixelShader(pDevice, This->pixelShader);
+ if (This->changed.pixelShader) IWineD3DDevice_SetPixelShader(device, This->pixelShader);
/* Pixel Shader Constants */
for (i = 0; i < This->num_contained_ps_consts_f; ++i)
{
- IWineD3DDevice_SetPixelShaderConstantF(pDevice, This->contained_ps_consts_f[i],
+ IWineD3DDevice_SetPixelShaderConstantF(device, This->contained_ps_consts_f[i],
This->pixelShaderConstantF + This->contained_ps_consts_f[i] * 4, 1);
}
for (i = 0; i < This->num_contained_ps_consts_i; ++i)
{
- IWineD3DDevice_SetPixelShaderConstantI(pDevice, This->contained_ps_consts_i[i],
+ IWineD3DDevice_SetPixelShaderConstantI(device, This->contained_ps_consts_i[i],
This->pixelShaderConstantI + This->contained_ps_consts_i[i] * 4, 1);
}
for (i = 0; i < This->num_contained_ps_consts_b; ++i)
{
- IWineD3DDevice_SetPixelShaderConstantB(pDevice, This->contained_ps_consts_b[i],
+ IWineD3DDevice_SetPixelShaderConstantB(device, This->contained_ps_consts_b[i],
This->pixelShaderConstantB + This->contained_ps_consts_b[i], 1);
}
/* Render */
for (i = 0; i < This->num_contained_render_states; ++i)
{
- IWineD3DDevice_SetRenderState(pDevice, This->contained_render_states[i],
+ IWineD3DDevice_SetRenderState(device, This->contained_render_states[i],
This->renderState[This->contained_render_states[i]]);
}
@@ -946,7 +946,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
DWORD stage = This->contained_tss_states[i].stage;
DWORD state = This->contained_tss_states[i].state;
- IWineD3DDevice_SetTextureStageState(pDevice, stage, state, This->textureState[stage][state]);
+ IWineD3DDevice_SetTextureStageState(device, stage, state, This->textureState[stage][state]);
}
/* Sampler states */
@@ -957,12 +957,12 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
DWORD value = This->samplerState[stage][state];
if (stage >= MAX_FRAGMENT_SAMPLERS) stage += WINED3DVERTEXTEXTURESAMPLER0 - MAX_FRAGMENT_SAMPLERS;
- IWineD3DDevice_SetSamplerState(pDevice, stage, state, value);
+ IWineD3DDevice_SetSamplerState(device, stage, state, value);
}
for (i = 0; i < This->num_contained_transform_states; ++i)
{
- IWineD3DDevice_SetTransform(pDevice, This->contained_transform_states[i],
+ IWineD3DDevice_SetTransform(device, This->contained_transform_states[i],
&This->transforms[This->contained_transform_states[i]]);
}
@@ -974,40 +974,40 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
if (This->changed.indices)
{
- IWineD3DDevice_SetIndexBuffer(pDevice, This->pIndexData, This->IndexFmt);
- IWineD3DDevice_SetBaseVertexIndex(pDevice, This->baseVertexIndex);
+ IWineD3DDevice_SetIndexBuffer(device, This->pIndexData, This->IndexFmt);
+ IWineD3DDevice_SetBaseVertexIndex(device, This->baseVertexIndex);
}
if (This->changed.vertexDecl && This->vertexDecl)
{
- IWineD3DDevice_SetVertexDeclaration(pDevice, This->vertexDecl);
+ IWineD3DDevice_SetVertexDeclaration(device, This->vertexDecl);
}
if (This->changed.material)
{
- IWineD3DDevice_SetMaterial(pDevice, &This->material);
+ IWineD3DDevice_SetMaterial(device, &This->material);
}
if (This->changed.viewport)
{
- IWineD3DDevice_SetViewport(pDevice, &This->viewport);
+ IWineD3DDevice_SetViewport(device, &This->viewport);
}
if (This->changed.scissorRect)
{
- IWineD3DDevice_SetScissorRect(pDevice, &This->scissorRect);
+ IWineD3DDevice_SetScissorRect(device, &This->scissorRect);
}
map = This->changed.streamSource;
for (i = 0; map; map >>= 1, ++i)
{
- if (map & 1) IWineD3DDevice_SetStreamSource(pDevice, i, This->streamSource[i], 0, This->streamStride[i]);
+ if (map & 1) IWineD3DDevice_SetStreamSource(device, i, This->streamSource[i], 0, This->streamStride[i]);
}
map = This->changed.streamFreq;
for (i = 0; map; map >>= 1, ++i)
{
- if (map & 1) IWineD3DDevice_SetStreamSourceFreq(pDevice, i, This->streamFreq[i] | This->streamFlags[i]);
+ if (map & 1) IWineD3DDevice_SetStreamSourceFreq(device, i, This->streamFreq[i] | This->streamFlags[i]);
}
map = This->changed.textures;
@@ -1018,7 +1018,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
if (!(map & 1)) continue;
stage = i < MAX_FRAGMENT_SAMPLERS ? i : WINED3DVERTEXTEXTURESAMPLER0 + i - MAX_FRAGMENT_SAMPLERS;
- IWineD3DDevice_SetTexture(pDevice, stage, This->textures[i]);
+ IWineD3DDevice_SetTexture(device, stage, This->textures[i]);
}
map = This->changed.clipplane;
@@ -1032,7 +1032,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
clip[1] = This->clipplane[i][1];
clip[2] = This->clipplane[i][2];
clip[3] = This->clipplane[i][3];
- IWineD3DDevice_SetClipPlane(pDevice, i, clip);
+ IWineD3DDevice_SetClipPlane(device, i, clip);
}
This->device->stateBlock->lowest_disabled_stage = MAX_TEXTURES - 1;
@@ -1044,7 +1044,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
break;
}
}
- TRACE("(%p) : Applied state block %p ------------------^\n", This, pDevice);
+ TRACE("(%p) : Applied state block %p ------------------^\n", This, device);
return WINED3D_OK;
}
@@ -1052,8 +1052,8 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_Apply(IWineD3DStateBlock *iface)
static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStateBlock* iface) {
IWineD3DStateBlockImpl *This = (IWineD3DStateBlockImpl *)iface;
IWineD3DDevice *device = (IWineD3DDevice *)This->device;
- IWineD3DDeviceImpl *ThisDevice = (IWineD3DDeviceImpl *)device;
- const struct wined3d_gl_info *gl_info = &ThisDevice->adapter->gl_info;
+ IWineD3DDeviceImpl *device_impl = (IWineD3DDeviceImpl *)device;
+ const struct wined3d_gl_info *gl_info = &device_impl->adapter->gl_info;
union {
WINED3DLINEPATTERN lp;
DWORD d;
@@ -1070,7 +1070,7 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
/* Note this may have a large overhead but it should only be executed
once, in order to initialize the complete state of the device and
all opengl equivalents */
- TRACE("(%p) -----------------------> Setting up device defaults... %p\n", This, ThisDevice);
+ TRACE("(%p) -----------------------> Setting up device defaults... %p\n", This, device);
/* TODO: make a special stateblock type for the primary stateblock (it never gets applied so it doesn't need a real type) */
This->blockType = WINED3DSBT_INIT;
@@ -1083,11 +1083,10 @@ static HRESULT WINAPI IWineD3DStateBlockImpl_InitStartupStateBlock(IWineD3DStat
TRACE("Render states\n");
/* Render states: */
- if (ThisDevice->auto_depth_stencil_buffer != NULL) {
+ if (device_impl->auto_depth_stencil)
IWineD3DDevice_SetRenderState(device, WINED3DRS_ZENABLE, WINED3DZB_TRUE);
- } else {
+ else
IWineD3DDevice_SetRenderState(device, WINED3DRS_ZENABLE, WINED3DZB_FALSE);
- }
IWineD3DDevice_SetRenderState(device, WINED3DRS_FILLMODE, WINED3DFILL_SOLID);
IWineD3DDevice_SetRenderState(device, WINED3DRS_SHADEMODE, WINED3DSHADE_GOURAUD);
lp.lp.wRepeatFactor = 0;
diff --git a/dll/directx/wine/wined3d/surface.c b/dll/directx/wine/wined3d/surface.c
index d17d35cc16d..0903f6eecaf 100644
--- a/dll/directx/wine/wined3d/surface.c
+++ b/dll/directx/wine/wined3d/surface.c
@@ -34,8 +34,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
WINE_DECLARE_DEBUG_CHANNEL(d3d);
-#define GLINFO_LOCATION (*gl_info)
-
static void surface_cleanup(IWineD3DSurfaceImpl *This)
{
IWineD3DDeviceImpl *device = This->resource.device;
@@ -51,7 +49,7 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This)
* target, Uninit3D() will activate a context before doing anything. */
if (device->render_targets && device->render_targets[0])
{
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
ENTER_GL();
@@ -98,7 +96,7 @@ static void surface_cleanup(IWineD3DSurfaceImpl *This)
if (context) context_release(context);
}
-UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT alignment, UINT width, UINT height)
+UINT surface_calculate_size(const struct wined3d_format_desc *format_desc, UINT alignment, UINT width, UINT height)
{
UINT size;
@@ -123,13 +121,233 @@ UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc, UINT al
return size;
}
+struct blt_info
+{
+ GLenum binding;
+ GLenum bind_target;
+ enum tex_types tex_type;
+ GLfloat coords[4][3];
+};
+
+struct float_rect
+{
+ float l;
+ float t;
+ float r;
+ float b;
+};
+
+static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float_rect *f)
+{
+ f->l = ((r->left * 2.0f) / w) - 1.0f;
+ f->t = ((r->top * 2.0f) / h) - 1.0f;
+ f->r = ((r->right * 2.0f) / w) - 1.0f;
+ f->b = ((r->bottom * 2.0f) / h) - 1.0f;
+}
+
+static void surface_get_blt_info(GLenum target, const RECT *rect_in, GLsizei w, GLsizei h, struct blt_info *info)
+{
+ GLfloat (*coords)[3] = info->coords;
+ RECT rect;
+ struct float_rect f;
+
+ if (rect_in)
+ rect = *rect_in;
+ else
+ {
+ rect.left = 0;
+ rect.top = h;
+ rect.right = w;
+ rect.bottom = 0;
+ }
+
+ switch (target)
+ {
+ default:
+ FIXME("Unsupported texture target %#x\n", target);
+ /* Fall back to GL_TEXTURE_2D */
+ case GL_TEXTURE_2D:
+ info->binding = GL_TEXTURE_BINDING_2D;
+ info->bind_target = GL_TEXTURE_2D;
+ info->tex_type = tex_2d;
+ coords[0][0] = (float)rect.left / w;
+ coords[0][1] = (float)rect.top / h;
+ coords[0][2] = 0.0f;
+
+ coords[1][0] = (float)rect.right / w;
+ coords[1][1] = (float)rect.top / h;
+ coords[1][2] = 0.0f;
+
+ coords[2][0] = (float)rect.left / w;
+ coords[2][1] = (float)rect.bottom / h;
+ coords[2][2] = 0.0f;
+
+ coords[3][0] = (float)rect.right / w;
+ coords[3][1] = (float)rect.bottom / h;
+ coords[3][2] = 0.0f;
+ break;
+
+ case GL_TEXTURE_RECTANGLE_ARB:
+ info->binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
+ info->bind_target = GL_TEXTURE_RECTANGLE_ARB;
+ info->tex_type = tex_rect;
+ coords[0][0] = rect.left; coords[0][1] = rect.top; coords[0][2] = 0.0f;
+ coords[1][0] = rect.right; coords[1][1] = rect.top; coords[1][2] = 0.0f;
+ coords[2][0] = rect.left; coords[2][1] = rect.bottom; coords[2][2] = 0.0f;
+ coords[3][0] = rect.right; coords[3][1] = rect.bottom; coords[3][2] = 0.0f;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = 1.0f; coords[0][1] = -f.t; coords[0][2] = -f.l;
+ coords[1][0] = 1.0f; coords[1][1] = -f.t; coords[1][2] = -f.r;
+ coords[2][0] = 1.0f; coords[2][1] = -f.b; coords[2][2] = -f.l;
+ coords[3][0] = 1.0f; coords[3][1] = -f.b; coords[3][2] = -f.r;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = -1.0f; coords[0][1] = -f.t; coords[0][2] = f.l;
+ coords[1][0] = -1.0f; coords[1][1] = -f.t; coords[1][2] = f.r;
+ coords[2][0] = -1.0f; coords[2][1] = -f.b; coords[2][2] = f.l;
+ coords[3][0] = -1.0f; coords[3][1] = -f.b; coords[3][2] = f.r;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = f.l; coords[0][1] = 1.0f; coords[0][2] = f.t;
+ coords[1][0] = f.r; coords[1][1] = 1.0f; coords[1][2] = f.t;
+ coords[2][0] = f.l; coords[2][1] = 1.0f; coords[2][2] = f.b;
+ coords[3][0] = f.r; coords[3][1] = 1.0f; coords[3][2] = f.b;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = f.l; coords[0][1] = -1.0f; coords[0][2] = -f.t;
+ coords[1][0] = f.r; coords[1][1] = -1.0f; coords[1][2] = -f.t;
+ coords[2][0] = f.l; coords[2][1] = -1.0f; coords[2][2] = -f.b;
+ coords[3][0] = f.r; coords[3][1] = -1.0f; coords[3][2] = -f.b;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = f.l; coords[0][1] = -f.t; coords[0][2] = 1.0f;
+ coords[1][0] = f.r; coords[1][1] = -f.t; coords[1][2] = 1.0f;
+ coords[2][0] = f.l; coords[2][1] = -f.b; coords[2][2] = 1.0f;
+ coords[3][0] = f.r; coords[3][1] = -f.b; coords[3][2] = 1.0f;
+ break;
+
+ case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
+ info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
+ info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
+ info->tex_type = tex_cube;
+ cube_coords_float(&rect, w, h, &f);
+
+ coords[0][0] = -f.l; coords[0][1] = -f.t; coords[0][2] = -1.0f;
+ coords[1][0] = -f.r; coords[1][1] = -f.t; coords[1][2] = -1.0f;
+ coords[2][0] = -f.l; coords[2][1] = -f.b; coords[2][2] = -1.0f;
+ coords[3][0] = -f.r; coords[3][1] = -f.b; coords[3][2] = -1.0f;
+ break;
+ }
+}
+
+static inline void surface_get_rect(IWineD3DSurfaceImpl *This, const RECT *rect_in, RECT *rect_out)
+{
+ if (rect_in)
+ *rect_out = *rect_in;
+ else
+ {
+ rect_out->left = 0;
+ rect_out->top = 0;
+ rect_out->right = This->currentDesc.Width;
+ rect_out->bottom = This->currentDesc.Height;
+ }
+}
+
+/* GL locking and context activation is done by the caller */
+void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect, const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter)
+{
+ IWineD3DBaseTextureImpl *texture;
+ struct blt_info info;
+
+ surface_get_blt_info(src_surface->texture_target, src_rect, src_surface->pow2Width, src_surface->pow2Height, &info);
+
+ glEnable(info.bind_target);
+ checkGLcall("glEnable(bind_target)");
+
+ /* Bind the texture */
+ glBindTexture(info.bind_target, src_surface->texture_name);
+ checkGLcall("glBindTexture");
+
+ /* Filtering for StretchRect */
+ glTexParameteri(info.bind_target, GL_TEXTURE_MAG_FILTER,
+ wined3d_gl_mag_filter(magLookup, Filter));
+ checkGLcall("glTexParameteri");
+ glTexParameteri(info.bind_target, GL_TEXTURE_MIN_FILTER,
+ wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
+ checkGLcall("glTexParameteri");
+ glTexParameteri(info.bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(info.bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ checkGLcall("glTexEnvi");
+
+ /* Draw a quad */
+ glBegin(GL_TRIANGLE_STRIP);
+ glTexCoord3fv(info.coords[0]);
+ glVertex2i(dst_rect->left, dst_rect->top);
+
+ glTexCoord3fv(info.coords[1]);
+ glVertex2i(dst_rect->right, dst_rect->top);
+
+ glTexCoord3fv(info.coords[2]);
+ glVertex2i(dst_rect->left, dst_rect->bottom);
+
+ glTexCoord3fv(info.coords[3]);
+ glVertex2i(dst_rect->right, dst_rect->bottom);
+ glEnd();
+
+ /* Unbind the texture */
+ glBindTexture(info.bind_target, 0);
+ checkGLcall("glBindTexture(info->bind_target, 0)");
+
+ /* We changed the filtering settings on the texture. Inform the
+ * container about this to get the filters reset properly next draw. */
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DBaseTexture, (void **)&texture)))
+ {
+ texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
+ texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
+ texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
+ IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
+ }
+}
+
HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
void (*cleanup)(IWineD3DSurfaceImpl *This);
unsigned int resource_size;
HRESULT hr;
@@ -226,7 +444,7 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
}
/* Mark the texture as dirty so that it gets loaded first time around. */
- surface_add_dirty_rect((IWineD3DSurface *)surface, NULL);
+ surface_add_dirty_rect(surface, NULL);
list_init(&surface->renderbuffers);
TRACE("surface %p, memory %p, size %u\n", surface, surface->resource.allocatedMemory, surface->resource.size);
@@ -243,64 +461,59 @@ HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type,
return hr;
}
-static void surface_force_reload(IWineD3DSurface *iface)
+static void surface_force_reload(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
-
- This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
+ surface->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
}
-void surface_set_texture_name(IWineD3DSurface *iface, GLuint new_name, BOOL srgb)
+void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint new_name, BOOL srgb)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
GLuint *name;
DWORD flag;
+ TRACE("surface %p, new_name %u, srgb %#x.\n", surface, new_name, srgb);
+
if(srgb)
{
- name = &This->texture_name_srgb;
+ name = &surface->texture_name_srgb;
flag = SFLAG_INSRGBTEX;
}
else
{
- name = &This->texture_name;
+ name = &surface->texture_name;
flag = SFLAG_INTEXTURE;
}
- TRACE("(%p) : setting texture name %u\n", This, new_name);
-
if (!*name && new_name)
{
/* FIXME: We shouldn't need to remove SFLAG_INTEXTURE if the
* surface has no texture name yet. See if we can get rid of this. */
- if (This->Flags & flag)
+ if (surface->Flags & flag)
ERR("Surface has SFLAG_INTEXTURE set, but no texture name\n");
- IWineD3DSurface_ModifyLocation(iface, flag, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, flag, FALSE);
}
*name = new_name;
- surface_force_reload(iface);
+ surface_force_reload(surface);
}
-void surface_set_texture_target(IWineD3DSurface *iface, GLenum target)
+void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+ TRACE("surface %p, target %#x.\n", surface, target);
- TRACE("(%p) : setting target %#x\n", This, target);
-
- if (This->texture_target != target)
+ if (surface->texture_target != target)
{
if (target == GL_TEXTURE_RECTANGLE_ARB)
{
- This->Flags &= ~SFLAG_NORMCOORD;
+ surface->Flags &= ~SFLAG_NORMCOORD;
}
- else if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
+ else if (surface->texture_target == GL_TEXTURE_RECTANGLE_ARB)
{
- This->Flags |= SFLAG_NORMCOORD;
+ surface->Flags |= SFLAG_NORMCOORD;
}
}
- This->texture_target = target;
- surface_force_reload(iface);
+ surface->texture_target = target;
+ surface_force_reload(surface);
}
/* Context activation is done by the caller. */
@@ -334,8 +547,9 @@ static void surface_bind_and_dirtify(IWineD3DSurfaceImpl *This, BOOL srgb) {
/* This function checks if the primary render target uses the 8bit paletted format. */
static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device)
{
- if (device->render_targets && device->render_targets[0]) {
- IWineD3DSurfaceImpl* render_target = (IWineD3DSurfaceImpl*)device->render_targets[0];
+ if (device->render_targets && device->render_targets[0])
+ {
+ IWineD3DSurfaceImpl *render_target = device->render_targets[0];
if ((render_target->resource.usage & WINED3DUSAGE_RENDERTARGET)
&& (render_target->resource.format_desc->format == WINED3DFMT_P8_UINT))
return TRUE;
@@ -343,15 +557,12 @@ static BOOL primary_render_target_is_p8(IWineD3DDeviceImpl *device)
return FALSE;
}
-#undef GLINFO_LOCATION
-
-#define GLINFO_LOCATION This->resource.device->adapter->gl_info
-
/* This call just downloads data, the caller is responsible for binding the
* correct texture. */
/* Context activation is done by the caller. */
-static void surface_download_data(IWineD3DSurfaceImpl *This) {
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+static void surface_download_data(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info)
+{
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
/* Only support read back of converted P8 surfaces */
if (This->Flags & SFLAG_CONVERTED && format_desc->format != WINED3DFMT_P8_UINT)
@@ -502,11 +713,28 @@ static void surface_download_data(IWineD3DSurfaceImpl *This) {
/* This call just uploads data, the caller is responsible for binding the
* correct texture. */
/* Context activation is done by the caller. */
-static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *data) {
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+static void surface_upload_data(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info,
+ const struct wined3d_format_desc *format_desc, BOOL srgb, const GLvoid *data)
+{
+ GLsizei width = This->currentDesc.Width;
+ GLsizei height = This->currentDesc.Height;
+ GLenum internal;
+
+ if (srgb)
+ {
+ internal = format_desc->glGammaInternal;
+ }
+ else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This))
+ {
+ internal = format_desc->rtInternal;
+ }
+ else
+ {
+ internal = format_desc->glInternal;
+ }
TRACE("This %p, internal %#x, width %d, height %d, format %#x, type %#x, data %p.\n",
- This, internal, width, height, format, type, data);
+ This, internal, width, height, format_desc->glFormat, format_desc->glType, data);
TRACE("target %#x, level %u, resource size %u.\n",
This->texture_target, This->texture_level, This->resource.size);
@@ -536,7 +764,7 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsi
TRACE("Calling glTexSubImage2D.\n");
glTexSubImage2D(This->texture_target, This->texture_level,
- 0, 0, width, height, format, type, data);
+ 0, 0, width, height, format_desc->glFormat, format_desc->glType, data);
checkGLcall("glTexSubImage2D");
}
@@ -547,32 +775,58 @@ static void surface_upload_data(IWineD3DSurfaceImpl *This, GLenum internal, GLsi
}
LEAVE_GL();
+
+ if (gl_info->quirks & WINED3D_QUIRK_FBO_TEX_UPDATE)
+ {
+ IWineD3DDeviceImpl *device = This->resource.device;
+ unsigned int i;
+
+ for (i = 0; i < device->numContexts; ++i)
+ {
+ context_surface_update(device->contexts[i], This);
+ }
+ }
}
/* This call just allocates the texture, the caller is responsible for binding
* the correct texture. */
/* Context activation is done by the caller. */
-static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal, GLsizei width, GLsizei height, GLenum format, GLenum type) {
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+static void surface_allocate_surface(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info,
+ const struct wined3d_format_desc *format_desc, BOOL srgb)
+{
BOOL enable_client_storage = FALSE;
+ GLsizei width = This->pow2Width;
+ GLsizei height = This->pow2Height;
const BYTE *mem = NULL;
+ GLenum internal;
+
+ if (srgb)
+ {
+ internal = format_desc->glGammaInternal;
+ }
+ else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET && surface_is_offscreen(This))
+ {
+ internal = format_desc->rtInternal;
+ }
+ else
+ {
+ internal = format_desc->glInternal;
+ }
if (format_desc->heightscale != 1.0f && format_desc->heightscale != 0.0f) height *= format_desc->heightscale;
TRACE("(%p) : Creating surface (target %#x) level %d, d3d format %s, internal format %#x, width %d, height %d, gl format %#x, gl type=%#x\n",
This, This->texture_target, This->texture_level, debug_d3dformat(format_desc->format),
- internal, width, height, format, type);
+ internal, width, height, format_desc->glFormat, format_desc->glType);
ENTER_GL();
if (gl_info->supported[APPLE_CLIENT_STORAGE])
{
- if(This->Flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION | SFLAG_OVERSIZE | SFLAG_CONVERTED) || This->resource.allocatedMemory == NULL) {
+ if(This->Flags & (SFLAG_NONPOW2 | SFLAG_DIBSECTION | SFLAG_CONVERTED) || This->resource.allocatedMemory == NULL) {
/* In some cases we want to disable client storage.
* SFLAG_NONPOW2 has a bigger opengl texture than the client memory, and different pitches
* SFLAG_DIBSECTION: Dibsections may have read / write protections on the memory. Avoid issues...
- * SFLAG_OVERSIZE: The gl texture is smaller than the allocated memory
* SFLAG_CONVERTED: The conversion destination memory is freed after loading the surface
* allocatedMemory == NULL: Not defined in the extension. Seems to disable client storage effectively
*/
@@ -598,7 +852,7 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
else
{
glTexImage2D(This->texture_target, This->texture_level,
- internal, width, height, 0, format, type, mem);
+ internal, width, height, 0, format_desc->glFormat, format_desc->glType, mem);
checkGLcall("glTexImage2D");
}
@@ -613,15 +867,15 @@ static void surface_allocate_surface(IWineD3DSurfaceImpl *This, GLenum internal,
* render target dimensions. With FBOs, the dimensions have to be an exact match. */
/* TODO: We should synchronize the renderbuffer's content with the texture's content. */
/* GL locking is done by the caller */
-void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int width, unsigned int height) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
+void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface, unsigned int width, unsigned int height)
+{
+ const struct wined3d_gl_info *gl_info = &surface->resource.device->adapter->gl_info;
renderbuffer_entry_t *entry;
GLuint renderbuffer = 0;
unsigned int src_width, src_height;
- src_width = This->pow2Width;
- src_height = This->pow2Height;
+ src_width = surface->pow2Width;
+ src_height = surface->pow2Height;
/* A depth stencil smaller than the render target is not valid */
if (width > src_width || height > src_height) return;
@@ -630,51 +884,53 @@ void surface_set_compatible_renderbuffer(IWineD3DSurface *iface, unsigned int wi
if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
|| (width == src_width && height == src_height))
{
- This->current_renderbuffer = NULL;
+ surface->current_renderbuffer = NULL;
return;
}
/* Look if we've already got a renderbuffer of the correct dimensions */
- LIST_FOR_EACH_ENTRY(entry, &This->renderbuffers, renderbuffer_entry_t, entry) {
- if (entry->width == width && entry->height == height) {
+ LIST_FOR_EACH_ENTRY(entry, &surface->renderbuffers, renderbuffer_entry_t, entry)
+ {
+ if (entry->width == width && entry->height == height)
+ {
renderbuffer = entry->id;
- This->current_renderbuffer = entry;
+ surface->current_renderbuffer = entry;
break;
}
}
- if (!renderbuffer) {
+ if (!renderbuffer)
+ {
gl_info->fbo_ops.glGenRenderbuffers(1, &renderbuffer);
gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, renderbuffer);
gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER,
- This->resource.format_desc->glInternal, width, height);
+ surface->resource.format_desc->glInternal, width, height);
entry = HeapAlloc(GetProcessHeap(), 0, sizeof(renderbuffer_entry_t));
entry->width = width;
entry->height = height;
entry->id = renderbuffer;
- list_add_head(&This->renderbuffers, &entry->entry);
+ list_add_head(&surface->renderbuffers, &entry->entry);
- This->current_renderbuffer = entry;
+ surface->current_renderbuffer = entry;
}
checkGLcall("set_compatible_renderbuffer");
}
-GLenum surface_get_gl_buffer(IWineD3DSurface *iface)
+GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)This->container;
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container;
- TRACE("iface %p.\n", iface);
+ TRACE("surface %p.\n", surface);
- if (!(This->Flags & SFLAG_SWAPCHAIN))
+ if (!(surface->Flags & SFLAG_SWAPCHAIN))
{
- ERR("Surface %p is not on a swapchain.\n", iface);
+ ERR("Surface %p is not on a swapchain.\n", surface);
return GL_NONE;
}
- if (swapchain->backBuffer && swapchain->backBuffer[0] == iface)
+ if (swapchain->back_buffers && swapchain->back_buffers[0] == surface)
{
if (swapchain->render_to_fbo)
{
@@ -684,7 +940,7 @@ GLenum surface_get_gl_buffer(IWineD3DSurface *iface)
TRACE("Returning GL_BACK\n");
return GL_BACK;
}
- else if (swapchain->frontBuffer == iface)
+ else if (surface == swapchain->front_buffer)
{
TRACE("Returning GL_FRONT\n");
return GL_FRONT;
@@ -695,35 +951,35 @@ GLenum surface_get_gl_buffer(IWineD3DSurface *iface)
}
/* Slightly inefficient way to handle multiple dirty rects but it works :) */
-void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect)
+void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DBaseTexture *baseTexture = NULL;
- if (!(This->Flags & SFLAG_INSYSMEM) && (This->Flags & SFLAG_INTEXTURE))
- IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL /* no partial locking for textures yet */);
+ TRACE("surface %p, dirty_rect %s.\n", surface, wine_dbgstr_rect(dirty_rect));
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
+ if (!(surface->Flags & SFLAG_INSYSMEM) && (surface->Flags & SFLAG_INTEXTURE))
+ /* No partial locking for textures yet. */
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
+
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, TRUE);
if (dirty_rect)
{
- This->dirtyRect.left = min(This->dirtyRect.left, dirty_rect->left);
- This->dirtyRect.top = min(This->dirtyRect.top, dirty_rect->top);
- This->dirtyRect.right = max(This->dirtyRect.right, dirty_rect->right);
- This->dirtyRect.bottom = max(This->dirtyRect.bottom, dirty_rect->bottom);
+ surface->dirtyRect.left = min(surface->dirtyRect.left, dirty_rect->left);
+ surface->dirtyRect.top = min(surface->dirtyRect.top, dirty_rect->top);
+ surface->dirtyRect.right = max(surface->dirtyRect.right, dirty_rect->right);
+ surface->dirtyRect.bottom = max(surface->dirtyRect.bottom, dirty_rect->bottom);
}
else
{
- This->dirtyRect.left = 0;
- This->dirtyRect.top = 0;
- This->dirtyRect.right = This->currentDesc.Width;
- This->dirtyRect.bottom = This->currentDesc.Height;
+ surface->dirtyRect.left = 0;
+ surface->dirtyRect.top = 0;
+ surface->dirtyRect.right = surface->currentDesc.Width;
+ surface->dirtyRect.bottom = surface->currentDesc.Height;
}
- TRACE("(%p) : Dirty: yes, Rect:(%d, %d, %d, %d)\n", This, This->dirtyRect.left,
- This->dirtyRect.top, This->dirtyRect.right, This->dirtyRect.bottom);
-
/* if the container is a basetexture then mark it dirty. */
- if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture)))
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&baseTexture)))
{
TRACE("Passing to container\n");
IWineD3DBaseTexture_SetDirty(baseTexture, TRUE);
@@ -731,15 +987,59 @@ void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect)
}
}
-static inline BOOL surface_can_stretch_rect(IWineD3DSurfaceImpl *src, IWineD3DSurfaceImpl *dst)
+static BOOL surface_convert_color_to_argb(IWineD3DSurfaceImpl *This, DWORD color, DWORD *argb_color)
{
- return ((src->resource.format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
- || (src->resource.usage & WINED3DUSAGE_RENDERTARGET))
- && ((dst->resource.format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE)
- || (dst->resource.usage & WINED3DUSAGE_RENDERTARGET))
- && (src->resource.format_desc->format == dst->resource.format_desc->format
- || (is_identity_fixup(src->resource.format_desc->color_fixup)
- && is_identity_fixup(dst->resource.format_desc->color_fixup)));
+ IWineD3DDeviceImpl *device = This->resource.device;
+
+ switch(This->resource.format_desc->format)
+ {
+ case WINED3DFMT_P8_UINT:
+ {
+ DWORD alpha;
+
+ if (primary_render_target_is_p8(device))
+ alpha = color << 24;
+ else
+ alpha = 0xFF000000;
+
+ if (This->palette) {
+ *argb_color = (alpha |
+ (This->palette->palents[color].peRed << 16) |
+ (This->palette->palents[color].peGreen << 8) |
+ (This->palette->palents[color].peBlue));
+ } else {
+ *argb_color = alpha;
+ }
+ }
+ break;
+
+ case WINED3DFMT_B5G6R5_UNORM:
+ {
+ if (color == 0xFFFF) {
+ *argb_color = 0xFFFFFFFF;
+ } else {
+ *argb_color = ((0xFF000000) |
+ ((color & 0xF800) << 8) |
+ ((color & 0x07E0) << 5) |
+ ((color & 0x001F) << 3));
+ }
+ }
+ break;
+
+ case WINED3DFMT_B8G8R8_UNORM:
+ case WINED3DFMT_B8G8R8X8_UNORM:
+ *argb_color = 0xFF000000 | color;
+ break;
+
+ case WINED3DFMT_B8G8R8A8_UNORM:
+ *argb_color = color;
+ break;
+
+ default:
+ ERR("Unhandled conversion from %s to ARGB!\n", debug_d3dformat(This->resource.format_desc->format));
+ return FALSE;
+ }
+ return TRUE;
}
static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
@@ -764,46 +1064,49 @@ static ULONG WINAPI IWineD3DSurfaceImpl_Release(IWineD3DSurface *iface)
IWineD3DSurface IWineD3DResource parts follow
**************************************************** */
-void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb)
+void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb)
{
/* TODO: check for locks */
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.device;
+ IWineD3DDeviceImpl *device = surface->resource.device;
IWineD3DBaseTexture *baseTexture = NULL;
- TRACE("(%p)Checking to see if the container is a base texture\n", This);
- if (IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&baseTexture) == WINED3D_OK) {
- IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *) baseTexture;
+ TRACE("(%p)Checking to see if the container is a base texture\n", surface);
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&baseTexture)))
+ {
+ IWineD3DBaseTextureImpl *tex_impl = (IWineD3DBaseTextureImpl *)baseTexture;
TRACE("Passing to container\n");
tex_impl->baseTexture.internal_preload(baseTexture, srgb);
IWineD3DBaseTexture_Release(baseTexture);
} else {
struct wined3d_context *context = NULL;
- TRACE("(%p) : About to load surface\n", This);
+ TRACE("(%p) : About to load surface\n", surface);
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
- || This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
+ if (surface->resource.format_desc->format == WINED3DFMT_P8_UINT
+ || surface->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- if(palette9_changed(This)) {
+ if (palette9_changed(surface))
+ {
TRACE("Reloading surface because the d3d8/9 palette was changed\n");
/* TODO: This is not necessarily needed with hw palettized texture support */
- IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
/* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INTEXTURE, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
}
}
- IWineD3DSurface_LoadTexture(iface, srgb == SRGB_SRGB ? TRUE : FALSE);
+ IWineD3DSurface_LoadTexture((IWineD3DSurface *)surface, srgb == SRGB_SRGB ? TRUE : FALSE);
- if (This->resource.pool == WINED3DPOOL_DEFAULT) {
+ if (surface->resource.pool == WINED3DPOOL_DEFAULT)
+ {
/* Tell opengl to try and keep this texture in video ram (well mostly) */
GLclampf tmp;
tmp = 0.9f;
ENTER_GL();
- glPrioritizeTextures(1, &This->texture_name, &tmp);
+ glPrioritizeTextures(1, &surface->texture_name, &tmp);
LEAVE_GL();
}
@@ -811,12 +1114,14 @@ void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb)
}
}
-static void WINAPI IWineD3DSurfaceImpl_PreLoad(IWineD3DSurface *iface) {
- surface_internal_preload(iface, SRGB_ANY);
+static void WINAPI IWineD3DSurfaceImpl_PreLoad(IWineD3DSurface *iface)
+{
+ surface_internal_preload((IWineD3DSurfaceImpl *)iface, SRGB_ANY);
}
/* Context activation is done by the caller. */
-static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
+static void surface_remove_pbo(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info)
+{
This->resource.heapMemory = HeapAlloc(GetProcessHeap() ,0 , This->resource.size + RESOURCE_ALIGNMENT);
This->resource.allocatedMemory =
(BYTE *)(((ULONG_PTR) This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
@@ -834,27 +1139,26 @@ static void surface_remove_pbo(IWineD3DSurfaceImpl *This) {
This->Flags &= ~SFLAG_PBO;
}
-BOOL surface_init_sysmem(IWineD3DSurface *iface)
+BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
-
- if(!This->resource.allocatedMemory)
+ if (!surface->resource.allocatedMemory)
{
- This->resource.heapMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->resource.size + RESOURCE_ALIGNMENT);
- if(!This->resource.heapMemory)
+ surface->resource.heapMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ surface->resource.size + RESOURCE_ALIGNMENT);
+ if (!surface->resource.heapMemory)
{
ERR("Out of memory\n");
return FALSE;
}
- This->resource.allocatedMemory =
- (BYTE *)(((ULONG_PTR) This->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
+ surface->resource.allocatedMemory =
+ (BYTE *)(((ULONG_PTR)surface->resource.heapMemory + (RESOURCE_ALIGNMENT - 1)) & ~(RESOURCE_ALIGNMENT - 1));
}
else
{
- memset(This->resource.allocatedMemory, 0, This->resource.size);
+ memset(surface->resource.allocatedMemory, 0, surface->resource.size);
}
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, TRUE);
return TRUE;
}
@@ -879,8 +1183,10 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
* or the depth stencil into an FBO the texture or render buffer will be removed
* and all flags get lost
*/
- surface_init_sysmem(iface);
- } else {
+ surface_init_sysmem(This);
+ }
+ else
+ {
/* Load the surface into system memory */
IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
@@ -889,13 +1195,12 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE);
This->Flags &= ~(SFLAG_ALLOCATED | SFLAG_SRGBALLOCATED);
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
gl_info = context->gl_info;
/* Destroy PBOs, but load them into real sysmem before */
- if(This->Flags & SFLAG_PBO) {
- surface_remove_pbo(This);
- }
+ if (This->Flags & SFLAG_PBO)
+ surface_remove_pbo(This, gl_info);
/* Destroy fbo render buffers. This is needed for implicit render targets, for
* all application-created targets the application has to release the surface
@@ -936,7 +1241,8 @@ static void WINAPI IWineD3DSurfaceImpl_UnLoad(IWineD3DSurface *iface) {
/* Read the framebuffer back into the surface */
static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, void *dest, UINT pitch)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
BYTE *mem;
GLint fmt;
@@ -964,26 +1270,29 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
* should help here. Furthermore unlockrect will need the context set up for blitting. The context manager will find
* context->last_was_blit set on the unlock.
*/
- context = context_acquire(myDevice, (IWineD3DSurface *) This, CTXUSAGE_BLIT);
+ context = context_acquire(device, This);
+ context_apply_blit_state(context, device);
+ gl_info = context->gl_info;
+
ENTER_GL();
/* Select the correct read buffer, and give some debug output.
* There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired.
*/
- if (surface_is_offscreen((IWineD3DSurface *) This))
+ if (surface_is_offscreen(This))
{
/* Locking the primary render target which is not on a swapchain(=offscreen render target).
* Read from the back buffer
*/
TRACE("Locking offscreen render target\n");
- glReadBuffer(myDevice->offscreenBuffer);
+ glReadBuffer(device->offscreenBuffer);
srcIsUpsideDown = TRUE;
}
else
{
/* Onscreen surfaces are always part of a swapchain */
- GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
+ GLenum buffer = surface_get_gl_buffer(This);
TRACE("Locking %#x buffer\n", buffer);
glReadBuffer(buffer);
checkGLcall("glReadBuffer");
@@ -1005,7 +1314,8 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
{
case WINED3DFMT_P8_UINT:
{
- if(primary_render_target_is_p8(myDevice)) {
+ if (primary_render_target_is_p8(device))
+ {
/* In case of P8 render targets the index is stored in the alpha component */
fmt = GL_ALPHA;
type = GL_UNSIGNED_BYTE;
@@ -1140,7 +1450,7 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
* the same color but we have no choice.
* In case of P8 render targets, the index is stored in the alpha component so no conversion is needed.
*/
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(myDevice))
+ if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !primary_render_target_is_p8(device))
{
const PALETTEENTRY *pal = NULL;
DWORD width = pitch / 3;
@@ -1180,20 +1490,18 @@ static void read_from_framebuffer(IWineD3DSurfaceImpl *This, const RECT *rect, v
static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
{
IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
- int bpp;
- GLenum format, internal, type;
- CONVERT_TYPES convert;
GLint prevRead;
- BOOL alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
-
- d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */, &format, &internal, &type, &convert, &bpp, srgb);
/* Activate the surface to read from. In some situations it isn't the currently active target(e.g. backbuffer
* locking during offscreen rendering). RESOURCELOAD is ok because glCopyTexSubImage2D isn't affected by any
* states in the stateblock, and no driver was found yet that had bugs in that regard.
*/
- context = context_acquire(device, (IWineD3DSurface *) This, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, This);
+ gl_info = context->gl_info;
+
+ surface_prepare_texture(This, gl_info, srgb);
surface_bind_and_dirtify(This, srgb);
ENTER_GL();
@@ -1204,9 +1512,9 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
* There is no need to keep track of the current read buffer or reset it, every part of the code
* that reads sets the read buffer as desired.
*/
- if (!surface_is_offscreen((IWineD3DSurface *)This))
+ if (!surface_is_offscreen(This))
{
- GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
+ GLenum buffer = surface_get_gl_buffer(This);
TRACE("Locking %#x buffer\n", buffer);
ENTER_GL();
@@ -1226,12 +1534,6 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
LEAVE_GL();
}
- if(!(This->Flags & alloc_flag)) {
- surface_allocate_surface(This, internal, This->pow2Width,
- This->pow2Height, format, type);
- This->Flags |= alloc_flag;
- }
-
ENTER_GL();
/* If !SrcIsUpsideDown we should flip the surface.
* This can be done using glCopyTexSubImage2D but this
@@ -1254,34 +1556,47 @@ static void read_from_framebuffer_texture(IWineD3DSurfaceImpl *This, BOOL srgb)
}
/* Context activation is done by the caller. */
-void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb)
+static void surface_prepare_texture_internal(IWineD3DSurfaceImpl *surface,
+ const struct wined3d_gl_info *gl_info, BOOL srgb)
{
DWORD alloc_flag = srgb ? SFLAG_SRGBALLOCATED : SFLAG_ALLOCATED;
- GLenum format, internal, type;
- GLsizei width, height;
CONVERT_TYPES convert;
- int bpp;
+ struct wined3d_format_desc desc;
if (surface->Flags & alloc_flag) return;
- d3dfmt_get_conv(surface, TRUE, TRUE, &format, &internal, &type, &convert, &bpp, srgb);
- if(convert != NO_CONVERSION) surface->Flags |= SFLAG_CONVERTED;
+ d3dfmt_get_conv(surface, TRUE, TRUE, &desc, &convert);
+ if(convert != NO_CONVERSION || desc.convert) surface->Flags |= SFLAG_CONVERTED;
else surface->Flags &= ~SFLAG_CONVERTED;
- if ((surface->Flags & SFLAG_NONPOW2) && !(surface->Flags & SFLAG_OVERSIZE))
+ surface_bind_and_dirtify(surface, srgb);
+ surface_allocate_surface(surface, gl_info, &desc, srgb);
+ surface->Flags |= alloc_flag;
+}
+
+/* Context activation is done by the caller. */
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info, BOOL srgb)
+{
+ IWineD3DBaseTextureImpl *texture;
+
+ if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)surface,
+ &IID_IWineD3DBaseTexture, (void **)&texture)))
{
- width = surface->pow2Width;
- height = surface->pow2Height;
- }
- else
- {
- width = surface->glRect.right - surface->glRect.left;
- height = surface->glRect.bottom - surface->glRect.top;
+ UINT sub_count = texture->baseTexture.level_count * texture->baseTexture.layer_count;
+ UINT i;
+
+ TRACE("surface %p is a subresource of texture %p.\n", surface, texture);
+
+ for (i = 0; i < sub_count; ++i)
+ {
+ IWineD3DSurfaceImpl *s = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[i];
+ surface_prepare_texture_internal(s, gl_info, srgb);
+ }
+
+ IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
}
- surface_bind_and_dirtify(surface, srgb);
- surface_allocate_surface(surface, internal, width, height, format, type);
- surface->Flags |= alloc_flag;
+ surface_prepare_texture_internal(surface, gl_info, srgb);
}
static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
@@ -1312,7 +1627,7 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
GLenum error;
struct wined3d_context *context;
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
ENTER_GL();
GL_EXTCALL(glGenBuffersARB(1, &This->pbo));
@@ -1360,10 +1675,11 @@ static void surface_prepare_system_memory(IWineD3DSurfaceImpl *This)
static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
const RECT *pass_rect = pRect;
- TRACE("(%p) : rect@%p flags(%08x), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->resource.allocatedMemory);
+ TRACE("iface %p, locked_rect %p, rect %s, flags %#x.\n",
+ iface, pLockedRect, wine_dbgstr_rect(pRect), Flags);
/* This is also done in the base class, but we have to verify this before loading any data from
* gl into the sysmem copy. The PBO may be mapped, a different rectangle locked, the discard flag
@@ -1404,7 +1720,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED
}
if (!(wined3d_settings.rendertargetlock_mode == RTL_DISABLE
- && ((This->Flags & SFLAG_SWAPCHAIN) || iface == myDevice->render_targets[0])))
+ && ((This->Flags & SFLAG_SWAPCHAIN) || This == device->render_targets[0])))
{
IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, pass_rect);
}
@@ -1412,9 +1728,12 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED
lock_end:
if (This->Flags & SFLAG_PBO)
{
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
- context = context_acquire(myDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
checkGLcall("glBindBufferARB");
@@ -1443,7 +1762,7 @@ lock_end:
* Dirtify on lock
* as seen in msdn docs
*/
- surface_add_dirty_rect(iface, pRect);
+ surface_add_dirty_rect(This, pRect);
/** Dirtify Container if needed */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&pBaseTexture))) {
@@ -1463,16 +1782,20 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
GLint prev_rasterpos[4];
GLint skipBytes = 0;
UINT pitch = IWineD3DSurface_GetPitch((IWineD3DSurface *) This); /* target is argb, 4 byte */
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
/* Activate the correct context for the render target */
- context = context_acquire(myDevice, (IWineD3DSurface *) This, CTXUSAGE_BLIT);
+ context = context_acquire(device, This);
+ context_apply_blit_state(context, device);
+ gl_info = context->gl_info;
+
ENTER_GL();
- if (!surface_is_offscreen((IWineD3DSurface *)This))
+ if (!surface_is_offscreen(This))
{
- GLenum buffer = surface_get_gl_buffer((IWineD3DSurface *)This);
+ GLenum buffer = surface_get_gl_buffer(This);
TRACE("Unlocking %#x buffer.\n", buffer);
context_set_draw_buffer(context, buffer);
}
@@ -1480,7 +1803,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
{
/* Primary offscreen render target */
TRACE("Offscreen render target.\n");
- context_set_draw_buffer(context, myDevice->offscreenBuffer);
+ context_set_draw_buffer(context, device->offscreenBuffer);
}
glGetIntegerv(GL_PACK_SWAP_BYTES, &prev_store);
@@ -1553,7 +1876,7 @@ static void flush_to_framebuffer_drawpixels(IWineD3DSurfaceImpl *This, GLenum fm
static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
BOOL fullsurface;
if (!(This->Flags & SFLAG_LOCKED)) {
@@ -1563,11 +1886,14 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
if (This->Flags & SFLAG_PBO)
{
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
TRACE("Freeing PBO memory\n");
- context = context_acquire(myDevice, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
+ gl_info = context->gl_info;
+
ENTER_GL();
GL_EXTCALL(glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, This->pbo));
GL_EXTCALL(glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB));
@@ -1586,7 +1912,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
goto unlock_end;
}
- if ((This->Flags & SFLAG_SWAPCHAIN) || (myDevice->render_targets && iface == myDevice->render_targets[0]))
+ if ((This->Flags & SFLAG_SWAPCHAIN) || (device->render_targets && This == device->render_targets[0]))
{
if(wined3d_settings.rendertargetlock_mode == RTL_DISABLE) {
static BOOL warned = FALSE;
@@ -1633,7 +1959,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
This->dirtyRect.top = This->currentDesc.Height;
This->dirtyRect.right = 0;
This->dirtyRect.bottom = 0;
- } else if(iface == myDevice->stencilBufferTarget) {
+ }
+ else if (This == device->depth_stencil)
+ {
FIXME("Depth Stencil buffer locking is not implemented\n");
} else {
/* The rest should be a normal texture */
@@ -1643,9 +1971,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
* states need resetting
*/
if(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DBaseTexture, (void **)&impl) == WINED3D_OK) {
- if(impl->baseTexture.bindCount) {
- IWineD3DDeviceImpl_MarkStateDirty(myDevice, STATE_SAMPLER(impl->baseTexture.sampler));
- }
+ if (impl->baseTexture.bindCount)
+ IWineD3DDeviceImpl_MarkStateDirty(device, STATE_SAMPLER(impl->baseTexture.sampler));
IWineD3DBaseTexture_Release((IWineD3DBaseTexture *) impl);
}
}
@@ -1661,35 +1988,34 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_UnlockRect(IWineD3DSurface *iface) {
return WINED3D_OK;
}
-static void surface_release_client_storage(IWineD3DSurface *iface)
+static void surface_release_client_storage(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
struct wined3d_context *context;
- context = context_acquire(This->resource.device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(surface->resource.device, NULL);
ENTER_GL();
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_FALSE);
- if(This->texture_name)
+ if (surface->texture_name)
{
- surface_bind_and_dirtify(This, FALSE);
- glTexImage2D(This->texture_target, This->texture_level,
- GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ surface_bind_and_dirtify(surface, FALSE);
+ glTexImage2D(surface->texture_target, surface->texture_level,
+ GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
}
- if(This->texture_name_srgb)
+ if (surface->texture_name_srgb)
{
- surface_bind_and_dirtify(This, TRUE);
- glTexImage2D(This->texture_target, This->texture_level,
- GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
+ surface_bind_and_dirtify(surface, TRUE);
+ glTexImage2D(surface->texture_target, surface->texture_level,
+ GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
}
glPixelStorei(GL_UNPACK_CLIENT_STORAGE_APPLE, GL_TRUE);
LEAVE_GL();
context_release(context);
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INSRGBTEX, FALSE);
- IWineD3DSurface_ModifyLocation(iface, SFLAG_INTEXTURE, FALSE);
- surface_force_reload(iface);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INSRGBTEX, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
+ surface_force_reload(surface);
}
static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC)
@@ -1720,7 +2046,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD
if(!This->hDC) {
if(This->Flags & SFLAG_CLIENT) {
IWineD3DSurface_LoadLocation(iface, SFLAG_INSYSMEM, NULL);
- surface_release_client_storage(iface);
+ surface_release_client_storage(This);
}
hr = IWineD3DBaseSurfaceImpl_CreateDIBSection(iface);
if(FAILED(hr)) return WINED3DERR_INVALIDCALL;
@@ -1761,7 +2087,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD
IWineD3DSurfaceImpl *dds_primary;
IWineD3DSwapChainImpl *swapchain;
swapchain = (IWineD3DSwapChainImpl *)This->resource.device->swapchains[0];
- dds_primary = (IWineD3DSurfaceImpl *)swapchain->frontBuffer;
+ dds_primary = swapchain->front_buffer;
if (dds_primary && dds_primary->palette)
pal = dds_primary->palette->palents;
}
@@ -1815,28 +2141,17 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_ReleaseDC(IWineD3DSurface *iface, HDC
IWineD3DSurface Internal (No mapping to directx api) parts follow
****************************************************** */
-HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format, GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode) {
+HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, struct wined3d_format_desc *desc, CONVERT_TYPES *convert)
+{
BOOL colorkey_active = need_alpha_ck && (This->CKeyFlags & WINEDDSD_CKSRCBLT);
- const struct GlPixelFormatDesc *glDesc = This->resource.format_desc;
IWineD3DDeviceImpl *device = This->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ BOOL blit_supported = FALSE;
+ RECT rect = {0, 0, This->pow2Width, This->pow2Height};
- /* Default values: From the surface */
- *format = glDesc->glFormat;
- *type = glDesc->glType;
+ /* Copy the default values from the surface. Below we might perform fixups */
+ /* TODO: get rid of color keying desc fixups by using e.g. a table. */
+ *desc = *This->resource.format_desc;
*convert = NO_CONVERSION;
- *target_bpp = glDesc->byte_count;
-
- if(srgb_mode) {
- *internal = glDesc->glGammaInternal;
- }
- else if (This->resource.usage & WINED3DUSAGE_RENDERTARGET
- && surface_is_offscreen((IWineD3DSurface *) This))
- {
- *internal = glDesc->rtInternal;
- } else {
- *internal = glDesc->glInternal;
- }
/* Ok, now look if we have to do any conversion */
switch(This->resource.format_desc->format)
@@ -1846,34 +2161,30 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
Paletted Texture
**************** */
- /* Use conversion when the paletted texture extension OR fragment shaders are available. When either
- * of the two is available make sure texturing is requested as neither of the two works in
- * conjunction with calls like glDraw-/glReadPixels. Further also use conversion in case of color keying.
+ blit_supported = device->blitter->blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &rect, This->resource.usage, This->resource.pool,
+ This->resource.format_desc, &rect, This->resource.usage,
+ This->resource.pool, This->resource.format_desc);
+
+ /* Use conversion when the blit_shader backend supports it. It only supports this in case of
+ * texturing. Further also use conversion in case of color keying.
* Paletted textures can be emulated using shaders but only do that for 2D purposes e.g. situations
* in which the main render target uses p8. Some games like GTA Vice City use P8 for texturing which
* conflicts with this.
*/
- if (!(gl_info->supported[EXT_PALETTED_TEXTURE] || (device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)
- && device->render_targets && This == (IWineD3DSurfaceImpl*)device->render_targets[0]))
+ if (!((blit_supported && device->render_targets && This == device->render_targets[0]))
|| colorkey_active || !use_texturing)
{
- *format = GL_RGBA;
- *internal = GL_RGBA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 4;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGBA;
+ desc->glType = GL_UNSIGNED_BYTE;
+ desc->conv_byte_count = 4;
if(colorkey_active) {
*convert = CONVERT_PALETTED_CK;
} else {
*convert = CONVERT_PALETTED;
}
}
- else if (!gl_info->supported[EXT_PALETTED_TEXTURE] && device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup))
- {
- *format = GL_ALPHA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 1;
- }
-
break;
case WINED3DFMT_B2G3R3_UNORM:
@@ -1890,149 +2201,40 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
case WINED3DFMT_B5G6R5_UNORM:
if (colorkey_active) {
*convert = CONVERT_CK_565;
- *format = GL_RGBA;
- *internal = GL_RGB5_A1;
- *type = GL_UNSIGNED_SHORT_5_5_5_1;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGB5_A1;
+ desc->glType = GL_UNSIGNED_SHORT_5_5_5_1;
+ desc->conv_byte_count = 2;
}
break;
case WINED3DFMT_B5G5R5X1_UNORM:
if (colorkey_active) {
*convert = CONVERT_CK_5551;
- *format = GL_BGRA;
- *internal = GL_RGB5_A1;
- *type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ desc->glFormat = GL_BGRA;
+ desc->glInternal = GL_RGB5_A1;
+ desc->glType = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ desc->conv_byte_count = 2;
}
break;
case WINED3DFMT_B8G8R8_UNORM:
if (colorkey_active) {
*convert = CONVERT_CK_RGB24;
- *format = GL_RGBA;
- *internal = GL_RGBA8;
- *type = GL_UNSIGNED_INT_8_8_8_8;
- *target_bpp = 4;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGBA8;
+ desc->glType = GL_UNSIGNED_INT_8_8_8_8;
+ desc->conv_byte_count = 4;
}
break;
case WINED3DFMT_B8G8R8X8_UNORM:
if (colorkey_active) {
*convert = CONVERT_RGB32_888;
- *format = GL_RGBA;
- *internal = GL_RGBA8;
- *type = GL_UNSIGNED_INT_8_8_8_8;
- }
- break;
-
- case WINED3DFMT_R8G8_SNORM:
- if (gl_info->supported[NV_TEXTURE_SHADER]) break;
- *convert = CONVERT_V8U8;
- *format = GL_BGR;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 3;
- break;
-
- case WINED3DFMT_R5G5_SNORM_L6_UNORM:
- *convert = CONVERT_L6V5U5;
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- *target_bpp = 3;
- /* Use format and types from table */
- } else {
- /* Load it into unsigned R5G6B5, swap L and V channels, and revert that in the shader */
- *target_bpp = 2;
- *format = GL_RGB;
- *type = GL_UNSIGNED_SHORT_5_6_5;
- }
- break;
-
- case WINED3DFMT_R8G8_SNORM_L8X8_UNORM:
- *convert = CONVERT_X8L8V8U8;
- *target_bpp = 4;
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- /* Use formats from gl table. It is a bit unfortunate, but the conversion
- * is needed to set the X format to 255 to get 1.0 for alpha when sampling
- * the texture. OpenGL can't use GL_DSDT8_MAG8_NV as internal format with
- * the needed type and format parameter, so the internal format contains a
- * 4th component, which is returned as alpha
- */
- } else {
- *format = GL_BGRA;
- *type = GL_UNSIGNED_INT_8_8_8_8_REV;
- }
- break;
-
- case WINED3DFMT_R8G8B8A8_SNORM:
- if (gl_info->supported[NV_TEXTURE_SHADER]) break;
- *convert = CONVERT_Q8W8V8U8;
- *format = GL_BGRA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 4;
- break;
-
- case WINED3DFMT_R16G16_SNORM:
- if (gl_info->supported[NV_TEXTURE_SHADER]) break;
- *convert = CONVERT_V16U16;
- *format = GL_BGR;
- *type = GL_UNSIGNED_SHORT;
- *target_bpp = 6;
- break;
-
- case WINED3DFMT_L4A4_UNORM:
- /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not
- * format+type combination to load it. Thus convert it to A8L8, then load it
- * with A4L4 internal, but A8L8 format+type
- */
- *convert = CONVERT_A4L4;
- *format = GL_LUMINANCE_ALPHA;
- *type = GL_UNSIGNED_BYTE;
- *target_bpp = 2;
- break;
-
- case WINED3DFMT_R16G16_UNORM:
- *convert = CONVERT_G16R16;
- *format = GL_RGB;
- *type = GL_UNSIGNED_SHORT;
- *target_bpp = 6;
- break;
-
- case WINED3DFMT_R16G16_FLOAT:
- *convert = CONVERT_R16G16F;
- *format = GL_RGB;
- *type = GL_HALF_FLOAT_ARB;
- *target_bpp = 6;
- break;
-
- case WINED3DFMT_R32G32_FLOAT:
- *convert = CONVERT_R32G32F;
- *format = GL_RGB;
- *type = GL_FLOAT;
- *target_bpp = 12;
- break;
-
- case WINED3DFMT_S1_UINT_D15_UNORM:
- if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
- || gl_info->supported[EXT_PACKED_DEPTH_STENCIL])
- {
- *convert = CONVERT_D15S1;
- *target_bpp = 4;
- }
- break;
-
- case WINED3DFMT_S4X4_UINT_D24_UNORM:
- if (gl_info->supported[ARB_FRAMEBUFFER_OBJECT]
- || gl_info->supported[EXT_PACKED_DEPTH_STENCIL])
- {
- *convert = CONVERT_D24X4S4;
- }
- break;
-
- case WINED3DFMT_S8_UINT_D24_FLOAT:
- if (gl_info->supported[ARB_DEPTH_BUFFER_FLOAT])
- {
- *convert = CONVERT_D24FS8;
- *target_bpp = 8;
+ desc->glFormat = GL_RGBA;
+ desc->glInternal = GL_RGBA8;
+ desc->glType = GL_UNSIGNED_INT_8_8_8_8;
+ desc->conv_byte_count = 4;
}
break;
@@ -2043,7 +2245,7 @@ HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_
return WINED3D_OK;
}
-static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey)
+void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey)
{
IWineD3DDeviceImpl *device = This->resource.device;
IWineD3DPaletteImpl *pal = This->palette;
@@ -2126,8 +2328,6 @@ static void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4]
static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UINT width,
UINT height, UINT outpitch, CONVERT_TYPES convert, IWineD3DSurfaceImpl *This)
{
- IWineD3DDeviceImpl *device = This->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
const BYTE *source;
BYTE *dest;
TRACE("(%p)->(%p),(%d,%d,%d,%d,%p)\n", src, dst, pitch, height, outpitch, convert,This);
@@ -2273,338 +2473,12 @@ static HRESULT d3dfmt_convert_surface(const BYTE *src, BYTE *dst, UINT pitch, UI
}
break;
- case CONVERT_V8U8:
- {
- unsigned int x, y;
- const short *Source;
- unsigned char *Dest;
- for(y = 0; y < height; y++) {
- Source = (const short *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* B */ Dest[0] = 0xff;
- /* G */ Dest[1] = (color >> 8) + 128; /* V */
- /* R */ Dest[2] = (color) + 128; /* U */
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_V16U16:
- {
- unsigned int x, y;
- const DWORD *Source;
- unsigned short *Dest;
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = (unsigned short *) (dst + y * outpitch);
- for (x = 0; x < width; x++ ) {
- DWORD color = (*Source++);
- /* B */ Dest[0] = 0xffff;
- /* G */ Dest[1] = (color >> 16) + 32768; /* V */
- /* R */ Dest[2] = (color ) + 32768; /* U */
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_Q8W8V8U8:
- {
- unsigned int x, y;
- const DWORD *Source;
- unsigned char *Dest;
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* B */ Dest[0] = ((color >> 16) & 0xff) + 128; /* W */
- /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
- /* R */ Dest[2] = (color & 0xff) + 128; /* U */
- /* A */ Dest[3] = ((color >> 24) & 0xff) + 128; /* Q */
- Dest += 4;
- }
- }
- break;
- }
-
- case CONVERT_L6V5U5:
- {
- unsigned int x, y;
- const WORD *Source;
- unsigned char *Dest;
-
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- /* This makes the gl surface bigger(24 bit instead of 16), but it works with
- * fixed function and shaders without further conversion once the surface is
- * loaded
- */
- for(y = 0; y < height; y++) {
- Source = (const WORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- short color = (*Source++);
- unsigned char l = ((color >> 10) & 0xfc);
- char v = ((color >> 5) & 0x3e);
- char u = ((color ) & 0x1f);
-
- /* 8 bits destination, 6 bits source, 8th bit is the sign. gl ignores the sign
- * and doubles the positive range. Thus shift left only once, gl does the 2nd
- * shift. GL reads a signed value and converts it into an unsigned value.
- */
- /* M */ Dest[2] = l << 1;
-
- /* Those are read as signed, but kept signed. Just left-shift 3 times to scale
- * from 5 bit values to 8 bit values.
- */
- /* V */ Dest[1] = v << 3;
- /* U */ Dest[0] = u << 3;
- Dest += 3;
- }
- }
- } else {
- for(y = 0; y < height; y++) {
- unsigned short *Dest_s = (unsigned short *) (dst + y * outpitch);
- Source = (const WORD *)(src + y * pitch);
- for (x = 0; x < width; x++ ) {
- short color = (*Source++);
- unsigned char l = ((color >> 10) & 0xfc);
- short v = ((color >> 5) & 0x3e);
- short u = ((color ) & 0x1f);
- short v_conv = v + 16;
- short u_conv = u + 16;
-
- *Dest_s = ((v_conv << 11) & 0xf800) | ((l << 5) & 0x7e0) | (u_conv & 0x1f);
- Dest_s += 1;
- }
- }
- }
- break;
- }
-
- case CONVERT_X8L8V8U8:
- {
- unsigned int x, y;
- const DWORD *Source;
- unsigned char *Dest;
-
- if (gl_info->supported[NV_TEXTURE_SHADER])
- {
- /* This implementation works with the fixed function pipeline and shaders
- * without further modification after converting the surface.
- */
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* L */ Dest[2] = ((color >> 16) & 0xff); /* L */
- /* V */ Dest[1] = ((color >> 8 ) & 0xff); /* V */
- /* U */ Dest[0] = (color & 0xff); /* U */
- /* I */ Dest[3] = 255; /* X */
- Dest += 4;
- }
- }
- } else {
- /* Doesn't work correctly with the fixed function pipeline, but can work in
- * shaders if the shader is adjusted. (There's no use for this format in gl's
- * standard fixed function pipeline anyway).
- */
- for(y = 0; y < height; y++) {
- Source = (const DWORD *)(src + y * pitch);
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- long color = (*Source++);
- /* B */ Dest[0] = ((color >> 16) & 0xff); /* L */
- /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
- /* R */ Dest[2] = (color & 0xff) + 128; /* U */
- Dest += 4;
- }
- }
- }
- break;
- }
-
- case CONVERT_A4L4:
- {
- unsigned int x, y;
- const unsigned char *Source;
- unsigned char *Dest;
- for(y = 0; y < height; y++) {
- Source = src + y * pitch;
- Dest = dst + y * outpitch;
- for (x = 0; x < width; x++ ) {
- unsigned char color = (*Source++);
- /* A */ Dest[1] = (color & 0xf0) << 0;
- /* L */ Dest[0] = (color & 0x0f) << 4;
- Dest += 2;
- }
- }
- break;
- }
-
- case CONVERT_G16R16:
- case CONVERT_R16G16F:
- {
- unsigned int x, y;
- const WORD *Source;
- WORD *Dest;
-
- for(y = 0; y < height; y++) {
- Source = (const WORD *)(src + y * pitch);
- Dest = (WORD *) (dst + y * outpitch);
- for (x = 0; x < width; x++ ) {
- WORD green = (*Source++);
- WORD red = (*Source++);
- Dest[0] = green;
- Dest[1] = red;
- /* Strictly speaking not correct for R16G16F, but it doesn't matter because the
- * shader overwrites it anyway
- */
- Dest[2] = 0xffff;
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_R32G32F:
- {
- unsigned int x, y;
- const float *Source;
- float *Dest;
- for(y = 0; y < height; y++) {
- Source = (const float *)(src + y * pitch);
- Dest = (float *) (dst + y * outpitch);
- for (x = 0; x < width; x++ ) {
- float green = (*Source++);
- float red = (*Source++);
- Dest[0] = green;
- Dest[1] = red;
- Dest[2] = 1.0f;
- Dest += 3;
- }
- }
- break;
- }
-
- case CONVERT_D15S1:
- {
- unsigned int x, y;
-
- for (y = 0; y < height; ++y)
- {
- const WORD *source = (const WORD *)(src + y * pitch);
- DWORD *dest = (DWORD *)(dst + y * outpitch);
-
- for (x = 0; x < width; ++x)
- {
- /* The depth data is normalized, so needs to be scaled,
- * the stencil data isn't. Scale depth data by
- * (2^24-1)/(2^15-1) ~~ (2^9 + 2^-6). */
- WORD d15 = source[x] >> 1;
- DWORD d24 = (d15 << 9) + (d15 >> 6);
- dest[x] = (d24 << 8) | (source[x] & 0x1);
- }
- }
- break;
- }
-
- case CONVERT_D24X4S4:
- {
- unsigned int x, y;
-
- for (y = 0; y < height; ++y)
- {
- const DWORD *source = (const DWORD *)(src + y * pitch);
- DWORD *dest = (DWORD *)(dst + y * outpitch);
-
- for (x = 0; x < width; ++x)
- {
- /* Just need to clear out the X4 part. */
- dest[x] = source[x] & ~0xf0;
- }
- }
- break;
- }
-
- case CONVERT_D24FS8:
- {
- unsigned int x, y;
-
- for (y = 0; y < height; ++y)
- {
- const DWORD *source = (const DWORD *)(src + y * pitch);
- float *dest_f = (float *)(dst + y * outpitch);
- DWORD *dest_s = (DWORD *)(dst + y * outpitch);
-
- for (x = 0; x < width; ++x)
- {
- dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00) >> 8);
- dest_s[x * 2 + 1] = source[x] & 0xff;
- }
- }
- break;
- }
-
default:
ERR("Unsupported conversion type %#x.\n", convert);
}
return WINED3D_OK;
}
-/* This function is used in case of 8bit paletted textures to upload the palette.
- It supports GL_EXT_paletted_texture and GL_ARB_fragment_program, support for other
- extensions like ATI_fragment_shaders is possible.
-*/
-/* Context activation is done by the caller. */
-static void d3dfmt_p8_upload_palette(IWineD3DSurface *iface, CONVERT_TYPES convert) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- BYTE table[256][4];
- IWineD3DDeviceImpl *device = This->resource.device;
- const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
-
- d3dfmt_p8_init_palette(This, table, (convert == CONVERT_PALETTED_CK));
-
- /* Try to use the paletted texture extension */
- if (gl_info->supported[EXT_PALETTED_TEXTURE])
- {
- TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
- ENTER_GL();
- GL_EXTCALL(glColorTableEXT(This->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
- LEAVE_GL();
- }
- else
- {
- /* Let a fragment shader do the color conversion by uploading the palette to a 1D texture.
- * The 8bit pixel data will be used as an index in this palette texture to retrieve the final color. */
- TRACE("Using fragment shaders for emulating 8-bit paletted texture support\n");
-
- device->blitter->set_shader((IWineD3DDevice *) device, This->resource.format_desc,
- This->texture_target, This->pow2Width, This->pow2Height);
-
- ENTER_GL();
- GL_EXTCALL(glActiveTextureARB(GL_TEXTURE1));
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
-
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); /* Make sure we have discrete color levels. */
- glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexImage1D(GL_TEXTURE_1D, 0, GL_RGBA, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, table); /* Upload the palette */
-
- /* Switch back to unit 0 in which the 2D texture will be stored. */
- GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0));
-
- /* Rebind the texture because it isn't bound anymore */
- glBindTexture(This->texture_target, This->texture_name);
- LEAVE_GL();
- }
-}
-
BOOL palette9_changed(IWineD3DSurfaceImpl *This)
{
IWineD3DDeviceImpl *device = This->resource.device;
@@ -2827,7 +2701,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SaveSnapshot(IWineD3DSurface *iface, c
LEAVE_GL();
} else { /* bind the real texture, and make sure it up to date */
- surface_internal_preload(iface, SRGB_RGB);
+ surface_internal_preload(This, SRGB_RGB);
surface_bind_and_dirtify(This, FALSE);
}
allocatedMemory = HeapAlloc(GetProcessHeap(), 0, width * height * 4);
@@ -2948,9 +2822,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *M
IWineD3DSurface_ModifyLocation(iface, SFLAG_INSYSMEM, TRUE);
/* For client textures opengl has to be notified */
- if(This->Flags & SFLAG_CLIENT) {
- surface_release_client_storage(iface);
- }
+ if (This->Flags & SFLAG_CLIENT)
+ surface_release_client_storage(This);
/* Now free the old memory if any */
HeapFree(GetProcessHeap(), 0, release);
@@ -2961,9 +2834,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetMem(IWineD3DSurface *iface, void *M
if(This->resource.heapMemory != NULL) ERR("User pointer surface has heap memory allocated\n");
This->Flags &= ~SFLAG_USERPTR;
- if(This->Flags & SFLAG_CLIENT) {
- surface_release_client_storage(iface);
- }
+ if (This->Flags & SFLAG_CLIENT)
+ surface_release_client_storage(This);
}
return WINED3D_OK;
}
@@ -3099,7 +2971,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS
}
/* Flipping a OpenGL surface -> Use WineD3DDevice::Present */
- hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *) swapchain, NULL, NULL, 0, NULL, 0);
+ hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain,
+ NULL, NULL, swapchain->win_handle, NULL, 0);
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
@@ -3107,36 +2980,48 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Flip(IWineD3DSurface *iface, IWineD3DS
/* Does a direct frame buffer -> texture copy. Stretching is done
* with single pixel copy calls
*/
-static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3DSurface *SrcSurface,
- const WINED3DRECT *srect, const WINED3DRECT *drect, BOOL upsidedown, WINED3DTEXTUREFILTERTYPE Filter)
+static void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *dst_surface, IWineD3DSurfaceImpl *src_surface,
+ const RECT *src_rect, const RECT *dst_rect_in, WINED3DTEXTUREFILTERTYPE Filter)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = dst_surface->resource.device;
float xrel, yrel;
UINT row;
- IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
struct wined3d_context *context;
+ BOOL upsidedown = FALSE;
+ RECT dst_rect = *dst_rect_in;
+ /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
+ * glCopyTexSubImage is a bit picky about the parameters we pass to it
+ */
+ if(dst_rect.top > dst_rect.bottom) {
+ UINT tmp = dst_rect.bottom;
+ dst_rect.bottom = dst_rect.top;
+ dst_rect.top = tmp;
+ upsidedown = TRUE;
+ }
- context = context_acquire(myDevice, SrcSurface, CTXUSAGE_BLIT);
- surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB);
+ context = context_acquire(device, src_surface);
+ context_apply_blit_state(context, device);
+ surface_internal_preload(dst_surface, SRGB_RGB);
ENTER_GL();
/* Bind the target texture */
- glBindTexture(This->texture_target, This->texture_name);
+ glBindTexture(dst_surface->texture_target, dst_surface->texture_name);
checkGLcall("glBindTexture");
- if(surface_is_offscreen(SrcSurface)) {
+ if (surface_is_offscreen(src_surface))
+ {
TRACE("Reading from an offscreen target\n");
upsidedown = !upsidedown;
- glReadBuffer(myDevice->offscreenBuffer);
+ glReadBuffer(device->offscreenBuffer);
}
else
{
- glReadBuffer(surface_get_gl_buffer(SrcSurface));
+ glReadBuffer(surface_get_gl_buffer(src_surface));
}
checkGLcall("glReadBuffer");
- xrel = (float) (srect->x2 - srect->x1) / (float) (drect->x2 - drect->x1);
- yrel = (float) (srect->y2 - srect->y1) / (float) (drect->y2 - drect->y1);
+ xrel = (float) (src_rect->right - src_rect->left) / (float) (dst_rect.right - dst_rect.left);
+ yrel = (float) (src_rect->bottom - src_rect->top) / (float) (dst_rect.bottom - dst_rect.top);
if ((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
{
@@ -3158,19 +3043,19 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
{
/* Upside down copy without stretching is nice, one glCopyTexSubImage call will do */
- glCopyTexSubImage2D(This->texture_target, This->texture_level,
- drect->x1 /*xoffset */, drect->y1 /* y offset */,
- srect->x1, Src->currentDesc.Height - srect->y2,
- drect->x2 - drect->x1, drect->y2 - drect->y1);
+ glCopyTexSubImage2D(dst_surface->texture_target, dst_surface->texture_level,
+ dst_rect.left /*xoffset */, dst_rect.top /* y offset */,
+ src_rect->left, src_surface->currentDesc.Height - src_rect->bottom,
+ dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top);
} else {
- UINT yoffset = Src->currentDesc.Height - srect->y1 + drect->y1 - 1;
+ UINT yoffset = src_surface->currentDesc.Height - src_rect->top + dst_rect.top - 1;
/* I have to process this row by row to swap the image,
* otherwise it would be upside down, so stretching in y direction
* doesn't cost extra time
*
* However, stretching in x direction can be avoided if not necessary
*/
- for(row = drect->y1; row < drect->y2; row++) {
+ for(row = dst_rect.top; row < dst_rect.bottom; row++) {
if ((xrel - 1.0f < -eps) || (xrel - 1.0f > eps))
{
/* Well, that stuff works, but it's very slow.
@@ -3178,15 +3063,18 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
*/
UINT col;
- for(col = drect->x1; col < drect->x2; col++) {
- glCopyTexSubImage2D(This->texture_target, This->texture_level,
- drect->x1 + col /* x offset */, row /* y offset */,
- srect->x1 + col * xrel, yoffset - (int) (row * yrel), 1, 1);
+ for (col = dst_rect.left; col < dst_rect.right; ++col)
+ {
+ glCopyTexSubImage2D(dst_surface->texture_target, dst_surface->texture_level,
+ dst_rect.left + col /* x offset */, row /* y offset */,
+ src_rect->left + col * xrel, yoffset - (int) (row * yrel), 1, 1);
}
- } else {
- glCopyTexSubImage2D(This->texture_target, This->texture_level,
- drect->x1 /* x offset */, row /* y offset */,
- srect->x1, yoffset - (int) (row * yrel), drect->x2-drect->x1, 1);
+ }
+ else
+ {
+ glCopyTexSubImage2D(dst_surface->texture_target, dst_surface->texture_level,
+ dst_rect.left /* x offset */, row /* y offset */,
+ src_rect->left, yoffset - (int) (row * yrel), dst_rect.right - dst_rect.left, 1);
}
}
}
@@ -3198,37 +3086,39 @@ static inline void fb_copy_to_texture_direct(IWineD3DSurfaceImpl *This, IWineD3D
/* The texture is now most up to date - If the surface is a render target and has a drawable, this
* path is never entered
*/
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INTEXTURE, TRUE);
}
/* Uses the hardware to stretch and flip the image */
-static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWineD3DSurface *SrcSurface,
- IWineD3DSwapChainImpl *swapchain, const WINED3DRECT *srect, const WINED3DRECT *drect,
- BOOL upsidedown, WINED3DTEXTUREFILTERTYPE Filter)
+static void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *dst_surface, IWineD3DSurfaceImpl *src_surface,
+ const RECT *src_rect, const RECT *dst_rect_in, WINED3DTEXTUREFILTERTYPE Filter)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = dst_surface->resource.device;
GLuint src, backup = 0;
- IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
+ IWineD3DSwapChainImpl *src_swapchain = NULL;
float left, right, top, bottom; /* Texture coordinates */
- UINT fbwidth = Src->currentDesc.Width;
- UINT fbheight = Src->currentDesc.Height;
+ UINT fbwidth = src_surface->currentDesc.Width;
+ UINT fbheight = src_surface->currentDesc.Height;
struct wined3d_context *context;
GLenum drawBuffer = GL_BACK;
GLenum texture_target;
BOOL noBackBufferBackup;
BOOL src_offscreen;
+ BOOL upsidedown = FALSE;
+ RECT dst_rect = *dst_rect_in;
TRACE("Using hwstretch blit\n");
/* Activate the Proper context for reading from the source surface, set it up for blitting */
- context = context_acquire(myDevice, SrcSurface, CTXUSAGE_BLIT);
- surface_internal_preload((IWineD3DSurface *) This, SRGB_RGB);
+ context = context_acquire(device, src_surface);
+ context_apply_blit_state(context, device);
+ surface_internal_preload(dst_surface, SRGB_RGB);
- src_offscreen = surface_is_offscreen(SrcSurface);
+ src_offscreen = surface_is_offscreen(src_surface);
noBackBufferBackup = src_offscreen && wined3d_settings.offscreen_rendering_mode == ORM_FBO;
- if (!noBackBufferBackup && !Src->texture_name)
+ if (!noBackBufferBackup && !src_surface->texture_name)
{
/* Get it a description */
- surface_internal_preload(SrcSurface, SRGB_RGB);
+ surface_internal_preload(src_surface, SRGB_RGB);
}
ENTER_GL();
@@ -3240,7 +3130,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* Got more than one aux buffer? Use the 2nd aux buffer */
drawBuffer = GL_AUX1;
}
- else if ((!src_offscreen || myDevice->offscreenBuffer == GL_BACK) && context->aux_buffers >= 1)
+ else if ((!src_offscreen || device->offscreenBuffer == GL_BACK) && context->aux_buffers >= 1)
{
/* Only one aux buffer, but it isn't used (Onscreen rendering, or non-aux orm)? Use it! */
drawBuffer = GL_AUX0;
@@ -3256,25 +3146,35 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* Backup the back buffer and copy the source buffer into a texture to draw an upside down stretched quad. If
* we are reading from the back buffer, the backup can be used as source texture
*/
- texture_target = Src->texture_target;
- glBindTexture(texture_target, Src->texture_name);
- checkGLcall("glBindTexture(texture_target, Src->texture_name)");
+ texture_target = src_surface->texture_target;
+ glBindTexture(texture_target, src_surface->texture_name);
+ checkGLcall("glBindTexture(texture_target, src_surface->texture_name)");
glEnable(texture_target);
checkGLcall("glEnable(texture_target)");
/* For now invalidate the texture copy of the back buffer. Drawable and sysmem copy are untouched */
- Src->Flags &= ~SFLAG_INTEXTURE;
+ src_surface->Flags &= ~SFLAG_INTEXTURE;
+ }
+
+ /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
+ * glCopyTexSubImage is a bit picky about the parameters we pass to it
+ */
+ if(dst_rect.top > dst_rect.bottom) {
+ UINT tmp = dst_rect.bottom;
+ dst_rect.bottom = dst_rect.top;
+ dst_rect.top = tmp;
+ upsidedown = TRUE;
}
if (src_offscreen)
{
TRACE("Reading from an offscreen target\n");
upsidedown = !upsidedown;
- glReadBuffer(myDevice->offscreenBuffer);
+ glReadBuffer(device->offscreenBuffer);
}
else
{
- glReadBuffer(surface_get_gl_buffer(SrcSurface));
+ glReadBuffer(surface_get_gl_buffer(src_surface));
}
/* TODO: Only back up the part that will be overwritten */
@@ -3294,9 +3194,14 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
checkGLcall("glTexParameteri");
- if(!swapchain || (IWineD3DSurface *) Src == swapchain->backBuffer[0]) {
- src = backup ? backup : Src->texture_name;
- } else {
+ IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&src_swapchain);
+ if (src_swapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)src_swapchain);
+ if (!src_swapchain || src_surface == src_swapchain->back_buffers[0])
+ {
+ src = backup ? backup : src_surface->texture_name;
+ }
+ else
+ {
glReadBuffer(GL_FRONT);
checkGLcall("glReadBuffer(GL_FRONT)");
@@ -3305,11 +3210,11 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
glBindTexture(GL_TEXTURE_2D, src);
checkGLcall("glBindTexture(GL_TEXTURE_2D, src)");
- /* TODO: Only copy the part that will be read. Use srect->x1, srect->y2 as origin, but with the width watch
+ /* TODO: Only copy the part that will be read. Use src_rect->left, src_rect->bottom as origin, but with the width watch
* out for power of 2 sizes
*/
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Src->pow2Width, Src->pow2Height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, src_surface->pow2Width,
+ src_surface->pow2Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
checkGLcall("glTexImage2D");
glCopyTexSubImage2D(GL_TEXTURE_2D, 0,
0, 0 /* read offsets */,
@@ -3333,22 +3238,26 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
}
checkGLcall("glEnd and previous");
- left = srect->x1;
- right = srect->x2;
+ left = src_rect->left;
+ right = src_rect->right;
- if(upsidedown) {
- top = Src->currentDesc.Height - srect->y1;
- bottom = Src->currentDesc.Height - srect->y2;
- } else {
- top = Src->currentDesc.Height - srect->y2;
- bottom = Src->currentDesc.Height - srect->y1;
+ if (upsidedown)
+ {
+ top = src_surface->currentDesc.Height - src_rect->top;
+ bottom = src_surface->currentDesc.Height - src_rect->bottom;
+ }
+ else
+ {
+ top = src_surface->currentDesc.Height - src_rect->bottom;
+ bottom = src_surface->currentDesc.Height - src_rect->top;
}
- if(Src->Flags & SFLAG_NORMCOORD) {
- left /= Src->pow2Width;
- right /= Src->pow2Width;
- top /= Src->pow2Height;
- bottom /= Src->pow2Height;
+ if (src_surface->Flags & SFLAG_NORMCOORD)
+ {
+ left /= src_surface->pow2Width;
+ right /= src_surface->pow2Width;
+ top /= src_surface->pow2Height;
+ bottom /= src_surface->pow2Height;
}
/* draw the source texture stretched and upside down. The correct surface is bound already */
@@ -3365,33 +3274,33 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
/* top left */
glTexCoord2f(left, top);
- glVertex2i(0, fbheight - drect->y2 - drect->y1);
+ glVertex2i(0, fbheight - dst_rect.bottom - dst_rect.top);
/* top right */
glTexCoord2f(right, top);
- glVertex2i(drect->x2 - drect->x1, fbheight - drect->y2 - drect->y1);
+ glVertex2i(dst_rect.right - dst_rect.left, fbheight - dst_rect.bottom - dst_rect.top);
/* bottom right */
glTexCoord2f(right, bottom);
- glVertex2i(drect->x2 - drect->x1, fbheight);
+ glVertex2i(dst_rect.right - dst_rect.left, fbheight);
glEnd();
checkGLcall("glEnd and previous");
- if (texture_target != This->texture_target)
+ if (texture_target != dst_surface->texture_target)
{
glDisable(texture_target);
- glEnable(This->texture_target);
- texture_target = This->texture_target;
+ glEnable(dst_surface->texture_target);
+ texture_target = dst_surface->texture_target;
}
/* Now read the stretched and upside down image into the destination texture */
- glBindTexture(texture_target, This->texture_name);
+ glBindTexture(texture_target, dst_surface->texture_name);
checkGLcall("glBindTexture");
glCopyTexSubImage2D(texture_target,
0,
- drect->x1, drect->y1, /* xoffset, yoffset */
+ dst_rect.left, dst_rect.top, /* xoffset, yoffset */
0, 0, /* We blitted the image to the origin */
- drect->x2 - drect->x1, drect->y2 - drect->y1);
+ dst_rect.right - dst_rect.left, dst_rect.bottom - dst_rect.top);
checkGLcall("glCopyTexSubImage2D");
if(drawBuffer == GL_BACK) {
@@ -3404,20 +3313,22 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
}
glBindTexture(GL_TEXTURE_2D, backup);
checkGLcall("glBindTexture(GL_TEXTURE_2D, backup)");
- } else {
- if (texture_target != Src->texture_target)
+ }
+ else
+ {
+ if (texture_target != src_surface->texture_target)
{
glDisable(texture_target);
- glEnable(Src->texture_target);
- texture_target = Src->texture_target;
+ glEnable(src_surface->texture_target);
+ texture_target = src_surface->texture_target;
}
- glBindTexture(Src->texture_target, Src->texture_name);
- checkGLcall("glBindTexture(Src->texture_target, Src->texture_name)");
+ glBindTexture(src_surface->texture_target, src_surface->texture_name);
+ checkGLcall("glBindTexture(src_surface->texture_target, src_surface->texture_name)");
}
glBegin(GL_QUADS);
/* top left */
- glTexCoord2f(0.0f, (float)fbheight / (float)Src->pow2Height);
+ glTexCoord2f(0.0f, (float)fbheight / (float)src_surface->pow2Height);
glVertex2i(0, 0);
/* bottom left */
@@ -3425,11 +3336,12 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
glVertex2i(0, fbheight);
/* bottom right */
- glTexCoord2f((float)fbwidth / (float)Src->pow2Width, 0.0f);
- glVertex2i(fbwidth, Src->currentDesc.Height);
+ glTexCoord2f((float)fbwidth / (float)src_surface->pow2Width, 0.0f);
+ glVertex2i(fbwidth, src_surface->currentDesc.Height);
/* top right */
- glTexCoord2f((float) fbwidth / (float) Src->pow2Width, (float) fbheight / (float) Src->pow2Height);
+ glTexCoord2f((float)fbwidth / (float)src_surface->pow2Width,
+ (float)fbheight / (float)src_surface->pow2Height);
glVertex2i(fbwidth, 0);
glEnd();
}
@@ -3437,7 +3349,7 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
checkGLcall("glDisable(texture_target)");
/* Cleanup */
- if (src != Src->texture_name && src != backup)
+ if (src != src_surface->texture_name && src != backup)
{
glDeleteTextures(1, &src);
checkGLcall("glDeleteTextures(1, &src)");
@@ -3449,48 +3361,76 @@ static inline void fb_copy_to_texture_hwstretch(IWineD3DSurfaceImpl *This, IWine
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
/* The texture is now most up to date - If the surface is a render target and has a drawable, this
* path is never entered
*/
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INTEXTURE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INTEXTURE, TRUE);
+}
+
+/* Until the blit_shader is ready, define some prototypes here. */
+static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc);
+
+/* Front buffer coordinates are always full screen coordinates, but our GL
+ * drawable is limited to the window's client area. The sysmem and texture
+ * copies do have the full screen size. Note that GL has a bottom-left
+ * origin, while D3D has a top-left origin. */
+void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND window, RECT *rect)
+{
+ POINT offset = {0, surface->currentDesc.Height};
+ RECT windowsize;
+
+ GetClientRect(window, &windowsize);
+ offset.y -= windowsize.bottom - windowsize.top;
+ ScreenToClient(window, &offset);
+ OffsetRect(rect, offset.x, offset.y);
}
/* Not called from the VTable */
-static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const RECT *DestRect,
- IWineD3DSurface *SrcSurface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx,
+static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *dst_surface, const RECT *DestRect,
+ IWineD3DSurfaceImpl *src_surface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx,
WINED3DTEXTUREFILTERTYPE Filter)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
- WINED3DRECT rect;
+ IWineD3DDeviceImpl *device = dst_surface->resource.device;
IWineD3DSwapChainImpl *srcSwapchain = NULL, *dstSwapchain = NULL;
- IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
+ RECT dst_rect, src_rect;
- TRACE("(%p)->(%p,%p,%p,%08x,%p)\n", This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx);
+ TRACE("dst_surface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, blt_fx %p, filter %s.\n",
+ dst_surface, wine_dbgstr_rect(DestRect), src_surface, wine_dbgstr_rect(SrcRect),
+ Flags, DDBltFx, debug_d3dtexturefiltertype(Filter));
/* Get the swapchain. One of the surfaces has to be a primary surface */
- if(This->resource.pool == WINED3DPOOL_SYSTEMMEM) {
+ if (dst_surface->resource.pool == WINED3DPOOL_SYSTEMMEM)
+ {
WARN("Destination is in sysmem, rejecting gl blt\n");
return WINED3DERR_INVALIDCALL;
}
- IWineD3DSurface_GetContainer( (IWineD3DSurface *) This, &IID_IWineD3DSwapChain, (void **)&dstSwapchain);
- if(dstSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *) dstSwapchain);
- if(Src) {
- if(Src->resource.pool == WINED3DPOOL_SYSTEMMEM) {
+ IWineD3DSurface_GetContainer((IWineD3DSurface *)dst_surface, &IID_IWineD3DSwapChain, (void **)&dstSwapchain);
+ if (dstSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)dstSwapchain);
+ if (src_surface)
+ {
+ if (src_surface->resource.pool == WINED3DPOOL_SYSTEMMEM)
+ {
WARN("Src is in sysmem, rejecting gl blt\n");
return WINED3DERR_INVALIDCALL;
}
- IWineD3DSurface_GetContainer( (IWineD3DSurface *) Src, &IID_IWineD3DSwapChain, (void **)&srcSwapchain);
- if(srcSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *) srcSwapchain);
+ IWineD3DSurface_GetContainer((IWineD3DSurface *)src_surface, &IID_IWineD3DSwapChain, (void **)&srcSwapchain);
+ if (srcSwapchain) IWineD3DSwapChain_Release((IWineD3DSwapChain *)srcSwapchain);
}
/* Early sort out of cases where no render target is used */
- if(!dstSwapchain && !srcSwapchain &&
- SrcSurface != myDevice->render_targets[0] && This != (IWineD3DSurfaceImpl *) myDevice->render_targets[0]) {
- TRACE("No surface is render target, not using hardware blit. Src = %p, dst = %p\n", Src, This);
+ if (!dstSwapchain && !srcSwapchain
+ && src_surface != device->render_targets[0]
+ && dst_surface != device->render_targets[0])
+ {
+ TRACE("No surface is render target, not using hardware blit.\n");
return WINED3DERR_INVALIDCALL;
}
@@ -3501,21 +3441,14 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
return WINED3DERR_INVALIDCALL;
}
- if (DestRect) {
- rect.x1 = DestRect->left;
- rect.y1 = DestRect->top;
- rect.x2 = DestRect->right;
- rect.y2 = DestRect->bottom;
- } else {
- rect.x1 = 0;
- rect.y1 = 0;
- rect.x2 = This->currentDesc.Width;
- rect.y2 = This->currentDesc.Height;
- }
+ surface_get_rect(dst_surface, DestRect, &dst_rect);
+ if (src_surface) surface_get_rect(src_surface, SrcRect, &src_rect);
/* The only case where both surfaces on a swapchain are supported is a back buffer -> front buffer blit on the same swapchain */
- if(dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->backBuffer &&
- ((IWineD3DSurface *) This == dstSwapchain->frontBuffer) && SrcSurface == dstSwapchain->backBuffer[0]) {
+ if (dstSwapchain && dstSwapchain == srcSwapchain && dstSwapchain->back_buffers
+ && dst_surface == dstSwapchain->front_buffer
+ && src_surface == dstSwapchain->back_buffers[0])
+ {
/* Half-life does a Blt from the back buffer to the front buffer,
* Full surface size, no flags... Use present instead
*
@@ -3525,57 +3458,50 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Check rects - IWineD3DDevice_Present doesn't handle them */
while(1)
{
- RECT mySrcRect;
TRACE("Looking if a Present can be done...\n");
/* Source Rectangle must be full surface */
- if( SrcRect ) {
- if(SrcRect->left != 0 || SrcRect->top != 0 ||
- SrcRect->right != Src->currentDesc.Width || SrcRect->bottom != Src->currentDesc.Height) {
- TRACE("No, Source rectangle doesn't match\n");
- break;
- }
+ if (src_rect.left || src_rect.top
+ || src_rect.right != src_surface->currentDesc.Width
+ || src_rect.bottom != src_surface->currentDesc.Height)
+ {
+ TRACE("No, Source rectangle doesn't match\n");
+ break;
}
- mySrcRect.left = 0;
- mySrcRect.top = 0;
- mySrcRect.right = Src->currentDesc.Width;
- mySrcRect.bottom = Src->currentDesc.Height;
/* No stretching may occur */
- if(mySrcRect.right != rect.x2 - rect.x1 ||
- mySrcRect.bottom != rect.y2 - rect.y1) {
+ if(src_rect.right != dst_rect.right - dst_rect.left ||
+ src_rect.bottom != dst_rect.bottom - dst_rect.top) {
TRACE("No, stretching is done\n");
break;
}
/* Destination must be full surface or match the clipping rectangle */
- if(This->clipper && ((IWineD3DClipperImpl *) This->clipper)->hWnd)
+ if (dst_surface->clipper && ((IWineD3DClipperImpl *)dst_surface->clipper)->hWnd)
{
RECT cliprect;
POINT pos[2];
- GetClientRect(((IWineD3DClipperImpl *) This->clipper)->hWnd, &cliprect);
- pos[0].x = rect.x1;
- pos[0].y = rect.y1;
- pos[1].x = rect.x2;
- pos[1].y = rect.y2;
- MapWindowPoints(GetDesktopWindow(), ((IWineD3DClipperImpl *) This->clipper)->hWnd,
- pos, 2);
+ GetClientRect(((IWineD3DClipperImpl *)dst_surface->clipper)->hWnd, &cliprect);
+ pos[0].x = dst_rect.left;
+ pos[0].y = dst_rect.top;
+ pos[1].x = dst_rect.right;
+ pos[1].y = dst_rect.bottom;
+ MapWindowPoints(GetDesktopWindow(), ((IWineD3DClipperImpl *)dst_surface->clipper)->hWnd, pos, 2);
if(pos[0].x != cliprect.left || pos[0].y != cliprect.top ||
pos[1].x != cliprect.right || pos[1].y != cliprect.bottom)
{
TRACE("No, dest rectangle doesn't match(clipper)\n");
- TRACE("Clip rect at (%d,%d)-(%d,%d)\n", cliprect.left, cliprect.top, cliprect.right, cliprect.bottom);
- TRACE("Blt dest: (%d,%d)-(%d,%d)\n", rect.x1, rect.y1, rect.x2, rect.y2);
+ TRACE("Clip rect at %s\n", wine_dbgstr_rect(&cliprect));
+ TRACE("Blt dest: %s\n", wine_dbgstr_rect(&dst_rect));
break;
}
}
- else
+ else if (dst_rect.left || dst_rect.top
+ || dst_rect.right != dst_surface->currentDesc.Width
+ || dst_rect.bottom != dst_surface->currentDesc.Height)
{
- if(rect.x1 != 0 || rect.y1 != 0 ||
- rect.x2 != This->currentDesc.Width || rect.y2 != This->currentDesc.Height) {
- TRACE("No, dest rectangle doesn't match(surface size)\n");
- break;
- }
+ TRACE("No, dest rectangle doesn't match(surface size)\n");
+ break;
}
TRACE("Yes\n");
@@ -3603,7 +3529,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
dstSwapchain->presentParms.PresentationInterval = WINED3DPRESENT_INTERVAL_IMMEDIATE;
TRACE("Full screen back buffer -> front buffer blt, performing a flip instead\n");
- IWineD3DSwapChain_Present((IWineD3DSwapChain *) dstSwapchain, NULL, NULL, 0, NULL, 0);
+ IWineD3DSwapChain_Present((IWineD3DSwapChain *)dstSwapchain,
+ NULL, NULL, dstSwapchain->win_handle, NULL, 0);
dstSwapchain->presentParms.SwapEffect = orig_swap;
@@ -3620,21 +3547,31 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
} else if(dstSwapchain && srcSwapchain) {
FIXME("Implement hardware blit between two different swapchains\n");
return WINED3DERR_INVALIDCALL;
- } else if(dstSwapchain) {
- if(SrcSurface == myDevice->render_targets[0]) {
+ }
+ else if (dstSwapchain)
+ {
+ /* Handled with regular texture -> swapchain blit */
+ if (src_surface == device->render_targets[0])
TRACE("Blit from active render target to a swapchain\n");
- /* Handled with regular texture -> swapchain blit */
- }
- } else if(srcSwapchain && This == (IWineD3DSurfaceImpl *) myDevice->render_targets[0]) {
+ }
+ else if (srcSwapchain && dst_surface == device->render_targets[0])
+ {
FIXME("Implement blit from a swapchain to the active render target\n");
return WINED3DERR_INVALIDCALL;
}
- if((srcSwapchain || SrcSurface == myDevice->render_targets[0]) && !dstSwapchain) {
+ if ((srcSwapchain || src_surface == device->render_targets[0]) && !dstSwapchain)
+ {
/* Blit from render target to texture */
- WINED3DRECT srect;
- BOOL upsideDown, stretchx;
- BOOL paletteOverride = FALSE;
+ BOOL stretchx;
+
+ /* P8 read back is not implemented */
+ if (src_surface->resource.format_desc->format == WINED3DFMT_P8_UINT
+ || dst_surface->resource.format_desc->format == WINED3DFMT_P8_UINT)
+ {
+ TRACE("P8 read back not supported by frame buffer to texture blit\n");
+ return WINED3DERR_INVALIDCALL;
+ }
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
TRACE("Color keying not supported by frame buffer to texture blit\n");
@@ -3642,50 +3579,12 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Destination color key is checked above */
}
- /* Make sure that the top pixel is always above the bottom pixel, and keep a separate upside down flag
- * glCopyTexSubImage is a bit picky about the parameters we pass to it
- */
- if(SrcRect) {
- if(SrcRect->top < SrcRect->bottom) {
- srect.y1 = SrcRect->top;
- srect.y2 = SrcRect->bottom;
- upsideDown = FALSE;
- } else {
- srect.y1 = SrcRect->bottom;
- srect.y2 = SrcRect->top;
- upsideDown = TRUE;
- }
- srect.x1 = SrcRect->left;
- srect.x2 = SrcRect->right;
- } else {
- srect.x1 = 0;
- srect.y1 = 0;
- srect.x2 = Src->currentDesc.Width;
- srect.y2 = Src->currentDesc.Height;
- upsideDown = FALSE;
- }
- if(rect.x1 > rect.x2) {
- UINT tmp = rect.x2;
- rect.x2 = rect.x1;
- rect.x1 = tmp;
- upsideDown = !upsideDown;
- }
-
- if(rect.x2 - rect.x1 != srect.x2 - srect.x1) {
+ if(dst_rect.right - dst_rect.left != src_rect.right - src_rect.left) {
stretchx = TRUE;
} else {
stretchx = FALSE;
}
- /* When blitting from a render target a texture, the texture isn't required to have a palette.
- * In this case grab the palette from the render target. */
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT && !This->palette)
- {
- paletteOverride = TRUE;
- TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This);
- This->palette = Src->palette;
- }
-
/* Blt is a pretty powerful call, while glCopyTexSubImage2D is not. glCopyTexSubImage cannot
* flip the image nor scale it.
*
@@ -3701,92 +3600,66 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
* FBO support, so it doesn't really make sense to try and make it work with different offscreen rendering
* backends.
*/
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
- && myDevice->adapter->gl_info.fbo_ops.glBlitFramebuffer
- && surface_can_stretch_rect(Src, This))
+ if (fbo_blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format_desc))
+ {
+ stretch_rect_fbo(device, src_surface, &src_rect, dst_surface, &dst_rect, Filter);
+ }
+ else if (!stretchx || dst_rect.right - dst_rect.left > src_surface->currentDesc.Width
+ || dst_rect.bottom - dst_rect.top > src_surface->currentDesc.Height)
{
- stretch_rect_fbo((IWineD3DDevice *)myDevice, SrcSurface, &srect,
- (IWineD3DSurface *)This, &rect, Filter, upsideDown);
- } else if((!stretchx) || rect.x2 - rect.x1 > Src->currentDesc.Width ||
- rect.y2 - rect.y1 > Src->currentDesc.Height) {
TRACE("No stretching in x direction, using direct framebuffer -> texture copy\n");
- fb_copy_to_texture_direct(This, SrcSurface, &srect, &rect, upsideDown, Filter);
+ fb_copy_to_texture_direct(dst_surface, src_surface, &src_rect, &dst_rect, Filter);
} else {
TRACE("Using hardware stretching to flip / stretch the texture\n");
- fb_copy_to_texture_hwstretch(This, SrcSurface, srcSwapchain, &srect, &rect, upsideDown, Filter);
+ fb_copy_to_texture_hwstretch(dst_surface, src_surface, &src_rect, &dst_rect, Filter);
}
- /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */
- if(paletteOverride)
- This->palette = NULL;
-
- if(!(This->Flags & SFLAG_DONOTFREE)) {
- HeapFree(GetProcessHeap(), 0, This->resource.heapMemory);
- This->resource.allocatedMemory = NULL;
- This->resource.heapMemory = NULL;
- } else {
- This->Flags &= ~SFLAG_INSYSMEM;
+ if (!(dst_surface->Flags & SFLAG_DONOTFREE))
+ {
+ HeapFree(GetProcessHeap(), 0, dst_surface->resource.heapMemory);
+ dst_surface->resource.allocatedMemory = NULL;
+ dst_surface->resource.heapMemory = NULL;
+ }
+ else
+ {
+ dst_surface->Flags &= ~SFLAG_INSYSMEM;
}
return WINED3D_OK;
- } else if(Src) {
+ }
+ else if (src_surface)
+ {
/* Blit from offscreen surface to render target */
- float glTexCoord[4];
- DWORD oldCKeyFlags = Src->CKeyFlags;
- WINEDDCOLORKEY oldBltCKey = Src->SrcBltCKey;
+ DWORD oldCKeyFlags = src_surface->CKeyFlags;
+ WINEDDCOLORKEY oldBltCKey = src_surface->SrcBltCKey;
struct wined3d_context *context;
- RECT SourceRectangle;
- BOOL paletteOverride = FALSE;
- TRACE("Blt from surface %p to rendertarget %p\n", Src, This);
+ TRACE("Blt from surface %p to rendertarget %p\n", src_surface, dst_surface);
- if(SrcRect) {
- SourceRectangle.left = SrcRect->left;
- SourceRectangle.right = SrcRect->right;
- SourceRectangle.top = SrcRect->top;
- SourceRectangle.bottom = SrcRect->bottom;
- } else {
- SourceRectangle.left = 0;
- SourceRectangle.right = Src->currentDesc.Width;
- SourceRectangle.top = 0;
- SourceRectangle.bottom = Src->currentDesc.Height;
- }
-
- /* When blitting from an offscreen surface to a rendertarget, the source
- * surface is not required to have a palette. Our rendering / conversion
- * code further down the road retrieves the palette from the surface, so
- * it must have a palette set. */
- if (Src->resource.format_desc->format == WINED3DFMT_P8_UINT && !Src->palette)
- {
- paletteOverride = TRUE;
- TRACE("Source surface (%p) lacks palette, overriding palette with palette %p of destination surface (%p)\n", Src, This->palette, This);
- Src->palette = This->palette;
- }
-
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO
- && myDevice->adapter->gl_info.fbo_ops.glBlitFramebuffer
- && !(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
- && surface_can_stretch_rect(Src, This))
+ if (!(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
+ && fbo_blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool,
+ src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
{
TRACE("Using stretch_rect_fbo\n");
/* The source is always a texture, but never the currently active render target, and the texture
- * contents are never upside down
- */
- stretch_rect_fbo((IWineD3DDevice *)myDevice, SrcSurface, (WINED3DRECT *) &SourceRectangle,
- (IWineD3DSurface *)This, &rect, Filter, FALSE);
-
- /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */
- if(paletteOverride)
- Src->palette = NULL;
+ * contents are never upside down. */
+ stretch_rect_fbo(device, src_surface, &src_rect, dst_surface, &dst_rect, Filter);
return WINED3D_OK;
}
- if(!CalculateTexRect(Src, &SourceRectangle, glTexCoord)) {
- /* Fall back to software */
- WARN("(%p) Source texture area (%d,%d)-(%d,%d) is too big\n", Src,
- SourceRectangle.left, SourceRectangle.top,
- SourceRectangle.right, SourceRectangle.bottom);
- return WINED3DERR_INVALIDCALL;
+ if (!(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE))
+ && arbfp_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool,
+ src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
+ {
+ return arbfp_blit_surface(device, src_surface, &src_rect, dst_surface, &dst_rect, BLIT_OP_BLIT, Filter);
}
/* Color keying: Check if we have to do a color keyed blt,
@@ -3800,72 +3673,35 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Use color key from surface */
} else if(Flags & WINEDDBLT_KEYSRCOVERRIDE) {
/* Use color key from DDBltFx */
- Src->CKeyFlags |= WINEDDSD_CKSRCBLT;
- Src->SrcBltCKey = DDBltFx->ddckSrcColorkey;
+ src_surface->CKeyFlags |= WINEDDSD_CKSRCBLT;
+ src_surface->SrcBltCKey = DDBltFx->ddckSrcColorkey;
} else {
/* Do not use color key */
- Src->CKeyFlags &= ~WINEDDSD_CKSRCBLT;
+ src_surface->CKeyFlags &= ~WINEDDSD_CKSRCBLT;
}
/* Now load the surface */
- surface_internal_preload((IWineD3DSurface *) Src, SRGB_RGB);
+ surface_internal_preload(src_surface, SRGB_RGB);
/* Activate the destination context, set it up for blitting */
- context = context_acquire(myDevice, (IWineD3DSurface *)This, CTXUSAGE_BLIT);
+ context = context_acquire(device, dst_surface);
+ context_apply_blit_state(context, device);
- /* The coordinates of the ddraw front buffer are always fullscreen ('screen coordinates',
- * while OpenGL coordinates are window relative.
- * Also beware of the origin difference(top left vs bottom left).
- * Also beware that the front buffer's surface size is screen width x screen height,
- * whereas the real gl drawable size is the size of the window.
- */
- if (dstSwapchain && (IWineD3DSurface *)This == dstSwapchain->frontBuffer) {
- RECT windowsize;
- POINT offset = {0,0};
- UINT h;
- ClientToScreen(dstSwapchain->win_handle, &offset);
- GetClientRect(dstSwapchain->win_handle, &windowsize);
- h = windowsize.bottom - windowsize.top;
- rect.x1 -= offset.x; rect.x2 -=offset.x;
- rect.y1 -= offset.y; rect.y2 -=offset.y;
- rect.y1 += This->currentDesc.Height - h; rect.y2 += This->currentDesc.Height - h;
- }
+ if (dstSwapchain && dst_surface == dstSwapchain->front_buffer)
+ surface_translate_frontbuffer_coords(dst_surface, context->win_handle, &dst_rect);
- if (!is_identity_fixup(This->resource.format_desc->color_fixup))
+ if (!device->blitter->blit_supported(&device->adapter->gl_info, BLIT_OP_BLIT,
+ &src_rect, src_surface->resource.usage, src_surface->resource.pool, src_surface->resource.format_desc,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool, dst_surface->resource.format_desc))
{
- FIXME("Destination format %s has a fixup, this is not supported.\n",
- debug_d3dformat(This->resource.format_desc->format));
- dump_color_fixup_desc(This->resource.format_desc->color_fixup);
+ FIXME("Unsupported blit operation falling back to software\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (!myDevice->blitter->color_fixup_supported(Src->resource.format_desc->color_fixup))
- {
- FIXME("Source format %s has an unsupported fixup:\n",
- debug_d3dformat(Src->resource.format_desc->format));
- dump_color_fixup_desc(Src->resource.format_desc->color_fixup);
- }
-
- myDevice->blitter->set_shader((IWineD3DDevice *) myDevice, Src->resource.format_desc,
- Src->texture_target, Src->pow2Width, Src->pow2Height);
+ device->blitter->set_shader((IWineD3DDevice *)device, src_surface);
ENTER_GL();
- /* Bind the texture */
- glBindTexture(Src->texture_target, Src->texture_name);
- checkGLcall("glBindTexture");
-
- /* Filtering for StretchRect */
- glTexParameteri(Src->texture_target, GL_TEXTURE_MAG_FILTER,
- wined3d_gl_mag_filter(magLookup, Filter));
- checkGLcall("glTexParameteri");
- glTexParameteri(Src->texture_target, GL_TEXTURE_MIN_FILTER,
- wined3d_gl_min_mip_filter(minMipLookup, Filter, WINED3DTEXF_NONE));
- checkGLcall("glTexParameteri");
- glTexParameteri(Src->texture_target, GL_TEXTURE_WRAP_S, GL_CLAMP);
- glTexParameteri(Src->texture_target, GL_TEXTURE_WRAP_T, GL_CLAMP);
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
- checkGLcall("glTexEnvi");
-
/* This is for color keying */
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
glEnable(GL_ALPHA_TEST);
@@ -3874,8 +3710,8 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* When the primary render target uses P8, the alpha component contains the palette index.
* Which means that the colorkey is one of the palette entries. In other cases pixels that
* should be masked away have alpha set to 0. */
- if(primary_render_target_is_p8(myDevice))
- glAlphaFunc(GL_NOTEQUAL, (float)Src->SrcBltCKey.dwColorSpaceLowValue / 256.0f);
+ if (primary_render_target_is_p8(device))
+ glAlphaFunc(GL_NOTEQUAL, (float)src_surface->SrcBltCKey.dwColorSpaceLowValue / 256.0f);
else
glAlphaFunc(GL_NOTEQUAL, 0.0f);
checkGLcall("glAlphaFunc");
@@ -3886,46 +3722,26 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* Draw a textured quad
*/
- glBegin(GL_QUADS);
-
- glColor3f(1.0f, 1.0f, 1.0f);
- glTexCoord2f(glTexCoord[0], glTexCoord[2]);
- glVertex3f(rect.x1, rect.y1, 0.0f);
-
- glTexCoord2f(glTexCoord[0], glTexCoord[3]);
- glVertex3f(rect.x1, rect.y2, 0.0f);
-
- glTexCoord2f(glTexCoord[1], glTexCoord[3]);
- glVertex3f(rect.x2, rect.y2, 0.0f);
-
- glTexCoord2f(glTexCoord[1], glTexCoord[2]);
- glVertex3f(rect.x2, rect.y1, 0.0f);
-
- glEnd();
- checkGLcall("glEnd");
+ draw_textured_quad(src_surface, &src_rect, &dst_rect, Filter);
if(Flags & (WINEDDBLT_KEYSRC | WINEDDBLT_KEYSRCOVERRIDE)) {
glDisable(GL_ALPHA_TEST);
checkGLcall("glDisable(GL_ALPHA_TEST)");
}
- glBindTexture(Src->texture_target, 0);
- checkGLcall("glBindTexture(Src->texture_target, 0)");
-
/* Restore the color key parameters */
- Src->CKeyFlags = oldCKeyFlags;
- Src->SrcBltCKey = oldBltCKey;
-
- /* Clear the palette as the surface didn't have a palette attached, it would confuse GetPalette and other calls */
- if(paletteOverride)
- Src->palette = NULL;
+ src_surface->CKeyFlags = oldCKeyFlags;
+ src_surface->SrcBltCKey = oldBltCKey;
LEAVE_GL();
/* Leave the opengl state valid for blitting */
- myDevice->blitter->unset_shader((IWineD3DDevice *) myDevice);
+ device->blitter->unset_shader((IWineD3DDevice *)device);
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ if (wined3d_settings.strict_draw_ordering || (dstSwapchain
+ && (dst_surface == dstSwapchain->front_buffer
+ || dstSwapchain->num_contexts > 1)))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
@@ -3933,74 +3749,40 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
/* The surface is now in the drawable. On onscreen surfaces or without fbos the texture
* is outdated now
*/
- IWineD3DSurface_ModifyLocation((IWineD3DSurface *) This, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)dst_surface, SFLAG_INDRAWABLE, TRUE);
return WINED3D_OK;
} else {
/* Source-Less Blit to render target */
if (Flags & WINEDDBLT_COLORFILL) {
- /* This is easy to handle for the D3D Device... */
DWORD color;
TRACE("Colorfill\n");
- /* This == (IWineD3DSurfaceImpl *) myDevice->render_targets[0] || dstSwapchain
- must be true if we are here */
- if (This != (IWineD3DSurfaceImpl *) myDevice->render_targets[0] &&
- !(This == (IWineD3DSurfaceImpl*) dstSwapchain->frontBuffer ||
- (dstSwapchain->backBuffer && This == (IWineD3DSurfaceImpl*) dstSwapchain->backBuffer[0]))) {
- TRACE("Surface is higher back buffer, falling back to software\n");
- return WINED3DERR_INVALIDCALL;
- }
-
/* The color as given in the Blt function is in the format of the frame-buffer...
* 'clear' expect it in ARGB format => we need to do some conversion :-)
*/
- if (This->resource.format_desc->format == WINED3DFMT_P8_UINT)
+ if (!surface_convert_color_to_argb(dst_surface, DDBltFx->u5.dwFillColor, &color))
{
- DWORD alpha;
-
- if (primary_render_target_is_p8(myDevice)) alpha = DDBltFx->u5.dwFillColor << 24;
- else alpha = 0xFF000000;
-
- if (This->palette) {
- color = (alpha |
- (This->palette->palents[DDBltFx->u5.dwFillColor].peRed << 16) |
- (This->palette->palents[DDBltFx->u5.dwFillColor].peGreen << 8) |
- (This->palette->palents[DDBltFx->u5.dwFillColor].peBlue));
- } else {
- color = alpha;
- }
- }
- else if (This->resource.format_desc->format == WINED3DFMT_B5G6R5_UNORM)
- {
- if (DDBltFx->u5.dwFillColor == 0xFFFF) {
- color = 0xFFFFFFFF;
- } else {
- color = ((0xFF000000) |
- ((DDBltFx->u5.dwFillColor & 0xF800) << 8) |
- ((DDBltFx->u5.dwFillColor & 0x07E0) << 5) |
- ((DDBltFx->u5.dwFillColor & 0x001F) << 3));
- }
- }
- else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8_UNORM
- || This->resource.format_desc->format == WINED3DFMT_B8G8R8X8_UNORM)
- {
- color = 0xFF000000 | DDBltFx->u5.dwFillColor;
- }
- else if (This->resource.format_desc->format == WINED3DFMT_B8G8R8A8_UNORM)
- {
- color = DDBltFx->u5.dwFillColor;
- }
- else {
- ERR("Wrong surface type for BLT override(Format doesn't match) !\n");
+ /* The color conversion function already prints an error, so need to do it here */
return WINED3DERR_INVALIDCALL;
}
- TRACE("(%p) executing Render Target override, color = %x\n", This, color);
- IWineD3DDeviceImpl_ClearSurface(myDevice, This, 1 /* Number of rectangles */,
- &rect, WINED3DCLEAR_TARGET, color, 0.0f /* Z */, 0 /* Stencil */);
- return WINED3D_OK;
+ if (ffp_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_COLOR_FILL,
+ NULL, 0, 0, NULL,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
+ {
+ return ffp_blit.color_fill(device, dst_surface, &dst_rect, color);
+ }
+ else if (cpu_blit.blit_supported(&device->adapter->gl_info, BLIT_OP_COLOR_FILL,
+ NULL, 0, 0, NULL,
+ &dst_rect, dst_surface->resource.usage, dst_surface->resource.pool,
+ dst_surface->resource.format_desc))
+ {
+ return cpu_blit.color_fill(device, dst_surface, &dst_rect, color);
+ }
+ return WINED3DERR_INVALIDCALL;
}
}
@@ -4012,7 +3794,7 @@ static HRESULT IWineD3DSurfaceImpl_BltOverride(IWineD3DSurfaceImpl *This, const
static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *DestRect,
IWineD3DSurface *SrcSurface, const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx)
{
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
float depth;
if (Flags & WINEDDBLT_DEPTHFILL) {
@@ -4036,13 +3818,8 @@ static HRESULT IWineD3DSurfaceImpl_BltZ(IWineD3DSurfaceImpl *This, const RECT *D
ERR("Unexpected format for depth fill: %s\n", debug_d3dformat(This->resource.format_desc->format));
}
- return IWineD3DDevice_Clear((IWineD3DDevice *) myDevice,
- DestRect == NULL ? 0 : 1,
- (const WINED3DRECT *)DestRect,
- WINED3DCLEAR_ZBUFFER,
- 0x00000000,
- depth,
- 0x00000000);
+ return IWineD3DDevice_Clear((IWineD3DDevice *)device, DestRect ? 1 : 0, (const WINED3DRECT *)DestRect,
+ WINED3DCLEAR_ZBUFFER, 0x00000000, depth, 0x00000000);
}
FIXME("(%p): Unsupp depthstencil blit\n", This);
@@ -4053,7 +3830,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
const RECT *SrcRect, DWORD Flags, const WINEDDBLTFX *DDBltFx, WINED3DTEXTUREFILTERTYPE Filter) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
IWineD3DSurfaceImpl *Src = (IWineD3DSurfaceImpl *) SrcSurface;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
TRACE("(%p)->(%p,%p,%p,%x,%p)\n", This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx);
TRACE("(%p): Usage is %s\n", This, debug_d3dusage(This->resource.usage));
@@ -4067,8 +3844,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
/* Accessing the depth stencil is supposed to fail between a BeginScene and EndScene pair,
* except depth blits, which seem to work
*/
- if(iface == myDevice->stencilBufferTarget || (SrcSurface && SrcSurface == myDevice->stencilBufferTarget)) {
- if(myDevice->inScene && !(Flags & WINEDDBLT_DEPTHFILL)) {
+ if (This == device->depth_stencil || (Src && Src == device->depth_stencil))
+ {
+ if (device->inScene && !(Flags & WINEDDBLT_DEPTHFILL))
+ {
TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
} else if(IWineD3DSurfaceImpl_BltZ(This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx) == WINED3D_OK) {
@@ -4078,9 +3857,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT
}
/* Special cases for RenderTargets */
- if( (This->resource.usage & WINED3DUSAGE_RENDERTARGET) ||
- ( Src && (Src->resource.usage & WINED3DUSAGE_RENDERTARGET) )) {
- if(IWineD3DSurfaceImpl_BltOverride(This, DestRect, SrcSurface, SrcRect, Flags, DDBltFx, Filter) == WINED3D_OK) return WINED3D_OK;
+ if ((This->resource.usage & WINED3DUSAGE_RENDERTARGET)
+ || (Src && (Src->resource.usage & WINED3DUSAGE_RENDERTARGET)))
+ {
+ if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This, DestRect, Src, SrcRect, Flags, DDBltFx, Filter)))
+ return WINED3D_OK;
}
/* For the rest call the X11 surface implementation.
@@ -4095,7 +3876,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
{
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
IWineD3DSurfaceImpl *srcImpl = (IWineD3DSurfaceImpl *) Source;
- IWineD3DDeviceImpl *myDevice = This->resource.device;
+ IWineD3DDeviceImpl *device = This->resource.device;
TRACE("(%p)->(%d, %d, %p, %p, %08x\n", iface, dstx, dsty, Source, rsrc, trans);
@@ -4105,9 +3886,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
return WINEDDERR_SURFACEBUSY;
}
- if(myDevice->inScene &&
- (iface == myDevice->stencilBufferTarget ||
- (Source == myDevice->stencilBufferTarget))) {
+ if (device->inScene && (This == device->depth_stencil || srcImpl == device->depth_stencil))
+ {
TRACE("Attempt to access the depth stencil surface in a BeginScene / EndScene pair, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
}
@@ -4119,17 +3899,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
RECT SrcRect, DstRect;
DWORD Flags=0;
- if(rsrc) {
- SrcRect.left = rsrc->left;
- SrcRect.top= rsrc->top;
- SrcRect.bottom = rsrc->bottom;
- SrcRect.right = rsrc->right;
- } else {
- SrcRect.left = 0;
- SrcRect.top = 0;
- SrcRect.right = srcImpl->currentDesc.Width;
- SrcRect.bottom = srcImpl->currentDesc.Height;
- }
+ surface_get_rect(srcImpl, rsrc, &SrcRect);
DstRect.left = dstx;
DstRect.top=dsty;
@@ -4146,7 +3916,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD
if(trans & WINEDDBLTFAST_DONOTWAIT)
Flags |= WINEDDBLT_DONOTWAIT;
- if(IWineD3DSurfaceImpl_BltOverride(This, &DstRect, Source, &SrcRect, Flags, NULL, WINED3DTEXF_POINT) == WINED3D_OK) return WINED3D_OK;
+ if (SUCCEEDED(IWineD3DSurfaceImpl_BltOverride(This,
+ &DstRect, srcImpl, &SrcRect, Flags, NULL, WINED3DTEXF_POINT)))
+ return WINED3D_OK;
}
@@ -4166,31 +3938,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_RealizePalette(IWineD3DSurface *iface)
if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|| This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- int bpp;
- GLenum format, internal, type;
- CONVERT_TYPES convert;
-
- /* Check if we are using a RTL mode which uses texturing for uploads */
- BOOL use_texture = (wined3d_settings.rendertargetlock_mode == RTL_READTEX);
-
- /* Check if we have hardware palette conversion if we have convert is set to NO_CONVERSION */
- d3dfmt_get_conv(This, TRUE, use_texture, &format, &internal, &type, &convert, &bpp, FALSE);
-
- if((This->resource.usage & WINED3DUSAGE_RENDERTARGET) && (convert == NO_CONVERSION))
+ if(This->resource.usage & WINED3DUSAGE_RENDERTARGET)
{
- IWineD3DDeviceImpl *device = This->resource.device;
- struct wined3d_context *context;
-
/* Make sure the texture is up to date. This call doesn't do anything if the texture is already up to date. */
IWineD3DSurface_LoadLocation(iface, SFLAG_INTEXTURE, NULL);
/* We want to force a palette refresh, so mark the drawable as not being up to date */
IWineD3DSurface_ModifyLocation(iface, SFLAG_INDRAWABLE, FALSE);
-
- /* Re-upload the palette */
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
- d3dfmt_p8_upload_palette(iface, convert);
- context_release(context);
} else {
if(!(This->Flags & SFLAG_INSYSMEM)) {
TRACE("Palette changed with surface that does not have an up to date system memory copy\n");
@@ -4269,18 +4023,18 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
3: WARN and return WINED3DERR_NOTAVAILABLE;
4: Create the surface, but allow it to be used only for DirectDraw Blts. Some apps(e.g. Swat 3) create textures with a Height of 16 and a Width > 3000 and blt 16x16 letter areas from them to the render target.
*/
- WARN("(%p) Creating an oversized surface: %ux%u (texture is %ux%u)\n",
- This, This->pow2Width, This->pow2Height, This->currentDesc.Width, This->currentDesc.Height);
- This->Flags |= SFLAG_OVERSIZE;
+ if(This->resource.pool == WINED3DPOOL_DEFAULT || This->resource.pool == WINED3DPOOL_MANAGED)
+ {
+ WARN("(%p) Unable to allocate a surface which exceeds the maximum OpenGL texture size\n", This);
+ return WINED3DERR_NOTAVAILABLE;
+ }
- /* This will be initialized on the first blt */
- This->glRect.left = 0;
- This->glRect.top = 0;
- This->glRect.right = 0;
- This->glRect.bottom = 0;
- } else {
- /* Check this after the oversize check - do not make an oversized surface a texture_rectangle one.
- Second also don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE
+ /* We should never use this surface in combination with OpenGL! */
+ TRACE("(%p) Creating an oversized surface: %ux%u\n", This, This->pow2Width, This->pow2Height);
+ }
+ else
+ {
+ /* Don't use ARB_TEXTURE_RECTANGLE in case the surface format is P8 and EXT_PALETTED_TEXTURE
is used in combination with texture uploads (RTL_READTEX/RTL_TEXTEX). The reason is that EXT_PALETTED_TEXTURE
doesn't work in combination with ARB_TEXTURE_RECTANGLE.
*/
@@ -4294,19 +4048,11 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
This->pow2Height = This->currentDesc.Height;
This->Flags &= ~(SFLAG_NONPOW2 | SFLAG_NORMCOORD);
}
-
- /* No oversize, gl rect is the full texture size */
- This->Flags &= ~SFLAG_OVERSIZE;
- This->glRect.left = 0;
- This->glRect.top = 0;
- This->glRect.right = This->pow2Width;
- This->glRect.bottom = This->pow2Height;
}
if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
switch(wined3d_settings.offscreen_rendering_mode) {
case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break;
- case ORM_PBUFFER: This->get_drawable_size = get_drawable_size_pbuffer; break;
case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break;
}
}
@@ -4316,104 +4062,13 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_PrivateSetup(IWineD3DSurface *iface) {
return WINED3D_OK;
}
-struct depth_blt_info
-{
- GLenum binding;
- GLenum bind_target;
- enum tex_types tex_type;
- GLfloat coords[4][3];
-};
-
-static void surface_get_depth_blt_info(GLenum target, GLsizei w, GLsizei h, struct depth_blt_info *info)
-{
- GLfloat (*coords)[3] = info->coords;
-
- switch (target)
- {
- default:
- FIXME("Unsupported texture target %#x\n", target);
- /* Fall back to GL_TEXTURE_2D */
- case GL_TEXTURE_2D:
- info->binding = GL_TEXTURE_BINDING_2D;
- info->bind_target = GL_TEXTURE_2D;
- info->tex_type = tex_2d;
- coords[0][0] = 0.0f; coords[0][1] = 1.0f; coords[0][2] = 0.0f;
- coords[1][0] = 1.0f; coords[1][1] = 1.0f; coords[1][2] = 0.0f;
- coords[2][0] = 0.0f; coords[2][1] = 0.0f; coords[2][2] = 0.0f;
- coords[3][0] = 1.0f; coords[3][1] = 0.0f; coords[3][2] = 0.0f;
- break;
-
- case GL_TEXTURE_RECTANGLE_ARB:
- info->binding = GL_TEXTURE_BINDING_RECTANGLE_ARB;
- info->bind_target = GL_TEXTURE_RECTANGLE_ARB;
- info->tex_type = tex_rect;
- coords[0][0] = 0.0f; coords[0][1] = h; coords[0][2] = 0.0f;
- coords[1][0] = w; coords[1][1] = h; coords[1][2] = 0.0f;
- coords[2][0] = 0.0f; coords[2][1] = 0.0f; coords[2][2] = 0.0f;
- coords[3][0] = w; coords[3][1] = 0.0f; coords[3][2] = 0.0f;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = 1.0f; coords[0][1] = -1.0f; coords[0][2] = 1.0f;
- coords[1][0] = 1.0f; coords[1][1] = -1.0f; coords[1][2] = -1.0f;
- coords[2][0] = 1.0f; coords[2][1] = 1.0f; coords[2][2] = 1.0f;
- coords[3][0] = 1.0f; coords[3][1] = 1.0f; coords[3][2] = -1.0f;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = -1.0f; coords[0][2] = -1.0f;
- coords[1][0] = -1.0f; coords[1][1] = -1.0f; coords[1][2] = 1.0f;
- coords[2][0] = -1.0f; coords[2][1] = 1.0f; coords[2][2] = -1.0f;
- coords[3][0] = -1.0f; coords[3][1] = 1.0f; coords[3][2] = 1.0f;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = 1.0f; coords[0][2] = 1.0f;
- coords[1][0] = 1.0f; coords[1][1] = 1.0f; coords[1][2] = 1.0f;
- coords[2][0] = -1.0f; coords[2][1] = 1.0f; coords[2][2] = -1.0f;
- coords[3][0] = 1.0f; coords[3][1] = 1.0f; coords[3][2] = -1.0f;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = -1.0f; coords[0][2] = -1.0f;
- coords[1][0] = 1.0f; coords[1][1] = -1.0f; coords[1][2] = -1.0f;
- coords[2][0] = -1.0f; coords[2][1] = -1.0f; coords[2][2] = 1.0f;
- coords[3][0] = 1.0f; coords[3][1] = -1.0f; coords[3][2] = 1.0f;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = -1.0f; coords[0][1] = -1.0f; coords[0][2] = 1.0f;
- coords[1][0] = 1.0f; coords[1][1] = -1.0f; coords[1][2] = 1.0f;
- coords[2][0] = -1.0f; coords[2][1] = 1.0f; coords[2][2] = 1.0f;
- coords[3][0] = 1.0f; coords[3][1] = 1.0f; coords[3][2] = 1.0f;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- info->binding = GL_TEXTURE_BINDING_CUBE_MAP_ARB;
- info->bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- info->tex_type = tex_cube;
- coords[0][0] = 1.0f; coords[0][1] = -1.0f; coords[0][2] = -1.0f;
- coords[1][0] = -1.0f; coords[1][1] = -1.0f; coords[1][2] = -1.0f;
- coords[2][0] = 1.0f; coords[2][1] = 1.0f; coords[2][2] = -1.0f;
- coords[3][0] = -1.0f; coords[3][1] = 1.0f; coords[3][2] = -1.0f;
- }
-}
-
/* GL locking is done by the caller */
-static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei w, GLsizei h, GLenum target)
+static void surface_depth_blt(IWineD3DSurfaceImpl *This, const struct wined3d_gl_info *gl_info,
+ GLuint texture, GLsizei w, GLsizei h, GLenum target)
{
IWineD3DDeviceImpl *device = This->resource.device;
- struct depth_blt_info info;
+ GLint compare_mode = GL_NONE;
+ struct blt_info info;
GLint old_binding = 0;
glPushAttrib(GL_ENABLE_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_VIEWPORT_BIT);
@@ -4429,12 +4084,18 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glViewport(0, 0, w, h);
- surface_get_depth_blt_info(target, w, h, &info);
+ surface_get_blt_info(target, NULL, w, h, &info);
GL_EXTCALL(glActiveTextureARB(GL_TEXTURE0_ARB));
glGetIntegerv(info.binding, &old_binding);
glBindTexture(info.bind_target, texture);
+ if (gl_info->supported[ARB_SHADOW])
+ {
+ glGetTexParameteriv(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, &compare_mode);
+ if (compare_mode != GL_NONE) glTexParameteri(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ }
- device->shader_backend->shader_select_depth_blt((IWineD3DDevice *)device, info.tex_type);
+ device->shader_backend->shader_select_depth_blt((IWineD3DDevice *)device,
+ info.tex_type, &This->ds_current_size);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord3fv(info.coords[0]);
@@ -4447,6 +4108,7 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
glVertex2f(1.0f, 1.0f);
glEnd();
+ if (compare_mode != GL_NONE) glTexParameteri(info.bind_target, GL_TEXTURE_COMPARE_MODE_ARB, compare_mode);
glBindTexture(info.bind_target, old_binding);
glPopAttrib();
@@ -4454,139 +4116,156 @@ static void surface_depth_blt(IWineD3DSurfaceImpl *This, GLuint texture, GLsizei
device->shader_backend->shader_deselect_depth_blt((IWineD3DDevice *)device);
}
-void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location) {
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+void surface_modify_ds_location(IWineD3DSurfaceImpl *surface,
+ DWORD location, UINT w, UINT h)
+{
+ TRACE("surface %p, new location %#x, w %u, h %u.\n", surface, location, w, h);
- TRACE("(%p) New location %#x\n", This, location);
+ if (location & ~SFLAG_DS_LOCATIONS)
+ FIXME("Invalid location (%#x) specified.\n", location);
- if (location & ~SFLAG_DS_LOCATIONS) {
- FIXME("(%p) Invalid location (%#x) specified\n", This, location);
- }
-
- This->Flags &= ~SFLAG_DS_LOCATIONS;
- This->Flags |= location;
+ surface->ds_current_size.cx = w;
+ surface->ds_current_size.cy = h;
+ surface->Flags &= ~SFLAG_DS_LOCATIONS;
+ surface->Flags |= location;
}
/* Context activation is done by the caller. */
-void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location)
+void surface_load_ds_location(IWineD3DSurfaceImpl *surface, struct wined3d_context *context, DWORD location)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- IWineD3DDeviceImpl *device = This->resource.device;
+ IWineD3DDeviceImpl *device = surface->resource.device;
const struct wined3d_gl_info *gl_info = context->gl_info;
- TRACE("(%p) New location %#x\n", This, location);
+ TRACE("surface %p, new location %#x.\n", surface, location);
/* TODO: Make this work for modes other than FBO */
if (wined3d_settings.offscreen_rendering_mode != ORM_FBO) return;
- if (This->Flags & location) {
- TRACE("(%p) Location (%#x) is already up to date\n", This, location);
+ if (!(surface->Flags & location))
+ {
+ surface->ds_current_size.cx = 0;
+ surface->ds_current_size.cy = 0;
+ }
+
+ if (surface->ds_current_size.cx == surface->currentDesc.Width
+ && surface->ds_current_size.cy == surface->currentDesc.Height)
+ {
+ TRACE("Location (%#x) is already up to date.\n", location);
return;
}
- if (This->current_renderbuffer) {
- FIXME("(%p) Not supported with fixed up depth stencil\n", This);
+ if (surface->current_renderbuffer)
+ {
+ FIXME("Not supported with fixed up depth stencil.\n");
return;
}
- if (location == SFLAG_DS_OFFSCREEN) {
- if (This->Flags & SFLAG_DS_ONSCREEN) {
- GLint old_binding = 0;
- GLenum bind_target;
-
- TRACE("(%p) Copying onscreen depth buffer to depth texture\n", This);
-
- ENTER_GL();
-
- if (!device->depth_blt_texture) {
- glGenTextures(1, &device->depth_blt_texture);
- }
-
- /* Note that we use depth_blt here as well, rather than glCopyTexImage2D
- * directly on the FBO texture. That's because we need to flip. */
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
- {
- glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- } else {
- glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
- bind_target = GL_TEXTURE_2D;
- }
- glBindTexture(bind_target, device->depth_blt_texture);
- glCopyTexImage2D(bind_target, This->texture_level, This->resource.format_desc->glInternal,
- 0, 0, This->currentDesc.Width, This->currentDesc.Height, 0);
- glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(bind_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glTexParameteri(bind_target, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
- glBindTexture(bind_target, old_binding);
-
- /* Setup the destination */
- if (!device->depth_blt_rb) {
- gl_info->fbo_ops.glGenRenderbuffers(1, &device->depth_blt_rb);
- checkGLcall("glGenRenderbuffersEXT");
- }
- if (device->depth_blt_rb_w != This->currentDesc.Width
- || device->depth_blt_rb_h != This->currentDesc.Height) {
- gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, device->depth_blt_rb);
- checkGLcall("glBindRenderbufferEXT");
- gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8,
- This->currentDesc.Width, This->currentDesc.Height);
- checkGLcall("glRenderbufferStorageEXT");
- device->depth_blt_rb_w = This->currentDesc.Width;
- device->depth_blt_rb_h = This->currentDesc.Height;
- }
-
- context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
- gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER,
- GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, device->depth_blt_rb);
- checkGLcall("glFramebufferRenderbufferEXT");
- context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, iface, FALSE);
-
- /* Do the actual blit */
- surface_depth_blt(This, device->depth_blt_texture, This->currentDesc.Width, This->currentDesc.Height, bind_target);
- checkGLcall("depth_blt");
-
- if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
- else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
-
- LEAVE_GL();
-
- wglFlush(); /* Flush to ensure ordering across contexts. */
- }
- else
- {
- FIXME("No up to date depth stencil location\n");
- }
- } else if (location == SFLAG_DS_ONSCREEN) {
- if (This->Flags & SFLAG_DS_OFFSCREEN) {
- TRACE("(%p) Copying depth texture to onscreen depth buffer\n", This);
-
- ENTER_GL();
-
- context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
- surface_depth_blt(This, This->texture_name, This->currentDesc.Width,
- This->currentDesc.Height, This->texture_target);
- checkGLcall("depth_blt");
-
- if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
-
- LEAVE_GL();
-
- wglFlush(); /* Flush to ensure ordering across contexts. */
- }
- else
- {
- FIXME("No up to date depth stencil location\n");
- }
- } else {
- ERR("(%p) Invalid location (%#x) specified\n", This, location);
+ if (!(surface->Flags & SFLAG_LOCATIONS))
+ {
+ FIXME("No up to date depth stencil location.\n");
+ surface->Flags |= location;
+ return;
}
- This->Flags |= location;
+ if (location == SFLAG_DS_OFFSCREEN)
+ {
+ GLint old_binding = 0;
+ GLenum bind_target;
+
+ TRACE("Copying onscreen depth buffer to depth texture.\n");
+
+ ENTER_GL();
+
+ if (!device->depth_blt_texture)
+ {
+ glGenTextures(1, &device->depth_blt_texture);
+ }
+
+ /* Note that we use depth_blt here as well, rather than glCopyTexImage2D
+ * directly on the FBO texture. That's because we need to flip. */
+ context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ if (surface->texture_target == GL_TEXTURE_RECTANGLE_ARB)
+ {
+ glGetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_ARB, &old_binding);
+ bind_target = GL_TEXTURE_RECTANGLE_ARB;
+ }
+ else
+ {
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &old_binding);
+ bind_target = GL_TEXTURE_2D;
+ }
+ glBindTexture(bind_target, device->depth_blt_texture);
+ glCopyTexImage2D(bind_target, surface->texture_level, surface->resource.format_desc->glInternal,
+ 0, 0, surface->currentDesc.Width, surface->currentDesc.Height, 0);
+ glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
+ glTexParameteri(bind_target, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
+ glBindTexture(bind_target, old_binding);
+
+ /* Setup the destination */
+ if (!device->depth_blt_rb)
+ {
+ gl_info->fbo_ops.glGenRenderbuffers(1, &device->depth_blt_rb);
+ checkGLcall("glGenRenderbuffersEXT");
+ }
+ if (device->depth_blt_rb_w != surface->currentDesc.Width
+ || device->depth_blt_rb_h != surface->currentDesc.Height)
+ {
+ gl_info->fbo_ops.glBindRenderbuffer(GL_RENDERBUFFER, device->depth_blt_rb);
+ checkGLcall("glBindRenderbufferEXT");
+ gl_info->fbo_ops.glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8,
+ surface->currentDesc.Width, surface->currentDesc.Height);
+ checkGLcall("glRenderbufferStorageEXT");
+ device->depth_blt_rb_w = surface->currentDesc.Width;
+ device->depth_blt_rb_h = surface->currentDesc.Height;
+ }
+
+ context_bind_fbo(context, GL_FRAMEBUFFER, &context->dst_fbo);
+ gl_info->fbo_ops.glFramebufferRenderbuffer(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, device->depth_blt_rb);
+ checkGLcall("glFramebufferRenderbufferEXT");
+ context_attach_depth_stencil_fbo(context, GL_FRAMEBUFFER, surface, FALSE);
+
+ /* Do the actual blit */
+ surface_depth_blt(surface, gl_info, device->depth_blt_texture,
+ surface->currentDesc.Width, surface->currentDesc.Height, bind_target);
+ checkGLcall("depth_blt");
+
+ if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
+ else context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+
+ LEAVE_GL();
+
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
+ }
+ else if (location == SFLAG_DS_ONSCREEN)
+ {
+ TRACE("Copying depth texture to onscreen depth buffer.\n");
+
+ ENTER_GL();
+
+ context_bind_fbo(context, GL_FRAMEBUFFER, NULL);
+ surface_depth_blt(surface, gl_info, surface->texture_name,
+ surface->currentDesc.Width, surface->currentDesc.Height, surface->texture_target);
+ checkGLcall("depth_blt");
+
+ if (context->current_fbo) context_bind_fbo(context, GL_FRAMEBUFFER, &context->current_fbo->id);
+
+ LEAVE_GL();
+
+ if (wined3d_settings.strict_draw_ordering) wglFlush(); /* Flush to ensure ordering across contexts. */
+ }
+ else
+ {
+ ERR("Invalid location (%#x) specified.\n", location);
+ }
+
+ surface->Flags |= location;
+ surface->ds_current_size.cx = surface->currentDesc.Width;
+ surface->ds_current_size.cy = surface->currentDesc.Height;
}
static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DWORD flag, BOOL persistent) {
@@ -4597,8 +4276,9 @@ static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DW
TRACE("(%p)->(%s, %s)\n", iface, debug_surflocation(flag),
persistent ? "TRUE" : "FALSE");
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- if (surface_is_offscreen(iface))
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ if (surface_is_offscreen(This))
{
/* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets. */
if (flag & (SFLAG_INTEXTURE | SFLAG_INDRAWABLE)) flag |= (SFLAG_INTEXTURE | SFLAG_INDRAWABLE);
@@ -4643,185 +4323,44 @@ static void WINAPI IWineD3DSurfaceImpl_ModifyLocation(IWineD3DSurface *iface, DW
}
}
-struct coords {
- GLfloat x, y, z;
-};
-
-struct float_rect
-{
- float l;
- float t;
- float r;
- float b;
-};
-
-static inline void cube_coords_float(const RECT *r, UINT w, UINT h, struct float_rect *f)
-{
- f->l = ((r->left * 2.0f) / w) - 1.0f;
- f->t = ((r->top * 2.0f) / h) - 1.0f;
- f->r = ((r->right * 2.0f) / w) - 1.0f;
- f->b = ((r->bottom * 2.0f) / h) - 1.0f;
-}
-
static inline void surface_blt_to_drawable(IWineD3DSurfaceImpl *This, const RECT *rect_in)
{
IWineD3DDeviceImpl *device = This->resource.device;
- IWineD3DBaseTextureImpl *texture;
+ IWineD3DSwapChainImpl *swapchain;
struct wined3d_context *context;
- struct coords coords[4];
- RECT rect;
- GLenum bind_target;
- struct float_rect f;
+ RECT src_rect, dst_rect;
- if(rect_in) {
- rect = *rect_in;
- } else {
- rect.left = 0;
- rect.top = 0;
- rect.right = This->currentDesc.Width;
- rect.bottom = This->currentDesc.Height;
- }
-
- switch (This->texture_target)
- {
- case GL_TEXTURE_2D:
- bind_target = GL_TEXTURE_2D;
-
- coords[0].x = (float)rect.left / This->pow2Width;
- coords[0].y = (float)rect.top / This->pow2Height;
- coords[0].z = 0;
-
- coords[1].x = (float)rect.left / This->pow2Width;
- coords[1].y = (float)rect.bottom / This->pow2Height;
- coords[1].z = 0;
-
- coords[2].x = (float)rect.right / This->pow2Width;
- coords[2].y = (float)rect.bottom / This->pow2Height;
- coords[2].z = 0;
-
- coords[3].x = (float)rect.right / This->pow2Width;
- coords[3].y = (float)rect.top / This->pow2Height;
- coords[3].z = 0;
- break;
-
- case GL_TEXTURE_RECTANGLE_ARB:
- bind_target = GL_TEXTURE_RECTANGLE_ARB;
- coords[0].x = rect.left; coords[0].y = rect.top; coords[0].z = 0;
- coords[1].x = rect.left; coords[1].y = rect.bottom; coords[1].z = 0;
- coords[2].x = rect.right; coords[2].y = rect.bottom; coords[2].z = 0;
- coords[3].x = rect.right; coords[3].y = rect.top; coords[3].z = 0;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = 1; coords[0].y = -f.t; coords[0].z = -f.l;
- coords[1].x = 1; coords[1].y = -f.b; coords[1].z = -f.l;
- coords[2].x = 1; coords[2].y = -f.b; coords[2].z = -f.r;
- coords[3].x = 1; coords[3].y = -f.t; coords[3].z = -f.r;
- break;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = -1; coords[0].y = -f.t; coords[0].z = f.l;
- coords[1].x = -1; coords[1].y = -f.b; coords[1].z = f.l;
- coords[2].x = -1; coords[2].y = -f.b; coords[2].z = f.r;
- coords[3].x = -1; coords[3].y = -f.t; coords[3].z = f.r;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = f.l; coords[0].y = 1; coords[0].z = f.t;
- coords[1].x = f.l; coords[1].y = 1; coords[1].z = f.b;
- coords[2].x = f.r; coords[2].y = 1; coords[2].z = f.b;
- coords[3].x = f.r; coords[3].y = 1; coords[3].z = f.t;
- break;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = f.l; coords[0].y = -1; coords[0].z = -f.t;
- coords[1].x = f.l; coords[1].y = -1; coords[1].z = -f.b;
- coords[2].x = f.r; coords[2].y = -1; coords[2].z = -f.b;
- coords[3].x = f.r; coords[3].y = -1; coords[3].z = -f.t;
- break;
-
- case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = f.l; coords[0].y = -f.t; coords[0].z = 1;
- coords[1].x = f.l; coords[1].y = -f.b; coords[1].z = 1;
- coords[2].x = f.r; coords[2].y = -f.b; coords[2].z = 1;
- coords[3].x = f.r; coords[3].y = -f.t; coords[3].z = 1;
- break;
-
- case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
- bind_target = GL_TEXTURE_CUBE_MAP_ARB;
- cube_coords_float(&rect, This->pow2Width, This->pow2Height, &f);
- coords[0].x = -f.l; coords[0].y = -f.t; coords[0].z = -1;
- coords[1].x = -f.l; coords[1].y = -f.b; coords[1].z = -1;
- coords[2].x = -f.r; coords[2].y = -f.b; coords[2].z = -1;
- coords[3].x = -f.r; coords[3].y = -f.t; coords[3].z = -1;
- break;
-
- default:
- ERR("Unexpected texture target %#x\n", This->texture_target);
- return;
- }
-
- context = context_acquire(device, (IWineD3DSurface*)This, CTXUSAGE_BLIT);
-
- ENTER_GL();
-
- glEnable(bind_target);
- checkGLcall("glEnable(bind_target)");
- glBindTexture(bind_target, This->texture_name);
- checkGLcall("glBindTexture(bind_target, This->texture_name)");
- glTexParameteri(bind_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- checkGLcall("glTexParameteri");
- glTexParameteri(bind_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- checkGLcall("glTexParameteri");
+ surface_get_rect(This, rect_in, &src_rect);
+ context = context_acquire(device, This);
+ context_apply_blit_state(context, device);
if (context->render_offscreen)
{
- LONG tmp = rect.top;
- rect.top = rect.bottom;
- rect.bottom = tmp;
+ dst_rect.left = src_rect.left;
+ dst_rect.right = src_rect.right;
+ dst_rect.top = src_rect.bottom;
+ dst_rect.bottom = src_rect.top;
+ }
+ else
+ {
+ dst_rect = src_rect;
}
- glBegin(GL_QUADS);
- glTexCoord3fv(&coords[0].x);
- glVertex2i(rect.left, rect.top);
+ if ((This->Flags & SFLAG_SWAPCHAIN) && This == ((IWineD3DSwapChainImpl *)This->container)->front_buffer)
+ surface_translate_frontbuffer_coords(This, context->win_handle, &dst_rect);
- glTexCoord3fv(&coords[1].x);
- glVertex2i(rect.left, rect.bottom);
-
- glTexCoord3fv(&coords[2].x);
- glVertex2i(rect.right, rect.bottom);
-
- glTexCoord3fv(&coords[3].x);
- glVertex2i(rect.right, rect.top);
- glEnd();
- checkGLcall("glEnd");
-
- glDisable(bind_target);
- checkGLcall("glDisable(bind_target)");
+ device->blitter->set_shader((IWineD3DDevice *) device, This);
+ ENTER_GL();
+ draw_textured_quad(This, &src_rect, &dst_rect, WINED3DTEXF_POINT);
LEAVE_GL();
- wglFlush(); /* Flush to ensure ordering across contexts. */
+ device->blitter->set_shader((IWineD3DDevice *) device, This);
- /* We changed the filtering settings on the texture. Inform the
- * container about this to get the filters reset properly next draw. */
- if (SUCCEEDED(IWineD3DSurface_GetContainer((IWineD3DSurface *)This, &IID_IWineD3DBaseTexture, (void **)&texture)))
- {
- texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MAGFILTER] = WINED3DTEXF_POINT;
- texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MINFILTER] = WINED3DTEXF_POINT;
- texture->baseTexture.texture_rgb.states[WINED3DTEXSTA_MIPFILTER] = WINED3DTEXF_NONE;
- IWineD3DBaseTexture_Release((IWineD3DBaseTexture *)texture);
- }
+ swapchain = (This->Flags & SFLAG_SWAPCHAIN) ? (IWineD3DSwapChainImpl *)This->container : NULL;
+ if (wined3d_settings.strict_draw_ordering || (swapchain
+ && (This == swapchain->front_buffer || swapchain->num_contexts > 1)))
+ wglFlush(); /* Flush to ensure ordering across contexts. */
context_release(context);
}
@@ -4851,16 +4390,32 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
IWineD3DDeviceImpl *device = This->resource.device;
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- GLenum format, internal, type;
+ struct wined3d_format_desc desc;
CONVERT_TYPES convert;
- int bpp;
int width, pitch, outpitch;
BYTE *mem;
BOOL drawable_read_ok = TRUE;
BOOL in_fbo = FALSE;
- if (wined3d_settings.offscreen_rendering_mode == ORM_FBO) {
- if (surface_is_offscreen(iface))
+ if (This->resource.usage & WINED3DUSAGE_DEPTHSTENCIL)
+ {
+ if (flag == SFLAG_INTEXTURE)
+ {
+ struct wined3d_context *context = context_acquire(device, NULL);
+ surface_load_ds_location(This, context, SFLAG_DS_OFFSCREEN);
+ context_release(context);
+ return WINED3D_OK;
+ }
+ else
+ {
+ FIXME("Unimplemented location %#x for depth/stencil buffers.\n", flag);
+ return WINED3DERR_INVALIDCALL;
+ }
+ }
+
+ if (wined3d_settings.offscreen_rendering_mode == ORM_FBO)
+ {
+ if (surface_is_offscreen(This))
{
/* With ORM_FBO, SFLAG_INTEXTURE and SFLAG_INDRAWABLE are the same for offscreen targets.
* Prefer SFLAG_INTEXTURE. */
@@ -4898,10 +4453,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
{
struct wined3d_context *context = NULL;
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
surface_bind_and_dirtify(This, !(This->Flags & SFLAG_INTEXTURE));
- surface_download_data(This);
+ surface_download_data(This, gl_info);
if (context) context_release(context);
}
@@ -4916,6 +4471,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
if(This->Flags & SFLAG_INTEXTURE) {
surface_blt_to_drawable(This, rect);
} else {
+ int byte_count;
if((This->Flags & SFLAG_LOCATIONS) == SFLAG_INSRGBTEX) {
/* This needs a shader to convert the srgb data sampled from the GL texture into RGB
* values, otherwise we get incorrect values in the target. For now go the slow way
@@ -4924,7 +4480,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect);
}
- d3dfmt_get_conv(This, TRUE /* We need color keying */, FALSE /* We won't use textures */, &format, &internal, &type, &convert, &bpp, FALSE);
+ d3dfmt_get_conv(This, FALSE /* We need color keying */, FALSE /* We won't use textures */, &desc, &convert);
/* The width is in 'length' not in bytes */
width = This->currentDesc.Width;
@@ -4938,16 +4494,17 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
TRACE("Removing the pbo attached to surface %p\n", This);
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
- surface_remove_pbo(This);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
+ surface_remove_pbo(This, gl_info);
if (context) context_release(context);
}
if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
int height = This->currentDesc.Height;
+ byte_count = desc.conv_byte_count;
/* Stick to the alignment for the converted surface too, makes it easier to load the surface */
- outpitch = width * bpp;
+ outpitch = width * byte_count;
outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
@@ -4961,9 +4518,10 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
} else {
This->Flags &= ~SFLAG_CONVERTED;
mem = This->resource.allocatedMemory;
+ byte_count = desc.byte_count;
}
- flush_to_framebuffer_drawpixels(This, format, type, bpp, mem);
+ flush_to_framebuffer_drawpixels(This, desc.glFormat, desc.glType, byte_count, mem);
/* Don't delete PBO memory */
if((mem != This->resource.allocatedMemory) && !(This->Flags & SFLAG_PBO))
@@ -4980,7 +4538,7 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
struct wined3d_context *context = NULL;
d3dfmt_get_conv(This, TRUE /* We need color keying */, TRUE /* We will use textures */,
- &format, &internal, &type, &convert, &bpp, srgb);
+ &desc, &convert);
if(srgb) {
if((This->Flags & (SFLAG_INTEXTURE | SFLAG_INSYSMEM)) == SFLAG_INTEXTURE) {
@@ -5002,9 +4560,9 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
IWineD3DSurfaceImpl_LoadLocation(iface, SFLAG_INSYSMEM, rect);
}
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
- surface_prepare_texture(This, srgb);
+ surface_prepare_texture(This, gl_info, srgb);
surface_bind_and_dirtify(This, srgb);
if(This->CKeyFlags & WINEDDSD_CKSRCBLT) {
@@ -5019,16 +4577,32 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
/* Don't use PBOs for converted surfaces. During PBO conversion we look at SFLAG_CONVERTED
* but it isn't set (yet) in all cases it is getting called. */
- if((convert != NO_CONVERSION) && (This->Flags & SFLAG_PBO)) {
+ if(((convert != NO_CONVERSION) || desc.convert) && (This->Flags & SFLAG_PBO)) {
TRACE("Removing the pbo attached to surface %p\n", This);
- surface_remove_pbo(This);
+ surface_remove_pbo(This, gl_info);
}
- if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
+ if(desc.convert) {
+ /* This code is entered for texture formats which need a fixup. */
int height = This->currentDesc.Height;
/* Stick to the alignment for the converted surface too, makes it easier to load the surface */
- outpitch = width * bpp;
+ outpitch = width * desc.conv_byte_count;
+ outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
+
+ mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
+ if(!mem) {
+ ERR("Out of memory %d, %d!\n", outpitch, height);
+ if (context) context_release(context);
+ return WINED3DERR_OUTOFVIDEOMEMORY;
+ }
+ desc.convert(This->resource.allocatedMemory, mem, pitch, width, height);
+ } else if((convert != NO_CONVERSION) && This->resource.allocatedMemory) {
+ /* This code is only entered for color keying fixups */
+ int height = This->currentDesc.Height;
+
+ /* Stick to the alignment for the converted surface too, makes it easier to load the surface */
+ outpitch = width * desc.conv_byte_count;
outpitch = (outpitch + device->surface_alignment - 1) & ~(device->surface_alignment - 1);
mem = HeapAlloc(GetProcessHeap(), 0, outpitch * height);
@@ -5038,12 +4612,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
return WINED3DERR_OUTOFVIDEOMEMORY;
}
d3dfmt_convert_surface(This->resource.allocatedMemory, mem, pitch, width, height, outpitch, convert, This);
- }
- else if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
- && (gl_info->supported[EXT_PALETTED_TEXTURE] || device->blitter->color_fixup_supported(This->resource.format_desc->color_fixup)))
- {
- d3dfmt_p8_upload_palette(iface, convert);
- mem = This->resource.allocatedMemory;
} else {
mem = This->resource.allocatedMemory;
}
@@ -5053,19 +4621,8 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_LoadLocation(IWineD3DSurface *iface, D
glPixelStorei(GL_UNPACK_ROW_LENGTH, width);
LEAVE_GL();
- if ((This->Flags & SFLAG_NONPOW2) && !(This->Flags & SFLAG_OVERSIZE)) {
- TRACE("non power of two support\n");
- if (mem || (This->Flags & SFLAG_PBO)) {
- surface_upload_data(This, internal, This->currentDesc.Width, This->currentDesc.Height, format, type, mem);
- }
- } else {
- /* When making the realloc conditional, keep in mind that GL_APPLE_client_storage may be in use, and This->resource.allocatedMemory
- * changed. So also keep track of memory changes. In this case the texture has to be reallocated
- */
- if (mem || (This->Flags & SFLAG_PBO)) {
- surface_upload_data(This, internal, This->glRect.right - This->glRect.left, This->glRect.bottom - This->glRect.top, format, type, mem);
- }
- }
+ if (mem || (This->Flags & SFLAG_PBO))
+ surface_upload_data(This, gl_info, &desc, srgb, mem);
/* Restore the default pitch */
ENTER_GL();
@@ -5107,7 +4664,6 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_SetContainer(IWineD3DSurface *iface, I
} else if(This->resource.usage & WINED3DUSAGE_RENDERTARGET) {
switch(wined3d_settings.offscreen_rendering_mode) {
case ORM_FBO: This->get_drawable_size = get_drawable_size_fbo; break;
- case ORM_PBUFFER: This->get_drawable_size = get_drawable_size_pbuffer; break;
case ORM_BACKBUFFER: This->get_drawable_size = get_drawable_size_backbuffer; break;
}
}
@@ -5141,16 +4697,15 @@ static HRESULT WINAPI IWineD3DSurfaceImpl_DrawOverlay(IWineD3DSurface *iface) {
return hr;
}
-BOOL surface_is_offscreen(IWineD3DSurface *iface)
+BOOL surface_is_offscreen(IWineD3DSurfaceImpl *surface)
{
- IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
- IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *) This->container;
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)surface->container;
/* Not on a swapchain - must be offscreen */
- if (!(This->Flags & SFLAG_SWAPCHAIN)) return TRUE;
+ if (!(surface->Flags & SFLAG_SWAPCHAIN)) return TRUE;
/* The front buffer is always onscreen */
- if(iface == swapchain->frontBuffer) return FALSE;
+ if (surface == swapchain->front_buffer) return FALSE;
/* If the swapchain is rendered to an FBO, the backbuffer is
* offscreen, otherwise onscreen */
@@ -5212,20 +4767,42 @@ const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl =
IWineD3DSurfaceImpl_GetImplType,
IWineD3DSurfaceImpl_DrawOverlay
};
-#undef GLINFO_LOCATION
-#define GLINFO_LOCATION device->adapter->gl_info
static HRESULT ffp_blit_alloc(IWineD3DDevice *iface) { return WINED3D_OK; }
/* Context activation is done by the caller. */
static void ffp_blit_free(IWineD3DDevice *iface) { }
+/* This function is used in case of 8bit paletted textures using GL_EXT_paletted_texture */
/* Context activation is done by the caller. */
-static HRESULT ffp_blit_set(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height)
+static void ffp_blit_p8_upload_palette(IWineD3DSurfaceImpl *surface, const struct wined3d_gl_info *gl_info)
{
+ BYTE table[256][4];
+ BOOL colorkey_active = (surface->CKeyFlags & WINEDDSD_CKSRCBLT) ? TRUE : FALSE;
+
+ d3dfmt_p8_init_palette(surface, table, colorkey_active);
+
+ TRACE("Using GL_EXT_PALETTED_TEXTURE for 8-bit paletted texture support\n");
ENTER_GL();
- glEnable(textype);
- checkGLcall("glEnable(textype)");
+ GL_EXTCALL(glColorTableEXT(surface->texture_target, GL_RGBA, 256, GL_RGBA, GL_UNSIGNED_BYTE, table));
+ LEAVE_GL();
+}
+
+/* Context activation is done by the caller. */
+static HRESULT ffp_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
+{
+ IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) iface;
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+ enum complex_fixup fixup = get_complex_fixup(surface->resource.format_desc->color_fixup);
+
+ /* When EXT_PALETTED_TEXTURE is around, palette conversion is done by the GPU
+ * else the surface is converted in software at upload time in LoadLocation.
+ */
+ if(fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
+ ffp_blit_p8_upload_palette(surface, gl_info);
+
+ ENTER_GL();
+ glEnable(surface->texture_target);
+ checkGLcall("glEnable(surface->texture_target)");
LEAVE_GL();
return WINED3D_OK;
}
@@ -5252,16 +4829,52 @@ static void ffp_blit_unset(IWineD3DDevice *iface)
LEAVE_GL();
}
-static BOOL ffp_blit_color_fixup_supported(struct color_fixup_desc fixup)
+static BOOL ffp_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
{
+ enum complex_fixup src_fixup;
+
+ if (blit_op == BLIT_OP_COLOR_FILL)
+ {
+ if (!(dst_usage & WINED3DUSAGE_RENDERTARGET))
+ {
+ TRACE("Color fill not supported\n");
+ return FALSE;
+ }
+
+ return TRUE;
+ }
+
+ src_fixup = get_complex_fixup(src_format_desc->color_fixup);
if (TRACE_ON(d3d_surface) && TRACE_ON(d3d))
{
TRACE("Checking support for fixup:\n");
- dump_color_fixup_desc(fixup);
+ dump_color_fixup_desc(src_format_desc->color_fixup);
+ }
+
+ if (blit_op != BLIT_OP_BLIT)
+ {
+ TRACE("Unsupported blit_op=%d\n", blit_op);
+ return FALSE;
+ }
+
+ if (!is_identity_fixup(dst_format_desc->color_fixup))
+ {
+ TRACE("Destination fixups are not supported\n");
+ return FALSE;
+ }
+
+ if (src_fixup == COMPLEX_FIXUP_P8 && gl_info->supported[EXT_PALETTED_TEXTURE])
+ {
+ TRACE("P8 fixup supported\n");
+ return TRUE;
}
/* We only support identity conversions. */
- if (is_identity_fixup(fixup))
+ if (is_identity_fixup(src_format_desc->color_fixup))
{
TRACE("[OK]\n");
return TRUE;
@@ -5271,10 +4884,105 @@ static BOOL ffp_blit_color_fixup_supported(struct color_fixup_desc fixup)
return FALSE;
}
+static HRESULT ffp_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color)
+{
+ return IWineD3DDeviceImpl_ClearSurface(device, dst_surface, 1 /* Number of rectangles */,
+ (const WINED3DRECT*)dst_rect, WINED3DCLEAR_TARGET, fill_color, 0.0f /* Z */, 0 /* Stencil */);
+}
+
const struct blit_shader ffp_blit = {
ffp_blit_alloc,
ffp_blit_free,
ffp_blit_set,
ffp_blit_unset,
- ffp_blit_color_fixup_supported
+ ffp_blit_supported,
+ ffp_blit_color_fill
};
+
+static HRESULT cpu_blit_alloc(IWineD3DDevice *iface)
+{
+ return WINED3D_OK;
+}
+
+/* Context activation is done by the caller. */
+static void cpu_blit_free(IWineD3DDevice *iface)
+{
+}
+
+/* Context activation is done by the caller. */
+static HRESULT cpu_blit_set(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface)
+{
+ return WINED3D_OK;
+}
+
+/* Context activation is done by the caller. */
+static void cpu_blit_unset(IWineD3DDevice *iface)
+{
+}
+
+static BOOL cpu_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
+{
+ if (blit_op == BLIT_OP_COLOR_FILL)
+ {
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static HRESULT cpu_blit_color_fill(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color)
+{
+ WINEDDBLTFX BltFx;
+ memset(&BltFx, 0, sizeof(BltFx));
+ BltFx.dwSize = sizeof(BltFx);
+ BltFx.u5.dwFillColor = color_convert_argb_to_fmt(fill_color, dst_surface->resource.format_desc->format);
+ return IWineD3DBaseSurfaceImpl_Blt((IWineD3DSurface*)dst_surface, dst_rect, NULL, NULL, WINEDDBLT_COLORFILL, &BltFx, WINED3DTEXF_POINT);
+}
+
+const struct blit_shader cpu_blit = {
+ cpu_blit_alloc,
+ cpu_blit_free,
+ cpu_blit_set,
+ cpu_blit_unset,
+ cpu_blit_supported,
+ cpu_blit_color_fill
+};
+
+static BOOL fbo_blit_supported(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool,
+ const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool,
+ const struct wined3d_format_desc *dst_format_desc)
+{
+ if ((wined3d_settings.offscreen_rendering_mode != ORM_FBO) || !gl_info->fbo_ops.glBlitFramebuffer)
+ return FALSE;
+
+ /* We only support blitting. Things like color keying / color fill should
+ * be handled by other blitters.
+ */
+ if (blit_op != BLIT_OP_BLIT)
+ return FALSE;
+
+ /* Source and/or destination need to be on the GL side */
+ if (src_pool == WINED3DPOOL_SYSTEMMEM || dst_pool == WINED3DPOOL_SYSTEMMEM)
+ return FALSE;
+
+ if(!((src_format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (src_usage & WINED3DUSAGE_RENDERTARGET))
+ && ((dst_format_desc->Flags & WINED3DFMT_FLAG_FBO_ATTACHABLE) || (dst_usage & WINED3DUSAGE_RENDERTARGET)))
+ return FALSE;
+
+ if (!is_identity_fixup(src_format_desc->color_fixup) ||
+ !is_identity_fixup(dst_format_desc->color_fixup))
+ return FALSE;
+
+ if (!(src_format_desc->format == dst_format_desc->format
+ || (is_identity_fixup(src_format_desc->color_fixup)
+ && is_identity_fixup(dst_format_desc->color_fixup))))
+ return FALSE;
+
+ return TRUE;
+}
diff --git a/dll/directx/wine/wined3d/surface_base.c b/dll/directx/wine/wined3d/surface_base.c
index 33e3d3ed885..2b6cdb41f22 100644
--- a/dll/directx/wine/wined3d/surface_base.c
+++ b/dll/directx/wine/wined3d/surface_base.c
@@ -83,9 +83,6 @@ static inline unsigned short float_32_to_16(const float *in)
return ret;
}
-
-/* Do NOT define GLINFO_LOCATION in this file. THIS CODE MUST NOT USE IT */
-
/* *******************************************
IWineD3DSurface IUnknown parts follow
******************************************* */
@@ -326,7 +323,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_GetPalette(IWineD3DSurface *iface, IWineD
DWORD WINAPI IWineD3DBaseSurfaceImpl_GetPitch(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *) iface;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
DWORD ret;
TRACE("(%p)\n", This);
@@ -502,7 +499,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWin
HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format,
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format,
&This->resource.device->adapter->gl_info);
if (This->resource.format_desc->format != WINED3DFMT_UNKNOWN)
@@ -527,7 +524,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3D
HRESULT IWineD3DBaseSurfaceImpl_CreateDIBSection(IWineD3DSurface *iface) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
int extraline = 0;
SYSTEM_INFO sysInfo;
BITMAPINFO* b_info;
@@ -742,6 +739,55 @@ static void convert_a8r8g8b8_x8r8g8b8(const BYTE *src, BYTE *dst,
}
}
+static inline BYTE cliptobyte(int x)
+{
+ return (BYTE) ((x < 0) ? 0 : ((x > 255) ? 255 : x));
+}
+
+static void convert_yuy2_x8r8g8b8(const BYTE *src, BYTE *dst,
+ DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h)
+{
+ unsigned int x, y;
+ int c2, d, e, r2 = 0, g2 = 0, b2 = 0;
+
+ TRACE("Converting %ux%u pixels, pitches %u %u\n", w, h, pitch_in, pitch_out);
+
+ for (y = 0; y < h; ++y)
+ {
+ const BYTE *src_line = src + y * pitch_in;
+ DWORD *dst_line = (DWORD *)(dst + y * pitch_out);
+ for (x = 0; x < w; ++x)
+ {
+ /* YUV to RGB conversion formulas from http://en.wikipedia.org/wiki/YUV:
+ * C = Y - 16; D = U - 128; E = V - 128;
+ * R = cliptobyte((298 * C + 409 * E + 128) >> 8);
+ * G = cliptobyte((298 * C - 100 * D - 208 * E + 128) >> 8);
+ * B = cliptobyte((298 * C + 516 * D + 128) >> 8);
+ * Two adjacent YUY2 pixels are stored as four bytes: Y0 U Y1 V .
+ * U and V are shared between the pixels.
+ */
+ if (!(x & 1)) /* for every even pixel, read new U and V */
+ {
+ d = (int) src_line[1] - 128;
+ e = (int) src_line[3] - 128;
+ r2 = 409 * e + 128;
+ g2 = - 100 * d - 208 * e + 128;
+ b2 = 516 * d + 128;
+ }
+ c2 = 298 * ((int) src_line[0] - 16);
+ dst_line[x] = 0xff000000
+ | cliptobyte((c2 + r2) >> 8) << 16 /* red */
+ | cliptobyte((c2 + g2) >> 8) << 8 /* green */
+ | cliptobyte((c2 + b2) >> 8); /* blue */
+ /* Scale RGB values to 0..255 range,
+ * then clip them if still not in range (may be negative),
+ * then shift them within DWORD if necessary.
+ */
+ src_line += 2;
+ }
+ }
+}
+
struct d3dfmt_convertor_desc {
WINED3DFORMAT from, to;
void (*convert)(const BYTE *src, BYTE *dst, DWORD pitch_in, DWORD pitch_out, unsigned int w, unsigned int h);
@@ -752,6 +798,7 @@ static const struct d3dfmt_convertor_desc convertors[] =
{WINED3DFMT_R32_FLOAT, WINED3DFMT_R16_FLOAT, convert_r32_float_r16_float},
{WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_B8G8R8X8_UNORM, convert_r5g6b5_x8r8g8b8},
{WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_B8G8R8X8_UNORM, convert_a8r8g8b8_x8r8g8b8},
+ {WINED3DFMT_YUY2, WINED3DFMT_B8G8R8X8_UNORM, convert_yuy2_x8r8g8b8},
};
static inline const struct d3dfmt_convertor_desc *find_convertor(WINED3DFORMAT from, WINED3DFORMAT to)
@@ -892,7 +939,7 @@ static HRESULT
/*****************************************************************************
* IWineD3DSurface::Blt, SW emulation version
*
- * Performs blits to a surface, eigher from a source of source-less blts
+ * Performs a blit to a surface, with or without a source surface.
* This is the main functionality of DirectDraw
*
* Params:
@@ -909,7 +956,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
HRESULT ret = WINED3D_OK;
WINED3DLOCKED_RECT dlock, slock;
int bpp, srcheight, srcwidth, dstheight, dstwidth, width;
- const struct GlPixelFormatDesc *sEntry, *dEntry;
+ const struct wined3d_format_desc *sEntry, *dEntry;
int x, y;
const BYTE *sbuf;
BYTE *dbuf;
@@ -943,144 +990,145 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_Blt(IWineD3DSurface *iface, const RECT *D
FIXME("Filters not supported in software blit\n");
}
- /* First check for the validity of source / destination rectangles. This was
- * verified using a test application + by MSDN.
- */
- if ((Src != NULL) && (SrcRect != NULL) &&
- ((SrcRect->bottom > Src->currentDesc.Height)||(SrcRect->bottom < 0) ||
- (SrcRect->top > Src->currentDesc.Height)||(SrcRect->top < 0) ||
- (SrcRect->left > Src->currentDesc.Width) ||(SrcRect->left < 0) ||
- (SrcRect->right > Src->currentDesc.Width) ||(SrcRect->right < 0) ||
- (SrcRect->right < SrcRect->left) ||(SrcRect->bottom < SrcRect->top)))
- {
- WARN("Application gave us bad source rectangle for Blt.\n");
- return WINEDDERR_INVALIDRECT;
- }
- /* For the Destination rect, it can be out of bounds on the condition that a clipper
- * is set for the given surface.
- */
- if ((/*This->clipper == NULL*/ TRUE) && (DestRect) &&
- ((DestRect->bottom > This->currentDesc.Height)||(DestRect->bottom < 0) ||
- (DestRect->top > This->currentDesc.Height)||(DestRect->top < 0) ||
- (DestRect->left > This->currentDesc.Width) ||(DestRect->left < 0) ||
- (DestRect->right > This->currentDesc.Width) ||(DestRect->right < 0) ||
- (DestRect->right < DestRect->left) ||(DestRect->bottom < DestRect->top)))
- {
- WARN("Application gave us bad destination rectangle for Blt without a clipper set.\n");
- return WINEDDERR_INVALIDRECT;
- }
+ /* First check for the validity of source / destination rectangles.
+ * This was verified using a test application + by MSDN. */
- /* Now handle negative values in the rectangles. Warning: only supported for now
- in the 'simple' cases (ie not in any stretching / rotation cases).
-
- First, the case where nothing is to be done.
- */
- if ((DestRect && ((DestRect->bottom <= 0) || (DestRect->right <= 0) ||
- (DestRect->top >= (int) This->currentDesc.Height) ||
- (DestRect->left >= (int) This->currentDesc.Width))) ||
- ((Src != NULL) && (SrcRect != NULL) &&
- ((SrcRect->bottom <= 0) || (SrcRect->right <= 0) ||
- (SrcRect->top >= (int) Src->currentDesc.Height) ||
- (SrcRect->left >= (int) Src->currentDesc.Width)) ))
+ if (SrcRect)
{
- TRACE("Nothing to be done !\n");
- return WINED3D_OK;
+ if (Src)
+ {
+ if (SrcRect->right < SrcRect->left || SrcRect->bottom < SrcRect->top
+ || SrcRect->left > Src->currentDesc.Width || SrcRect->left < 0
+ || SrcRect->top > Src->currentDesc.Height || SrcRect->top < 0
+ || SrcRect->right > Src->currentDesc.Width || SrcRect->right < 0
+ || SrcRect->bottom > Src->currentDesc.Height || SrcRect->bottom < 0)
+ {
+ WARN("Application gave us bad source rectangle for Blt.\n");
+ return WINEDDERR_INVALIDRECT;
+ }
+
+ if (!SrcRect->right || !SrcRect->bottom
+ || SrcRect->left == (int)Src->currentDesc.Width
+ || SrcRect->top == (int)Src->currentDesc.Height)
+ {
+ TRACE("Nothing to be done.\n");
+ return WINED3D_OK;
+ }
+ }
+
+ xsrc = *SrcRect;
+ }
+ else if (Src)
+ {
+ xsrc.left = 0;
+ xsrc.top = 0;
+ xsrc.right = Src->currentDesc.Width;
+ xsrc.bottom = Src->currentDesc.Height;
+ }
+ else
+ {
+ memset(&xsrc, 0, sizeof(xsrc));
}
if (DestRect)
{
- xdst = *DestRect;
- }
- else
- {
- xdst.top = 0;
- xdst.bottom = This->currentDesc.Height;
- xdst.left = 0;
- xdst.right = This->currentDesc.Width;
- }
-
- if (SrcRect)
- {
- xsrc = *SrcRect;
- }
- else
- {
- if (Src)
+ /* For the Destination rect, it can be out of bounds on the condition
+ * that a clipper is set for the given surface. */
+ if (!This->clipper && (DestRect->right < DestRect->left || DestRect->bottom < DestRect->top
+ || DestRect->left > This->currentDesc.Width || DestRect->left < 0
+ || DestRect->top > This->currentDesc.Height || DestRect->top < 0
+ || DestRect->right > This->currentDesc.Width || DestRect->right < 0
+ || DestRect->bottom > This->currentDesc.Height || DestRect->bottom < 0))
{
- xsrc.top = 0;
- xsrc.bottom = Src->currentDesc.Height;
- xsrc.left = 0;
- xsrc.right = Src->currentDesc.Width;
+ WARN("Application gave us bad destination rectangle for Blt without a clipper set.\n");
+ return WINEDDERR_INVALIDRECT;
+ }
+
+ if (DestRect->right <= 0 || DestRect->bottom <= 0
+ || DestRect->left >= (int)This->currentDesc.Width
+ || DestRect->top >= (int)This->currentDesc.Height)
+ {
+ TRACE("Nothing to be done.\n");
+ return WINED3D_OK;
+ }
+
+ if (!Src)
+ {
+ RECT full_rect;
+
+ full_rect.left = 0;
+ full_rect.top = 0;
+ full_rect.right = This->currentDesc.Width;
+ full_rect.bottom = This->currentDesc.Height;
+ IntersectRect(&xdst, &full_rect, DestRect);
}
else
{
- memset(&xsrc,0,sizeof(xsrc));
+ BOOL clip_horiz, clip_vert;
+
+ xdst = *DestRect;
+ clip_horiz = xdst.left < 0 || xdst.right > (int)This->currentDesc.Width;
+ clip_vert = xdst.top < 0 || xdst.bottom > (int)This->currentDesc.Height;
+
+ if (clip_vert || clip_horiz)
+ {
+ /* Now check if this is a special case or not... */
+ if ((Flags & WINEDDBLT_DDFX)
+ || (clip_horiz && xdst.right - xdst.left != xsrc.right - xsrc.left)
+ || (clip_vert && xdst.bottom - xdst.top != xsrc.bottom - xsrc.top))
+ {
+ WARN("Out of screen rectangle in special case. Not handled right now.\n");
+ return WINED3D_OK;
+ }
+
+ if (clip_horiz)
+ {
+ if (xdst.left < 0)
+ {
+ xsrc.left -= xdst.left;
+ xdst.left = 0;
+ }
+ if (xdst.right > This->currentDesc.Width)
+ {
+ xsrc.right -= (xdst.right - (int)This->currentDesc.Width);
+ xdst.right = (int)This->currentDesc.Width;
+ }
+ }
+
+ if (clip_vert)
+ {
+ if (xdst.top < 0)
+ {
+ xsrc.top -= xdst.top;
+ xdst.top = 0;
+ }
+ if (xdst.bottom > This->currentDesc.Height)
+ {
+ xsrc.bottom -= (xdst.bottom - (int)This->currentDesc.Height);
+ xdst.bottom = (int)This->currentDesc.Height;
+ }
+ }
+
+ /* And check if after clipping something is still to be done... */
+ if ((xdst.right <= 0) || (xdst.bottom <= 0)
+ || (xdst.left >= (int)This->currentDesc.Width)
+ || (xdst.top >= (int)This->currentDesc.Height)
+ || (xsrc.right <= 0) || (xsrc.bottom <= 0)
+ || (xsrc.left >= (int) Src->currentDesc.Width)
+ || (xsrc.top >= (int)Src->currentDesc.Height))
+ {
+ TRACE("Nothing to be done after clipping.\n");
+ return WINED3D_OK;
+ }
+ }
}
}
-
- /* The easy case : the source-less blits.... */
- if (Src == NULL && DestRect)
+ else
{
- RECT full_rect;
- RECT temp_rect; /* No idea if intersect rect can be the same as one of the source rect */
-
- full_rect.left = 0;
- full_rect.top = 0;
- full_rect.right = This->currentDesc.Width;
- full_rect.bottom = This->currentDesc.Height;
- IntersectRect(&temp_rect, &full_rect, DestRect);
- xdst = temp_rect;
- }
- else if (DestRect)
- {
- /* Only handle clipping on the destination rectangle */
- int clip_horiz = (DestRect->left < 0) || (DestRect->right > (int) This->currentDesc.Width );
- int clip_vert = (DestRect->top < 0) || (DestRect->bottom > (int) This->currentDesc.Height);
- if (clip_vert || clip_horiz)
- {
- /* Now check if this is a special case or not... */
- if ((((DestRect->bottom - DestRect->top ) != (xsrc.bottom - xsrc.top )) && clip_vert ) ||
- (((DestRect->right - DestRect->left) != (xsrc.right - xsrc.left)) && clip_horiz) ||
- (Flags & WINEDDBLT_DDFX))
- {
- WARN("Out of screen rectangle in special case. Not handled right now.\n");
- return WINED3D_OK;
- }
-
- if (clip_horiz)
- {
- if (DestRect->left < 0) { xsrc.left -= DestRect->left; xdst.left = 0; }
- if (DestRect->right > This->currentDesc.Width)
- {
- xsrc.right -= (DestRect->right - (int) This->currentDesc.Width);
- xdst.right = (int) This->currentDesc.Width;
- }
- }
- if (clip_vert)
- {
- if (DestRect->top < 0)
- {
- xsrc.top -= DestRect->top;
- xdst.top = 0;
- }
- if (DestRect->bottom > This->currentDesc.Height)
- {
- xsrc.bottom -= (DestRect->bottom - (int) This->currentDesc.Height);
- xdst.bottom = (int) This->currentDesc.Height;
- }
- }
- /* And check if after clipping something is still to be done... */
- if ((xdst.bottom <= 0) || (xdst.right <= 0) ||
- (xdst.top >= (int) This->currentDesc.Height) ||
- (xdst.left >= (int) This->currentDesc.Width) ||
- (xsrc.bottom <= 0) || (xsrc.right <= 0) ||
- (xsrc.top >= (int) Src->currentDesc.Height) ||
- (xsrc.left >= (int) Src->currentDesc.Width))
- {
- TRACE("Nothing to be done after clipping !\n");
- return WINED3D_OK;
- }
- }
+ xdst.left = 0;
+ xdst.top = 0;
+ xdst.right = This->currentDesc.Width;
+ xdst.bottom = This->currentDesc.Height;
}
if (Src == This)
@@ -1552,7 +1600,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_BltFast(IWineD3DSurface *iface, DWORD dst
RECT lock_src, lock_dst, lock_union;
const BYTE *sbuf;
BYTE *dbuf;
- const struct GlPixelFormatDesc *sEntry, *dEntry;
+ const struct wined3d_format_desc *sEntry, *dEntry;
if (TRACE_ON(d3d_surface))
{
@@ -1833,7 +1881,7 @@ HRESULT WINAPI IWineD3DBaseSurfaceImpl_LockRect(IWineD3DSurface *iface, WINED3DL
}
else
{
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
TRACE("Lock Rect (%p) = l %d, t %d, r %d, b %d\n",
pRect, pRect->left, pRect->top, pRect->right, pRect->bottom);
diff --git a/dll/directx/wine/wined3d/surface_gdi.c b/dll/directx/wine/wined3d/surface_gdi.c
index 3f09dc3c130..580c88a9080 100644
--- a/dll/directx/wine/wined3d/surface_gdi.c
+++ b/dll/directx/wine/wined3d/surface_gdi.c
@@ -200,7 +200,7 @@ IWineGDISurfaceImpl_UnlockRect(IWineD3DSurface *iface)
/* Tell the swapchain to update the screen */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
- if(iface == swapchain->frontBuffer)
+ if (This == swapchain->front_buffer)
{
x11_copy_to_screen(swapchain, &This->lockedRect);
}
@@ -240,7 +240,8 @@ IWineGDISurfaceImpl_Flip(IWineD3DSurface *iface,
return WINEDDERR_NOTFLIPPABLE;
}
- hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *) swapchain, NULL, NULL, 0, NULL, 0);
+ hr = IWineD3DSwapChain_Present((IWineD3DSwapChain *)swapchain,
+ NULL, NULL, swapchain->win_handle, NULL, 0);
IWineD3DSwapChain_Release((IWineD3DSwapChain *) swapchain);
return hr;
}
@@ -296,9 +297,9 @@ const char* filename)
FILE* f = NULL;
UINT y = 0, x = 0;
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
+ const struct wined3d_format_desc *format_desc = This->resource.format_desc;
static char *output = NULL;
static UINT size = 0;
- const struct GlPixelFormatDesc *format_desc = This->resource.format_desc;
if (This->pow2Width > size) {
output = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pow2Width * 3);
@@ -340,14 +341,13 @@ const char* filename)
fwrite(output, 3 * This->pow2Width, 1, f);
}
} else {
- int red_shift, green_shift, blue_shift, pix_width, alpha_shift;
+ int red_shift, green_shift, blue_shift, pix_width;
pix_width = format_desc->byte_count;
red_shift = get_shift(format_desc->red_mask);
green_shift = get_shift(format_desc->green_mask);
blue_shift = get_shift(format_desc->blue_mask);
- alpha_shift = get_shift(format_desc->alpha_mask);
for (y = 0; y < This->pow2Height; y++) {
const unsigned char *src = This->resource.allocatedMemory + (y * 1 * IWineD3DSurface_GetPitch(iface));
@@ -366,8 +366,8 @@ const char* filename)
output[3 * x + 0] = red_shift > 0 ? comp >> red_shift : comp << -red_shift;
comp = color & format_desc->green_mask;
output[3 * x + 1] = green_shift > 0 ? comp >> green_shift : comp << -green_shift;
- comp = color & format_desc->alpha_mask;
- output[3 * x + 2] = alpha_shift > 0 ? comp >> alpha_shift : comp << -alpha_shift;
+ comp = color & format_desc->blue_mask;
+ output[3 * x + 2] = blue_shift > 0 ? comp >> blue_shift : comp << -blue_shift;
}
fwrite(output, 3 * This->pow2Width, 1, f);
}
@@ -430,7 +430,7 @@ static HRESULT WINAPI IWineGDISurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHD
IWineD3DSurfaceImpl *dds_primary;
IWineD3DSwapChainImpl *swapchain;
swapchain = (IWineD3DSwapChainImpl *)This->resource.device->swapchains[0];
- dds_primary = (IWineD3DSurfaceImpl *)swapchain->frontBuffer;
+ dds_primary = swapchain->front_buffer;
if (dds_primary && dds_primary->palette)
pal = dds_primary->palette->palents;
}
@@ -500,7 +500,7 @@ static HRESULT WINAPI IWineGDISurfaceImpl_RealizePalette(IWineD3DSurface *iface)
/* Tell the swapchain to update the screen */
if (SUCCEEDED(IWineD3DSurface_GetContainer(iface, &IID_IWineD3DSwapChain, (void **)&swapchain)))
{
- if(iface == swapchain->frontBuffer)
+ if (This == swapchain->front_buffer)
{
x11_copy_to_screen(swapchain, NULL);
}
diff --git a/dll/directx/wine/wined3d/swapchain.c b/dll/directx/wine/wined3d/swapchain.c
index cbdb961f705..b0d591a7587 100644
--- a/dll/directx/wine/wined3d/swapchain.c
+++ b/dll/directx/wine/wined3d/swapchain.c
@@ -33,8 +33,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
WINE_DECLARE_DEBUG_CHANNEL(fps);
-#define GLINFO_LOCATION This->device->adapter->gl_info
-
/*IWineD3DSwapChain parts follow: */
static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
{
@@ -46,32 +44,32 @@ static void WINAPI IWineD3DSwapChainImpl_Destroy(IWineD3DSwapChain *iface)
IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
- /* Release the swapchain's draw buffers. Make sure This->backBuffer[0] is
+ /* Release the swapchain's draw buffers. Make sure This->back_buffers[0] is
* the last buffer to be destroyed, FindContext() depends on that. */
- if (This->frontBuffer)
+ if (This->front_buffer)
{
- IWineD3DSurface_SetContainer(This->frontBuffer, 0);
- if (IWineD3DSurface_Release(This->frontBuffer))
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer))
{
WARN("(%p) Something's still holding the front buffer (%p).\n",
- This, This->frontBuffer);
+ This, This->front_buffer);
}
- This->frontBuffer = NULL;
+ This->front_buffer = NULL;
}
- if (This->backBuffer)
+ if (This->back_buffers)
{
UINT i = This->presentParms.BackBufferCount;
while (i--)
{
- IWineD3DSurface_SetContainer(This->backBuffer[i], 0);
- if (IWineD3DSurface_Release(This->backBuffer[i]))
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i]))
WARN("(%p) Something's still holding back buffer %u (%p).\n",
- This, i, This->backBuffer[i]);
+ This, i, This->back_buffers[i]);
}
- HeapFree(GetProcessHeap(), 0, This->backBuffer);
- This->backBuffer = NULL;
+ HeapFree(GetProcessHeap(), 0, This->back_buffers);
+ This->back_buffers = NULL;
}
for (i = 0; i < This->num_contexts; ++i)
@@ -100,11 +98,13 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
const RECT *src_rect, const RECT *dst_rect)
{
IWineD3DDeviceImpl *device = This->device;
- IWineD3DSurfaceImpl *backbuffer = ((IWineD3DSurfaceImpl *) This->backBuffer[0]);
+ IWineD3DSurfaceImpl *backbuffer = This->back_buffers[0];
UINT src_w = src_rect->right - src_rect->left;
UINT src_h = src_rect->bottom - src_rect->top;
GLenum gl_filter;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ RECT win_rect;
+ UINT win_h;
TRACE("swapchain %p, context %p, src_rect %s, dst_rect %s.\n",
This, context, wine_dbgstr_rect(src_rect), wine_dbgstr_rect(dst_rect));
@@ -114,12 +114,14 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
else
gl_filter = GL_LINEAR;
- if (gl_info->fbo_ops.glBlitFramebuffer)
+ GetClientRect(This->win_handle, &win_rect);
+ win_h = win_rect.bottom - win_rect.top;
+
+ if (gl_info->fbo_ops.glBlitFramebuffer && is_identity_fixup(backbuffer->resource.format_desc->color_fixup))
{
ENTER_GL();
- context_bind_fbo(context, GL_READ_FRAMEBUFFER, &context->src_fbo);
- context_attach_surface_fbo(context, GL_READ_FRAMEBUFFER, 0, This->backBuffer[0]);
- context_attach_depth_stencil_fbo(context, GL_READ_FRAMEBUFFER, NULL, FALSE);
+ context_apply_fbo_state_blit(context, GL_READ_FRAMEBUFFER, backbuffer, NULL);
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
context_bind_fbo(context, GL_DRAW_FRAMEBUFFER, NULL);
context_set_draw_buffer(context, GL_BACK);
@@ -129,8 +131,8 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
/* Note that the texture is upside down */
gl_info->fbo_ops.glBlitFramebuffer(src_rect->left, src_rect->top, src_rect->right, src_rect->bottom,
- dst_rect->left, dst_rect->bottom, dst_rect->right, dst_rect->top,
- GL_COLOR_BUFFER_BIT, gl_filter);
+ dst_rect->left, win_h - dst_rect->top, dst_rect->right, win_h - dst_rect->bottom,
+ GL_COLOR_BUFFER_BIT, gl_filter);
checkGLcall("Swapchain present blit(EXT_framebuffer_blit)\n");
LEAVE_GL();
}
@@ -142,7 +144,8 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
float tex_right = src_rect->right;
float tex_bottom = src_rect->bottom;
- context2 = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_BLIT);
+ context2 = context_acquire(This->device, This->back_buffers[0]);
+ context_apply_blit_state(context2, device);
if(backbuffer->Flags & SFLAG_NORMCOORD)
{
@@ -152,30 +155,31 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
tex_bottom /= src_h;
}
+ if (is_complex_fixup(backbuffer->resource.format_desc->color_fixup))
+ gl_filter = GL_NEAREST;
+
ENTER_GL();
context_bind_fbo(context2, GL_DRAW_FRAMEBUFFER, NULL);
/* Set up the texture. The surface is not in a IWineD3D*Texture container,
* so there are no d3d texture settings to dirtify
*/
- device->blitter->set_shader((IWineD3DDevice *) device, backbuffer->resource.format_desc,
- backbuffer->texture_target, backbuffer->pow2Width,
- backbuffer->pow2Height);
- glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ device->blitter->set_shader((IWineD3DDevice *) device, backbuffer);
+ glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MIN_FILTER, gl_filter);
+ glTexParameteri(backbuffer->texture_target, GL_TEXTURE_MAG_FILTER, gl_filter);
context_set_draw_buffer(context, GL_BACK);
/* Set the viewport to the destination rectandle, disable any projection
- * transformation set up by CTXUSAGE_BLIT, and draw a (-1,-1)-(1,1) quad.
+ * transformation set up by context_apply_blit_state(), and draw a
+ * (-1,-1)-(1,1) quad.
*
* Back up viewport and matrix to avoid breaking last_was_blit
*
- * Note that CTXUSAGE_BLIT set up viewport and ortho to match the surface
- * size - we want the GL drawable(=window) size.
- */
+ * Note that context_apply_blit_state() set up viewport and ortho to
+ * match the surface size - we want the GL drawable(=window) size. */
glPushAttrib(GL_VIEWPORT_BIT);
- glViewport(dst_rect->left, dst_rect->top, dst_rect->right, dst_rect->bottom);
+ glViewport(dst_rect->left, win_h - dst_rect->bottom, dst_rect->right, win_h - dst_rect->top);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
@@ -211,6 +215,7 @@ static void swapchain_blit(IWineD3DSwapChainImpl *This, struct wined3d_context *
static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion, DWORD dwFlags) {
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
+ const struct wined3d_gl_info *gl_info;
struct wined3d_context *context;
RECT src_rect, dst_rect;
BOOL render_to_fbo;
@@ -219,7 +224,15 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
IWineD3DSwapChain_SetDestWindowOverride(iface, hDestWindowOverride);
- context = context_acquire(This->device, This->backBuffer[0], CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(This->device, This->back_buffers[0]);
+ if (!context->valid)
+ {
+ context_release(context);
+ WARN("Invalid context, skipping present.\n");
+ return WINED3D_OK;
+ }
+
+ gl_info = context->gl_info;
/* Render the cursor onto the back buffer, using our nifty directdraw blitting code :-) */
if (This->device->bCursorVisible && This->device->cursorTexture)
@@ -242,17 +255,13 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
cursor.resource.ref = 1;
cursor.resource.device = This->device;
cursor.resource.pool = WINED3DPOOL_SCRATCH;
- cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, context->gl_info);
+ cursor.resource.format_desc = getFormatDescEntry(WINED3DFMT_B8G8R8A8_UNORM, gl_info);
cursor.resource.resourceType = WINED3DRTYPE_SURFACE;
cursor.texture_name = This->device->cursorTexture;
cursor.texture_target = GL_TEXTURE_2D;
cursor.texture_level = 0;
cursor.currentDesc.Width = This->device->cursorWidth;
cursor.currentDesc.Height = This->device->cursorHeight;
- cursor.glRect.left = 0;
- cursor.glRect.top = 0;
- cursor.glRect.right = cursor.currentDesc.Width;
- cursor.glRect.bottom = cursor.currentDesc.Height;
/* The cursor must have pow2 sizes */
cursor.pow2Width = cursor.currentDesc.Width;
cursor.pow2Height = cursor.currentDesc.Height;
@@ -264,14 +273,15 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
if (This->presentParms.Windowed) {
MapWindowPoints(NULL, This->win_handle, (LPPOINT)&destRect, 2);
}
- IWineD3DSurface_Blt(This->backBuffer[0], &destRect, (IWineD3DSurface *)&cursor,
+ IWineD3DSurface_Blt((IWineD3DSurface *)This->back_buffers[0], &destRect, (IWineD3DSurface *)&cursor,
NULL, WINEDDBLT_KEYSRC, NULL, WINED3DTEXF_POINT);
}
if (This->device->logo_surface)
{
/* Blit the logo into the upper left corner of the drawable. */
- IWineD3DSurface_BltFast(This->backBuffer[0], 0, 0, This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
+ IWineD3DSurface_BltFast((IWineD3DSurface *)This->back_buffers[0], 0, 0,
+ This->device->logo_surface, NULL, WINEDDBLTFAST_SRCCOLORKEY);
}
TRACE("Presenting HDC %p.\n", context->hdc);
@@ -315,8 +325,8 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
*/
if (!This->render_to_fbo && render_to_fbo && wined3d_settings.offscreen_rendering_mode == ORM_FBO)
{
- IWineD3DSurface_LoadLocation(This->backBuffer[0], SFLAG_INTEXTURE, NULL);
- IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, FALSE);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INTEXTURE, NULL);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, FALSE);
This->render_to_fbo = TRUE;
/* Force the context manager to update the render target configuration next draw. */
@@ -420,14 +430,14 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
WINED3DCLEAR_TARGET, 0xff00ffff, 1.0f, 0);
}
- if(!This->render_to_fbo &&
- ( ((IWineD3DSurfaceImpl *) This->frontBuffer)->Flags & SFLAG_INSYSMEM ||
- ((IWineD3DSurfaceImpl *) This->backBuffer[0])->Flags & SFLAG_INSYSMEM ) ) {
+ if (!This->render_to_fbo && ((This->front_buffer->Flags & SFLAG_INSYSMEM)
+ || (This->back_buffers[0]->Flags & SFLAG_INSYSMEM)))
+ {
/* Both memory copies of the surfaces are ok, flip them around too instead of dirtifying
* Doesn't work with render_to_fbo because we're not flipping
*/
- IWineD3DSurfaceImpl *front = (IWineD3DSurfaceImpl *) This->frontBuffer;
- IWineD3DSurfaceImpl *back = (IWineD3DSurfaceImpl *) This->backBuffer[0];
+ IWineD3DSurfaceImpl *front = This->front_buffer;
+ IWineD3DSurfaceImpl *back = This->back_buffers[0];
if(front->resource.size == back->resource.size) {
DWORD fbflags;
@@ -438,35 +448,45 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
* This serves to update the emulated overlay, if any
*/
fbflags = front->Flags;
- IWineD3DSurface_ModifyLocation(This->frontBuffer, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)front, SFLAG_INDRAWABLE, TRUE);
front->Flags = fbflags;
} else {
IWineD3DSurface_ModifyLocation((IWineD3DSurface *) front, SFLAG_INDRAWABLE, TRUE);
IWineD3DSurface_ModifyLocation((IWineD3DSurface *) back, SFLAG_INDRAWABLE, TRUE);
}
- } else {
- IWineD3DSurface_ModifyLocation(This->frontBuffer, SFLAG_INDRAWABLE, TRUE);
+ }
+ else
+ {
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->front_buffer, SFLAG_INDRAWABLE, TRUE);
/* If the swapeffect is DISCARD, the back buffer is undefined. That means the SYSMEM
* and INTEXTURE copies can keep their old content if they have any defined content.
* If the swapeffect is COPY, the content remains the same. If it is FLIP however,
* the texture / sysmem copy needs to be reloaded from the drawable
*/
- if(This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP) {
- IWineD3DSurface_ModifyLocation(This->backBuffer[0], SFLAG_INDRAWABLE, TRUE);
+ if (This->presentParms.SwapEffect == WINED3DSWAPEFFECT_FLIP)
+ {
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)This->back_buffers[0], SFLAG_INDRAWABLE, TRUE);
}
}
- if (This->device->stencilBufferTarget)
+ if (This->device->depth_stencil)
{
if (This->presentParms.Flags & WINED3DPRESENTFLAG_DISCARD_DEPTHSTENCIL
- || ((IWineD3DSurfaceImpl *)This->device->stencilBufferTarget)->Flags & SFLAG_DISCARD)
+ || This->device->depth_stencil->Flags & SFLAG_DISCARD)
{
- surface_modify_ds_location(This->device->stencilBufferTarget, SFLAG_DS_DISCARDED);
+ surface_modify_ds_location(This->device->depth_stencil, SFLAG_DS_DISCARDED,
+ This->device->depth_stencil->currentDesc.Width,
+ This->device->depth_stencil->currentDesc.Height);
+ if (This->device->depth_stencil == This->device->onscreen_depth_stencil)
+ {
+ IWineD3DSurface_Release((IWineD3DSurface *)This->device->onscreen_depth_stencil);
+ This->device->onscreen_depth_stencil = NULL;
+ }
}
}
if (This->presentParms.PresentationInterval != WINED3DPRESENT_INTERVAL_IMMEDIATE
- && context->gl_info->supported[SGI_VIDEO_SYNC])
+ && gl_info->supported[SGI_VIDEO_SYNC])
{
retval = GL_EXTCALL(glXGetVideoSyncSGI(&sync));
if(retval != 0) {
@@ -514,47 +534,16 @@ static HRESULT WINAPI IWineD3DSwapChainImpl_Present(IWineD3DSwapChain *iface, CO
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window) {
- IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
- WINED3DLOCKED_RECT r;
- BYTE *mem;
+static HRESULT WINAPI IWineD3DSwapChainImpl_SetDestWindowOverride(IWineD3DSwapChain *iface, HWND window)
+{
+ IWineD3DSwapChainImpl *swapchain = (IWineD3DSwapChainImpl *)iface;
- if (!window || window == This->win_handle) return WINED3D_OK;
+ if (!window) window = swapchain->device_window;
+ if (window == swapchain->win_handle) return WINED3D_OK;
- TRACE("Performing dest override of swapchain %p from window %p to %p\n", This, This->win_handle, window);
- if (This->context[0] == This->device->contexts[0])
- {
- /* The primary context 'owns' all the opengl resources. Destroying and recreating that context requires downloading
- * all opengl resources, deleting the gl resources, destroying all other contexts, then recreating all other contexts
- * and reload the resources
- */
- delete_opengl_contexts((IWineD3DDevice *)This->device, iface);
- This->win_handle = window;
- create_primary_opengl_context((IWineD3DDevice *)This->device, iface);
- }
- else
- {
- This->win_handle = window;
+ TRACE("Setting swapchain %p window from %p to %p\n", swapchain, swapchain->win_handle, window);
+ swapchain->win_handle = window;
- /* The old back buffer has to be copied over to the new back buffer. A lockrect - switchcontext - unlockrect
- * would suffice in theory, but it is rather nasty and may cause troubles with future changes of the locking code
- * So lock read only, copy the surface out, then lock with the discard flag and write back
- */
- IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_READONLY);
- mem = HeapAlloc(GetProcessHeap(), 0, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
- memcpy(mem, r.pBits, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
- IWineD3DSurface_UnlockRect(This->backBuffer[0]);
-
- context_destroy(This->device, This->context[0]);
- This->context[0] = context_create(This->device, (IWineD3DSurfaceImpl *)This->frontBuffer,
- This->win_handle, FALSE /* pbuffer */, &This->presentParms);
- context_release(This->context[0]);
-
- IWineD3DSurface_LockRect(This->backBuffer[0], &r, NULL, WINED3DLOCK_DISCARD);
- memcpy(r.pBits, mem, r.Pitch * ((IWineD3DSurfaceImpl *) This->backBuffer[0])->currentDesc.Height);
- HeapFree(GetProcessHeap(), 0, mem);
- IWineD3DSurface_UnlockRect(This->backBuffer[0]);
- }
return WINED3D_OK;
}
@@ -599,7 +588,7 @@ static LONG fullscreen_exstyle(LONG exstyle)
void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w, UINT h)
{
IWineD3DDeviceImpl *device = swapchain->device;
- HWND window = swapchain->win_handle;
+ HWND window = swapchain->device_window;
BOOL filter_messages;
LONG style, exstyle;
@@ -633,7 +622,7 @@ void swapchain_setup_fullscreen_window(IWineD3DSwapChainImpl *swapchain, UINT w,
void swapchain_restore_fullscreen_window(IWineD3DSwapChainImpl *swapchain)
{
IWineD3DDeviceImpl *device = swapchain->device;
- HWND window = swapchain->win_handle;
+ HWND window = swapchain->device_window;
BOOL filter_messages;
LONG style, exstyle;
@@ -671,7 +660,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
IWineD3DDeviceImpl *device, WINED3DPRESENT_PARAMETERS *present_parameters, IUnknown *parent)
{
const struct wined3d_adapter *adapter = device->adapter;
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
BOOL displaymode_set = FALSE;
WINED3DDISPLAYMODE mode;
RECT client_rect;
@@ -713,6 +702,7 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
swapchain->parent = parent;
swapchain->ref = 1;
swapchain->win_handle = window;
+ swapchain->device_window = window;
if (!present_parameters->Windowed && window)
{
@@ -768,18 +758,19 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
hr = IWineD3DDeviceParent_CreateRenderTarget(device->device_parent, parent,
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType,
- swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */, &swapchain->frontBuffer);
+ swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */,
+ (IWineD3DSurface **)&swapchain->front_buffer);
if (FAILED(hr))
{
WARN("Failed to create front buffer, hr %#x.\n", hr);
goto err;
}
- IWineD3DSurface_SetContainer(swapchain->frontBuffer, (IWineD3DBase *)swapchain);
- ((IWineD3DSurfaceImpl *)swapchain->frontBuffer)->Flags |= SFLAG_SWAPCHAIN;
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->front_buffer, (IWineD3DBase *)swapchain);
+ swapchain->front_buffer->Flags |= SFLAG_SWAPCHAIN;
if (surface_type == SURFACE_OPENGL)
{
- IWineD3DSurface_ModifyLocation(swapchain->frontBuffer, SFLAG_INDRAWABLE, TRUE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)swapchain->front_buffer, SFLAG_INDRAWABLE, TRUE);
}
/* MSDN says we're only allowed a single fullscreen swapchain per device,
@@ -816,14 +807,49 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (surface_type == SURFACE_OPENGL)
{
- swapchain->context[0] = context_create(device, (IWineD3DSurfaceImpl *)swapchain->frontBuffer,
- window, FALSE /* pbuffer */, present_parameters);
+ WINED3DFORMAT formats[] =
+ {
+ WINED3DFMT_D24_UNORM_S8_UINT,
+ WINED3DFMT_D32_UNORM,
+ WINED3DFMT_R24_UNORM_X8_TYPELESS,
+ WINED3DFMT_D16_UNORM,
+ WINED3DFMT_S1_UINT_D15_UNORM
+ };
+
+ const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
+
+ /* In WGL both color, depth and stencil are features of a pixel format. In case of D3D they are separate.
+ * You are able to add a depth + stencil surface at a later stage when you need it.
+ * In order to support this properly in WineD3D we need the ability to recreate the opengl context and
+ * drawable when this is required. This is very tricky as we need to reapply ALL opengl states for the new
+ * context, need torecreate shaders, textures and other resources.
+ *
+ * The context manager already takes care of the state problem and for the other tasks code from Reset
+ * can be used. These changes are way to risky during the 1.0 code freeze which is taking place right now.
+ * Likely a lot of other new bugs will be exposed. For that reason request a depth stencil surface all the
+ * time. It can cause a slight performance hit but fixes a lot of regressions. A fixme reminds of that this
+ * issue needs to be fixed. */
+ for (i = 0; i < (sizeof(formats) / sizeof(*formats)); i++)
+ {
+ swapchain->ds_format = getFormatDescEntry(formats[i], gl_info);
+ swapchain->context[0] = context_create(swapchain, swapchain->front_buffer, swapchain->ds_format);
+ if (swapchain->context[0]) break;
+ TRACE("Depth stencil format %s is not supported, trying next format\n",
+ debug_d3dformat(formats[i]));
+ }
+
if (!swapchain->context[0])
{
WARN("Failed to create context.\n");
hr = WINED3DERR_NOTAVAILABLE;
goto err;
}
+
+ if (!present_parameters->EnableAutoDepthStencil
+ || swapchain->presentParms.AutoDepthStencilFormat != swapchain->ds_format->format)
+ {
+ FIXME("Add OpenGL context recreation support to context_validate_onscreen_formats\n");
+ }
context_release(swapchain->context[0]);
}
else
@@ -833,9 +859,9 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (swapchain->presentParms.BackBufferCount > 0)
{
- swapchain->backBuffer = HeapAlloc(GetProcessHeap(), 0,
- sizeof(*swapchain->backBuffer) * swapchain->presentParms.BackBufferCount);
- if (!swapchain->backBuffer)
+ swapchain->back_buffers = HeapAlloc(GetProcessHeap(), 0,
+ sizeof(*swapchain->back_buffers) * swapchain->presentParms.BackBufferCount);
+ if (!swapchain->back_buffers)
{
ERR("Failed to allocate backbuffer array memory.\n");
hr = E_OUTOFMEMORY;
@@ -848,15 +874,16 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
hr = IWineD3DDeviceParent_CreateRenderTarget(device->device_parent, parent,
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
swapchain->presentParms.BackBufferFormat, swapchain->presentParms.MultiSampleType,
- swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */, &swapchain->backBuffer[i]);
+ swapchain->presentParms.MultiSampleQuality, TRUE /* Lockable */,
+ (IWineD3DSurface **)&swapchain->back_buffers[i]);
if (FAILED(hr))
{
WARN("Failed to create back buffer %u, hr %#x.\n", i, hr);
goto err;
}
- IWineD3DSurface_SetContainer(swapchain->backBuffer[i], (IWineD3DBase *)swapchain);
- ((IWineD3DSurfaceImpl *)swapchain->backBuffer[i])->Flags |= SFLAG_SWAPCHAIN;
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)swapchain->back_buffers[i], (IWineD3DBase *)swapchain);
+ swapchain->back_buffers[i]->Flags |= SFLAG_SWAPCHAIN;
}
}
@@ -864,20 +891,20 @@ HRESULT swapchain_init(IWineD3DSwapChainImpl *swapchain, WINED3DSURFTYPE surface
if (present_parameters->EnableAutoDepthStencil && surface_type == SURFACE_OPENGL)
{
TRACE("Creating depth/stencil buffer.\n");
- if (!device->auto_depth_stencil_buffer)
+ if (!device->auto_depth_stencil)
{
hr = IWineD3DDeviceParent_CreateDepthStencilSurface(device->device_parent, parent,
swapchain->presentParms.BackBufferWidth, swapchain->presentParms.BackBufferHeight,
swapchain->presentParms.AutoDepthStencilFormat, swapchain->presentParms.MultiSampleType,
swapchain->presentParms.MultiSampleQuality, FALSE /* FIXME: Discard */,
- &device->auto_depth_stencil_buffer);
+ (IWineD3DSurface **)&device->auto_depth_stencil);
if (FAILED(hr))
{
WARN("Failed to create the auto depth stencil, hr %#x.\n", hr);
goto err;
}
- IWineD3DSurface_SetContainer(device->auto_depth_stencil_buffer, NULL);
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)device->auto_depth_stencil, NULL);
}
}
@@ -902,13 +929,13 @@ err:
ChangeDisplaySettingsExW(adapter->DeviceName, &devmode, NULL, CDS_FULLSCREEN, NULL);
}
- if (swapchain->backBuffer)
+ if (swapchain->back_buffers)
{
for (i = 0; i < swapchain->presentParms.BackBufferCount; ++i)
{
- if (swapchain->backBuffer[i]) IWineD3DSurface_Release(swapchain->backBuffer[i]);
+ if (swapchain->back_buffers[i]) IWineD3DSurface_Release((IWineD3DSurface *)swapchain->back_buffers[i]);
}
- HeapFree(GetProcessHeap(), 0, swapchain->backBuffer);
+ HeapFree(GetProcessHeap(), 0, swapchain->back_buffers);
}
if (swapchain->context)
@@ -922,7 +949,7 @@ err:
HeapFree(GetProcessHeap(), 0, swapchain->context);
}
- if (swapchain->frontBuffer) IWineD3DSurface_Release(swapchain->frontBuffer);
+ if (swapchain->front_buffer) IWineD3DSurface_Release((IWineD3DSurface *)swapchain->front_buffer);
return hr;
}
@@ -935,9 +962,7 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *i
TRACE("Creating a new context for swapchain %p, thread %d\n", This, GetCurrentThreadId());
- ctx = context_create(This->device, (IWineD3DSurfaceImpl *)This->frontBuffer,
- This->context[0]->win_handle, FALSE /* pbuffer */, &This->presentParms);
- if (!ctx)
+ if (!(ctx = context_create(This, This->front_buffer, This->ds_format)))
{
ERR("Failed to create a new context for the swapchain\n");
return NULL;
@@ -962,9 +987,8 @@ struct wined3d_context *swapchain_create_context_for_thread(IWineD3DSwapChain *i
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height)
{
- IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)context->current_rt;
/* The drawable size of an onscreen drawable is the surface size.
* (Actually: The window size, but the surface is created in window size) */
- *width = surface->currentDesc.Width;
- *height = surface->currentDesc.Height;
+ *width = context->current_rt->currentDesc.Width;
+ *height = context->current_rt->currentDesc.Height;
}
diff --git a/dll/directx/wine/wined3d/swapchain_base.c b/dll/directx/wine/wined3d/swapchain_base.c
index 4c0590e4691..1817de2079a 100644
--- a/dll/directx/wine/wined3d/swapchain_base.c
+++ b/dll/directx/wine/wined3d/swapchain_base.c
@@ -85,7 +85,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *i
MapWindowPoints(This->win_handle, NULL, &start, 1);
}
- IWineD3DSurface_BltFast(pDestSurface, start.x, start.y, This->frontBuffer, NULL, 0);
+ IWineD3DSurface_BltFast(pDestSurface, start.x, start.y, (IWineD3DSurface *)This->front_buffer, NULL, 0);
return WINED3D_OK;
}
@@ -106,12 +106,13 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetBackBuffer(IWineD3DSwapChain *iface,
* used (there This->backBuffer is always NULL). We need this because this function has
* to be called from IWineD3DStateBlockImpl_InitStartupStateBlock to get the default
* scissorrect dimensions. */
- if( !This->backBuffer ) {
+ if (!This->back_buffers)
+ {
*ppBackBuffer = NULL;
return WINED3DERR_INVALIDCALL;
}
- *ppBackBuffer = This->backBuffer[iBackBuffer];
+ *ppBackBuffer = (IWineD3DSurface *)This->back_buffers[iBackBuffer];
TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, iBackBuffer, Type, *ppBackBuffer);
/* Note inc ref on returned surface */
@@ -145,15 +146,14 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface
return hr;
}
-HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, IWineD3DDevice**ppDevice) {
+HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface, IWineD3DDevice **device)
+{
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
- *ppDevice = (IWineD3DDevice *)This->device;
+ *device = (IWineD3DDevice *)This->device;
+ IWineD3DDevice_AddRef(*device);
- /* Note Calling this method will increase the internal reference count
- on the IDirect3DDevice9 interface. */
- IWineD3DDevice_AddRef(*ppDevice);
- TRACE("(%p) : returning %p\n", This, *ppDevice);
+ TRACE("(%p) : returning %p\n", This, *device);
return WINED3D_OK;
}
@@ -171,9 +171,9 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface,
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
HDC hDC;
TRACE("(%p) : pRamp@%p flags(%d)\n", This, pRamp, Flags);
- hDC = GetDC(This->win_handle);
+ hDC = GetDC(This->device_window);
SetDeviceGammaRamp(hDC, (LPVOID)pRamp);
- ReleaseDC(This->win_handle, hDC);
+ ReleaseDC(This->device_window, hDC);
return WINED3D_OK;
}
@@ -183,9 +183,9 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetGammaRamp(IWineD3DSwapChain *iface,
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
HDC hDC;
TRACE("(%p) : pRamp@%p\n", This, pRamp);
- hDC = GetDC(This->win_handle);
+ hDC = GetDC(This->device_window);
GetDeviceGammaRamp(hDC, pRamp);
- ReleaseDC(This->win_handle, hDC);
+ ReleaseDC(This->device_window, hDC);
return WINED3D_OK;
}
diff --git a/dll/directx/wine/wined3d/swapchain_gdi.c b/dll/directx/wine/wined3d/swapchain_gdi.c
index c437b419f8e..b80352c1dce 100644
--- a/dll/directx/wine/wined3d/swapchain_gdi.c
+++ b/dll/directx/wine/wined3d/swapchain_gdi.c
@@ -37,24 +37,27 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
IWineD3DSwapChain_SetGammaRamp(iface, 0, &This->orig_gamma);
/* release the ref to the front and back buffer parents */
- if(This->frontBuffer) {
- IWineD3DSurface_SetContainer(This->frontBuffer, 0);
- if (IWineD3DSurface_Release(This->frontBuffer) > 0)
+ if (This->front_buffer)
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->front_buffer, NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->front_buffer) > 0)
{
WARN("(%p) Something's still holding the front buffer\n",This);
}
}
- if(This->backBuffer) {
+ if (This->back_buffers)
+ {
UINT i;
- for(i = 0; i < This->presentParms.BackBufferCount; i++) {
- IWineD3DSurface_SetContainer(This->backBuffer[i], 0);
- if (IWineD3DSurface_Release(This->backBuffer[i]) > 0)
+ for (i = 0; i < This->presentParms.BackBufferCount; ++i)
+ {
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)This->back_buffers[i], NULL);
+ if (IWineD3DSurface_Release((IWineD3DSurface *)This->back_buffers[i]))
{
WARN("(%p) Something's still holding the back buffer\n",This);
}
}
- HeapFree(GetProcessHeap(), 0, This->backBuffer);
+ HeapFree(GetProcessHeap(), 0, This->back_buffers);
}
/* Restore the screen resolution if we rendered in fullscreen
@@ -86,7 +89,7 @@ static void WINAPI IWineGDISwapChainImpl_Destroy(IWineD3DSwapChain *iface)
*****************************************************************************/
void x11_copy_to_screen(IWineD3DSwapChainImpl *This, const RECT *rc)
{
- IWineD3DSurfaceImpl *front = (IWineD3DSurfaceImpl *) This->frontBuffer;
+ IWineD3DSurfaceImpl *front = This->front_buffer;
if(front->resource.usage & WINED3DUSAGE_RENDERTARGET) {
POINT offset = {0,0};
@@ -172,12 +175,13 @@ static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface, CO
IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *) iface;
IWineD3DSurfaceImpl *front, *back;
- if(!This->backBuffer) {
+ if (!This->back_buffers)
+ {
WARN("Swapchain doesn't have a backbuffer, returning WINED3DERR_INVALIDCALL\n");
return WINED3DERR_INVALIDCALL;
}
- front = (IWineD3DSurfaceImpl *) This->frontBuffer;
- back = (IWineD3DSurfaceImpl *) This->backBuffer[0];
+ front = This->front_buffer;
+ back = This->back_buffers[0];
/* Flip the DC */
{
@@ -226,7 +230,7 @@ static HRESULT WINAPI IWineGDISwapChainImpl_Present(IWineD3DSwapChain *iface, CO
/* FPS support */
if (TRACE_ON(fps))
{
- static long prev_time, frames;
+ static LONG prev_time, frames;
DWORD time = GetTickCount();
frames++;
diff --git a/dll/directx/wine/wined3d/texture.c b/dll/directx/wine/wined3d/texture.c
index 1e272144a8a..98e7909370e 100644
--- a/dll/directx/wine/wined3d/texture.c
+++ b/dll/directx/wine/wined3d/texture.c
@@ -63,21 +63,22 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG
{
/* context_acquire() sets isInDraw to TRUE when loading a pbuffer into a texture,
* thus no danger of recursive calls. */
- context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ context = context_acquire(device, NULL);
}
if (This->resource.format_desc->format == WINED3DFMT_P8_UINT
|| This->resource.format_desc->format == WINED3DFMT_P8_UINT_A8_UNORM)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- if (palette9_changed((IWineD3DSurfaceImpl *)This->surfaces[i]))
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ if (palette9_changed(surface))
{
TRACE("Reloading surface because the d3d8/9 palette was changed.\n");
/* TODO: This is not necessarily needed with hw palettized texture support. */
- IWineD3DSurface_LoadLocation(This->surfaces[i], SFLAG_INSYSMEM, NULL);
+ IWineD3DSurface_LoadLocation((IWineD3DSurface *)surface, SFLAG_INSYSMEM, NULL);
/* Make sure the texture is reloaded because of the palette change, this kills performance though :( */
- IWineD3DSurface_ModifyLocation(This->surfaces[i], SFLAG_INTEXTURE, FALSE);
+ IWineD3DSurface_ModifyLocation((IWineD3DSurface *)surface, SFLAG_INTEXTURE, FALSE);
}
}
}
@@ -86,9 +87,9 @@ static void texture_internal_preload(IWineD3DBaseTexture *iface, enum WINED3DSRG
* since the last load then reload the surfaces. */
if (*dirty)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- IWineD3DSurface_LoadTexture(This->surfaces[i], srgb_mode);
+ IWineD3DSurface_LoadTexture((IWineD3DSurface *)This->baseTexture.sub_resources[i], srgb_mode);
}
}
else
@@ -108,17 +109,18 @@ static void texture_cleanup(IWineD3DTextureImpl *This)
TRACE("(%p) : Cleaning up\n", This);
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- if (This->surfaces[i])
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ if (surface)
{
/* Clean out the texture name we gave to the surface so that the
* surface doesn't try and release it */
- surface_set_texture_name(This->surfaces[i], 0, TRUE);
- surface_set_texture_name(This->surfaces[i], 0, FALSE);
- surface_set_texture_target(This->surfaces[i], 0);
- IWineD3DSurface_SetContainer(This->surfaces[i], 0);
- IWineD3DSurface_Release(This->surfaces[i]);
+ surface_set_texture_name(surface, 0, TRUE);
+ surface_set_texture_name(surface, 0, FALSE);
+ surface_set_texture_target(surface, 0);
+ IWineD3DSurface_SetContainer((IWineD3DSurface *)surface, NULL);
+ IWineD3DSurface_Release((IWineD3DSurface *)surface);
}
}
@@ -204,10 +206,12 @@ static void WINAPI IWineD3DTextureImpl_UnLoad(IWineD3DTexture *iface) {
* surface before, this one will be a NOP and vice versa. Unloading an unloaded
* surface is fine
*/
- for (i = 0; i < This->baseTexture.levels; i++) {
- IWineD3DSurface_UnLoad(This->surfaces[i]);
- surface_set_texture_name(This->surfaces[i], 0, FALSE); /* Delete rgb name */
- surface_set_texture_name(This->surfaces[i], 0, TRUE); /* delete srgb name */
+ for (i = 0; i < This->baseTexture.level_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ IWineD3DSurface_UnLoad((IWineD3DSurface *)surface);
+ surface_set_texture_name(surface, 0, FALSE); /* Delete rgb name */
+ surface_set_texture_name(surface, 0, TRUE); /* delete srgb name */
}
basetexture_unload((IWineD3DBaseTexture *)iface);
@@ -276,14 +280,20 @@ static HRESULT WINAPI IWineD3DTextureImpl_BindTexture(IWineD3DTexture *iface, BO
gl_tex = &This->baseTexture.texture_rgb;
}
- for (i = 0; i < This->baseTexture.levels; ++i) {
- surface_set_texture_name(This->surfaces[i], gl_tex->name, This->baseTexture.is_srgb);
+ for (i = 0; i < This->baseTexture.level_count; ++i)
+ {
+ IWineD3DSurfaceImpl *surface = (IWineD3DSurfaceImpl *)This->baseTexture.sub_resources[i];
+ surface_set_texture_name(surface, gl_tex->name, This->baseTexture.is_srgb);
}
- /* Conditinal non power of two textures use a different clamping default. If we're using the GL_WINE_normalized_texrect
- * partial driver emulation, we're dealing with a GL_TEXTURE_2D texture which has the address mode set to repeat - something
- * that prevents us from hitting the accelerated codepath. Thus manually set the GL state. The same applies to filtering.
- * Even if the texture has only one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW fallback on macos.
- */
+
+ /* Conditinal non power of two textures use a different clamping
+ * default. If we're using the GL_WINE_normalized_texrect partial
+ * driver emulation, we're dealing with a GL_TEXTURE_2D texture which
+ * has the address mode set to repeat - something that prevents us
+ * from hitting the accelerated codepath. Thus manually set the GL
+ * state. The same applies to filtering. Even if the texture has only
+ * one mip level, the default LINEAR_MIPMAP_LINEAR filter causes a SW
+ * fallback on macos. */
if(IWineD3DBaseTexture_IsCondNP2(iface)) {
ENTER_GL();
glTexParameteri(IWineD3DTexture_GetTextureDimensions(iface), GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -323,72 +333,94 @@ static BOOL WINAPI IWineD3DTextureImpl_IsCondNP2(IWineD3DTexture *iface) {
/* *******************************************
IWineD3DTexture IWineD3DTexture parts follow
******************************************* */
-static HRESULT WINAPI IWineD3DTextureImpl_GetLevelDesc(IWineD3DTexture *iface, UINT Level, WINED3DSURFACE_DESC* pDesc) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DTextureImpl_GetLevelDesc(IWineD3DTexture *iface, UINT level, WINED3DSURFACE_DESC *desc)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- TRACE("(%p) Level (%d)\n", This, Level);
- return IWineD3DSurface_GetDesc(This->surfaces[Level], pDesc);
+ TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+
+ return IWineD3DSurface_GetDesc(surface, desc);
}
-static HRESULT WINAPI IWineD3DTextureImpl_GetSurfaceLevel(IWineD3DTexture *iface, UINT Level, IWineD3DSurface** ppSurfaceLevel) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DTextureImpl_GetSurfaceLevel(IWineD3DTexture *iface,
+ UINT level, IWineD3DSurface **surface)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *s;
- if (Level < This->baseTexture.levels) {
- *ppSurfaceLevel = This->surfaces[Level];
- IWineD3DSurface_AddRef(This->surfaces[Level]);
- hr = WINED3D_OK;
- TRACE("(%p) : returning %p for level %d\n", This, *ppSurfaceLevel, Level);
+ TRACE("iface %p, level %u, surface %p.\n", iface, level, surface);
+
+ if (!(s = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if (WINED3D_OK != hr) {
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- *ppSurfaceLevel = NULL; /* Just to be on the safe side.. */
- }
- return hr;
+
+ IWineD3DSurface_AddRef(s);
+ *surface = s;
+
+ TRACE("Returning surface %p.\n", *surface);
+
+ return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DTextureImpl_LockRect(IWineD3DTexture *iface, UINT Level, WINED3DLOCKED_RECT *pLockedRect,
- CONST RECT *pRect, DWORD Flags) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DTextureImpl_LockRect(IWineD3DTexture *iface,
+ UINT level, WINED3DLOCKED_RECT *locked_rect, const RECT *rect, DWORD flags)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DSurface_LockRect(This->surfaces[Level], pLockedRect, pRect, Flags);
- }
- if (WINED3D_OK == hr) {
- TRACE("(%p) Level (%d) success\n", This, Level);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
+ TRACE("iface %p, level %u, locked_rect %p, rect %s, flags %#x.\n",
+ iface, level, locked_rect, wine_dbgstr_rect(rect), flags);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+ return IWineD3DSurface_LockRect(surface, locked_rect, rect, flags);
}
-static HRESULT WINAPI IWineD3DTextureImpl_UnlockRect(IWineD3DTexture *iface, UINT Level) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- HRESULT hr = WINED3DERR_INVALIDCALL;
+static HRESULT WINAPI IWineD3DTextureImpl_UnlockRect(IWineD3DTexture *iface, UINT level)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurface *surface;
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DSurface_UnlockRect(This->surfaces[Level]);
+ TRACE("iface %p, level %u.\n", iface, level);
+
+ if (!(surface = (IWineD3DSurface *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- if ( WINED3D_OK == hr) {
- TRACE("(%p) Level (%d) success\n", This, Level);
- } else {
- WARN("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- }
- return hr;
+
+ return IWineD3DSurface_UnlockRect(surface);
}
-static HRESULT WINAPI IWineD3DTextureImpl_AddDirtyRect(IWineD3DTexture *iface, CONST RECT* pDirtyRect) {
- IWineD3DTextureImpl *This = (IWineD3DTextureImpl *)iface;
- This->baseTexture.texture_rgb.dirty = TRUE;
- This->baseTexture.texture_srgb.dirty = TRUE;
- TRACE("(%p) : dirtyfication of surface Level (0)\n", This);
- surface_add_dirty_rect(This->surfaces[0], pDirtyRect);
+static HRESULT WINAPI IWineD3DTextureImpl_AddDirtyRect(IWineD3DTexture *iface, const RECT *dirty_rect)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DSurfaceImpl *surface;
+
+ TRACE("iface %p, dirty_rect %s.\n", iface, wine_dbgstr_rect(dirty_rect));
+
+ if (!(surface = (IWineD3DSurfaceImpl *)basetexture_get_sub_resource(texture, 0, 0)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ texture->baseTexture.texture_rgb.dirty = TRUE;
+ texture->baseTexture.texture_srgb.dirty = TRUE;
+ surface_add_dirty_rect(surface, dirty_rect);
return WINED3D_OK;
}
@@ -434,7 +466,7 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
UINT pow2_width, pow2_height;
UINT tmp_w, tmp_h;
unsigned int i;
@@ -497,8 +529,8 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
texture->lpVtbl = &IWineD3DTexture_Vtbl;
- hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_TEXTURE,
- device, 0, usage, format_desc, pool, parent, parent_ops);
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels,
+ WINED3DRTYPE_TEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize basetexture, returning %#x.\n", hr);
@@ -565,22 +597,24 @@ HRESULT texture_init(IWineD3DTextureImpl *texture, UINT width, UINT height, UINT
/* Generate all the surfaces. */
tmp_w = width;
tmp_h = height;
- for (i = 0; i < texture->baseTexture.levels; ++i)
+ for (i = 0; i < texture->baseTexture.level_count; ++i)
{
+ IWineD3DSurface *surface;
+
/* Use the callback to create the texture surface. */
hr = IWineD3DDeviceParent_CreateSurface(device->device_parent, parent, tmp_w, tmp_h, format_desc->format,
- usage, pool, i, WINED3DCUBEMAP_FACE_POSITIVE_X, &texture->surfaces[i]);
- if (FAILED(hr) || ((IWineD3DSurfaceImpl *)texture->surfaces[i])->Flags & SFLAG_OVERSIZE)
+ usage, pool, i, 0, &surface);
+ if (FAILED(hr))
{
FIXME("Failed to create surface %p, hr %#x\n", texture, hr);
- texture->surfaces[i] = NULL;
texture_cleanup(texture);
return hr;
}
- IWineD3DSurface_SetContainer(texture->surfaces[i], (IWineD3DBase *)texture);
- TRACE("Created surface level %u @ %p.\n", i, texture->surfaces[i]);
- surface_set_texture_target(texture->surfaces[i], texture->target);
+ IWineD3DSurface_SetContainer(surface, (IWineD3DBase *)texture);
+ surface_set_texture_target((IWineD3DSurfaceImpl *)surface, texture->target);
+ texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)surface;
+ TRACE("Created surface level %u @ %p.\n", i, surface);
/* Calculate the next mipmap level. */
tmp_w = max(1, tmp_w >> 1);
tmp_h = max(1, tmp_h >> 1);
diff --git a/dll/directx/wine/wined3d/utils.c b/dll/directx/wine/wined3d/utils.c
index 2ff16752c33..b63a5f8cee8 100644
--- a/dll/directx/wine/wined3d/utils.c
+++ b/dll/directx/wine/wined3d/utils.c
@@ -141,31 +141,40 @@ struct wined3d_format_base_flags
static const struct wined3d_format_base_flags format_base_flags[] =
{
- {WINED3DFMT_UYVY, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_YUY2, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_YV12, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT1, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT2, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT3, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT4, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_DXT5, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_MULTI2_ARGB8, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_G8R8_G8B8, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_R8G8_B8G8, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_P8_UINT, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B8G8R8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B8G8R8X8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B5G5R5X1_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B5G5R5A1_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B4G4R4A4_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC},
- {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_NVHU, WINED3DFMT_FLAG_FOURCC},
- {WINED3DFMT_NVHS, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_UYVY, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_YUY2, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_YV12, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT1, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT2, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT3, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT4, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_DXT5, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_MULTI2_ARGB8, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_G8R8_G8B8, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_R8G8_B8G8, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_P8_UINT, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B8G8R8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B8G8R8A8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B8G8R8X8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B5G6R5_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B5G5R5X1_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B5G5R5A1_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B4G4R4A4_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_B4G4R4X4_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_R8G8B8A8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_R8G8B8X8_UNORM, WINED3DFMT_FLAG_GETDC},
+ {WINED3DFMT_ATI2N, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_NVHU, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_NVHS, WINED3DFMT_FLAG_FOURCC},
+ {WINED3DFMT_R32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R32G32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R32G32B32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R32G32B32A32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R16_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R16G16_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_R16G16B16A16_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_D32_FLOAT, WINED3DFMT_FLAG_FLOAT},
+ {WINED3DFMT_S8_UINT_D24_FLOAT, WINED3DFMT_FLAG_FLOAT},
};
struct wined3d_format_compression_info
@@ -183,7 +192,7 @@ static const struct wined3d_format_compression_info format_compression_info[] =
{WINED3DFMT_DXT3, 4, 4, 16},
{WINED3DFMT_DXT4, 4, 4, 16},
{WINED3DFMT_DXT5, 4, 4, 16},
- {WINED3DFMT_ATI2N, 4, 4, 16},
+ {WINED3DFMT_ATI2N, 1, 1, 1},
};
struct wined3d_format_vertex_info
@@ -218,20 +227,328 @@ static const struct wined3d_format_vertex_info format_vertex_info[] =
{WINED3DFMT_R16G16B16A16_FLOAT, WINED3D_FFP_EMIT_FLOAT16_4, 4, GL_FLOAT, 4, GL_FALSE, sizeof(GLhalfNV)}
};
-typedef struct {
- WINED3DFORMAT fmt;
- GLint glInternal, glGammaInternal, rtInternal, glFormat, glType;
- unsigned int Flags;
+struct wined3d_format_texture_info
+{
+ WINED3DFORMAT format;
+ GLint gl_internal;
+ GLint gl_srgb_internal;
+ GLint gl_rt_internal;
+ GLint gl_format;
+ GLint gl_type;
+ unsigned int conv_byte_count;
+ unsigned int flags;
GL_SupportedExt extension;
-} GlPixelFormatDescTemplate;
+ void (*convert)(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height);
+};
-/*****************************************************************************
- * OpenGL format template. Contains unexciting formats which do not need
- * extension checks. The order in this table is independent of the order in
- * the table StaticPixelFormatDesc above. Not all formats have to be in this
- * table.
- */
-static const GlPixelFormatDescTemplate gl_formats_template[] = {
+static void convert_l4a4_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ /* WINED3DFMT_L4A4_UNORM exists as an internal gl format, but for some reason there is not
+ * format+type combination to load it. Thus convert it to A8L8, then load it
+ * with A4L4 internal, but A8L8 format+type
+ */
+ unsigned int x, y;
+ const unsigned char *Source;
+ unsigned char *Dest;
+ UINT outpitch = pitch * 2;
+
+ for(y = 0; y < height; y++) {
+ Source = src + y * pitch;
+ Dest = dst + y * outpitch;
+ for (x = 0; x < width; x++ ) {
+ unsigned char color = (*Source++);
+ /* A */ Dest[1] = (color & 0xf0) << 0;
+ /* L */ Dest[0] = (color & 0x0f) << 4;
+ Dest += 2;
+ }
+ }
+}
+
+static void convert_r5g5_snorm_l6_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const WORD *Source;
+
+ for(y = 0; y < height; y++)
+ {
+ unsigned short *Dest_s = (unsigned short *) (dst + y * pitch);
+ Source = (const WORD *)(src + y * pitch);
+ for (x = 0; x < width; x++ )
+ {
+ short color = (*Source++);
+ unsigned char l = ((color >> 10) & 0xfc);
+ short v = ((color >> 5) & 0x3e);
+ short u = ((color ) & 0x1f);
+ short v_conv = v + 16;
+ short u_conv = u + 16;
+
+ *Dest_s = ((v_conv << 11) & 0xf800) | ((l << 5) & 0x7e0) | (u_conv & 0x1f);
+ Dest_s += 1;
+ }
+ }
+}
+
+static void convert_r5g5_snorm_l6_unorm_nv(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const WORD *Source;
+ unsigned char *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ /* This makes the gl surface bigger(24 bit instead of 16), but it works with
+ * fixed function and shaders without further conversion once the surface is
+ * loaded
+ */
+ for(y = 0; y < height; y++) {
+ Source = (const WORD *)(src + y * pitch);
+ Dest = dst + y * outpitch;
+ for (x = 0; x < width; x++ ) {
+ short color = (*Source++);
+ unsigned char l = ((color >> 10) & 0xfc);
+ char v = ((color >> 5) & 0x3e);
+ char u = ((color ) & 0x1f);
+
+ /* 8 bits destination, 6 bits source, 8th bit is the sign. gl ignores the sign
+ * and doubles the positive range. Thus shift left only once, gl does the 2nd
+ * shift. GL reads a signed value and converts it into an unsigned value.
+ */
+ /* M */ Dest[2] = l << 1;
+
+ /* Those are read as signed, but kept signed. Just left-shift 3 times to scale
+ * from 5 bit values to 8 bit values.
+ */
+ /* V */ Dest[1] = v << 3;
+ /* U */ Dest[0] = u << 3;
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r8g8_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const short *Source;
+ unsigned char *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const short *)(src + y * pitch);
+ Dest = dst + y * outpitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* B */ Dest[0] = 0xff;
+ /* G */ Dest[1] = (color >> 8) + 128; /* V */
+ /* R */ Dest[2] = (color) + 128; /* U */
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r8g8_snorm_l8x8_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned char *Dest;
+
+ /* Doesn't work correctly with the fixed function pipeline, but can work in
+ * shaders if the shader is adjusted. (There's no use for this format in gl's
+ * standard fixed function pipeline anyway).
+ */
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = dst + y * pitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* B */ Dest[0] = ((color >> 16) & 0xff); /* L */
+ /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
+ /* R */ Dest[2] = (color & 0xff) + 128; /* U */
+ Dest += 4;
+ }
+ }
+}
+
+static void convert_r8g8_snorm_l8x8_unorm_nv(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned char *Dest;
+
+ /* This implementation works with the fixed function pipeline and shaders
+ * without further modification after converting the surface.
+ */
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = dst + y * pitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* L */ Dest[2] = ((color >> 16) & 0xff); /* L */
+ /* V */ Dest[1] = ((color >> 8 ) & 0xff); /* V */
+ /* U */ Dest[0] = (color & 0xff); /* U */
+ /* I */ Dest[3] = 255; /* X */
+ Dest += 4;
+ }
+ }
+}
+
+static void convert_r8g8b8a8_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned char *Dest;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = dst + y * pitch;
+ for (x = 0; x < width; x++ )
+ {
+ LONG color = (*Source++);
+ /* B */ Dest[0] = ((color >> 16) & 0xff) + 128; /* W */
+ /* G */ Dest[1] = ((color >> 8 ) & 0xff) + 128; /* V */
+ /* R */ Dest[2] = (color & 0xff) + 128; /* U */
+ /* A */ Dest[3] = ((color >> 24) & 0xff) + 128; /* Q */
+ Dest += 4;
+ }
+ }
+}
+
+static void convert_r16g16_snorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const DWORD *Source;
+ unsigned short *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const DWORD *)(src + y * pitch);
+ Dest = (unsigned short *) (dst + y * outpitch);
+ for (x = 0; x < width; x++ )
+ {
+ DWORD color = (*Source++);
+ /* B */ Dest[0] = 0xffff;
+ /* G */ Dest[1] = (color >> 16) + 32768; /* V */
+ /* R */ Dest[2] = (color ) + 32768; /* U */
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r16g16(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const WORD *Source;
+ WORD *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const WORD *)(src + y * pitch);
+ Dest = (WORD *) (dst + y * outpitch);
+ for (x = 0; x < width; x++ )
+ {
+ WORD green = (*Source++);
+ WORD red = (*Source++);
+ Dest[0] = green;
+ Dest[1] = red;
+ /* Strictly speaking not correct for R16G16F, but it doesn't matter because the
+ * shader overwrites it anyway
+ */
+ Dest[2] = 0xffff;
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_r32g32_float(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ const float *Source;
+ float *Dest;
+ UINT outpitch = (pitch * 3)/2;
+
+ for(y = 0; y < height; y++)
+ {
+ Source = (const float *)(src + y * pitch);
+ Dest = (float *) (dst + y * outpitch);
+ for (x = 0; x < width; x++ )
+ {
+ float green = (*Source++);
+ float red = (*Source++);
+ Dest[0] = green;
+ Dest[1] = red;
+ Dest[2] = 1.0f;
+ Dest += 3;
+ }
+ }
+}
+
+static void convert_s1_uint_d15_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ UINT outpitch = pitch * 2;
+
+ for (y = 0; y < height; ++y)
+ {
+ const WORD *source = (const WORD *)(src + y * pitch);
+ DWORD *dest = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ /* The depth data is normalized, so needs to be scaled,
+ * the stencil data isn't. Scale depth data by
+ * (2^24-1)/(2^15-1) ~~ (2^9 + 2^-6). */
+ WORD d15 = source[x] >> 1;
+ DWORD d24 = (d15 << 9) + (d15 >> 6);
+ dest[x] = (d24 << 8) | (source[x] & 0x1);
+ }
+ }
+}
+
+static void convert_s4x4_uint_d24_unorm(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+
+ for (y = 0; y < height; ++y)
+ {
+ const DWORD *source = (const DWORD *)(src + y * pitch);
+ DWORD *dest = (DWORD *)(dst + y * pitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ /* Just need to clear out the X4 part. */
+ dest[x] = source[x] & ~0xf0;
+ }
+ }
+}
+
+static void convert_s8_uint_d24_float(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height)
+{
+ unsigned int x, y;
+ UINT outpitch = pitch * 2;
+
+ for (y = 0; y < height; ++y)
+ {
+ const DWORD *source = (const DWORD *)(src + y * pitch);
+ float *dest_f = (float *)(dst + y * outpitch);
+ DWORD *dest_s = (DWORD *)(dst + y * outpitch);
+
+ for (x = 0; x < width; ++x)
+ {
+ dest_f[x * 2] = float_24_to_32((source[x] & 0xffffff00) >> 8);
+ dest_s[x * 2 + 1] = source[x] & 0xff;
+ }
+ }
+}
+
+static const struct wined3d_format_texture_info format_texture_info[] =
+{
/* WINED3DFORMAT internal srgbInternal rtInternal
format type
flags
@@ -244,289 +561,296 @@ static const GlPixelFormatDescTemplate gl_formats_template[] = {
* endian machine
*/
{WINED3DFMT_UYVY, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_UYVY, GL_RGB, GL_RGB, 0,
- GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE,
+ GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_APPLE, 0,
WINED3DFMT_FLAG_FILTERING,
- APPLE_YCBCR_422},
+ APPLE_YCBCR_422, NULL},
{WINED3DFMT_YUY2, GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_YUY2, GL_RGB, GL_RGB, 0,
- GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE,
+ GL_YCBCR_422_APPLE, UNSIGNED_SHORT_8_8_REV_APPLE, 0,
WINED3DFMT_FLAG_FILTERING,
- APPLE_YCBCR_422},
+ APPLE_YCBCR_422, NULL},
{WINED3DFMT_YV12, GL_ALPHA, GL_ALPHA, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE,
+ GL_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_DXT1, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT2, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT3, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
{WINED3DFMT_DXT5, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- EXT_TEXTURE_COMPRESSION_S3TC},
+ GL_RGBA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ EXT_TEXTURE_COMPRESSION_S3TC, NULL},
/* IEEE formats */
{WINED3DFMT_R32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
- GL_RED, GL_FLOAT,
+ GL_RED, GL_FLOAT, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, NULL},
{WINED3DFMT_R32_FLOAT, GL_R32F, GL_R32F, 0,
- GL_RED, GL_FLOAT,
+ GL_RED, GL_FLOAT, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R32G32_FLOAT, GL_RGB32F_ARB, GL_RGB32F_ARB, 0,
- GL_RGB, GL_FLOAT,
+ GL_RGB, GL_FLOAT, 12,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, &convert_r32g32_float},
{WINED3DFMT_R32G32_FLOAT, GL_RG32F, GL_RG32F, 0,
- GL_RG, GL_FLOAT,
+ GL_RG, GL_FLOAT, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R32G32B32A32_FLOAT, GL_RGBA32F_ARB, GL_RGBA32F_ARB, 0,
- GL_RGBA, GL_FLOAT,
- WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ GL_RGBA, GL_FLOAT, 0,
+ WINED3DFMT_FLAG_RENDERTARGET | WINED3DFMT_FLAG_VTF,
+ ARB_TEXTURE_FLOAT, NULL},
/* Float */
{WINED3DFMT_R16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
- GL_RED, GL_HALF_FLOAT_ARB,
+ GL_RED, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, NULL},
{WINED3DFMT_R16_FLOAT, GL_R16F, GL_R16F, 0,
- GL_RED, GL_HALF_FLOAT_ARB,
+ GL_RED, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R16G16_FLOAT, GL_RGB16F_ARB, GL_RGB16F_ARB, 0,
- GL_RGB, GL_HALF_FLOAT_ARB,
+ GL_RGB, GL_HALF_FLOAT_ARB, 6,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, &convert_r16g16},
{WINED3DFMT_R16G16_FLOAT, GL_RG16F, GL_RG16F, 0,
- GL_RG, GL_HALF_FLOAT_ARB,
+ GL_RG, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_RG},
+ ARB_TEXTURE_RG, NULL},
{WINED3DFMT_R16G16B16A16_FLOAT, GL_RGBA16F_ARB, GL_RGBA16F_ARB, 0,
- GL_RGBA, GL_HALF_FLOAT_ARB,
+ GL_RGBA, GL_HALF_FLOAT_ARB, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_RENDERTARGET,
- ARB_TEXTURE_FLOAT},
+ ARB_TEXTURE_FLOAT, NULL},
/* Palettized formats */
{WINED3DFMT_P8_UINT, GL_RGBA, GL_RGBA, 0,
- GL_RGBA, GL_UNSIGNED_BYTE,
+ GL_ALPHA, GL_UNSIGNED_BYTE, 0,
0,
- ARB_FRAGMENT_PROGRAM},
+ ARB_FRAGMENT_PROGRAM, NULL},
{WINED3DFMT_P8_UINT, GL_COLOR_INDEX8_EXT, GL_COLOR_INDEX8_EXT, 0,
- GL_COLOR_INDEX, GL_UNSIGNED_BYTE,
+ GL_COLOR_INDEX, GL_UNSIGNED_BYTE, 0,
0,
- EXT_PALETTED_TEXTURE},
+ EXT_PALETTED_TEXTURE, NULL},
/* Standard ARGB formats */
{WINED3DFMT_B8G8R8_UNORM, GL_RGB8, GL_RGB8, 0,
- GL_BGR, GL_UNSIGNED_BYTE,
+ GL_BGR, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B8G8R8A8_UNORM, GL_RGBA8, GL_SRGB8_ALPHA8_EXT, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET
+ | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B8G8R8X8_UNORM, GL_RGB8, GL_SRGB8_EXT, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET
+ | WINED3DFMT_FLAG_SRGB_READ | WINED3DFMT_FLAG_SRGB_WRITE,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B5G6R5_UNORM, GL_RGB5, GL_RGB5, GL_RGB8,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B5G5R5X1_UNORM, GL_RGB5, GL_RGB5_A1, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV,
+ GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B5G5R5A1_UNORM, GL_RGB5_A1, GL_RGB5_A1, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV,
+ GL_BGRA, GL_UNSIGNED_SHORT_1_5_5_5_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B4G4R4A4_UNORM, GL_RGBA4, GL_SRGB8_ALPHA8_EXT, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B2G3R3_UNORM, GL_R3_G3_B2, GL_R3_G3_B2, 0,
- GL_RGB, GL_UNSIGNED_BYTE_3_3_2,
+ GL_RGB, GL_UNSIGNED_BYTE_3_3_2, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_A8_UNORM, GL_ALPHA8, GL_ALPHA8, 0,
- GL_ALPHA, GL_UNSIGNED_BYTE,
+ GL_ALPHA, GL_UNSIGNED_BYTE, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_B4G4R4X4_UNORM, GL_RGB4, GL_RGB4, 0,
- GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV,
+ GL_BGRA, GL_UNSIGNED_SHORT_4_4_4_4_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R10G10B10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
- GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV,
+ GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R8G8B8A8_UNORM, GL_RGBA8, GL_RGBA8, 0,
- GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R8G8B8X8_UNORM, GL_RGB8, GL_RGB8, 0,
- GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ GL_RGBA, GL_UNSIGNED_INT_8_8_8_8_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R16G16_UNORM, GL_RGB16, GL_RGB16, GL_RGBA16,
- GL_RGB, GL_UNSIGNED_SHORT,
+ GL_RGB, GL_UNSIGNED_SHORT, 6,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, &convert_r16g16},
{WINED3DFMT_B10G10R10A2_UNORM, GL_RGB10_A2, GL_RGB10_A2, 0,
- GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV,
+ GL_BGRA, GL_UNSIGNED_INT_2_10_10_10_REV, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_R16G16B16A16_UNORM, GL_RGBA16, GL_RGBA16, 0,
- GL_RGBA, GL_UNSIGNED_SHORT,
+ GL_RGBA, GL_UNSIGNED_SHORT, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_RENDERTARGET,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
/* Luminance */
{WINED3DFMT_L8_UNORM, GL_LUMINANCE8, GL_SLUMINANCE8_EXT, 0,
- GL_LUMINANCE, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_LUMINANCE, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_L8A8_UNORM, GL_LUMINANCE8_ALPHA8, GL_SLUMINANCE8_ALPHA8_EXT, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_SRGB_READ,
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_L4A4_UNORM, GL_LUMINANCE4_ALPHA4, GL_LUMINANCE4_ALPHA4, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 2,
0,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, &convert_l4a4_unorm},
/* Bump mapping stuff */
{WINED3DFMT_R8G8_SNORM, GL_RGB8, GL_RGB8, 0,
- GL_BGR, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGR, GL_UNSIGNED_BYTE, 3,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r8g8_snorm},
{WINED3DFMT_R8G8_SNORM, GL_DSDT8_NV, GL_DSDT8_NV, 0,
- GL_DSDT_NV, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_DSDT_NV, GL_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, NULL},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_RGB5, GL_RGB5, 0,
- GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r5g5_snorm_l6_unorm},
{WINED3DFMT_R5G5_SNORM_L6_UNORM, GL_DSDT8_MAG8_NV, GL_DSDT8_MAG8_NV, 0,
- GL_DSDT_MAG_NV, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_DSDT_MAG_NV, GL_BYTE, 3,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, &convert_r5g5_snorm_l6_unorm_nv},
{WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_RGB8, GL_RGB8, 0,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 4,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r8g8_snorm_l8x8_unorm},
{WINED3DFMT_R8G8_SNORM_L8X8_UNORM, GL_DSDT8_MAG8_INTENSITY8_NV, GL_DSDT8_MAG8_INTENSITY8_NV, 0,
- GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_DSDT_MAG_VIB_NV, GL_UNSIGNED_INT_8_8_S8_S8_REV_NV, 4,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, &convert_r8g8_snorm_l8x8_unorm_nv},
{WINED3DFMT_R8G8B8A8_SNORM, GL_RGBA8, GL_RGBA8, 0,
- GL_BGRA, GL_UNSIGNED_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGRA, GL_UNSIGNED_BYTE, 4,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r8g8b8a8_snorm},
{WINED3DFMT_R8G8B8A8_SNORM, GL_SIGNED_RGBA8_NV, GL_SIGNED_RGBA8_NV, 0,
- GL_RGBA, GL_BYTE,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_RGBA, GL_BYTE, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, NULL},
{WINED3DFMT_R16G16_SNORM, GL_RGB16, GL_RGB16, 0,
- GL_BGR, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ GL_BGR, GL_UNSIGNED_SHORT, 6,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ WINED3D_GL_EXT_NONE, &convert_r16g16_snorm},
{WINED3DFMT_R16G16_SNORM, GL_SIGNED_HILO16_NV, GL_SIGNED_HILO16_NV, 0,
- GL_HILO_NV, GL_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- NV_TEXTURE_SHADER},
+ GL_HILO_NV, GL_SHORT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_BUMPMAP,
+ NV_TEXTURE_SHADER, NULL},
/* Depth stencil formats */
{WINED3DFMT_D16_LOCKABLE, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_D32_UNORM, GL_DEPTH_COMPONENT32_ARB, GL_DEPTH_COMPONENT32_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- EXT_PACKED_DEPTH_STENCIL},
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ EXT_PACKED_DEPTH_STENCIL, &convert_s1_uint_d15_unorm},
{WINED3DFMT_S1_UINT_D15_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_FRAMEBUFFER_OBJECT},
+ GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_FRAMEBUFFER_OBJECT, &convert_s1_uint_d15_unorm},
{WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- EXT_PACKED_DEPTH_STENCIL},
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ EXT_PACKED_DEPTH_STENCIL, NULL},
{WINED3DFMT_D24_UNORM_S8_UINT, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_FRAMEBUFFER_OBJECT},
+ GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_FRAMEBUFFER_OBJECT, NULL},
{WINED3DFMT_X8D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_INT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8_EXT, GL_DEPTH24_STENCIL8_EXT, 0,
- GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- EXT_PACKED_DEPTH_STENCIL},
+ GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ EXT_PACKED_DEPTH_STENCIL, &convert_s4x4_uint_d24_unorm},
{WINED3DFMT_S4X4_UINT_D24_UNORM, GL_DEPTH24_STENCIL8, GL_DEPTH24_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_FRAMEBUFFER_OBJECT},
+ GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 4,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_FRAMEBUFFER_OBJECT, &convert_s4x4_uint_d24_unorm},
{WINED3DFMT_D16_UNORM, GL_DEPTH_COMPONENT24_ARB, GL_DEPTH_COMPONENT24_ARB, 0,
- GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT,
- WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_TEXTURE},
+ GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, 0,
+ WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING | WINED3DFMT_FLAG_DEPTH
+ | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_TEXTURE, NULL},
{WINED3DFMT_L16_UNORM, GL_LUMINANCE16, GL_LUMINANCE16, 0,
- GL_LUMINANCE, GL_UNSIGNED_SHORT,
+ GL_LUMINANCE, GL_UNSIGNED_SHORT, 0,
WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING | WINED3DFMT_FLAG_FILTERING,
- WINED3D_GL_EXT_NONE},
+ WINED3D_GL_EXT_NONE, NULL},
{WINED3DFMT_D32_FLOAT, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT32F, 0,
- GL_DEPTH_COMPONENT, GL_FLOAT,
- WINED3DFMT_FLAG_DEPTH,
- ARB_DEPTH_BUFFER_FLOAT},
+ GL_DEPTH_COMPONENT, GL_FLOAT, 0,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_BUFFER_FLOAT, NULL},
{WINED3DFMT_S8_UINT_D24_FLOAT, GL_DEPTH32F_STENCIL8, GL_DEPTH32F_STENCIL8, 0,
- GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV,
- WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL,
- ARB_DEPTH_BUFFER_FLOAT},
+ GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 8,
+ WINED3DFMT_FLAG_DEPTH | WINED3DFMT_FLAG_STENCIL | WINED3DFMT_FLAG_SHADOW,
+ ARB_DEPTH_BUFFER_FLOAT, &convert_s8_uint_d24_float},
/* Vendor-specific formats */
{WINED3DFMT_ATI2N, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
0,
- ATI_TEXTURE_COMPRESSION_3DC},
+ ATI_TEXTURE_COMPRESSION_3DC, NULL},
{WINED3DFMT_ATI2N, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 0,
- GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
+ GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0,
0,
- EXT_TEXTURE_COMPRESSION_RGTC},
+ EXT_TEXTURE_COMPRESSION_RGTC, NULL},
};
static inline int getFmtIdx(WINED3DFORMAT fmt) {
@@ -560,7 +884,7 @@ static BOOL init_format_base_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < format_count; ++i)
{
- struct GlPixelFormatDesc *desc = &gl_info->gl_formats[i];
+ struct wined3d_format_desc *desc = &gl_info->gl_formats[i];
desc->format = formats[i].format;
desc->red_mask = formats[i].redMask;
desc->green_mask = formats[i].greenMask;
@@ -595,7 +919,7 @@ static BOOL init_format_compression_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < (sizeof(format_compression_info) / sizeof(*format_compression_info)); ++i)
{
- struct GlPixelFormatDesc *format_desc;
+ struct wined3d_format_desc *format_desc;
int fmt_idx = getFmtIdx(format_compression_info[i].format);
if (fmt_idx == -1)
@@ -616,7 +940,7 @@ static BOOL init_format_compression_info(struct wined3d_gl_info *gl_info)
}
/* Context activation is done by the caller. */
-static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct GlPixelFormatDesc *format_desc)
+static void check_fbo_compat(const struct wined3d_gl_info *gl_info, struct wined3d_format_desc *format_desc)
{
/* Check if the default internal format is supported as a frame buffer
* target, otherwise fall back to the render target internal.
@@ -755,7 +1079,7 @@ static void init_format_fbo_compat_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < sizeof(formats) / sizeof(*formats); ++i)
{
- struct GlPixelFormatDesc *desc = &gl_info->gl_formats[i];
+ struct wined3d_format_desc *desc = &gl_info->gl_formats[i];
if (!desc->glInternal) continue;
@@ -798,29 +1122,33 @@ static BOOL init_format_texture_info(struct wined3d_gl_info *gl_info)
{
unsigned int i;
- for (i = 0; i < sizeof(gl_formats_template) / sizeof(gl_formats_template[0]); ++i)
+ for (i = 0; i < sizeof(format_texture_info) / sizeof(*format_texture_info); ++i)
{
- int fmt_idx = getFmtIdx(gl_formats_template[i].fmt);
- struct GlPixelFormatDesc *desc;
+ int fmt_idx = getFmtIdx(format_texture_info[i].format);
+ struct wined3d_format_desc *desc;
if (fmt_idx == -1)
{
ERR("Format %s (%#x) not found.\n",
- debug_d3dformat(gl_formats_template[i].fmt), gl_formats_template[i].fmt);
+ debug_d3dformat(format_texture_info[i].format), format_texture_info[i].format);
return FALSE;
}
- if (!gl_info->supported[gl_formats_template[i].extension]) continue;
+ if (!gl_info->supported[format_texture_info[i].extension]) continue;
desc = &gl_info->gl_formats[fmt_idx];
- desc->glInternal = gl_formats_template[i].glInternal;
- desc->glGammaInternal = gl_formats_template[i].glGammaInternal;
- desc->rtInternal = gl_formats_template[i].rtInternal;
- desc->glFormat = gl_formats_template[i].glFormat;
- desc->glType = gl_formats_template[i].glType;
+ desc->glInternal = format_texture_info[i].gl_internal;
+ desc->glGammaInternal = format_texture_info[i].gl_srgb_internal;
+ desc->rtInternal = format_texture_info[i].gl_rt_internal;
+ desc->glFormat = format_texture_info[i].gl_format;
+ desc->glType = format_texture_info[i].gl_type;
desc->color_fixup = COLOR_FIXUP_IDENTITY;
- desc->Flags |= gl_formats_template[i].Flags;
+ desc->Flags |= format_texture_info[i].flags;
desc->heightscale = 1.0f;
+
+ /* Texture conversion stuff */
+ desc->convert = format_texture_info[i].convert;
+ desc->conv_byte_count = format_texture_info[i].conv_byte_count;
}
return TRUE;
@@ -938,6 +1266,7 @@ static BOOL check_filter(const struct wined3d_gl_info *gl_info, GLenum internal)
static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor)
{
+ struct wined3d_format_desc *desc;
unsigned int fmt_idx, i;
WINED3DFORMAT fmts16[] = {
WINED3DFMT_R16_FLOAT,
@@ -945,7 +1274,6 @@ static void init_format_filter_info(struct wined3d_gl_info *gl_info, enum wined3
WINED3DFMT_R16G16B16A16_FLOAT,
};
BOOL filtered;
- struct GlPixelFormatDesc *desc;
if(wined3d_settings.offscreen_rendering_mode != ORM_FBO)
{
@@ -1043,6 +1371,7 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
idx = getFmtIdx(WINED3DFMT_R8G8_SNORM);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
+
idx = getFmtIdx(WINED3DFMT_R16G16_SNORM);
gl_info->gl_formats[idx].color_fixup = create_color_fixup_desc(
0, CHANNEL_SOURCE_X, 0, CHANNEL_SOURCE_Y, 0, CHANNEL_SOURCE_ONE, 0, CHANNEL_SOURCE_ONE);
@@ -1098,8 +1427,11 @@ static void apply_format_fixups(struct wined3d_gl_info *gl_info)
gl_info->gl_formats[idx].heightscale = 1.5f;
gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_YV12);
- idx = getFmtIdx(WINED3DFMT_P8_UINT);
- gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
+ if (gl_info->supported[EXT_PALETTED_TEXTURE] || gl_info->supported[ARB_FRAGMENT_PROGRAM])
+ {
+ idx = getFmtIdx(WINED3DFMT_P8_UINT);
+ gl_info->gl_formats[idx].color_fixup = create_complex_fixup_desc(COMPLEX_FIXUP_P8);
+ }
if (gl_info->supported[ARB_VERTEX_ARRAY_BGRA])
{
@@ -1125,7 +1457,7 @@ static BOOL init_format_vertex_info(struct wined3d_gl_info *gl_info)
for (i = 0; i < (sizeof(format_vertex_info) / sizeof(*format_vertex_info)); ++i)
{
- struct GlPixelFormatDesc *format_desc;
+ struct wined3d_format_desc *format_desc;
int fmt_idx = getFmtIdx(format_vertex_info[i].format);
if (fmt_idx == -1)
@@ -1182,7 +1514,7 @@ fail:
return FALSE;
}
-const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info)
+const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt, const struct wined3d_gl_info *gl_info)
{
int idx = getFmtIdx(fmt);
@@ -1485,9 +1817,7 @@ const char* debug_d3dprimitivetype(WINED3DPRIMITIVETYPE PrimitiveType) {
const char* debug_d3drenderstate(DWORD state) {
switch (state) {
#define D3DSTATE_TO_STR(u) case u: return #u
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREHANDLE );
D3DSTATE_TO_STR(WINED3DRS_ANTIALIAS );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESS );
D3DSTATE_TO_STR(WINED3DRS_TEXTUREPERSPECTIVE );
D3DSTATE_TO_STR(WINED3DRS_WRAPU );
D3DSTATE_TO_STR(WINED3DRS_WRAPV );
@@ -1501,11 +1831,8 @@ const char* debug_d3drenderstate(DWORD state) {
D3DSTATE_TO_STR(WINED3DRS_ZWRITEENABLE );
D3DSTATE_TO_STR(WINED3DRS_ALPHATESTENABLE );
D3DSTATE_TO_STR(WINED3DRS_LASTPIXEL );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREMAG );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREMIN );
D3DSTATE_TO_STR(WINED3DRS_SRCBLEND );
D3DSTATE_TO_STR(WINED3DRS_DESTBLEND );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREMAPBLEND );
D3DSTATE_TO_STR(WINED3DRS_CULLMODE );
D3DSTATE_TO_STR(WINED3DRS_ZFUNC );
D3DSTATE_TO_STR(WINED3DRS_ALPHAREF );
@@ -1526,9 +1853,6 @@ const char* debug_d3drenderstate(DWORD state) {
D3DSTATE_TO_STR(WINED3DRS_STIPPLEENABLE );
D3DSTATE_TO_STR(WINED3DRS_EDGEANTIALIAS );
D3DSTATE_TO_STR(WINED3DRS_COLORKEYENABLE );
- D3DSTATE_TO_STR(WINED3DRS_BORDERCOLOR );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESSU );
- D3DSTATE_TO_STR(WINED3DRS_TEXTUREADDRESSV );
D3DSTATE_TO_STR(WINED3DRS_MIPMAPLODBIAS );
D3DSTATE_TO_STR(WINED3DRS_ZBIAS );
D3DSTATE_TO_STR(WINED3DRS_RANGEFOGENABLE );
@@ -1544,38 +1868,6 @@ const char* debug_d3drenderstate(DWORD state) {
D3DSTATE_TO_STR(WINED3DRS_STENCILMASK );
D3DSTATE_TO_STR(WINED3DRS_STENCILWRITEMASK );
D3DSTATE_TO_STR(WINED3DRS_TEXTUREFACTOR );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN00 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN01 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN02 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN03 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN04 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN05 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN06 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN07 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN08 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN09 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN10 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN11 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN12 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN13 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN14 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN15 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN16 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN17 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN18 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN19 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN20 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN21 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN22 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN23 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN24 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN25 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN26 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN27 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN28 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN29 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN30 );
- D3DSTATE_TO_STR(WINED3DRS_STIPPLEPATTERN31 );
D3DSTATE_TO_STR(WINED3DRS_WRAP0 );
D3DSTATE_TO_STR(WINED3DRS_WRAP1 );
D3DSTATE_TO_STR(WINED3DRS_WRAP2 );
@@ -2125,7 +2417,7 @@ unsigned int count_bits(unsigned int mask)
/* Helper function for retrieving color info for ChoosePixelFormat and wglChoosePixelFormatARB.
* The later function requires individual color components. */
-BOOL getColorBits(const struct GlPixelFormatDesc *format_desc,
+BOOL getColorBits(const struct wined3d_format_desc *format_desc,
short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize)
{
TRACE("fmt: %s\n", debug_d3dformat(format_desc->format));
@@ -2162,7 +2454,7 @@ BOOL getColorBits(const struct GlPixelFormatDesc *format_desc,
}
/* Helper function for retrieving depth/stencil info for ChoosePixelFormat and wglChoosePixelFormatARB */
-BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *depthSize, short *stencilSize)
+BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc, short *depthSize, short *stencilSize)
{
TRACE("fmt: %s\n", debug_d3dformat(format_desc->format));
switch(format_desc->format)
@@ -2190,6 +2482,115 @@ BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc, short *dep
return TRUE;
}
+DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt)
+{
+ unsigned int r, g, b, a;
+ DWORD ret;
+
+ if (destfmt == WINED3DFMT_B8G8R8A8_UNORM
+ || destfmt == WINED3DFMT_B8G8R8X8_UNORM
+ || destfmt == WINED3DFMT_B8G8R8_UNORM)
+ return color;
+
+ TRACE("Converting color %08x to format %s\n", color, debug_d3dformat(destfmt));
+
+ a = (color & 0xff000000) >> 24;
+ r = (color & 0x00ff0000) >> 16;
+ g = (color & 0x0000ff00) >> 8;
+ b = (color & 0x000000ff) >> 0;
+
+ switch(destfmt)
+ {
+ case WINED3DFMT_B5G6R5_UNORM:
+ if(r == 0xff && g == 0xff && b == 0xff) return 0xffff;
+ r = (r * 32) / 256;
+ g = (g * 64) / 256;
+ b = (b * 32) / 256;
+ ret = r << 11;
+ ret |= g << 5;
+ ret |= b;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_B5G5R5X1_UNORM:
+ case WINED3DFMT_B5G5R5A1_UNORM:
+ a = (a * 2) / 256;
+ r = (r * 32) / 256;
+ g = (g * 32) / 256;
+ b = (b * 32) / 256;
+ ret = a << 15;
+ ret |= r << 10;
+ ret |= g << 5;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_A8_UNORM:
+ TRACE("Returning %08x\n", a);
+ return a;
+
+ case WINED3DFMT_B4G4R4X4_UNORM:
+ case WINED3DFMT_B4G4R4A4_UNORM:
+ a = (a * 16) / 256;
+ r = (r * 16) / 256;
+ g = (g * 16) / 256;
+ b = (b * 16) / 256;
+ ret = a << 12;
+ ret |= r << 8;
+ ret |= g << 4;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_B2G3R3_UNORM:
+ r = (r * 8) / 256;
+ g = (g * 8) / 256;
+ b = (b * 4) / 256;
+ ret = r << 5;
+ ret |= g << 2;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_R8G8B8X8_UNORM:
+ case WINED3DFMT_R8G8B8A8_UNORM:
+ ret = a << 24;
+ ret |= b << 16;
+ ret |= g << 8;
+ ret |= r << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_B10G10R10A2_UNORM:
+ a = (a * 4) / 256;
+ r = (r * 1024) / 256;
+ g = (g * 1024) / 256;
+ b = (b * 1024) / 256;
+ ret = a << 30;
+ ret |= r << 20;
+ ret |= g << 10;
+ ret |= b << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ case WINED3DFMT_R10G10B10A2_UNORM:
+ a = (a * 4) / 256;
+ r = (r * 1024) / 256;
+ g = (g * 1024) / 256;
+ b = (b * 1024) / 256;
+ ret = a << 30;
+ ret |= b << 20;
+ ret |= g << 10;
+ ret |= r << 0;
+ TRACE("Returning %08x\n", ret);
+ return ret;
+
+ default:
+ FIXME("Add a COLORFILL conversion for format %s\n", debug_d3dformat(destfmt));
+ return 0;
+ }
+}
+
/* DirectDraw stuff */
WINED3DFORMAT pixelformat_for_depth(DWORD depth) {
switch(depth) {
@@ -2258,147 +2659,6 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
return size;
}
-/***********************************************************************
- * CalculateTexRect
- *
- * Calculates the dimensions of the opengl texture used for blits.
- * Handled oversized opengl textures and updates the source rectangle
- * accordingly
- *
- * Params:
- * This: Surface to operate on
- * Rect: Requested rectangle
- *
- * Returns:
- * TRUE if the texture part can be loaded,
- * FALSE otherwise
- *
- *********************************************************************/
-BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4])
-{
- const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
- int x1 = Rect->left, x2 = Rect->right;
- int y1 = Rect->top, y2 = Rect->bottom;
- GLint maxSize = gl_info->limits.texture_size;
-
- TRACE("(%p)->(%d,%d)-(%d,%d)\n", This,
- Rect->left, Rect->top, Rect->right, Rect->bottom);
-
- /* The sizes might be reversed */
- if(Rect->left > Rect->right) {
- x1 = Rect->right;
- x2 = Rect->left;
- }
- if(Rect->top > Rect->bottom) {
- y1 = Rect->bottom;
- y2 = Rect->top;
- }
-
- /* No oversized texture? This is easy */
- if(!(This->Flags & SFLAG_OVERSIZE)) {
- /* Which rect from the texture do I need? */
- if (This->texture_target == GL_TEXTURE_RECTANGLE_ARB)
- {
- glTexCoord[0] = (float) Rect->left;
- glTexCoord[2] = (float) Rect->top;
- glTexCoord[1] = (float) Rect->right;
- glTexCoord[3] = (float) Rect->bottom;
- } else {
- glTexCoord[0] = (float) Rect->left / (float) This->pow2Width;
- glTexCoord[2] = (float) Rect->top / (float) This->pow2Height;
- glTexCoord[1] = (float) Rect->right / (float) This->pow2Width;
- glTexCoord[3] = (float) Rect->bottom / (float) This->pow2Height;
- }
-
- return TRUE;
- } else {
- /* Check if we can succeed at all */
- if( (x2 - x1) > maxSize ||
- (y2 - y1) > maxSize ) {
- TRACE("Requested rectangle is too large for gl\n");
- return FALSE;
- }
-
- /* A part of the texture has to be picked. First, check if
- * some texture part is loaded already, if yes try to re-use it.
- * If the texture is dirty, or the part can't be used,
- * re-position the part to load
- */
- if(This->Flags & SFLAG_INTEXTURE) {
- if(This->glRect.left <= x1 && This->glRect.right >= x2 &&
- This->glRect.top <= y1 && This->glRect.bottom >= x2 ) {
- /* Ok, the rectangle is ok, re-use it */
- TRACE("Using existing gl Texture\n");
- } else {
- /* Rectangle is not ok, dirtify the texture to reload it */
- TRACE("Dirtifying texture to force reload\n");
- This->Flags &= ~SFLAG_INTEXTURE;
- }
- }
-
- /* Now if we are dirty(no else if!) */
- if(!(This->Flags & SFLAG_INTEXTURE)) {
- /* Set the new rectangle. Use the following strategy:
- * 1) Use as big textures as possible.
- * 2) Place the texture part in the way that the requested
- * part is in the middle of the texture(well, almost)
- * 3) If the texture is moved over the edges of the
- * surface, replace it nicely
- * 4) If the coord is not limiting the texture size,
- * use the whole size
- */
- if((This->pow2Width) > maxSize) {
- This->glRect.left = x1 - maxSize / 2;
- if(This->glRect.left < 0) {
- This->glRect.left = 0;
- }
- This->glRect.right = This->glRect.left + maxSize;
- if(This->glRect.right > This->currentDesc.Width) {
- This->glRect.right = This->currentDesc.Width;
- This->glRect.left = This->glRect.right - maxSize;
- }
- } else {
- This->glRect.left = 0;
- This->glRect.right = This->pow2Width;
- }
-
- if (This->pow2Height > maxSize)
- {
- This->glRect.top = x1 - gl_info->limits.texture_size / 2;
- if(This->glRect.top < 0) This->glRect.top = 0;
- This->glRect.bottom = This->glRect.left + maxSize;
- if(This->glRect.bottom > This->currentDesc.Height) {
- This->glRect.bottom = This->currentDesc.Height;
- This->glRect.top = This->glRect.bottom - maxSize;
- }
- } else {
- This->glRect.top = 0;
- This->glRect.bottom = This->pow2Height;
- }
- TRACE("(%p): Using rect (%d,%d)-(%d,%d)\n", This,
- This->glRect.left, This->glRect.top, This->glRect.right, This->glRect.bottom);
- }
-
- /* Re-calculate the rect to draw */
- Rect->left -= This->glRect.left;
- Rect->right -= This->glRect.left;
- Rect->top -= This->glRect.top;
- Rect->bottom -= This->glRect.top;
-
- /* Get the gl coordinates. The gl rectangle is a power of 2, eigher the max size,
- * or the pow2Width / pow2Height of the surface.
- *
- * Can never be GL_TEXTURE_RECTANGLE_ARB because oversized surfaces are always set up
- * as regular GL_TEXTURE_2D.
- */
- glTexCoord[0] = (float) Rect->left / (float) (This->glRect.right - This->glRect.left);
- glTexCoord[2] = (float) Rect->top / (float) (This->glRect.bottom - This->glRect.top);
- glTexCoord[1] = (float) Rect->right / (float) (This->glRect.right - This->glRect.left);
- glTexCoord[3] = (float) Rect->bottom / (float) (This->glRect.bottom - This->glRect.top);
- }
- return TRUE;
-}
-
void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_settings *settings, BOOL ignore_textype) {
#define ARG1 0x01
#define ARG2 0x02
@@ -2518,8 +2778,8 @@ void gen_ffp_frag_op(IWineD3DStateBlockImpl *stateblock, struct ffp_frag_setting
if (texture_dimensions == GL_TEXTURE_2D || texture_dimensions == GL_TEXTURE_RECTANGLE_ARB)
{
- IWineD3DSurfaceImpl *surf;
- surf = (IWineD3DSurfaceImpl *) ((IWineD3DTextureImpl *) stateblock->textures[0])->surfaces[0];
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)stateblock->textures[0];
+ IWineD3DSurfaceImpl *surf = (IWineD3DSurfaceImpl *)texture->baseTexture.sub_resources[0];
if (surf->CKeyFlags & WINEDDSD_CKSRCBLT && !surf->resource.format_desc->alpha_mask)
{
@@ -2826,8 +3086,10 @@ UINT wined3d_log2i(UINT32 x)
* and the user preferences in wined3d_settings. */
void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected, int *vs_selected)
{
+ BOOL glsl = wined3d_settings.glslRequested && gl_info->glsl_version >= MAKEDWORD_VERSION(1, 20);
+
if (wined3d_settings.vs_mode == VS_NONE) *vs_selected = SHADER_NONE;
- else if (gl_info->supported[ARB_VERTEX_SHADER] && wined3d_settings.glslRequested)
+ else if (gl_info->supported[ARB_VERTEX_SHADER] && glsl)
{
/* Geforce4 cards support GLSL but for vertex shaders only. Further its reported GLSL caps are
* wrong. This combined with the fact that glsl won't offer more features or performance, use ARB
@@ -2839,7 +3101,7 @@ void select_shader_mode(const struct wined3d_gl_info *gl_info, int *ps_selected,
else *vs_selected = SHADER_NONE;
if (wined3d_settings.ps_mode == PS_NONE) *ps_selected = SHADER_NONE;
- else if (gl_info->supported[ARB_FRAGMENT_SHADER] && wined3d_settings.glslRequested) *ps_selected = SHADER_GLSL;
+ else if (gl_info->supported[ARB_FRAGMENT_SHADER] && glsl) *ps_selected = SHADER_GLSL;
else if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) *ps_selected = SHADER_ARB;
else if (gl_info->supported[ATI_FRAGMENT_SHADER]) *ps_selected = SHADER_ATI;
else *ps_selected = SHADER_NONE;
diff --git a/dll/directx/wine/wined3d/view.c b/dll/directx/wine/wined3d/view.c
index bbf0f5f65c1..0c9919dd14c 100644
--- a/dll/directx/wine/wined3d/view.c
+++ b/dll/directx/wine/wined3d/view.c
@@ -97,7 +97,7 @@ static HRESULT STDMETHODCALLTYPE rendertarget_view_GetResource(IWineD3DRendertar
return WINED3D_OK;
}
-const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
+static const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
{
/* IUnknown methods */
rendertarget_view_QueryInterface,
@@ -108,3 +108,13 @@ const struct IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl =
/* IWineD3DRendertargetView methods */
rendertarget_view_GetResource,
};
+
+void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view,
+ IWineD3DResource *resource, IUnknown *parent)
+{
+ view->vtbl = &wined3d_rendertarget_view_vtbl;
+ view->refcount = 1;
+ IWineD3DResource_AddRef(resource);
+ view->resource = resource;
+ view->parent = parent;
+}
diff --git a/dll/directx/wine/wined3d/volume.c b/dll/directx/wine/wined3d/volume.c
index 8e19ee9c763..42e61e68d22 100644
--- a/dll/directx/wine/wined3d/volume.c
+++ b/dll/directx/wine/wined3d/volume.c
@@ -25,7 +25,6 @@
#include "wined3d_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d_surface);
-#define GLINFO_LOCATION This->resource.device->adapter->gl_info
/* Context activation is done by the caller. */
static void volume_bind_and_dirtify(IWineD3DVolume *iface) {
@@ -313,9 +312,11 @@ static HRESULT WINAPI IWineD3DVolumeImpl_SetContainer(IWineD3DVolume *iface, IWi
}
/* Context activation is done by the caller. */
-static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode) {
- IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
- const struct GlPixelFormatDesc *glDesc = This->resource.format_desc;
+static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, int gl_level, BOOL srgb_mode)
+{
+ IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
+ const struct wined3d_gl_info *gl_info = &This->resource.device->adapter->gl_info;
+ const struct wined3d_format_desc *glDesc = This->resource.format_desc;
TRACE("(%p) : level %u, format %s (0x%08x)\n", This, gl_level, debug_d3dformat(glDesc->format), glDesc->format);
@@ -386,7 +387,7 @@ HRESULT volume_init(IWineD3DVolumeImpl *volume, IWineD3DDeviceImpl *device, UINT
IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
HRESULT hr;
if (!gl_info->supported[EXT_TEXTURE3D])
diff --git a/dll/directx/wine/wined3d/volumetexture.c b/dll/directx/wine/wined3d/volumetexture.c
index 14ca72fcd49..9fccb2b8936 100644
--- a/dll/directx/wine/wined3d/volumetexture.c
+++ b/dll/directx/wine/wined3d/volumetexture.c
@@ -39,7 +39,7 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE
TRACE("(%p) : About to load texture.\n", This);
- if (!device->isInDraw) context = context_acquire(device, NULL, CTXUSAGE_RESOURCELOAD);
+ if (!device->isInDraw) context = context_acquire(device, NULL);
else if (gl_info->supported[EXT_TEXTURE_SRGB] && This->baseTexture.bindCount > 0)
{
srgb_mode = device->stateBlock->samplerState[This->baseTexture.sampler][WINED3DSAMP_SRGBTEXTURE];
@@ -51,17 +51,19 @@ static void volumetexture_internal_preload(IWineD3DBaseTexture *iface, enum WINE
* since the last load then reload the volumes. */
if (This->baseTexture.texture_rgb.dirty)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
+ IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i];
+ IWineD3DVolume_LoadTexture(volume, i, srgb_mode);
}
}
else if (srgb_was_toggled)
{
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- volume_add_dirty_box(This->volumes[i], NULL);
- IWineD3DVolume_LoadTexture(This->volumes[i], i, srgb_mode);
+ IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i];
+ volume_add_dirty_box(volume, NULL);
+ IWineD3DVolume_LoadTexture(volume, i, srgb_mode);
}
}
else
@@ -81,9 +83,9 @@ static void volumetexture_cleanup(IWineD3DVolumeTextureImpl *This)
TRACE("(%p) : Cleaning up.\n", This);
- for (i = 0; i < This->baseTexture.levels; ++i)
+ for (i = 0; i < This->baseTexture.level_count; ++i)
{
- IWineD3DVolume *volume = This->volumes[i];
+ IWineD3DVolume *volume = (IWineD3DVolume *)This->baseTexture.sub_resources[i];
if (volume)
{
@@ -172,8 +174,9 @@ static void WINAPI IWineD3DVolumeTextureImpl_UnLoad(IWineD3DVolumeTexture *iface
* surface before, this one will be a NOP and vice versa. Unloading an unloaded
* surface is fine
*/
- for (i = 0; i < This->baseTexture.levels; i++) {
- IWineD3DVolume_UnLoad(This->volumes[i]);
+ for (i = 0; i < This->baseTexture.level_count; ++i)
+ {
+ IWineD3DVolume_UnLoad((IWineD3DVolume *)This->baseTexture.sub_resources[i]);
}
basetexture_unload((IWineD3DBaseTexture *)iface);
@@ -250,65 +253,95 @@ static BOOL WINAPI IWineD3DVolumeTextureImpl_IsCondNP2(IWineD3DVolumeTexture *if
/* *******************************************
IWineD3DVolumeTexture IWineD3DVolumeTexture parts follow
******************************************* */
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetLevelDesc(IWineD3DVolumeTexture *iface, UINT Level,WINED3DVOLUME_DESC *pDesc) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- if (Level < This->baseTexture.levels) {
- TRACE("(%p) Level (%d)\n", This, Level);
- return IWineD3DVolume_GetDesc(This->volumes[Level], pDesc);
- } else {
- WARN("(%p) Level (%d)\n", This, Level);
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetLevelDesc(IWineD3DVolumeTexture *iface,
+ UINT level, WINED3DVOLUME_DESC *desc)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
+
+ TRACE("iface %p, level %u, desc %p.\n", iface, level, desc);
+
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
+
+ return IWineD3DVolume_GetDesc(volume, desc);
+}
+
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetVolumeLevel(IWineD3DVolumeTexture *iface,
+ UINT level, IWineD3DVolume **volume)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *v;
+
+ TRACE("iface %p, level %u, volume %p.\n", iface, level, volume);
+
+ if (!(v = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ IWineD3DVolume_AddRef(v);
+ *volume = v;
+
+ TRACE("Returning volume %p.\n", *volume);
+
return WINED3D_OK;
}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_GetVolumeLevel(IWineD3DVolumeTexture *iface, UINT Level, IWineD3DVolume** ppVolumeLevel) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- if (Level < This->baseTexture.levels) {
- *ppVolumeLevel = This->volumes[Level];
- IWineD3DVolume_AddRef(*ppVolumeLevel);
- TRACE("(%p) -> level(%d) returning volume@%p\n", This, Level, *ppVolumeLevel);
- } else {
- WARN("(%p) Level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_LockBox(IWineD3DVolumeTexture *iface,
+ UINT level, WINED3DLOCKED_BOX *locked_box, const WINED3DBOX *box, DWORD flags)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
+
+ TRACE("iface %p, level %u, locked_box %p, box %p, flags %#x.\n",
+ iface, level, locked_box, box, flags);
+
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return WINED3D_OK;
-}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_LockBox(IWineD3DVolumeTexture *iface, UINT Level, WINED3DLOCKED_BOX* pLockedVolume, CONST WINED3DBOX* pBox, DWORD Flags) {
- HRESULT hr;
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
-
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DVolume_LockBox(This->volumes[Level], pLockedVolume, pBox, Flags);
- TRACE("(%p) Level (%d) success(%u)\n", This, Level, hr);
-
- } else {
- FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
- }
- return hr;
+ return IWineD3DVolume_LockBox(volume, locked_box, box, flags);
}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_UnlockBox(IWineD3DVolumeTexture *iface, UINT Level) {
- HRESULT hr;
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_UnlockBox(IWineD3DVolumeTexture *iface, UINT level)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
- if (Level < This->baseTexture.levels) {
- hr = IWineD3DVolume_UnlockBox(This->volumes[Level]);
- TRACE("(%p) -> level(%d) success(%u)\n", This, Level, hr);
+ TRACE("iface %p, level %u.\n", iface, level);
- } else {
- FIXME("(%p) level(%d) overflow Levels(%d)\n", This, Level, This->baseTexture.levels);
- return WINED3DERR_INVALIDCALL;
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, level)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
}
- return hr;
+
+ return IWineD3DVolume_UnlockBox(volume);
}
-static HRESULT WINAPI IWineD3DVolumeTextureImpl_AddDirtyBox(IWineD3DVolumeTexture *iface, CONST WINED3DBOX* pDirtyBox) {
- IWineD3DVolumeTextureImpl *This = (IWineD3DVolumeTextureImpl *)iface;
- This->baseTexture.texture_rgb.dirty = TRUE;
- This->baseTexture.texture_srgb.dirty = TRUE;
- TRACE("(%p) : dirtyfication of volume Level (0)\n", This);
- volume_add_dirty_box(This->volumes[0], pDirtyBox);
+static HRESULT WINAPI IWineD3DVolumeTextureImpl_AddDirtyBox(IWineD3DVolumeTexture *iface, const WINED3DBOX *dirty_box)
+{
+ IWineD3DBaseTextureImpl *texture = (IWineD3DBaseTextureImpl *)iface;
+ IWineD3DVolume *volume;
+
+ TRACE("iface %p, dirty_box %p.\n", iface, dirty_box);
+
+ if (!(volume = (IWineD3DVolume *)basetexture_get_sub_resource(texture, 0, 0)))
+ {
+ WARN("Failed to get sub-resource.\n");
+ return WINED3DERR_INVALIDCALL;
+ }
+
+ texture->baseTexture.texture_rgb.dirty = TRUE;
+ texture->baseTexture.texture_srgb.dirty = TRUE;
+ volume_add_dirty_box(volume, dirty_box);
return WINED3D_OK;
}
@@ -355,7 +388,7 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops)
{
const struct wined3d_gl_info *gl_info = &device->adapter->gl_info;
- const struct GlPixelFormatDesc *format_desc = getFormatDescEntry(format, gl_info);
+ const struct wined3d_format_desc *format_desc = getFormatDescEntry(format, gl_info);
UINT tmp_w, tmp_h, tmp_d;
unsigned int i;
HRESULT hr;
@@ -399,8 +432,8 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
texture->lpVtbl = &IWineD3DVolumeTexture_Vtbl;
- hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, levels, WINED3DRTYPE_VOLUMETEXTURE,
- device, 0, usage, format_desc, pool, parent, parent_ops);
+ hr = basetexture_init((IWineD3DBaseTextureImpl *)texture, 1, levels,
+ WINED3DRTYPE_VOLUMETEXTURE, device, 0, usage, format_desc, pool, parent, parent_ops);
if (FAILED(hr))
{
WARN("Failed to initialize basetexture, returning %#x.\n", hr);
@@ -418,21 +451,23 @@ HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT
tmp_h = height;
tmp_d = depth;
- for (i = 0; i < texture->baseTexture.levels; ++i)
+ for (i = 0; i < texture->baseTexture.level_count; ++i)
{
+ IWineD3DVolume *volume;
+
/* Create the volume. */
hr = IWineD3DDeviceParent_CreateVolume(device->device_parent, parent,
- tmp_w, tmp_h, tmp_d, format, pool, usage, &texture->volumes[i]);
+ tmp_w, tmp_h, tmp_d, format, pool, usage, &volume);
if (FAILED(hr))
{
ERR("Creating a volume for the volume texture failed, hr %#x.\n", hr);
- texture->volumes[i] = NULL;
volumetexture_cleanup(texture);
return hr;
}
/* Set its container to this texture. */
- IWineD3DVolume_SetContainer(texture->volumes[i], (IWineD3DBase *)texture);
+ IWineD3DVolume_SetContainer(volume, (IWineD3DBase *)texture);
+ texture->baseTexture.sub_resources[i] = (IWineD3DResourceImpl *)volume;
/* Calculate the next mipmap level. */
tmp_w = max(1, tmp_w >> 1);
diff --git a/dll/directx/wine/wined3d/wined3d_gl.h b/dll/directx/wine/wined3d/wined3d_gl.h
index f8097d65cb9..4ece7e7df9a 100644
--- a/dll/directx/wine/wined3d/wined3d_gl.h
+++ b/dll/directx/wine/wined3d/wined3d_gl.h
@@ -1754,6 +1754,7 @@ typedef enum wined3d_gl_extension
ARB_SHADER_OBJECTS,
ARB_SHADER_TEXTURE_LOD,
ARB_SHADING_LANGUAGE_100,
+ ARB_SHADOW,
ARB_SYNC,
ARB_TEXTURE_BORDER_CLAMP,
ARB_TEXTURE_COMPRESSION,
@@ -1782,6 +1783,7 @@ typedef enum wined3d_gl_extension
EXT_BLEND_EQUATION_SEPARATE,
EXT_BLEND_FUNC_SEPARATE,
EXT_BLEND_MINMAX,
+ EXT_DRAW_BUFFERS2,
EXT_FOG_COORD,
EXT_FRAMEBUFFER_BLIT,
EXT_FRAMEBUFFER_MULTISAMPLE,
@@ -1829,7 +1831,6 @@ typedef enum wined3d_gl_extension
SGIS_GENERATE_MIPMAP,
SGI_VIDEO_SYNC,
/* WGL extensions */
- WGL_ARB_PBUFFER,
WGL_ARB_PIXEL_FORMAT,
WGL_WINE_PIXEL_FORMAT_PASSTHROUGH,
/* Internally used */
@@ -2404,6 +2405,14 @@ typedef unsigned int GLhandleARB;
#define GL_SHADING_LANGUAGE_VERSION_ARB 0x8b8c
#endif
+/* GL_ARB_shadow */
+#ifndef GL_ARB_shadow
+#define GL_ARB_shadow 1
+#define GL_TEXTURE_COMPARE_MODE_ARB 0x884c
+#define GL_TEXTURE_COMPARE_FUNC_ARB 0x884d
+#define GL_COMPARE_R_TO_TEXTURE_ARB 0x884e
+#endif
+
/* GL_ARB_sync */
#ifndef GL_ARB_sync
#define GL_ARB_sync 1
@@ -2959,6 +2968,15 @@ typedef void (WINE_GLAPI *PGLFNBLENDEQUATIONSEPARATEEXTPROC)(GLenum modeRGB, GLe
typedef void (WINE_GLAPI *PGLFNBLENDFUNCSEPARATEEXTPROC)(GLenum sfactorRGB, GLenum dfactorRGB,
GLenum sfactorAlpha, GLenum dfactorAlpha);
+/* GL_EXT_draw_buffers2 */
+typedef GLvoid (WINE_GLAPI *PGLFNCOLORMASKINDEXEDEXTPROC)(GLuint buffer_idx, GLboolean r, GLboolean g,
+ GLboolean b, GLboolean a);
+typedef GLvoid (WINE_GLAPI *PGLFNGETBOOLEANINDEXEDVEXTPROC)(GLenum param, GLuint index, GLboolean *value);
+typedef GLvoid (WINE_GLAPI *PGLFNGETINTEGERINDEXEDVEXTPROC)(GLenum param, GLuint index, GLint *value);
+typedef GLvoid (WINE_GLAPI *PGLFNENABLEINDEXEDEXTPROC)(GLenum target, GLuint index);
+typedef GLvoid (WINE_GLAPI *PGLFNDISABLEINDEXEDEXTPROC)(GLenum target, GLuint index);
+typedef GLboolean (WINE_GLAPI *PGLFNISENABLEDINDEXEDEXTPROC)(GLenum target, GLuint index);
+
/* GL_EXT_fog_coord */
#ifndef GL_EXT_fog_coord
#define GL_EXT_fog_coord 1
@@ -3680,26 +3698,6 @@ typedef const char *(WINAPI *WINED3D_PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc);
#define WGL_SAMPLES_ARB 0x2042
#endif
-/* WGL_ARB_pbuffer */
-#ifndef WGL_ARB_pbuffer
-#define WGL_ARB_pbuffer 1
-#define WGL_DRAW_TO_PBUFFER_ARB 0x202d
-#define WGL_MAX_PBUFFER_PIXELS_ARB 0x202e
-#define WGL_MAX_PBUFFER_WIDTH_ARB 0x202f
-#define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030
-#define WGL_PBUFFER_LARGEST_ARB 0x2033
-#define WGL_PBUFFER_WIDTH_ARB 0x2034
-#define WGL_PBUFFER_HEIGHT_ARB 0x2035
-#define WGL_PBUFFER_LOST_ARB 0x2036
-#endif
-DECLARE_HANDLE(HPBUFFERARB);
-typedef HPBUFFERARB (WINAPI *WINED3D_PFNWGLCREATEPBUFFERARBPROC)(HDC hDC, int iPixelFormat,
- int iWidth, int iHeight, const int *piAttribList);
-typedef HDC (WINAPI *WINED3D_PFNWGLGETPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer);
-typedef int (WINAPI *WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer, HDC hDC);
-typedef BOOL (WINAPI *WINED3D_PFNWGLDESTROYPBUFFERARBPROC)(HPBUFFERARB hPbuffer);
-typedef BOOL (WINAPI *WINED3D_PFNWGLQUERYPBUFFERARBPROC)(HPBUFFERARB hPbuffer, int iAttribute, int *piValue);
-
/* WGL_ARB_pixel_format */
#ifndef WGL_ARB_pixel_format
#define WGL_ARB_pixel_format 1
@@ -3930,7 +3928,7 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
glUniform3iARB, ARB_SHADER_OBJECTS, NULL) \
USE_GL_FUNC(WINED3D_PFNGLUNIFORM4IARBPROC, \
glUniform4iARB, ARB_SHADER_OBJECTS, NULL) \
- USE_GL_FUNC(WINED3D_PFNGLUNIFORM1IARBPROC, \
+ USE_GL_FUNC(WINED3D_PFNGLUNIFORM1FARBPROC, \
glUniform1fARB, ARB_SHADER_OBJECTS, NULL) \
USE_GL_FUNC(WINED3D_PFNGLUNIFORM2FARBPROC, \
glUniform2fARB, ARB_SHADER_OBJECTS, NULL) \
@@ -4199,6 +4197,19 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
/* GL_EXT_blend_func_separate */ \
USE_GL_FUNC(PGLFNBLENDEQUATIONSEPARATEEXTPROC, \
glBlendEquationSeparateEXT, EXT_BLEND_EQUATION_SEPARATE, NULL) \
+ /* GL_EXT_draw_buffers2 */ \
+ USE_GL_FUNC(PGLFNCOLORMASKINDEXEDEXTPROC, \
+ glColorMaskIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNGETBOOLEANINDEXEDVEXTPROC, \
+ glGetBooleanIndexedvEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNGETINTEGERINDEXEDVEXTPROC, \
+ glGetIntegerIndexedvEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNENABLEINDEXEDEXTPROC, \
+ glEnableIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNDISABLEINDEXEDEXTPROC, \
+ glDisableIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
+ USE_GL_FUNC(PGLFNISENABLEDINDEXEDEXTPROC, \
+ glIsEnabledIndexedEXT, EXT_DRAW_BUFFERS2, NULL) \
/* GL_EXT_fog_coord */ \
USE_GL_FUNC(PGLFNGLFOGCOORDFEXTPROC, \
glFogCoordfEXT, EXT_FOG_COORD, NULL) \
@@ -4489,11 +4500,6 @@ typedef BOOL (WINAPI *WINED3D_PFNWGLSETPIXELFORMATWINE)(HDC hdc, int iPixelForma
USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBIVARBPROC, wglGetPixelFormatAttribivARB, 0, NULL) \
USE_GL_FUNC(WINED3D_PFNWGLGETPIXELFORMATATTRIBFVARBPROC, wglGetPixelFormatAttribfvARB, 0, NULL) \
USE_GL_FUNC(WINED3D_PFNWGLCHOOSEPIXELFORMATARBPROC, wglChoosePixelFormatARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLCREATEPBUFFERARBPROC, wglCreatePbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLGETPBUFFERDCARBPROC, wglGetPbufferDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLRELEASEPBUFFERDCARBPROC, wglReleasePbufferDCARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLDESTROYPBUFFERARBPROC, wglDestroyPbufferARB, 0, NULL) \
- USE_GL_FUNC(WINED3D_PFNWGLQUERYPBUFFERARBPROC, wglQueryPbufferARB, 0, NULL) \
USE_GL_FUNC(WINED3D_PFNWGLSETPIXELFORMATWINE, wglSetPixelFormatWINE, 0, NULL)
#endif /* __WINE_WINED3D_GL */
diff --git a/dll/directx/wine/wined3d/wined3d_main.c b/dll/directx/wine/wined3d/wined3d_main.c
index 39416e1f875..6330eba44d4 100644
--- a/dll/directx/wine/wined3d/wined3d_main.c
+++ b/dll/directx/wine/wined3d/wined3d_main.c
@@ -72,30 +72,31 @@ wined3d_settings_t wined3d_settings =
PCI_DEVICE_NONE,/* PCI Device ID */
0, /* The default of memory is set in FillGLCaps */
NULL, /* No wine logo by default */
- FALSE /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */
+ FALSE, /* Disable multisampling for now due to Nvidia driver bugs which happens for some users */
+ FALSE, /* No strict draw ordering. */
};
-IWineD3D* WINAPI WineDirect3DCreate(UINT dxVersion, IUnknown *parent) {
- IWineD3DImpl* object;
+IWineD3D * WINAPI WineDirect3DCreate(UINT version, IUnknown *parent)
+{
+ IWineD3DImpl *object;
+ HRESULT hr;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IWineD3DImpl));
- object->lpVtbl = &IWineD3D_Vtbl;
- object->dxVersion = dxVersion;
- object->ref = 1;
- object->parent = parent;
-
- if (!InitAdapters(object))
+ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*object));
+ if (!object)
{
- WARN("Failed to initialize direct3d adapters, Direct3D will not be available\n");
- if (dxVersion > 7)
- {
- ERR("Direct3D%d is not available without opengl\n", dxVersion);
- HeapFree(GetProcessHeap(), 0, object);
- return NULL;
- }
+ ERR("Failed to allocate wined3d object memory.\n");
+ return NULL;
}
- TRACE("Created WineD3D object @ %p for d3d%d support\n", object, dxVersion);
+ hr = wined3d_init(object, version, parent);
+ if (FAILED(hr))
+ {
+ WARN("Failed to initialize wined3d object, hr %#x.\n", hr);
+ HeapFree(GetProcessHeap(), 0, object);
+ return NULL;
+ }
+
+ TRACE("Created wined3d object %p for d3d%d support.\n", object, version);
return (IWineD3D *)object;
}
@@ -120,7 +121,7 @@ static void CDECL wined3d_do_nothing(void)
{
}
-static BOOL wined3d_init(HINSTANCE hInstDLL)
+static BOOL wined3d_dll_init(HINSTANCE hInstDLL)
{
DWORD wined3d_context_tls_idx;
HMODULE mod;
@@ -236,11 +237,6 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
TRACE("Using the backbuffer for offscreen rendering\n");
wined3d_settings.offscreen_rendering_mode = ORM_BACKBUFFER;
}
- else if (!strcmp(buffer,"pbuffer"))
- {
- TRACE("Using PBuffers for offscreen rendering\n");
- wined3d_settings.offscreen_rendering_mode = ORM_PBUFFER;
- }
else if (!strcmp(buffer,"fbo"))
{
TRACE("Using FBOs for offscreen rendering\n");
@@ -324,6 +320,12 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
wined3d_settings.allow_multisampling = TRUE;
}
}
+ if (!get_config_key(hkey, appkey, "StrictDrawOrdering", buffer, size)
+ && !strcmp(buffer,"enabled"))
+ {
+ TRACE("Enforcing strict draw ordering.\n");
+ wined3d_settings.strict_draw_ordering = TRUE;
+ }
}
if (wined3d_settings.vs_mode == VS_HW)
TRACE("Allow HW vertex shaders\n");
@@ -338,7 +340,7 @@ static BOOL wined3d_init(HINSTANCE hInstDLL)
return TRUE;
}
-static BOOL wined3d_destroy(HINSTANCE hInstDLL)
+static BOOL wined3d_dll_destroy(HINSTANCE hInstDLL)
{
DWORD wined3d_context_tls_idx = context_get_tls_idx();
unsigned int i;
@@ -478,10 +480,10 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpv)
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
- return wined3d_init(hInstDLL);
+ return wined3d_dll_init(hInstDLL);
case DLL_PROCESS_DETACH:
- return wined3d_destroy(hInstDLL);
+ return wined3d_dll_destroy(hInstDLL);
case DLL_THREAD_DETACH:
{
diff --git a/dll/directx/wine/wined3d/wined3d_private.h b/dll/directx/wine/wined3d/wined3d_private.h
index 1d5cd974645..5c96d764389 100644
--- a/dll/directx/wine/wined3d/wined3d_private.h
+++ b/dll/directx/wine/wined3d/wined3d_private.h
@@ -50,6 +50,7 @@
#define WINED3D_QUIRK_GLSL_CLIP_VARYING 0x00000004
#define WINED3D_QUIRK_ALLOWS_SPECULAR_ALPHA 0x00000008
#define WINED3D_QUIRK_NV_CLIP_BROKEN 0x00000010
+#define WINED3D_QUIRK_FBO_TEX_UPDATE 0x00000020
/* Texture format fixups */
@@ -67,10 +68,11 @@ enum fixup_channel_source
enum complex_fixup
{
- COMPLEX_FIXUP_YUY2 = 0,
- COMPLEX_FIXUP_UYVY = 1,
- COMPLEX_FIXUP_YV12 = 2,
- COMPLEX_FIXUP_P8 = 3,
+ COMPLEX_FIXUP_NONE = 0,
+ COMPLEX_FIXUP_YUY2 = 1,
+ COMPLEX_FIXUP_UYVY = 2,
+ COMPLEX_FIXUP_YV12 = 3,
+ COMPLEX_FIXUP_P8 = 4,
};
#include
@@ -234,8 +236,7 @@ static inline float float_24_to_32(DWORD in)
#define VBO_HW 1
#define ORM_BACKBUFFER 0
-#define ORM_PBUFFER 1
-#define ORM_FBO 2
+#define ORM_FBO 1
#define SHADER_ARB 1
#define SHADER_GLSL 2
@@ -267,6 +268,7 @@ typedef struct wined3d_settings_s {
unsigned int emulated_textureram;
char *logo;
int allow_multisampling;
+ BOOL strict_draw_ordering;
} wined3d_settings_t;
extern wined3d_settings_t wined3d_settings DECLSPEC_HIDDEN;
@@ -539,7 +541,8 @@ typedef struct shader_reg_maps
WORD usestexldl : 1;
WORD usesifc : 1;
WORD usescall : 1;
- WORD padding : 4;
+ WORD usesrcp : 1;
+ WORD padding : 3;
/* Whether or not loops are used in this shader, and nesting depth */
unsigned loop_depth;
@@ -643,14 +646,6 @@ struct shader_caps {
float PixelShader1xMaxValue;
DWORD MaxPixelShaderConst;
- WINED3DVSHADERCAPS2_0 VS20Caps;
- WINED3DPSHADERCAPS2_0 PS20Caps;
-
- DWORD MaxVShaderInstructionsExecuted;
- DWORD MaxPShaderInstructionsExecuted;
- DWORD MaxVertexShader30InstructionSlots;
- DWORD MaxPixelShader30InstructionSlots;
-
BOOL VSClipping;
};
@@ -693,6 +688,7 @@ struct ps_compile_args {
/* Bitmap for NP2 texcoord fixups (16 samplers max currently).
D3D9 has a limit of 16 samplers and the fixup is superfluous
in D3D10 (unconditional NP2 support mandatory). */
+ WORD shadow; /* MAX_FRAGMENT_SAMPLERS, 16 */
};
enum fog_src_type {
@@ -711,7 +707,7 @@ struct wined3d_context;
typedef struct {
void (*shader_handle_instruction)(const struct wined3d_shader_instruction *);
void (*shader_select)(const struct wined3d_context *context, BOOL usePS, BOOL useVS);
- void (*shader_select_depth_blt)(IWineD3DDevice *iface, enum tex_types tex_type);
+ void (*shader_select_depth_blt)(IWineD3DDevice *iface, enum tex_types tex_type, const SIZE *ds_mask_size);
void (*shader_deselect_depth_blt)(IWineD3DDevice *iface);
void (*shader_update_float_vertex_constants)(IWineD3DDevice *iface, UINT start, UINT count);
void (*shader_update_float_pixel_constants)(IWineD3DDevice *iface, UINT start, UINT count);
@@ -752,7 +748,7 @@ extern int num_lock DECLSPEC_HIDDEN;
/* GL related defines */
/* ------------------ */
-#define GL_EXTCALL(FuncName) (GLINFO_LOCATION.FuncName)
+#define GL_EXTCALL(f) (gl_info->f)
#define D3DCOLOR_B_R(dw) (((dw) >> 16) & 0xFF)
#define D3DCOLOR_B_G(dw) (((dw) >> 8) & 0xFF)
@@ -771,9 +767,6 @@ extern int num_lock DECLSPEC_HIDDEN;
(vec)[3] = D3DCOLOR_A(dw); \
} while(0)
-/* DirectX Device Limits */
-/* --------------------- */
-#define MAX_MIP_LEVELS 32 /* Maximum number of mipmap levels. */
#define HIGHEST_TRANSFORMSTATE WINED3DTS_WORLDMATRIX(255) /* Highest value in WINED3DTRANSFORMSTATETYPE */
/* Checking of API calls */
@@ -788,7 +781,7 @@ do { \
TRACE("%s call ok %s / %d\n", A, __FILE__, __LINE__); \
\
} else do { \
- FIXME(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
+ ERR(">>>>>>>>>>>>>>>>> %s (%#x) from %s @ %s / %d\n", \
debug_glerror(err), err, A, __FILE__, __LINE__); \
err = glGetError(); \
} while (err != GL_NO_ERROR); \
@@ -830,13 +823,6 @@ extern const float identity[16] DECLSPEC_HIDDEN;
* Compilable extra diagnostics
*/
-/* Trace information per-vertex: (extremely high amount of trace) */
-#if 0 /* NOTE: Must be 0 in cvs */
-# define VTRACE(A) TRACE A
-#else
-# define VTRACE(A)
-#endif
-
/* TODO: Confirm each of these works when wined3d move completed */
#if 0 /* NOTE: Must be 0 in cvs */
/* To avoid having to get gigabytes of trace, the following can be compiled in, and at the start
@@ -910,7 +896,7 @@ enum wined3d_ffp_emit_idx
struct wined3d_stream_info_element
{
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
GLsizei stride;
const BYTE *data;
UINT stream_idx;
@@ -1039,6 +1025,12 @@ enum wined3d_event_query_result
WINED3D_EVENT_QUERY_ERROR
};
+void wined3d_event_query_destroy(struct wined3d_event_query *query) DECLSPEC_HIDDEN;
+enum wined3d_event_query_result wined3d_event_query_test(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+enum wined3d_event_query_result wined3d_event_query_finish(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+void wined3d_event_query_issue(struct wined3d_event_query *query, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+HRESULT wined3d_event_query_supported(const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
+
struct wined3d_context
{
const struct wined3d_gl_info *gl_info;
@@ -1052,8 +1044,8 @@ struct wined3d_context
DWORD numDirtyEntries;
DWORD isStateDirty[STATE_HIGHEST / (sizeof(DWORD) * CHAR_BIT) + 1]; /* Bitmap to find out quickly if a state is dirty */
- IWineD3DSurface *surface;
- IWineD3DSurface *current_rt;
+ IWineD3DSwapChainImpl *swapchain;
+ IWineD3DSurfaceImpl *current_rt;
DWORD tid; /* Thread ID which owns this context at the moment */
/* Stores some information about the context state for optimization */
@@ -1089,7 +1081,7 @@ struct wined3d_context
HGLRC glCtx;
HWND win_handle;
HDC hdc;
- HPBUFFERARB pbuffer;
+ int pixel_format;
GLint aux_buffers;
/* FBOs */
@@ -1097,10 +1089,11 @@ struct wined3d_context
struct list fbo_list;
struct list fbo_destroy_list;
struct fbo_entry *current_fbo;
- GLuint src_fbo;
GLuint dst_fbo;
GLuint fbo_read_binding;
GLuint fbo_draw_binding;
+ BOOL rebind_fbo;
+ IWineD3DSurfaceImpl **blit_targets;
/* Queries */
GLuint *free_occlusion_queries;
@@ -1167,60 +1160,69 @@ HRESULT compile_state_table(struct StateEntry *StateTable, APPLYSTATEFUNC **dev_
const struct wined3d_gl_info *gl_info, const struct StateEntryTemplate *vertex,
const struct fragment_pipeline *fragment, const struct StateEntryTemplate *misc) DECLSPEC_HIDDEN;
+enum blit_operation
+{
+ BLIT_OP_BLIT,
+ BLIT_OP_COLOR_FILL
+};
+
/* Shaders for color conversions in blits */
struct blit_shader
{
HRESULT (*alloc_private)(IWineD3DDevice *iface);
void (*free_private)(IWineD3DDevice *iface);
- HRESULT (*set_shader)(IWineD3DDevice *iface, const struct GlPixelFormatDesc *format_desc,
- GLenum textype, UINT width, UINT height);
+ HRESULT (*set_shader)(IWineD3DDevice *iface, IWineD3DSurfaceImpl *surface);
void (*unset_shader)(IWineD3DDevice *iface);
- BOOL (*color_fixup_supported)(struct color_fixup_desc fixup);
+ BOOL (*blit_supported)(const struct wined3d_gl_info *gl_info, enum blit_operation blit_op,
+ const RECT *src_rect, DWORD src_usage, WINED3DPOOL src_pool, const struct wined3d_format_desc *src_format_desc,
+ const RECT *dst_rect, DWORD dst_usage, WINED3DPOOL dst_pool, const struct wined3d_format_desc *dst_format_desc);
+ HRESULT (*color_fill)(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect, DWORD fill_color);
};
extern const struct blit_shader ffp_blit DECLSPEC_HIDDEN;
extern const struct blit_shader arbfp_blit DECLSPEC_HIDDEN;
+extern const struct blit_shader cpu_blit DECLSPEC_HIDDEN;
-typedef enum ContextUsage {
- CTXUSAGE_RESOURCELOAD = 1, /* Only loads textures: No State is applied */
- CTXUSAGE_DRAWPRIM = 2, /* OpenGL states are set up for blitting DirectDraw surfaces */
- CTXUSAGE_BLIT = 3, /* OpenGL states are set up 3D drawing */
- CTXUSAGE_CLEAR = 4, /* Drawable and states are set up for clearing */
-} ContextUsage;
+/* Temporary blit_shader helper functions */
+HRESULT arbfp_blit_surface(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
+ IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect_in, enum blit_operation blit_op,
+ DWORD Filter) DECLSPEC_HIDDEN;
-struct wined3d_context *context_acquire(IWineD3DDeviceImpl *This,
- IWineD3DSurface *target, enum ContextUsage usage) DECLSPEC_HIDDEN;
+struct wined3d_context *context_acquire(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target) DECLSPEC_HIDDEN;
void context_alloc_event_query(struct wined3d_context *context,
struct wined3d_event_query *query) DECLSPEC_HIDDEN;
void context_alloc_occlusion_query(struct wined3d_context *context,
struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
-void context_resource_released(IWineD3DDevice *iface,
- IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN;
-void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo) DECLSPEC_HIDDEN;
+void context_apply_blit_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+void context_apply_clear_state(struct wined3d_context *context, IWineD3DDeviceImpl *device,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN;
+void context_apply_draw_state(struct wined3d_context *context, IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
+void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target,
+ IWineD3DSurfaceImpl *render_target, IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN;
void context_attach_depth_stencil_fbo(struct wined3d_context *context,
- GLenum fbo_target, IWineD3DSurface *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN;
-void context_attach_surface_fbo(const struct wined3d_context *context,
- GLenum fbo_target, DWORD idx, IWineD3DSurface *surface) DECLSPEC_HIDDEN;
-struct wined3d_context *context_create(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, HWND win,
- BOOL create_pbuffer, const WINED3DPRESENT_PARAMETERS *present_parameters) DECLSPEC_HIDDEN;
+ GLenum fbo_target, IWineD3DSurfaceImpl *depth_stencil, BOOL use_render_buffer) DECLSPEC_HIDDEN;
+void context_bind_fbo(struct wined3d_context *context, GLenum target, GLuint *fbo) DECLSPEC_HIDDEN;
+struct wined3d_context *context_create(IWineD3DSwapChainImpl *swapchain, IWineD3DSurfaceImpl *target,
+ const struct wined3d_format_desc *ds_format_desc) DECLSPEC_HIDDEN;
void context_destroy(IWineD3DDeviceImpl *This, struct wined3d_context *context) DECLSPEC_HIDDEN;
void context_free_event_query(struct wined3d_event_query *query) DECLSPEC_HIDDEN;
void context_free_occlusion_query(struct wined3d_occlusion_query *query) DECLSPEC_HIDDEN;
struct wined3d_context *context_get_current(void) DECLSPEC_HIDDEN;
DWORD context_get_tls_idx(void) DECLSPEC_HIDDEN;
void context_release(struct wined3d_context *context) DECLSPEC_HIDDEN;
+void context_resource_released(IWineD3DDevice *iface,
+ IWineD3DResource *resource, WINED3DRESOURCETYPE type) DECLSPEC_HIDDEN;
BOOL context_set_current(struct wined3d_context *ctx) DECLSPEC_HIDDEN;
void context_set_draw_buffer(struct wined3d_context *context, GLenum buffer) DECLSPEC_HIDDEN;
void context_set_tls_idx(DWORD idx) DECLSPEC_HIDDEN;
-
-void delete_opengl_contexts(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN;
-HRESULT create_primary_opengl_context(IWineD3DDevice *iface, IWineD3DSwapChain *swapchain) DECLSPEC_HIDDEN;
+void context_surface_update(struct wined3d_context *context, IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
/* Macros for doing basic GPU detection based on opengl capabilities */
#define WINE_D3D6_CAPABLE(gl_info) (gl_info->supported[ARB_MULTITEXTURE])
#define WINE_D3D7_CAPABLE(gl_info) (gl_info->supported[ARB_TEXTURE_COMPRESSION] && gl_info->supported[ARB_TEXTURE_CUBE_MAP] && gl_info->supported[ARB_TEXTURE_ENV_DOT3])
#define WINE_D3D8_CAPABLE(gl_info) WINE_D3D7_CAPABLE(gl_info) && (gl_info->supported[ARB_MULTISAMPLE] && gl_info->supported[ARB_TEXTURE_BORDER_CLAMP])
#define WINE_D3D9_CAPABLE(gl_info) WINE_D3D8_CAPABLE(gl_info) && (gl_info->supported[ARB_FRAGMENT_PROGRAM] && gl_info->supported[ARB_VERTEX_SHADER])
+#define WINE_D3D10_CAPABLE(gl_info) WINE_D3D9_CAPABLE(gl_info) && (gl_info->supported[EXT_GPU_SHADER4])
/*****************************************************************************
* Internal representation of a light
@@ -1251,7 +1253,6 @@ typedef struct WineD3D_PixelFormat
int redSize, greenSize, blueSize, alphaSize, colorSize;
int depthSize, stencilSize;
BOOL windowDrawable;
- BOOL pbufferDrawable;
BOOL doubleBuffer;
int auxBuffers;
int numSamples;
@@ -1259,9 +1260,9 @@ typedef struct WineD3D_PixelFormat
enum wined3d_gl_vendor
{
- GL_VENDOR_WINE,
+ GL_VENDOR_UNKNOWN,
GL_VENDOR_APPLE,
- GL_VENDOR_ATI,
+ GL_VENDOR_FGLRX,
GL_VENDOR_INTEL,
GL_VENDOR_MESA,
GL_VENDOR_NVIDIA,
@@ -1270,7 +1271,7 @@ enum wined3d_gl_vendor
enum wined3d_pci_vendor
{
- HW_VENDOR_WINE = 0x0000,
+ HW_VENDOR_SOFTWARE = 0x0000,
HW_VENDOR_ATI = 0x1002,
HW_VENDOR_NVIDIA = 0x10de,
HW_VENDOR_INTEL = 0x8086,
@@ -1287,7 +1288,7 @@ enum wined3d_pci_device
CARD_ATI_RADEON_XPRESS_200M = 0x5955,
CARD_ATI_RADEON_X700 = 0x5e4c,
CARD_ATI_RADEON_X1600 = 0x71c2,
- CARD_ATI_RADEON_HD2300 = 0x7210,
+ CARD_ATI_RADEON_HD2350 = 0x94c7,
CARD_ATI_RADEON_HD2600 = 0x9581,
CARD_ATI_RADEON_HD2900 = 0x9400,
CARD_ATI_RADEON_HD3200 = 0x9620,
@@ -1418,6 +1419,7 @@ struct wined3d_gl_limits
struct wined3d_gl_info
{
+ DWORD glsl_version;
UINT vidmem;
struct wined3d_gl_limits limits;
DWORD reserved_glsl_constants;
@@ -1433,7 +1435,7 @@ struct wined3d_gl_info
WGL_EXT_FUNCS_GEN
#undef USE_GL_FUNC
- struct GlPixelFormatDesc *gl_formats;
+ struct wined3d_format_desc *gl_formats;
};
struct wined3d_driver_info
@@ -1469,7 +1471,7 @@ struct wined3d_adapter
BOOL initPixelFormats(struct wined3d_gl_info *gl_info, enum wined3d_pci_vendor vendor) DECLSPEC_HIDDEN;
BOOL initPixelFormatsNoGL(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
-extern long WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, long glram) DECLSPEC_HIDDEN;
+extern unsigned int WineD3DAdapterChangeGLRam(IWineD3DDeviceImpl *D3DDevice, unsigned int glram) DECLSPEC_HIDDEN;
extern void add_gl_compat_wrappers(struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
/*****************************************************************************
@@ -1564,14 +1566,9 @@ typedef struct IWineD3DImpl
struct wined3d_adapter adapters[1];
} IWineD3DImpl;
-extern const IWineD3DVtbl IWineD3D_Vtbl DECLSPEC_HIDDEN;
-
+HRESULT wined3d_init(IWineD3DImpl *wined3d, UINT version, IUnknown *parent) DECLSPEC_HIDDEN;
BOOL wined3d_register_window(HWND window, struct IWineD3DDeviceImpl *device) DECLSPEC_HIDDEN;
void wined3d_unregister_window(HWND window) DECLSPEC_HIDDEN;
-BOOL InitAdapters(IWineD3DImpl *This) DECLSPEC_HIDDEN;
-
-/* A helper function that dumps a resource list */
-void dumpResources(struct list *list) DECLSPEC_HIDDEN;
/*****************************************************************************
* IWineD3DDevice implementation structure
@@ -1656,9 +1653,10 @@ struct IWineD3DDeviceImpl
unsigned int highest_dirty_ps_const, highest_dirty_vs_const;
/* Render Target Support */
- IWineD3DSurface **render_targets;
- IWineD3DSurface *auto_depth_stencil_buffer;
- IWineD3DSurface *stencilBufferTarget;
+ IWineD3DSurfaceImpl **render_targets;
+ IWineD3DSurfaceImpl *auto_depth_stencil;
+ IWineD3DSurfaceImpl *onscreen_depth_stencil;
+ IWineD3DSurfaceImpl *depth_stencil;
/* palettes texture management */
UINT NumberOfPalettes;
@@ -1701,12 +1699,12 @@ struct IWineD3DDeviceImpl
/* Stream source management */
struct wined3d_stream_info strided_streams;
const WineDirect3DVertexStridedData *up_strided;
+ struct wined3d_event_query *buffer_queries[MAX_ATTRIBS];
+ unsigned int num_buffer_queries;
/* Context management */
struct wined3d_context **contexts;
UINT numContexts;
- struct wined3d_context *pbufferContext; /* The context that has a pbuffer as drawable */
- DWORD pbufferWidth, pbufferHeight; /* Size of the buffer drawable */
/* High level patch management */
#define PATCHMAP_SIZE 43
@@ -1715,6 +1713,9 @@ struct IWineD3DDeviceImpl
struct WineD3DRectPatch *currentPatch;
};
+BOOL device_context_add(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
+void device_context_remove(IWineD3DDeviceImpl *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
+void device_get_draw_rect(IWineD3DDeviceImpl *device, RECT *rect) DECLSPEC_HIDDEN;
HRESULT device_init(IWineD3DDeviceImpl *device, IWineD3DImpl *wined3d,
UINT adapter_idx, WINED3DDEVTYPE device_type, HWND focus_window, DWORD flags,
IUnknown *parent, IWineD3DDeviceParent *device_parent) DECLSPEC_HIDDEN;
@@ -1725,6 +1726,8 @@ void device_resource_add(IWineD3DDeviceImpl *This, IWineD3DResource *resource) D
void device_resource_released(IWineD3DDeviceImpl *This, IWineD3DResource *resource) DECLSPEC_HIDDEN;
void device_stream_info_from_declaration(IWineD3DDeviceImpl *This,
BOOL use_vshader, struct wined3d_stream_info *stream_info, BOOL *fixup) DECLSPEC_HIDDEN;
+void device_switch_onscreen_ds(IWineD3DDeviceImpl *device, struct wined3d_context *context,
+ IWineD3DSurfaceImpl *depth_stencil) DECLSPEC_HIDDEN;
void device_update_stream_info(IWineD3DDeviceImpl *device, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
HRESULT IWineD3DDeviceImpl_ClearSurface(IWineD3DDeviceImpl *This, IWineD3DSurfaceImpl *target, DWORD Count,
const WINED3DRECT *pRects, DWORD Flags, WINED3DCOLOR Color, float Z, DWORD Stencil) DECLSPEC_HIDDEN;
@@ -1770,7 +1773,7 @@ typedef struct IWineD3DResourceClass
WINED3DPOOL pool;
UINT size;
DWORD usage;
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
DWORD priority;
BYTE *allocatedMemory; /* Pointer to the real data location */
BYTE *heapMemory; /* Pointer to the HeapAlloced block of memory */
@@ -1793,7 +1796,7 @@ DWORD resource_get_priority(IWineD3DResource *iface) DECLSPEC_HIDDEN;
HRESULT resource_get_private_data(IWineD3DResource *iface, REFGUID guid,
void *data, DWORD *data_size) DECLSPEC_HIDDEN;
HRESULT resource_init(IWineD3DResource *iface, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
+ IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct wined3d_format_desc *format_desc,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
WINED3DRESOURCETYPE resource_get_type(IWineD3DResource *iface) DECLSPEC_HIDDEN;
DWORD resource_set_priority(IWineD3DResource *iface, DWORD new_priority) DECLSPEC_HIDDEN;
@@ -1801,7 +1804,7 @@ HRESULT resource_set_private_data(IWineD3DResource *iface, REFGUID guid,
const void *data, DWORD data_size, DWORD flags) DECLSPEC_HIDDEN;
/* Tests show that the start address of resources is 32 byte aligned */
-#define RESOURCE_ALIGNMENT 32
+#define RESOURCE_ALIGNMENT 16
/*****************************************************************************
* IWineD3DBaseTexture D3D- > openGL state map lookups
@@ -1818,10 +1821,8 @@ typedef enum winetexturestates {
WINED3DTEXSTA_MAXMIPLEVEL = 7,
WINED3DTEXSTA_MAXANISOTROPY = 8,
WINED3DTEXSTA_SRGBTEXTURE = 9,
- WINED3DTEXSTA_ELEMENTINDEX = 10,
- WINED3DTEXSTA_DMAPOFFSET = 11,
- WINED3DTEXSTA_TSSADDRESSW = 12,
- MAX_WINETEXTURESTATES = 13,
+ WINED3DTEXSTA_SHADOW = 10,
+ MAX_WINETEXTURESTATES = 11,
} winetexturestates;
enum WINED3DSRGB
@@ -1845,7 +1846,9 @@ struct gl_texture
typedef struct IWineD3DBaseTextureClass
{
struct gl_texture texture_rgb, texture_srgb;
- UINT levels;
+ IWineD3DResourceImpl **sub_resources;
+ UINT layer_count;
+ UINT level_count;
float pow2Matrix[16];
UINT LOD;
WINED3DTEXTUREFILTERTYPE filterType;
@@ -1858,10 +1861,11 @@ typedef struct IWineD3DBaseTextureClass
void (*internal_preload)(IWineD3DBaseTexture *iface, enum WINED3DSRGB srgb);
} IWineD3DBaseTextureClass;
-void surface_internal_preload(IWineD3DSurface *iface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
-BOOL surface_init_sysmem(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
-BOOL surface_is_offscreen(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
-void surface_prepare_texture(IWineD3DSurfaceImpl *surface, BOOL srgb) DECLSPEC_HIDDEN;
+void surface_internal_preload(IWineD3DSurfaceImpl *surface, enum WINED3DSRGB srgb) DECLSPEC_HIDDEN;
+BOOL surface_init_sysmem(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
+BOOL surface_is_offscreen(IWineD3DSurfaceImpl *iface) DECLSPEC_HIDDEN;
+void surface_prepare_texture(IWineD3DSurfaceImpl *surface,
+ const struct wined3d_gl_info *gl_info, BOOL srgb) DECLSPEC_HIDDEN;
typedef struct IWineD3DBaseTextureImpl
{
@@ -1883,9 +1887,12 @@ WINED3DTEXTUREFILTERTYPE basetexture_get_autogen_filter_type(IWineD3DBaseTexture
BOOL basetexture_get_dirty(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN;
DWORD basetexture_get_level_count(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN;
DWORD basetexture_get_lod(IWineD3DBaseTexture *iface) DECLSPEC_HIDDEN;
-HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT levels, WINED3DRESOURCETYPE resource_type,
- IWineD3DDeviceImpl *device, UINT size, DWORD usage, const struct GlPixelFormatDesc *format_desc,
- WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
+IWineD3DResourceImpl *basetexture_get_sub_resource(IWineD3DBaseTextureImpl *texture,
+ UINT layer, UINT level) DECLSPEC_HIDDEN;
+HRESULT basetexture_init(IWineD3DBaseTextureImpl *texture, UINT layer_count, UINT level_count,
+ WINED3DRESOURCETYPE resource_type, IWineD3DDeviceImpl *device, UINT size, DWORD usage,
+ const struct wined3d_format_desc *format_desc, WINED3DPOOL pool, IUnknown *parent,
+ const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
HRESULT basetexture_set_autogen_filter_type(IWineD3DBaseTexture *iface,
WINED3DTEXTUREFILTERTYPE filter_type) DECLSPEC_HIDDEN;
BOOL basetexture_set_dirty(IWineD3DBaseTexture *iface, BOOL dirty) DECLSPEC_HIDDEN;
@@ -1903,7 +1910,6 @@ typedef struct IWineD3DTextureImpl
IWineD3DBaseTextureClass baseTexture;
/* IWineD3DTexture */
- IWineD3DSurface *surfaces[MAX_MIP_LEVELS];
UINT target;
BOOL cond_np2;
@@ -1922,9 +1928,6 @@ typedef struct IWineD3DCubeTextureImpl
const IWineD3DCubeTextureVtbl *lpVtbl;
IWineD3DResourceClass resource;
IWineD3DBaseTextureClass baseTexture;
-
- /* IWineD3DCubeTexture */
- IWineD3DSurface *surfaces[6][MAX_MIP_LEVELS];
} IWineD3DCubeTextureImpl;
HRESULT cubetexture_init(IWineD3DCubeTextureImpl *texture, UINT edge_length, UINT levels,
@@ -1971,9 +1974,6 @@ typedef struct IWineD3DVolumeTextureImpl
const IWineD3DVolumeTextureVtbl *lpVtbl;
IWineD3DResourceClass resource;
IWineD3DBaseTextureClass baseTexture;
-
- /* IWineD3DVolumeTexture */
- IWineD3DVolume *volumes[MAX_MIP_LEVELS];
} IWineD3DVolumeTextureImpl;
HRESULT volumetexture_init(IWineD3DVolumeTextureImpl *texture, UINT width, UINT height,
@@ -2009,8 +2009,8 @@ typedef struct {
struct fbo_entry
{
struct list entry;
- IWineD3DSurface **render_targets;
- IWineD3DSurface *depth_stencil;
+ IWineD3DSurfaceImpl **render_targets;
+ IWineD3DSurfaceImpl *depth_stencil;
BOOL attached;
GLuint id;
};
@@ -2052,9 +2052,6 @@ struct IWineD3DSurfaceImpl
/* A method to retrieve the drawable size. Not in the Vtable to make it changeable */
void (*get_drawable_size)(struct wined3d_context *context, UINT *width, UINT *height);
- /* Oversized texture */
- RECT glRect;
-
/* PBO */
GLuint pbo;
GLuint texture_name;
@@ -2082,6 +2079,7 @@ struct IWineD3DSurfaceImpl
struct list renderbuffers;
renderbuffer_entry_t *current_renderbuffer;
+ SIZE ds_current_size;
/* DirectDraw clippers */
IWineD3DClipper *clipper;
@@ -2097,13 +2095,14 @@ struct IWineD3DSurfaceImpl
extern const IWineD3DSurfaceVtbl IWineD3DSurface_Vtbl DECLSPEC_HIDDEN;
extern const IWineD3DSurfaceVtbl IWineGDISurface_Vtbl DECLSPEC_HIDDEN;
-UINT surface_calculate_size(const struct GlPixelFormatDesc *format_desc,
+UINT surface_calculate_size(const struct wined3d_format_desc *format_desc,
UINT alignment, UINT width, UINT height) DECLSPEC_HIDDEN;
void surface_gdi_cleanup(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
HRESULT surface_init(IWineD3DSurfaceImpl *surface, WINED3DSURFTYPE surface_type, UINT alignment,
UINT width, UINT height, UINT level, BOOL lockable, BOOL discard, WINED3DMULTISAMPLE_TYPE multisample_type,
UINT multisample_quality, IWineD3DDeviceImpl *device, DWORD usage, WINED3DFORMAT format,
WINED3DPOOL pool, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
+void surface_translate_frontbuffer_coords(IWineD3DSurfaceImpl *surface, HWND window, RECT *rect) DECLSPEC_HIDDEN;
/* Predeclare the shared Surface functions */
HRESULT WINAPI IWineD3DBaseSurfaceImpl_QueryInterface(IWineD3DSurface *iface,
@@ -2153,13 +2152,13 @@ const void *WINAPI IWineD3DBaseSurfaceImpl_GetData(IWineD3DSurface *iface) DECLS
void get_drawable_size_swapchain(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void get_drawable_size_backbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
-void get_drawable_size_pbuffer(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
void get_drawable_size_fbo(struct wined3d_context *context, UINT *width, UINT *height) DECLSPEC_HIDDEN;
+void draw_textured_quad(IWineD3DSurfaceImpl *src_surface, const RECT *src_rect,
+ const RECT *dst_rect, WINED3DTEXTUREFILTERTYPE Filter) DECLSPEC_HIDDEN;
void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPEC_HIDDEN;
/* Surface flags: */
-#define SFLAG_OVERSIZE 0x00000001 /* Surface is bigger than gl size, blts only */
#define SFLAG_CONVERTED 0x00000002 /* Converted for color keying or Palettized */
#define SFLAG_DIBSECTION 0x00000004 /* Has a DIB section attached for GetDC */
#define SFLAG_LOCKABLE 0x00000008 /* Surface can be locked */
@@ -2186,7 +2185,6 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE
#define SFLAG_SWAPCHAIN 0x01000000 /* The surface is part of a swapchain */
/* In some conditions the surface memory must not be freed:
- * SFLAG_OVERSIZE: Not all data can be kept in GL
* SFLAG_CONVERTED: Converting the data back would take too long
* SFLAG_DIBSECTION: The dib code manages the memory
* SFLAG_LOCKED: The app requires access to the surface data
@@ -2194,8 +2192,7 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE
* SFLAG_PBO: PBOs don't use 'normal' memory. It is either allocated by the driver or must be NULL.
* SFLAG_CLIENT: OpenGL uses our memory as backup
*/
-#define SFLAG_DONOTFREE (SFLAG_OVERSIZE | \
- SFLAG_CONVERTED | \
+#define SFLAG_DONOTFREE (SFLAG_CONVERTED | \
SFLAG_DIBSECTION | \
SFLAG_LOCKED | \
SFLAG_DYNLOCK | \
@@ -2212,38 +2209,19 @@ void flip_surface(IWineD3DSurfaceImpl *front, IWineD3DSurfaceImpl *back) DECLSPE
SFLAG_DS_OFFSCREEN)
#define SFLAG_DS_DISCARDED SFLAG_DS_LOCATIONS
-BOOL CalculateTexRect(IWineD3DSurfaceImpl *This, RECT *Rect, float glTexCoord[4]) DECLSPEC_HIDDEN;
-
typedef enum {
NO_CONVERSION,
CONVERT_PALETTED,
CONVERT_PALETTED_CK,
CONVERT_CK_565,
CONVERT_CK_5551,
- CONVERT_CK_4444,
- CONVERT_CK_4444_ARGB,
- CONVERT_CK_1555,
- CONVERT_555,
CONVERT_CK_RGB24,
- CONVERT_CK_8888,
- CONVERT_CK_8888_ARGB,
- CONVERT_RGB32_888,
- CONVERT_V8U8,
- CONVERT_L6V5U5,
- CONVERT_X8L8V8U8,
- CONVERT_Q8W8V8U8,
- CONVERT_V16U16,
- CONVERT_A4L4,
- CONVERT_G16R16,
- CONVERT_R16G16F,
- CONVERT_R32G32F,
- CONVERT_D15S1,
- CONVERT_D24X4S4,
- CONVERT_D24FS8,
+ CONVERT_RGB32_888
} CONVERT_TYPES;
-HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing, GLenum *format,
- GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp, BOOL srgb_mode) DECLSPEC_HIDDEN;
+HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, BOOL use_texturing,
+ struct wined3d_format_desc *desc, CONVERT_TYPES *convert) DECLSPEC_HIDDEN;
+void d3dfmt_p8_init_palette(IWineD3DSurfaceImpl *This, BYTE table[256][4], BOOL colorkey) DECLSPEC_HIDDEN;
BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
@@ -2253,7 +2231,7 @@ BOOL palette9_changed(IWineD3DSurfaceImpl *This) DECLSPEC_HIDDEN;
struct wined3d_vertex_declaration_element
{
- const struct GlPixelFormatDesc *format_desc;
+ const struct wined3d_format_desc *format_desc;
BOOL ffp_valid;
WORD input_slot;
WORD offset;
@@ -2432,6 +2410,14 @@ HRESULT stateblock_init(IWineD3DStateBlockImpl *stateblock,
IWineD3DDeviceImpl *device, WINED3DSTATEBLOCKTYPE type) DECLSPEC_HIDDEN;
void stateblock_init_contained_states(IWineD3DStateBlockImpl *object) DECLSPEC_HIDDEN;
+static inline void stateblock_apply_state(DWORD state, IWineD3DStateBlockImpl *stateblock,
+ struct wined3d_context *context)
+{
+ const struct StateEntry *statetable = stateblock->device->StateTable;
+ DWORD rep = statetable[state].representative;
+ statetable[rep].apply(rep, stateblock, context);
+}
+
/* Direct3D terminology with little modifications. We do not have an issued state
* because only the driver knows about it, but we have a created state because d3d
* allows GetData on a created issue, but opengl doesn't
@@ -2485,6 +2471,9 @@ struct wined3d_map_range
#define WINED3D_BUFFER_CREATEBO 0x04 /* Attempt to create a buffer object next PreLoad */
#define WINED3D_BUFFER_DOUBLEBUFFER 0x08 /* Use a vbo and local allocated memory */
#define WINED3D_BUFFER_FLUSH 0x10 /* Manual unmap flushing */
+#define WINED3D_BUFFER_DISCARD 0x20 /* A DISCARD lock has occurred since the last PreLoad */
+#define WINED3D_BUFFER_NOSYNC 0x40 /* All locks since the last PreLoad had NOOVERWRITE set */
+#define WINED3D_BUFFER_APPLESYNC 0x80 /* Using sync as in GL_APPLE_flush_buffer_range */
struct wined3d_buffer
{
@@ -2503,6 +2492,7 @@ struct wined3d_buffer
LONG lock_count;
struct wined3d_map_range *maps;
ULONG maps_size, modified_areas;
+ struct wined3d_event_query *query;
/* conversion stuff */
UINT decl_change_count, full_conversion_count;
@@ -2514,8 +2504,9 @@ struct wined3d_buffer
UINT *conversion_shift; /* NULL if no shifted conversion */
};
-const BYTE *buffer_get_memory(IWineD3DBuffer *iface, UINT offset, GLuint *buffer_object) DECLSPEC_HIDDEN;
-BYTE *buffer_get_sysmem(struct wined3d_buffer *This) DECLSPEC_HIDDEN;
+const BYTE *buffer_get_memory(IWineD3DBuffer *iface, const struct wined3d_gl_info *gl_info,
+ GLuint *buffer_object) DECLSPEC_HIDDEN;
+BYTE *buffer_get_sysmem(struct wined3d_buffer *This, const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
HRESULT buffer_init(struct wined3d_buffer *buffer, IWineD3DDeviceImpl *device,
UINT size, DWORD usage, WINED3DFORMAT format, WINED3DPOOL pool, GLenum bind_hint,
const char *data, IUnknown *parent, const struct wined3d_parent_ops *parent_ops) DECLSPEC_HIDDEN;
@@ -2530,7 +2521,8 @@ struct wined3d_rendertarget_view
IUnknown *parent;
};
-extern const IWineD3DRendertargetViewVtbl wined3d_rendertarget_view_vtbl DECLSPEC_HIDDEN;
+void wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *view,
+ IWineD3DResource *resource, IUnknown *parent) DECLSPEC_HIDDEN;
/*****************************************************************************
* IWineD3DSwapChainImpl implementation structure (extends IUnknown)
@@ -2546,21 +2538,23 @@ struct IWineD3DSwapChainImpl
IWineD3DDeviceImpl *device;
/* IWineD3DSwapChain fields */
- IWineD3DSurface **backBuffer;
- IWineD3DSurface *frontBuffer;
+ IWineD3DSurfaceImpl **back_buffers;
+ IWineD3DSurfaceImpl *front_buffer;
WINED3DPRESENT_PARAMETERS presentParms;
DWORD orig_width, orig_height;
WINED3DFORMAT orig_fmt;
WINED3DGAMMARAMP orig_gamma;
BOOL render_to_fbo;
+ const struct wined3d_format_desc *ds_format;
- long prev_time, frames; /* Performance tracking */
+ LONG prev_time, frames; /* Performance tracking */
unsigned int vSyncCounter;
struct wined3d_context **context;
unsigned int num_contexts;
HWND win_handle;
+ HWND device_window;
};
const IWineD3DSwapChainVtbl IWineGDISwapChain_Vtbl DECLSPEC_HIDDEN;
@@ -2580,7 +2574,7 @@ HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetRasterStatus(IWineD3DSwapChain *ifac
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDisplayMode(IWineD3DSwapChain *iface,
WINED3DDISPLAYMODE *pMode) DECLSPEC_HIDDEN;
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetDevice(IWineD3DSwapChain *iface,
- IWineD3DDevice **ppDevice) DECLSPEC_HIDDEN;
+ IWineD3DDevice **device) DECLSPEC_HIDDEN;
HRESULT WINAPI IWineD3DBaseSwapChainImpl_GetPresentParameters(IWineD3DSwapChain *iface,
WINED3DPRESENT_PARAMETERS *pPresentationParameters) DECLSPEC_HIDDEN;
HRESULT WINAPI IWineD3DBaseSwapChainImpl_SetGammaRamp(IWineD3DSwapChain *iface,
@@ -2624,6 +2618,9 @@ const char *debug_d3dtop(WINED3DTEXTUREOP d3dtop) DECLSPEC_HIDDEN;
void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
const char *debug_surflocation(DWORD flag) DECLSPEC_HIDDEN;
+/* Color conversion routines */
+DWORD color_convert_argb_to_fmt(DWORD color, WINED3DFORMAT destfmt) DECLSPEC_HIDDEN;
+
/* Routines for GL <-> D3D values */
GLenum StencilOp(DWORD op) DECLSPEC_HIDDEN;
GLenum CompareFunc(DWORD func) DECLSPEC_HIDDEN;
@@ -2650,18 +2647,19 @@ void state_fogstartend(DWORD state, IWineD3DStateBlockImpl *stateblock,
void state_fog_fragpart(DWORD state, IWineD3DStateBlockImpl *stateblock,
struct wined3d_context *context) DECLSPEC_HIDDEN;
-void surface_add_dirty_rect(IWineD3DSurface *iface, const RECT *dirty_rect) DECLSPEC_HIDDEN;
-GLenum surface_get_gl_buffer(IWineD3DSurface *iface) DECLSPEC_HIDDEN;
-void surface_load_ds_location(IWineD3DSurface *iface, struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
-void surface_modify_ds_location(IWineD3DSurface *iface, DWORD location) DECLSPEC_HIDDEN;
-void surface_set_compatible_renderbuffer(IWineD3DSurface *iface,
+void surface_add_dirty_rect(IWineD3DSurfaceImpl *surface, const RECT *dirty_rect) DECLSPEC_HIDDEN;
+GLenum surface_get_gl_buffer(IWineD3DSurfaceImpl *surface) DECLSPEC_HIDDEN;
+void surface_load_ds_location(IWineD3DSurfaceImpl *surface,
+ struct wined3d_context *context, DWORD location) DECLSPEC_HIDDEN;
+void surface_modify_ds_location(IWineD3DSurfaceImpl *surface, DWORD location, UINT w, UINT h) DECLSPEC_HIDDEN;
+void surface_set_compatible_renderbuffer(IWineD3DSurfaceImpl *surface,
unsigned int width, unsigned int height) DECLSPEC_HIDDEN;
-void surface_set_texture_name(IWineD3DSurface *iface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN;
-void surface_set_texture_target(IWineD3DSurface *iface, GLenum target) DECLSPEC_HIDDEN;
+void surface_set_texture_name(IWineD3DSurfaceImpl *surface, GLuint name, BOOL srgb_name) DECLSPEC_HIDDEN;
+void surface_set_texture_target(IWineD3DSurfaceImpl *surface, GLenum target) DECLSPEC_HIDDEN;
-BOOL getColorBits(const struct GlPixelFormatDesc *format_desc,
+BOOL getColorBits(const struct wined3d_format_desc *format_desc,
short *redSize, short *greenSize, short *blueSize, short *alphaSize, short *totalSize) DECLSPEC_HIDDEN;
-BOOL getDepthStencilBits(const struct GlPixelFormatDesc *format_desc,
+BOOL getDepthStencilBits(const struct wined3d_format_desc *format_desc,
short *depthSize, short *stencilSize) DECLSPEC_HIDDEN;
/* Math utils */
@@ -2941,8 +2939,8 @@ struct IWineD3DPaletteImpl {
DWORD Flags;
};
-extern const IWineD3DPaletteVtbl IWineD3DPalette_Vtbl DECLSPEC_HIDDEN;
-DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags) DECLSPEC_HIDDEN;
+HRESULT wined3d_palette_init(IWineD3DPaletteImpl *palette, IWineD3DDeviceImpl *device,
+ DWORD flags, const PALETTEENTRY *entries, IUnknown *parent) DECLSPEC_HIDDEN;
/* DirectDraw utility functions */
extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN;
@@ -2952,17 +2950,23 @@ extern WINED3DFORMAT pixelformat_for_depth(DWORD depth) DECLSPEC_HIDDEN;
*/
/* WineD3D pixel format flags */
-#define WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING 0x1
-#define WINED3DFMT_FLAG_FILTERING 0x2
-#define WINED3DFMT_FLAG_DEPTH 0x4
-#define WINED3DFMT_FLAG_STENCIL 0x8
-#define WINED3DFMT_FLAG_RENDERTARGET 0x10
-#define WINED3DFMT_FLAG_FOURCC 0x20
-#define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x40
-#define WINED3DFMT_FLAG_COMPRESSED 0x80
-#define WINED3DFMT_FLAG_GETDC 0x100
+#define WINED3DFMT_FLAG_POSTPIXELSHADER_BLENDING 0x00000001
+#define WINED3DFMT_FLAG_FILTERING 0x00000002
+#define WINED3DFMT_FLAG_DEPTH 0x00000004
+#define WINED3DFMT_FLAG_STENCIL 0x00000008
+#define WINED3DFMT_FLAG_RENDERTARGET 0x00000010
+#define WINED3DFMT_FLAG_FOURCC 0x00000020
+#define WINED3DFMT_FLAG_FBO_ATTACHABLE 0x00000040
+#define WINED3DFMT_FLAG_COMPRESSED 0x00000080
+#define WINED3DFMT_FLAG_GETDC 0x00000100
+#define WINED3DFMT_FLAG_FLOAT 0x00000200
+#define WINED3DFMT_FLAG_BUMPMAP 0x00000400
+#define WINED3DFMT_FLAG_SRGB_READ 0x00000800
+#define WINED3DFMT_FLAG_SRGB_WRITE 0x00001000
+#define WINED3DFMT_FLAG_VTF 0x00002000
+#define WINED3DFMT_FLAG_SHADOW 0x00004000
-struct GlPixelFormatDesc
+struct wined3d_format_desc
{
WINED3DFORMAT format;
DWORD red_mask;
@@ -2989,12 +2993,14 @@ struct GlPixelFormatDesc
GLint rtInternal;
GLint glFormat;
GLint glType;
+ UINT conv_byte_count;
unsigned int Flags;
float heightscale;
struct color_fixup_desc color_fixup;
+ void (*convert)(const BYTE *src, BYTE *dst, UINT pitch, UINT width, UINT height);
};
-const struct GlPixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt,
+const struct wined3d_format_desc *getFormatDescEntry(WINED3DFORMAT fmt,
const struct wined3d_gl_info *gl_info) DECLSPEC_HIDDEN;
static inline BOOL use_vs(IWineD3DStateBlockImpl *stateblock)
@@ -3013,9 +3019,9 @@ static inline BOOL use_ps(IWineD3DStateBlockImpl *stateblock)
return (stateblock->pixelShader && stateblock->device->ps_selected_mode != SHADER_NONE);
}
-void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface,
- WINED3DRECT *src_rect, IWineD3DSurface *dst_surface, WINED3DRECT *dst_rect,
- const WINED3DTEXTUREFILTERTYPE filter, BOOL flip) DECLSPEC_HIDDEN;
+void stretch_rect_fbo(IWineD3DDeviceImpl *device, IWineD3DSurfaceImpl *src_surface,
+ const RECT *src_rect, IWineD3DSurfaceImpl *dst_surface, const RECT *dst_rect,
+ const WINED3DTEXTUREFILTERTYPE filter) DECLSPEC_HIDDEN;
/* The WNDCLASS-Name for the fake window which we use to retrieve the GL capabilities */
#define WINED3D_OPENGL_WINDOW_CLASS_NAME "WineD3D_OpenGL"
@@ -3024,4 +3030,6 @@ void stretch_rect_fbo(IWineD3DDevice *iface, IWineD3DSurface *src_surface,
((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | \
((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24 ))
+#define MAKEDWORD_VERSION(maj, min) (((maj & 0xffff) << 16) | (min & 0xffff))
+
#endif
diff --git a/dll/keyboard/kbdlv/kbdlv.c b/dll/keyboard/kbdlv/kbdlv.c
index d2befa16a2e..a9954371b5d 100644
--- a/dll/keyboard/kbdlv/kbdlv.c
+++ b/dll/keyboard/kbdlv/kbdlv.c
@@ -1,7 +1,7 @@
/*
- * ReactOS Latvian Keyboard layout
+ * ReactOS latvian Keyboard layout
* Copyright (C) 2008 ReactOS
- * Author: Dmitry Chapyshev
+ * Author: Dmitry Chapyshev, Arthurs B.
* License: LGPL, see: LGPL.txt
*
* Thanks to: http://www.barcodeman.com/altek/mule/scandoc.php
@@ -33,8 +33,6 @@
#define KNUMS 0xc00 /* Special + number pad */
#define KMEXT 0x300 /* Multi + ext */
-#define SHFT_INVALID 0x0F
-
ROSDATA USHORT scancode_to_vk[] = {
/* Numbers Row */
/* - 00 - */
@@ -60,10 +58,10 @@ ROSDATA USHORT scancode_to_vk[] = {
/* Third letters row */
'Z', 'X', 'C', 'V',
'B', 'N', 'M', VK_OEM_COMMA,
- VK_OEM_PERIOD,VK_OEM_2, VK_RSHIFT | KEXT,
+ VK_OEM_PERIOD,VK_OEM_2, VK_RSHIFT,
/* - 37 - */
/* Bottom Row */
- 0x26a, VK_LMENU, VK_SPACE, VK_CAPITAL,
+ VK_MULTIPLY, VK_LMENU, VK_SPACE, VK_CAPITAL,
/* - 3b - */
/* F-Keys */
@@ -86,8 +84,8 @@ ROSDATA USHORT scancode_to_vk[] = {
/* Oddities, and the remaining standard F-Keys */
VK_EMPTY, VK_OEM_102, VK_F11, VK_F12,
/* - 59 - */
- VK_CLEAR, VK_OEM_WSCTRL,VK_OEM_FINISH,VK_OEM_JUMP, VK_EREOF, /* EREOF */
- VK_OEM_BACKTAB, VK_OEM_AUTO, VK_EMPTY, VK_ZOOM, /* ZOOM */
+ VK_CLEAR, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* EREOF */
+ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* ZOOM */
VK_HELP,
/* - 64 - */
/* Even more F-Keys (for example, NCR keyboards from the early 90's) */
@@ -95,64 +93,25 @@ ROSDATA USHORT scancode_to_vk[] = {
VK_F21, VK_F22, VK_F23,
/* - 6f - */
/* Not sure who uses these codes */
- VK_OEM_PA3, VK_EMPTY, VK_OEM_RESET,
+ VK_EMPTY, VK_EMPTY, VK_EMPTY,
/* - 72 - */
- VK_EMPTY, 0xc1, VK_EMPTY, VK_EMPTY,
+ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
/* - 76 - */
/* One more f-key */
VK_F24,
/* - 77 - */
VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY,
- VK_OEM_PA1, VK_TAB, 0xc2, 0, /* PA1 */
- 0,
+ VK_EMPTY, VK_EMPTY, VK_EMPTY, VK_EMPTY, /* PA1 */
+ VK_EMPTY,
/* - 80 - */
0
};
ROSDATA VSC_VK extcode0_to_vk[] = {
- { 0x10, VK_MEDIA_PREV_TRACK | KEXT },
- { 0x19, VK_MEDIA_NEXT_TRACK | KEXT },
- { 0x1D, VK_RCONTROL | KEXT },
- { 0x20, VK_VOLUME_MUTE | KEXT },
- { 0x21, VK_LAUNCH_APP2 | KEXT },
- { 0x22, VK_MEDIA_PLAY_PAUSE | KEXT },
- { 0x24, VK_MEDIA_STOP | KEXT },
- { 0x2E, VK_VOLUME_DOWN | KEXT },
- { 0x30, VK_VOLUME_UP | KEXT },
- { 0x32, VK_BROWSER_HOME | KEXT },
- { 0x35, VK_DIVIDE | KEXT },
- { 0x37, VK_SNAPSHOT | KEXT },
- { 0x38, VK_RMENU | KEXT },
- { 0x47, VK_HOME | KEXT },
- { 0x48, VK_UP | KEXT },
- { 0x49, VK_PRIOR | KEXT },
- { 0x4B, VK_LEFT | KEXT },
- { 0x4D, VK_RIGHT | KEXT },
- { 0x4F, VK_END | KEXT },
- { 0x50, VK_DOWN | KEXT },
- { 0x51, VK_NEXT | KEXT },
- { 0x52, VK_INSERT | KEXT },
- { 0x53, VK_DELETE | KEXT },
- { 0x5B, VK_LWIN | KEXT },
- { 0x5C, VK_RWIN | KEXT },
- { 0x5D, VK_APPS | KEXT },
- { 0x5F, VK_SLEEP | KEXT },
- { 0x65, VK_BROWSER_SEARCH | KEXT },
- { 0x66, VK_BROWSER_FAVORITES | KEXT },
- { 0x67, VK_BROWSER_REFRESH | KEXT },
- { 0x68, VK_BROWSER_STOP | KEXT },
- { 0x69, VK_BROWSER_FORWARD | KEXT },
- { 0x6A, VK_BROWSER_BACK | KEXT },
- { 0x6B, VK_LAUNCH_APP1 | KEXT },
- { 0x6C, VK_LAUNCH_MAIL | KEXT },
- { 0x6D, VK_LAUNCH_MEDIA_SELECT | KEXT },
- { 0x1C, VK_RETURN | KEXT },
- { 0x46, VK_CANCEL | KEXT },
{ 0, 0 },
};
ROSDATA VSC_VK extcode1_to_vk[] = {
- { 0x1d, VK_PAUSE},
{ 0, 0 },
};
@@ -165,91 +124,93 @@ ROSDATA VK_TO_BIT modifier_keys[] = {
ROSDATA MODIFIERS modifier_bits = {
modifier_keys,
- 7,
- { 0, 1, 4, 5, SHFT_INVALID, SHFT_INVALID, 2, 3 }
+ 3,
+ { 0, 1, 2, 3 } /* Modifier bit order, NONE, SHIFT, CTRL, ALT */
};
#define NOCAPS 0
#define CAPS KSHIFT /* Caps -> shift */
ROSDATA VK_TO_WCHARS2 key_to_chars_2mod[] = {
- { VK_OEM_3, NOCAPS, {0x00ad, '?' } },
- { '9', NOCAPS, {'9', '(' } },
- { '0', NOCAPS, {'0', ')' } },
- { 'J', CAPS, {'j', 'J' } },
- { 'N', CAPS, {'n', 'N' } },
- { 'Z', CAPS, {'z', 'Z' } },
- { 'W', CAPS, {0x0113, 0x0112} },
- { 'X', CAPS, {0x010d, 0x010c} },
- { VK_OEM_1, CAPS, {0x0161, 0x0160} },
- { 'U', CAPS, {'u', 'U' } },
- { 'S', CAPS, {'s', 'S' } },
- { 'I', CAPS, {'i', 'I' } },
- { 'L', CAPS, {'l', 'L' } },
- { 'D', CAPS, {'d', 'D' } },
- { 'A', CAPS, {'a', 'A' } },
- { 'T', CAPS, {'t', 'T' } },
- { 'C', CAPS, {'c', 'C' } },
- { 'P', CAPS, {'p', 'P' } },
- { VK_OEM_8, CAPS, {0x0101, 0x0100} },
- { VK_OEM_2, CAPS, {0x013c, 0x013b} },
- { VK_DECIMAL, NOCAPS, {',', ',' } },
- { VK_TAB, NOCAPS, {'\t', '\t' } },
- { VK_ADD, NOCAPS, {'+', '+' } },
- { VK_DIVIDE, NOCAPS, {'/', '/' } },
- { VK_MULTIPLY, NOCAPS, {'*', '*' } },
- { VK_SUBTRACT, NOCAPS, {'-', '-' } },
+ /* Normal vs Shifted */
+ /* The numbers */
+ { '1', NOCAPS, {'1', '!'} },
+ /* Ctrl-2 generates NUL */
+ { '3', NOCAPS, {'3', '#'} },
+ { '4', NOCAPS, {'4', '$'} },
+ { '5', NOCAPS, {'5', '%'} },
+ /* Ctrl-6 generates RS */
+ { '7', NOCAPS, {'7', '&'} },
+ { '8', NOCAPS, {'8', '*'} },
+ { '9', NOCAPS, {'9', '('} },
+ { '0', NOCAPS, {'0', ')'} },
+
+ /* Specials */
+ /* Ctrl-_ generates US */
+ { VK_OEM_PLUS ,NOCAPS, {'=', '+'} },
+ { VK_OEM_1 ,NOCAPS, {';', ':'} },
+ { VK_OEM_7 ,NOCAPS, {'\'','\"'} },
+ { VK_OEM_3 ,NOCAPS, {'`', '~'} },
+ { VK_OEM_COMMA ,NOCAPS, {',', '<'} },
+ { VK_OEM_PERIOD ,NOCAPS, {'.', '>'} },
+ { VK_OEM_2 ,NOCAPS, {'/', '?'} },
+ /* Keys that do not have shift states */
+ { VK_TAB ,NOCAPS, {'\t','\t'} },
+ { VK_ADD ,NOCAPS, {'+', '+'} },
+ { VK_SUBTRACT,NOCAPS, {'-', '-'} },
+ { VK_MULTIPLY,NOCAPS, {'*', '*'} },
+ { VK_DIVIDE ,NOCAPS, {'/', '/'} },
+ { VK_ESCAPE ,NOCAPS, {'\x1b','\x1b'} },
+ { VK_SPACE ,NOCAPS, {' ', ' '} },
{ 0, 0 }
};
ROSDATA VK_TO_WCHARS3 key_to_chars_3mod[] = {
- { '1', NOCAPS, {'1', '!', 0x00ab} },
- { '8', NOCAPS, {'8', 0x00d7, ':' } },
- { 'E', CAPS, {'e', 'E', 0x20ac} },
- { VK_OEM_COMMA, NOCAPS, {',', ';', '<' } },
- { VK_OEM_PERIOD, NOCAPS, {'.', ':', '>' } },
- { 0, 0 }
+ /* Normal, Shifted, Ctrl */
+ /* Legacy (telnet-style) ascii escapes */
+ { VK_OEM_4, 0, {'[', '{', 0x1b /* ESC */} },
+ { VK_OEM_6, 0, {']', '}', 0x1d /* GS */} },
+ { VK_OEM_5, 0, {'\\','|', 0x1c /* FS */} },
+ { VK_OEM_102,0,{'\\','|', 0x1c /* FS */} },
+ { VK_RETURN,0, {'\r', '\r', '\n'} },
+ { 0,0 }
};
ROSDATA VK_TO_WCHARS4 key_to_chars_4mod[] = {
- { '2', NOCAPS, {'2', 0x00ab, WCH_NONE, '@' } },
- { '3', NOCAPS, {'3', 0x00bb, WCH_NONE, '#' } },
- { '4', NOCAPS, {'4', '$', 0x20ac, '$' } },
- { '5', NOCAPS, {'5', '%', '\"', WCH_DEAD} },
- { 0xff, NOCAPS, {WCH_NONE, WCH_NONE, WCH_NONE, '~' } },
- { '7', NOCAPS, {'7', '&', WCH_NONE, 0x00b1 } },
- { 'F', CAPS, {'f', 'F', '=', ';' } },
- { 'Q', CAPS, {0x016b, 0x016a, 'q', 'Q' } },
- { 'G', CAPS, {'g', 'G', 0x0123, 0x0122 } },
- { 'R', CAPS, {'r', 'R', 0x0157, 0x0156 } },
- { 'M', CAPS, {'m', 'M', 'w', 'W' } },
- { 'V', CAPS, {'v', 'V', 'y', 'Y' } },
- { 'Y', CAPS, {0x017e, 0x017d, '[', '{' } },
- { 'H', CAPS, {'h', 'H', ']', '}' } },
- { VK_OEM_7, NOCAPS, {WCH_DEAD, WCH_DEAD, WCH_DEAD, WCH_DEAD} },
- { 0xff, NOCAPS, {0x00b4, 0x00b0, 0x00b4, 0x00a8 } },
- { 'B', CAPS, {'b', 'B', 'x', 'X' } },
- { 'K', CAPS, {'k', 'K', 0x0137, 0x0136 } },
- { 'O', CAPS, {'o', 'O', 0x00f5, 0x00d5 } },
- { 0, 0 }
-};
+ /* Normal, Shifted, Ctrl, C-S-x */
-ROSDATA VK_TO_WCHARS5 key_to_chars_5mod[] = {
- { VK_OEM_5, CAPS, {0x0137, 0x0136, WCH_NONE, WCH_NONE, 0x001c} },
- { VK_OEM_4, CAPS, {0x0146, 0x0145, WCH_NONE, WCH_NONE, 0x001b} },
- { VK_OEM_6, CAPS, {0x012b, 0x012a, WCH_NONE, WCH_NONE, 0x001d} },
- { VK_OEM_102, CAPS, {0x0123, 0x0122, '\\', '|', 0x001c} },
- { VK_BACK, NOCAPS, {'\b', '\b', WCH_NONE, WCH_NONE, 0x007f} },
- { VK_ESCAPE, NOCAPS, {0x001b, 0x001b, WCH_NONE, WCH_NONE, 0x001b} },
- { VK_RETURN, NOCAPS, {'\r', '\r', WCH_NONE, WCH_NONE, '\n' } },
- { VK_SPACE, NOCAPS, {' ', ' ', WCH_NONE, WCH_NONE, ' ' } },
- { VK_CANCEL, NOCAPS, {0x0003, 0x0003, WCH_NONE, WCH_NONE, 0x0003} },
- { 0, 0 }
-};
+ /* The alphabet */
+ { 'A', CAPS, {'a', 'A', 0x101, 0x100} },
+ { 'B', CAPS, {'b', 'B', 0x02, 0x02} },
+ { 'C', CAPS, {'c', 'C', 0x10d, 0x10c} },
+ { 'D', CAPS, {'d', 'D', 0x04, 0x04} },
+ { 'E', CAPS, {'e', 'E', 0x113, 0x112} },
+ { 'F', CAPS, {'f', 'F', 0x06, 0x06} },
+ { 'G', CAPS, {'g', 'G', 0x123, 0x122} },
+ { 'H', CAPS, {'h', 'H', 0x08, 0x08} },
+ { 'I', CAPS, {'i', 'I', 0x12b, 0x12a} },
+ { 'J', CAPS, {'j', 'J', 0x0a, 0x0a} },
+ { 'K', CAPS, {'k', 'K', 0x137, 0x136} },
+ { 'L', CAPS, {'l', 'L', 0x13c, 0x13b} },
+ { 'M', CAPS, {'m', 'M', 0x0d, 0x0d} },
+ { 'N', CAPS, {'n', 'N', 0x146, 0x145} },
+ { 'O', CAPS, {'o', 'O', 0x0f, 0x0f} },
+ { 'P', CAPS, {'p', 'P', 0x10, 0x10} },
+ { 'Q', CAPS, {'q', 'Q', 0x11, 0x11} },
+ { 'R', CAPS, {'r', 'R', 0x12, 0x12} },
+ { 'S', CAPS, {'s', 'S', 0x161, 0x160} },
+ { 'T', CAPS, {'t', 'T', 0x14, 0x14} },
+ { 'U', CAPS, {'u', 'U', 0x16b, 0x16a} },
+ { 'V', CAPS, {'v', 'V', 0x16, 0x16} },
+ { 'W', CAPS, {'w', 'W', 0x17, 0x17} },
+ { 'X', CAPS, {'x', 'X', 0x18, 0x18} },
+ { 'Y', CAPS, {'y', 'Y', 0x19, 0x19} },
+ { 'Z', CAPS, {'z', 'Z', 0x17e, 0x17d} },
-ROSDATA VK_TO_WCHARS6 key_to_chars_6mod[] = {
- { '6', NOCAPS, {'6', '/', 0x2019, '^', WCH_NONE, 0x001e} },
- { VK_OEM_MINUS, NOCAPS, {'-', '_', 0x2013, 0x2014, WCH_NONE, 0x001f} },
+ /* Legacy Ascii generators */
+ { '2', NOCAPS, {'2', '@', WCH_NONE, 0} },
+ { '6', NOCAPS, {'6', '^', WCH_NONE, 0x1e /* RS */} },
+ { VK_OEM_MINUS, NOCAPS, {'-', '_', WCH_NONE, 0x1f /* US */} },
{ 0, 0 }
};
@@ -264,22 +225,23 @@ ROSDATA VK_TO_WCHARS1 keypad_numbers[] = {
{ VK_NUMPAD7, 0, {'7'} },
{ VK_NUMPAD8, 0, {'8'} },
{ VK_NUMPAD9, 0, {'9'} },
- { 0, 0 }
+ { VK_DECIMAL, 0, {'.'} },
+ { VK_BACK, 0, {'\010'} },
+ { 0,0 }
};
#define vk_master(n,x) { (PVK_TO_WCHARS1)x, n, sizeof(x[0]) }
ROSDATA VK_TO_WCHAR_TABLE vk_to_wchar_master_table[] = {
+ vk_master(1,keypad_numbers),
+ vk_master(2,key_to_chars_2mod),
vk_master(3,key_to_chars_3mod),
vk_master(4,key_to_chars_4mod),
- vk_master(5,key_to_chars_5mod),
- vk_master(6,key_to_chars_6mod),
- vk_master(2,key_to_chars_2mod),
- vk_master(1,keypad_numbers),
{ 0,0,0 }
};
ROSDATA VSC_LPWSTR key_names[] = {
+ { 0x00, L"" },
{ 0x01, L"Esc" },
{ 0x0e, L"Backspace" },
{ 0x0f, L"Tab" },
@@ -331,12 +293,12 @@ ROSDATA VSC_LPWSTR key_names[] = {
{ 0x85, L"F22" },
{ 0x86, L"F23" },
{ 0x87, L"F24" },
- { 0, NULL }
+ { 0, NULL },
};
ROSDATA VSC_LPWSTR extended_key_names[] = {
{ 0x1c, L"Num Enter" },
- { 0x1d, L"Right Control" },
+ { 0x1d, L"Right Ctrl" },
{ 0x35, L"Num /" },
{ 0x37, L"Prnt Scrn" },
{ 0x38, L"Right Alt" },
@@ -345,7 +307,8 @@ ROSDATA VSC_LPWSTR extended_key_names[] = {
{ 0x47, L"Home" },
{ 0x48, L"Up" },
{ 0x49, L"Page Up" },
- { 0x4b, L"Left" },
+ { 0x4a, L"Left" },
+ { 0x4c, L"Center" },
{ 0x4d, L"Right" },
{ 0x4f, L"End" },
{ 0x50, L"Down" },
@@ -353,60 +316,10 @@ ROSDATA VSC_LPWSTR extended_key_names[] = {
{ 0x52, L"Insert" },
{ 0x53, L"Delete" },
{ 0x54, L"" },
- { 0x56, L"Help" },
- { 0x5b, L"Left " },
- { 0x5c, L"Right " },
- { 0x5d, L"Application" },
- { 0, NULL }
-};
-
-ROSDATA DEADKEY_LPWSTR dead_key_names[] = {
- L"\x00b4" L"ACUTE",
- L"\x00a8" L"DIAERESIS",
- L"\x00b0" L"RING",
- L"~" L"TILDE",
- NULL
-};
-
-#define DEADTRANS(ch, accent, comp, flags) MAKELONG(ch, accent), comp, flags
-
-ROSDATA DEADKEY dead_key[] = {
- { DEADTRANS(L'n', 0x00b4, 0x0144, 0x0000) },
- { DEADTRANS(L'c', 0x00b4, 0x0107, 0x0000) },
- { DEADTRANS(L'o', 0x00b4, 0x00f3, 0x0000) },
- { DEADTRANS(L'e', 0x00b4, 0x00e9, 0x0000) },
- { DEADTRANS(L's', 0x00b4, 0x015b, 0x0000) },
- { DEADTRANS(L'z', 0x00b4, 0x017a, 0x0000) },
- { DEADTRANS(L'N', 0x00b4, 0x0143, 0x0000) },
- { DEADTRANS(L'C', 0x00b4, 0x0106, 0x0000) },
- { DEADTRANS(L'O', 0x00b4, 0x00d3, 0x0000) },
- { DEADTRANS(L'E', 0x00b4, 0x00c9, 0x0000) },
- { DEADTRANS(L'S', 0x00b4, 0x015a, 0x0000) },
- { DEADTRANS(L'Z', 0x00b4, 0x0179, 0x0000) },
- { DEADTRANS(L' ', 0x00b4, 0x00b4, 0x0000) },
-
- { DEADTRANS(L'a', 0x00a8, 0x00e4, 0x0000) },
- { DEADTRANS(L'u', 0x00a8, 0x00fc, 0x0000) },
- { DEADTRANS(L'o', 0x00a8, 0x00f6, 0x0000) },
- { DEADTRANS(L'A', 0x00a8, 0x00c4, 0x0000) },
- { DEADTRANS(L'U', 0x00a8, 0x00dc, 0x0000) },
- { DEADTRANS(L'O', 0x00a8, 0x00d6, 0x0000) },
- { DEADTRANS(L' ', 0x00a8, 0x00a8, 0x0000) },
-
- { DEADTRANS(L'a', 0x00b0, 0x00e5, 0x0000) },
- { DEADTRANS(L'A', 0x00b0, 0x00c5, 0x0000) },
- { DEADTRANS(L'e', 0x00b0, 0x0117, 0x0000) },
- { DEADTRANS(L'E', 0x00b0, 0x0116, 0x0000) },
- { DEADTRANS(L'z', 0x00b0, 0x017c, 0x0000) },
- { DEADTRANS(L'Z', 0x00b0, 0x017b, 0x0000) },
- { DEADTRANS(L'g', 0x00b0, 0x0121, 0x0000) },
- { DEADTRANS(L' ', 0x00b0, 0x00b0, 0x0000) },
-
- { DEADTRANS(L'o', L'~', 0x00f5, 0x0000) },
- { DEADTRANS(L'O', L'~', 0x00d5, 0x0000) },
- { DEADTRANS(L' ', L'~', L'~', 0x0000) },
-
- {0, 0}
+ { 0x55, L"Help" },
+ { 0x56, L"Left Windows" },
+ { 0x5b, L"Right Windows" },
+ { 0, NULL },
};
/* Finally, the master table */
@@ -417,13 +330,13 @@ ROSDATA KBDTABLES keyboard_layout_table = {
/* character from vk tables */
vk_to_wchar_master_table,
- /* diacritical marks */
- dead_key,
+ /* diacritical marks -- currently implemented by wine code */
+ NULL,
/* Key names */
(VSC_LPWSTR *)key_names,
(VSC_LPWSTR *)extended_key_names,
- dead_key_names, /* Dead key names */
+ NULL, /* Dead key names */
/* scan code to virtual key maps */
scancode_to_vk,
@@ -431,9 +344,9 @@ ROSDATA KBDTABLES keyboard_layout_table = {
extcode0_to_vk,
extcode1_to_vk,
- MAKELONG(1,1), /* Version 1.0 */
+ MAKELONG(0,1), /* Version 1.0 */
- /* Ligatures */
+ /* Ligatures -- Latvian doesn't have any */
0,
0,
NULL
@@ -443,12 +356,3 @@ PKBDTABLES WINAPI KbdLayerDescriptor(VOID) {
return &keyboard_layout_table;
}
-INT WINAPI
-DllMain(
- PVOID hinstDll,
- ULONG dwReason,
- PVOID reserved)
-{
- return 1;
-}
-
diff --git a/dll/win32/advapi32/misc/trace.c b/dll/win32/advapi32/misc/trace.c
index f718507f470..d56adc9b325 100644
--- a/dll/win32/advapi32/misc/trace.c
+++ b/dll/win32/advapi32/misc/trace.c
@@ -10,9 +10,9 @@
*/
ULONG CDECL
TraceMessage(
- HANDLE SessionHandle,
+ TRACEHANDLE SessionHandle,
ULONG MessageFlags,
- LPGUID MessageGuid,
+ LPCGUID MessageGuid,
USHORT MessageNumber,
...)
{
diff --git a/dll/win32/avifil32/avifil32.rbuild b/dll/win32/avifil32/avifil32.rbuild
index 1741f2a481d..da4f495711d 100644
--- a/dll/win32/avifil32/avifil32.rbuild
+++ b/dll/win32/avifil32/avifil32.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp
index c4f6bd004af..bfad8a5bd9c 100644
--- a/dll/win32/browseui/internettoolbar.cpp
+++ b/dll/win32/browseui/internettoolbar.cpp
@@ -414,10 +414,16 @@ HRESULT STDMETHODCALLTYPE CMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WP
{
SMINFO *infoPtr = (SMINFO *)lParam;
if ((infoPtr->dwMask & SMIM_FLAGS) != 0)
+ {
if (psmd->uId == FCIDM_MENU_FAVORITES)
+ {
infoPtr->dwFlags |= SMIF_DROPCASCADE;
- else{
- infoPtr->dwFlags |= SMIF_TRACKPOPUP;}
+ }
+ else
+ {
+ infoPtr->dwFlags |= SMIF_TRACKPOPUP;
+ }
+ }
if ((infoPtr->dwMask & SMIM_ICON) != 0)
infoPtr->iIcon = -1;
}
@@ -1213,7 +1219,7 @@ LRESULT CInternetToolbar::OnSearch(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOO
CComPtr objectWithSite;
CComPtr contextMenu;
CMINVOKECOMMANDINFO commandInfo;
- char *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
+ const char *searchGUID = "{169A0691-8DF9-11d1-A1C4-00C04FD75D13}";
HRESULT hResult;
// TODO: Query shell if this command is enabled first
diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp
index 3a27a1137d8..50e00d656cb 100644
--- a/dll/win32/browseui/shellbrowser.cpp
+++ b/dll/win32/browseui/shellbrowser.cpp
@@ -282,7 +282,7 @@ void CToolbarProxy::Initialize(HWND parent, IUnknown *explorerToolbar)
LRESULT CToolbarProxy::OnAddBitmap(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
- LRESULT result;
+ long int result;
HRESULT hResult;
result = 0;
diff --git a/dll/win32/comctl32/animate.c b/dll/win32/comctl32/animate.c
index 3aad68b2a42..a86ff851ba4 100644
--- a/dll/win32/comctl32/animate.c
+++ b/dll/win32/comctl32/animate.c
@@ -717,7 +717,7 @@ static BOOL ANIMATE_OpenW(ANIMATE_INFO *infoPtr, HINSTANCE hInstance, LPWSTR lps
TRACE("(%s)\n", debugstr_w(lpszName));
- if (HIWORD(lpszName))
+ if (!IS_INTRESOURCE(lpszName))
{
if (!ANIMATE_LoadResW(infoPtr, hInstance, lpszName))
{
@@ -775,7 +775,7 @@ static BOOL ANIMATE_OpenA(ANIMATE_INFO *infoPtr, HINSTANCE hInstance, LPSTR lpsz
LRESULT result;
INT len;
- if (!HIWORD(lpszName))
+ if (IS_INTRESOURCE(lpszName))
return ANIMATE_OpenW(infoPtr, hInstance, (LPWSTR)lpszName);
len = MultiByteToWideChar(CP_ACP, 0, lpszName, -1, NULL, 0);
diff --git a/dll/win32/comctl32/comboex.c b/dll/win32/comctl32/comboex.c
index 1484ba87f1d..4b5e079ac99 100644
--- a/dll/win32/comctl32/comboex.c
+++ b/dll/win32/comctl32/comboex.c
@@ -67,8 +67,6 @@ typedef struct
HWND hwndNotify; /* my parent hwnd */
HWND hwndCombo;
HWND hwndEdit;
- WNDPROC prevEditWndProc; /* previous Edit WNDPROC value */
- WNDPROC prevComboWndProc; /* previous Combo WNDPROC value */
DWORD dwExtStyle;
INT selected; /* index of selected item */
DWORD flags; /* WINE internal flags */
@@ -121,17 +119,15 @@ typedef struct
/* Offset between image and text */
#define CBE_SEP 4
-static const WCHAR COMBOEX_SUBCLASS_PROP[] = {
- 'C','C','C','o','m','b','o','E','x','3','2',
- 'S','u','b','c','l','a','s','s','I','n','f','o',0
-};
+#define COMBO_SUBCLASSID 1
+#define EDIT_SUBCLASSID 2
#define COMBOEX_GetInfoPtr(hwnd) ((COMBOEX_INFO *)GetWindowLongPtrW (hwnd, 0))
-
-/* Things common to the entire DLL */
-static LRESULT WINAPI COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
-static LRESULT WINAPI COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static LRESULT CALLBACK COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
+ UINT_PTR uId, DWORD_PTR ref_data);
+static LRESULT CALLBACK COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
+ UINT_PTR uId, DWORD_PTR ref_data);
static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr);
typedef INT (WINAPI *cmp_func_t)(LPCWSTR, LPCWSTR);
@@ -177,7 +173,7 @@ static void COMBOEX_DumpInput (COMBOBOXEXITEMW const *input)
static inline CBE_ITEMDATA *get_item_data(const COMBOEX_INFO *infoPtr, INT index)
{
return (CBE_ITEMDATA *)SendMessageW (infoPtr->hwndCombo, CB_GETITEMDATA,
- (WPARAM)index, 0);
+ index, 0);
}
static inline cmp_func_t get_cmp_func(COMBOEX_INFO const *infoPtr)
@@ -455,10 +451,7 @@ static void COMBOEX_ReSize (const COMBOEX_INFO *infoPtr)
static void COMBOEX_SetEditText (const COMBOEX_INFO *infoPtr, CBE_ITEMDATA *item)
{
if (!infoPtr->hwndEdit) return;
- /* native issues the following messages to the {Edit} control */
- /* WM_SETTEXT (0,addr) */
- /* EM_SETSEL32 (0,0) */
- /* EM_SETSEL32 (0,-1) */
+
if (item->mask & CBEIF_TEXT) {
SendMessageW (infoPtr->hwndEdit, WM_SETTEXT, 0, (LPARAM)COMBOEX_GetText(infoPtr, item));
SendMessageW (infoPtr->hwndEdit, EM_SETSEL, 0, 0);
@@ -491,13 +484,6 @@ static CBE_ITEMDATA * COMBOEX_FindItem(const COMBOEX_INFO *infoPtr, INT_PTR inde
return item;
}
-
-static inline BOOL COMBOEX_HasEdit(COMBOEX_INFO const *infoPtr)
-{
- return infoPtr->hwndEdit ? TRUE : FALSE;
-}
-
-
/* *** CBEM_xxx message support *** */
static UINT COMBOEX_GetListboxText(const COMBOEX_INFO *infoPtr, INT_PTR n, LPWSTR buf)
@@ -510,6 +496,17 @@ static UINT COMBOEX_GetListboxText(const COMBOEX_INFO *infoPtr, INT_PTR n, LPWST
return 0;
str = COMBOEX_GetText(infoPtr, item);
+ if (!str)
+ {
+ if (buf)
+ {
+ if (infoPtr->unicode)
+ buf[0] = 0;
+ else
+ *((LPSTR)buf) = 0;
+ }
+ return 0;
+ }
if (infoPtr->unicode)
{
@@ -536,7 +533,7 @@ static INT COMBOEX_DeleteItem (const COMBOEX_INFO *infoPtr, INT_PTR index)
if (!COMBOEX_FindItem(infoPtr, index)) return CB_ERR;
/* doing this will result in WM_DELETEITEM being issued */
- SendMessageW (infoPtr->hwndCombo, CB_DELETESTRING, (WPARAM)index, 0);
+ SendMessageW (infoPtr->hwndCombo, CB_DELETESTRING, index, 0);
return infoPtr->nb_items;
}
@@ -547,13 +544,13 @@ static BOOL COMBOEX_GetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
INT_PTR index = cit->iItem;
CBE_ITEMDATA *item;
- TRACE("(...)\n");
+ TRACE("\n");
/* if item number requested does not exist then return failure */
if ((index >= infoPtr->nb_items) || (index < -1)) return FALSE;
/* if the item is the edit control and there is no edit control, skip */
- if ((index == -1) && !COMBOEX_HasEdit(infoPtr)) return FALSE;
+ if ((index == -1) && !infoPtr->hwndEdit) return FALSE;
if (!(item = COMBOEX_FindItem(infoPtr, index))) return FALSE;
@@ -567,7 +564,7 @@ static BOOL COMBOEX_GetItemA (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA *cit)
{
COMBOBOXEXITEMW tmpcit;
- TRACE("(...)\n");
+ TRACE("\n");
tmpcit.mask = cit->mask;
tmpcit.iItem = cit->iItem;
@@ -600,8 +597,7 @@ static BOOL COMBOEX_GetItemA (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMA *cit)
static inline BOOL COMBOEX_HasEditChanged (COMBOEX_INFO const *infoPtr)
{
- return COMBOEX_HasEdit(infoPtr) &&
- (infoPtr->flags & WCBE_EDITHASCHANGED) == WCBE_EDITHASCHANGED;
+ return infoPtr->hwndEdit && (infoPtr->flags & WCBE_EDITHASCHANGED) == WCBE_EDITHASCHANGED;
}
@@ -678,8 +674,7 @@ static INT COMBOEX_InsertItemW (COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW const *ci
if (TRACE_ON(comboex)) COMBOEX_DumpItem (item);
- SendMessageW (infoPtr->hwndCombo, CB_INSERTSTRING,
- (WPARAM)cit->iItem, (LPARAM)item);
+ SendMessageW (infoPtr->hwndCombo, CB_INSERTSTRING, cit->iItem, (LPARAM)item);
memset (&nmcit.ceItem, 0, sizeof(nmcit.ceItem));
COMBOEX_CopyItem (item, &nmcit.ceItem);
@@ -751,7 +746,7 @@ static HIMAGELIST COMBOEX_SetImageList (COMBOEX_INFO *infoPtr, HIMAGELIST himl)
{
HIMAGELIST himlTemp = infoPtr->himl;
- TRACE("(...)\n");
+ TRACE("\n");
infoPtr->himl = himl;
@@ -774,7 +769,7 @@ static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
if ((index >= infoPtr->nb_items) || (index < -1)) return FALSE;
/* if the item is the edit control and there is no edit control, skip */
- if ((index == -1) && !COMBOEX_HasEdit(infoPtr)) return FALSE;
+ if ((index == -1) && !infoPtr->hwndEdit) return FALSE;
if (!(item = COMBOEX_FindItem(infoPtr, index))) return FALSE;
@@ -802,7 +797,7 @@ static BOOL COMBOEX_SetItemW (const COMBOEX_INFO *infoPtr, COMBOBOXEXITEMW *cit)
if (cit->mask & CBEIF_INDENT)
item->iIndent = cit->iIndent;
if (cit->mask & CBEIF_LPARAM)
- cit->lParam = cit->lParam;
+ item->lParam = cit->lParam;
if (TRACE_ON(comboex)) COMBOEX_DumpItem (item);
@@ -968,12 +963,10 @@ static INT COMBOEX_SetItemHeight (COMBOEX_INFO const *infoPtr, INT index, UINT h
static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
{
- static const WCHAR COMBOBOX[] = { 'C', 'o', 'm', 'b', 'o', 'B', 'o', 'x', 0 };
- static const WCHAR EDIT[] = { 'E', 'D', 'I', 'T', 0 };
static const WCHAR NIL[] = { 0 };
COMBOEX_INFO *infoPtr;
LOGFONTW mylogfont;
- RECT wnrc1, clrc1, cmbwrc;
+ RECT win_rect;
INT i;
/* allocate memory for info structure */
@@ -998,11 +991,13 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
- /* create combo box */
- GetWindowRect(hwnd, &wnrc1);
- GetClientRect(hwnd, &clrc1);
- TRACE("EX window=(%s), client=(%s)\n",
- wine_dbgstr_rect(&wnrc1), wine_dbgstr_rect(&clrc1));
+ if (TRACE_ON(comboex)) {
+ RECT client, rect;
+ GetWindowRect(hwnd, &rect);
+ GetClientRect(hwnd, &client);
+ TRACE("EX window=(%s), client=(%s)\n",
+ wine_dbgstr_rect(&rect), wine_dbgstr_rect(&client));
+ }
/* Native version of ComboEx creates the ComboBox with DROPDOWNLIST */
/* specified. It then creates it's own version of the EDIT control */
@@ -1011,7 +1006,7 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
/* We also need to place the edit control at the proper location */
/* (allow space for the icons). */
- infoPtr->hwndCombo = CreateWindowW (COMBOBOX, NIL,
+ infoPtr->hwndCombo = CreateWindowW (WC_COMBOBOXW, NIL,
/* following line added to match native */
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_VSCROLL |
CBS_NOINTEGRALHEIGHT | CBS_DROPDOWNLIST |
@@ -1030,22 +1025,16 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
* GetCurrentProcessId()
*/
- /*
- * Setup a property to hold the pointer to the COMBOBOXEX
- * data structure.
- */
- SetPropW(infoPtr->hwndCombo, COMBOEX_SUBCLASS_PROP, hwnd);
- infoPtr->prevComboWndProc = (WNDPROC)SetWindowLongPtrW(infoPtr->hwndCombo,
- GWLP_WNDPROC, (DWORD_PTR)COMBOEX_ComboWndProc);
+ SetWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID,
+ (DWORD_PTR)hwnd);
infoPtr->font = (HFONT)SendMessageW (infoPtr->hwndCombo, WM_GETFONT, 0, 0);
-
/*
* Now create our own EDIT control so we can position it.
* It is created only for CBS_DROPDOWN style
*/
if ((cs->style & CBS_DROPDOWNLIST) == CBS_DROPDOWN) {
- infoPtr->hwndEdit = CreateWindowExW (0, EDIT, NIL,
+ infoPtr->hwndEdit = CreateWindowExW (0, WC_EDITW, NIL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | ES_AUTOHSCROLL,
0, 0, 0, 0, /* will set later */
infoPtr->hwndCombo,
@@ -1058,14 +1047,9 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
* GetWindowThreadProcessId(hwndEdit, &???)
* GetCurrentProcessId()
*/
+ SetWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID,
+ (DWORD_PTR)hwnd);
- /*
- * Setup a property to hold the pointer to the COMBOBOXEX
- * data structure.
- */
- SetPropW(infoPtr->hwndEdit, COMBOEX_SUBCLASS_PROP, hwnd);
- infoPtr->prevEditWndProc = (WNDPROC)SetWindowLongPtrW(infoPtr->hwndEdit,
- GWLP_WNDPROC, (DWORD_PTR)COMBOEX_EditWndProc);
infoPtr->font = (HFONT)SendMessageW(infoPtr->hwndCombo, WM_GETFONT, 0, 0);
}
@@ -1081,27 +1065,31 @@ static LRESULT COMBOEX_Create (HWND hwnd, CREATESTRUCTA const *cs)
SendMessageW (infoPtr->hwndCombo, WM_SETFONT, (WPARAM)infoPtr->font, 0);
if (infoPtr->hwndEdit) {
SendMessageW (infoPtr->hwndEdit, WM_SETFONT, (WPARAM)infoPtr->font, 0);
- SendMessageW (infoPtr->hwndEdit, EM_SETMARGINS, (WPARAM)EC_USEFONTINFO, 0);
+ SendMessageW (infoPtr->hwndEdit, EM_SETMARGINS, EC_USEFONTINFO, 0);
}
COMBOEX_ReSize (infoPtr);
/* Above is fairly certain, below is much less certain. */
- GetWindowRect(hwnd, &wnrc1);
- GetClientRect(hwnd, &clrc1);
- GetWindowRect(infoPtr->hwndCombo, &cmbwrc);
- TRACE("EX window=(%s) client=(%s) CB wnd=(%s)\n",
- wine_dbgstr_rect(&wnrc1), wine_dbgstr_rect(&clrc1),
- wine_dbgstr_rect(&cmbwrc));
- SetWindowPos(infoPtr->hwndCombo, HWND_TOP,
- 0, 0, wnrc1.right-wnrc1.left, wnrc1.bottom-wnrc1.top,
+ GetWindowRect(hwnd, &win_rect);
+
+ if (TRACE_ON(comboex)) {
+ RECT client, rect;
+ GetClientRect(hwnd, &client);
+ GetWindowRect(infoPtr->hwndCombo, &rect);
+ TRACE("EX window=(%s) client=(%s) CB wnd=(%s)\n",
+ wine_dbgstr_rect(&win_rect), wine_dbgstr_rect(&client),
+ wine_dbgstr_rect(&rect));
+ }
+ SetWindowPos(infoPtr->hwndCombo, HWND_TOP, 0, 0,
+ win_rect.right - win_rect.left, win_rect.bottom - win_rect.top,
SWP_NOACTIVATE | SWP_NOREDRAW);
- GetWindowRect(infoPtr->hwndCombo, &cmbwrc);
- TRACE("CB window=(%s)\n", wine_dbgstr_rect(&cmbwrc));
- SetWindowPos(hwnd, HWND_TOP,
- 0, 0, cmbwrc.right-cmbwrc.left, cmbwrc.bottom-cmbwrc.top,
+ GetWindowRect(infoPtr->hwndCombo, &win_rect);
+ TRACE("CB window=(%s)\n", wine_dbgstr_rect(&win_rect));
+ SetWindowPos(hwnd, HWND_TOP, 0, 0,
+ win_rect.right - win_rect.left, win_rect.bottom - win_rect.top,
SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE);
COMBOEX_AdjustEditPos (infoPtr);
@@ -1158,7 +1146,7 @@ static LRESULT COMBOEX_Command (COMBOEX_INFO *infoPtr, WPARAM wParam)
*/
ShowWindow (infoPtr->hwndEdit, SW_SHOW);
InvalidateRect (infoPtr->hwndCombo, 0, TRUE);
- InvalidateRect (infoPtr->hwndEdit, 0, TRUE);
+ if (infoPtr->hwndEdit) InvalidateRect (infoPtr->hwndEdit, 0, TRUE);
cursel = SendMessageW (infoPtr->hwndCombo, CB_GETCURSEL, 0, 0);
if (cursel == -1) {
cmp_func_t cmptext = get_cmp_func(infoPtr);
@@ -1173,8 +1161,7 @@ static LRESULT COMBOEX_Command (COMBOEX_INFO *infoPtr, WPARAM wParam)
if ((cursel == n) || ((INT_PTR)item == CB_ERR)) {
TRACE("failed to find match??? item=%p cursel=%d\n",
item, cursel);
- if (infoPtr->hwndEdit)
- SetFocus(infoPtr->hwndEdit);
+ if (infoPtr->hwndEdit) SetFocus(infoPtr->hwndEdit);
return 0;
}
}
@@ -1183,8 +1170,7 @@ static LRESULT COMBOEX_Command (COMBOEX_INFO *infoPtr, WPARAM wParam)
if ((INT_PTR)item == CB_ERR) {
TRACE("failed to find match??? item=%p cursel=%d\n",
item, cursel);
- if (infoPtr->hwndEdit)
- SetFocus(infoPtr->hwndEdit);
+ if (infoPtr->hwndEdit) SetFocus(infoPtr->hwndEdit);
return 0;
}
}
@@ -1280,8 +1266,7 @@ static LRESULT COMBOEX_Command (COMBOEX_INFO *infoPtr, WPARAM wParam)
* after passing the command to the parent of the ComboEx.
*/
lret = SendMessageW (parent, WM_COMMAND, wParam, (LPARAM)infoPtr->hwndSelf);
- if (infoPtr->hwndEdit)
- SetFocus(infoPtr->hwndEdit);
+ if (infoPtr->hwndEdit) SetFocus(infoPtr->hwndEdit);
return lret;
}
return 0;
@@ -1377,14 +1362,12 @@ static LRESULT COMBOEX_DrawItem (const COMBOEX_INFO *infoPtr, DRAWITEMSTRUCT con
(dis->itemAction == ODA_DRAWENTIRE)) {
/* draw of edit control data */
- /* testing */
- {
+ if (TRACE_ON(comboex)) {
RECT exrc, cbrc, edrc;
GetWindowRect (infoPtr->hwndSelf, &exrc);
GetWindowRect (infoPtr->hwndCombo, &cbrc);
- edrc.left=edrc.top=edrc.right=edrc.bottom=-1;
- if (infoPtr->hwndEdit)
- GetWindowRect (infoPtr->hwndEdit, &edrc);
+ edrc.left = edrc.top = edrc.right = edrc.bottom = -1;
+ if (infoPtr->hwndEdit) GetWindowRect (infoPtr->hwndEdit, &edrc);
TRACE("window rects ex=(%s), cb=(%s), ed=(%s)\n",
wine_dbgstr_rect(&exrc), wine_dbgstr_rect(&cbrc),
wine_dbgstr_rect(&edrc));
@@ -1595,8 +1578,12 @@ static void COMBOEX_ResetContent (COMBOEX_INFO *infoPtr)
static LRESULT COMBOEX_Destroy (COMBOEX_INFO *infoPtr)
{
if (infoPtr->hwndCombo)
- DestroyWindow (infoPtr->hwndCombo);
+ RemoveWindowSubclass(infoPtr->hwndCombo, COMBOEX_ComboWndProc, COMBO_SUBCLASSID);
+ if (infoPtr->hwndEdit)
+ RemoveWindowSubclass(infoPtr->hwndEdit, COMBOEX_EditWndProc, EDIT_SUBCLASSID);
+
+ COMBOEX_FreeText (infoPtr->edit);
Free (infoPtr->edit);
infoPtr->edit = 0;
@@ -1720,11 +1707,11 @@ static LRESULT COMBOEX_WindowPosChanging (const COMBOEX_INFO *infoPtr, WINDOWPOS
return 0;
}
-static LRESULT WINAPI
-COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+static LRESULT CALLBACK
+COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
+ UINT_PTR uId, DWORD_PTR ref_data)
{
- HWND hwndComboex = GetPropW(hwnd, COMBOEX_SUBCLASS_PROP);
- COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwndComboex);
+ COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr ((HWND)ref_data);
NMCBEENDEDITW cbeend;
WCHAR edit_text[260];
COLORREF obkc;
@@ -1744,8 +1731,7 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* handle (ignore) the return character */
if (wParam == VK_RETURN) return 0;
/* all other characters pass into the real Edit */
- return CallWindowProcW (infoPtr->prevEditWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_ERASEBKGND:
/*
@@ -1757,8 +1743,7 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
TRACE("erasing (%s)\n", wine_dbgstr_rect(&rect));
ExtTextOutW (hDC, 0, 0, ETO_OPAQUE, &rect, 0, 0, 0);
SetBkColor (hDC, obkc);
- return CallWindowProcW (infoPtr->prevEditWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_KEYDOWN: {
INT_PTR oldItem, selected, step = 1;
@@ -1864,8 +1849,7 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
oldItem = SendMessageW (infoPtr->hwndCombo,CB_GETCURSEL, 0, 0);
if (oldItem != -1) {
/* if something is selected, then deselect it */
- SendMessageW (infoPtr->hwndCombo, CB_SETCURSEL,
- (WPARAM)-1, 0);
+ SendMessageW (infoPtr->hwndCombo, CB_SETCURSEL, -1, 0);
}
InvalidateRect (infoPtr->hwndCombo, 0, 0);
SetFocus(infoPtr->hwndEdit);
@@ -1880,16 +1864,14 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
SendMessageW (infoPtr->hwndSelf, CB_SETCURSEL, oldItem + step, 0);
return 0;
default:
- return CallWindowProcW (infoPtr->prevEditWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
case WM_SETFOCUS:
/* remember the focus to set state of icon */
- lret = CallWindowProcW (infoPtr->prevEditWndProc,
- hwnd, uMsg, wParam, lParam);
+ lret = DefSubclassProc(hwnd, uMsg, wParam, lParam);
infoPtr->flags |= WCBE_EDITFOCUSED;
return lret;
@@ -1912,17 +1894,16 @@ COMBOEX_EditWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* fall through */
default:
- return CallWindowProcW (infoPtr->prevEditWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
}
}
-static LRESULT WINAPI
-COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+static LRESULT CALLBACK
+COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
+ UINT_PTR uId, DWORD_PTR ref_data)
{
- HWND hwndComboex = GetPropW(hwnd, COMBOEX_SUBCLASS_PROP);
- COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr (hwndComboex);
+ COMBOEX_INFO *infoPtr = COMBOEX_GetInfoPtr ((HWND)ref_data);
NMCBEENDEDITW cbeend;
NMMOUSE nmmse;
COLORREF obkc;
@@ -1947,8 +1928,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
* that ComboEx knows this is listbox.
*/
((DRAWITEMSTRUCT *)lParam)->itemState |= ODS_COMBOEXLBOX;
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_ERASEBKGND:
/*
@@ -1960,8 +1940,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
TRACE("erasing (%s)\n", wine_dbgstr_rect(&rect));
ExtTextOutW (hDC, 0, 0, ETO_OPAQUE, &rect, 0, 0, 0);
SetBkColor (hDC, obkc);
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_SETCURSOR:
/*
@@ -1975,8 +1954,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
nmmse.pt.y = 0;
nmmse.dwHitInfo = lParam;
COMBOEX_Notify (infoPtr, NM_SETCURSOR, (NMHDR *)&nmmse);
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_LBUTTONDOWN:
GetClientRect (hwnd, &rect);
@@ -1986,16 +1964,16 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam);
if (PtInRect(&rect, pt))
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+
infoPtr->flags |= WCBE_MOUSECAPTURED;
SetCapture(hwnd);
break;
case WM_LBUTTONUP:
if (!(infoPtr->flags & WCBE_MOUSECAPTURED))
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
+
ReleaseCapture();
infoPtr->flags &= ~WCBE_MOUSECAPTURED;
if (infoPtr->flags & WCBE_MOUSEDRAGGED) {
@@ -2012,8 +1990,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
COMBOEX_NotifyDragBegin(infoPtr, edit_text);
infoPtr->flags |= WCBE_MOUSEDRAGGED;
}
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
case WM_COMMAND:
switch (HIWORD(wParam)) {
@@ -2157,8 +2134,7 @@ COMBOEX_ComboWndProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
}/* fall through */
default:
- return CallWindowProcW (infoPtr->prevComboWndProc,
- hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
}
return 0;
}
diff --git a/dll/win32/comctl32/comctl32.h b/dll/win32/comctl32/comctl32.h
index 300831434ee..3d172ae7605 100644
--- a/dll/win32/comctl32/comctl32.h
+++ b/dll/win32/comctl32/comctl32.h
@@ -231,18 +231,7 @@ extern void UPDOWN_Unregister(void);
int MONTHCAL_MonthLength(int month, int year);
-
-static inline void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to)
-{
- to->wYear = from->wYear;
- to->wMonth = from->wMonth;
- to->wDayOfWeek = from->wDayOfWeek;
- to->wDay = from->wDay;
- to->wHour = from->wHour;
- to->wMinute = from->wMinute;
- to->wSecond = from->wSecond;
- to->wMilliseconds = from->wMilliseconds;
-}
+int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace);
extern void THEMING_Initialize(void);
extern void THEMING_Uninitialize(void);
diff --git a/dll/win32/comctl32/comctl32.rbuild b/dll/win32/comctl32/comctl32.rbuild
index 3cc1ce2c0ad..958edb05d11 100644
--- a/dll/win32/comctl32/comctl32.rbuild
+++ b/dll/win32/comctl32/comctl32.rbuild
@@ -1,7 +1,7 @@
-
+
.
@@ -47,6 +47,7 @@
treeview.c
updown.c
rsrc.rc
+ uuid
wine
user32
gdi32
diff --git a/dll/win32/comctl32/comctl32undoc.c b/dll/win32/comctl32/comctl32undoc.c
index ee684c627d4..ff94051bcc0 100644
--- a/dll/win32/comctl32/comctl32undoc.c
+++ b/dll/win32/comctl32/comctl32undoc.c
@@ -885,9 +885,11 @@ INT WINAPI EnumMRUListA (HANDLE hList, INT nItemPos, LPVOID lpBuffer,
} else {
lenA = WideCharToMultiByte(CP_ACP, 0, (LPWSTR)&witem->datastart, -1,
NULL, 0, NULL, NULL);
- datasize = min( witem->size, nBufferSize );
+ datasize = min( lenA, nBufferSize );
WideCharToMultiByte(CP_ACP, 0, (LPWSTR)&witem->datastart, -1,
lpBuffer, datasize, NULL, NULL);
+ ((char *)lpBuffer)[ datasize - 1 ] = '\0';
+ datasize = lenA - 1;
}
TRACE("(%p, %d, %p, %d): returning len=%d\n",
hList, nItemPos, lpBuffer, nBufferSize, datasize);
diff --git a/dll/win32/comctl32/comctl_Bg.rc b/dll/win32/comctl32/comctl_Bg.rc
index 94dd8703c64..6c64f9ac0c8 100644
--- a/dll/win32/comctl32/comctl_Bg.rc
+++ b/dll/win32/comctl32/comctl_Bg.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_BULGARIAN, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Cs.rc b/dll/win32/comctl32/comctl_Cs.rc
index 63cc0bbc68b..e770e331e5c 100644
--- a/dll/win32/comctl32/comctl_Cs.rc
+++ b/dll/win32/comctl32/comctl_Cs.rc
@@ -20,6 +20,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_CZECH, SUBLANG_DEFAULT
/* Czech strings in CP1250 */
diff --git a/dll/win32/comctl32/comctl_De.rc b/dll/win32/comctl32/comctl_De.rc
index 831e2ee9b94..87730c881f9 100644
--- a/dll/win32/comctl32/comctl_De.rc
+++ b/dll/win32/comctl32/comctl_De.rc
@@ -16,11 +16,15 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
+#pragma code_page(65001)
+
LANGUAGE LANG_GERMAN, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
- IDS_CLOSE "Schließen"
+ IDS_CLOSE "SchlieĂźen"
}
STRINGTABLE DISCARDABLE
@@ -41,7 +45,7 @@ STRINGTABLE DISCARDABLE
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Eigenschaften für %s"
+CAPTION "Eigenschaften fĂĽr %s"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "&OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
@@ -57,9 +61,9 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Wizard"
FONT 8, "MS Shell Dlg"
BEGIN
- PUSHBUTTON "< &Zurück", IDC_BACK_BUTTON,71,138,50,14
+ PUSHBUTTON "< &ZurĂĽck", IDC_BACK_BUTTON,71,138,50,14
DEFPUSHBUTTON "&Weiter >", IDC_NEXT_BUTTON,121,138,50,14
- DEFPUSHBUTTON "&Beenden", IDC_FINISH_BUTTON,121,138,50,14
+ DEFPUSHBUTTON "&Fertig", IDC_FINISH_BUTTON,121,138,50,14
PUSHBUTTON "Abbrechen", IDCANCEL,178,138,50,14
PUSHBUTTON "&Hilfe", IDHELP,235,138,50,14,WS_GROUP
LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
@@ -73,15 +77,15 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Toolbar einrichten"
FONT 8, "MS Shell Dlg"
BEGIN
- DEFPUSHBUTTON "&Schließen", IDCANCEL,308,6,44,14
- PUSHBUTTON "&Zurücksetzen", IDC_RESET_BTN,308,23,44,14
+ DEFPUSHBUTTON "&SchlieĂźen", IDCANCEL,308,6,44,14
+ PUSHBUTTON "&ZurĂĽcksetzen", IDC_RESET_BTN,308,23,44,14
PUSHBUTTON "&Hilfe", IDC_HELP_BTN,308,40,44,14
PUSHBUTTON "Nach &Oben verschieben", IDC_MOVEUP_BTN,308,74,44,14
PUSHBUTTON "Nach &Unten verschieben", IDC_MOVEDN_BTN,308,91,44,14
- LTEXT "&Vorhandene Knöpfe:", -1,4,5,84,10
+ LTEXT "&Vorhandene Knöpfe:", -1,4,5,84,10
LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
- PUSHBUTTON "H&inzufügen ->", IDOK, 131, 42, 44, 14
- PUSHBUTTON "<- &Löschen", IDC_REMOVE_BTN,131,62,44,14
- LTEXT "&Toolbarknöpfe:", -1,182,5,78,10
+ PUSHBUTTON "H&inzufĂĽgen ->", IDOK, 131, 42, 44, 14
+ PUSHBUTTON "<- &Löschen", IDC_REMOVE_BTN,131,62,44,14
+ LTEXT "&Toolbarknöpfe:", -1,182,5,78,10
LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END
diff --git a/dll/win32/comctl32/comctl_El.rc b/dll/win32/comctl32/comctl_El.rc
index a505620adfa..de08357270d 100644
--- a/dll/win32/comctl32/comctl_El.rc
+++ b/dll/win32/comctl32/comctl_El.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_GREEK, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_En.rc b/dll/win32/comctl32/comctl_En.rc
index 369eecd90ff..d8055e98f3f 100644
--- a/dll/win32/comctl32/comctl_En.rc
+++ b/dll/win32/comctl32/comctl_En.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Eo.rc b/dll/win32/comctl32/comctl_Eo.rc
index bda181759f8..59fe39ed8e8 100644
--- a/dll/win32/comctl32/comctl_Eo.rc
+++ b/dll/win32/comctl32/comctl_Eo.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_ESPERANTO, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Es.rc b/dll/win32/comctl32/comctl_Es.rc
index ea2968edcaa..ce4621791f0 100644
--- a/dll/win32/comctl32/comctl_Es.rc
+++ b/dll/win32/comctl32/comctl_Es.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_SPANISH, SUBLANG_NEUTRAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Fr.rc b/dll/win32/comctl32/comctl_Fr.rc
index df56339f4c6..2fd2f89dde7 100644
--- a/dll/win32/comctl32/comctl_Fr.rc
+++ b/dll/win32/comctl32/comctl_Fr.rc
@@ -3,7 +3,7 @@
* French language support
*
* Copyright 1999 Eric Kohl
- * Copyright 2003 Vincent Béron
+ * Copyright 2003 Vincent Béron
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -20,11 +20,16 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Propriétés pour %s"
+CAPTION "Propriétés pour %s"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
@@ -40,9 +45,9 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Assistant"
FONT 8, "MS Shell Dlg"
BEGIN
- PUSHBUTTON "< &Précédent", IDC_BACK_BUTTON,71,138,50,14
- DEFPUSHBUTTON "&Suivant >", IDC_NEXT_BUTTON,121,138,50,14
- DEFPUSHBUTTON "Terminer", IDC_FINISH_BUTTON,121,138,50,14
+ PUSHBUTTON "< &Précédent", IDC_BACK_BUTTON,71,138,50,14
+ DEFPUSHBUTTON "&Suivant >", IDC_NEXT_BUTTON,123,138,50,14
+ DEFPUSHBUTTON "Terminer", IDC_FINISH_BUTTON,123,138,50,14
PUSHBUTTON "Annuler", IDCANCEL,178,138,50,14
PUSHBUTTON "Aide", IDHELP,235,138,50,14,WS_GROUP
LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
@@ -57,15 +62,15 @@ CAPTION "Personnaliser la barre d'outils"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "&Fermer", IDCANCEL,308,6,44,14
- PUSHBUTTON "&Réinitialiser", IDC_RESET_BTN,308,23,44,14
+ PUSHBUTTON "&Réinitialiser", IDC_RESET_BTN,308,23,44,14
PUSHBUTTON "Aid&e", IDC_HELP_BTN,308,40,44,14
PUSHBUTTON "&Monter", IDC_MOVEUP_BTN,308,74,44,14
PUSHBUTTON "&Descendre", IDC_MOVEDN_BTN,308,91,44,14
- LTEXT "Boutons disponibles :", -1,4,5,84,10
+ LTEXT "Boutons &disponibles :", -1,4,5,84,10
LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
PUSHBUTTON "A&jouter ->", IDOK, 131, 42, 44, 14
PUSHBUTTON "<- E&nlever", IDC_REMOVE_BTN,131,62,44,14
- LTEXT "&Boutons de la barre d'outils :", -1,182,5,78,10
+ LTEXT "&Boutons de la barre d'outils :", -1,182,5,93,10
LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END
@@ -77,12 +82,12 @@ STRINGTABLE DISCARDABLE
STRINGTABLE DISCARDABLE
{
IDM_TODAY "Aujourd'hui:"
- IDM_GOTODAY "Aller ŕ aujourd'hui"
+ IDM_GOTODAY "Aller Ă aujourd'hui"
}
STRINGTABLE DISCARDABLE
{
- IDS_SEPARATOR "Séparateur"
+ IDS_SEPARATOR "Séparateur"
}
STRINGTABLE DISCARDABLE
diff --git a/dll/win32/comctl32/comctl_Hu.rc b/dll/win32/comctl32/comctl_Hu.rc
index 6019777c1bd..2ba1160efc1 100644
--- a/dll/win32/comctl32/comctl_Hu.rc
+++ b/dll/win32/comctl32/comctl_Hu.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_HUNGARIAN, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_It.rc b/dll/win32/comctl32/comctl_It.rc
index 2b2f315589e..75bd9c19c4c 100644
--- a/dll/win32/comctl32/comctl_It.rc
+++ b/dll/win32/comctl32/comctl_It.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Ja.rc b/dll/win32/comctl32/comctl_Ja.rc
index e3c1272f29a..ce16f5a2f53 100644
--- a/dll/win32/comctl32/comctl_Ja.rc
+++ b/dll/win32/comctl32/comctl_Ja.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -23,7 +25,7 @@ LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Properties for %s"
+CAPTION "%să®ă—ăă‘ă†ă‚Ł"
FONT 9, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
@@ -36,11 +38,11 @@ END
IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Wizard"
+CAPTION "ウィザăĽă‰"
FONT 9, "MS Shell Dlg"
BEGIN
PUSHBUTTON "< ć»ă‚‹(&B)", IDC_BACK_BUTTON,71,138,50,14
- DEFPUSHBUTTON "進む(&N) >", IDC_NEXT_BUTTON,121,138,50,14
+ DEFPUSHBUTTON "次ă¸(&N) >", IDC_NEXT_BUTTON,121,138,50,14
DEFPUSHBUTTON "完了", IDC_FINISH_BUTTON,121,138,50,14
PUSHBUTTON "ă‚ăŁăłă‚»ă«", IDCANCEL,178,138,50,14
PUSHBUTTON "ăă«ă—", IDHELP,235,138,50,14,WS_GROUP
@@ -52,7 +54,7 @@ END
IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Customize Toolbar"
+CAPTION "ă„ăĽă«ăăĽă®ă‚«ă‚ąă‚żăžă‚¤ă‚ş"
FONT 9, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "é–‰ăă‚‹(&C)", IDCANCEL,308,6,44,14
@@ -60,33 +62,31 @@ BEGIN
PUSHBUTTON "ăă«ă—(&H)", IDC_HELP_BTN,308,40,44,14
PUSHBUTTON "上㸠(&U)", IDC_MOVEUP_BTN,308,74,44,14
PUSHBUTTON "下㸠(&D)", IDC_MOVEDN_BTN,308,91,44,14
- LTEXT "A&vailable buttons:", -1,4,5,84,10
+ LTEXT "ĺ©ç”¨ĺŹŻč˝ăŞăśă‚żăł(&V):", -1,4,5,84,10
LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
PUSHBUTTON "čż˝ĺŠ (&A) ->", IDOK, 131, 42, 44, 14
PUSHBUTTON "<- 削除(&R)", IDC_REMOVE_BTN,131,62,44,14
- LTEXT "&Toolbar buttons:", -1,182,5,78,10
+ LTEXT "ă„ăĽă«ăăĽă®ăśă‚żăł(&T):", -1,182,5,78,10
LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END
STRINGTABLE DISCARDABLE
{
- IDS_CLOSE "Close"
+ IDS_CLOSE "é–‰ăă‚‹"
}
STRINGTABLE DISCARDABLE
{
- IDM_TODAY "Today:"
- IDM_GOTODAY "Go to today"
+ IDM_TODAY "今日:"
+ IDM_GOTODAY "今日ă¸ç§»ĺ‹•"
}
STRINGTABLE DISCARDABLE
{
- IDS_SEPARATOR "Separator"
+ IDS_SEPARATOR "区ĺ‡ă‚Š"
}
STRINGTABLE DISCARDABLE
{
- HKY_NONE "None"
+ HKY_NONE "ăŞă—"
}
-
-#pragma code_page(default)
diff --git a/dll/win32/comctl32/comctl_Ko.rc b/dll/win32/comctl32/comctl_Ko.rc
index 6574b66a74e..daf9917e62a 100644
--- a/dll/win32/comctl32/comctl_Ko.rc
+++ b/dll/win32/comctl32/comctl_Ko.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Lt.rc b/dll/win32/comctl32/comctl_Lt.rc
index bfe0986d749..f5f329429cb 100644
--- a/dll/win32/comctl32/comctl_Lt.rc
+++ b/dll/win32/comctl32/comctl_Lt.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
/* UTF-8 */
#pragma code_page(65001)
@@ -88,5 +90,3 @@ STRINGTABLE DISCARDABLE
{
HKY_NONE "Joks"
}
-
-#pragma code_page(default)
diff --git a/dll/win32/comctl32/comctl_Nl.rc b/dll/win32/comctl32/comctl_Nl.rc
index a277b0f6cb9..fe2bf7a9d4a 100644
--- a/dll/win32/comctl32/comctl_Nl.rc
+++ b/dll/win32/comctl32/comctl_Nl.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
@@ -75,7 +77,7 @@ STRINGTABLE DISCARDABLE
STRINGTABLE DISCARDABLE
{
IDM_TODAY "Vandaag:"
- IDM_GOTODAY "Ga vandaag naar"
+ IDM_GOTODAY "Ga naar vandaag"
}
STRINGTABLE DISCARDABLE
diff --git a/dll/win32/comctl32/comctl_No.rc b/dll/win32/comctl32/comctl_No.rc
index 77b9ec8da70..6361f048943 100644
--- a/dll/win32/comctl32/comctl_No.rc
+++ b/dll/win32/comctl32/comctl_No.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Pl.rc b/dll/win32/comctl32/comctl_Pl.rc
index 91441344597..12f13a63fa1 100644
--- a/dll/win32/comctl32/comctl_Pl.rc
+++ b/dll/win32/comctl32/comctl_Pl.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_POLISH, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Pt.rc b/dll/win32/comctl32/comctl_Pt.rc
index 3ab75fda596..914c4c22439 100644
--- a/dll/win32/comctl32/comctl_Pt.rc
+++ b/dll/win32/comctl32/comctl_Pt.rc
@@ -1,6 +1,7 @@
/*
* Copyright 2003 Marcelo Duarte
- * Copyright 2006-2007 Américo José Melo
+ * Copyright 2006-2007 Américo José Melo
+ * Copyright 2009 Ricardo Filipe
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -17,21 +18,11 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
+#include "comctl32.h"
-IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
-STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Propriedades para %s"
-FONT 8, "MS Shell Dlg"
-BEGIN
- DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
- PUSHBUTTON "Cancelar", IDCANCEL,58,122,50,14
- PUSHBUTTON "&Aplicar", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
- PUSHBUTTON "Ajuda", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
- CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
-END
+#pragma code_page(65001)
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE
+LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
@@ -45,27 +36,21 @@ BEGIN
CONTROL "Separador", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
-
IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Assistente"
FONT 8, "MS Shell Dlg"
BEGIN
PUSHBUTTON "< &Voltar", IDC_BACK_BUTTON,71,138,50,14
- DEFPUSHBUTTON "&Avançar >", IDC_NEXT_BUTTON,121,138,50,14
+ DEFPUSHBUTTON "&Avançar >", IDC_NEXT_BUTTON,121,138,50,14
DEFPUSHBUTTON "Finalizar", IDC_FINISH_BUTTON,121,138,50,14
PUSHBUTTON "Cancelar", IDCANCEL,178,138,50,14
PUSHBUTTON "Ajuda", IDHELP,235,138,50,14,WS_GROUP
LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
- CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
+ CONTROL "Separador", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
-
IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Personalizar barra de ferramentas"
@@ -76,42 +61,30 @@ BEGIN
PUSHBUTTON "&Ajuda", IDC_HELP_BTN,308,40,44,14
PUSHBUTTON "A&cima", IDC_MOVEUP_BTN,308,74,44,14
PUSHBUTTON "A&baixo", IDC_MOVEDN_BTN,308,91,44,14
- LTEXT "Botőes &disponíveis:", -1,4,5,84,10
+ LTEXT "Botões &disponĂveis:", -1,4,5,84,10
LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
PUSHBUTTON "&Adicionar ->", IDOK, 131, 42, 44, 14
PUSHBUTTON "<- &Remover", IDC_REMOVE_BTN,131,62,44,14
- LTEXT "&Botőes da barra de ferramentas:", -1,182,5,78,10
+ LTEXT "&Botões da barra de ferramentas:", -1,182,5,78,10
LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
-
STRINGTABLE DISCARDABLE
{
IDS_CLOSE "Fechar"
}
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
-
STRINGTABLE DISCARDABLE
{
IDM_TODAY "Hoje:"
IDM_GOTODAY "Ir para hoje"
}
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
-
STRINGTABLE DISCARDABLE
{
IDS_SEPARATOR "Separador"
}
-
-LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN
-
STRINGTABLE DISCARDABLE
{
HKY_NONE "Nenhum"
diff --git a/dll/win32/comctl32/comctl_Ro.rc b/dll/win32/comctl32/comctl_Ro.rc
index 0581d0dadbd..497f626ee5b 100644
--- a/dll/win32/comctl32/comctl_Ro.rc
+++ b/dll/win32/comctl32/comctl_Ro.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL
#pragma code_page(65001)
@@ -88,5 +90,3 @@ STRINGTABLE DISCARDABLE
{
HKY_NONE "Nimic"
}
-
-#pragma code_page(default)
diff --git a/dll/win32/comctl32/comctl_Ru.rc b/dll/win32/comctl32/comctl_Ru.rc
index 2bbb513a09c..9cba44d1b62 100644
--- a/dll/win32/comctl32/comctl_Ru.rc
+++ b/dll/win32/comctl32/comctl_Ru.rc
@@ -18,31 +18,36 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
+/* UTF-8 */
+#pragma code_page(65001)
+
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Ńâîéńňâŕ äë˙ %s"
+CAPTION "СвойŃтва для %s"
FONT 8, "MS Shell Dlg"
BEGIN
DEFPUSHBUTTON "OK", IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
- PUSHBUTTON "Îňěĺíŕ", IDCANCEL,58,122,50,14
- PUSHBUTTON "Ďđč&ěĺíčňü", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
- PUSHBUTTON "&Ńďđŕâęŕ", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
+ PUSHBUTTON "Отмена", IDCANCEL,58,122,50,14
+ PUSHBUTTON "При&менить", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
+ PUSHBUTTON "&Справка", IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END
IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
-CAPTION "Ěŕńňĺđ"
+CAPTION "МаŃтер"
FONT 8, "MS Shell Dlg"
BEGIN
- PUSHBUTTON "< &Íŕçŕä", IDC_BACK_BUTTON,71,138,50,14
- DEFPUSHBUTTON "&Äŕëĺĺ >", IDC_NEXT_BUTTON,121,138,50,14
- DEFPUSHBUTTON "Ăîňîâî", IDC_FINISH_BUTTON,121,138,50,14
- PUSHBUTTON "Îňěĺíŕ", IDCANCEL,178,138,50,14
- PUSHBUTTON "&Ńďđŕâęŕ", IDHELP,235,138,50,14,WS_GROUP
+ PUSHBUTTON "< &Назад", IDC_BACK_BUTTON,71,138,50,14
+ DEFPUSHBUTTON "&Далее >", IDC_NEXT_BUTTON,121,138,50,14
+ DEFPUSHBUTTON "Готово", IDC_FINISH_BUTTON,121,138,50,14
+ PUSHBUTTON "Отмена", IDCANCEL,178,138,50,14
+ PUSHBUTTON "&Справка", IDHELP,235,138,50,14,WS_GROUP
LTEXT "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
CONTROL "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
LTEXT "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
@@ -51,39 +56,39 @@ END
IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
-CAPTION "Íŕńňđîéęŕ ďŕíĺëč číńňđóěĺíňîâ"
+CAPTION "НаŃтройка панели инŃтрŃментов"
FONT 8, "MS Shell Dlg"
BEGIN
- DEFPUSHBUTTON "&Çŕęđűňü", IDCANCEL,308,6,44,14
- PUSHBUTTON "Ń&áđîńčňü", IDC_RESET_BTN,308,23,44,14
- PUSHBUTTON "&Ńďđŕâęŕ", IDC_HELP_BTN,308,40,44,14
- PUSHBUTTON "Ďĺđĺěĺńňčňü &ââĺđő", IDC_MOVEUP_BTN,308,74,44,14
- PUSHBUTTON "Ďĺđĺěĺńňčňü &âíčç", IDC_MOVEDN_BTN,308,91,44,14
- LTEXT "&Äîńňóďíűĺ ęíîďęč:", -1,4,5,84,10
+ DEFPUSHBUTTON "&Закрыть", IDCANCEL,308,6,44,14
+ PUSHBUTTON "С&броŃить", IDC_RESET_BTN,308,23,44,14
+ PUSHBUTTON "&Справка", IDC_HELP_BTN,308,40,44,14
+ PUSHBUTTON "ПеремеŃтить &вверх", IDC_MOVEUP_BTN,308,74,44,14
+ PUSHBUTTON "ПеремеŃтить &вниз", IDC_MOVEDN_BTN,308,91,44,14
+ LTEXT "&ДоŃŃ‚Ńпные кнопки:", -1,4,5,84,10
LISTBOX IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
- PUSHBUTTON "&Äîáŕâčňü ->", IDOK, 131, 42, 44, 14
- PUSHBUTTON "<- &Óäŕëčňü", IDC_REMOVE_BTN,131,62,44,14
- LTEXT "&Ęíîďęč ďŕíĺëč číńňđóěĺíňîâ:", -1,182,5,78,10
+ PUSHBUTTON "&Добавить ->", IDOK, 131, 42, 44, 14
+ PUSHBUTTON "<- &Удалить", IDC_REMOVE_BTN,131,62,44,14
+ LTEXT "&Кнопки панели инŃтрŃментов:", -1,182,5,78,10
LISTBOX IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END
STRINGTABLE DISCARDABLE
{
- IDS_CLOSE "Çŕęđűňü"
+ IDS_CLOSE "Закрыть"
}
STRINGTABLE DISCARDABLE
{
- IDM_TODAY "Ńĺăîäí˙:"
- IDM_GOTODAY "Ňĺęóůŕ˙ äŕňŕ"
+ IDM_TODAY "Сегодня:"
+ IDM_GOTODAY "ТекŃщая дата"
}
STRINGTABLE DISCARDABLE
{
- IDS_SEPARATOR "Đŕçäĺëčňĺëü"
+ IDS_SEPARATOR "Разделитель"
}
STRINGTABLE DISCARDABLE
{
- HKY_NONE "Íĺň"
+ HKY_NONE "Нет"
}
diff --git a/dll/win32/comctl32/comctl_Si.rc b/dll/win32/comctl32/comctl_Si.rc
index aa9a7b69975..cc1053f18f6 100644
--- a/dll/win32/comctl32/comctl_Si.rc
+++ b/dll/win32/comctl32/comctl_Si.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
#pragma code_page(65001)
LANGUAGE LANG_SLOVENIAN, SUBLANG_DEFAULT
@@ -87,5 +89,3 @@ STRINGTABLE DISCARDABLE
{
HKY_NONE "Brez"
}
-
-#pragma code_page(default)
diff --git a/dll/win32/comctl32/comctl_Sk.rc b/dll/win32/comctl32/comctl_Sk.rc
index fb5f65dcfa0..c543e376f30 100644
--- a/dll/win32/comctl32/comctl_Sk.rc
+++ b/dll/win32/comctl32/comctl_Sk.rc
@@ -17,6 +17,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
/* Slovak strings in CP1250 */
LANGUAGE LANG_SLOVAK, SUBLANG_DEFAULT
diff --git a/dll/win32/comctl32/comctl_Sv.rc b/dll/win32/comctl32/comctl_Sv.rc
index 2037d797c24..18bfefc6635 100644
--- a/dll/win32/comctl32/comctl_Sv.rc
+++ b/dll/win32/comctl32/comctl_Sv.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_SWEDISH, SUBLANG_NEUTRAL
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Th.rc b/dll/win32/comctl32/comctl_Th.rc
index 3195e1b9a55..ff1e1fa4feb 100644
--- a/dll/win32/comctl32/comctl_Th.rc
+++ b/dll/win32/comctl32/comctl_Th.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_THAI, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Tr.rc b/dll/win32/comctl32/comctl_Tr.rc
index c0f65127f9d..cdc89ca0533 100644
--- a/dll/win32/comctl32/comctl_Tr.rc
+++ b/dll/win32/comctl32/comctl_Tr.rc
@@ -16,6 +16,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_TURKISH, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Uk.rc b/dll/win32/comctl32/comctl_Uk.rc
index 95e502dd471..608697da80a 100644
--- a/dll/win32/comctl32/comctl_Uk.rc
+++ b/dll/win32/comctl32/comctl_Uk.rc
@@ -18,6 +18,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT
IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
diff --git a/dll/win32/comctl32/comctl_Zh.rc b/dll/win32/comctl32/comctl_Zh.rc
index b6c5692dea6..8919119cae9 100644
--- a/dll/win32/comctl32/comctl_Zh.rc
+++ b/dll/win32/comctl32/comctl_Zh.rc
@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#include "comctl32.h"
+
/* Chinese text is encoded in UTF-8 */
#pragma code_page(65001)
@@ -161,5 +163,3 @@ STRINGTABLE DISCARDABLE
{
HKY_NONE "無"
}
-
-#pragma code_page(default)
diff --git a/dll/win32/comctl32/commctrl.c b/dll/win32/comctl32/commctrl.c
index db0eade682b..eb0f6b5293e 100644
--- a/dll/win32/comctl32/commctrl.c
+++ b/dll/win32/comctl32/commctrl.c
@@ -784,7 +784,7 @@ CreateToolbarEx (HWND hwnd, DWORD style, UINT wID, INT nBitmaps,
if(hwndTB) {
TBADDBITMAP tbab;
- SendMessageW (hwndTB, TB_BUTTONSTRUCTSIZE, (WPARAM)uStructSize, 0);
+ SendMessageW (hwndTB, TB_BUTTONSTRUCTSIZE, uStructSize, 0);
/* set bitmap and button size */
/*If CreateToolbarEx receives 0, windows sets default values*/
@@ -811,12 +811,11 @@ CreateToolbarEx (HWND hwnd, DWORD style, UINT wID, INT nBitmaps,
tbab.hInst = hBMInst;
tbab.nID = wBMID;
- SendMessageW (hwndTB, TB_ADDBITMAP, (WPARAM)nBitmaps, (LPARAM)&tbab);
+ SendMessageW (hwndTB, TB_ADDBITMAP, nBitmaps, (LPARAM)&tbab);
}
/* add buttons */
if(iNumButtons > 0)
- SendMessageW (hwndTB, TB_ADDBUTTONSW,
- (WPARAM)iNumButtons, (LPARAM)lpButtons);
+ SendMessageW (hwndTB, TB_ADDBUTTONSW, iNumButtons, (LPARAM)lpButtons);
}
return hwndTB;
@@ -923,8 +922,7 @@ CreateMappedBitmap (HINSTANCE hInstance, INT_PTR idBitmap, UINT wFlags,
if (hbm) {
HDC hdcDst = CreateCompatibleDC (hdcScreen);
HBITMAP hbmOld = SelectObject (hdcDst, hbm);
- const BYTE *lpBits = (const BYTE *)(lpBitmap + 1);
- lpBits += nColorTableSize * sizeof(RGBQUAD);
+ const BYTE *lpBits = (const BYTE *)lpBitmap + nSize;
StretchDIBits (hdcDst, 0, 0, nWidth, nHeight, 0, 0, nWidth, nHeight,
lpBits, (LPBITMAPINFO)lpBitmapInfo, DIB_RGB_COLORS,
SRCCOPY);
@@ -1403,9 +1401,8 @@ COMCTL32_CreateToolTip(HWND hwndOwner)
nmttc.hdr.code = NM_TOOLTIPSCREATED;
nmttc.hwndToolTips = hwndToolTip;
- SendMessageW(GetParent(hwndTrueOwner), WM_NOTIFY,
- (WPARAM)GetWindowLongPtrW(hwndTrueOwner, GWLP_ID),
- (LPARAM)&nmttc);
+ SendMessageW(GetParent(hwndTrueOwner), WM_NOTIFY,
+ GetWindowLongPtrW(hwndTrueOwner, GWLP_ID), (LPARAM)&nmttc);
}
return hwndToolTip;
diff --git a/dll/win32/comctl32/datetime.c b/dll/win32/comctl32/datetime.c
index ae538a535e9..24189507d64 100644
--- a/dll/win32/comctl32/datetime.c
+++ b/dll/win32/comctl32/datetime.c
@@ -31,7 +31,6 @@
* TODO:
* -- DTS_APPCANPARSE
* -- DTS_SHORTDATECENTURYFORMAT
- * -- DTN_CLOSEUP
* -- DTN_FORMAT
* -- DTN_FORMATQUERY
* -- DTN_USERSTRING
@@ -88,6 +87,7 @@ typedef struct
/* in monthcal.c */
extern int MONTHCAL_MonthLength(int month, int year);
+extern int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace);
/* this list of defines is closely related to `allowedformatchars' defined
* in datetime.c; the high nibble indicates the `base type' of the format
@@ -125,10 +125,11 @@ extern int MONTHCAL_MonthLength(int month, int year);
#define DTHT_DATEFIELD 0xff /* for hit-testing */
-#define DTHT_NONE 0
-#define DTHT_CHECKBOX 0x200 /* these should end at '00' , to make */
-#define DTHT_MCPOPUP 0x300 /* & DTHT_DATEFIELD 0 when DATETIME_KeyDown */
-#define DTHT_GOTFOCUS 0x400 /* tests for date-fields */
+#define DTHT_NONE 0x1000
+#define DTHT_CHECKBOX 0x2000 /* these should end at '00' , to make */
+#define DTHT_MCPOPUP 0x3000 /* & DTHT_DATEFIELD 0 when DATETIME_KeyDown */
+#define DTHT_GOTFOCUS 0x4000 /* tests for date-fields */
+#define DTHT_NODATEMASK 0xf000 /* to mask check and drop down from others */
static BOOL DATETIME_SendSimpleNotify (const DATETIME_INFO *infoPtr, UINT code);
static BOOL DATETIME_SendDateTimeChangeNotify (const DATETIME_INFO *infoPtr);
@@ -138,43 +139,45 @@ static const int maxrepetition [] = {4,2,2,2,4,2,2,4,-1};
static DWORD
-DATETIME_GetSystemTime (const DATETIME_INFO *infoPtr, SYSTEMTIME *lprgSysTimeArray)
+DATETIME_GetSystemTime (const DATETIME_INFO *infoPtr, SYSTEMTIME *systime)
{
- if (!lprgSysTimeArray) return GDT_NONE;
+ if (!systime) return GDT_NONE;
if ((infoPtr->dwStyle & DTS_SHOWNONE) &&
(SendMessageW (infoPtr->hwndCheckbut, BM_GETCHECK, 0, 0) == BST_UNCHECKED))
return GDT_NONE;
- MONTHCAL_CopyTime (&infoPtr->date, lprgSysTimeArray);
+ *systime = infoPtr->date;
return GDT_VALID;
}
static BOOL
-DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *lprgSysTimeArray)
+DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *systime)
{
- if (!lprgSysTimeArray) return 0;
+ if (!systime) return 0;
TRACE("%04d/%02d/%02d %02d:%02d:%02d\n",
- lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay,
- lprgSysTimeArray->wHour, lprgSysTimeArray->wMinute, lprgSysTimeArray->wSecond);
+ systime->wYear, systime->wMonth, systime->wDay,
+ systime->wHour, systime->wMinute, systime->wSecond);
if (flag == GDT_VALID) {
- if (lprgSysTimeArray->wYear < 1601 || lprgSysTimeArray->wYear > 30827 ||
- lprgSysTimeArray->wMonth < 1 || lprgSysTimeArray->wMonth > 12 ||
- lprgSysTimeArray->wDayOfWeek > 6 ||
- lprgSysTimeArray->wDay < 1 || lprgSysTimeArray->wDay > 31 ||
- lprgSysTimeArray->wHour > 23 ||
- lprgSysTimeArray->wMinute > 59 ||
- lprgSysTimeArray->wSecond > 59 ||
- lprgSysTimeArray->wMilliseconds > 999
+ if (systime->wYear < 1601 || systime->wYear > 30827 ||
+ systime->wMonth < 1 || systime->wMonth > 12 ||
+ systime->wDay < 1 || systime->wDay > 31 ||
+ systime->wHour > 23 ||
+ systime->wMinute > 59 ||
+ systime->wSecond > 59 ||
+ systime->wMilliseconds > 999
)
- return 0;
+ return FALSE;
infoPtr->dateValid = TRUE;
- MONTHCAL_CopyTime (lprgSysTimeArray, &infoPtr->date);
+ infoPtr->date = *systime;
+ /* always store a valid day of week */
+ MONTHCAL_CalculateDayOfWeek(&infoPtr->date, TRUE);
+
SendMessageW (infoPtr->hMonthCal, MCM_SETCURSEL, 0, (LPARAM)(&infoPtr->date));
SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);
} else if ((infoPtr->dwStyle & DTS_SHOWNONE) && (flag == GDT_NONE)) {
@@ -182,7 +185,7 @@ DATETIME_SetSystemTime (DATETIME_INFO *infoPtr, DWORD flag, const SYSTEMTIME *lp
SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, BST_UNCHECKED, 0);
}
else
- return 0;
+ return FALSE;
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
return TRUE;
@@ -286,7 +289,7 @@ DATETIME_SetFormatW (DATETIME_INFO *infoPtr, LPCWSTR lpszFormat)
format_item = LOCALE_STIMEFORMAT;
else /* DTS_SHORTDATEFORMAT */
format_item = LOCALE_SSHORTDATE;
- GetLocaleInfoW( GetSystemDefaultLCID(), format_item, format_buf, sizeof(format_buf)/sizeof(format_buf[0]));
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, format_item, format_buf, sizeof(format_buf)/sizeof(format_buf[0]));
lpszFormat = format_buf;
}
@@ -407,12 +410,12 @@ DATETIME_ReturnTxt (const DATETIME_INFO *infoPtr, int count, LPWSTR result, int
wsprintfW (result, fmt__2dW, date.wMonth);
break;
case THREECHARMONTH:
- GetLocaleInfoW(GetSystemDefaultLCID(), LOCALE_SMONTHNAME1+date.wMonth -1,
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+date.wMonth -1,
buffer, sizeof(buffer)/sizeof(buffer[0]));
wsprintfW (result, fmt__3sW, buffer);
break;
case FULLMONTH:
- GetLocaleInfoW(GetSystemDefaultLCID(),LOCALE_SMONTHNAME1+date.wMonth -1,
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+date.wMonth -1,
result, resultSize);
break;
case ONELETTERAMPM:
@@ -444,19 +447,6 @@ DATETIME_ReturnTxt (const DATETIME_INFO *infoPtr, int count, LPWSTR result, int
TRACE ("arg%d=%x->[%s]\n", count, infoPtr->fieldspec[count], debugstr_w(result));
}
-/* Offsets of days in the week to the weekday of january 1 in a leap year. */
-static const int DayOfWeekTable[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
-
-/* returns the day in the week(0 == sunday, 6 == saturday) */
-/* day(1 == 1st, 2 == 2nd... etc), year is the year value */
-static int DATETIME_CalculateDayOfWeek(DWORD day, DWORD month, DWORD year)
-{
- year-=(month < 3);
-
- return((year + year/4 - year/100 + year/400 +
- DayOfWeekTable[month-1] + day ) % 7);
-}
-
static int wrap(int val, int delta, int minVal, int maxVal)
{
val += delta;
@@ -480,14 +470,14 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
case TWODIGITYEAR:
case FULLYEAR:
date->wYear = wrap(date->wYear, delta, 1752, 9999);
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(date->wDay,date->wMonth,date->wYear);
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
break;
case ONEDIGITMONTH:
case TWODIGITMONTH:
case THREECHARMONTH:
case FULLMONTH:
date->wMonth = wrap(date->wMonth, delta, 1, 12);
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(date->wDay,date->wMonth,date->wYear);
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
delta = 0;
/* fall through */
case ONEDIGITDAY:
@@ -495,7 +485,7 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
case THREECHARDAY:
case FULLDAY:
date->wDay = wrap(date->wDay, delta, 1, MONTHCAL_MonthLength(date->wMonth, date->wYear));
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(date->wDay,date->wMonth,date->wYear);
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
break;
case ONELETTERAMPM:
case TWOLETTERAMPM:
@@ -537,7 +527,7 @@ DATETIME_IncreaseField (DATETIME_INFO *infoPtr, int number, int delta)
static void
-DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *fieldWidthPtr)
+DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHORT *width)
{
/* fields are a fixed width, determined by the largest possible string */
/* presumably, these widths should be language dependent */
@@ -546,10 +536,6 @@ DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHO
static const WCHAR fld_d4W[] = { '2', '2', '2', '2', 0 };
static const WCHAR fld_am1[] = { 'A', 0 };
static const WCHAR fld_am2[] = { 'A', 'M', 0 };
- static const WCHAR fld_day[] = { 'W', 'e', 'd', 'n', 'e', 's', 'd', 'a', 'y', 0 };
- static const WCHAR fld_day3[] = { 'W', 'e', 'd', 0 };
- static const WCHAR fld_mon[] = { 'S', 'e', 'p', 't', 'e', 'm', 'b', 'e', 'r', 0 };
- static const WCHAR fld_mon3[] = { 'D', 'e', 'c', 0 };
int spec;
WCHAR buffer[80];
LPCWSTR bufptr;
@@ -596,18 +582,64 @@ DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHO
case FULLYEAR:
bufptr = fld_d4W;
break;
- case THREECHARDAY:
- bufptr = fld_day3;
- break;
- case FULLDAY:
- bufptr = fld_day;
- break;
case THREECHARMONTH:
- bufptr = fld_mon3;
- break;
case FULLMONTH:
- bufptr = fld_mon;
- break;
+ case THREECHARDAY:
+ case FULLDAY:
+ {
+ static const WCHAR fld_day[] = {'W','e','d','n','e','s','d','a','y',0};
+ static const WCHAR fld_abbrday[] = {'W','e','d',0};
+ static const WCHAR fld_mon[] = {'S','e','p','t','e','m','b','e','r',0};
+ static const WCHAR fld_abbrmon[] = {'D','e','c',0};
+
+ const WCHAR *fall;
+ LCTYPE lctype;
+ INT i, max_count;
+ LONG cx;
+
+ /* choose locale data type and fallback string */
+ switch (spec) {
+ case THREECHARDAY:
+ fall = fld_abbrday;
+ lctype = LOCALE_SABBREVDAYNAME1;
+ max_count = 7;
+ break;
+ case FULLDAY:
+ fall = fld_day;
+ lctype = LOCALE_SDAYNAME1;
+ max_count = 7;
+ break;
+ case THREECHARMONTH:
+ fall = fld_abbrmon;
+ lctype = LOCALE_SABBREVMONTHNAME1;
+ max_count = 12;
+ break;
+ default: /* FULLMONTH */
+ fall = fld_mon;
+ lctype = LOCALE_SMONTHNAME1;
+ max_count = 12;
+ break;
+ }
+
+ cx = 0;
+ for (i = 0; i < max_count; i++)
+ {
+ if(GetLocaleInfoW(LOCALE_USER_DEFAULT, lctype + i,
+ buffer, lstrlenW(buffer)))
+ {
+ GetTextExtentPoint32W(hdc, buffer, lstrlenW(buffer), &size);
+ if (size.cx > cx) cx = size.cx;
+ }
+ else /* locale independent fallback on failure */
+ {
+ GetTextExtentPoint32W(hdc, fall, lstrlenW(fall), &size);
+ cx = size.cx;
+ break;
+ }
+ }
+ *width = cx;
+ return;
+ }
case ONELETTERAMPM:
bufptr = fld_am1;
break;
@@ -620,25 +652,21 @@ DATETIME_ReturnFieldWidth (const DATETIME_INFO *infoPtr, HDC hdc, int count, SHO
}
}
GetTextExtentPoint32W (hdc, bufptr, strlenW(bufptr), &size);
- *fieldWidthPtr = size.cx;
+ *width = size.cx;
}
static void
DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc)
{
- int i,prevright;
- RECT *field;
- RECT *rcDraw = &infoPtr->rcDraw;
- RECT *calbutton = &infoPtr->calbutton;
- RECT *checkbox = &infoPtr->checkbox;
- SIZE size;
- COLORREF oldTextColor;
- SHORT fieldWidth = 0;
-
- /* draw control edge */
TRACE("\n");
if (infoPtr->dateValid) {
+ int i, prevright;
+ RECT *field;
+ RECT *rcDraw = &infoPtr->rcDraw;
+ SIZE size;
+ COLORREF oldTextColor;
+ SHORT fieldWidth = 0;
HFONT oldFont = SelectObject (hdc, infoPtr->hFont);
INT oldBkMode = SetBkMode (hdc, TRANSPARENT);
WCHAR txt[80];
@@ -647,25 +675,36 @@ DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc)
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);
rcDraw->bottom = size.cy + 2;
- prevright = checkbox->right = ((infoPtr->dwStyle & DTS_SHOWNONE) ? 18 : 2);
+ prevright = infoPtr->checkbox.right = ((infoPtr->dwStyle & DTS_SHOWNONE) ? 18 : 2);
for (i = 0; i < infoPtr->nrFields; i++) {
DATETIME_ReturnTxt (infoPtr, i, txt, sizeof(txt)/sizeof(txt[0]));
GetTextExtentPoint32W (hdc, txt, strlenW(txt), &size);
DATETIME_ReturnFieldWidth (infoPtr, hdc, i, &fieldWidth);
field = &infoPtr->fieldRect[i];
- field->left = prevright;
- field->right = prevright + fieldWidth;
- field->top = rcDraw->top;
+ field->left = prevright;
+ field->right = prevright + fieldWidth;
+ field->top = rcDraw->top;
field->bottom = rcDraw->bottom;
prevright = field->right;
if (infoPtr->dwStyle & WS_DISABLED)
oldTextColor = SetTextColor (hdc, comctl32_color.clrGrayText);
else if ((infoPtr->haveFocus) && (i == infoPtr->select)) {
- /* fill if focussed */
+ RECT selection;
+
+ /* fill if focused */
HBRUSH hbr = CreateSolidBrush (comctl32_color.clrActiveCaption);
- FillRect(hdc, field, hbr);
+
+ selection.left = 0;
+ selection.top = 0;
+ selection.right = size.cx;
+ selection.bottom = size.cy;
+ /* center rectangle */
+ OffsetRect(&selection, (field->right + field->left - size.cx)/2,
+ (field->bottom - size.cy)/2);
+
+ FillRect(hdc, &selection, hbr);
DeleteObject (hbr);
oldTextColor = SetTextColor (hdc, comctl32_color.clrWindow);
}
@@ -673,7 +712,7 @@ DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc)
oldTextColor = SetTextColor (hdc, comctl32_color.clrWindowText);
/* draw the date text using the colour set above */
- DrawTextW (hdc, txt, strlenW(txt), field, DT_RIGHT | DT_VCENTER | DT_SINGLELINE);
+ DrawTextW (hdc, txt, strlenW(txt), field, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
SetTextColor (hdc, oldTextColor);
}
SetBkMode (hdc, oldBkMode);
@@ -681,7 +720,7 @@ DATETIME_Refresh (DATETIME_INFO *infoPtr, HDC hdc)
}
if (!(infoPtr->dwStyle & DTS_UPDOWN)) {
- DrawFrameControl(hdc, calbutton, DFC_SCROLL,
+ DrawFrameControl(hdc, &infoPtr->calbutton, DFC_SCROLL,
DFCS_SCROLLDOWN | (infoPtr->bCalDepressed ? DFCS_PUSHED : 0) |
(infoPtr->dwStyle & WS_DISABLED ? DFCS_INACTIVE : 0) );
}
@@ -698,30 +737,54 @@ DATETIME_HitTest (const DATETIME_INFO *infoPtr, POINT pt)
if (PtInRect (&infoPtr->calbutton, pt)) return DTHT_MCPOPUP;
if (PtInRect (&infoPtr->checkbox, pt)) return DTHT_CHECKBOX;
- for (i=0; i < infoPtr->nrFields; i++) {
+ for (i = 0; i < infoPtr->nrFields; i++) {
if (PtInRect (&infoPtr->fieldRect[i], pt)) return i;
}
return DTHT_NONE;
}
+/* Returns index of a closest date field from given counting to left
+ or -1 if there's no such fields at left */
+static int DATETIME_GetPrevDateField(const DATETIME_INFO *infoPtr, int i)
+{
+ for(--i; i >= 0; i--)
+ {
+ if (infoPtr->fieldspec[i] & DTHT_DATEFIELD) return i;
+ }
+ return -1;
+}
static LRESULT
DATETIME_LButtonDown (DATETIME_INFO *infoPtr, INT x, INT y)
{
POINT pt;
- int old, new;
+ int new;
pt.x = x;
pt.y = y;
- old = infoPtr->select;
new = DATETIME_HitTest (infoPtr, pt);
- /* FIXME: might be conditions where we don't want to update infoPtr->select */
- infoPtr->select = new;
-
SetFocus(infoPtr->hwndSelf);
+ if (!(new & DTHT_NODATEMASK) || (new == DTHT_NONE))
+ {
+ if (new == DTHT_NONE)
+ new = infoPtr->nrFields - 1;
+ else
+ {
+ /* hitting string part moves selection to next date field to left */
+ if (infoPtr->fieldspec[new] & DT_STRING)
+ {
+ new = DATETIME_GetPrevDateField(infoPtr, new);
+ if (new == -1) return 0;
+ }
+ /* never select full day of week */
+ if (infoPtr->fieldspec[new] == FULLDAY) return 0;
+ }
+ }
+ infoPtr->select = new;
+
if (infoPtr->select == DTHT_MCPOPUP) {
RECT rcMonthCal;
SendMessageW(infoPtr->hMonthCal, MCM_GETMINREQRECT, 0, (LPARAM)&rcMonthCal);
@@ -746,20 +809,23 @@ DATETIME_LButtonDown (DATETIME_INFO *infoPtr, INT x, INT y)
if(IsWindowVisible(infoPtr->hMonthCal)) {
ShowWindow(infoPtr->hMonthCal, SW_HIDE);
+ infoPtr->bDropdownEnabled = FALSE;
+ DATETIME_SendSimpleNotify (infoPtr, DTN_CLOSEUP);
} else {
const SYSTEMTIME *lprgSysTimeArray = &infoPtr->date;
TRACE("update calendar %04d/%02d/%02d\n",
lprgSysTimeArray->wYear, lprgSysTimeArray->wMonth, lprgSysTimeArray->wDay);
SendMessageW(infoPtr->hMonthCal, MCM_SETCURSEL, 0, (LPARAM)(&infoPtr->date));
- if (infoPtr->bDropdownEnabled)
+ if (infoPtr->bDropdownEnabled) {
ShowWindow(infoPtr->hMonthCal, SW_SHOW);
+ DATETIME_SendSimpleNotify (infoPtr, DTN_DROPDOWN);
+ }
infoPtr->bDropdownEnabled = TRUE;
}
TRACE ("dt:%p mc:%p mc parent:%p, desktop:%p\n",
infoPtr->hwndSelf, infoPtr->hMonthCal, infoPtr->hwndNotify, GetDesktopWindow ());
- DATETIME_SendSimpleNotify (infoPtr, DTN_DROPDOWN);
}
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
@@ -865,7 +931,7 @@ DATETIME_EraseBackground (const DATETIME_INFO *infoPtr, HDC hdc)
static LRESULT
-DATETIME_Notify (DATETIME_INFO *infoPtr, LPNMHDR lpnmh)
+DATETIME_Notify (DATETIME_INFO *infoPtr, const NMHDR *lpnmh)
{
TRACE ("Got notification %x from %p\n", lpnmh->code, lpnmh->hwndFrom);
TRACE ("info: %p %p %p\n", infoPtr->hwndSelf, infoPtr->hMonthCal, infoPtr->hUpdown);
@@ -879,9 +945,10 @@ DATETIME_Notify (DATETIME_INFO *infoPtr, LPNMHDR lpnmh)
SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, BST_CHECKED, 0);
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
DATETIME_SendDateTimeChangeNotify (infoPtr);
+ DATETIME_SendSimpleNotify(infoPtr, DTN_CLOSEUP);
}
if ((lpnmh->hwndFrom == infoPtr->hUpdown) && (lpnmh->code == UDN_DELTAPOS)) {
- LPNMUPDOWN lpnmud = (LPNMUPDOWN)lpnmh;
+ const NM_UPDOWN *lpnmud = (const NM_UPDOWN*)lpnmh;
TRACE("Delta pos %d\n", lpnmud->iDelta);
infoPtr->pendingUpdown = lpnmud->iDelta;
}
@@ -964,15 +1031,14 @@ DATETIME_Char (DATETIME_INFO *infoPtr, WPARAM vkCode)
case TWODIGITYEAR:
date->wYear = date->wYear - (date->wYear%100) +
(date->wYear%10)*10 + num;
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
- date->wDay,date->wMonth,date->wYear);
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
DATETIME_SendDateTimeChangeNotify (infoPtr);
break;
case INVALIDFULLYEAR:
case FULLYEAR:
- date->wYear = (date->wYear%1000)*10 + num;
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
- date->wDay,date->wMonth,date->wYear);
+ /* reset current year initialy */
+ date->wYear = ((date->wYear/1000) ? 0 : 1)*(date->wYear%1000)*10 + num;
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
DATETIME_SendDateTimeChangeNotify (infoPtr);
break;
case ONEDIGITMONTH:
@@ -981,8 +1047,7 @@ DATETIME_Char (DATETIME_INFO *infoPtr, WPARAM vkCode)
date->wMonth = num;
else
date->wMonth = (date->wMonth%10)*10+num;
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
- date->wDay,date->wMonth,date->wYear);
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
DATETIME_SendDateTimeChangeNotify (infoPtr);
break;
case ONEDIGITDAY:
@@ -992,8 +1057,7 @@ DATETIME_Char (DATETIME_INFO *infoPtr, WPARAM vkCode)
date->wDay = num;
else
date->wDay = newDays;
- date->wDayOfWeek = DATETIME_CalculateDayOfWeek(
- date->wDay,date->wMonth,date->wYear);
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
DATETIME_SendDateTimeChangeNotify (infoPtr);
break;
case ONEDIGIT12HOUR:
@@ -1126,9 +1190,9 @@ DATETIME_SendDateTimeChangeNotify (const DATETIME_INFO *infoPtr)
dtdtc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
dtdtc.nmhdr.code = DTN_DATETIMECHANGE;
- dtdtc.dwFlags = (infoPtr->dwStyle & DTS_SHOWNONE) ? GDT_NONE : GDT_VALID;
+ dtdtc.dwFlags = infoPtr->dateValid ? GDT_VALID : GDT_NONE;
- MONTHCAL_CopyTime (&infoPtr->date, &dtdtc.st);
+ dtdtc.st = infoPtr->date;
return (BOOL) SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,
dtdtc.nmhdr.idFrom, (LPARAM)&dtdtc);
}
@@ -1186,12 +1250,27 @@ DATETIME_Size (DATETIME_INFO *infoPtr, INT width, INT height)
return 0;
}
+static LRESULT
+DATETIME_StyleChanging(DATETIME_INFO *infoPtr, WPARAM wStyleType, STYLESTRUCT *lpss)
+{
+ TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
+ wStyleType, lpss->styleOld, lpss->styleNew);
+
+ /* block DTS_SHOWNONE change */
+ if ((lpss->styleNew ^ lpss->styleOld) & DTS_SHOWNONE)
+ {
+ if (lpss->styleOld & DTS_SHOWNONE)
+ lpss->styleNew |= DTS_SHOWNONE;
+ else
+ lpss->styleNew &= ~DTS_SHOWNONE;
+ }
+
+ return 0;
+}
static LRESULT
DATETIME_StyleChanged(DATETIME_INFO *infoPtr, WPARAM wStyleType, const STYLESTRUCT *lpss)
{
- static const WCHAR buttonW[] = { 'b', 'u', 't', 't', 'o', 'n', 0 };
-
TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
wStyleType, lpss->styleOld, lpss->styleNew);
@@ -1200,7 +1279,7 @@ DATETIME_StyleChanged(DATETIME_INFO *infoPtr, WPARAM wStyleType, const STYLESTRU
infoPtr->dwStyle = lpss->styleNew;
if ( !(lpss->styleOld & DTS_SHOWNONE) && (lpss->styleNew & DTS_SHOWNONE) ) {
- infoPtr->hwndCheckbut = CreateWindowExW (0, buttonW, 0, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
+ infoPtr->hwndCheckbut = CreateWindowExW (0, WC_BUTTONW, 0, WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX,
2, 2, 13, 13, infoPtr->hwndSelf, 0,
(HINSTANCE)GetWindowLongPtrW (infoPtr->hwndSelf, GWLP_HINSTANCE), 0);
SendMessageW (infoPtr->hwndCheckbut, BM_SETCHECK, 1, 0);
@@ -1235,7 +1314,6 @@ DATETIME_SetFont (DATETIME_INFO *infoPtr, HFONT font, BOOL repaint)
static LRESULT
DATETIME_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
{
- static const WCHAR SysMonthCal32W[] = { 'S', 'y', 's', 'M', 'o', 'n', 't', 'h', 'C', 'a', 'l', '3', '2', 0 };
DATETIME_INFO *infoPtr = Alloc (sizeof(DATETIME_INFO));
STYLESTRUCT ss = { 0, lpcs->style };
@@ -1256,7 +1334,7 @@ DATETIME_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
DATETIME_SetFormatW (infoPtr, 0);
/* create the monthcal control */
- infoPtr->hMonthCal = CreateWindowExW (0, SysMonthCal32W, 0, WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
+ infoPtr->hMonthCal = CreateWindowExW (0, MONTHCAL_CLASSW, 0, WS_BORDER | WS_POPUP | WS_CLIPSIBLINGS,
0, 0, 0, 0, infoPtr->hwndSelf, 0, 0, 0);
/* initialize info structure */
@@ -1281,11 +1359,34 @@ DATETIME_Destroy (DATETIME_INFO *infoPtr)
if (infoPtr->hMonthCal)
DestroyWindow(infoPtr->hMonthCal);
SetWindowLongPtrW( infoPtr->hwndSelf, 0, 0 ); /* clear infoPtr */
+ Free (infoPtr->buflen);
+ Free (infoPtr->fieldRect);
+ Free (infoPtr->fieldspec);
Free (infoPtr);
return 0;
}
+static INT
+DATETIME_GetText (DATETIME_INFO *infoPtr, INT count, LPWSTR dst)
+{
+ WCHAR buf[80];
+ int i;
+
+ if (!dst || (count <= 0)) return 0;
+
+ dst[0] = 0;
+ for (i = 0; i < infoPtr->nrFields; i++)
+ {
+ DATETIME_ReturnTxt(infoPtr, i, buf, sizeof(buf)/sizeof(buf[0]));
+ if ((strlenW(dst) + strlenW(buf)) < count)
+ strcatW(dst, buf);
+ else break;
+ }
+ return strlenW(dst);
+}
+
+
static LRESULT WINAPI
DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@@ -1385,6 +1486,9 @@ DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_COMMAND:
return DATETIME_Command (infoPtr, wParam, lParam);
+ case WM_STYLECHANGING:
+ return DATETIME_StyleChanging(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+
case WM_STYLECHANGED:
return DATETIME_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
@@ -1394,6 +1498,12 @@ DATETIME_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_GETFONT:
return (LRESULT) infoPtr->hFont;
+ case WM_GETTEXT:
+ return (LRESULT) DATETIME_GetText(infoPtr, wParam, (LPWSTR)lParam);
+
+ case WM_SETTEXT:
+ return CB_ERR;
+
default:
if ((uMsg >= WM_USER) && (uMsg < WM_APP) && !COMCTL32_IsReflectedMessage(uMsg))
ERR("unknown msg %04x wp=%08lx lp=%08lx\n",
diff --git a/dll/win32/comctl32/dpa.c b/dll/win32/comctl32/dpa.c
index e3c03c88c8f..96823442864 100644
--- a/dll/win32/comctl32/dpa.c
+++ b/dll/win32/comctl32/dpa.c
@@ -426,12 +426,27 @@ BOOL WINAPI DPA_Destroy (const HDPA hdpa)
*/
BOOL WINAPI DPA_Grow (HDPA hdpa, INT nGrow)
{
+ INT items;
TRACE("(%p %d)\n", hdpa, nGrow);
if (!hdpa)
return FALSE;
- hdpa->nGrow = max(8, nGrow);
+ nGrow = max( 8, nGrow );
+ items = nGrow * (((hdpa->nMaxCount - 1) / nGrow) + 1);
+ if (items > hdpa->nMaxCount)
+ {
+ void *ptr;
+
+ if (hdpa->ptrs)
+ ptr = HeapReAlloc( hdpa->hHeap, HEAP_ZERO_MEMORY, hdpa->ptrs, items * sizeof(LPVOID) );
+ else
+ ptr = HeapAlloc( hdpa->hHeap, HEAP_ZERO_MEMORY, items * sizeof(LPVOID) );
+ if (!ptr) return FALSE;
+ hdpa->nMaxCount = items;
+ hdpa->ptrs = ptr;
+ }
+ hdpa->nGrow = nGrow;
return TRUE;
}
diff --git a/dll/win32/comctl32/draglist.c b/dll/win32/comctl32/draglist.c
index 9ecade558c1..2097edb42fd 100644
--- a/dll/win32/comctl32/draglist.c
+++ b/dll/win32/comctl32/draglist.c
@@ -334,7 +334,7 @@ INT WINAPI LBItemFromPt (HWND hwndLB, POINT pt, BOOL bAutoScroll)
dwLastScrollTime = dwScrollTime;
- SendMessageW (hwndLB, LB_SETTOPINDEX, (WPARAM)nIndex, 0);
+ SendMessageW (hwndLB, LB_SETTOPINDEX, nIndex, 0);
}
return -1;
diff --git a/dll/win32/comctl32/header.c b/dll/win32/comctl32/header.c
index d84965c21d5..d916c7297d5 100644
--- a/dll/win32/comctl32/header.c
+++ b/dll/win32/comctl32/header.c
@@ -374,8 +374,7 @@ HEADER_DrawItem (HEADER_INFO *infoPtr, HDC hdc, INT iItem, BOOL bHotTrack, LRESU
dis.rcItem = phdi->rect;
dis.itemData = phdi->lParam;
oldBkMode = SetBkMode(hdc, TRANSPARENT);
- SendMessageW (infoPtr->hwndNotify, WM_DRAWITEM,
- (WPARAM)dis.CtlID, (LPARAM)&dis);
+ SendMessageW (infoPtr->hwndNotify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
if (oldBkMode != TRANSPARENT)
SetBkMode(hdc, oldBkMode);
}
@@ -1214,20 +1213,64 @@ HEADER_GetOrderArray(const HEADER_INFO *infoPtr, INT size, LPINT order)
return TRUE;
}
+/* Returns index of first duplicate 'value' from [0,to) range,
+ or -1 if there isn't any */
+static INT has_duplicate(INT *array, INT to, INT value)
+{
+ INT i;
+ for(i = 0; i < to; i++)
+ if (array[i] == value) return i;
+ return -1;
+}
+
+/* returns next available value from [0,max] not to duplicate in [0,to) */
+static INT get_nextvalue(INT *array, INT to, INT max)
+{
+ INT i;
+ for(i = 0; i < max; i++)
+ if (has_duplicate(array, to, i) == -1) return i;
+ return 0;
+}
+
static LRESULT
HEADER_SetOrderArray(HEADER_INFO *infoPtr, INT size, const INT *order)
{
- INT i;
HEADER_ITEM *lpItem;
+ INT i;
- if ((UINT)size uNumItem)
+ if ((UINT)size != infoPtr->uNumItem)
return FALSE;
- memcpy(infoPtr->order, order, infoPtr->uNumItem * sizeof(INT));
+
for (i=0; iitems[*order++];
- lpItem->iOrder=i;
- }
+ {
+ if (order[i] >= size || order[i] < 0)
+ /* on invalid index get next available */
+ /* FIXME: if i==0 array item is out of range behaviour is
+ different, see tests */
+ infoPtr->order[i] = get_nextvalue(infoPtr->order, i, size);
+ else
+ {
+ INT j, dup;
+
+ infoPtr->order[i] = order[i];
+ j = i;
+ /* remove duplicates */
+ while ((dup = has_duplicate(infoPtr->order, j, order[j])) != -1)
+ {
+ INT next;
+
+ next = get_nextvalue(infoPtr->order, j, size);
+ infoPtr->order[dup] = next;
+ j--;
+ }
+ }
+ }
+ /* sync with item data */
+ for (i=0; iitems[infoPtr->order[i]];
+ lpItem->iOrder = i;
+ }
HEADER_SetItemBounds(infoPtr);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return TRUE;
@@ -1704,7 +1747,7 @@ HEADER_NotifyFormat (HEADER_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
case NF_REQUERY:
infoPtr->nNotifyFormat =
SendMessageW ((HWND)wParam, WM_NOTIFYFORMAT,
- (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
+ (WPARAM)infoPtr->hwndSelf, NF_QUERY);
return infoPtr->nNotifyFormat;
}
diff --git a/dll/win32/comctl32/idb_hist_large.bmp b/dll/win32/comctl32/idb_hist_large.bmp
index 20596fac20a..b7818fbafb2 100644
Binary files a/dll/win32/comctl32/idb_hist_large.bmp and b/dll/win32/comctl32/idb_hist_large.bmp differ
diff --git a/dll/win32/comctl32/idb_hist_small.bmp b/dll/win32/comctl32/idb_hist_small.bmp
index 3cc2ab4e51a..c735f54377f 100644
Binary files a/dll/win32/comctl32/idb_hist_small.bmp and b/dll/win32/comctl32/idb_hist_small.bmp differ
diff --git a/dll/win32/comctl32/idb_std_large.bmp b/dll/win32/comctl32/idb_std_large.bmp
index 4f0e09e7e2e..7e19185c929 100644
Binary files a/dll/win32/comctl32/idb_std_large.bmp and b/dll/win32/comctl32/idb_std_large.bmp differ
diff --git a/dll/win32/comctl32/idb_std_small.bmp b/dll/win32/comctl32/idb_std_small.bmp
index 8318e447fe2..7db2f3ca805 100644
Binary files a/dll/win32/comctl32/idb_std_small.bmp and b/dll/win32/comctl32/idb_std_small.bmp differ
diff --git a/dll/win32/comctl32/idb_view_large.bmp b/dll/win32/comctl32/idb_view_large.bmp
index 6331b5eb691..22e4d1d8b8b 100644
Binary files a/dll/win32/comctl32/idb_view_large.bmp and b/dll/win32/comctl32/idb_view_large.bmp differ
diff --git a/dll/win32/comctl32/idb_view_small.bmp b/dll/win32/comctl32/idb_view_small.bmp
index d1632f207b4..6ba3d831637 100644
Binary files a/dll/win32/comctl32/idb_view_small.bmp and b/dll/win32/comctl32/idb_view_small.bmp differ
diff --git a/dll/win32/comctl32/imagelist.c b/dll/win32/comctl32/imagelist.c
index a2bc10a80e5..11ff27fe8ff 100644
--- a/dll/win32/comctl32/imagelist.c
+++ b/dll/win32/comctl32/imagelist.c
@@ -33,7 +33,7 @@
*
* TODO:
* - Add support for ILD_PRESERVEALPHA, ILD_SCALE, ILD_DPISCALE
- * - Add support for ILS_GLOW, ILS_SHADOW, ILS_SATURATE, ILS_ALPHA
+ * - Add support for ILS_GLOW, ILS_SHADOW, ILS_SATURATE
* - Thread-safe locking
*/
@@ -51,6 +51,7 @@
#include "winuser.h"
#include "commctrl.h"
#include "comctl32.h"
+#include "commoncontrols.h"
#include "imagelist.h"
#include "wine/debug.h"
@@ -78,12 +79,9 @@ typedef struct
static INTERNALDRAG InternalDrag = { 0, 0, 0, 0, 0, 0, FALSE, 0 };
-static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count, UINT width);
-
-static inline BOOL is_valid(HIMAGELIST himl)
-{
- return himl && himl->magic == IMAGELIST_MAGIC;
-}
+static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count);
+static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv);
+static inline BOOL is_valid(HIMAGELIST himl);
/*
* An imagelist with N images is tiled like this:
@@ -109,9 +107,9 @@ static inline void imagelist_point_from_index( HIMAGELIST himl, UINT index, LPPO
pt->y = (index/TILE_COUNT) * himl->cy;
}
-static inline void imagelist_get_bitmap_size( HIMAGELIST himl, UINT count, UINT cx, SIZE *sz )
+static inline void imagelist_get_bitmap_size( HIMAGELIST himl, UINT count, SIZE *sz )
{
- sz->cx = cx * TILE_COUNT;
+ sz->cx = himl->cx * TILE_COUNT;
sz->cy = imagelist_height( count ) * himl->cy;
}
@@ -140,6 +138,109 @@ static inline void imagelist_copy_images( HIMAGELIST himl, HDC hdcSrc, HDC hdcDe
}
}
+/* add images with an alpha channel when the image list is 32 bpp */
+static BOOL add_with_alpha( HIMAGELIST himl, HDC hdc, int pos, int count,
+ int width, int height, HBITMAP hbmImage, HBITMAP hbmMask )
+{
+ BOOL ret = FALSE;
+ HDC hdcMask = 0;
+ BITMAP bm;
+ BITMAPINFO *info, *mask_info = NULL;
+ DWORD *bits = NULL;
+ BYTE *mask_bits = NULL;
+ int i, j, n;
+ POINT pt;
+ DWORD mask_width;
+
+ if (!GetObjectW( hbmImage, sizeof(bm), &bm )) return FALSE;
+
+ /* if neither the imagelist nor the source bitmap can have an alpha channel, bail out now */
+ if (himl->uBitsPixel != 32 && bm.bmBitsPixel != 32) return FALSE;
+
+ SelectObject( hdc, hbmImage );
+ mask_width = (bm.bmWidth + 31) / 32 * 4;
+
+ if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
+ info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ info->bmiHeader.biWidth = bm.bmWidth;
+ info->bmiHeader.biHeight = -height;
+ info->bmiHeader.biPlanes = 1;
+ info->bmiHeader.biBitCount = 32;
+ info->bmiHeader.biCompression = BI_RGB;
+ info->bmiHeader.biSizeImage = bm.bmWidth * height * 4;
+ info->bmiHeader.biXPelsPerMeter = 0;
+ info->bmiHeader.biYPelsPerMeter = 0;
+ info->bmiHeader.biClrUsed = 0;
+ info->bmiHeader.biClrImportant = 0;
+ if (!(bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto done;
+ if (!GetDIBits( hdc, hbmImage, 0, height, bits, info, DIB_RGB_COLORS )) goto done;
+
+ if (hbmMask)
+ {
+ if (!(mask_info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[2] ))))
+ goto done;
+ mask_info->bmiHeader = info->bmiHeader;
+ mask_info->bmiHeader.biBitCount = 1;
+ mask_info->bmiHeader.biSizeImage = mask_width * height;
+ if (!(mask_bits = HeapAlloc( GetProcessHeap(), 0, info->bmiHeader.biSizeImage ))) goto done;
+ if (!GetDIBits( hdc, hbmMask, 0, height, mask_bits, mask_info, DIB_RGB_COLORS )) goto done;
+ hdcMask = CreateCompatibleDC( 0 );
+ SelectObject( hdcMask, hbmMask );
+ }
+
+ for (n = 0; n < count; n++)
+ {
+ int has_alpha = 0;
+
+ imagelist_point_from_index( himl, pos + n, &pt );
+
+ /* check if bitmap has an alpha channel */
+ for (i = 0; i < height && !has_alpha; i++)
+ for (j = n * width; j < (n + 1) * width; j++)
+ if ((has_alpha = ((bits[i * bm.bmWidth + j] & 0xff000000) != 0))) break;
+
+ if (!has_alpha) /* generate alpha channel from the mask */
+ {
+ for (i = 0; i < height; i++)
+ for (j = n * width; j < (n + 1) * width; j++)
+ if (!mask_bits || !((mask_bits[i * mask_width + j / 8] << (j % 8)) & 0x80))
+ bits[i * bm.bmWidth + j] |= 0xff000000;
+ else
+ bits[i * bm.bmWidth + j] = 0;
+ if (hdcMask) StretchBlt( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
+ hdcMask, n * width, 0, width, height, SRCCOPY );
+ }
+ else
+ {
+ if (himl->has_alpha) himl->has_alpha[pos + n] = 1;
+
+ if (mask_info && himl->hbmMask) /* generate the mask from the alpha channel */
+ {
+ for (i = 0; i < height; i++)
+ for (j = n * width; j < (n + 1) * width; j++)
+ if ((bits[i * bm.bmWidth + j] >> 24) > 25) /* more than 10% alpha */
+ mask_bits[i * mask_width + j / 8] &= ~(0x80 >> (j % 8));
+ else
+ mask_bits[i * mask_width + j / 8] |= 0x80 >> (j % 8);
+ StretchDIBits( himl->hdcMask, pt.x, pt.y, himl->cx, himl->cy,
+ n * width, 0, width, height, mask_bits, mask_info, DIB_RGB_COLORS, SRCCOPY );
+ }
+ }
+ StretchDIBits( himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
+ n * width, 0, width, height, bits, info, DIB_RGB_COLORS, SRCCOPY );
+
+ }
+ ret = TRUE;
+
+done:
+ if (hdcMask) DeleteDC( hdcMask );
+ HeapFree( GetProcessHeap(), 0, info );
+ HeapFree( GetProcessHeap(), 0, mask_info );
+ HeapFree( GetProcessHeap(), 0, bits );
+ HeapFree( GetProcessHeap(), 0, mask_bits );
+ return ret;
+}
+
/*************************************************************************
* IMAGELIST_InternalExpandBitmaps [Internal]
*
@@ -156,28 +257,29 @@ static inline void imagelist_copy_images( HIMAGELIST himl, HDC hdcSrc, HDC hdcDe
* This function CANNOT be used to reduce the number of images.
*/
static void
-IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cy)
+IMAGELIST_InternalExpandBitmaps(HIMAGELIST himl, INT nImageCount)
{
HDC hdcBitmap;
HBITMAP hbmNewBitmap, hbmNull;
INT nNewCount;
SIZE sz;
- if ((himl->cCurImage + nImageCount <= himl->cMaxImage)
- && (himl->cy >= cy))
+ TRACE("%p has %d allocated %d images\n", himl, himl->cCurImage, himl->cMaxImage);
+
+ if (himl->cCurImage + nImageCount <= himl->cMaxImage)
return;
- nNewCount = himl->cCurImage + nImageCount + himl->cGrow;
+ nNewCount = himl->cCurImage + max(nImageCount, himl->cGrow) + 1;
- imagelist_get_bitmap_size(himl, nNewCount, himl->cx, &sz);
+ imagelist_get_bitmap_size(himl, nNewCount, &sz);
- TRACE("Create expanded bitmaps : himl=%p x=%d y=%d count=%d\n", himl, sz.cx, cy, nNewCount);
+ TRACE("Create expanded bitmaps : himl=%p x=%d y=%d count=%d\n", himl, sz.cx, sz.cy, nNewCount);
hdcBitmap = CreateCompatibleDC (0);
- hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount, himl->cx);
+ hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount);
if (hbmNewBitmap == 0)
- ERR("creating new image bitmap (x=%d y=%d)!\n", sz.cx, cy);
+ ERR("creating new image bitmap (x=%d y=%d)!\n", sz.cx, sz.cy);
if (himl->cCurImage)
{
@@ -209,6 +311,17 @@ IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cy)
himl->hbmMask = hbmNewBitmap;
}
+ if (himl->has_alpha)
+ {
+ char *new_alpha = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, himl->has_alpha, nNewCount );
+ if (new_alpha) himl->has_alpha = new_alpha;
+ else
+ {
+ HeapFree( GetProcessHeap(), 0, himl->has_alpha );
+ himl->has_alpha = NULL;
+ }
+ }
+
himl->cMaxImage = nNewCount;
DeleteDC (hdcBitmap);
@@ -233,10 +346,9 @@ IMAGELIST_InternalExpandBitmaps (HIMAGELIST himl, INT nImageCount, INT cy)
INT WINAPI
ImageList_Add (HIMAGELIST himl, HBITMAP hbmImage, HBITMAP hbmMask)
{
- HDC hdcBitmap, hdcTemp;
+ HDC hdcBitmap, hdcTemp = 0;
INT nFirstIndex, nImageCount, i;
BITMAP bmp;
- HBITMAP hOldBitmap, hOldBitmapTemp;
POINT pt;
TRACE("himl=%p hbmimage=%p hbmmask=%p\n", himl, hbmImage, hbmMask);
@@ -246,13 +358,28 @@ ImageList_Add (HIMAGELIST himl, HBITMAP hbmImage, HBITMAP hbmMask)
if (!GetObjectW(hbmImage, sizeof(BITMAP), &bmp))
return -1;
+ TRACE("himl %p, cCurImage %d, cMaxImage %d, cGrow %d, cx %d, cy %d\n",
+ himl, himl->cCurImage, himl->cMaxImage, himl->cGrow, himl->cx, himl->cy);
+
nImageCount = bmp.bmWidth / himl->cx;
- IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmHeight);
+ TRACE("%p has %d images (%d x %d)\n", hbmImage, nImageCount, bmp.bmWidth, bmp.bmHeight);
+
+ IMAGELIST_InternalExpandBitmaps(himl, nImageCount);
hdcBitmap = CreateCompatibleDC(0);
- hOldBitmap = SelectObject(hdcBitmap, hbmImage);
+ SelectObject(hdcBitmap, hbmImage);
+
+ if (add_with_alpha( himl, hdcBitmap, himl->cCurImage, nImageCount,
+ himl->cx, min( himl->cy, bmp.bmHeight), hbmImage, hbmMask ))
+ goto done;
+
+ if (himl->hbmMask)
+ {
+ hdcTemp = CreateCompatibleDC(0);
+ SelectObject(hdcTemp, hbmMask);
+ }
for (i=0; ihbmMask)
continue;
- hdcTemp = CreateCompatibleDC(0);
- hOldBitmapTemp = SelectObject(hdcTemp, hbmMask);
-
BitBlt( himl->hdcMask, pt.x, pt.y, himl->cx, bmp.bmHeight,
hdcTemp, i*himl->cx, 0, SRCCOPY );
- SelectObject(hdcTemp, hOldBitmapTemp);
- DeleteDC(hdcTemp);
-
/* Remove the background from the image
*/
BitBlt( himl->hdcImage, pt.x, pt.y, himl->cx, bmp.bmHeight,
himl->hdcMask, pt.x, pt.y, 0x220326 ); /* NOTSRCAND */
}
+ if (hdcTemp) DeleteDC(hdcTemp);
- SelectObject(hdcBitmap, hOldBitmap);
+done:
DeleteDC(hdcBitmap);
nFirstIndex = himl->cCurImage;
@@ -331,12 +453,10 @@ INT WINAPI
ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
{
HDC hdcMask, hdcBitmap;
- INT i, nIndex, nImageCount;
+ INT ret;
BITMAP bmp;
- HBITMAP hOldBitmap;
- HBITMAP hMaskBitmap=0;
+ HBITMAP hMaskBitmap;
COLORREF bkColor;
- POINT pt;
TRACE("himl=%p hbitmap=%p clrmask=%x\n", himl, hBitmap, clrMask);
if (!is_valid(himl))
@@ -345,18 +465,8 @@ ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
if (!GetObjectW(hBitmap, sizeof(BITMAP), &bmp))
return -1;
- if (himl->cx > 0)
- nImageCount = bmp.bmWidth / himl->cx;
- else
- nImageCount = 0;
-
- IMAGELIST_InternalExpandBitmaps (himl, nImageCount, bmp.bmHeight);
-
- nIndex = himl->cCurImage;
- himl->cCurImage += nImageCount;
-
hdcBitmap = CreateCompatibleDC(0);
- hOldBitmap = SelectObject(hdcBitmap, hBitmap);
+ SelectObject(hdcBitmap, hBitmap);
/* Create a temp Mask so we can remove the background of the Image */
hdcMask = CreateCompatibleDC(0);
@@ -385,23 +495,13 @@ ImageList_AddMasked (HIMAGELIST himl, HBITMAP hBitmap, COLORREF clrMask)
*/
BitBlt(hdcBitmap, 0, 0, bmp.bmWidth, bmp.bmHeight, hdcMask, 0, 0, 0x220326);
- /* Copy result to the imagelist */
- for (i=0; ihdcImage, pt.x, pt.y, himl->cx, bmp.bmHeight,
- hdcBitmap, i*himl->cx, 0, SRCCOPY);
- BitBlt(himl->hdcMask, pt.x, pt.y, himl->cx, bmp.bmHeight,
- hdcMask, i*himl->cx, 0, SRCCOPY);
- }
-
- /* Clean up */
- SelectObject(hdcBitmap, hOldBitmap);
DeleteDC(hdcBitmap);
- DeleteObject(hMaskBitmap);
DeleteDC(hdcMask);
- return nIndex;
+ ret = ImageList_Add( himl, hBitmap, hMaskBitmap );
+
+ DeleteObject(hMaskBitmap);
+ return ret;
}
@@ -598,13 +698,12 @@ ImageList_Create (INT cx, INT cy, UINT flags,
TRACE("(%d %d 0x%x %d %d)\n", cx, cy, flags, cInitial, cGrow);
- himl = Alloc (sizeof(struct _IMAGELIST));
- if (!himl)
+ /* Create the IImageList interface for the image list */
+ if (FAILED(ImageListImpl_CreateInstance(NULL, &IID_IImageList, (void **)&himl)))
return NULL;
cGrow = (cGrow < 4) ? 4 : (cGrow + 3) & ~3;
- himl->magic = IMAGELIST_MAGIC;
himl->cx = cx;
himl->cy = cy;
himl->flags = flags;
@@ -638,7 +737,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
himl->uBitsPixel = (UINT)GetDeviceCaps (himl->hdcImage, BITSPIXEL);
if (himl->cMaxImage > 0) {
- himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage, cx);
+ himl->hbmImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
SelectObject(himl->hdcImage, himl->hbmImage);
} else
himl->hbmImage = 0;
@@ -646,7 +745,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
if ((himl->cMaxImage > 0) && (himl->flags & ILC_MASK)) {
SIZE sz;
- imagelist_get_bitmap_size(himl, himl->cMaxImage, himl->cx, &sz);
+ imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz);
himl->hbmMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
if (himl->hbmMask == 0) {
ERR("Error creating mask bitmap!\n");
@@ -657,6 +756,11 @@ ImageList_Create (INT cx, INT cy, UINT flags,
else
himl->hbmMask = 0;
+ if (himl->uBitsPixel == 32)
+ himl->has_alpha = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, himl->cMaxImage );
+ else
+ himl->has_alpha = NULL;
+
/* create blending brushes */
hbmTemp = CreateBitmap (8, 8, 1, 1, aBitBlend25);
himl->hbrBlend25 = CreatePatternBrush (hbmTemp);
@@ -670,7 +774,7 @@ ImageList_Create (INT cx, INT cy, UINT flags,
return himl;
cleanup:
- if (himl) ImageList_Destroy(himl);
+ ImageList_Destroy(himl);
return NULL;
}
@@ -694,27 +798,7 @@ ImageList_Destroy (HIMAGELIST himl)
if (!is_valid(himl))
return FALSE;
- /* delete image bitmaps */
- if (himl->hbmImage)
- DeleteObject (himl->hbmImage);
- if (himl->hbmMask)
- DeleteObject (himl->hbmMask);
-
- /* delete image & mask DCs */
- if (himl->hdcImage)
- DeleteDC(himl->hdcImage);
- if (himl->hdcMask)
- DeleteDC(himl->hdcMask);
-
- /* delete blending brushes */
- if (himl->hbrBlend25)
- DeleteObject (himl->hbrBlend25);
- if (himl->hbrBlend50)
- DeleteObject (himl->hbrBlend50);
-
- ZeroMemory(himl, sizeof(*himl));
- Free (himl);
-
+ IImageList_Release((IImageList *) himl);
return TRUE;
}
@@ -832,10 +916,7 @@ ImageList_InternalDragDraw (HDC hdc, INT x, INT y)
imldp.rgbFg = CLR_DEFAULT;
imldp.fStyle = ILD_NORMAL;
imldp.fState = ILS_ALPHA;
- imldp.Frame = 128;
-
- /* FIXME: instead of using the alpha blending, we should
- * create a 50% mask, and draw it semitransparantly that way */
+ imldp.Frame = 192;
ImageList_DrawIndirect (&imldp);
}
@@ -855,9 +936,6 @@ ImageList_InternalDragDraw (HDC hdc, INT x, INT y)
* NOTES
* The position of the drag image is relative to the window, not
* the client area.
- *
- * BUGS
- * The drag image should be drawn semitransparent.
*/
BOOL WINAPI
@@ -941,9 +1019,6 @@ ImageList_DragMove (INT x, INT y)
* RETURNS
* Success: TRUE
* Failure: FALSE
- *
- * BUGS
- * The drag image should be drawn semitransparent.
*/
BOOL WINAPI
@@ -1081,6 +1156,73 @@ ImageList_DrawEx (HIMAGELIST himl, INT i, HDC hdc, INT x, INT y,
}
+static BOOL alpha_blend_image( HIMAGELIST himl, HDC dest_dc, int dest_x, int dest_y,
+ int src_x, int src_y, int cx, int cy, BLENDFUNCTION func )
+{
+ BOOL ret = FALSE;
+ HDC hdc;
+ HBITMAP bmp = 0, mask = 0;
+ BITMAPINFO *info;
+ void *bits, *mask_bits;
+ unsigned int *ptr;
+ int i, j;
+
+ if (!(hdc = CreateCompatibleDC( 0 ))) return FALSE;
+ if (!(info = HeapAlloc( GetProcessHeap(), 0, FIELD_OFFSET( BITMAPINFO, bmiColors[256] )))) goto done;
+ info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+ info->bmiHeader.biWidth = cx;
+ info->bmiHeader.biHeight = cy;
+ info->bmiHeader.biPlanes = 1;
+ info->bmiHeader.biBitCount = 32;
+ info->bmiHeader.biCompression = BI_RGB;
+ info->bmiHeader.biSizeImage = cx * cy * 4;
+ info->bmiHeader.biXPelsPerMeter = 0;
+ info->bmiHeader.biYPelsPerMeter = 0;
+ info->bmiHeader.biClrUsed = 0;
+ info->bmiHeader.biClrImportant = 0;
+ if (!(bmp = CreateDIBSection( himl->hdcImage, info, DIB_RGB_COLORS, &bits, 0, 0 ))) goto done;
+ SelectObject( hdc, bmp );
+ BitBlt( hdc, 0, 0, cx, cy, himl->hdcImage, src_x, src_y, SRCCOPY );
+
+ if (himl->uBitsPixel == 32) /* we already have an alpha channel in this case */
+ {
+ /* pre-multiply by the alpha channel */
+ for (i = 0, ptr = bits; i < cx * cy; i++, ptr++)
+ {
+ DWORD alpha = *ptr >> 24;
+ *ptr = ((*ptr & 0xff000000) |
+ (((*ptr & 0x00ff0000) * alpha / 255) & 0x00ff0000) |
+ (((*ptr & 0x0000ff00) * alpha / 255) & 0x0000ff00) |
+ (((*ptr & 0x000000ff) * alpha / 255)));
+ }
+ }
+ else if (himl->hbmMask)
+ {
+ unsigned int width_bytes = (cx + 31) / 32 * 4;
+ /* generate alpha channel from the mask */
+ info->bmiHeader.biBitCount = 1;
+ info->bmiHeader.biSizeImage = width_bytes * cy;
+ if (!(mask = CreateDIBSection( himl->hdcMask, info, DIB_RGB_COLORS, &mask_bits, 0, 0 )))
+ goto done;
+ SelectObject( hdc, mask );
+ BitBlt( hdc, 0, 0, cx, cy, himl->hdcMask, src_x, src_y, SRCCOPY );
+ SelectObject( hdc, bmp );
+ for (i = 0, ptr = bits; i < cy; i++)
+ for (j = 0; j < cx; j++, ptr++)
+ if ((((BYTE *)mask_bits)[i * width_bytes + j / 8] << (j % 8)) & 0x80) *ptr = 0;
+ else *ptr |= 0xff000000;
+ }
+
+ ret = GdiAlphaBlend( dest_dc, dest_x, dest_y, cx, cy, hdc, 0, 0, cx, cy, func );
+
+done:
+ DeleteDC( hdc );
+ if (bmp) DeleteObject( bmp );
+ if (mask) DeleteObject( mask );
+ HeapFree( GetProcessHeap(), 0, info );
+ return ret;
+}
+
/*************************************************************************
* ImageList_DrawIndirect [COMCTL32.@]
*
@@ -1105,7 +1247,9 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
HBITMAP hImageBmp, hOldImageBmp, hBlendMaskBmp;
BOOL bIsTransparent, bBlend, bResult = FALSE, bMask;
HIMAGELIST himl;
+ HBRUSH hOldBrush;
POINT pt;
+ BOOL has_alpha;
if (!pimldp || !(himl = pimldp->himl)) return FALSE;
if (!is_valid(himl)) return FALSE;
@@ -1149,18 +1293,46 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
/*
* To obtain a transparent look, background color should be set
- * to white and foreground color to black when blting the
+ * to white and foreground color to black when blitting the
* monochrome mask.
*/
oldImageFg = SetTextColor( hImageDC, RGB( 0, 0, 0 ) );
oldImageBk = SetBkColor( hImageDC, RGB( 0xff, 0xff, 0xff ) );
+ has_alpha = (himl->has_alpha && himl->has_alpha[pimldp->i]);
+ if (!bMask && (has_alpha || (fState & ILS_ALPHA)))
+ {
+ COLORREF colour;
+ BLENDFUNCTION func;
+
+ func.BlendOp = AC_SRC_OVER;
+ func.BlendFlags = 0;
+ func.SourceConstantAlpha = (fState & ILS_ALPHA) ? pimldp->Frame : 255;
+ func.AlphaFormat = AC_SRC_ALPHA;
+
+ if (bIsTransparent)
+ {
+ bResult = alpha_blend_image( himl, pimldp->hdcDst, pimldp->x, pimldp->y,
+ pt.x, pt.y, cx, cy, func );
+ goto end;
+ }
+ colour = pimldp->rgbBk;
+ if (colour == CLR_DEFAULT) colour = himl->clrBk;
+ if (colour == CLR_NONE) colour = GetBkColor( pimldp->hdcDst );
+
+ hOldBrush = SelectObject (hImageDC, CreateSolidBrush (colour));
+ PatBlt( hImageDC, 0, 0, cx, cy, PATCOPY );
+ alpha_blend_image( himl, hImageDC, 0, 0, pt.x, pt.y, cx, cy, func );
+ DeleteObject (SelectObject (hImageDC, hOldBrush));
+ bResult = BitBlt( pimldp->hdcDst, pimldp->x, pimldp->y, cx, cy, hImageDC, 0, 0, SRCCOPY );
+ goto end;
+ }
+
/*
* Draw the initial image
*/
if( bMask ) {
if (himl->hbmMask) {
- HBRUSH hOldBrush;
hOldBrush = SelectObject (hImageDC, CreateSolidBrush (GetTextColor(pimldp->hdcDst)));
PatBlt( hImageDC, 0, 0, cx, cy, PATCOPY );
BitBlt(hImageDC, 0, 0, cx, cy, hMaskListDC, pt.x, pt.y, SRCPAINT);
@@ -1172,14 +1344,13 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
goto end;
}
} else {
- HBRUSH hOldBrush = SelectObject (hImageDC, GetStockObject(BLACK_BRUSH));
+ hOldBrush = SelectObject (hImageDC, GetStockObject(BLACK_BRUSH));
PatBlt( hImageDC, 0, 0, cx, cy, PATCOPY);
SelectObject(hImageDC, hOldBrush);
}
} else {
/* blend the image with the needed solid background */
COLORREF colour = RGB(0,0,0);
- HBRUSH hOldBrush;
if( !bIsTransparent )
{
@@ -1204,7 +1375,7 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
/* Time for blending, if required */
if (bBlend) {
- HBRUSH hBlendBrush, hOldBrush;
+ HBRUSH hBlendBrush;
COLORREF clrBlend = pimldp->rgbFg;
HDC hBlendMaskDC = hImageListDC;
HBITMAP hOldBitmap;
@@ -1248,7 +1419,6 @@ ImageList_DrawIndirect (IMAGELISTDRAWPARAMS *pimldp)
if (fState & ILS_SATURATE) FIXME("ILS_SATURATE: unimplemented!\n");
if (fState & ILS_GLOW) FIXME("ILS_GLOW: unimplemented!\n");
if (fState & ILS_SHADOW) FIXME("ILS_SHADOW: unimplemented!\n");
- if (fState & ILS_ALPHA) FIXME("ILS_ALPHA: unimplemented!\n");
if (fStyle & ILD_PRESERVEALPHA) FIXME("ILD_PRESERVEALPHA: unimplemented!\n");
if (fStyle & ILD_SCALE) FIXME("ILD_SCALE: unimplemented!\n");
@@ -1306,13 +1476,13 @@ ImageList_Duplicate (HIMAGELIST himlSrc)
}
himlDst = ImageList_Create (himlSrc->cx, himlSrc->cy, himlSrc->flags,
- himlSrc->cInitial, himlSrc->cGrow);
+ himlSrc->cCurImage, himlSrc->cGrow);
if (himlDst)
{
SIZE sz;
- imagelist_get_bitmap_size(himlSrc, himlSrc->cCurImage, himlSrc->cx, &sz);
+ imagelist_get_bitmap_size(himlSrc, himlSrc->cCurImage, &sz);
BitBlt (himlDst->hdcImage, 0, 0, sz.cx, sz.cy,
himlSrc->hdcImage, 0, 0, SRCCOPY);
@@ -1322,6 +1492,8 @@ ImageList_Duplicate (HIMAGELIST himlSrc)
himlDst->cCurImage = himlSrc->cCurImage;
himlDst->cMaxImage = himlSrc->cMaxImage;
+ if (himlSrc->has_alpha && himlDst->has_alpha)
+ memcpy( himlDst->has_alpha, himlSrc->has_alpha, himlDst->cCurImage );
}
return himlDst;
}
@@ -1656,7 +1828,7 @@ ImageList_LoadImageA (HINSTANCE hi, LPCSTR lpbmp, INT cx, INT cGrow,
LPWSTR lpbmpW;
DWORD len;
- if (!HIWORD(lpbmp))
+ if (IS_INTRESOURCE(lpbmp))
return ImageList_LoadImageW(hi, (LPCWSTR)lpbmp, cx, cGrow, clrMask,
uType, uFlags);
@@ -2080,14 +2252,14 @@ ImageList_Remove (HIMAGELIST himl, INT i)
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
himl->nOvlIdx[nCount] = -1;
- hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage, himl->cx);
+ hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
SelectObject (himl->hdcImage, hbmNewImage);
DeleteObject (himl->hbmImage);
himl->hbmImage = hbmNewImage;
if (himl->hbmMask) {
- imagelist_get_bitmap_size(himl, himl->cMaxImage, himl->cx, &sz);
+ imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz);
hbmNewMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
SelectObject (himl->hdcMask, hbmNewMask);
DeleteObject (himl->hbmMask);
@@ -2102,9 +2274,9 @@ ImageList_Remove (HIMAGELIST himl, INT i)
TRACE(" - Number of images: %d / %d (Old/New)\n",
himl->cCurImage, himl->cCurImage - 1);
- hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage, himl->cx);
+ hbmNewImage = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
- imagelist_get_bitmap_size(himl, himl->cMaxImage, himl->cx, &sz );
+ imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz );
if (himl->hbmMask)
hbmNewMask = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
else
@@ -2181,7 +2353,6 @@ ImageList_Replace (HIMAGELIST himl, INT i, HBITMAP hbmImage,
{
HDC hdcImage;
BITMAP bmp;
- HBITMAP hOldBitmap;
POINT pt;
TRACE("%p %d %p %p\n", himl, i, hbmImage, hbmMask);
@@ -2202,7 +2373,10 @@ ImageList_Replace (HIMAGELIST himl, INT i, HBITMAP hbmImage,
hdcImage = CreateCompatibleDC (0);
/* Replace Image */
- hOldBitmap = SelectObject (hdcImage, hbmImage);
+ SelectObject (hdcImage, hbmImage);
+
+ if (add_with_alpha( himl, hdcImage, i, 1, bmp.bmWidth, bmp.bmHeight, hbmImage, hbmMask ))
+ goto done;
imagelist_point_from_index(himl, i, &pt);
StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
@@ -2227,7 +2401,7 @@ ImageList_Replace (HIMAGELIST himl, INT i, HBITMAP hbmImage,
himl->hdcMask, pt.x, pt.y, 0x220326); /* NOTSRCAND */
}
- SelectObject (hdcImage, hOldBitmap);
+done:
DeleteDC (hdcImage);
return TRUE;
@@ -2254,7 +2428,6 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
{
HDC hdcImage;
HICON hBestFitIcon;
- HBITMAP hbmOldSrc;
ICONINFO ii;
BITMAP bmp;
BOOL ret;
@@ -2304,7 +2477,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (nIndex == -1) {
if (himl->cCurImage + 1 > himl->cMaxImage)
- IMAGELIST_InternalExpandBitmaps (himl, 1, 0);
+ IMAGELIST_InternalExpandBitmaps(himl, 1);
nIndex = himl->cCurImage;
himl->cCurImage++;
@@ -2315,6 +2488,25 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (hdcImage == 0)
ERR("invalid hdcImage!\n");
+ if (himl->uBitsPixel == 32)
+ {
+ if (!ii.hbmColor)
+ {
+ UINT height = bmp.bmHeight / 2;
+ HDC hdcMask = CreateCompatibleDC( 0 );
+ HBITMAP color = CreateBitmap( bmp.bmWidth, height, 1, 1, NULL );
+ SelectObject( hdcImage, color );
+ SelectObject( hdcMask, ii.hbmMask );
+ BitBlt( hdcImage, 0, 0, bmp.bmWidth, height, hdcMask, 0, height, SRCCOPY );
+ add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, height, color, ii.hbmMask );
+ DeleteDC( hdcMask );
+ DeleteObject( color );
+ }
+ else add_with_alpha( himl, hdcImage, nIndex, 1, bmp.bmWidth, bmp.bmHeight, ii.hbmColor, ii.hbmMask );
+
+ goto done;
+ }
+
imagelist_point_from_index(himl, nIndex, &pt);
SetTextColor(himl->hdcImage, RGB(0,0,0));
@@ -2322,7 +2514,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
if (ii.hbmColor)
{
- hbmOldSrc = SelectObject (hdcImage, ii.hbmColor);
+ SelectObject (hdcImage, ii.hbmColor);
StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
hdcImage, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);
if (himl->hbmMask)
@@ -2335,7 +2527,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
else
{
UINT height = bmp.bmHeight / 2;
- hbmOldSrc = SelectObject (hdcImage, ii.hbmMask);
+ SelectObject (hdcImage, ii.hbmMask);
StretchBlt (himl->hdcImage, pt.x, pt.y, himl->cx, himl->cy,
hdcImage, 0, height, bmp.bmWidth, height, SRCCOPY);
if (himl->hbmMask)
@@ -2343,8 +2535,7 @@ ImageList_ReplaceIcon (HIMAGELIST himl, INT nIndex, HICON hIcon)
hdcImage, 0, 0, bmp.bmWidth, height, SRCCOPY);
}
- SelectObject (hdcImage, hbmOldSrc);
-
+done:
DestroyIcon(hBestFitIcon);
if (hdcImage)
DeleteDC (hdcImage);
@@ -2539,14 +2730,14 @@ ImageList_SetIconSize (HIMAGELIST himl, INT cx, INT cy)
for (nCount = 0; nCount < MAX_OVERLAYIMAGE; nCount++)
himl->nOvlIdx[nCount] = -1;
- hbmNew = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage, himl->cx);
+ hbmNew = ImageList_CreateImage(himl->hdcImage, himl, himl->cMaxImage);
SelectObject (himl->hdcImage, hbmNew);
DeleteObject (himl->hbmImage);
himl->hbmImage = hbmNew;
if (himl->hbmMask) {
SIZE sz;
- imagelist_get_bitmap_size(himl, himl->cMaxImage, himl->cx, &sz);
+ imagelist_get_bitmap_size(himl, himl->cMaxImage, &sz);
hbmNew = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
SelectObject (himl->hdcMask, hbmNew);
DeleteObject (himl->hbmMask);
@@ -2594,7 +2785,7 @@ ImageList_SetImageCount (HIMAGELIST himl, UINT iImageCount)
hdcBitmap = CreateCompatibleDC (0);
- hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount, himl->cx);
+ hbmNewBitmap = ImageList_CreateImage(hdcBitmap, himl, nNewCount);
if (hbmNewBitmap != 0)
{
@@ -2614,7 +2805,7 @@ ImageList_SetImageCount (HIMAGELIST himl, UINT iImageCount)
if (himl->hbmMask)
{
SIZE sz;
- imagelist_get_bitmap_size( himl, nNewCount, himl->cx, &sz );
+ imagelist_get_bitmap_size( himl, nNewCount, &sz );
hbmNewBitmap = CreateBitmap (sz.cx, sz.cy, 1, 1, NULL);
if (hbmNewBitmap != 0)
{
@@ -2813,13 +3004,13 @@ ImageList_Write (HIMAGELIST himl, LPSTREAM pstm)
}
-static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count, UINT width)
+static HBITMAP ImageList_CreateImage(HDC hdc, HIMAGELIST himl, UINT count)
{
HBITMAP hbmNewBitmap;
UINT ilc = (himl->flags & 0xFE);
SIZE sz;
- imagelist_get_bitmap_size( himl, count, width, &sz );
+ imagelist_get_bitmap_size( himl, count, &sz );
if ((ilc >= ILC_COLOR4 && ilc <= ILC_COLOR32) || ilc == ILC_COLOR)
{
@@ -2925,8 +3116,466 @@ ImageList_SetColorTable (HIMAGELIST himl, UINT uStartIndex, UINT cEntries, CONST
HRESULT WINAPI
ImageList_CoCreateInstance (REFCLSID rclsid, const IUnknown *punkOuter, REFIID riid, void **ppv)
{
- FIXME("STUB: %s %p %s %p\n", debugstr_guid(rclsid), punkOuter, debugstr_guid(riid), ppv);
- return E_NOINTERFACE;
+ TRACE("(%s,%p,%s,%p)\n", debugstr_guid(rclsid), punkOuter, debugstr_guid(riid), ppv);
+
+ if (!IsEqualCLSID(&CLSID_ImageList, rclsid))
+ return E_NOINTERFACE;
+
+ return ImageListImpl_CreateInstance(punkOuter, riid, ppv);
+}
+
+
+/*************************************************************************
+ * IImageList implementation
+ */
+
+static HRESULT WINAPI ImageListImpl_QueryInterface(IImageList *iface,
+ REFIID iid, void **ppv)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ TRACE("(%p,%s,%p)\n", iface, debugstr_guid(iid), ppv);
+
+ if (!ppv) return E_INVALIDARG;
+
+ if (IsEqualIID(&IID_IUnknown, iid) || IsEqualIID(&IID_IImageList, iid))
+ *ppv = This;
+ else
+ {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+
+ IUnknown_AddRef((IUnknown*)*ppv);
+ return S_OK;
+}
+
+static ULONG WINAPI ImageListImpl_AddRef(IImageList *iface)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ ULONG ref = InterlockedIncrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+ return ref;
+}
+
+static ULONG WINAPI ImageListImpl_Release(IImageList *iface)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ ULONG ref = InterlockedDecrement(&This->ref);
+
+ TRACE("(%p) refcount=%u\n", iface, ref);
+
+ if (ref == 0)
+ {
+ /* delete image bitmaps */
+ if (This->hbmImage) DeleteObject (This->hbmImage);
+ if (This->hbmMask) DeleteObject (This->hbmMask);
+
+ /* delete image & mask DCs */
+ if (This->hdcImage) DeleteDC (This->hdcImage);
+ if (This->hdcMask) DeleteDC (This->hdcMask);
+
+ /* delete blending brushes */
+ if (This->hbrBlend25) DeleteObject (This->hbrBlend25);
+ if (This->hbrBlend50) DeleteObject (This->hbrBlend50);
+
+ This->lpVtbl = NULL;
+ HeapFree(GetProcessHeap(), 0, This->has_alpha);
+ HeapFree(GetProcessHeap(), 0, This);
+ }
+
+ return ref;
+}
+
+static HRESULT WINAPI ImageListImpl_Add(IImageList *iface, HBITMAP hbmImage,
+ HBITMAP hbmMask, int *pi)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ int ret;
+
+ if (!pi)
+ return E_FAIL;
+
+ ret = ImageList_Add(This, hbmImage, hbmMask);
+
+ if (ret == -1)
+ return E_FAIL;
+
+ *pi = ret;
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_ReplaceIcon(IImageList *iface, int i,
+ HICON hicon, int *pi)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ int ret;
+
+ if (!pi)
+ return E_FAIL;
+
+ ret = ImageList_ReplaceIcon(This, i, hicon);
+
+ if (ret == -1)
+ return E_FAIL;
+
+ *pi = ret;
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_SetOverlayImage(IImageList *iface,
+ int iImage, int iOverlay)
+{
+ return ImageList_SetOverlayImage((HIMAGELIST) iface, iImage, iOverlay)
+ ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_Replace(IImageList *iface, int i,
+ HBITMAP hbmImage, HBITMAP hbmMask)
+{
+ return ImageList_Replace((HIMAGELIST) iface, i, hbmImage, hbmMask) ? S_OK :
+ E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_AddMasked(IImageList *iface, HBITMAP hbmImage,
+ COLORREF crMask, int *pi)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ int ret;
+
+ if (!pi)
+ return E_FAIL;
+
+ ret = ImageList_AddMasked(This, hbmImage, crMask);
+
+ if (ret == -1)
+ return E_FAIL;
+
+ *pi = ret;
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_Draw(IImageList *iface,
+ IMAGELISTDRAWPARAMS *pimldp)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST old_himl = 0;
+ int ret = 0;
+
+ if (!pimldp)
+ return E_FAIL;
+
+ /* As far as I can tell, Windows simply ignores the contents of pimldp->himl
+ so we shall simulate the same */
+ old_himl = pimldp->himl;
+ pimldp->himl = This;
+
+ ret = ImageList_DrawIndirect(pimldp);
+
+ pimldp->himl = old_himl;
+ return ret ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_Remove(IImageList *iface, int i)
+{
+ return (ImageList_Remove((HIMAGELIST) iface, i) == 0) ? E_FAIL : S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_GetIcon(IImageList *iface, int i, UINT flags,
+ HICON *picon)
+{
+ HICON hIcon;
+
+ if (!picon)
+ return E_FAIL;
+
+ hIcon = ImageList_GetIcon((HIMAGELIST) iface, i, flags);
+
+ if (hIcon == NULL)
+ return E_FAIL;
+
+ *picon = hIcon;
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_GetImageInfo(IImageList *iface, int i,
+ IMAGEINFO *pImageInfo)
+{
+ return ImageList_GetImageInfo((HIMAGELIST) iface, i, pImageInfo) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_Copy(IImageList *iface, int iDst,
+ IUnknown *punkSrc, int iSrc, UINT uFlags)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ IImageList *src = NULL;
+ HRESULT ret;
+
+ if (!punkSrc)
+ return E_FAIL;
+
+ /* TODO: Add test for IID_ImageList2 too */
+ if (FAILED(IImageList_QueryInterface(punkSrc, &IID_IImageList,
+ (void **) &src)))
+ return E_FAIL;
+
+ if (ImageList_Copy(This, iDst, (HIMAGELIST) src, iSrc, uFlags))
+ ret = S_OK;
+ else
+ ret = E_FAIL;
+
+ IImageList_Release(src);
+ return ret;
+}
+
+static HRESULT WINAPI ImageListImpl_Merge(IImageList *iface, int i1,
+ IUnknown *punk2, int i2, int dx, int dy, REFIID riid, PVOID *ppv)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ IImageList *iml2 = NULL;
+ HIMAGELIST hNew;
+ HRESULT ret = E_FAIL;
+
+ if (!punk2 || !ppv)
+ return E_FAIL;
+
+ /* TODO: Add test for IID_ImageList2 too */
+ if (FAILED(IImageList_QueryInterface(punk2, &IID_IImageList,
+ (void **) &iml2)))
+ return E_FAIL;
+
+ hNew = ImageList_Merge(This, i1, (HIMAGELIST) iml2, i2, dx, dy);
+
+ /* Get the interface for the new image list */
+ if (hNew)
+ ret = HIMAGELIST_QueryInterface(hNew, riid, ppv);
+
+ IImageList_Release(iml2);
+ return ret;
+}
+
+static HRESULT WINAPI ImageListImpl_Clone(IImageList *iface, REFIID riid,
+ PVOID *ppv)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ HIMAGELIST hNew;
+ HRESULT ret = E_FAIL;
+
+ if (!ppv)
+ return E_FAIL;
+
+ hNew = ImageList_Duplicate(This);
+
+ /* Get the interface for the new image list */
+ if (hNew)
+ ret = HIMAGELIST_QueryInterface(hNew, riid, ppv);
+
+ return ret;
+}
+
+static HRESULT WINAPI ImageListImpl_GetImageRect(IImageList *iface, int i,
+ RECT *prc)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ IMAGEINFO info;
+
+ if (!prc)
+ return E_FAIL;
+
+ if (!ImageList_GetImageInfo(This, i, &info))
+ return E_FAIL;
+
+ return CopyRect(prc, &info.rcImage) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetIconSize(IImageList *iface, int *cx,
+ int *cy)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+
+ return ImageList_GetIconSize(This, cx, cy) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_SetIconSize(IImageList *iface, int cx,
+ int cy)
+{
+ return ImageList_SetIconSize((HIMAGELIST) iface, cx, cy) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetImageCount(IImageList *iface, int *pi)
+{
+ if (!pi)
+ return E_FAIL;
+
+ *pi = ImageList_GetImageCount((HIMAGELIST) iface);
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_SetImageCount(IImageList *iface,
+ UINT uNewCount)
+{
+ return ImageList_SetImageCount((HIMAGELIST) iface, uNewCount) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_SetBkColor(IImageList *iface, COLORREF clrBk,
+ COLORREF *pclr)
+{
+ if (!pclr)
+ return E_FAIL;
+
+ *pclr = ImageList_SetBkColor((HIMAGELIST) iface, clrBk);
+ return *pclr == CLR_NONE ? E_FAIL : S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_GetBkColor(IImageList *iface, COLORREF *pclr)
+{
+ if (!pclr)
+ return E_FAIL;
+
+ *pclr = ImageList_GetBkColor((HIMAGELIST) iface);
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_BeginDrag(IImageList *iface, int iTrack,
+ int dxHotspot, int dyHotspot)
+{
+ return ImageList_BeginDrag((HIMAGELIST) iface, iTrack, dxHotspot, dyHotspot) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_EndDrag(IImageList *iface)
+{
+ ImageList_EndDrag();
+ return S_OK;
+}
+
+static HRESULT WINAPI ImageListImpl_DragEnter(IImageList *iface, HWND hwndLock,
+ int x, int y)
+{
+ return ImageList_DragEnter(hwndLock, x, y) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_DragLeave(IImageList *iface, HWND hwndLock)
+{
+ return ImageList_DragLeave(hwndLock) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_DragMove(IImageList *iface, int x, int y)
+{
+ return ImageList_DragMove(x, y) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_SetDragCursorImage(IImageList *iface,
+ IUnknown *punk, int iDrag, int dxHotspot, int dyHotspot)
+{
+ IImageList *iml2 = NULL;
+ HRESULT ret;
+
+ if (!punk)
+ return E_FAIL;
+
+ /* TODO: Add test for IID_ImageList2 too */
+ if (FAILED(IImageList_QueryInterface(punk, &IID_IImageList,
+ (void **) &iml2)))
+ return E_FAIL;
+
+ ret = ImageList_SetDragCursorImage((HIMAGELIST) iml2, iDrag, dxHotspot,
+ dyHotspot);
+
+ IImageList_Release(iml2);
+
+ return ret ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_DragShowNolock(IImageList *iface, BOOL fShow)
+{
+ return ImageList_DragShowNolock(fShow) ? S_OK : E_FAIL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetDragImage(IImageList *iface, POINT *ppt,
+ POINT *pptHotspot, REFIID riid, PVOID *ppv)
+{
+ HRESULT ret = E_FAIL;
+ HIMAGELIST hNew;
+
+ if (!ppv)
+ return E_FAIL;
+
+ hNew = ImageList_GetDragImage(ppt, pptHotspot);
+
+ /* Get the interface for the new image list */
+ if (hNew)
+ ret = HIMAGELIST_QueryInterface(hNew, riid, ppv);
+
+ return ret;
+}
+
+static HRESULT WINAPI ImageListImpl_GetItemFlags(IImageList *iface, int i,
+ DWORD *dwFlags)
+{
+ FIXME("STUB: %p %d %p\n", iface, i, dwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI ImageListImpl_GetOverlayImage(IImageList *iface, int iOverlay,
+ int *piIndex)
+{
+ HIMAGELIST This = (HIMAGELIST) iface;
+ int i;
+
+ if ((iOverlay < 0) || (iOverlay > This->cCurImage))
+ return E_FAIL;
+
+ for (i = 0; i < MAX_OVERLAYIMAGE; i++)
+ {
+ if (This->nOvlIdx[i] == iOverlay)
+ {
+ *piIndex = i + 1;
+ return S_OK;
+ }
+ }
+
+ return E_FAIL;
+}
+
+
+static const IImageListVtbl ImageListImpl_Vtbl = {
+ ImageListImpl_QueryInterface,
+ ImageListImpl_AddRef,
+ ImageListImpl_Release,
+ ImageListImpl_Add,
+ ImageListImpl_ReplaceIcon,
+ ImageListImpl_SetOverlayImage,
+ ImageListImpl_Replace,
+ ImageListImpl_AddMasked,
+ ImageListImpl_Draw,
+ ImageListImpl_Remove,
+ ImageListImpl_GetIcon,
+ ImageListImpl_GetImageInfo,
+ ImageListImpl_Copy,
+ ImageListImpl_Merge,
+ ImageListImpl_Clone,
+ ImageListImpl_GetImageRect,
+ ImageListImpl_GetIconSize,
+ ImageListImpl_SetIconSize,
+ ImageListImpl_GetImageCount,
+ ImageListImpl_SetImageCount,
+ ImageListImpl_SetBkColor,
+ ImageListImpl_GetBkColor,
+ ImageListImpl_BeginDrag,
+ ImageListImpl_EndDrag,
+ ImageListImpl_DragEnter,
+ ImageListImpl_DragLeave,
+ ImageListImpl_DragMove,
+ ImageListImpl_SetDragCursorImage,
+ ImageListImpl_DragShowNolock,
+ ImageListImpl_GetDragImage,
+ ImageListImpl_GetItemFlags,
+ ImageListImpl_GetOverlayImage
+};
+
+static inline BOOL is_valid(HIMAGELIST himl)
+{
+ return himl && himl->lpVtbl == &ImageListImpl_Vtbl;
}
/*************************************************************************
@@ -2947,6 +3596,31 @@ ImageList_CoCreateInstance (REFCLSID rclsid, const IUnknown *punkOuter, REFIID r
HRESULT WINAPI
HIMAGELIST_QueryInterface (HIMAGELIST himl, REFIID riid, void **ppv)
{
- FIXME("STUB: %p %s %p\n", himl, debugstr_guid(riid), ppv);
- return E_NOINTERFACE;
+ TRACE("(%p,%s,%p)\n", himl, debugstr_guid(riid), ppv);
+ return IImageList_QueryInterface((IImageList *) himl, riid, ppv);
+}
+
+static HRESULT ImageListImpl_CreateInstance(const IUnknown *pUnkOuter, REFIID iid, void** ppv)
+{
+ HIMAGELIST This;
+ HRESULT ret;
+
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppv);
+
+ *ppv = NULL;
+
+ if (pUnkOuter) return CLASS_E_NOAGGREGATION;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(struct _IMAGELIST));
+ if (!This) return E_OUTOFMEMORY;
+
+ ZeroMemory(This, sizeof(struct _IMAGELIST));
+
+ This->lpVtbl = &ImageListImpl_Vtbl;
+ This->ref = 1;
+
+ ret = IUnknown_QueryInterface((IUnknown*)This, iid, ppv);
+ IUnknown_Release((IUnknown*)This);
+
+ return ret;
}
diff --git a/dll/win32/comctl32/imagelist.h b/dll/win32/comctl32/imagelist.h
index 73ccd8a376c..f6f1d1b9e71 100644
--- a/dll/win32/comctl32/imagelist.h
+++ b/dll/win32/comctl32/imagelist.h
@@ -27,32 +27,35 @@
#include "winbase.h"
#include "wingdi.h"
-/* the ones with offsets at the end are the same as in Windows */
struct _IMAGELIST
{
- DWORD magic; /* 00: 'SAMX' */
- INT cCurImage; /* 04: ImageCount */
- INT cMaxImage; /* 08: maximages */
- INT cGrow; /* 0c: cGrow */
- INT cx; /* 10: cx */
- INT cy; /* 14: cy */
+ const struct IImageListVtbl *lpVtbl; /* 00: IImageList vtable */
+
+ INT cCurImage; /* 04: ImageCount */
+ INT cMaxImage; /* 08: maximages */
+ INT cGrow; /* 0C: cGrow */
+ INT cx; /* 10: cx */
+ INT cy; /* 14: cy */
DWORD x4;
- UINT flags; /* 1c: flags */
- COLORREF clrFg; /* 20: foreground color */
- COLORREF clrBk; /* 24: background color */
+ UINT flags; /* 1C: flags */
+ COLORREF clrFg; /* 20: foreground color */
+ COLORREF clrBk; /* 24: background color */
- HBITMAP hbmImage; /* 30: images Bitmap */
- HBITMAP hbmMask; /* 34: masks Bitmap */
- HDC hdcImage; /* 38: images MemDC */
- HDC hdcMask; /* 3C: masks MemDC */
- INT nOvlIdx[15]; /* 40: overlay images index */
+ HBITMAP hbmImage; /* 28: images Bitmap */
+ HBITMAP hbmMask; /* 2C: masks Bitmap */
+ HDC hdcImage; /* 30: images MemDC */
+ HDC hdcMask; /* 34: masks MemDC */
+ INT nOvlIdx[15]; /* 38: overlay images index */
/* not yet found out */
HBRUSH hbrBlend25;
HBRUSH hbrBlend50;
INT cInitial;
UINT uBitsPixel;
+ char *has_alpha;
+
+ LONG ref; /* reference count */
};
#define IMAGELIST_MAGIC 0x53414D58
diff --git a/dll/win32/comctl32/ipaddress.c b/dll/win32/comctl32/ipaddress.c
index 42ac703b287..03b8d1c9ed3 100644
--- a/dll/win32/comctl32/ipaddress.c
+++ b/dll/win32/comctl32/ipaddress.c
@@ -189,7 +189,6 @@ static LRESULT IPADDRESS_Draw (const IPADDRESS_INFO *infoPtr, HDC hdc)
static LRESULT IPADDRESS_Create (HWND hwnd, const CREATESTRUCTA *lpCreate)
{
- static const WCHAR EDIT[] = { 'E', 'd', 'i', 't', 0 };
IPADDRESS_INFO *infoPtr;
RECT rcClient, edit;
int i, fieldsize;
@@ -230,7 +229,7 @@ static LRESULT IPADDRESS_Create (HWND hwnd, const CREATESTRUCTA *lpCreate)
edit.left = rcClient.left + i*fieldsize + 6;
edit.right = rcClient.left + (i+1)*fieldsize - 2;
part->EditHwnd =
- CreateWindowW (EDIT, NULL, WS_CHILD | WS_VISIBLE | ES_CENTER,
+ CreateWindowW (WC_EDITW, NULL, WS_CHILD | WS_VISIBLE | ES_CENTER,
edit.left, edit.top, edit.right - edit.left,
edit.bottom - edit.top, hwnd, (HMENU) 1,
(HINSTANCE)GetWindowLongPtrW(hwnd, GWLP_HINSTANCE), NULL);
diff --git a/dll/win32/comctl32/listview.c b/dll/win32/comctl32/listview.c
index 1c0f58bbd69..2c27aa90f12 100644
--- a/dll/win32/comctl32/listview.c
+++ b/dll/win32/comctl32/listview.c
@@ -7,6 +7,7 @@
* Copyright 2001 CodeWeavers Inc.
* Copyright 2002 Dimitrie O. Paun
* Copyright 2009 Nikolay Sivov
+ * Copyright 2009 Owen Rudge for CodeWeavers
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -73,7 +74,6 @@
*
* States
* -- LVIS_ACTIVATING (not currently supported by comctl32.dll version 6.0)
- * -- LVIS_CUT
* -- LVIS_DROPHILITED
* -- LVIS_OVERLAYMASK
*
@@ -98,9 +98,7 @@
* -- LVN_BEGINSCROLL, LVN_ENDSCROLL
* -- LVN_GETINFOTIP
* -- LVN_HOTTRACK
- * -- LVN_MARQUEEBEGIN
* -- LVN_SETDISPINFO
- * -- NM_HOVER
* -- LVN_BEGINRDRAG
*
* Messages:
@@ -237,81 +235,120 @@ typedef struct tagDELAYED_ITEM_EDIT
typedef struct tagLISTVIEW_INFO
{
+ /* control window */
HWND hwndSelf;
- HBRUSH hBkBrush;
- COLORREF clrBk;
- COLORREF clrText;
- COLORREF clrTextBk;
- HIMAGELIST himlNormal;
- HIMAGELIST himlSmall;
- HIMAGELIST himlState;
- BOOL bLButtonDown;
- BOOL bRButtonDown;
- BOOL bDragging;
- POINT ptClickPos; /* point where the user clicked */
- BOOL bNoItemMetrics; /* flags if item metrics are not yet computed */
- INT nItemHeight;
- INT nItemWidth;
- RANGES selectionRanges;
- INT nSelectionMark;
- INT nHotItem;
- SHORT notifyFormat;
- HWND hwndNotify;
RECT rcList; /* This rectangle is really the window
* client rectangle possibly reduced by the
* horizontal scroll bar and/or header - see
* LISTVIEW_UpdateSize. This rectangle offset
* by the LISTVIEW_GetOrigin value is in
* client coordinates */
- SIZE iconSize;
- SIZE iconSpacing;
- SIZE iconStateSize;
- UINT uCallbackMask;
- HWND hwndHeader;
- HCURSOR hHotCursor;
- HFONT hDefaultFont;
- HFONT hFont;
- INT ntmHeight; /* Some cached metrics of the font used */
- INT ntmMaxCharWidth; /* by the listview to draw items */
- INT nEllipsisWidth;
- BOOL bRedraw; /* Turns on/off repaints & invalidations */
- BOOL bAutoarrange; /* Autoarrange flag when NOT in LVS_AUTOARRANGE */
- BOOL bFocus;
+
+ /* notification window */
+ SHORT notifyFormat;
+ HWND hwndNotify;
BOOL bDoChangeNotify; /* send change notification messages? */
- INT nFocusedItem;
- RECT rcFocus;
- DWORD dwStyle; /* the cached window GWL_STYLE */
- DWORD dwLvExStyle; /* extended listview style */
- DWORD uView; /* current view available through LVM_[G,S]ETVIEW */
+ UINT uCallbackMask;
+
+ /* tooltips */
+ HWND hwndToolTip;
+
+ /* items */
INT nItemCount; /* the number of items in the list */
HDPA hdpaItems; /* array ITEM_INFO pointers */
HDPA hdpaItemIds; /* array of ITEM_ID pointers */
HDPA hdpaPosX; /* maintains the (X, Y) coordinates of the */
HDPA hdpaPosY; /* items in LVS_ICON, and LVS_SMALLICON modes */
+ RANGES selectionRanges;
+ INT nSelectionMark; /* item to start next multiselection from */
+ INT nHotItem;
+ BOOL bAutoarrange; /* Autoarrange flag when NOT in LVS_AUTOARRANGE */
+
+ /* columns */
HDPA hdpaColumns; /* array of COLUMN_INFO pointers */
BOOL colRectsDirty; /* trigger column rectangles requery from header */
- POINT currIconPos; /* this is the position next icon will be placed */
- PFNLVCOMPARE pfnCompare;
+
+ /* item metrics */
+ BOOL bNoItemMetrics; /* flags if item metrics are not yet computed */
+ INT nItemHeight;
+ INT nItemWidth;
+
+ /* sorting */
+ PFNLVCOMPARE pfnCompare; /* sorting callback pointer */
LPARAM lParamSort;
+
+ /* style */
+ DWORD dwStyle; /* the cached window GWL_STYLE */
+ DWORD dwLvExStyle; /* extended listview style */
+ DWORD uView; /* current view available through LVM_[G,S]ETVIEW */
+
+ /* edit item */
HWND hwndEdit;
WNDPROC EditWndProc;
INT nEditLabelItem;
- INT nLButtonDownItem; /* tracks item to reset multiselection on WM_LBUTTONUP */
+ DELAYED_ITEM_EDIT itemEdit; /* Pointer to this structure will be the timer ID */
+
+ /* icons */
+ HIMAGELIST himlNormal;
+ HIMAGELIST himlSmall;
+ HIMAGELIST himlState;
+ SIZE iconSize;
+ SIZE iconSpacing;
+ SIZE iconStateSize;
+ POINT currIconPos; /* this is the position next icon will be placed */
+
+ /* header */
+ HWND hwndHeader;
+ INT xTrackLine; /* The x coefficient of the track line or -1 if none */
+
+ /* marquee selection */
+ BOOL bMarqueeSelect; /* marquee selection/highlight underway */
+ BOOL bScrolling;
+ RECT marqueeRect; /* absolute coordinates of marquee selection */
+ RECT marqueeDrawRect; /* relative coordinates for drawing marquee */
+ POINT marqueeOrigin; /* absolute coordinates of marquee click origin */
+
+ /* focus drawing */
+ BOOL bFocus; /* control has focus */
+ INT nFocusedItem;
+ RECT rcFocus; /* focus bounds */
+
+ /* colors */
+ HBRUSH hBkBrush;
+ COLORREF clrBk;
+ COLORREF clrText;
+ COLORREF clrTextBk;
+
+ /* font */
+ HFONT hDefaultFont;
+ HFONT hFont;
+ INT ntmHeight; /* Some cached metrics of the font used */
+ INT ntmMaxCharWidth; /* by the listview to draw items */
+ INT nEllipsisWidth;
+
+ /* mouse operation */
+ BOOL bLButtonDown;
+ BOOL bRButtonDown;
+ BOOL bDragging;
+ POINT ptClickPos; /* point where the user clicked */
+ INT nLButtonDownItem; /* tracks item to reset multiselection on WM_LBUTTONUP */
DWORD dwHoverTime;
- HWND hwndToolTip;
-
- DWORD cditemmode; /* Keep the custom draw flags for an item/row */
+ HCURSOR hHotCursor;
+ /* keyboard operation */
DWORD lastKeyPressTimestamp;
WPARAM charCode;
INT nSearchParamLength;
WCHAR szSearchParam[ MAX_PATH ];
- BOOL bIsDrawing;
- INT nMeasureItemHeight;
- INT xTrackLine; /* The x coefficient of the track line or -1 if none */
- DELAYED_ITEM_EDIT itemEdit; /* Pointer to this structure will be the timer ID */
- DWORD iVersion; /* CCM_[G,S]ETVERSION */
+ /* painting */
+ DWORD cditemmode; /* Keep the custom draw flags for an item/row */
+ BOOL bIsDrawing; /* Drawing in progress */
+ INT nMeasureItemHeight; /* WM_MEASUREITEM result */
+ BOOL bRedraw; /* WM_SETREDRAW switch */
+
+ /* misc */
+ DWORD iVersion; /* CCM_[G,S]ETVERSION */
} LISTVIEW_INFO;
/*
@@ -414,7 +451,6 @@ static void LISTVIEW_GetItemBox(const LISTVIEW_INFO *, INT, LPRECT);
static void LISTVIEW_GetItemOrigin(const LISTVIEW_INFO *, INT, LPPOINT);
static BOOL LISTVIEW_GetItemPosition(const LISTVIEW_INFO *, INT, LPPOINT);
static BOOL LISTVIEW_GetItemRect(const LISTVIEW_INFO *, INT, LPRECT);
-static INT LISTVIEW_GetLabelWidth(const LISTVIEW_INFO *, INT);
static void LISTVIEW_GetOrigin(const LISTVIEW_INFO *, LPPOINT);
static BOOL LISTVIEW_GetViewRect(const LISTVIEW_INFO *, LPRECT);
static void LISTVIEW_UpdateSize(LISTVIEW_INFO *);
@@ -426,10 +462,10 @@ static BOOL LISTVIEW_SetItemState(LISTVIEW_INFO *, INT, const LVITEMW *);
static LRESULT LISTVIEW_VScroll(LISTVIEW_INFO *, INT, INT, HWND);
static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *, INT, INT, HWND);
static BOOL LISTVIEW_EnsureVisible(LISTVIEW_INFO *, INT, BOOL);
-static HWND CreateEditLabelT(LISTVIEW_INFO *, LPCWSTR, DWORD, BOOL);
static HIMAGELIST LISTVIEW_SetImageList(LISTVIEW_INFO *, INT, HIMAGELIST);
static INT LISTVIEW_HitTest(const LISTVIEW_INFO *, LPLVHITTESTINFO, BOOL, BOOL);
static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *, BOOL, BOOL);
+static BOOL LISTVIEW_Scroll(LISTVIEW_INFO *, INT, INT);
/******** Text handling functions *************************************/
@@ -716,25 +752,37 @@ static int get_ansi_notification(UINT unicodeNotificationCode)
{
switch (unicodeNotificationCode)
{
+ case LVN_BEGINLABELEDITA:
case LVN_BEGINLABELEDITW: return LVN_BEGINLABELEDITA;
+ case LVN_ENDLABELEDITA:
case LVN_ENDLABELEDITW: return LVN_ENDLABELEDITA;
+ case LVN_GETDISPINFOA:
case LVN_GETDISPINFOW: return LVN_GETDISPINFOA;
+ case LVN_SETDISPINFOA:
case LVN_SETDISPINFOW: return LVN_SETDISPINFOA;
+ case LVN_ODFINDITEMA:
case LVN_ODFINDITEMW: return LVN_ODFINDITEMA;
+ case LVN_GETINFOTIPA:
case LVN_GETINFOTIPW: return LVN_GETINFOTIPA;
/* header forwards */
+ case HDN_TRACKA:
case HDN_TRACKW: return HDN_TRACKA;
+ case HDN_ENDTRACKA:
case HDN_ENDTRACKW: return HDN_ENDTRACKA;
case HDN_BEGINDRAG: return HDN_BEGINDRAG;
case HDN_ENDDRAG: return HDN_ENDDRAG;
+ case HDN_ITEMCHANGINGA:
case HDN_ITEMCHANGINGW: return HDN_ITEMCHANGINGA;
+ case HDN_ITEMCHANGEDA:
case HDN_ITEMCHANGEDW: return HDN_ITEMCHANGEDA;
+ case HDN_ITEMCLICKA:
case HDN_ITEMCLICKW: return HDN_ITEMCLICKA;
+ case HDN_DIVIDERDBLCLICKA:
case HDN_DIVIDERDBLCLICKW: return HDN_DIVIDERDBLCLICKA;
+ default: break;
}
- ERR("unknown notification %x\n", unicodeNotificationCode);
- assert(FALSE);
- return 0;
+ FIXME("unknown notification %x\n", unicodeNotificationCode);
+ return unicodeNotificationCode;
}
/* forwards header notifications to listview parent */
@@ -748,12 +796,12 @@ static LRESULT notify_forward_header(const LISTVIEW_INFO *infoPtr, const NMHEADE
/* on unicode format exit earlier */
if (infoPtr->notifyFormat == NFR_UNICODE)
- return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
- (WPARAM)lpnmh->hdr.idFrom, (LPARAM)lpnmh);
+ return SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, lpnmh->hdr.idFrom,
+ (LPARAM)lpnmh);
/* header always supplies unicode notifications,
all we have to do is to convert strings to ANSI */
- nmhA = *(NMHEADERA*)lpnmh;
+ nmhA = *(const NMHEADERA*)lpnmh;
if (lpnmh->pitem)
{
hditema = *(HDITEMA*)lpnmh->pitem;
@@ -778,8 +826,8 @@ static LRESULT notify_forward_header(const LISTVIEW_INFO *infoPtr, const NMHEADE
}
nmhA.hdr.code = get_ansi_notification(lpnmh->hdr.code);
- ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY,
- (WPARAM)nmhA.hdr.idFrom, (LPARAM)&nmhA);
+ ret = SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhA.hdr.idFrom,
+ (LPARAM)&nmhA);
/* cleanup */
Free(text);
@@ -1266,20 +1314,17 @@ static inline BOOL iterator_rangesitems(ITERATOR* i, RANGES ranges)
}
/***
- * Creates an iterator over the items which intersect lprc.
+ * Creates an iterator over the items which intersect frame.
+ * Uses absolute coordinates rather than compensating for the current offset.
*/
-static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *lprc)
+static BOOL iterator_frameditems_absolute(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *frame)
{
- RECT frame = *lprc, rcItem, rcTemp;
- POINT Origin;
+ RECT rcItem, rcTemp;
/* in case we fail, we want to return an empty iterator */
if (!iterator_empty(i)) return FALSE;
- LISTVIEW_GetOrigin(infoPtr, &Origin);
-
- TRACE("(lprc=%s)\n", wine_dbgstr_rect(lprc));
- OffsetRect(&frame, -Origin.x, -Origin.y);
+ TRACE("(frame=%s)\n", wine_dbgstr_rect(frame));
if (infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)
{
@@ -1288,7 +1333,7 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
if (infoPtr->uView == LV_VIEW_ICON && infoPtr->nFocusedItem != -1)
{
LISTVIEW_GetItemBox(infoPtr, infoPtr->nFocusedItem, &rcItem);
- if (IntersectRect(&rcTemp, &rcItem, lprc))
+ if (IntersectRect(&rcTemp, &rcItem, frame))
i->nSpecial = infoPtr->nFocusedItem;
}
if (!(iterator_rangesitems(i, ranges_create(50)))) return FALSE;
@@ -1300,7 +1345,7 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
rcItem.top = (LONG_PTR)DPA_GetPtr(infoPtr->hdpaPosY, nItem);
rcItem.right = rcItem.left + infoPtr->nItemWidth;
rcItem.bottom = rcItem.top + infoPtr->nItemHeight;
- if (IntersectRect(&rcTemp, &rcItem, &frame))
+ if (IntersectRect(&rcTemp, &rcItem, frame))
ranges_additem(i->ranges, nItem);
}
return TRUE;
@@ -1309,11 +1354,11 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
{
RANGE range;
- if (frame.left >= infoPtr->nItemWidth) return TRUE;
- if (frame.top >= infoPtr->nItemHeight * infoPtr->nItemCount) return TRUE;
+ if (frame->left >= infoPtr->nItemWidth) return TRUE;
+ if (frame->top >= infoPtr->nItemHeight * infoPtr->nItemCount) return TRUE;
- range.lower = max(frame.top / infoPtr->nItemHeight, 0);
- range.upper = min((frame.bottom - 1) / infoPtr->nItemHeight, infoPtr->nItemCount - 1) + 1;
+ range.lower = max(frame->top / infoPtr->nItemHeight, 0);
+ range.upper = min((frame->bottom - 1) / infoPtr->nItemHeight, infoPtr->nItemCount - 1) + 1;
if (range.upper <= range.lower) return TRUE;
if (!iterator_rangeitems(i, range)) return FALSE;
TRACE(" report=%s\n", debugrange(&i->range));
@@ -1321,8 +1366,8 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
else
{
INT nPerCol = max((infoPtr->rcList.bottom - infoPtr->rcList.top) / infoPtr->nItemHeight, 1);
- INT nFirstRow = max(frame.top / infoPtr->nItemHeight, 0);
- INT nLastRow = min((frame.bottom - 1) / infoPtr->nItemHeight, nPerCol - 1);
+ INT nFirstRow = max(frame->top / infoPtr->nItemHeight, 0);
+ INT nLastRow = min((frame->bottom - 1) / infoPtr->nItemHeight, nPerCol - 1);
INT nFirstCol;
INT nLastCol;
INT lower;
@@ -1331,13 +1376,13 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
if (infoPtr->nItemWidth)
{
- nFirstCol = max(frame.left / infoPtr->nItemWidth, 0);
- nLastCol = min((frame.right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
+ nFirstCol = max(frame->left / infoPtr->nItemWidth, 0);
+ nLastCol = min((frame->right - 1) / infoPtr->nItemWidth, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
}
else
{
- nFirstCol = max(frame.left, 0);
- nLastCol = min(frame.right - 1, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
+ nFirstCol = max(frame->left, 0);
+ nLastCol = min(frame->right - 1, (infoPtr->nItemCount + nPerCol - 1) / nPerCol);
}
lower = nFirstCol * nPerCol + nFirstRow;
@@ -1362,6 +1407,22 @@ static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, cons
return TRUE;
}
+/***
+ * Creates an iterator over the items which intersect lprc.
+ */
+static BOOL iterator_frameditems(ITERATOR* i, const LISTVIEW_INFO* infoPtr, const RECT *lprc)
+{
+ RECT frame = *lprc;
+ POINT Origin;
+
+ TRACE("(lprc=%s)\n", wine_dbgstr_rect(lprc));
+
+ LISTVIEW_GetOrigin(infoPtr, &Origin);
+ OffsetRect(&frame, -Origin.x, -Origin.y);
+
+ return iterator_frameditems_absolute(i, infoPtr, &frame);
+}
+
/***
* Creates an iterator over the items which intersect the visible region of hdc.
*/
@@ -1525,7 +1586,7 @@ static INT LISTVIEW_CreateHeader(LISTVIEW_INFO *infoPtr)
SendMessageW(infoPtr->hwndHeader, HDM_SETUNICODEFORMAT, TRUE, 0);
/* set header font */
- SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, (LPARAM)TRUE);
+ SendMessageW(infoPtr->hwndHeader, WM_SETFONT, (WPARAM)infoPtr->hFont, TRUE);
LISTVIEW_UpdateSize(infoPtr);
@@ -1536,6 +1597,13 @@ static inline void LISTVIEW_GetHeaderRect(const LISTVIEW_INFO *infoPtr, INT nSub
{
*lprc = LISTVIEW_GetColumnInfo(infoPtr, nSubItem)->rcHeader;
}
+
+static inline BOOL LISTVIEW_IsHeaderEnabled(const LISTVIEW_INFO *infoPtr)
+{
+ return (infoPtr->uView == LV_VIEW_DETAILS ||
+ infoPtr->dwLvExStyle & LVS_EX_HEADERINALLVIEWS) &&
+ !(infoPtr->dwStyle & LVS_NOCOLUMNHEADER);
+}
static inline BOOL LISTVIEW_GetItemW(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem)
{
@@ -1683,14 +1751,15 @@ static inline INT LISTVIEW_GetCountPerColumn(const LISTVIEW_INFO *infoPtr)
*/
static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, LPARAM keyData)
{
- INT nItem;
- INT endidx,idx;
- LVITEMW item;
WCHAR buffer[MAX_PATH];
- DWORD lastKeyPressTimestamp = infoPtr->lastKeyPressTimestamp;
+ INT endidx, startidx;
+ DWORD prevTime;
+ LVITEMW item;
+ INT nItem;
+ INT diff;
/* simple parameter checking */
- if (!charCode || !keyData) return 0;
+ if (!charCode || !keyData || infoPtr->nItemCount == 0) return 0;
/* only allow the valid WM_CHARs through */
if (!isalnumW(charCode) &&
@@ -1705,86 +1774,95 @@ static INT LISTVIEW_ProcessLetterKeys(LISTVIEW_INFO *infoPtr, WPARAM charCode, L
charCode != '<' && charCode != ',' && charCode != '~')
return 0;
- /* if there's one item or less, there is no where to go */
- if (infoPtr->nItemCount <= 1) return 0;
-
/* update the search parameters */
+ prevTime = infoPtr->lastKeyPressTimestamp;
infoPtr->lastKeyPressTimestamp = GetTickCount();
- if (infoPtr->lastKeyPressTimestamp - lastKeyPressTimestamp < KEY_DELAY) {
- if (infoPtr->nSearchParamLength < MAX_PATH-1)
- infoPtr->szSearchParam[infoPtr->nSearchParamLength++]=charCode;
+ diff = infoPtr->lastKeyPressTimestamp - prevTime;
+
+ if (diff >= 0 && diff < KEY_DELAY)
+ {
+ if (infoPtr->nSearchParamLength < MAX_PATH - 1)
+ infoPtr->szSearchParam[infoPtr->nSearchParamLength++] = charCode;
+
if (infoPtr->charCode != charCode)
infoPtr->charCode = charCode = 0;
- } else {
- infoPtr->charCode=charCode;
- infoPtr->szSearchParam[0]=charCode;
- infoPtr->nSearchParamLength=1;
- /* Redundant with the 1 char string */
- charCode=0;
+ }
+ else
+ {
+ infoPtr->charCode = charCode;
+ infoPtr->szSearchParam[0] = charCode;
+ infoPtr->nSearchParamLength = 1;
+ /* redundant with the 1 char string */
+ charCode = 0;
}
/* and search from the current position */
- nItem=-1;
- if (infoPtr->nFocusedItem >= 0) {
- endidx=infoPtr->nFocusedItem;
- idx=endidx;
- /* if looking for single character match,
- * then we must always move forward
- */
- if (infoPtr->nSearchParamLength == 1)
- idx++;
- } else {
- endidx=infoPtr->nItemCount;
- idx=0;
- }
+ nItem = -1;
+ endidx = infoPtr->nItemCount;
- /* Let application handle this for virtual listview */
+ /* should start from next after focused item, so next item that matches
+ will be selected, if there isn't any and focused matches it will be selected
+ on second search stage from beginning of the list */
+ if (infoPtr->nFocusedItem >= 0 && infoPtr->nItemCount > 1)
+ startidx = infoPtr->nFocusedItem + 1;
+ else
+ startidx = 0;
+
+ /* let application handle this for virtual listview */
if (infoPtr->dwStyle & LVS_OWNERDATA)
{
NMLVFINDITEMW nmlv;
- LVFINDINFOW lvfi;
- ZeroMemory(&lvfi, sizeof(lvfi));
- lvfi.flags = (LVFI_WRAP | LVFI_PARTIAL);
- infoPtr->szSearchParam[infoPtr->nSearchParamLength] = '\0';
- lvfi.psz = infoPtr->szSearchParam;
- nmlv.iStart = idx;
- nmlv.lvfi = lvfi;
+ memset(&nmlv.lvfi, 0, sizeof(nmlv.lvfi));
+ nmlv.lvfi.flags = (LVFI_WRAP | LVFI_PARTIAL);
+ nmlv.lvfi.psz = infoPtr->szSearchParam;
+ nmlv.iStart = startidx;
+
+ infoPtr->szSearchParam[infoPtr->nSearchParamLength] = 0;
nItem = notify_hdr(infoPtr, LVN_ODFINDITEMW, (LPNMHDR)&nmlv.hdr);
-
- if (nItem != -1)
- LISTVIEW_KeySelection(infoPtr, nItem, FALSE);
-
- return 0;
}
+ else
+ {
+ INT i = startidx;
- do {
- if (idx == infoPtr->nItemCount) {
- if (endidx == infoPtr->nItemCount || endidx == 0)
+ /* first search in [startidx, endidx), on failure continue in [0, startidx) */
+ while (1)
+ {
+ /* start from first item if not found with >= startidx */
+ if (i == infoPtr->nItemCount && startidx > 0)
+ {
+ endidx = startidx;
+ startidx = 0;
+ }
+
+ for (i = startidx; i < endidx; i++)
+ {
+ /* retrieve text */
+ item.mask = LVIF_TEXT;
+ item.iItem = i;
+ item.iSubItem = 0;
+ item.pszText = buffer;
+ item.cchTextMax = MAX_PATH;
+ if (!LISTVIEW_GetItemW(infoPtr, &item)) return 0;
+
+ if (lstrncmpiW(item.pszText, infoPtr->szSearchParam, infoPtr->nSearchParamLength) == 0)
+ {
+ nItem = i;
+ break;
+ }
+ else if (nItem == -1 && lstrncmpiW(item.pszText, infoPtr->szSearchParam, 1) == 0)
+ {
+ /* this would work but we must keep looking for a longer match */
+ nItem = i;
+ }
+ }
+
+ /* found something or second search completed with any result */
+ if (nItem != -1 || endidx != infoPtr->nItemCount)
break;
- idx=0;
- }
-
- /* get item */
- item.mask = LVIF_TEXT;
- item.iItem = idx;
- item.iSubItem = 0;
- item.pszText = buffer;
- item.cchTextMax = MAX_PATH;
- if (!LISTVIEW_GetItemW(infoPtr, &item)) return 0;
-
- /* check for a match */
- if (lstrncmpiW(item.pszText,infoPtr->szSearchParam,infoPtr->nSearchParamLength) == 0) {
- nItem=idx;
- break;
- } else if ( (charCode != 0) && (nItem == -1) && (nItem != infoPtr->nFocusedItem) &&
- (lstrncmpiW(item.pszText,infoPtr->szSearchParam,1) == 0) ) {
- /* This would work but we must keep looking for a longer match */
- nItem=idx;
- }
- idx++;
- } while (idx != endidx);
+ };
+ }
if (nItem != -1)
LISTVIEW_KeySelection(infoPtr, nItem, FALSE);
@@ -1874,7 +1952,23 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
if (LISTVIEW_GetViewRect(infoPtr, &rcView)) horzInfo.nMax = rcView.right - rcView.left;
}
-
+
+ if (LISTVIEW_IsHeaderEnabled(infoPtr))
+ {
+ if (DPA_GetPtrCount(infoPtr->hdpaColumns))
+ {
+ RECT rcHeader;
+ INT index;
+
+ index = SendMessageW(infoPtr->hwndHeader, HDM_ORDERTOINDEX,
+ DPA_GetPtrCount(infoPtr->hdpaColumns) - 1, 0);
+
+ LISTVIEW_GetHeaderRect(infoPtr, index, &rcHeader);
+ horzInfo.nMax = rcHeader.right;
+ TRACE("horzInfo.nMax=%d\n", horzInfo.nMax);
+ }
+ }
+
horzInfo.fMask = SIF_RANGE | SIF_PAGE;
horzInfo.nMax = max(horzInfo.nMax - 1, 0);
dx = GetScrollPos(infoPtr->hwndSelf, SB_HORZ);
@@ -1924,7 +2018,7 @@ static void LISTVIEW_UpdateScroll(const LISTVIEW_INFO *infoPtr)
}
/* Update the Header Control */
- if (infoPtr->uView == LV_VIEW_DETAILS)
+ if (infoPtr->hwndHeader)
{
horzInfo.fMask = SIF_POS;
GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &horzInfo);
@@ -2733,15 +2827,27 @@ static INT LISTVIEW_CalculateItemWidth(const LISTVIEW_INFO *infoPtr)
}
else /* LV_VIEW_SMALLICON, or LV_VIEW_LIST */
{
+ WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
+ LVITEMW lvItem;
INT i;
-
+
+ lvItem.mask = LVIF_TEXT;
+ lvItem.iSubItem = 0;
+
for (i = 0; i < infoPtr->nItemCount; i++)
- nItemWidth = max(LISTVIEW_GetLabelWidth(infoPtr, i), nItemWidth);
+ {
+ lvItem.iItem = i;
+ lvItem.pszText = szDispText;
+ lvItem.cchTextMax = DISP_TEXT_SIZE;
+ if (LISTVIEW_GetItemW(infoPtr, &lvItem))
+ nItemWidth = max(LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE),
+ nItemWidth);
+ }
if (infoPtr->himlSmall) nItemWidth += infoPtr->iconSize.cx;
if (infoPtr->himlState) nItemWidth += infoPtr->iconStateSize.cx;
- nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING);
+ nItemWidth = max(DEFAULT_COLUMN_WIDTH, nItemWidth + WIDTH_PADDING);
}
return nItemWidth;
@@ -3091,28 +3197,30 @@ static BOOL ranges_del(RANGES ranges, RANGE range)
TRACE("(%s)\n", debugrange(&range));
ranges_check(ranges, "before del");
-
+
/* we don't use DPAS_SORTED here, since we need *
* to find the first overlapping range */
index = DPA_Search(ranges->hdpa, &range, 0, ranges_cmp, 0, 0);
- while(index != -1)
+ while(index != -1)
{
chkrgn = DPA_GetPtr(ranges->hdpa, index);
-
- TRACE("Matches range %s @%d\n", debugrange(chkrgn), index);
+
+ TRACE("Matches range %s @%d\n", debugrange(chkrgn), index);
/* case 1: Same range */
if ( (chkrgn->upper == range.upper) &&
(chkrgn->lower == range.lower) )
{
DPA_DeletePtr(ranges->hdpa, index);
+ Free(chkrgn);
break;
}
/* case 2: engulf */
else if ( (chkrgn->upper <= range.upper) &&
- (chkrgn->lower >= range.lower) )
+ (chkrgn->lower >= range.lower) )
{
DPA_DeletePtr(ranges->hdpa, index);
+ Free(chkrgn);
}
/* case 3: overlap upper */
else if ( (chkrgn->upper <= range.upper) &&
@@ -3536,7 +3644,7 @@ static BOOL LISTVIEW_GetItemAtPt(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVIte
return LISTVIEW_GetItemT(infoPtr, lpLVItem, TRUE);
}
-static inline BOOL LISTVIEW_isHotTracking(const LISTVIEW_INFO *infoPtr)
+static inline BOOL LISTVIEW_IsHotTracking(const LISTVIEW_INFO *infoPtr)
{
return ((infoPtr->dwLvExStyle & LVS_EX_TRACKSELECT) ||
(infoPtr->dwLvExStyle & LVS_EX_ONECLICKACTIVATE) ||
@@ -3561,9 +3669,13 @@ static inline BOOL LISTVIEW_isHotTracking(const LISTVIEW_INFO *infoPtr)
* over the item for a certain period of time.
*
*/
-static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, INT y)
+static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, INT x, INT y)
{
- if (LISTVIEW_isHotTracking(infoPtr))
+ NMHDR hdr;
+
+ if (notify_hdr(infoPtr, NM_HOVER, &hdr)) return 0;
+
+ if (LISTVIEW_IsHotTracking(infoPtr))
{
LVITEMW item;
POINT pt;
@@ -3573,11 +3685,204 @@ static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, I
if (LISTVIEW_GetItemAtPt(infoPtr, &item, pt))
LISTVIEW_SetSelection(infoPtr, item.iItem);
+
+ SetFocus(infoPtr->hwndSelf);
}
return 0;
}
+#define SCROLL_LEFT 0x1
+#define SCROLL_RIGHT 0x2
+#define SCROLL_UP 0x4
+#define SCROLL_DOWN 0x8
+
+/***
+ * DESCRIPTION:
+ * Utility routine to draw and highlight items within a marquee selection rectangle.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] coords_orig : original co-ordinates of the cursor
+ * [I] coords_offs : offsetted coordinates of the cursor
+ * [I] offset : offset amount
+ * [I] scroll : Bitmask of which directions we should scroll, if at all
+ *
+ * RETURN:
+ * None.
+ */
+static void LISTVIEW_MarqueeHighlight(LISTVIEW_INFO *infoPtr, LPPOINT coords_orig, LPPOINT coords_offs, LPPOINT offset, INT scroll)
+{
+ BOOL controlDown = FALSE;
+ LVITEMW item;
+ ITERATOR i;
+ RECT rect;
+
+ if (coords_offs->x > infoPtr->marqueeOrigin.x)
+ {
+ rect.left = infoPtr->marqueeOrigin.x;
+ rect.right = coords_offs->x;
+ }
+ else
+ {
+ rect.left = coords_offs->x;
+ rect.right = infoPtr->marqueeOrigin.x;
+ }
+
+ if (coords_offs->y > infoPtr->marqueeOrigin.y)
+ {
+ rect.top = infoPtr->marqueeOrigin.y;
+ rect.bottom = coords_offs->y;
+ }
+ else
+ {
+ rect.top = coords_offs->y;
+ rect.bottom = infoPtr->marqueeOrigin.y;
+ }
+
+ /* Cancel out the old marquee rectangle and draw the new one */
+ LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeDrawRect);
+
+ /* Scroll by the appropriate distance if applicable - speed up scrolling as
+ the cursor is further away */
+
+ if ((scroll & SCROLL_LEFT) && (coords_orig->x <= 0))
+ LISTVIEW_Scroll(infoPtr, coords_orig->x, 0);
+
+ if ((scroll & SCROLL_RIGHT) && (coords_orig->x >= infoPtr->rcList.right))
+ LISTVIEW_Scroll(infoPtr, (coords_orig->x - infoPtr->rcList.right), 0);
+
+ if ((scroll & SCROLL_UP) && (coords_orig->y <= 0))
+ LISTVIEW_Scroll(infoPtr, 0, coords_orig->y);
+
+ if ((scroll & SCROLL_DOWN) && (coords_orig->y >= infoPtr->rcList.bottom))
+ LISTVIEW_Scroll(infoPtr, 0, (coords_orig->y - infoPtr->rcList.bottom));
+
+ /* Invert the items in the old marquee rectangle */
+ iterator_frameditems_absolute(&i, infoPtr, &infoPtr->marqueeRect);
+
+ while (iterator_next(&i))
+ {
+ if (i.nItem > -1)
+ {
+ if (LISTVIEW_GetItemState(infoPtr, i.nItem, LVIS_SELECTED) == LVIS_SELECTED)
+ item.state = 0;
+ else
+ item.state = LVIS_SELECTED;
+
+ item.stateMask = LVIS_SELECTED;
+
+ LISTVIEW_SetItemState(infoPtr, i.nItem, &item);
+ }
+ }
+
+ iterator_destroy(&i);
+
+ CopyRect(&infoPtr->marqueeRect, &rect);
+
+ CopyRect(&infoPtr->marqueeDrawRect, &rect);
+ OffsetRect(&infoPtr->marqueeDrawRect, offset->x, offset->y);
+
+ /* Iterate over the items within our marquee rectangle */
+ iterator_frameditems_absolute(&i, infoPtr, &infoPtr->marqueeRect);
+
+ if (GetKeyState(VK_CONTROL) & 0x8000)
+ controlDown = TRUE;
+
+ while (iterator_next(&i))
+ {
+ if (i.nItem > -1)
+ {
+ /* If CTRL is pressed, invert. If not, always select the item. */
+ if ((controlDown) && (LISTVIEW_GetItemState(infoPtr, i.nItem, LVIS_SELECTED)))
+ item.state = 0;
+ else
+ item.state = LVIS_SELECTED;
+
+ item.stateMask = LVIS_SELECTED;
+
+ LISTVIEW_SetItemState(infoPtr, i.nItem, &item);
+ }
+ }
+
+ iterator_destroy(&i);
+ LISTVIEW_InvalidateRect(infoPtr, &rect);
+}
+
+/***
+ * DESCRIPTION:
+ * Called when we are in a marquee selection that involves scrolling the listview (ie,
+ * the cursor is outside the bounds of the client area). This is a TIMERPROC.
+ *
+ * PARAMETER(S):
+ * [I] hwnd : Handle to the listview
+ * [I] uMsg : WM_TIMER (ignored)
+ * [I] idEvent : The timer ID interpreted as a pointer to a LISTVIEW_INFO struct
+ * [I] dwTimer : The elapsed time (ignored)
+ *
+ * RETURN:
+ * None.
+ */
+static VOID CALLBACK LISTVIEW_ScrollTimer(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
+{
+ LISTVIEW_INFO *infoPtr;
+ SCROLLINFO scrollInfo;
+ POINT coords_orig;
+ POINT coords_offs;
+ POINT offset;
+ INT scroll = 0;
+
+ infoPtr = (LISTVIEW_INFO *) idEvent;
+
+ if (!infoPtr)
+ return;
+
+ /* Get the current cursor position and convert to client coordinates */
+ GetCursorPos(&coords_orig);
+ ScreenToClient(hWnd, &coords_orig);
+
+ /* Ensure coordinates are within client bounds */
+ coords_offs.x = max(min(coords_orig.x, infoPtr->rcList.right), 0);
+ coords_offs.y = max(min(coords_orig.y, infoPtr->rcList.bottom), 0);
+
+ /* Get offset */
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ /* Offset coordinates by the appropriate amount */
+ coords_offs.x -= offset.x;
+ coords_offs.y -= offset.y;
+
+ scrollInfo.cbSize = sizeof(SCROLLINFO);
+ scrollInfo.fMask = SIF_ALL;
+
+ /* Work out in which directions we can scroll */
+ if (GetScrollInfo(infoPtr->hwndSelf, SB_VERT, &scrollInfo))
+ {
+ if (scrollInfo.nPos != scrollInfo.nMin)
+ scroll |= SCROLL_UP;
+
+ if (((scrollInfo.nPage + scrollInfo.nPos) - 1) != scrollInfo.nMax)
+ scroll |= SCROLL_DOWN;
+ }
+
+ if (GetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo))
+ {
+ if (scrollInfo.nPos != scrollInfo.nMin)
+ scroll |= SCROLL_LEFT;
+
+ if (((scrollInfo.nPage + scrollInfo.nPos) - 1) != scrollInfo.nMax)
+ scroll |= SCROLL_RIGHT;
+ }
+
+ if (((coords_orig.x <= 0) && (scroll & SCROLL_LEFT)) ||
+ ((coords_orig.y <= 0) && (scroll & SCROLL_UP)) ||
+ ((coords_orig.x >= infoPtr->rcList.right) && (scroll & SCROLL_RIGHT)) ||
+ ((coords_orig.y >= infoPtr->rcList.bottom) && (scroll & SCROLL_DOWN)))
+ {
+ LISTVIEW_MarqueeHighlight(infoPtr, &coords_orig, &coords_offs, &offset, scroll);
+ }
+}
+
/***
* DESCRIPTION:
* Called whenever WM_MOUSEMOVE is received.
@@ -3592,8 +3897,6 @@ static LRESULT LISTVIEW_MouseHover(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, I
*/
static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, INT y)
{
- TRACKMOUSEEVENT trackinfo;
-
if (!(fwKeys & MK_LBUTTON))
infoPtr->bLButtonDown = FALSE;
@@ -3605,6 +3908,48 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
WORD wDragWidth = GetSystemMetrics(SM_CXDRAG);
WORD wDragHeight= GetSystemMetrics(SM_CYDRAG);
+ if (infoPtr->bMarqueeSelect)
+ {
+ POINT coords_orig;
+ POINT coords_offs;
+ POINT offset;
+
+ coords_orig.x = x;
+ coords_orig.y = y;
+
+ /* Get offset */
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ /* Ensure coordinates are within client bounds */
+ coords_offs.x = max(min(x, infoPtr->rcList.right), 0);
+ coords_offs.y = max(min(y, infoPtr->rcList.bottom), 0);
+
+ /* Offset coordinates by the appropriate amount */
+ coords_offs.x -= offset.x;
+ coords_offs.y -= offset.y;
+
+ /* Enable the timer if we're going outside our bounds, in case the user doesn't
+ move the mouse again */
+
+ if ((x <= 0) || (y <= 0) || (x >= infoPtr->rcList.right) ||
+ (y >= infoPtr->rcList.bottom))
+ {
+ if (!infoPtr->bScrolling)
+ {
+ infoPtr->bScrolling = TRUE;
+ SetTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr, 1, LISTVIEW_ScrollTimer);
+ }
+ }
+ else
+ {
+ infoPtr->bScrolling = FALSE;
+ KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
+ }
+
+ LISTVIEW_MarqueeHighlight(infoPtr, &coords_orig, &coords_offs, &offset, 0);
+ return 0;
+ }
+
rect.left = infoPtr->ptClickPos.x - wDragWidth;
rect.right = infoPtr->ptClickPos.x + wDragWidth;
rect.top = infoPtr->ptClickPos.y - wDragHeight;
@@ -3640,17 +3985,42 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
if (!infoPtr->bDragging)
{
- NMLISTVIEW nmlv;
-
lvHitTestInfo.pt = infoPtr->ptClickPos;
LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, TRUE, TRUE);
- ZeroMemory(&nmlv, sizeof(nmlv));
- nmlv.iItem = lvHitTestInfo.iItem;
- nmlv.ptAction = infoPtr->ptClickPos;
+ /* If the click is outside the range of an item, begin a
+ highlight. If not, begin an item drag. */
+ if (lvHitTestInfo.iItem == -1)
+ {
+ NMHDR hdr;
- notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv);
- infoPtr->bDragging = TRUE;
+ /* If we're allowing multiple selections, send notification.
+ If return value is non-zero, cancel. */
+ if (!(infoPtr->dwStyle & LVS_SINGLESEL) && (notify_hdr(infoPtr, LVN_MARQUEEBEGIN, &hdr) == 0))
+ {
+ /* Store the absolute coordinates of the click */
+ POINT offset;
+ LISTVIEW_GetOrigin(infoPtr, &offset);
+
+ infoPtr->marqueeOrigin.x = infoPtr->ptClickPos.x - offset.x;
+ infoPtr->marqueeOrigin.y = infoPtr->ptClickPos.y - offset.y;
+
+ /* Begin selection and capture mouse */
+ infoPtr->bMarqueeSelect = TRUE;
+ SetCapture(infoPtr->hwndSelf);
+ }
+ }
+ else
+ {
+ NMLISTVIEW nmlv;
+
+ ZeroMemory(&nmlv, sizeof(nmlv));
+ nmlv.iItem = lvHitTestInfo.iItem;
+ nmlv.ptAction = infoPtr->ptClickPos;
+
+ notify_listview(infoPtr, LVN_BEGINDRAG, &nmlv);
+ infoPtr->bDragging = TRUE;
+ }
}
return 0;
@@ -3658,18 +4028,19 @@ static LRESULT LISTVIEW_MouseMove(LISTVIEW_INFO *infoPtr, WORD fwKeys, INT x, IN
}
/* see if we are supposed to be tracking mouse hovering */
- if (LISTVIEW_isHotTracking(infoPtr)) {
- /* fill in the trackinfo struct */
+ if (LISTVIEW_IsHotTracking(infoPtr)) {
+ TRACKMOUSEEVENT trackinfo;
+
trackinfo.cbSize = sizeof(TRACKMOUSEEVENT);
trackinfo.dwFlags = TME_QUERY;
- trackinfo.hwndTrack = infoPtr->hwndSelf;
- trackinfo.dwHoverTime = infoPtr->dwHoverTime;
/* see if we are already tracking this hwnd */
_TrackMouseEvent(&trackinfo);
- if(!(trackinfo.dwFlags & TME_HOVER)) {
- trackinfo.dwFlags = TME_HOVER;
+ if(!(trackinfo.dwFlags & TME_HOVER) || trackinfo.hwndTrack != infoPtr->hwndSelf) {
+ trackinfo.dwFlags = TME_HOVER;
+ trackinfo.dwHoverTime = infoPtr->dwHoverTime;
+ trackinfo.hwndTrack = infoPtr->hwndSelf;
/* call TRACKMOUSEEVENT so we receive WM_MOUSEHOVER messages */
_TrackMouseEvent(&trackinfo);
@@ -3914,12 +4285,11 @@ static BOOL set_sub_item(const LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
*bChanged = TRUE;
}
- if (lpLVItem->mask & LVIF_IMAGE)
- if (lpSubItem->hdr.iImage != lpLVItem->iImage)
- {
- lpSubItem->hdr.iImage = lpLVItem->iImage;
- *bChanged = TRUE;
- }
+ if ((lpLVItem->mask & LVIF_IMAGE) && (lpSubItem->hdr.iImage != lpLVItem->iImage))
+ {
+ lpSubItem->hdr.iImage = lpLVItem->iImage;
+ *bChanged = TRUE;
+ }
if ((lpLVItem->mask & LVIF_TEXT) && textcmpWT(lpSubItem->hdr.pszText, lpLVItem->pszText, isW))
{
@@ -4089,7 +4459,7 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
lvItem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM;
if (nSubItem == 0) lvItem.mask |= LVIF_STATE;
if (infoPtr->uView == LV_VIEW_DETAILS) lvItem.mask |= LVIF_INDENT;
- lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK;
+ lvItem.stateMask = LVIS_SELECTED | LVIS_FOCUSED | LVIS_STATEIMAGEMASK | LVIS_CUT;
lvItem.iItem = nItem;
lvItem.iSubItem = nSubItem;
lvItem.state = 0;
@@ -4192,14 +4562,23 @@ static BOOL LISTVIEW_DrawItem(LISTVIEW_INFO *infoPtr, HDC hdc, INT nItem, INT nS
}
}
- /* small icons */
+ /* item icons */
himl = (infoPtr->uView == LV_VIEW_ICON ? infoPtr->himlNormal : infoPtr->himlSmall);
if (himl && lvItem.iImage >= 0 && !IsRectEmpty(&rcIcon))
{
+ UINT style;
+
TRACE("iImage=%d\n", lvItem.iImage);
+
+ if (lvItem.state & (LVIS_SELECTED | LVIS_CUT) && infoPtr->bFocus)
+ style = ILD_SELECTED;
+ else
+ style = ILD_NORMAL;
+
ImageList_DrawEx(himl, lvItem.iImage, hdc, rcIcon.left, rcIcon.top,
- rcIcon.right - rcIcon.left, rcIcon.bottom - rcIcon.top, infoPtr->clrBk, CLR_DEFAULT,
- (lvItem.state & LVIS_SELECTED) && (infoPtr->bFocus) ? ILD_SELECTED : ILD_NORMAL);
+ rcIcon.right - rcIcon.left, rcIcon.bottom - rcIcon.top, infoPtr->clrBk,
+ lvItem.state & LVIS_CUT ? RGB(255, 255, 255) : CLR_DEFAULT,
+ style);
}
/* Don't bother painting item being edited */
@@ -4643,6 +5022,10 @@ enddraw:
if ((infoPtr->uView == LV_VIEW_DETAILS) && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
LISTVIEW_RefreshReportGrid(infoPtr, hdc);
+ /* Draw marquee rectangle if appropriate */
+ if (infoPtr->bMarqueeSelect)
+ DrawFocusRect(hdc, &infoPtr->marqueeDrawRect);
+
if (cdmode & CDRF_NOTIFYPOSTPAINT)
notify_postpaint(infoPtr, &nmlvcd);
@@ -4744,10 +5127,46 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
dwViewRect = MAKELONG(wWidth, wHeight);
}
+ else if (infoPtr->uView == LV_VIEW_ICON)
+ {
+ UINT rows,cols;
+ UINT nItemWidth;
+ UINT nItemHeight;
+
+ nItemWidth = infoPtr->iconSpacing.cx;
+ nItemHeight = infoPtr->iconSpacing.cy;
+
+ if (nItemCount == -1)
+ nItemCount = infoPtr->nItemCount;
+
+ if (wWidth == 0xffff)
+ wWidth = infoPtr->rcList.right - infoPtr->rcList.left;
+
+ if (wWidth < nItemWidth)
+ wWidth = nItemWidth;
+
+ cols = wWidth / nItemWidth;
+ if (cols > nItemCount)
+ cols = nItemCount;
+ if (cols < 1)
+ cols = 1;
+
+ if (nItemCount)
+ {
+ rows = nItemCount / cols;
+ if (nItemCount % cols)
+ rows++;
+ }
+ else
+ rows = 0;
+
+ wHeight = (nItemHeight * rows)+2;
+ wWidth = (nItemWidth * cols)+2;
+
+ dwViewRect = MAKELONG(wWidth, wHeight);
+ }
else if (infoPtr->uView == LV_VIEW_SMALLICON)
FIXME("uView == LV_VIEW_SMALLICON: not implemented\n");
- else if (infoPtr->uView == LV_VIEW_ICON)
- FIXME("uView == LV_VIEW_ICON: not implemented\n");
return dwViewRect;
}
@@ -4764,11 +5183,14 @@ static DWORD LISTVIEW_ApproximateViewRect(const LISTVIEW_INFO *infoPtr, INT nIte
*/
static LRESULT LISTVIEW_CancelEditLabel(LISTVIEW_INFO *infoPtr)
{
- /* handle value will be lost after LISTVIEW_EndEditLabelT */
- HWND edit = infoPtr->hwndEdit;
+ if (infoPtr->hwndEdit)
+ {
+ /* handle value will be lost after LISTVIEW_EndEditLabelT */
+ HWND edit = infoPtr->hwndEdit;
- LISTVIEW_EndEditLabelT(infoPtr, TRUE, IsWindowUnicode(infoPtr->hwndEdit));
- SendMessageW(edit, WM_CLOSE, 0, 0);
+ LISTVIEW_EndEditLabelT(infoPtr, TRUE, IsWindowUnicode(infoPtr->hwndEdit));
+ SendMessageW(edit, WM_CLOSE, 0, 0);
+ }
return TRUE;
}
@@ -4795,7 +5217,7 @@ static HIMAGELIST LISTVIEW_CreateDragImage(LISTVIEW_INFO *infoPtr, INT iItem, LP
HIMAGELIST dragList = 0;
TRACE("iItem=%d Count=%d\n", iItem, infoPtr->nItemCount);
- if (iItem < 0 || iItem >= infoPtr->nItemCount)
+ if (iItem < 0 || iItem >= infoPtr->nItemCount || !lppt)
return 0;
rcItem.left = LVIR_BOUNDS;
@@ -4855,6 +5277,8 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
HDPA hdpaSubItems = NULL;
BOOL bSuppress;
ITEMHDR *hdrItem;
+ ITEM_INFO *lpItem;
+ ITEM_ID *lpID;
INT i, j;
TRACE("()\n");
@@ -4876,13 +5300,20 @@ static BOOL LISTVIEW_DeleteAllItems(LISTVIEW_INFO *infoPtr, BOOL destroy)
{
if (!(infoPtr->dwStyle & LVS_OWNERDATA))
{
- /* send LVN_DELETEITEM notification, if not suppressed
- and if it is not a virtual listview */
- if (!bSuppress) notify_deleteitem(infoPtr, i);
- hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, i);
+ /* send LVN_DELETEITEM notification, if not suppressed
+ and if it is not a virtual listview */
+ if (!bSuppress) notify_deleteitem(infoPtr, i);
+ hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, i);
+ lpItem = DPA_GetPtr(hdpaSubItems, 0);
+ /* free id struct */
+ j = DPA_GetPtrIndex(infoPtr->hdpaItemIds, lpItem->id);
+ lpID = DPA_GetPtr(infoPtr->hdpaItemIds, j);
+ DPA_DeletePtr(infoPtr->hdpaItemIds, j);
+ Free(lpID);
+ /* both item and subitem start with ITEMHDR header */
for (j = 0; j < DPA_GetPtrCount(hdpaSubItems); j++)
{
- hdrItem = DPA_GetPtr(hdpaSubItems, j);
+ hdrItem = DPA_GetPtr(hdpaSubItems, j);
if (is_textW(hdrItem->pszText)) Free(hdrItem->pszText);
Free(hdrItem);
}
@@ -5212,6 +5643,7 @@ static BOOL LISTVIEW_DeleteItem(LISTVIEW_INFO *infoPtr, INT nItem)
static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL isW)
{
HWND hwndSelf = infoPtr->hwndSelf;
+ WCHAR szDispText[DISP_TEXT_SIZE] = { 0 };
NMLVDISPINFOW dispInfo;
INT editedItem = infoPtr->nEditLabelItem;
BOOL bSame;
@@ -5242,7 +5674,9 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL
dispInfo.item.iItem = editedItem;
dispInfo.item.iSubItem = 0;
dispInfo.item.stateMask = ~0;
- if (!LISTVIEW_GetItemW(infoPtr, &dispInfo.item))
+ dispInfo.item.pszText = szDispText;
+ dispInfo.item.cchTextMax = DISP_TEXT_SIZE;
+ if (!LISTVIEW_GetItemT(infoPtr, &dispInfo.item, isW))
{
res = FALSE;
goto cleanup;
@@ -5256,16 +5690,11 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL
bSame = (lstrcmpW(dispInfo.item.pszText, tmp) == 0);
textfreeT(tmp, FALSE);
}
- if (bSame)
- {
- res = TRUE;
- goto cleanup;
- }
/* add the text from the edit in */
dispInfo.item.mask |= LVIF_TEXT;
- dispInfo.item.pszText = pszText;
- dispInfo.item.cchTextMax = textlenT(pszText, isW);
+ dispInfo.item.pszText = bSame ? NULL : pszText;
+ dispInfo.item.cchTextMax = bSame ? 0 : textlenT(pszText, isW);
/* Do we need to update the Item Text */
if (!notify_dispinfoT(infoPtr, LVN_ENDLABELEDITW, &dispInfo, isW))
@@ -5279,6 +5708,11 @@ static BOOL LISTVIEW_EndEditLabelT(LISTVIEW_INFO *infoPtr, BOOL storeText, BOOL
goto cleanup;
}
if (!pszText) return TRUE;
+ if (bSame)
+ {
+ res = TRUE;
+ goto cleanup;
+ }
if (!(infoPtr->dwStyle & LVS_OWNERDATA))
{
@@ -5306,6 +5740,133 @@ cleanup:
return res;
}
+/***
+ * DESCRIPTION:
+ * Subclassed edit control windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ * [I] isW : TRUE if input is Unicode
+ *
+ * RETURN:
+ * Zero.
+ */
+static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL isW)
+{
+ LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(GetParent(hwnd), 0);
+ BOOL save = TRUE;
+
+ TRACE("(hwnd=%p, uMsg=%x, wParam=%lx, lParam=%lx, isW=%d)\n",
+ hwnd, uMsg, wParam, lParam, isW);
+
+ switch (uMsg)
+ {
+ case WM_GETDLGCODE:
+ return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
+
+ case WM_DESTROY:
+ {
+ WNDPROC editProc = infoPtr->EditWndProc;
+ infoPtr->EditWndProc = 0;
+ SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (DWORD_PTR)editProc);
+ return CallWindowProcT(editProc, hwnd, uMsg, wParam, lParam, isW);
+ }
+
+ case WM_KEYDOWN:
+ if (VK_ESCAPE == (INT)wParam)
+ {
+ save = FALSE;
+ break;
+ }
+ else if (VK_RETURN == (INT)wParam)
+ break;
+
+ default:
+ return CallWindowProcT(infoPtr->EditWndProc, hwnd, uMsg, wParam, lParam, isW);
+ }
+
+ /* kill the edit */
+ if (infoPtr->hwndEdit)
+ LISTVIEW_EndEditLabelT(infoPtr, save, isW);
+
+ SendMessageW(hwnd, WM_CLOSE, 0, 0);
+ return 0;
+}
+
+/***
+ * DESCRIPTION:
+ * Subclassed edit control Unicode windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ *
+ * RETURN:
+ */
+static LRESULT CALLBACK EditLblWndProcW(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ return EditLblWndProcT(hwnd, uMsg, wParam, lParam, TRUE);
+}
+
+/***
+ * DESCRIPTION:
+ * Subclassed edit control ANSI windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ *
+ * RETURN:
+ */
+static LRESULT CALLBACK EditLblWndProcA(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ return EditLblWndProcT(hwnd, uMsg, wParam, lParam, FALSE);
+}
+
+/***
+ * DESCRIPTION:
+ * Creates a subclassed edit control
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the listview structure
+ * [I] text : initial text for the edit
+ * [I] style : the window style
+ * [I] isW : TRUE if input is Unicode
+ *
+ * RETURN:
+ */
+static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, BOOL isW)
+{
+ static const DWORD style = WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER|WS_VISIBLE;
+ HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);
+ HWND hedit;
+
+ TRACE("(%p, text=%s, isW=%d)\n", infoPtr, debugtext_t(text, isW), isW);
+
+ /* Window will be resized and positioned after LVN_BEGINLABELEDIT */
+ if (isW)
+ hedit = CreateWindowW(WC_EDITW, text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
+ else
+ hedit = CreateWindowA(WC_EDITA, (LPCSTR)text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
+
+ if (!hedit) return 0;
+
+ infoPtr->EditWndProc = (WNDPROC)
+ (isW ? SetWindowLongPtrW(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcW) :
+ SetWindowLongPtrA(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcA) );
+
+ SendMessageW(hedit, WM_SETFONT, (WPARAM)infoPtr->hFont, FALSE);
+
+ return hedit;
+}
+
/***
* DESCRIPTION:
* Begin in place editing of specified list view item
@@ -5361,7 +5922,7 @@ static HWND LISTVIEW_EditLabelT(LISTVIEW_INFO *infoPtr, INT nItem, BOOL isW)
dispInfo.item.cchTextMax = DISP_TEXT_SIZE;
if (!LISTVIEW_GetItemT(infoPtr, &dispInfo.item, isW)) return 0;
- infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, WS_VISIBLE, isW);
+ infoPtr->hwndEdit = CreateEditLabelT(infoPtr, dispInfo.item.pszText, isW);
if (!infoPtr->hwndEdit) return 0;
if (notify_dispinfoT(infoPtr, LVN_BEGINLABELEDITW, &dispInfo, isW))
@@ -5525,7 +6086,8 @@ static INT LISTVIEW_FindItemW(const LISTVIEW_INFO *infoPtr, INT nStart,
if (!lpFindInfo || nItem < 0) return -1;
lvItem.mask = 0;
- if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL))
+ if (lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL) ||
+ lpFindInfo->flags & LVFI_SUBSTRING)
{
lvItem.mask |= LVIF_TEXT;
lvItem.pszText = szDispText;
@@ -5586,12 +6148,13 @@ again:
else
continue;
}
-
+
if (lvItem.mask & LVIF_TEXT)
{
- if (lpFindInfo->flags & LVFI_PARTIAL)
+ if (lpFindInfo->flags & (LVFI_PARTIAL | LVFI_SUBSTRING))
{
- if (strstrW(lvItem.pszText, lpFindInfo->psz) == NULL) continue;
+ WCHAR *p = strstrW(lvItem.pszText, lpFindInfo->psz);
+ if (!p || p != lvItem.pszText) continue;
}
else
{
@@ -5600,7 +6163,7 @@ again:
}
if (!bNearest) return nItem;
-
+
/* This is very inefficient. To do a good job here,
* we need a sorted array of (x,y) item positions */
LISTVIEW_GetItemOrigin(infoPtr, nItem, &Position);
@@ -5645,7 +6208,8 @@ again:
static INT LISTVIEW_FindItemA(const LISTVIEW_INFO *infoPtr, INT nStart,
const LVFINDINFOA *lpFindInfo)
{
- BOOL hasText = lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL);
+ BOOL hasText = lpFindInfo->flags & (LVFI_STRING | LVFI_PARTIAL) ||
+ lpFindInfo->flags & LVFI_SUBSTRING;
LVFINDINFOW fiw;
INT res;
LPWSTR strW = NULL;
@@ -5842,8 +6406,13 @@ static HIMAGELIST LISTVIEW_GetImageList(const LISTVIEW_INFO *infoPtr, INT nImage
switch (nImageList)
{
case LVSIL_NORMAL: return infoPtr->himlNormal;
- case LVSIL_SMALL: return infoPtr->himlSmall;
- case LVSIL_STATE: return infoPtr->himlState;
+ case LVSIL_SMALL: return infoPtr->himlSmall;
+ case LVSIL_STATE: return infoPtr->himlState;
+ case LVSIL_GROUPHEADER:
+ FIXME("LVSIL_GROUPHEADER not supported\n");
+ break;
+ default:
+ WARN("got unknown imagelist index - %d\n", nImageList);
}
return NULL;
}
@@ -6000,7 +6569,7 @@ static BOOL LISTVIEW_GetItemT(const LISTVIEW_INFO *infoPtr, LPLVITEMW lpLVItem,
if (isubitem)
{
- SUBITEM_INFO *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems, isubitem);
+ SUBITEM_INFO *lpSubItem = LISTVIEW_GetSubItemPtr(hdpaSubItems, isubitem);
pItemHdr = lpSubItem ? &lpSubItem->hdr : &callbackHdr;
if (!lpSubItem)
{
@@ -6417,7 +6986,7 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
}
}
- if (!LISTVIEW_GetItemPosition(infoPtr, nItem, &Position)) return FALSE;
+ LISTVIEW_GetOrigin(infoPtr, &Position);
if (nColumn < 0 || nColumn >= DPA_GetPtrCount(infoPtr->hdpaColumns)) return FALSE;
@@ -6442,39 +7011,10 @@ static BOOL LISTVIEW_GetSubItemRect(const LISTVIEW_INFO *infoPtr, INT nItem, LPR
return FALSE;
}
- OffsetRect(lprc, 0, Position.y);
+ OffsetRect(lprc, Position.x, Position.y);
return TRUE;
}
-
-/***
- * DESCRIPTION:
- * Retrieves the width of a label.
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- *
- * RETURN:
- * SUCCESS : string width (in pixels)
- * FAILURE : zero
- */
-static INT LISTVIEW_GetLabelWidth(const LISTVIEW_INFO *infoPtr, INT nItem)
-{
- WCHAR szDispText[DISP_TEXT_SIZE] = { '\0' };
- LVITEMW lvItem;
-
- TRACE("(nItem=%d)\n", nItem);
-
- lvItem.mask = LVIF_TEXT;
- lvItem.iItem = nItem;
- lvItem.iSubItem = 0;
- lvItem.pszText = szDispText;
- lvItem.cchTextMax = DISP_TEXT_SIZE;
- if (!LISTVIEW_GetItemW(infoPtr, &lvItem)) return 0;
-
- return LISTVIEW_GetStringWidthT(infoPtr, lvItem.pszText, TRUE);
-}
-
/***
* DESCRIPTION:
* Retrieves the spacing between listview control items.
@@ -6918,6 +7458,14 @@ static INT LISTVIEW_HitTest(const LISTVIEW_INFO *infoPtr, LPLVHITTESTINFO lpht,
}
}
TRACE("lpht->iSubItem=%d\n", lpht->iSubItem);
+
+ /* if we're outside horizontal columns bounds there's nothing to test further */
+ if (lpht->iSubItem == -1)
+ {
+ lpht->iItem = -1;
+ lpht->flags = LVHT_NOWHERE;
+ return -1;
+ }
}
TRACE("lpht->flags=0x%x\n", lpht->flags);
@@ -7067,9 +7615,9 @@ static INT LISTVIEW_InsertItemT(LISTVIEW_INFO *infoPtr, const LVITEMW *lpLVItem,
while (i < infoPtr->nItemCount)
{
hItem = DPA_GetPtr( infoPtr->hdpaItems, i);
- item_s = (ITEM_INFO*)DPA_GetPtr(hItem, 0);
+ item_s = DPA_GetPtr(hItem, 0);
- cmpv = textcmpWT(item_s->hdr.pszText, lpLVItem->pszText, TRUE);
+ cmpv = textcmpWT(item_s->hdr.pszText, lpLVItem->pszText, isW);
if (infoPtr->dwStyle & LVS_SORTDESCENDING) cmpv *= -1;
if (cmpv >= 0) break;
@@ -7451,7 +7999,7 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
/* insert item in header control */
nNewColumn = SendMessageW(infoPtr->hwndHeader,
isW ? HDM_INSERTITEMW : HDM_INSERTITEMA,
- (WPARAM)nColumn, (LPARAM)&hdi);
+ nColumn, (LPARAM)&hdi);
if (nNewColumn == -1) return -1;
if (nNewColumn != nColumn) ERR("nColumn=%d, nNewColumn=%d\n", nColumn, nNewColumn);
@@ -7470,7 +8018,14 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
SUBITEM_INFO *lpSubItem;
HDPA hdpaSubItems;
INT nItem, i;
-
+ LVITEMW item;
+ BOOL changed;
+
+ item.iSubItem = nNewColumn;
+ item.mask = LVIF_TEXT | LVIF_IMAGE;
+ item.iImage = I_IMAGECALLBACK;
+ item.pszText = LPSTR_TEXTCALLBACKW;
+
for (nItem = 0; nItem < infoPtr->nItemCount; nItem++)
{
hdpaSubItems = DPA_GetPtr(infoPtr->hdpaItems, nItem);
@@ -7480,6 +8035,10 @@ static INT LISTVIEW_InsertColumnT(LISTVIEW_INFO *infoPtr, INT nColumn,
if (lpSubItem->iSubItem >= nNewColumn)
lpSubItem->iSubItem++;
}
+
+ /* add new subitem for each item */
+ item.iItem = nItem;
+ set_sub_item(infoPtr, &item, isW, &changed);
}
}
@@ -7534,7 +8093,7 @@ static BOOL LISTVIEW_SetColumnT(const LISTVIEW_INFO *infoPtr, INT nColumn,
column_fill_hditem(infoPtr, &hdi, nColumn, lpColumn, isW);
/* set header item attributes */
- bResult = SendMessageW(infoPtr->hwndHeader, isW ? HDM_SETITEMW : HDM_SETITEMA, (WPARAM)nColumn, (LPARAM)&hdi);
+ bResult = SendMessageW(infoPtr->hwndHeader, isW ? HDM_SETITEMW : HDM_SETITEMA, nColumn, (LPARAM)&hdi);
if (!bResult) return FALSE;
if (lpColumn->mask & LVCF_FMT)
@@ -7774,10 +8333,18 @@ static DWORD LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwM
LISTVIEW_SetItemState(infoPtr, -1, &item);
himl = LISTVIEW_CreateCheckBoxIL(infoPtr);
+ if(!(infoPtr->dwStyle & LVS_SHAREIMAGELISTS))
+ ImageList_Destroy(infoPtr->himlState);
}
- LISTVIEW_SetImageList(infoPtr, LVSIL_STATE, himl);
+ himl = LISTVIEW_SetImageList(infoPtr, LVSIL_STATE, himl);
+ /* checkbox list replaces prevous custom list or... */
+ if(((infoPtr->dwLvExStyle & LVS_EX_CHECKBOXES) &&
+ !(infoPtr->dwStyle & LVS_SHAREIMAGELISTS)) ||
+ /* ...previous was checkbox list */
+ (dwOldExStyle & LVS_EX_CHECKBOXES))
+ ImageList_Destroy(himl);
}
-
+
if((infoPtr->dwLvExStyle ^ dwOldExStyle) & LVS_EX_HEADERDRAGDROP)
{
DWORD dwStyle;
@@ -7805,6 +8372,16 @@ static DWORD LISTVIEW_SetExtendedListViewStyle(LISTVIEW_INFO *infoPtr, DWORD dwM
LISTVIEW_SetBkColor(infoPtr, CLR_NONE);
}
+ if((infoPtr->dwLvExStyle ^ dwOldExStyle) & LVS_EX_HEADERINALLVIEWS)
+ {
+ if (infoPtr->dwLvExStyle & LVS_EX_HEADERINALLVIEWS)
+ LISTVIEW_CreateHeader(infoPtr);
+ else
+ ShowWindow(infoPtr->hwndHeader, SW_HIDE);
+ LISTVIEW_UpdateSize(infoPtr);
+ LISTVIEW_UpdateScroll(infoPtr);
+ }
+
LISTVIEW_InvalidateList(infoPtr);
return dwOldExStyle;
}
@@ -8105,34 +8682,35 @@ static BOOL LISTVIEW_SetItemCount(LISTVIEW_INFO *infoPtr, INT nItems, DWORD dwFl
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT pt)
+static BOOL LISTVIEW_SetItemPosition(LISTVIEW_INFO *infoPtr, INT nItem, POINT *pt)
{
- POINT Origin;
+ POINT Origin, Pt;
- TRACE("(nItem=%d, &pt=%s\n", nItem, wine_dbgstr_point(&pt));
+ TRACE("(nItem=%d, pt=%s\n", nItem, wine_dbgstr_point(pt));
- if (nItem < 0 || nItem >= infoPtr->nItemCount ||
+ if (!pt || nItem < 0 || nItem >= infoPtr->nItemCount ||
!(infoPtr->uView == LV_VIEW_ICON || infoPtr->uView == LV_VIEW_SMALLICON)) return FALSE;
+ Pt = *pt;
LISTVIEW_GetOrigin(infoPtr, &Origin);
/* This point value seems to be an undocumented feature.
* The best guess is that it means either at the origin,
* or at true beginning of the list. I will assume the origin. */
- if ((pt.x == -1) && (pt.y == -1))
- pt = Origin;
+ if ((Pt.x == -1) && (Pt.y == -1))
+ Pt = Origin;
if (infoPtr->uView == LV_VIEW_ICON)
{
- pt.x -= (infoPtr->nItemWidth - infoPtr->iconSize.cx) / 2;
- pt.y -= ICON_TOP_PADDING;
+ Pt.x -= (infoPtr->nItemWidth - infoPtr->iconSize.cx) / 2;
+ Pt.y -= ICON_TOP_PADDING;
}
- pt.x -= Origin.x;
- pt.y -= Origin.y;
+ Pt.x -= Origin.x;
+ Pt.y -= Origin.y;
infoPtr->bAutoarrange = FALSE;
- return LISTVIEW_MoveIconTo(infoPtr, nItem, &pt, FALSE);
+ return LISTVIEW_MoveIconTo(infoPtr, nItem, &Pt, FALSE);
}
/***
@@ -8671,7 +9249,7 @@ static LRESULT LISTVIEW_NCCreate(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->iconSpacing.cy = GetSystemMetrics(SM_CYICONSPACING);
infoPtr->nEditLabelItem = -1;
infoPtr->nLButtonDownItem = -1;
- infoPtr->dwHoverTime = -1; /* default system hover time */
+ infoPtr->dwHoverTime = HOVER_DEFAULT; /* default system hover time */
infoPtr->nMeasureItemHeight = 0;
infoPtr->xTrackLine = -1; /* no track line */
infoPtr->itemEdit.fEnabled = FALSE;
@@ -8728,7 +9306,7 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
map_style_view(infoPtr);
infoPtr->notifyFormat = SendMessageW(infoPtr->hwndNotify, WM_NOTIFYFORMAT,
- (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
+ (WPARAM)infoPtr->hwndSelf, NF_QUERY);
/* on error defaulting to ANSI notifications */
if (infoPtr->notifyFormat == 0) infoPtr->notifyFormat = NFR_ANSI;
@@ -8772,10 +9350,14 @@ static LRESULT LISTVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
* Success: 0
* Failure: -1
*/
-static LRESULT LISTVIEW_Destroy(const LISTVIEW_INFO *infoPtr)
+static LRESULT LISTVIEW_Destroy(LISTVIEW_INFO *infoPtr)
{
HTHEME theme = GetWindowTheme(infoPtr->hwndSelf);
CloseThemeData(theme);
+
+ /* delete all items */
+ LISTVIEW_DeleteAllItems(infoPtr, TRUE);
+
return 0;
}
@@ -8791,7 +9373,7 @@ static LRESULT LISTVIEW_Destroy(const LISTVIEW_INFO *infoPtr)
* SUCCESS : TRUE
* FAILURE : FALSE
*/
-static BOOL LISTVIEW_Enable(const LISTVIEW_INFO *infoPtr, BOOL bEnable)
+static BOOL LISTVIEW_Enable(const LISTVIEW_INFO *infoPtr)
{
if (infoPtr->dwStyle & LVS_OWNERDRAWFIXED)
InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
@@ -9045,37 +9627,32 @@ static LRESULT LISTVIEW_HScroll(LISTVIEW_INFO *infoPtr, INT nScrollCode,
scrollInfo.fMask = SIF_POS;
scrollInfo.nPos = nNewScrollPos;
nNewScrollPos = SetScrollInfo(infoPtr->hwndSelf, SB_HORZ, &scrollInfo, TRUE);
-
+
/* carry on only if it really changed */
if (nNewScrollPos == nOldScrollPos) return 0;
-
- if (infoPtr->uView == LV_VIEW_DETAILS)
- LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
-
+
+ if (infoPtr->hwndHeader) LISTVIEW_UpdateHeaderSize(infoPtr, nNewScrollPos);
+
/* now adjust to client coordinates */
nScrollDiff = nOldScrollPos - nNewScrollPos;
if (infoPtr->uView == LV_VIEW_LIST) nScrollDiff *= infoPtr->nItemWidth;
-
+
/* and scroll the window */
scroll_list(infoPtr, nScrollDiff, 0);
- return 0;
+ return 0;
}
static LRESULT LISTVIEW_MouseWheel(LISTVIEW_INFO *infoPtr, INT wheelDelta)
{
INT gcWheelDelta = 0;
INT pulScrollLines = 3;
- SCROLLINFO scrollInfo;
TRACE("(wheelDelta=%d)\n", wheelDelta);
SystemParametersInfoW(SPI_GETWHEELSCROLLLINES,0, &pulScrollLines, 0);
gcWheelDelta -= wheelDelta;
- scrollInfo.cbSize = sizeof(SCROLLINFO);
- scrollInfo.fMask = SIF_POS;
-
switch(infoPtr->uView)
{
case LV_VIEW_ICON:
@@ -9233,7 +9810,21 @@ static LRESULT LISTVIEW_KillFocus(LISTVIEW_INFO *infoPtr)
/* if we have a focus rectangle, get rid of it */
LISTVIEW_ShowFocusRect(infoPtr, FALSE);
-
+
+ /* if have a marquee selection, stop it */
+ if (infoPtr->bMarqueeSelect)
+ {
+ /* Remove the marquee rectangle and release our mouse capture */
+ LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeRect);
+ ReleaseCapture();
+
+ SetRect(&infoPtr->marqueeRect, 0, 0, 0, 0);
+
+ infoPtr->bMarqueeSelect = FALSE;
+ infoPtr->bScrolling = FALSE;
+ KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
+ }
+
/* set window focus flag */
infoPtr->bFocus = FALSE;
@@ -9312,6 +9903,8 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN
infoPtr->bLButtonDown = TRUE;
infoPtr->ptClickPos = pt;
infoPtr->bDragging = FALSE;
+ infoPtr->bMarqueeSelect = FALSE;
+ infoPtr->bScrolling = FALSE;
lvHitTestInfo.pt.x = x;
lvHitTestInfo.pt.y = y;
@@ -9389,6 +9982,9 @@ static LRESULT LISTVIEW_LButtonDown(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, IN
}
else
{
+ if (!infoPtr->bFocus)
+ SetFocus(infoPtr->hwndSelf);
+
/* remove all selections */
if (!(wKey & MK_CONTROL) && !(wKey & MK_SHIFT))
LISTVIEW_DeselectAll(infoPtr);
@@ -9433,9 +10029,23 @@ static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
LISTVIEW_SetSelection(infoPtr, infoPtr->nLButtonDownItem);
infoPtr->nLButtonDownItem = -1;
- if (infoPtr->bDragging)
+ if (infoPtr->bDragging || infoPtr->bMarqueeSelect)
{
+ /* Remove the marquee rectangle and release our mouse capture */
+ if (infoPtr->bMarqueeSelect)
+ {
+ LISTVIEW_InvalidateRect(infoPtr, &infoPtr->marqueeDrawRect);
+ ReleaseCapture();
+ }
+
+ SetRect(&infoPtr->marqueeRect, 0, 0, 0, 0);
+ SetRect(&infoPtr->marqueeDrawRect, 0, 0, 0, 0);
+
infoPtr->bDragging = FALSE;
+ infoPtr->bMarqueeSelect = FALSE;
+ infoPtr->bScrolling = FALSE;
+
+ KillTimer(infoPtr->hwndSelf, (UINT_PTR) infoPtr);
return 0;
}
@@ -9471,28 +10081,27 @@ static LRESULT LISTVIEW_LButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
*/
static LRESULT LISTVIEW_NCDestroy(LISTVIEW_INFO *infoPtr)
{
- TRACE("()\n");
+ INT i;
- /* delete all items */
- LISTVIEW_DeleteAllItems(infoPtr, TRUE);
+ TRACE("()\n");
/* destroy data structure */
DPA_Destroy(infoPtr->hdpaItems);
DPA_Destroy(infoPtr->hdpaItemIds);
DPA_Destroy(infoPtr->hdpaPosX);
DPA_Destroy(infoPtr->hdpaPosY);
+ /* columns */
+ for (i = 0; i < DPA_GetPtrCount(infoPtr->hdpaColumns); i++)
+ Free(DPA_GetPtr(infoPtr->hdpaColumns, i));
DPA_Destroy(infoPtr->hdpaColumns);
ranges_destroy(infoPtr->selectionRanges);
/* destroy image lists */
if (!(infoPtr->dwStyle & LVS_SHAREIMAGELISTS))
{
- if (infoPtr->himlNormal)
- ImageList_Destroy(infoPtr->himlNormal);
- if (infoPtr->himlSmall)
- ImageList_Destroy(infoPtr->himlSmall);
- if (infoPtr->himlState)
- ImageList_Destroy(infoPtr->himlState);
+ ImageList_Destroy(infoPtr->himlNormal);
+ ImageList_Destroy(infoPtr->himlSmall);
+ ImageList_Destroy(infoPtr->himlState);
}
/* destroy font, bkgnd brush */
@@ -9675,6 +10284,9 @@ static LRESULT LISTVIEW_HeaderNotification(LISTVIEW_INFO *infoPtr, const NMHEADE
case HDN_DIVIDERDBLCLICKW:
case HDN_DIVIDERDBLCLICKA:
+ /* FIXME: for LVS_EX_HEADERINALLVIEWS and not LV_VIEW_DETAILS
+ we should use LVSCW_AUTOSIZE_USEHEADER, helper rework or
+ split needed for that */
LISTVIEW_SetColumnWidth(infoPtr, lpnmh->iItem, LVSCW_AUTOSIZE);
notify_forward_header(infoPtr, lpnmh);
break;
@@ -9704,7 +10316,8 @@ static BOOL LISTVIEW_NCPaint(const LISTVIEW_INFO *infoPtr, HRGN region)
int cxEdge = GetSystemMetrics (SM_CXEDGE),
cyEdge = GetSystemMetrics (SM_CYEDGE);
- if (!theme) return FALSE;
+ if (!theme)
+ return DefWindowProcW (infoPtr->hwndSelf, WM_NCPAINT, (WPARAM)region, 0);
GetWindowRect(infoPtr->hwndSelf, &r);
@@ -9725,7 +10338,7 @@ static BOOL LISTVIEW_NCPaint(const LISTVIEW_INFO *infoPtr, HRGN region)
/* Call default proc to get the scrollbars etc. painted */
DefWindowProcW (infoPtr->hwndSelf, WM_NCPAINT, (WPARAM)cliprgn, 0);
- return TRUE;
+ return FALSE;
}
/***
@@ -9975,20 +10588,24 @@ static LRESULT LISTVIEW_RButtonUp(LISTVIEW_INFO *infoPtr, WORD wKey, INT x, INT
* TRUE if cursor is set
* FALSE otherwise
*/
-static BOOL LISTVIEW_SetCursor(const LISTVIEW_INFO *infoPtr, HWND hwnd, UINT nHittest, UINT wMouseMsg)
+static BOOL LISTVIEW_SetCursor(const LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
LVHITTESTINFO lvHitTestInfo;
- if(!(LISTVIEW_isHotTracking(infoPtr))) return FALSE;
+ if (!LISTVIEW_IsHotTracking(infoPtr)) goto forward;
- if(!infoPtr->hHotCursor) return FALSE;
+ if (!infoPtr->hHotCursor) goto forward;
GetCursorPos(&lvHitTestInfo.pt);
- if (LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, FALSE, FALSE) < 0) return FALSE;
+ if (LISTVIEW_HitTest(infoPtr, &lvHitTestInfo, FALSE, FALSE) < 0) goto forward;
SetCursor(infoPtr->hHotCursor);
return TRUE;
+
+forward:
+
+ return DefWindowProcW(infoPtr->hwndSelf, WM_SETCURSOR, wParam, lParam);
}
/***
@@ -10161,7 +10778,9 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
infoPtr->rcList.bottom -= GetSystemMetrics(SM_CYHSCROLL);
infoPtr->rcList.bottom = max (infoPtr->rcList.bottom - 2, 0);
}
- else if (infoPtr->uView == LV_VIEW_DETAILS)
+
+ /* if control created invisible header isn't created */
+ if (infoPtr->hwndHeader)
{
HDLAYOUT hl;
WINDOWPOS wp;
@@ -10169,15 +10788,24 @@ static void LISTVIEW_UpdateSize(LISTVIEW_INFO *infoPtr)
hl.prc = &infoPtr->rcList;
hl.pwpos = ℘
SendMessageW( infoPtr->hwndHeader, HDM_LAYOUT, 0, (LPARAM)&hl );
- TRACE(" wp.flags=0x%08x, wp=%d,%d (%dx%d)\n", wp.flags, wp.x, wp.y, wp.cx, wp.cy);
- SetWindowPos(wp.hwnd, wp.hwndInsertAfter, wp.x, wp.y, wp.cx, wp.cy,
- wp.flags | ((infoPtr->dwStyle & LVS_NOCOLUMNHEADER)
- ? SWP_HIDEWINDOW : SWP_SHOWWINDOW));
- TRACE(" after SWP wp=%d,%d (%dx%d)\n", wp.x, wp.y, wp.cx, wp.cy);
+ TRACE(" wp.flags=0x%08x, wp=%d,%d (%dx%d)\n", wp.flags, wp.x, wp.y, wp.cx, wp.cy);
+
+ if (LISTVIEW_IsHeaderEnabled(infoPtr))
+ wp.flags |= SWP_SHOWWINDOW;
+ else
+ {
+ wp.flags |= SWP_HIDEWINDOW;
+ wp.cy = 0;
+ }
+
+ SetWindowPos(wp.hwnd, wp.hwndInsertAfter, wp.x, wp.y, wp.cx, wp.cy, wp.flags);
+ TRACE(" after SWP wp=%d,%d (%dx%d)\n", wp.x, wp.y, wp.cx, wp.cy);
infoPtr->rcList.top = max(wp.cy, 0);
- infoPtr->rcList.top += (infoPtr->dwLvExStyle & LVS_EX_GRIDLINES) ? 2 : 0;
}
+ /* extra padding for grid */
+ if (infoPtr->uView == LV_VIEW_DETAILS && infoPtr->dwLvExStyle & LVS_EX_GRIDLINES)
+ infoPtr->rcList.top += 2;
TRACE(" rcList=%s\n", wine_dbgstr_rect(&infoPtr->rcList));
}
@@ -10258,7 +10886,7 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
LISTVIEW_UpdateItemSize(infoPtr);
}
- if (uNewView == LVS_REPORT)
+ if (uNewView == LVS_REPORT || infoPtr->dwLvExStyle & LVS_EX_HEADERINALLVIEWS)
{
if ((lpss->styleOld ^ lpss->styleNew) & LVS_NOCOLUMNHEADER)
{
@@ -10300,14 +10928,13 @@ static INT LISTVIEW_StyleChanged(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
* Processes WM_STYLECHANGING messages.
*
* PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
* [I] wStyleType : window style type (normal or extended)
* [I0] lpss : window style information
*
* RETURN:
* Zero
*/
-static INT LISTVIEW_StyleChanging(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
+static INT LISTVIEW_StyleChanging(WPARAM wStyleType,
STYLESTRUCT *lpss)
{
TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
@@ -10337,7 +10964,7 @@ static INT LISTVIEW_StyleChanging(LISTVIEW_INFO *infoPtr, WPARAM wStyleType,
* RETURN:
* Zero
*/
-static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iStatus)
+static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, WPARAM bShown, LPARAM iStatus)
{
/* header delayed creation */
if ((infoPtr->uView == LV_VIEW_DETAILS) && bShown)
@@ -10348,7 +10975,7 @@ static LRESULT LISTVIEW_ShowWindow(LISTVIEW_INFO *infoPtr, BOOL bShown, INT iSta
ShowWindow(infoPtr->hwndHeader, SW_SHOWNORMAL);
}
- return 0;
+ return DefWindowProcW(infoPtr->hwndSelf, WM_SHOWWINDOW, bShown, iStatus);
}
/***
@@ -10402,7 +11029,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(hwnd, 0);
- TRACE("(uMsg=%x wParam=%lx lParam=%lx)\n", uMsg, wParam, lParam);
+ TRACE("(hwnd=%p uMsg=%x wParam=%lx lParam=%lx)\n", hwnd, uMsg, wParam, lParam);
if (!infoPtr && (uMsg != WM_NCCREATE))
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
@@ -10430,12 +11057,10 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case LVM_DELETEITEM:
return LISTVIEW_DeleteItem(infoPtr, (INT)wParam);
- case LVM_EDITLABELW:
- return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam, TRUE);
-
case LVM_EDITLABELA:
- return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam, FALSE);
-
+ case LVM_EDITLABELW:
+ return (LRESULT)LISTVIEW_EditLabelT(infoPtr, (INT)wParam,
+ uMsg == LVM_EDITLABELW);
/* case LVM_ENABLEGROUPVIEW: */
case LVM_ENSUREVISIBLE:
@@ -10456,10 +11081,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return infoPtr->uCallbackMask;
case LVM_GETCOLUMNA:
- return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
-
case LVM_GETCOLUMNW:
- return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+ return LISTVIEW_GetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam,
+ uMsg == LVM_GETCOLUMNW);
case LVM_GETCOLUMNORDERARRAY:
return LISTVIEW_GetColumnOrderArray(infoPtr, (INT)wParam, (LPINT)lParam);
@@ -10507,10 +11131,8 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return FALSE;
case LVM_GETITEMA:
- return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, FALSE);
-
case LVM_GETITEMW:
- return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_GetItemExtT(infoPtr, (LPLVITEMW)lParam, uMsg == LVM_GETITEMW);
case LVM_GETITEMCOUNT:
return infoPtr->nItemCount;
@@ -10528,10 +11150,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_GetItemState(infoPtr, (INT)wParam, (UINT)lParam);
case LVM_GETITEMTEXTA:
- return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, FALSE);
-
case LVM_GETITEMTEXTW:
- return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_GetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam,
+ uMsg == LVM_GETITEMTEXTW);
case LVM_GETNEXTITEM:
return LISTVIEW_GetNextItem(infoPtr, (INT)wParam, LOWORD(lParam));
@@ -10558,10 +11179,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return infoPtr->nSelectionMark;
case LVM_GETSTRINGWIDTHA:
- return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam, FALSE);
-
case LVM_GETSTRINGWIDTHW:
- return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam, TRUE);
+ return LISTVIEW_GetStringWidthT(infoPtr, (LPCWSTR)lParam,
+ uMsg == LVM_GETSTRINGWIDTHW);
case LVM_GETSUBITEMRECT:
return LISTVIEW_GetSubItemRect(infoPtr, (UINT)wParam, (LPRECT)lParam);
@@ -10603,20 +11223,17 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, FALSE, TRUE);
case LVM_INSERTCOLUMNA:
- return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
-
case LVM_INSERTCOLUMNW:
- return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+ return LISTVIEW_InsertColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam,
+ uMsg == LVM_INSERTCOLUMNW);
/* case LVM_INSERTGROUP: */
/* case LVM_INSERTGROUPSORTED: */
case LVM_INSERTITEMA:
- return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, FALSE);
-
case LVM_INSERTITEMW:
- return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_InsertItemT(infoPtr, (LPLVITEMW)lParam, uMsg == LVM_INSERTITEMW);
/* case LVM_INSERTMARKHITTEST: */
@@ -10655,10 +11272,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TRUE;
case LVM_SETCOLUMNA:
- return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, FALSE);
-
case LVM_SETCOLUMNW:
- return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam, TRUE);
+ return LISTVIEW_SetColumnT(infoPtr, (INT)wParam, (LPLVCOLUMNW)lParam,
+ uMsg == LVM_SETCOLUMNW);
case LVM_SETCOLUMNORDERARRAY:
return LISTVIEW_SetColumnOrderArray(infoPtr, (INT)wParam, (LPINT)lParam);
@@ -10680,7 +11296,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_SetHotItem(infoPtr, (INT)wParam);
case LVM_SETHOVERTIME:
- return LISTVIEW_SetHoverTime(infoPtr, (DWORD)wParam);
+ return LISTVIEW_SetHoverTime(infoPtr, (DWORD)lParam);
case LVM_SETICONSPACING:
return LISTVIEW_SetIconSpacing(infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam));
@@ -10709,22 +11325,20 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
POINT pt;
pt.x = (short)LOWORD(lParam);
pt.y = (short)HIWORD(lParam);
- return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, pt);
+ return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, &pt);
}
case LVM_SETITEMPOSITION32:
- if (lParam == 0) return FALSE;
- return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, *((POINT*)lParam));
+ return LISTVIEW_SetItemPosition(infoPtr, (INT)wParam, (POINT*)lParam);
case LVM_SETITEMSTATE:
if (lParam == 0) return FALSE;
return LISTVIEW_SetItemState(infoPtr, (INT)wParam, (LPLVITEMW)lParam);
case LVM_SETITEMTEXTA:
- return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, FALSE);
-
case LVM_SETITEMTEXTW:
- return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam, TRUE);
+ return LISTVIEW_SetItemTextT(infoPtr, (INT)wParam, (LPLVITEMW)lParam,
+ uMsg == LVM_SETITEMTEXTW);
/* case LVM_SETOUTLINECOLOR: */
@@ -10759,11 +11373,9 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case LVM_SORTGROUPS: */
case LVM_SORTITEMS:
- return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam, FALSE);
-
case LVM_SORTITEMSEX:
- return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, (LPARAM)wParam, TRUE);
-
+ return LISTVIEW_SortItems(infoPtr, (PFNLVCOMPARE)lParam, wParam,
+ uMsg == LVM_SORTITEMSEX);
case LVM_SUBITEMHITTEST:
return LISTVIEW_HitTest(infoPtr, (LPLVHITTESTINFO)lParam, TRUE, FALSE);
@@ -10792,7 +11404,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_Destroy(infoPtr);
case WM_ENABLE:
- return LISTVIEW_Enable(infoPtr, (BOOL)wParam);
+ return LISTVIEW_Enable(infoPtr);
case WM_ERASEBKGND:
return LISTVIEW_EraseBkgnd(infoPtr, (HDC)wParam);
@@ -10825,15 +11437,13 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_MouseMove (infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_MOUSEHOVER:
- return LISTVIEW_MouseHover(infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
+ return LISTVIEW_MouseHover(infoPtr, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_NCDESTROY:
return LISTVIEW_NCDestroy(infoPtr);
case WM_NCPAINT:
- if (LISTVIEW_NCPaint(infoPtr, (HRGN)wParam))
- return 0;
- goto fwd_msg;
+ return LISTVIEW_NCPaint(infoPtr, (HRGN)wParam);
case WM_NOTIFY:
if (lParam && ((LPNMHDR)lParam)->hwndFrom == infoPtr->hwndHeader)
@@ -10859,9 +11469,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_RButtonUp(infoPtr, (WORD)wParam, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
case WM_SETCURSOR:
- if(LISTVIEW_SetCursor(infoPtr, (HWND)wParam, LOWORD(lParam), HIWORD(lParam)))
- return TRUE;
- goto fwd_msg;
+ return LISTVIEW_SetCursor(infoPtr, wParam, lParam);
case WM_SETFOCUS:
return LISTVIEW_SetFocus(infoPtr, (HWND)wParam);
@@ -10873,8 +11481,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_SetRedraw(infoPtr, (BOOL)wParam);
case WM_SHOWWINDOW:
- LISTVIEW_ShowWindow(infoPtr, (BOOL)wParam, (INT)lParam);
- return DefWindowProcW(hwnd, uMsg, wParam, lParam);
+ return LISTVIEW_ShowWindow(infoPtr, wParam, lParam);
case WM_SIZE:
return LISTVIEW_Size(infoPtr, (short)LOWORD(lParam), (short)HIWORD(lParam));
@@ -10883,7 +11490,7 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return LISTVIEW_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
case WM_STYLECHANGING:
- return LISTVIEW_StyleChanging(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+ return LISTVIEW_StyleChanging(wParam, (LPSTYLESTRUCT)lParam);
case WM_SYSCOLORCHANGE:
COMCTL32_RefreshSysColors();
@@ -10923,8 +11530,6 @@ LISTVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
if ((uMsg >= WM_USER) && (uMsg < WM_APP) && !COMCTL32_IsReflectedMessage(uMsg))
ERR("unknown msg %04x wp=%08lx lp=%08lx\n", uMsg, wParam, lParam);
- fwd_msg:
- /* call default window procedure */
return DefWindowProcW(hwnd, uMsg, wParam, lParam);
}
@@ -10984,6 +11589,11 @@ void LISTVIEW_Unregister(void)
*/
static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
+
+ TRACE("(%p %x %x %lx)\n", infoPtr, HIWORD(wParam), LOWORD(wParam), lParam);
+
+ if (!infoPtr->hwndEdit) return 0;
+
switch (HIWORD(wParam))
{
case EN_UPDATE:
@@ -11003,7 +11613,7 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
/* Select font to get the right dimension of the string */
hFont = (HFONT)SendMessageW(infoPtr->hwndEdit, WM_GETFONT, 0, 0);
- if(hFont != 0)
+ if (hFont)
{
hOldFont = SelectObject(hdc, hFont);
}
@@ -11016,16 +11626,10 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
GetTextMetricsW(hdc, &textMetric);
sz.cx += (textMetric.tmMaxCharWidth * 2);
- SetWindowPos (
- infoPtr->hwndEdit,
- HWND_TOP,
- 0,
- 0,
- sz.cx,
- rect.bottom - rect.top,
- SWP_DRAWFRAME|SWP_NOMOVE);
+ SetWindowPos(infoPtr->hwndEdit, NULL, 0, 0, sz.cx,
+ rect.bottom - rect.top, SWP_DRAWFRAME | SWP_NOMOVE | SWP_NOZORDER);
}
- if(hFont != 0)
+ if (hFont)
SelectObject(hdc, hOldFont);
ReleaseDC(infoPtr->hwndEdit, hdc);
@@ -11035,6 +11639,7 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
case EN_KILLFOCUS:
{
LISTVIEW_CancelEditLabel(infoPtr);
+ break;
}
default:
@@ -11043,133 +11648,3 @@ static LRESULT LISTVIEW_Command(LISTVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lP
return 0;
}
-
-
-/***
- * DESCRIPTION:
- * Subclassed edit control windproc function
- *
- * PARAMETER(S):
- * [I] hwnd : the edit window handle
- * [I] uMsg : the message that is to be processed
- * [I] wParam : first message parameter
- * [I] lParam : second message parameter
- * [I] isW : TRUE if input is Unicode
- *
- * RETURN:
- * Zero.
- */
-static LRESULT EditLblWndProcT(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL isW)
-{
- LISTVIEW_INFO *infoPtr = (LISTVIEW_INFO *)GetWindowLongPtrW(GetParent(hwnd), 0);
- BOOL save = TRUE;
-
- TRACE("(hwnd=%p, uMsg=%x, wParam=%lx, lParam=%lx, isW=%d)\n",
- hwnd, uMsg, wParam, lParam, isW);
-
- switch (uMsg)
- {
- case WM_GETDLGCODE:
- return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
-
- case WM_DESTROY:
- {
- WNDPROC editProc = infoPtr->EditWndProc;
- infoPtr->EditWndProc = 0;
- SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (DWORD_PTR)editProc);
- return CallWindowProcT(editProc, hwnd, uMsg, wParam, lParam, isW);
- }
-
- case WM_KEYDOWN:
- if (VK_ESCAPE == (INT)wParam)
- {
- save = FALSE;
- break;
- }
- else if (VK_RETURN == (INT)wParam)
- break;
-
- default:
- return CallWindowProcT(infoPtr->EditWndProc, hwnd, uMsg, wParam, lParam, isW);
- }
-
- /* kill the edit */
- if (infoPtr->hwndEdit)
- LISTVIEW_EndEditLabelT(infoPtr, save, isW);
-
- SendMessageW(hwnd, WM_CLOSE, 0, 0);
- return 0;
-}
-
-/***
- * DESCRIPTION:
- * Subclassed edit control Unicode windproc function
- *
- * PARAMETER(S):
- * [I] hwnd : the edit window handle
- * [I] uMsg : the message that is to be processed
- * [I] wParam : first message parameter
- * [I] lParam : second message parameter
- *
- * RETURN:
- */
-static LRESULT CALLBACK EditLblWndProcW(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- return EditLblWndProcT(hwnd, uMsg, wParam, lParam, TRUE);
-}
-
-/***
- * DESCRIPTION:
- * Subclassed edit control ANSI windproc function
- *
- * PARAMETER(S):
- * [I] hwnd : the edit window handle
- * [I] uMsg : the message that is to be processed
- * [I] wParam : first message parameter
- * [I] lParam : second message parameter
- *
- * RETURN:
- */
-static LRESULT CALLBACK EditLblWndProcA(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- return EditLblWndProcT(hwnd, uMsg, wParam, lParam, FALSE);
-}
-
-/***
- * DESCRIPTION:
- * Creates a subclassed edit control
- *
- * PARAMETER(S):
- * [I] infoPtr : valid pointer to the listview structure
- * [I] text : initial text for the edit
- * [I] style : the window style
- * [I] isW : TRUE if input is Unicode
- *
- * RETURN:
- */
-static HWND CreateEditLabelT(LISTVIEW_INFO *infoPtr, LPCWSTR text, DWORD style, BOOL isW)
-{
- WCHAR editName[5] = { 'E', 'd', 'i', 't', '\0' };
- HWND hedit;
- HINSTANCE hinst = (HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE);
-
- TRACE("(text=%s, ..., isW=%d)\n", debugtext_t(text, isW), isW);
-
- style |= WS_CHILDWINDOW|WS_CLIPSIBLINGS|ES_LEFT|ES_AUTOHSCROLL|WS_BORDER;
-
- /* Window will be resized and positioned after LVN_BEGINLABELEDIT */
- if (isW)
- hedit = CreateWindowW(editName, text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
- else
- hedit = CreateWindowA("Edit", (LPCSTR)text, style, 0, 0, 0, 0, infoPtr->hwndSelf, 0, hinst, 0);
-
- if (!hedit) return 0;
-
- infoPtr->EditWndProc = (WNDPROC)
- (isW ? SetWindowLongPtrW(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcW) :
- SetWindowLongPtrA(hedit, GWLP_WNDPROC, (DWORD_PTR)EditLblWndProcA) );
-
- SendMessageW(hedit, WM_SETFONT, (WPARAM)infoPtr->hFont, FALSE);
-
- return hedit;
-}
diff --git a/dll/win32/comctl32/monthcal.c b/dll/win32/comctl32/monthcal.c
index 7a49c7025bf..a9795e09c40 100644
--- a/dll/win32/comctl32/monthcal.c
+++ b/dll/win32/comctl32/monthcal.c
@@ -1,11 +1,12 @@
-/* Month calendar control
-
+/*
+ * Month calendar control
*
* Copyright 1998, 1999 Eric Kohl (ekohl@abo.rhein-zeitung.de)
* Copyright 1999 Alex Priem (alexp@sci.kun.nl)
* Copyright 1999 Chris Morgan and
* James Abbatiello
* Copyright 2000 Uwe Bonnes
+ * Copyright 2009 Nikolay Sivov
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -36,9 +37,6 @@
* -- handle resources better (doesn't work now);
* -- take care of internationalization.
* -- keyboard handling.
- * -- GetRange: At the moment, we copy ranges anyway, regardless of
- * infoPtr->rangeValid; an invalid range is simply filled
- * with zeros in SetRange. Is this the right behavior?
* -- search for FIXME
*/
@@ -66,14 +64,19 @@ WINE_DEFAULT_DEBUG_CHANNEL(monthcal);
#define MC_SEL_LBUTDOWN 2 /* Left button pressed in calendar */
#define MC_PREVPRESSED 4 /* Prev month button pressed */
#define MC_NEXTPRESSED 8 /* Next month button pressed */
-#define MC_NEXTMONTHDELAY 350 /* when continuously pressing `next */
- /* month', wait 500 ms before going */
- /* to the next month */
-#define MC_NEXTMONTHTIMER 1 /* Timer ID's */
-#define MC_PREVMONTHTIMER 2
+#define MC_PREVNEXTMONTHDELAY 350 /* when continuously pressing `next/prev
+ month', wait 500 ms before going
+ to the next/prev month */
+#define MC_TODAYUPDATEDELAY 120000 /* time between today check for update (2 min) */
+
+#define MC_PREVNEXTMONTHTIMER 1 /* Timer ID's */
+#define MC_TODAYUPDATETIMER 2
#define countof(arr) (sizeof(arr)/sizeof(arr[0]))
+/* convert from days to 100 nanoseconds unit - used as FILETIME unit */
+#define DAYSTO100NSECS(days) (((ULONGLONG)(days))*24*60*60*10000000)
+
typedef struct
{
HWND hwndSelf;
@@ -90,23 +93,26 @@ typedef struct
int textWidth;
int height_increment;
int width_increment;
- int firstDayplace; /* place of the first day of the current month */
INT delta; /* scroll rate; # of months that the */
/* control moves when user clicks a scroll button */
int visible; /* # of months visible */
- int firstDay; /* Start month calendar with firstDay's day */
- int firstDayHighWord; /* High word only used externally */
+ int firstDay; /* Start month calendar with firstDay's day,
+ stored in SYSTEMTIME format */
+ BOOL firstDaySet; /* first week day differs from locale defined */
+
+ BOOL isUnicode; /* value set with MCM_SETUNICODE format */
+
int monthRange;
MONTHDAYSTATE *monthdayState;
SYSTEMTIME todaysDate;
- DWORD currentMonth;
- DWORD currentYear;
+ BOOL todaySet; /* Today was forced with MCM_SETTODAY */
int status; /* See MC_SEL flags */
- int curSelDay; /* current selected day */
- int firstSelDay; /* first selected day */
+ SYSTEMTIME firstSel; /* first selected day */
INT maxSelCount;
SYSTEMTIME minSel;
SYSTEMTIME maxSel;
+ SYSTEMTIME curSel; /* contains currently selected year, month and day */
+ SYSTEMTIME focusedSel; /* date currently focused with mouse movement */
DWORD rangeValid;
SYSTEMTIME minDate;
SYSTEMTIME maxDate;
@@ -123,29 +129,65 @@ typedef struct
HWND hwndNotify; /* Window to receive the notifications */
HWND hWndYearEdit; /* Window Handle of edit box to handle years */
HWND hWndYearUpDown;/* Window Handle of updown box to handle years */
+ WNDPROC EditWndProc; /* original Edit window procedure */
} MONTHCAL_INFO, *LPMONTHCAL_INFO;
-
-/* Offsets of days in the week to the weekday of january 1 in a leap year */
-static const int DayOfWeekTable[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
-
static const WCHAR themeClass[] = { 'S','c','r','o','l','l','b','a','r',0 };
+/* empty SYSTEMTIME const */
+static const SYSTEMTIME st_null;
+/* valid date limits */
+static const SYSTEMTIME max_allowed_date = { .wYear = 9999, .wMonth = 12, .wDay = 31 };
+static const SYSTEMTIME min_allowed_date = { .wYear = 1752, .wMonth = 9, .wDay = 14 };
+
+
#define MONTHCAL_GetInfoPtr(hwnd) ((MONTHCAL_INFO *)GetWindowLongPtrW(hwnd, 0))
/* helper functions */
+/* send a single MCN_SELCHANGE notification */
+static inline void MONTHCAL_NotifySelectionChange(const MONTHCAL_INFO *infoPtr)
+{
+ NMSELCHANGE nmsc;
+
+ nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
+ nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
+ nmsc.nmhdr.code = MCN_SELCHANGE;
+ nmsc.stSelStart = infoPtr->minSel;
+ nmsc.stSelEnd = infoPtr->maxSel;
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
+}
+
+/* send a single MCN_SELECT notification */
+static inline void MONTHCAL_NotifySelect(const MONTHCAL_INFO *infoPtr)
+{
+ NMSELCHANGE nmsc;
+
+ nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
+ nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
+ nmsc.nmhdr.code = MCN_SELECT;
+ nmsc.stSelStart = infoPtr->minSel;
+ nmsc.stSelEnd = infoPtr->maxSel;
+
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
+}
+
/* returns the number of days in any given month, checking for leap days */
/* january is 1, december is 12 */
int MONTHCAL_MonthLength(int month, int year)
{
- const int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 0};
- /*Wrap around, this eases handling*/
+ const int mdays[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+ /* Wrap around, this eases handling. Getting length only we shouldn't care
+ about year change here cause January and December have
+ the same day quantity */
if(month == 0)
month = 12;
- if(month == 13)
+ else if(month == 13)
month = 1;
+ /* special case for calendar transition year */
+ if(month == min_allowed_date.wMonth && year == min_allowed_date.wYear) return 19;
+
/* if we have a leap year add 1 day to February */
/* a leap year is a year either divisible by 400 */
/* or divisible by 4 and not by 100 */
@@ -165,17 +207,206 @@ static inline BOOL MONTHCAL_IsDateEqual(const SYSTEMTIME *first, const SYSTEMTIM
(first->wDay == second->wDay);
}
-/* make sure that time is valid */
-static BOOL MONTHCAL_ValidateTime(SYSTEMTIME time)
+/* make sure that date fields are valid */
+static BOOL MONTHCAL_ValidateDate(const SYSTEMTIME *time)
{
- if(time.wMonth < 1 || time.wMonth > 12 ) return FALSE;
- if(time.wDayOfWeek > 6) return FALSE;
- if(time.wDay > MONTHCAL_MonthLength(time.wMonth, time.wYear))
+ if(time->wMonth < 1 || time->wMonth > 12 ) return FALSE;
+ if(time->wDayOfWeek > 6) return FALSE;
+ if(time->wDay > MONTHCAL_MonthLength(time->wMonth, time->wYear))
return FALSE;
return TRUE;
}
+/* Copies timestamp part only.
+ *
+ * PARAMETERS
+ *
+ * [I] from : source date
+ * [O] to : dest date
+ */
+static void MONTHCAL_CopyTime(const SYSTEMTIME *from, SYSTEMTIME *to)
+{
+ to->wHour = from->wHour;
+ to->wMinute = from->wMinute;
+ to->wSecond = from->wSecond;
+}
+
+/* Copies date part only.
+ *
+ * PARAMETERS
+ *
+ * [I] from : source date
+ * [O] to : dest date
+ */
+static void MONTHCAL_CopyDate(const SYSTEMTIME *from, SYSTEMTIME *to)
+{
+ to->wYear = from->wYear;
+ to->wMonth = from->wMonth;
+ to->wDay = from->wDay;
+ to->wDayOfWeek = from->wDayOfWeek;
+}
+
+/* Compares two dates in SYSTEMTIME format
+ *
+ * PARAMETERS
+ *
+ * [I] first : pointer to valid first date data to compare
+ * [I] second : pointer to valid second date data to compare
+ *
+ * RETURN VALUE
+ *
+ * -1 : first < second
+ * 0 : first == second
+ * 1 : first > second
+ *
+ * Note that no date validation performed, alreadt validated values expected.
+ */
+static LONG MONTHCAL_CompareSystemTime(const SYSTEMTIME *first, const SYSTEMTIME *second)
+{
+ FILETIME ft_first, ft_second;
+
+ SystemTimeToFileTime(first, &ft_first);
+ SystemTimeToFileTime(second, &ft_second);
+
+ return CompareFileTime(&ft_first, &ft_second);
+}
+
+static LONG MONTHCAL_CompareMonths(const SYSTEMTIME *first, const SYSTEMTIME *second)
+{
+ SYSTEMTIME st_first, st_second;
+
+ st_first = st_second = st_null;
+ MONTHCAL_CopyDate(first, &st_first);
+ MONTHCAL_CopyDate(second, &st_second);
+ st_first.wDay = st_second.wDay = 1;
+
+ return MONTHCAL_CompareSystemTime(&st_first, &st_second);
+}
+
+static LONG MONTHCAL_CompareDate(const SYSTEMTIME *first, const SYSTEMTIME *second)
+{
+ SYSTEMTIME st_first, st_second;
+
+ st_first = st_second = st_null;
+ MONTHCAL_CopyDate(first, &st_first);
+ MONTHCAL_CopyDate(second, &st_second);
+
+ return MONTHCAL_CompareSystemTime(&st_first, &st_second);
+}
+
+/* Checks largest possible date range and configured one
+ *
+ * PARAMETERS
+ *
+ * [I] infoPtr : valid pointer to control data
+ * [I] date : pointer to valid date data to check
+ * [I] fix : make date fit valid range
+ *
+ * RETURN VALUE
+ *
+ * TRUE - date whithin largest and configured range
+ * FALSE - date is outside largest or configured range
+ */
+static BOOL MONTHCAL_IsDateInValidRange(const MONTHCAL_INFO *infoPtr,
+ SYSTEMTIME *date, BOOL fix)
+{
+ const SYSTEMTIME *fix_st = NULL;
+
+ if(MONTHCAL_CompareSystemTime(date, &max_allowed_date) == 1) {
+ fix_st = &max_allowed_date;
+ }
+ else if(MONTHCAL_CompareSystemTime(date, &min_allowed_date) == -1) {
+ fix_st = &min_allowed_date;
+ }
+ else if(infoPtr->rangeValid & GDTR_MAX) {
+ if((MONTHCAL_CompareSystemTime(date, &infoPtr->maxDate) == 1)) {
+ fix_st = &infoPtr->maxDate;
+ }
+ }
+ else if(infoPtr->rangeValid & GDTR_MIN) {
+ if((MONTHCAL_CompareSystemTime(date, &infoPtr->minDate) == -1)) {
+ fix_st = &infoPtr->minDate;
+ }
+ }
+
+ if (fix && fix_st) {
+ date->wYear = fix_st->wYear;
+ date->wMonth = fix_st->wMonth;
+ }
+
+ return fix_st ? FALSE : TRUE;
+}
+
+/* Checks passed range width with configured maximum selection count
+ *
+ * PARAMETERS
+ *
+ * [I] infoPtr : valid pointer to control data
+ * [I] range0 : pointer to valid date data (requested bound)
+ * [I] range1 : pointer to valid date data (primary bound)
+ * [O] adjust : returns adjusted range bound to fit maximum range (optional)
+ *
+ * Adjust value computed basing on primary bound and current maximum selection
+ * count. For simple range check (without adjusted value required) (range0, range1)
+ * relation means nothing.
+ *
+ * RETURN VALUE
+ *
+ * TRUE - range is shorter or equal to maximum
+ * FALSE - range is larger than maximum
+ */
+static BOOL MONTHCAL_IsSelRangeValid(const MONTHCAL_INFO *infoPtr,
+ const SYSTEMTIME *range0,
+ const SYSTEMTIME *range1,
+ SYSTEMTIME *adjust)
+{
+ ULARGE_INTEGER ul_range0, ul_range1, ul_diff;
+ FILETIME ft_range0, ft_range1;
+ LONG cmp;
+
+ SystemTimeToFileTime(range0, &ft_range0);
+ SystemTimeToFileTime(range1, &ft_range1);
+
+ ul_range0.u.LowPart = ft_range0.dwLowDateTime;
+ ul_range0.u.HighPart = ft_range0.dwHighDateTime;
+ ul_range1.u.LowPart = ft_range1.dwLowDateTime;
+ ul_range1.u.HighPart = ft_range1.dwHighDateTime;
+
+ cmp = CompareFileTime(&ft_range0, &ft_range1);
+
+ if(cmp == 1)
+ ul_diff.QuadPart = ul_range0.QuadPart - ul_range1.QuadPart;
+ else
+ ul_diff.QuadPart = -ul_range0.QuadPart + ul_range1.QuadPart;
+
+ if(ul_diff.QuadPart >= DAYSTO100NSECS(infoPtr->maxSelCount)) {
+
+ if(adjust) {
+ if(cmp == 1)
+ ul_range0.QuadPart = ul_range1.QuadPart + DAYSTO100NSECS(infoPtr->maxSelCount - 1);
+ else
+ ul_range0.QuadPart = ul_range1.QuadPart - DAYSTO100NSECS(infoPtr->maxSelCount - 1);
+
+ ft_range0.dwLowDateTime = ul_range0.u.LowPart;
+ ft_range0.dwHighDateTime = ul_range0.u.HighPart;
+ FileTimeToSystemTime(&ft_range0, adjust);
+ }
+
+ return FALSE;
+ }
+ else return TRUE;
+}
+
+/* Used in MCM_SETRANGE/MCM_SETSELRANGE to determine resulting time part.
+ Milliseconds are intentionally not validated. */
+static BOOL MONTHCAL_ValidateTime(const SYSTEMTIME *time)
+{
+ if((time->wHour > 24) || (time->wMinute > 59) || (time->wSecond > 59))
+ return FALSE;
+ else
+ return TRUE;
+}
/* Note:Depending on DST, this may be offset by a day.
Need to find out if we're on a DST place & adjust the clock accordingly.
@@ -184,14 +415,89 @@ static BOOL MONTHCAL_ValidateTime(SYSTEMTIME time)
0 = Sunday.
*/
-/* returns the day in the week(0 == sunday, 6 == saturday) */
-/* day(1 == 1st, 2 == 2nd... etc), year is the year value */
-static int MONTHCAL_CalculateDayOfWeek(DWORD day, DWORD month, DWORD year)
+/* Returns the day in the week
+ *
+ * PARAMETERS
+ * [i] date : input date
+ * [I] inplace : set calculated value back to date structure
+ *
+ * RETURN VALUE
+ * day of week in SYSTEMTIME format: (0 == sunday,..., 6 == saturday)
+ */
+int MONTHCAL_CalculateDayOfWeek(SYSTEMTIME *date, BOOL inplace)
{
- year-=(month < 3);
+ SYSTEMTIME st = st_null;
+ FILETIME ft;
- return((year + year/4 - year/100 + year/400 +
- DayOfWeekTable[month-1] + day ) % 7);
+ MONTHCAL_CopyDate(date, &st);
+
+ SystemTimeToFileTime(&st, &ft);
+ FileTimeToSystemTime(&ft, &st);
+
+ if (inplace) date->wDayOfWeek = st.wDayOfWeek;
+
+ return st.wDayOfWeek;
+}
+
+/* properly updates date to point on next month */
+static inline void MONTHCAL_GetNextMonth(SYSTEMTIME *date)
+{
+ if(++date->wMonth > 12)
+ {
+ date->wMonth = 1;
+ date->wYear++;
+ }
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
+}
+
+/* properly updates date to point on prev month */
+static inline void MONTHCAL_GetPrevMonth(SYSTEMTIME *date)
+{
+ if(--date->wMonth < 1)
+ {
+ date->wMonth = 12;
+ date->wYear--;
+ }
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
+}
+
+/* Returns full date for a first currently visible day */
+static void MONTHCAL_GetMinDate(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *date)
+{
+ SYSTEMTIME st_first = infoPtr->curSel;
+ int firstDay;
+
+ st_first.wDay = 1;
+ firstDay = MONTHCAL_CalculateDayOfWeek(&st_first, FALSE);
+
+ *date = infoPtr->curSel;
+ MONTHCAL_GetPrevMonth(date);
+
+ date->wDay = MONTHCAL_MonthLength(date->wMonth, date->wYear) +
+ (infoPtr->firstDay - firstDay) % 7 + 1;
+
+ if(date->wDay > MONTHCAL_MonthLength(date->wMonth, date->wYear))
+ date->wDay -= 7;
+
+ /* fix day of week */
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
+}
+
+/* Returns full date for a last currently visible day */
+static void MONTHCAL_GetMaxDate(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *date)
+{
+ SYSTEMTIME st;
+
+ *date = infoPtr->curSel;
+ MONTHCAL_GetNextMonth(date);
+
+ MONTHCAL_GetMinDate(infoPtr, &st);
+ /* Use month length to get max day. 42 means max day count in calendar area */
+ date->wDay = 42 - (MONTHCAL_MonthLength(st.wMonth, st.wYear) - st.wDay + 1) -
+ MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear);
+
+ /* fix day of week */
+ MONTHCAL_CalculateDayOfWeek(date, TRUE);
}
/* From a given point, calculate the row (weekpos), column(daypos)
@@ -202,6 +508,7 @@ static int MONTHCAL_CalcDayFromPos(const MONTHCAL_INFO *infoPtr, int x, int y,
{
int retval, firstDay;
RECT rcClient;
+ SYSTEMTIME st = infoPtr->curSel;
GetClientRect(infoPtr->hwndSelf, &rcClient);
@@ -214,44 +521,53 @@ static int MONTHCAL_CalcDayFromPos(const MONTHCAL_INFO *infoPtr, int x, int y,
*daypos = (x - infoPtr->days.left ) / infoPtr->width_increment;
*weekpos = (y - infoPtr->days.top ) / infoPtr->height_increment;
- firstDay = (MONTHCAL_CalculateDayOfWeek(1, infoPtr->currentMonth, infoPtr->currentYear)+6 - infoPtr->firstDay)%7;
+ st.wDay = 1;
+ firstDay = (MONTHCAL_CalculateDayOfWeek(&st, FALSE) + 6 - infoPtr->firstDay) % 7;
retval = *daypos + (7 * *weekpos) - firstDay;
return retval;
}
-/* day is the day of the month, 1 == 1st day of the month */
-/* sets x and y to be the position of the day */
-/* x == day, y == week where(0,0) == firstDay, 1st week */
-static void MONTHCAL_CalcDayXY(const MONTHCAL_INFO *infoPtr, int day, int month,
- int *x, int *y)
+/* Sets the RECT struct r to the rectangle around the date
+ *
+ * PARAMETERS
+ *
+ * [I] infoPtr : pointer to control data
+ * [I] date : date value
+ * [O] x : day column (zero based)
+ * [O] y : week column (zero based)
+ */
+static void MONTHCAL_CalcDayXY(const MONTHCAL_INFO *infoPtr,
+ const SYSTEMTIME *date, int *x, int *y)
{
- int firstDay, prevMonth;
+ SYSTEMTIME st = infoPtr->curSel;
+ LONG cmp;
+ int first;
- firstDay = (MONTHCAL_CalculateDayOfWeek(1, infoPtr->currentMonth, infoPtr->currentYear) +6 - infoPtr->firstDay)%7;
+ st.wDay = 1;
+ first = (MONTHCAL_CalculateDayOfWeek(&st, FALSE) + 6 - infoPtr->firstDay) % 7;
- if(month==infoPtr->currentMonth) {
- *x = (day + firstDay) % 7;
- *y = (day + firstDay - *x) / 7;
- return;
- }
- if(month < infoPtr->currentMonth) {
- prevMonth = month - 1;
- if(prevMonth==0)
- prevMonth = 12;
+ cmp = MONTHCAL_CompareMonths(date, &infoPtr->curSel);
- *x = (MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear) - firstDay) % 7;
+ /* previous month */
+ if(cmp == -1) {
+ *x = (first - MONTHCAL_MonthLength(date->wMonth, infoPtr->curSel.wYear) + date->wDay) % 7;
*y = 0;
return;
}
- *y = MONTHCAL_MonthLength(month, infoPtr->currentYear - 1) / 7;
- *x = (day + firstDay + MONTHCAL_MonthLength(month,
- infoPtr->currentYear)) % 7;
+ /* next month calculation is same as for current,
+ just add current month length */
+ if(cmp == 1) {
+ first += MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear);
+ }
+
+ *x = (date->wDay + first) % 7;
+ *y = (date->wDay + first - *x) / 7;
}
/* x: column(day), y: row(week) */
-static void MONTHCAL_CalcDayRect(const MONTHCAL_INFO *infoPtr, RECT *r, int x, int y)
+static inline void MONTHCAL_CalcDayRect(const MONTHCAL_INFO *infoPtr, RECT *r, int x, int y)
{
r->left = infoPtr->days.left + x * infoPtr->width_increment;
r->right = r->left + infoPtr->width_increment;
@@ -260,29 +576,67 @@ static void MONTHCAL_CalcDayRect(const MONTHCAL_INFO *infoPtr, RECT *r, int x, i
}
-/* sets the RECT struct r to the rectangle around the day and month */
-/* day is the day value of the month(1 == 1st), month is the month */
-/* value(january == 1, december == 12) */
+/* Sets the RECT struct r to the rectangle around the date */
static inline void MONTHCAL_CalcPosFromDay(const MONTHCAL_INFO *infoPtr,
- int day, int month, RECT *r)
+ const SYSTEMTIME *date, RECT *r)
{
int x, y;
- MONTHCAL_CalcDayXY(infoPtr, day, month, &x, &y);
+ MONTHCAL_CalcDayXY(infoPtr, date, &x, &y);
MONTHCAL_CalcDayRect(infoPtr, r, x, y);
}
+/* Focused day helper:
-/* day is the day in the month(1 == 1st of the month) */
-/* month is the month value(1 == january, 12 == december) */
-static void MONTHCAL_CircleDay(const MONTHCAL_INFO *infoPtr, HDC hdc, int day, int month)
+ - set focused date to given value;
+ - reset to zero value if NULL passed;
+ - invalidate previous and new day rectangle only if needed.
+
+ Returns TRUE if focused day changed, FALSE otherwise.
+*/
+static BOOL MONTHCAL_SetDayFocus(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *st)
+{
+ RECT r;
+
+ if(st)
+ {
+ /* there's nothing to do if it's the same date,
+ mouse move within same date rectangle case */
+ if(MONTHCAL_IsDateEqual(&infoPtr->focusedSel, st)) return FALSE;
+
+ /* invalidate old focused day */
+ MONTHCAL_CalcPosFromDay(infoPtr, &infoPtr->focusedSel, &r);
+ InvalidateRect(infoPtr->hwndSelf, &r, FALSE);
+
+ infoPtr->focusedSel = *st;
+ }
+
+ MONTHCAL_CalcPosFromDay(infoPtr, &infoPtr->focusedSel, &r);
+
+ if(!st && MONTHCAL_ValidateDate(&infoPtr->focusedSel))
+ infoPtr->focusedSel = st_null;
+
+ /* on set invalidates new day, on reset clears previous focused day */
+ InvalidateRect(infoPtr->hwndSelf, &r, FALSE);
+
+ return TRUE;
+}
+
+/* Draw today day mark rectangle
+ *
+ * [I] hdc : context to draw in
+ * [I] day : day to mark with rectangle
+ *
+ */
+static void MONTHCAL_CircleDay(const MONTHCAL_INFO *infoPtr, HDC hdc,
+ const SYSTEMTIME *date)
{
HPEN hRedPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
HPEN hOldPen2 = SelectObject(hdc, hRedPen);
HBRUSH hOldBrush;
RECT day_rect;
- MONTHCAL_CalcPosFromDay(infoPtr, day, month, &day_rect);
+ MONTHCAL_CalcPosFromDay(infoPtr, date, &day_rect);
hOldBrush = SelectObject(hdc, GetStockObject(NULL_BRUSH));
Rectangle(hdc, day_rect.left, day_rect.top, day_rect.right, day_rect.bottom);
@@ -292,78 +646,64 @@ static void MONTHCAL_CircleDay(const MONTHCAL_INFO *infoPtr, HDC hdc, int day, i
SelectObject(hdc, hOldPen2);
}
-static void MONTHCAL_DrawDay(const MONTHCAL_INFO *infoPtr, HDC hdc, int day, int month,
- int x, int y, int bold)
+static void MONTHCAL_DrawDay(const MONTHCAL_INFO *infoPtr, HDC hdc, const SYSTEMTIME *st,
+ int bold, const PAINTSTRUCT *ps)
{
static const WCHAR fmtW[] = { '%','d',0 };
WCHAR buf[10];
- RECT r;
- static BOOL haveBoldFont, haveSelectedDay = FALSE;
+ RECT r, r_temp;
+ static BOOL bold_selected;
+ BOOL selected_day = FALSE;
HBRUSH hbr;
COLORREF oldCol = 0;
- COLORREF oldBk = 0;
-
- wsprintfW(buf, fmtW, day);
+ COLORREF oldBk = 0;
/* No need to check styles: when selection is not valid, it is set to zero.
* 1rcPaint), &r)) return;
- if((day>=infoPtr->minSel.wDay) && (day<=infoPtr->maxSel.wDay)
- && (month==infoPtr->currentMonth)) {
- RECT r2;
+ if ((MONTHCAL_CompareDate(st, &infoPtr->minSel) >= 0) &&
+ (MONTHCAL_CompareDate(st, &infoPtr->maxSel) <= 0)) {
- TRACE("%d %d %d\n",day, infoPtr->minSel.wDay, infoPtr->maxSel.wDay);
+ TRACE("%d %d %d\n", st->wDay, infoPtr->minSel.wDay, infoPtr->maxSel.wDay);
TRACE("%s\n", wine_dbgstr_rect(&r));
oldCol = SetTextColor(hdc, infoPtr->monthbk);
oldBk = SetBkColor(hdc, infoPtr->trailingtxt);
hbr = GetSysColorBrush(COLOR_HIGHLIGHT);
FillRect(hdc, &r, hbr);
- /* FIXME: this may need to be changed now b/c of the other
- drawing changes 11/3/99 CMM */
- r2.left = r.left - 0.25 * infoPtr->textWidth;
- r2.top = r.top;
- r2.right = r.left + 0.5 * infoPtr->textWidth;
- r2.bottom = r.bottom;
- if(haveSelectedDay) FillRect(hdc, &r2, hbr);
- haveSelectedDay = TRUE;
- } else {
- haveSelectedDay = FALSE;
+ selected_day = TRUE;
}
- /* need to add some code for multiple selections */
-
- if((bold) &&(!haveBoldFont)) {
+ if(bold && !bold_selected) {
SelectObject(hdc, infoPtr->hBoldFont);
- haveBoldFont = TRUE;
+ bold_selected = TRUE;
}
- if((!bold) &&(haveBoldFont)) {
+ if(!bold && bold_selected) {
SelectObject(hdc, infoPtr->hFont);
- haveBoldFont = FALSE;
+ bold_selected = FALSE;
}
SetBkMode(hdc,TRANSPARENT);
+ wsprintfW(buf, fmtW, st->wDay);
DrawTextW(hdc, buf, -1, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
- if(haveSelectedDay) {
+ if(selected_day) {
SetTextColor(hdc, oldCol);
SetBkColor(hdc, oldBk);
}
-
- /* draw a rectangle around the currently selected days text */
- if((day==infoPtr->curSelDay) && (month==infoPtr->currentMonth))
- DrawFocusRect(hdc, &r);
}
-static void paint_button (const MONTHCAL_INFO *infoPtr, HDC hdc, BOOL btnNext,
- BOOL pressed, RECT* r)
+static void MONTHCAL_PaintButton(MONTHCAL_INFO *infoPtr, HDC hdc, BOOL btnNext)
{
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
-
+ RECT *r = btnNext ? &infoPtr->titlebtnnext : &infoPtr->titlebtnprev;
+ BOOL pressed = btnNext ? (infoPtr->status & MC_NEXTPRESSED) :
+ (infoPtr->status & MC_PREVPRESSED);
if (theme)
{
static const int states[] = {
@@ -394,350 +734,305 @@ static void paint_button (const MONTHCAL_INFO *infoPtr, HDC hdc, BOOL btnNext,
DrawFrameControl(hdc, r, DFC_SCROLL, style);
}
}
-
-
-static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps)
+/* paint a title with buttons and month/year string */
+static void MONTHCAL_PaintTitle(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps)
{
- static const WCHAR todayW[] = { 'T','o','d','a','y',':',0 };
- static const WCHAR fmt1W[] = { '%','s',' ','%','l','d',0 };
- static const WCHAR fmt2W[] = { '%','s',' ','%','s',0 };
- static const WCHAR fmt3W[] = { '%','d',0 };
- RECT *title=&infoPtr->title;
- RECT *prev=&infoPtr->titlebtnprev;
- RECT *next=&infoPtr->titlebtnnext;
- RECT *titlemonth=&infoPtr->titlemonth;
- RECT *titleyear=&infoPtr->titleyear;
- RECT dayrect;
- RECT *days=&dayrect;
- RECT rtoday;
- int i, j, m, mask, day, firstDay, weeknum, weeknum1,prevMonth;
- int textHeight = infoPtr->textHeight;
- SIZE size;
+ static const WCHAR fmt_monthW[] = { '%','s',' ','%','l','d',0 };
+ WCHAR buf_month[80], buf_fmt[80];
HBRUSH hbr;
- HFONT currentFont;
- WCHAR buf[20];
- WCHAR buf1[20];
- WCHAR buf2[32];
- COLORREF oldTextColor, oldBkColor;
- RECT rcTemp;
- RECT rcDay; /* used in MONTHCAL_CalcDayRect() */
- SYSTEMTIME localtime;
- int startofprescal;
+ RECT *title = &infoPtr->title;
+ SIZE sz;
- oldTextColor = SetTextColor(hdc, comctl32_color.clrWindowText);
-
- /* fill background */
- hbr = CreateSolidBrush (infoPtr->bk);
- FillRect(hdc, &ps->rcPaint, hbr);
+ /* fill header box */
+ hbr = CreateSolidBrush(infoPtr->titlebk);
+ FillRect(hdc, title, hbr);
DeleteObject(hbr);
- /* draw header */
- if(IntersectRect(&rcTemp, &(ps->rcPaint), title))
- {
- hbr = CreateSolidBrush(infoPtr->titlebk);
- FillRect(hdc, title, hbr);
- DeleteObject(hbr);
- }
+ /* navigation buttons */
+ MONTHCAL_PaintButton(infoPtr, hdc, FALSE);
+ MONTHCAL_PaintButton(infoPtr, hdc, TRUE);
- /* if the previous button is pressed draw it depressed */
- if(IntersectRect(&rcTemp, &(ps->rcPaint), prev))
- paint_button (infoPtr, hdc, FALSE, infoPtr->status & MC_PREVPRESSED, prev);
-
- /* if next button is depressed draw it depressed */
- if(IntersectRect(&rcTemp, &(ps->rcPaint), next))
- paint_button (infoPtr, hdc, TRUE, infoPtr->status & MC_NEXTPRESSED, next);
-
- oldBkColor = SetBkColor(hdc, infoPtr->titlebk);
+ /* month/year string */
+ SetBkColor(hdc, infoPtr->titlebk);
SetTextColor(hdc, infoPtr->titletxt);
- currentFont = SelectObject(hdc, infoPtr->hBoldFont);
+ SelectObject(hdc, infoPtr->hBoldFont);
- GetLocaleInfoW( LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+infoPtr->currentMonth -1,
- buf1,countof(buf1));
- wsprintfW(buf, fmt1W, buf1, infoPtr->currentYear);
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+infoPtr->curSel.wMonth-1,
+ buf_month, countof(buf_month));
- if(IntersectRect(&rcTemp, &(ps->rcPaint), title))
- {
- DrawTextW(hdc, buf, strlenW(buf), title,
- DT_CENTER | DT_VCENTER | DT_SINGLELINE);
- }
+ wsprintfW(buf_fmt, fmt_monthW, buf_month, infoPtr->curSel.wYear);
+ DrawTextW(hdc, buf_fmt, strlenW(buf_fmt), title,
+ DT_CENTER | DT_VCENTER | DT_SINGLELINE);
-/* titlemonth left/right contained rect for whole titletxt('June 1999')
- * MCM_HitTestInfo wants month & year rects, so prepare these now.
- *(no, we can't draw them separately; the whole text is centered)
+ /* update title rectangles with current month - used while testing hits */
+ GetTextExtentPoint32W(hdc, buf_fmt, strlenW(buf_fmt), &sz);
+ infoPtr->titlemonth.left = title->right / 2 + title->left / 2 - sz.cx / 2;
+ infoPtr->titleyear.right = title->right / 2 + title->left / 2 + sz.cx / 2;
+
+ GetTextExtentPoint32W(hdc, buf_month, strlenW(buf_month), &sz);
+ infoPtr->titlemonth.right = infoPtr->titlemonth.left + sz.cx;
+ infoPtr->titleyear.left = infoPtr->titlemonth.right;
+}
+
+static void MONTHCAL_PaintWeeknumbers(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps)
+{
+ static const WCHAR fmt_weekW[] = { '%','d',0 };
+ INT mindays, weeknum, weeknum1, startofprescal;
+ SYSTEMTIME st = infoPtr->curSel;
+ RECT r;
+ WCHAR buf[80];
+ INT i, prev_month;
+
+ if (!(infoPtr->dwStyle & MCS_WEEKNUMBERS)) return;
+
+ MONTHCAL_GetMinDate(infoPtr, &st);
+ startofprescal = st.wDay;
+ st = infoPtr->curSel;
+
+ prev_month = infoPtr->curSel.wMonth - 1;
+ if(prev_month == 0) prev_month = 12;
+
+ /*
+ Rules what week to call the first week of a new year:
+ LOCALE_IFIRSTWEEKOFYEAR == 0 (e.g US?):
+ The week containing Jan 1 is the first week of year
+ LOCALE_IFIRSTWEEKOFYEAR == 2 (e.g. Germany):
+ First week of year must contain 4 days of the new year
+ LOCALE_IFIRSTWEEKOFYEAR == 1 (what contries?)
+ The first week of the year must contain only days of the new year
*/
- GetTextExtentPoint32W(hdc, buf, strlenW(buf), &size);
- titlemonth->left = title->right / 2 + title->left / 2 - size.cx / 2;
- titleyear->right = title->right / 2 + title->left / 2 + size.cx / 2;
- GetTextExtentPoint32W(hdc, buf1, strlenW(buf1), &size);
- titlemonth->right = titlemonth->left + size.cx;
- titleyear->left = titlemonth->right;
-
- /* draw month area */
- rcTemp.top=infoPtr->wdays.top;
- rcTemp.left=infoPtr->wdays.left;
- rcTemp.bottom=infoPtr->todayrect.bottom;
- rcTemp.right =infoPtr->todayrect.right;
- if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcTemp))
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR, buf, countof(buf));
+ weeknum = atoiW(buf);
+ switch (weeknum)
{
- hbr = CreateSolidBrush(infoPtr->monthbk);
- FillRect(hdc, &rcTemp, hbr);
- DeleteObject(hbr);
+ case 1: mindays = 6;
+ break;
+ case 2: mindays = 3;
+ break;
+ case 0: mindays = 0;
+ break;
+ default:
+ WARN("Unknown LOCALE_IFIRSTWEEKOFYEAR value %d, defaulting to 0\n", weeknum);
+ mindays = 0;
}
-/* draw line under day abbreviations */
+ if (infoPtr->curSel.wMonth == 1)
+ {
+ /* calculate all those exceptions for january */
+ st.wDay = st.wMonth = 1;
+ weeknum1 = MONTHCAL_CalculateDayOfWeek(&st, FALSE);
+ if ((infoPtr->firstDay - weeknum1) % 7 > mindays)
+ weeknum = 1;
+ else
+ {
+ weeknum = 0;
+ for(i = 0; i < 11; i++)
+ weeknum += MONTHCAL_MonthLength(i+1, infoPtr->curSel.wYear - 1);
- MoveToEx(hdc, infoPtr->days.left + 3, title->bottom + textHeight + 1, NULL);
- LineTo(hdc, infoPtr->days.right - 3, title->bottom + textHeight + 1);
+ weeknum += startofprescal + 7;
+ weeknum /= 7;
+ st.wYear -= 1;
+ weeknum1 = MONTHCAL_CalculateDayOfWeek(&st, FALSE);
+ if ((infoPtr->firstDay - weeknum1) % 7 > mindays) weeknum++;
+ }
+ }
+ else
+ {
+ weeknum = 0;
+ for(i = 0; i < prev_month - 1; i++)
+ weeknum += MONTHCAL_MonthLength(i+1, infoPtr->curSel.wYear);
- prevMonth = infoPtr->currentMonth - 1;
- if(prevMonth == 0) /* if currentMonth is january(1) prevMonth is */
- prevMonth = 12; /* december(12) of the previous year */
+ weeknum += startofprescal + 7;
+ weeknum /= 7;
+ st.wDay = st.wMonth = 1;
+ weeknum1 = MONTHCAL_CalculateDayOfWeek(&st, FALSE);
+ if ((infoPtr->firstDay - weeknum1) % 7 > mindays) weeknum++;
+ }
- infoPtr->wdays.left = infoPtr->days.left = infoPtr->weeknums.right;
-/* draw day abbreviations */
+ r = infoPtr->weeknums;
+ r.bottom = r.top + infoPtr->height_increment;
+ for(i = 0; i < 6; i++) {
+ if((i == 0) && (weeknum > 50))
+ {
+ wsprintfW(buf, fmt_weekW, weeknum);
+ weeknum = 0;
+ }
+ else if((i == 5) && (weeknum > 47))
+ {
+ wsprintfW(buf, fmt_weekW, 1);
+ }
+ else
+ wsprintfW(buf, fmt_weekW, weeknum + i);
+
+ DrawTextW(hdc, buf, -1, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
+ OffsetRect(&r, 0, infoPtr->height_increment);
+ }
+
+ /* line separator for week numbers column */
+ MoveToEx(hdc, infoPtr->weeknums.right, infoPtr->weeknums.top + 3 , NULL);
+ LineTo(hdc, infoPtr->weeknums.right, infoPtr->weeknums.bottom);
+}
+
+/* paint a calendar area */
+static void MONTHCAL_PaintCalendar(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps)
+{
+ INT prev_month, i, j;
+ WCHAR buf[80];
+ HBRUSH hbr;
+ RECT r;
+ int mask;
+ SYSTEMTIME st;
+
+ UnionRect(&r, &infoPtr->wdays, &infoPtr->todayrect);
+
+ hbr = CreateSolidBrush(infoPtr->monthbk);
+ FillRect(hdc, &r, hbr);
+ DeleteObject(hbr);
+
+ /* draw line under day abbreviations */
+ MoveToEx(hdc, infoPtr->days.left + 3,
+ infoPtr->title.bottom + infoPtr->textHeight + 1, NULL);
+ LineTo(hdc, infoPtr->days.right - 3,
+ infoPtr->title.bottom + infoPtr->textHeight + 1);
+
+ prev_month = infoPtr->curSel.wMonth - 1;
+ if(prev_month == 0) prev_month = 12;
+
+ infoPtr->wdays.left = infoPtr->days.left = infoPtr->weeknums.right;
+
+ /* 1. draw day abbreviations */
SelectObject(hdc, infoPtr->hFont);
SetBkColor(hdc, infoPtr->monthbk);
SetTextColor(hdc, infoPtr->trailingtxt);
-
- /* copy this rect so we can change the values without changing */
- /* the original version */
- days->left = infoPtr->wdays.left;
- days->right = days->left + infoPtr->width_increment;
- days->top = infoPtr->wdays.top;
- days->bottom = infoPtr->wdays.bottom;
+ /* rectangle to draw a single day abbreviation within */
+ r = infoPtr->wdays;
+ r.right = r.left + infoPtr->width_increment;
i = infoPtr->firstDay;
-
- for(j=0; j<7; j++) {
- GetLocaleInfoW( LOCALE_USER_DEFAULT,LOCALE_SABBREVDAYNAME1 + (i+j+6)%7, buf, countof(buf));
- DrawTextW(hdc, buf, strlenW(buf), days, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
- days->left+=infoPtr->width_increment;
- days->right+=infoPtr->width_increment;
+ for(j = 0; j < 7; j++) {
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1 + (i+j+6)%7, buf, countof(buf));
+ DrawTextW(hdc, buf, strlenW(buf), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
+ OffsetRect(&r, infoPtr->width_increment, 0);
}
-/* draw day numbers; first, the previous month */
+ /* 2. previous and next months */
+ if (!(infoPtr->dwStyle & MCS_NOTRAILINGDATES))
+ {
+ SYSTEMTIME st_max;
- firstDay = MONTHCAL_CalculateDayOfWeek(1, infoPtr->currentMonth, infoPtr->currentYear);
+ SetTextColor(hdc, infoPtr->trailingtxt);
- day = MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear) +
- (infoPtr->firstDay + 7 - firstDay)%7 + 1;
- if (day > MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear))
- day -=7;
- startofprescal = day;
- mask = 1<<(day-1);
+ MONTHCAL_GetMinDate(infoPtr, &st);
- i = 0;
- m = 0;
- while(day <= MONTHCAL_MonthLength(prevMonth, infoPtr->currentYear)) {
- MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, 0);
- if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
- {
- MONTHCAL_DrawDay(infoPtr, hdc, day, prevMonth, i, 0,
- infoPtr->monthdayState[m] & mask);
+ /* draw prev month */
+ mask = 1 << (st.wDay-1);
+ while(st.wDay <= MONTHCAL_MonthLength(prev_month, infoPtr->curSel.wYear)) {
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, infoPtr->monthdayState[0] & mask, ps);
+ mask <<= 1;
+ st.wDay++;
}
- mask<<=1;
- day++;
- i++;
+ /* draw next month */
+ st = infoPtr->curSel;
+ st.wDay = 1;
+ MONTHCAL_GetNextMonth(&st);
+ MONTHCAL_GetMaxDate(infoPtr, &st_max);
+ mask = 1;
+ while(st.wDay <= st_max.wDay) {
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, infoPtr->monthdayState[2] & mask, ps);
+ mask <<= 1;
+ st.wDay++;
+ }
}
-/* draw `current' month */
-
- day = 1; /* start at the beginning of the current month */
-
- infoPtr->firstDayplace = i;
+ /* 3. current month */
SetTextColor(hdc, infoPtr->txt);
- m++;
+ st = infoPtr->curSel;
+ st.wDay = 1;
mask = 1;
-
- /* draw the first week of the current month */
- while(i<7) {
- MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, 0);
- if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
- {
-
- MONTHCAL_DrawDay(infoPtr, hdc, day, infoPtr->currentMonth, i, 0,
- infoPtr->monthdayState[m] & mask);
-
- if((infoPtr->currentMonth==infoPtr->todaysDate.wMonth) &&
- (day==infoPtr->todaysDate.wDay) &&
- (infoPtr->currentYear == infoPtr->todaysDate.wYear)) {
- if(!(infoPtr->dwStyle & MCS_NOTODAYCIRCLE))
- MONTHCAL_CircleDay(infoPtr, hdc, day, infoPtr->currentMonth);
- }
- }
-
- mask<<=1;
- day++;
- i++;
+ while(st.wDay <= MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear)) {
+ MONTHCAL_DrawDay(infoPtr, hdc, &st, infoPtr->monthdayState[1] & mask,
+ ps);
+ mask <<= 1;
+ st.wDay++;
}
- j = 1; /* move to the 2nd week of the current month */
- i = 0; /* move back to sunday */
- while(day <= MONTHCAL_MonthLength(infoPtr->currentMonth, infoPtr->currentYear)) {
- MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, j);
- if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
- {
- MONTHCAL_DrawDay(infoPtr, hdc, day, infoPtr->currentMonth, i, j,
- infoPtr->monthdayState[m] & mask);
-
- if((infoPtr->currentMonth==infoPtr->todaysDate.wMonth) &&
- (day==infoPtr->todaysDate.wDay) &&
- (infoPtr->currentYear == infoPtr->todaysDate.wYear))
- if(!(infoPtr->dwStyle & MCS_NOTODAYCIRCLE))
- MONTHCAL_CircleDay(infoPtr, hdc, day, infoPtr->currentMonth);
- }
- mask<<=1;
- day++;
- i++;
- if(i>6) { /* past saturday, goto the next weeks sunday */
- i = 0;
- j++;
- }
- }
-
-/* draw `next' month */
-
- day = 1; /* start at the first day of the next month */
- m++;
- mask = 1;
-
- SetTextColor(hdc, infoPtr->trailingtxt);
- while((i<7) &&(j<6)) {
- MONTHCAL_CalcDayRect(infoPtr, &rcDay, i, j);
- if(IntersectRect(&rcTemp, &(ps->rcPaint), &rcDay))
- {
- MONTHCAL_DrawDay(infoPtr, hdc, day, infoPtr->currentMonth + 1, i, j,
- infoPtr->monthdayState[m] & mask);
- }
-
- mask<<=1;
- day++;
- i++;
- if(i==7) { /* past saturday, go to next week's sunday */
- i = 0;
- j++;
- }
- }
- SetTextColor(hdc, infoPtr->txt);
-
-
-/* draw `today' date if style allows it, and draw a circle before today's
- * date if necessary */
-
+ /* 4. bottom today date */
if(!(infoPtr->dwStyle & MCS_NOTODAY)) {
- if(!(infoPtr->dwStyle & MCS_NOTODAYCIRCLE)) {
- /*day is the number of days from nextmonth we put on the calendar */
- MONTHCAL_CircleDay(infoPtr, hdc,
- day+MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear),
- infoPtr->currentMonth);
+ static const WCHAR todayW[] = { 'T','o','d','a','y',':',0 };
+ static const WCHAR fmt_todayW[] = { '%','s',' ','%','s',0 };
+ WCHAR buf_todayW[30], buf_dateW[20];
+ RECT rtoday;
+
+ if(!(infoPtr->dwStyle & MCS_NOTODAYCIRCLE)) {
+ SYSTEMTIME fake_st;
+
+ MONTHCAL_GetMaxDate(infoPtr, &fake_st);
+ /* this is always safe cause next month will never fully fit calendar */
+ fake_st.wDay += 1;
+ MONTHCAL_CircleDay(infoPtr, hdc, &fake_st);
}
- if (!LoadStringW(COMCTL32_hModule,IDM_TODAY,buf1,countof(buf1)))
- {
+ if (!LoadStringW(COMCTL32_hModule, IDM_TODAY, buf_todayW, countof(buf_todayW)))
+ {
WARN("Can't load resource\n");
- strcpyW(buf1, todayW);
- }
+ strcpyW(buf_todayW, todayW);
+ }
MONTHCAL_CalcDayRect(infoPtr, &rtoday, 1, 6);
- MONTHCAL_CopyTime(&infoPtr->todaysDate,&localtime);
- GetDateFormatW(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&localtime,NULL,buf2,countof(buf2));
- wsprintfW(buf, fmt2W, buf1, buf2);
+ GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &infoPtr->todaysDate, NULL,
+ buf_dateW, countof(buf_dateW));
SelectObject(hdc, infoPtr->hBoldFont);
+ wsprintfW(buf, fmt_todayW, buf_todayW, buf_dateW);
DrawTextW(hdc, buf, -1, &rtoday, DT_CALCRECT | DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- if(IntersectRect(&rcTemp, &(ps->rcPaint), &rtoday))
- {
- DrawTextW(hdc, buf, -1, &rtoday, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
- }
+ DrawTextW(hdc, buf, -1, &rtoday, DT_LEFT | DT_VCENTER | DT_SINGLELINE);
+
SelectObject(hdc, infoPtr->hFont);
}
-/*eventually draw week numbers*/
- if(infoPtr->dwStyle & MCS_WEEKNUMBERS) {
- /* display weeknumbers*/
- int mindays;
-
- /* Rules what week to call the first week of a new year:
- LOCALE_IFIRSTWEEKOFYEAR == 0 (e.g US?):
- The week containing Jan 1 is the first week of year
- LOCALE_IFIRSTWEEKOFYEAR == 2 (e.g. Germany):
- First week of year must contain 4 days of the new year
- LOCALE_IFIRSTWEEKOFYEAR == 1 (what contries?)
- The first week of the year must contain only days of the new year
- */
- GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTWEEKOFYEAR, buf, countof(buf));
- weeknum = atoiW(buf);
- switch (weeknum)
- {
- case 1: mindays = 6;
- break;
- case 2: mindays = 3;
- break;
- case 0:
- default:
- mindays = 0;
- }
- if (infoPtr->currentMonth < 2)
- {
- /* calculate all those exceptions for january */
- weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear);
- if ((infoPtr->firstDay +7 - weeknum1)%7 > mindays)
- weeknum =1;
- else
- {
- weeknum = 0;
- for(i=0; i<11; i++)
- weeknum+=MONTHCAL_MonthLength(i+1, infoPtr->currentYear-1);
- weeknum +=startofprescal+ 7;
- weeknum /=7;
- weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear-1);
- if ((infoPtr->firstDay + 7 - weeknum1)%7 > mindays)
- weeknum++;
- }
- }
- else
- {
- weeknum = 0;
- for(i=0; icurrentYear);
- weeknum +=startofprescal+ 7;
- weeknum /=7;
- weeknum1=MONTHCAL_CalculateDayOfWeek(1,1,infoPtr->currentYear);
- if ((infoPtr->firstDay + 7 - weeknum1)%7 > mindays)
- weeknum++;
- }
- days->left = infoPtr->weeknums.left;
- days->right = infoPtr->weeknums.right;
- days->top = infoPtr->weeknums.top;
- days->bottom = days->top +infoPtr->height_increment;
- for(i=0; i<6; i++) {
- if((i==0)&&(weeknum>50))
- {
- wsprintfW(buf, fmt3W, weeknum);
- weeknum=0;
- }
- else if((i==5)&&(weeknum>47))
- {
- wsprintfW(buf, fmt3W, 1);
- }
- else
- wsprintfW(buf, fmt3W, weeknum + i);
- DrawTextW(hdc, buf, -1, days, DT_CENTER | DT_VCENTER | DT_SINGLELINE );
- days->top+=infoPtr->height_increment;
- days->bottom+=infoPtr->height_increment;
- }
-
- MoveToEx(hdc, infoPtr->weeknums.right, infoPtr->weeknums.top + 3 , NULL);
- LineTo(hdc, infoPtr->weeknums.right, infoPtr->weeknums.bottom );
-
+ /* 5. today mark + focus */
+ if((infoPtr->curSel.wMonth == infoPtr->todaysDate.wMonth) &&
+ (infoPtr->curSel.wYear == infoPtr->todaysDate.wYear) &&
+ !(infoPtr->dwStyle & MCS_NOTODAYCIRCLE))
+ {
+ MONTHCAL_CircleDay(infoPtr, hdc, &infoPtr->todaysDate);
}
- /* currentFont was font at entering Refresh */
- SetBkColor(hdc, oldBkColor);
- SelectObject(hdc, currentFont);
- SetTextColor(hdc, oldTextColor);
+ if(!MONTHCAL_IsDateEqual(&infoPtr->focusedSel, &st_null))
+ {
+ MONTHCAL_CalcPosFromDay(infoPtr, &infoPtr->focusedSel, &r);
+ DrawFocusRect(hdc, &r);
+ }
}
+static void MONTHCAL_Refresh(MONTHCAL_INFO *infoPtr, HDC hdc, const PAINTSTRUCT *ps)
+{
+ RECT *title = &infoPtr->title;
+ COLORREF old_text_clr, old_bk_clr;
+ HFONT old_font;
+ RECT r_temp;
+
+ old_text_clr = SetTextColor(hdc, comctl32_color.clrWindowText);
+ old_bk_clr = GetBkColor(hdc);
+ old_font = GetCurrentObject(hdc, OBJ_FONT);
+
+ /* draw title, redraw all its elements */
+ if(IntersectRect(&r_temp, &(ps->rcPaint), title))
+ MONTHCAL_PaintTitle(infoPtr, hdc, ps);
+
+ /* draw calendar area */
+ UnionRect(&r_temp, &infoPtr->wdays, &infoPtr->todayrect);
+ if(IntersectRect(&r_temp, &(ps->rcPaint), &r_temp))
+ MONTHCAL_PaintCalendar(infoPtr, hdc, ps);
+
+ /* week numbers */
+ MONTHCAL_PaintWeeknumbers(infoPtr, hdc, ps);
+
+ /* restore context */
+ SetBkColor(hdc, old_bk_clr);
+ SelectObject(hdc, old_font);
+ SetTextColor(hdc, old_text_clr);
+}
static LRESULT
MONTHCAL_GetMinReqRect(const MONTHCAL_INFO *infoPtr, LPRECT lpRect)
@@ -746,12 +1041,16 @@ MONTHCAL_GetMinReqRect(const MONTHCAL_INFO *infoPtr, LPRECT lpRect)
if(!lpRect) return FALSE;
- lpRect->left = infoPtr->title.left;
- lpRect->top = infoPtr->title.top;
- lpRect->right = infoPtr->title.right;
+ lpRect->left = infoPtr->title.left;
+ lpRect->top = infoPtr->title.top;
+ lpRect->right = infoPtr->title.right;
lpRect->bottom = infoPtr->todayrect.bottom;
+
AdjustWindowRect(lpRect, infoPtr->dwStyle, FALSE);
+ /* minimal rectangle is zero based */
+ OffsetRect(lpRect, -lpRect->left, -lpRect->top);
+
TRACE("%s\n", wine_dbgstr_rect(lpRect));
return TRUE;
@@ -845,56 +1144,120 @@ MONTHCAL_SetMonthDelta(MONTHCAL_INFO *infoPtr, INT delta)
}
-static LRESULT
+static inline LRESULT
MONTHCAL_GetFirstDayOfWeek(const MONTHCAL_INFO *infoPtr)
{
- return MAKELONG(infoPtr->firstDay, infoPtr->firstDayHighWord);
+ int day;
+
+ /* convert from SYSTEMTIME to locale format */
+ day = (infoPtr->firstDay >= 0) ? (infoPtr->firstDay+6)%7 : infoPtr->firstDay;
+
+ return MAKELONG(day, infoPtr->firstDaySet);
}
-/* sets the first day of the week that will appear in the control */
-/* 0 == Sunday, 6 == Saturday */
-/* FIXME: this needs to be implemented properly in MONTHCAL_Refresh() */
-/* FIXME: we need more error checking here */
+/* Sets the first day of the week that will appear in the control
+ *
+ *
+ * PARAMETERS:
+ * [I] infoPtr : valid pointer to control data
+ * [I] day : day number to set as new first day (0 == Monday,...,6 == Sunday)
+ *
+ *
+ * RETURN VALUE:
+ * Low word contains previous first day,
+ * high word indicates was first day forced with this message before or is
+ * locale difined (TRUE - was forced, FALSE - wasn't).
+ *
+ * FIXME: this needs to be implemented properly in MONTHCAL_Refresh()
+ * FIXME: we need more error checking here
+ */
static LRESULT
MONTHCAL_SetFirstDayOfWeek(MONTHCAL_INFO *infoPtr, INT day)
{
- int prev = MAKELONG(infoPtr->firstDay, infoPtr->firstDayHighWord);
- int localFirstDay;
- WCHAR buf[40];
+ LRESULT prev = MONTHCAL_GetFirstDayOfWeek(infoPtr);
+ int new_day;
- TRACE("day %d\n", day);
-
- GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, buf, countof(buf));
- TRACE("%s %d\n", debugstr_w(buf), strlenW(buf));
-
- localFirstDay = atoiW(buf);
+ TRACE("%d\n", day);
if(day == -1)
{
- infoPtr->firstDay = localFirstDay;
- infoPtr->firstDayHighWord = FALSE;
+ WCHAR buf[80];
+
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IFIRSTDAYOFWEEK, buf, countof(buf));
+ TRACE("%s %d\n", debugstr_w(buf), strlenW(buf));
+
+ new_day = atoiW(buf);
+
+ infoPtr->firstDaySet = FALSE;
}
else if(day >= 7)
{
- infoPtr->firstDay = 6; /* max first day allowed */
- infoPtr->firstDayHighWord = TRUE;
+ new_day = 6; /* max first day allowed */
+ infoPtr->firstDaySet = TRUE;
}
else
{
- infoPtr->firstDay = day;
- infoPtr->firstDayHighWord = TRUE;
+ /* Native behaviour for that case is broken: invalid date number >31
+ got displayed at (0,0) position, current month starts always from
+ (1,0) position. Should be implemnted here as well. */
+ if (day < -1)
+ FIXME("No bug compatibility for day=%d\n", day);
+
+ new_day = day;
+ infoPtr->firstDaySet = TRUE;
}
+ /* convert from locale to SYSTEMTIME format */
+ infoPtr->firstDay = (new_day >= 0) ? (++new_day) % 7 : new_day;
+
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+
return prev;
}
static LRESULT
-MONTHCAL_GetMonthRange(const MONTHCAL_INFO *infoPtr)
+MONTHCAL_GetMonthRange(const MONTHCAL_INFO *infoPtr, DWORD flag, SYSTEMTIME *st)
{
TRACE("\n");
+ if(st)
+ {
+ switch (flag) {
+ case GMR_VISIBLE:
+ {
+ /*FIXME: currently multicalendar feature isn't implemented, so entirely
+ visible month is current */
+ st[0] = st[1] = infoPtr->curSel;
+
+ if (infoPtr->curSel.wMonth == min_allowed_date.wMonth &&
+ infoPtr->curSel.wYear == min_allowed_date.wYear)
+ {
+ st[0].wDay = min_allowed_date.wDay;
+ }
+ else
+ st[0].wDay = 1;
+ MONTHCAL_CalculateDayOfWeek(&st[0], TRUE);
+
+ st[1].wDay = MONTHCAL_MonthLength(st[1].wMonth, st[1].wYear);
+ MONTHCAL_CalculateDayOfWeek(&st[1], TRUE);
+ /* a single current month used */
+ return 1;
+ }
+ case GMR_DAYSTATE:
+ {
+ /*FIXME: currently multicalendar feature isn't implemented,
+ min date from previous month and max date from next one returned */
+ MONTHCAL_GetMinDate(infoPtr, &st[0]);
+ MONTHCAL_GetMaxDate(infoPtr, &st[1]);
+ break;
+ }
+ default:
+ WARN("Unknown flag value, got %d\n", flag);
+ }
+ }
+
return infoPtr->monthRange;
}
@@ -913,29 +1276,35 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
TRACE("%x %p\n", limits, range);
- if ((limits & GDTR_MIN && !MONTHCAL_ValidateTime(range[0])) ||
- (limits & GDTR_MAX && !MONTHCAL_ValidateTime(range[1])))
+ if ((limits & GDTR_MIN && !MONTHCAL_ValidateDate(&range[0])) ||
+ (limits & GDTR_MAX && !MONTHCAL_ValidateDate(&range[1])))
return FALSE;
if (limits & GDTR_MIN)
{
- MONTHCAL_CopyTime(&range[0], &infoPtr->minDate);
+ if (!MONTHCAL_ValidateTime(&range[0]))
+ MONTHCAL_CopyTime(&infoPtr->todaysDate, &range[0]);
+
+ infoPtr->minDate = range[0];
infoPtr->rangeValid |= GDTR_MIN;
}
if (limits & GDTR_MAX)
{
- MONTHCAL_CopyTime(&range[1], &infoPtr->maxDate);
+ if (!MONTHCAL_ValidateTime(&range[1]))
+ MONTHCAL_CopyTime(&infoPtr->todaysDate, &range[1]);
+
+ infoPtr->maxDate = range[1];
infoPtr->rangeValid |= GDTR_MAX;
}
/* Only one limit set - we are done */
if ((infoPtr->rangeValid & (GDTR_MIN | GDTR_MAX)) != (GDTR_MIN | GDTR_MAX))
return TRUE;
-
+
SystemTimeToFileTime(&infoPtr->maxDate, &ft_max);
SystemTimeToFileTime(&infoPtr->minDate, &ft_min);
- if (CompareFileTime(&ft_min, &ft_max) > 0)
+ if (CompareFileTime(&ft_min, &ft_max) >= 0)
{
if ((limits & (GDTR_MIN | GDTR_MAX)) == (GDTR_MIN | GDTR_MAX))
{
@@ -946,9 +1315,10 @@ MONTHCAL_SetRange(MONTHCAL_INFO *infoPtr, SHORT limits, SYSTEMTIME *range)
}
else
{
- /* Reset the other limit. */
- /* FIXME: native sets date&time to 0. Should we do this too? */
- infoPtr->rangeValid &= limits & GDTR_MIN ? ~GDTR_MAX : ~GDTR_MIN ;
+ /* reset the other limit */
+ if (limits & GDTR_MIN) infoPtr->maxDate = st_null;
+ if (limits & GDTR_MAX) infoPtr->minDate = st_null;
+ infoPtr->rangeValid &= limits & GDTR_MIN ? ~GDTR_MAX : ~GDTR_MIN;
}
}
@@ -963,8 +1333,8 @@ MONTHCAL_GetRange(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *range)
if(!range) return FALSE;
- MONTHCAL_CopyTime(&infoPtr->maxDate, &range[1]);
- MONTHCAL_CopyTime(&infoPtr->minDate, &range[0]);
+ range[1] = infoPtr->maxDate;
+ range[0] = infoPtr->minDate;
return infoPtr->rangeValid;
}
@@ -991,34 +1361,46 @@ MONTHCAL_GetCurSel(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *curSel)
if(!curSel) return FALSE;
if(infoPtr->dwStyle & MCS_MULTISELECT) return FALSE;
- MONTHCAL_CopyTime(&infoPtr->minSel, curSel);
+ *curSel = infoPtr->curSel;
TRACE("%d/%d/%d\n", curSel->wYear, curSel->wMonth, curSel->wDay);
return TRUE;
}
-/* FIXME: if the specified date is not visible, make it visible */
-/* FIXME: redraw? */
static LRESULT
MONTHCAL_SetCurSel(MONTHCAL_INFO *infoPtr, SYSTEMTIME *curSel)
{
+ SYSTEMTIME prev = infoPtr->curSel;
+
TRACE("%p\n", curSel);
if(!curSel) return FALSE;
if(infoPtr->dwStyle & MCS_MULTISELECT) return FALSE;
- if(!MONTHCAL_ValidateTime(*curSel)) return FALSE;
-
- MONTHCAL_CopyTime(curSel, &infoPtr->minSel);
- MONTHCAL_CopyTime(curSel, &infoPtr->maxSel);
-
+ if(!MONTHCAL_ValidateDate(curSel)) return FALSE;
/* exit earlier if selection equals current */
- if (infoPtr->currentMonth == curSel->wMonth &&
- infoPtr->currentYear == curSel->wYear &&
- infoPtr->curSelDay == curSel->wDay) return TRUE;
+ if (MONTHCAL_IsDateEqual(&infoPtr->curSel, curSel)) return TRUE;
- infoPtr->currentMonth = curSel->wMonth;
- infoPtr->currentYear = curSel->wYear;
+ if(!MONTHCAL_IsDateInValidRange(infoPtr, curSel, FALSE)) return FALSE;
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+ infoPtr->minSel = *curSel;
+ infoPtr->maxSel = *curSel;
+
+ /* if selection is still in current month, reduce rectangle */
+ prev.wDay = curSel->wDay;
+ if (MONTHCAL_IsDateEqual(&prev, curSel))
+ {
+ RECT r_prev, r_new;
+
+ /* note that infoPtr->curSel isn't updated yet */
+ MONTHCAL_CalcPosFromDay(infoPtr, &infoPtr->curSel, &r_prev);
+ MONTHCAL_CalcPosFromDay(infoPtr, curSel, &r_new);
+
+ InvalidateRect(infoPtr->hwndSelf, &r_prev, FALSE);
+ InvalidateRect(infoPtr->hwndSelf, &r_new, FALSE);
+ }
+ else
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+
+ infoPtr->curSel = *curSel;
return TRUE;
}
@@ -1036,9 +1418,10 @@ MONTHCAL_SetMaxSelCount(MONTHCAL_INFO *infoPtr, INT max)
{
TRACE("%d\n", max);
- if(infoPtr->dwStyle & MCS_MULTISELECT) {
- infoPtr->maxSelCount = max;
- }
+ if(!(infoPtr->dwStyle & MCS_MULTISELECT)) return FALSE;
+ if(max <= 0) return FALSE;
+
+ infoPtr->maxSelCount = max;
return TRUE;
}
@@ -1053,8 +1436,8 @@ MONTHCAL_GetSelRange(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *range)
if(infoPtr->dwStyle & MCS_MULTISELECT)
{
- MONTHCAL_CopyTime(&infoPtr->maxSel, &range[1]);
- MONTHCAL_CopyTime(&infoPtr->minSel, &range[0]);
+ range[1] = infoPtr->maxSel;
+ range[0] = infoPtr->minSel;
TRACE("[min,max]=[%d %d]\n", infoPtr->minSel.wDay, infoPtr->maxSel.wDay);
return TRUE;
}
@@ -1072,8 +1455,46 @@ MONTHCAL_SetSelRange(MONTHCAL_INFO *infoPtr, SYSTEMTIME *range)
if(infoPtr->dwStyle & MCS_MULTISELECT)
{
- MONTHCAL_CopyTime(&range[1], &infoPtr->maxSel);
- MONTHCAL_CopyTime(&range[0], &infoPtr->minSel);
+ SYSTEMTIME old_range[2];
+
+ /* adjust timestamps */
+ if(!MONTHCAL_ValidateTime(&range[0]))
+ MONTHCAL_CopyTime(&infoPtr->todaysDate, &range[0]);
+ if(!MONTHCAL_ValidateTime(&range[1]))
+ MONTHCAL_CopyTime(&infoPtr->todaysDate, &range[1]);
+
+ /* maximum range exceeded */
+ if(!MONTHCAL_IsSelRangeValid(infoPtr, &range[0], &range[1], NULL)) return FALSE;
+
+ old_range[0] = infoPtr->minSel;
+ old_range[1] = infoPtr->maxSel;
+
+ /* swap if min > max */
+ if(MONTHCAL_CompareSystemTime(&range[0], &range[1]) <= 0)
+ {
+ infoPtr->minSel = range[0];
+ infoPtr->maxSel = range[1];
+ }
+ else
+ {
+ infoPtr->minSel = range[1];
+ infoPtr->maxSel = range[0];
+ }
+ infoPtr->curSel = infoPtr->minSel;
+
+ /* update day of week */
+ MONTHCAL_CalculateDayOfWeek(&infoPtr->minSel, TRUE);
+ MONTHCAL_CalculateDayOfWeek(&infoPtr->maxSel, TRUE);
+ MONTHCAL_CalculateDayOfWeek(&infoPtr->curSel, TRUE);
+
+ /* redraw if bounds changed */
+ /* FIXME: no actual need to redraw everything */
+ if(!MONTHCAL_IsDateEqual(&old_range[0], &range[0]) ||
+ !MONTHCAL_IsDateEqual(&old_range[1], &range[1]))
+ {
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+ }
+
TRACE("[min,max]=[%d %d]\n", infoPtr->minSel.wDay, infoPtr->maxSel.wDay);
return TRUE;
}
@@ -1088,26 +1509,49 @@ MONTHCAL_GetToday(const MONTHCAL_INFO *infoPtr, SYSTEMTIME *today)
TRACE("%p\n", today);
if(!today) return FALSE;
- MONTHCAL_CopyTime(&infoPtr->todaysDate, today);
+ *today = infoPtr->todaysDate;
return TRUE;
}
+/* Internal helper for MCM_SETTODAY handler and auto update timer handler
+ *
+ * RETURN VALUE
+ *
+ * TRUE - today date changed
+ * FALSE - today date isn't changed
+ */
+static BOOL
+MONTHCAL_UpdateToday(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *today)
+{
+ RECT new_r, old_r;
+ if(MONTHCAL_IsDateEqual(today, &infoPtr->todaysDate)) return FALSE;
+
+ MONTHCAL_CalcPosFromDay(infoPtr, &infoPtr->todaysDate, &old_r);
+ MONTHCAL_CalcPosFromDay(infoPtr, today, &new_r);
+
+ infoPtr->todaysDate = *today;
+
+ /* only two days need redrawing */
+ InvalidateRect(infoPtr->hwndSelf, &old_r, FALSE);
+ InvalidateRect(infoPtr->hwndSelf, &new_r, FALSE);
+ return TRUE;
+}
+
+/* MCM_SETTODAT handler */
static LRESULT
-MONTHCAL_SetToday(MONTHCAL_INFO *infoPtr, SYSTEMTIME *today)
+MONTHCAL_SetToday(MONTHCAL_INFO *infoPtr, const SYSTEMTIME *today)
{
TRACE("%p\n", today);
if(!today) return FALSE;
- if(MONTHCAL_IsDateEqual(today, &infoPtr->todaysDate)) return TRUE;
+ /* remember if date was set successfully */
+ if(MONTHCAL_UpdateToday(infoPtr, today)) infoPtr->todaySet = TRUE;
- MONTHCAL_CopyTime(today, &infoPtr->todaysDate);
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return TRUE;
}
-
static LRESULT
MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
{
@@ -1115,6 +1559,7 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
DWORD retval;
int day,wday,wnum;
+ if(!lpht || lpht->cbSize < MCHITTESTINFO_V1_SIZE) return -1;
x = lpht->pt.x;
y = lpht->pt.y;
@@ -1160,57 +1605,48 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
day = MONTHCAL_CalcDayFromPos(infoPtr,x,y,&wday,&wnum);
if(PtInRect(&infoPtr->wdays, lpht->pt)) {
retval = MCHT_CALENDARDAY;
- lpht->st.wYear = infoPtr->currentYear;
- lpht->st.wMonth = (day < 1)? infoPtr->currentMonth -1 : infoPtr->currentMonth;
+ lpht->st.wYear = infoPtr->curSel.wYear;
+ lpht->st.wMonth = (day < 1)? infoPtr->curSel.wMonth -1 : infoPtr->curSel.wMonth;
lpht->st.wDay = (day < 1)?
- MONTHCAL_MonthLength(infoPtr->currentMonth-1,infoPtr->currentYear) -day : day;
+ MONTHCAL_MonthLength(infoPtr->curSel.wMonth-1, infoPtr->curSel.wYear) -day : day;
goto done;
}
if(PtInRect(&infoPtr->weeknums, lpht->pt)) {
retval = MCHT_CALENDARWEEKNUM;
- lpht->st.wYear = infoPtr->currentYear;
- lpht->st.wMonth = (day < 1) ? infoPtr->currentMonth -1 :
- (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) ?
- infoPtr->currentMonth +1 :infoPtr->currentMonth;
+ lpht->st.wYear = infoPtr->curSel.wYear;
+ lpht->st.wMonth = (day < 1) ? infoPtr->curSel.wMonth -1 :
+ (day > MONTHCAL_MonthLength(infoPtr->curSel.wMonth,infoPtr->curSel.wYear)) ?
+ infoPtr->curSel.wMonth +1 :infoPtr->curSel.wMonth;
lpht->st.wDay = (day < 1 ) ?
- MONTHCAL_MonthLength(infoPtr->currentMonth-1,infoPtr->currentYear) -day :
- (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear)) ?
- day - MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear) : day;
+ MONTHCAL_MonthLength(infoPtr->curSel.wMonth-1,infoPtr->curSel.wYear) -day :
+ (day > MONTHCAL_MonthLength(infoPtr->curSel.wMonth,infoPtr->curSel.wYear)) ?
+ day - MONTHCAL_MonthLength(infoPtr->curSel.wMonth,infoPtr->curSel.wYear) : day;
goto done;
}
if(PtInRect(&infoPtr->days, lpht->pt))
- {
- lpht->st.wYear = infoPtr->currentYear;
- if ( day < 1)
- {
+ {
+ lpht->st.wYear = infoPtr->curSel.wYear;
+ lpht->st.wMonth = infoPtr->curSel.wMonth;
+ if (day < 1)
+ {
retval = MCHT_CALENDARDATEPREV;
- lpht->st.wMonth = infoPtr->currentMonth - 1;
- if (lpht->st.wMonth <1)
- {
- lpht->st.wMonth = 12;
- lpht->st.wYear--;
- }
- lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth,lpht->st.wYear) -day;
- }
- else if (day > MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear))
- {
+ MONTHCAL_GetPrevMonth(&lpht->st);
+ lpht->st.wDay = MONTHCAL_MonthLength(lpht->st.wMonth, lpht->st.wYear) + day;
+ }
+ else if (day > MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear))
+ {
retval = MCHT_CALENDARDATENEXT;
- lpht->st.wMonth = infoPtr->currentMonth + 1;
- if (lpht->st.wMonth <12)
- {
- lpht->st.wMonth = 1;
- lpht->st.wYear++;
- }
- lpht->st.wDay = day - MONTHCAL_MonthLength(infoPtr->currentMonth,infoPtr->currentYear) ;
- }
+ MONTHCAL_GetNextMonth(&lpht->st);
+ lpht->st.wDay = day - MONTHCAL_MonthLength(infoPtr->curSel.wMonth, infoPtr->curSel.wYear);
+ }
else {
retval = MCHT_CALENDARDATE;
- lpht->st.wMonth = infoPtr->currentMonth;
- lpht->st.wDay = day;
- lpht->st.wDayOfWeek = MONTHCAL_CalculateDayOfWeek(day,lpht->st.wMonth,lpht->st.wYear);
+ lpht->st.wDay = day;
}
+ /* always update day of week */
+ MONTHCAL_CalculateDayOfWeek(&lpht->st, TRUE);
goto done;
- }
+ }
if(PtInRect(&infoPtr->todayrect, lpht->pt)) {
retval = MCHT_TODAYLINK;
goto done;
@@ -1225,20 +1661,12 @@ MONTHCAL_HitTest(const MONTHCAL_INFO *infoPtr, MCHITTESTINFO *lpht)
return retval;
}
-
-static void MONTHCAL_GoToNextMonth(MONTHCAL_INFO *infoPtr)
+/* MCN_GETDAYSTATE notification helper */
+static void MONTHCAL_NotifyDayState(MONTHCAL_INFO *infoPtr)
{
- TRACE("MONTHCAL_GoToNextMonth\n");
-
- infoPtr->currentMonth++;
- if(infoPtr->currentMonth > 12) {
- infoPtr->currentYear++;
- infoPtr->currentMonth = 1;
- }
-
if(infoPtr->dwStyle & MCS_DAYSTATE) {
NMDAYSTATE nmds;
- int i;
+ INT i;
nmds.nmhdr.hwndFrom = infoPtr->hwndSelf;
nmds.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
@@ -1247,51 +1675,58 @@ static void MONTHCAL_GoToNextMonth(MONTHCAL_INFO *infoPtr)
nmds.prgDayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));
nmds.stStart = infoPtr->todaysDate;
- nmds.stStart.wYear = infoPtr->currentYear;
- nmds.stStart.wMonth = infoPtr->currentMonth;
+ nmds.stStart.wYear = infoPtr->curSel.wYear;
+ nmds.stStart.wMonth = infoPtr->curSel.wMonth;
nmds.stStart.wDay = 1;
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds);
- for(i=0; imonthRange; i++)
+ for(i = 0; i < infoPtr->monthRange; i++)
infoPtr->monthdayState[i] = nmds.prgDayState[i];
+
+ Free(nmds.prgDayState);
}
}
-
-static void MONTHCAL_GoToPrevMonth(MONTHCAL_INFO *infoPtr)
+static void MONTHCAL_GoToPrevNextMonth(MONTHCAL_INFO *infoPtr, BOOL prev)
{
- TRACE("\n");
+ SYSTEMTIME st = infoPtr->curSel;
- infoPtr->currentMonth--;
- if(infoPtr->currentMonth < 1) {
- infoPtr->currentYear--;
- infoPtr->currentMonth = 12;
+ TRACE("%s\n", prev ? "prev" : "next");
+
+ if(prev) MONTHCAL_GetPrevMonth(&st); else MONTHCAL_GetNextMonth(&st);
+
+ if(!MONTHCAL_IsDateInValidRange(infoPtr, &st, FALSE)) return;
+
+ if(infoPtr->dwStyle & MCS_MULTISELECT)
+ {
+ SYSTEMTIME range[2];
+
+ range[0] = infoPtr->minSel;
+ range[1] = infoPtr->maxSel;
+
+ if(prev)
+ {
+ MONTHCAL_GetPrevMonth(&range[0]);
+ MONTHCAL_GetPrevMonth(&range[1]);
+ }
+ else
+ {
+ MONTHCAL_GetNextMonth(&range[0]);
+ MONTHCAL_GetNextMonth(&range[1]);
+ }
+
+ MONTHCAL_SetSelRange(infoPtr, range);
}
+ else
+ MONTHCAL_SetCurSel(infoPtr, &st);
- if(infoPtr->dwStyle & MCS_DAYSTATE) {
- NMDAYSTATE nmds;
- int i;
+ MONTHCAL_NotifyDayState(infoPtr);
- nmds.nmhdr.hwndFrom = infoPtr->hwndSelf;
- nmds.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
- nmds.nmhdr.code = MCN_GETDAYSTATE;
- nmds.cDayState = infoPtr->monthRange;
- nmds.prgDayState = Alloc
- (infoPtr->monthRange * sizeof(MONTHDAYSTATE));
-
- nmds.stStart = infoPtr->todaysDate;
- nmds.stStart.wYear = infoPtr->currentYear;
- nmds.stStart.wMonth = infoPtr->currentMonth;
- nmds.stStart.wDay = 1;
-
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmds.nmhdr.idFrom, (LPARAM)&nmds);
- for(i=0; imonthRange; i++)
- infoPtr->monthdayState[i] = nmds.prgDayState[i];
- }
+ MONTHCAL_NotifySelectionChange(infoPtr);
}
static LRESULT
-MONTHCAL_RButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
+MONTHCAL_RButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
{
static const WCHAR todayW[] = { 'G','o',' ','t','o',' ','T','o','d','a','y',':',0 };
HMENU hMenu;
@@ -1299,182 +1734,205 @@ MONTHCAL_RButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
WCHAR buf[32];
hMenu = CreatePopupMenu();
- if (!LoadStringW(COMCTL32_hModule,IDM_GOTODAY,buf,countof(buf)))
- {
+ if (!LoadStringW(COMCTL32_hModule, IDM_GOTODAY, buf, countof(buf)))
+ {
WARN("Can't load resource\n");
strcpyW(buf, todayW);
- }
- AppendMenuW(hMenu, MF_STRING|MF_ENABLED,1, buf);
- menupoint.x=(short)LOWORD(lParam);
- menupoint.y=(short)HIWORD(lParam);
+ }
+ AppendMenuW(hMenu, MF_STRING|MF_ENABLED, 1, buf);
+ menupoint.x = (short)LOWORD(lParam);
+ menupoint.y = (short)HIWORD(lParam);
ClientToScreen(infoPtr->hwndSelf, &menupoint);
- if( TrackPopupMenu(hMenu,TPM_RIGHTBUTTON| TPM_NONOTIFY|TPM_RETURNCMD,
+ if( TrackPopupMenu(hMenu, TPM_RIGHTBUTTON | TPM_NONOTIFY | TPM_RETURNCMD,
menupoint.x, menupoint.y, 0, infoPtr->hwndSelf, NULL))
- {
- infoPtr->currentMonth=infoPtr->todaysDate.wMonth;
- infoPtr->currentYear=infoPtr->todaysDate.wYear;
+ {
+ infoPtr->curSel = infoPtr->todaysDate;
+ infoPtr->minSel = infoPtr->todaysDate;
+ infoPtr->maxSel = infoPtr->todaysDate;
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
- }
+ }
+
return 0;
}
+/***
+ * DESCRIPTION:
+ * Subclassed edit control windproc function
+ *
+ * PARAMETER(S):
+ * [I] hwnd : the edit window handle
+ * [I] uMsg : the message that is to be processed
+ * [I] wParam : first message parameter
+ * [I] lParam : second message parameter
+ *
+ */
+static LRESULT CALLBACK EditWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ MONTHCAL_INFO *infoPtr = (MONTHCAL_INFO *)GetWindowLongPtrW(GetParent(hwnd), 0);
+
+ TRACE("(hwnd=%p, uMsg=%x, wParam=%lx, lParam=%lx)\n",
+ hwnd, uMsg, wParam, lParam);
+
+ switch (uMsg)
+ {
+ case WM_GETDLGCODE:
+ return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
+
+ case WM_DESTROY:
+ {
+ WNDPROC editProc = infoPtr->EditWndProc;
+ infoPtr->EditWndProc = NULL;
+ SetWindowLongPtrW(hwnd, GWLP_WNDPROC, (DWORD_PTR)editProc);
+ return CallWindowProcW(editProc, hwnd, uMsg, wParam, lParam);
+ }
+
+ case WM_KILLFOCUS:
+ break;
+
+ case WM_KEYDOWN:
+ if ((VK_ESCAPE == (INT)wParam) || (VK_RETURN == (INT)wParam))
+ break;
+
+ default:
+ return CallWindowProcW(infoPtr->EditWndProc, hwnd, uMsg, wParam, lParam);
+ }
+
+ SendMessageW(infoPtr->hWndYearUpDown, WM_CLOSE, 0, 0);
+ SendMessageW(hwnd, WM_CLOSE, 0, 0);
+ return 0;
+}
+
+/* creates updown control and edit box */
+static void MONTHCAL_EditYear(MONTHCAL_INFO *infoPtr)
+{
+ infoPtr->hWndYearEdit =
+ CreateWindowExW(0, WC_EDITW, 0, WS_VISIBLE | WS_CHILD | ES_READONLY,
+ infoPtr->titleyear.left + 3, infoPtr->titlebtnnext.top,
+ infoPtr->titleyear.right - infoPtr->titleyear.left + 4,
+ infoPtr->textHeight, infoPtr->hwndSelf,
+ NULL, NULL, NULL);
+
+ SendMessageW(infoPtr->hWndYearEdit, WM_SETFONT, (WPARAM)infoPtr->hBoldFont, TRUE);
+
+ infoPtr->hWndYearUpDown =
+ CreateWindowExW(0, UPDOWN_CLASSW, 0,
+ WS_VISIBLE | WS_CHILD | UDS_SETBUDDYINT | UDS_NOTHOUSANDS | UDS_ARROWKEYS,
+ infoPtr->titleyear.right + 7, infoPtr->titlebtnnext.top,
+ 18, infoPtr->textHeight, infoPtr->hwndSelf,
+ NULL, NULL, NULL);
+
+ /* attach edit box */
+ SendMessageW(infoPtr->hWndYearUpDown, UDM_SETRANGE, 0,
+ MAKELONG(max_allowed_date.wYear, min_allowed_date.wYear));
+ SendMessageW(infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM)infoPtr->hWndYearEdit, 0);
+ SendMessageW(infoPtr->hWndYearUpDown, UDM_SETPOS, 0, infoPtr->curSel.wYear);
+
+ /* subclass edit box */
+ infoPtr->EditWndProc = (WNDPROC)SetWindowLongPtrW(infoPtr->hWndYearEdit,
+ GWLP_WNDPROC, (DWORD_PTR)EditWndProc);
+
+ SetFocus(infoPtr->hWndYearEdit);
+}
+
static LRESULT
MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
{
- static const WCHAR EditW[] = { 'E','D','I','T',0 };
MCHITTESTINFO ht;
DWORD hit;
- HMENU hMenu;
- RECT rcDay; /* used in determining area to invalidate */
- WCHAR buf[32];
- int i;
- POINT menupoint;
- TRACE("%lx\n", lParam);
+ /* Actually we don't need input focus for calendar, this is used to kill
+ year updown and its buddy edit box */
+ if (IsWindow(infoPtr->hWndYearUpDown))
+ {
+ SetFocus(infoPtr->hwndSelf);
+ return 0;
+ }
- if (infoPtr->hWndYearUpDown)
- {
- infoPtr->currentYear=SendMessageW(infoPtr->hWndYearUpDown, UDM_SETPOS, 0, 0);
- if(!DestroyWindow(infoPtr->hWndYearUpDown))
- {
- FIXME("Can't destroy Updown Control\n");
- }
- else
- infoPtr->hWndYearUpDown=0;
- if(!DestroyWindow(infoPtr->hWndYearEdit))
- {
- FIXME("Can't destroy Updown Control\n");
- }
- else
- infoPtr->hWndYearEdit=0;
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
- }
+ SetCapture(infoPtr->hwndSelf);
+ ht.cbSize = sizeof(MCHITTESTINFO);
ht.pt.x = (short)LOWORD(lParam);
ht.pt.y = (short)HIWORD(lParam);
+
hit = MONTHCAL_HitTest(infoPtr, &ht);
- /* FIXME: these flags should be checked by */
- /*((hit & MCHT_XXX) == MCHT_XXX) b/c some of the flags are */
- /* multi-bit */
- if(hit ==MCHT_TITLEBTNNEXT) {
- MONTHCAL_GoToNextMonth(infoPtr);
+ TRACE("%x at (%d, %d)\n", hit, ht.pt.x, ht.pt.y);
+
+ switch(hit)
+ {
+ case MCHT_TITLEBTNNEXT:
+ MONTHCAL_GoToPrevNextMonth(infoPtr, FALSE);
infoPtr->status = MC_NEXTPRESSED;
- SetTimer(infoPtr->hwndSelf, MC_NEXTMONTHTIMER, MC_NEXTMONTHDELAY, 0);
+ SetTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER, MC_PREVNEXTMONTHDELAY, 0);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0;
- }
- if(hit == MCHT_TITLEBTNPREV){
- MONTHCAL_GoToPrevMonth(infoPtr);
+
+ case MCHT_TITLEBTNPREV:
+ MONTHCAL_GoToPrevNextMonth(infoPtr, TRUE);
infoPtr->status = MC_PREVPRESSED;
- SetTimer(infoPtr->hwndSelf, MC_PREVMONTHTIMER, MC_NEXTMONTHDELAY, 0);
+ SetTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER, MC_PREVNEXTMONTHDELAY, 0);
InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0;
- }
- if(hit == MCHT_TITLEMONTH) {
- hMenu = CreatePopupMenu();
+ case MCHT_TITLEMONTH:
+ {
+ HMENU hMenu = CreatePopupMenu();
+ WCHAR buf[32];
+ POINT menupoint;
+ INT i;
- for (i=0; i<12;i++)
- {
- GetLocaleInfoW(LOCALE_USER_DEFAULT,LOCALE_SMONTHNAME1+i, buf,countof(buf));
- AppendMenuW(hMenu, MF_STRING|MF_ENABLED,i+1, buf);
- }
- menupoint.x=infoPtr->titlemonth.right;
- menupoint.y=infoPtr->titlemonth.bottom;
- ClientToScreen(infoPtr->hwndSelf, &menupoint);
- i= TrackPopupMenu(hMenu,TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON | TPM_RETURNCMD,
- menupoint.x, menupoint.y, 0, infoPtr->hwndSelf, NULL);
- if ((i>0) && (i<13))
- {
- infoPtr->currentMonth=i;
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
- }
- }
- if(hit == MCHT_TITLEYEAR) {
- infoPtr->hWndYearEdit=CreateWindowExW(0,
- EditW,
- 0,
- WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT,
- infoPtr->titleyear.left+3,infoPtr->titlebtnnext.top,
- infoPtr->titleyear.right-infoPtr->titleyear.left+4,
- infoPtr->textHeight,
- infoPtr->hwndSelf,
- NULL,
- NULL,
- NULL);
- SendMessageW( infoPtr->hWndYearEdit, WM_SETFONT, (WPARAM) infoPtr->hBoldFont, (LPARAM)TRUE);
- infoPtr->hWndYearUpDown=CreateWindowExW(0,
- UPDOWN_CLASSW,
- 0,
- WS_VISIBLE | WS_CHILD |UDS_SETBUDDYINT|UDS_NOTHOUSANDS|UDS_ARROWKEYS,
- infoPtr->titleyear.right+7,infoPtr->titlebtnnext.top,
- 18,
- infoPtr->textHeight,
- infoPtr->hwndSelf,
- NULL,
- NULL,
- NULL);
- SendMessageW(infoPtr->hWndYearUpDown, UDM_SETRANGE, 0, MAKELONG (9999, 1753));
- SendMessageW(infoPtr->hWndYearUpDown, UDM_SETBUDDY, (WPARAM) infoPtr->hWndYearEdit, 0);
- SendMessageW(infoPtr->hWndYearUpDown, UDM_SETPOS, 0, infoPtr->currentYear);
- return 0;
-
- }
- if(hit == MCHT_TODAYLINK) {
- NMSELCHANGE nmsc;
-
- infoPtr->curSelDay = infoPtr->todaysDate.wDay;
- infoPtr->firstSelDay = infoPtr->todaysDate.wDay;
- infoPtr->currentMonth=infoPtr->todaysDate.wMonth;
- infoPtr->currentYear=infoPtr->todaysDate.wYear;
- MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->minSel);
- MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->maxSel);
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
-
- nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
- nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
- nmsc.nmhdr.code = MCN_SELCHANGE;
- MONTHCAL_CopyTime(&infoPtr->minSel, &nmsc.stSelStart);
- MONTHCAL_CopyTime(&infoPtr->maxSel, &nmsc.stSelEnd);
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
-
- nmsc.nmhdr.code = MCN_SELECT;
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
- return 0;
- }
- if(hit == MCHT_CALENDARDATE) {
- SYSTEMTIME selArray[2];
- NMSELCHANGE nmsc;
-
- MONTHCAL_CopyTime(&ht.st, &selArray[0]);
- MONTHCAL_CopyTime(&ht.st, &selArray[1]);
- MONTHCAL_SetSelRange(infoPtr, selArray);
- MONTHCAL_SetCurSel(infoPtr, &selArray[0]);
- TRACE("MCHT_CALENDARDATE\n");
- nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
- nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
- nmsc.nmhdr.code = MCN_SELCHANGE;
- MONTHCAL_CopyTime(&infoPtr->minSel,&nmsc.stSelStart);
- MONTHCAL_CopyTime(&infoPtr->maxSel,&nmsc.stSelEnd);
-
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
-
-
- /* redraw both old and new days if the selected day changed */
- if(infoPtr->curSelDay != ht.st.wDay) {
- MONTHCAL_CalcPosFromDay(infoPtr, ht.st.wDay, ht.st.wMonth, &rcDay);
- InvalidateRect(infoPtr->hwndSelf, &rcDay, TRUE);
-
- MONTHCAL_CalcPosFromDay(infoPtr, infoPtr->curSelDay, infoPtr->currentMonth, &rcDay);
- InvalidateRect(infoPtr->hwndSelf, &rcDay, TRUE);
+ for (i = 0; i < 12; i++)
+ {
+ GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SMONTHNAME1+i, buf, countof(buf));
+ AppendMenuW(hMenu, MF_STRING|MF_ENABLED, i + 1, buf);
}
+ menupoint.x = ht.pt.x;
+ menupoint.y = ht.pt.y;
+ ClientToScreen(infoPtr->hwndSelf, &menupoint);
+ i = TrackPopupMenu(hMenu,TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RIGHTBUTTON | TPM_RETURNCMD,
+ menupoint.x, menupoint.y, 0, infoPtr->hwndSelf, NULL);
- infoPtr->firstSelDay = ht.st.wDay;
- infoPtr->curSelDay = ht.st.wDay;
- infoPtr->status = MC_SEL_LBUTDOWN;
+ if ((i > 0) && (i < 13) && infoPtr->curSel.wMonth != i)
+ {
+ infoPtr->curSel.wMonth = i;
+ MONTHCAL_IsDateInValidRange(infoPtr, &infoPtr->curSel, TRUE);
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+ }
return 0;
}
+ case MCHT_TITLEYEAR:
+ {
+ MONTHCAL_EditYear(infoPtr);
+ return 0;
+ }
+ case MCHT_TODAYLINK:
+ {
+ infoPtr->curSel = infoPtr->todaysDate;
+ infoPtr->minSel = infoPtr->todaysDate;
+ infoPtr->maxSel = infoPtr->todaysDate;
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+
+ MONTHCAL_NotifySelectionChange(infoPtr);
+ MONTHCAL_NotifySelect(infoPtr);
+ return 0;
+ }
+ case MCHT_CALENDARDATENEXT:
+ case MCHT_CALENDARDATEPREV:
+ case MCHT_CALENDARDATE:
+ {
+ SYSTEMTIME st[2];
+
+ MONTHCAL_CopyDate(&ht.st, &infoPtr->firstSel);
+
+ st[0] = st[1] = ht.st;
+ /* clear selection range */
+ MONTHCAL_SetSelRange(infoPtr, st);
+
+ infoPtr->status = MC_SEL_LBUTDOWN;
+ MONTHCAL_SetDayFocus(infoPtr, &ht.st);
+ return 0;
+ }
+ }
return 1;
}
@@ -1483,90 +1941,90 @@ MONTHCAL_LButtonDown(MONTHCAL_INFO *infoPtr, LPARAM lParam)
static LRESULT
MONTHCAL_LButtonUp(MONTHCAL_INFO *infoPtr, LPARAM lParam)
{
- NMSELCHANGE nmsc;
NMHDR nmhdr;
- BOOL redraw = FALSE;
MCHITTESTINFO ht;
DWORD hit;
TRACE("\n");
- if(infoPtr->status & MC_NEXTPRESSED) {
- KillTimer(infoPtr->hwndSelf, MC_NEXTMONTHTIMER);
- infoPtr->status &= ~MC_NEXTPRESSED;
- redraw = TRUE;
- }
- if(infoPtr->status & MC_PREVPRESSED) {
- KillTimer(infoPtr->hwndSelf, MC_PREVMONTHTIMER);
- infoPtr->status &= ~MC_PREVPRESSED;
- redraw = TRUE;
+ if(infoPtr->status & (MC_PREVPRESSED | MC_NEXTPRESSED)) {
+ RECT *r;
+
+ KillTimer(infoPtr->hwndSelf, MC_PREVNEXTMONTHTIMER);
+ r = infoPtr->status & MC_PREVPRESSED ? &infoPtr->titlebtnprev : &infoPtr->titlebtnnext;
+ infoPtr->status &= ~(MC_PREVPRESSED | MC_NEXTPRESSED);
+
+ InvalidateRect(infoPtr->hwndSelf, r, FALSE);
}
- ht.pt.x = (short)LOWORD(lParam);
- ht.pt.y = (short)HIWORD(lParam);
- hit = MONTHCAL_HitTest(infoPtr, &ht);
+ ReleaseCapture();
- infoPtr->status = MC_SEL_LBUTUP;
-
- if(hit ==MCHT_CALENDARDATENEXT) {
- MONTHCAL_GoToNextMonth(infoPtr);
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
- return TRUE;
- }
- if(hit == MCHT_CALENDARDATEPREV){
- MONTHCAL_GoToPrevMonth(infoPtr);
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
- return TRUE;
- }
+ /* always send NM_RELEASEDCAPTURE notification */
nmhdr.hwndFrom = infoPtr->hwndSelf;
nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
nmhdr.code = NM_RELEASEDCAPTURE;
TRACE("Sent notification from %p to %p\n", infoPtr->hwndSelf, infoPtr->hwndNotify);
SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr);
- /* redraw if necessary */
- if(redraw)
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
- /* only send MCN_SELECT if currently displayed month's day was selected */
- if(hit == MCHT_CALENDARDATE) {
- nmsc.nmhdr.hwndFrom = infoPtr->hwndSelf;
- nmsc.nmhdr.idFrom = GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_ID);
- nmsc.nmhdr.code = MCN_SELECT;
- MONTHCAL_CopyTime(&infoPtr->minSel, &nmsc.stSelStart);
- MONTHCAL_CopyTime(&infoPtr->maxSel, &nmsc.stSelEnd);
- SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nmsc.nmhdr.idFrom, (LPARAM)&nmsc);
+ if(!(infoPtr->status & MC_SEL_LBUTDOWN)) return 0;
+ ht.cbSize = sizeof(MCHITTESTINFO);
+ ht.pt.x = (short)LOWORD(lParam);
+ ht.pt.y = (short)HIWORD(lParam);
+ hit = MONTHCAL_HitTest(infoPtr, &ht);
+
+ infoPtr->status = MC_SEL_LBUTUP;
+ MONTHCAL_SetDayFocus(infoPtr, NULL);
+
+ if((hit & MCHT_CALENDARDATE) == MCHT_CALENDARDATE)
+ {
+ SYSTEMTIME sel = infoPtr->curSel;
+
+ /* will be invalidated here */
+ MONTHCAL_SetCurSel(infoPtr, &ht.st);
+
+ /* send MCN_SELCHANGE only if new date selected */
+ if (!MONTHCAL_IsDateEqual(&sel, &ht.st))
+ MONTHCAL_NotifySelectionChange(infoPtr);
+
+ MONTHCAL_NotifySelect(infoPtr);
}
+
return 0;
}
static LRESULT
-MONTHCAL_Timer(MONTHCAL_INFO *infoPtr, WPARAM wParam)
+MONTHCAL_Timer(MONTHCAL_INFO *infoPtr, WPARAM id)
{
- BOOL redraw = FALSE;
+ TRACE("%ld\n", id);
- TRACE("%ld\n", wParam);
+ switch(id) {
+ case MC_PREVNEXTMONTHTIMER:
+ if(infoPtr->status & MC_NEXTPRESSED) MONTHCAL_GoToPrevNextMonth(infoPtr, FALSE);
+ if(infoPtr->status & MC_PREVPRESSED) MONTHCAL_GoToPrevNextMonth(infoPtr, TRUE);
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+ break;
+ case MC_TODAYUPDATETIMER:
+ {
+ SYSTEMTIME st;
- switch(wParam) {
- case MC_NEXTMONTHTIMER:
- redraw = TRUE;
- MONTHCAL_GoToNextMonth(infoPtr);
- break;
- case MC_PREVMONTHTIMER:
- redraw = TRUE;
- MONTHCAL_GoToPrevMonth(infoPtr);
- break;
+ if(infoPtr->todaySet) return 0;
+
+ GetLocalTime(&st);
+ MONTHCAL_UpdateToday(infoPtr, &st);
+
+ /* notification sent anyway */
+ MONTHCAL_NotifySelectionChange(infoPtr);
+
+ return 0;
+ }
default:
- ERR("got unknown timer\n");
+ ERR("got unknown timer %ld\n", id);
break;
}
- /* redraw only if necessary */
- if(redraw)
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
-
return 0;
}
@@ -1575,11 +2033,13 @@ static LRESULT
MONTHCAL_MouseMove(MONTHCAL_INFO *infoPtr, LPARAM lParam)
{
MCHITTESTINFO ht;
- int oldselday, selday, hit;
+ SYSTEMTIME st_ht;
+ INT hit;
RECT r;
if(!(infoPtr->status & MC_SEL_LBUTDOWN)) return 0;
+ ht.cbSize = sizeof(MCHITTESTINFO);
ht.pt.x = (short)LOWORD(lParam);
ht.pt.y = (short)HIWORD(lParam);
@@ -1587,58 +2047,46 @@ MONTHCAL_MouseMove(MONTHCAL_INFO *infoPtr, LPARAM lParam)
/* not on the calendar date numbers? bail out */
TRACE("hit:%x\n",hit);
- if((hit & MCHT_CALENDARDATE) != MCHT_CALENDARDATE) return 0;
+ if((hit & MCHT_CALENDARDATE) != MCHT_CALENDARDATE)
+ {
+ MONTHCAL_SetDayFocus(infoPtr, NULL);
+ return 0;
+ }
- selday = ht.st.wDay;
- oldselday = infoPtr->curSelDay;
- infoPtr->curSelDay = selday;
- MONTHCAL_CalcPosFromDay(infoPtr, selday, ht.st. wMonth, &r);
+ st_ht = ht.st;
- if(infoPtr->dwStyle & MCS_MULTISELECT) {
- SYSTEMTIME selArray[2];
- int i;
+ /* if pointer is over focused day still there's nothing to do */
+ if(!MONTHCAL_SetDayFocus(infoPtr, &ht.st)) return 0;
- MONTHCAL_GetSelRange(infoPtr, selArray);
- i = 0;
- if(infoPtr->firstSelDay==selArray[0].wDay) i=1;
- TRACE("oldRange:%d %d %d %d\n", infoPtr->firstSelDay, selArray[0].wDay, selArray[1].wDay, i);
- if(infoPtr->firstSelDay==selArray[1].wDay) {
- /* 1st time we get here: selArray[0]=selArray[1]) */
- /* if we're still at the first selected date, return */
- if(infoPtr->firstSelDay==selday) goto done;
- if(seldayfirstSelDay) i = 0;
- }
+ MONTHCAL_CalcPosFromDay(infoPtr, &ht.st, &r);
- if(abs(infoPtr->firstSelDay - selday) >= infoPtr->maxSelCount) {
- if(selday>infoPtr->firstSelDay)
- selday = infoPtr->firstSelDay + infoPtr->maxSelCount;
- else
- selday = infoPtr->firstSelDay - infoPtr->maxSelCount;
- }
+ if(infoPtr->dwStyle & MCS_MULTISELECT) {
+ SYSTEMTIME st[2];
- if(selArray[i].wDay!=selday) {
- TRACE("newRange:%d %d %d %d\n", infoPtr->firstSelDay, selArray[0].wDay, selArray[1].wDay, i);
+ MONTHCAL_GetSelRange(infoPtr, st);
- selArray[i].wDay = selday;
+ /* If we're still at the first selected date and range is empty, return.
+ If range isn't empty we should change range to a single firstSel */
+ if(MONTHCAL_IsDateEqual(&infoPtr->firstSel, &st_ht) &&
+ MONTHCAL_IsDateEqual(&st[0], &st[1])) goto done;
- if(selArray[0].wDay>selArray[1].wDay) {
- DWORD tempday;
- tempday = selArray[1].wDay;
- selArray[1].wDay = selArray[0].wDay;
- selArray[0].wDay = tempday;
- }
+ MONTHCAL_IsSelRangeValid(infoPtr, &st_ht, &infoPtr->firstSel, &st_ht);
- MONTHCAL_SetSelRange(infoPtr, selArray);
- }
+ st[0] = infoPtr->firstSel;
+ /* we should overwrite timestamp here */
+ MONTHCAL_CopyDate(&st_ht, &st[1]);
+
+ /* bounds will be swapped here if needed */
+ MONTHCAL_SetSelRange(infoPtr, st);
+
+ return 0;
}
done:
- /* only redraw if the currently selected day changed */
- /* FIXME: this should specify a rectangle containing only the days that changed */
- /* using InvalidateRect */
- if(oldselday != infoPtr->curSelDay)
- InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
+ /* FIXME: this should specify a rectangle containing only the days that changed
+ using InvalidateRect */
+ InvalidateRect(infoPtr->hwndSelf, NULL, FALSE);
return 0;
}
@@ -1663,21 +2111,39 @@ MONTHCAL_Paint(MONTHCAL_INFO *infoPtr, HDC hdc_paint)
return 0;
}
+static LRESULT
+MONTHCAL_EraseBkgnd(const MONTHCAL_INFO *infoPtr, HDC hdc)
+{
+ HBRUSH hbr;
+ RECT rc;
+
+ if (!GetClipBox(hdc, &rc)) return FALSE;
+
+ /* fill background */
+ hbr = CreateSolidBrush (infoPtr->bk);
+ FillRect(hdc, &rc, hbr);
+ DeleteObject(hbr);
+
+ return TRUE;
+}
static LRESULT
-MONTHCAL_KillFocus(const MONTHCAL_INFO *infoPtr, HWND hFocusWnd)
+MONTHCAL_PrintClient(MONTHCAL_INFO *infoPtr, HDC hdc, DWORD options)
{
- TRACE("\n");
+ FIXME("Partial Stub: (hdc=%p options=0x%08x)\n", hdc, options);
- if (infoPtr->hwndNotify != hFocusWnd)
- ShowWindow(infoPtr->hwndSelf, SW_HIDE);
- else
- InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
+ if ((options & PRF_CHECKVISIBLE) && !IsWindowVisible(infoPtr->hwndSelf))
+ return 0;
+
+ if (options & PRF_ERASEBKGND)
+ MONTHCAL_EraseBkgnd(infoPtr, hdc);
+
+ if (options & PRF_CLIENT)
+ MONTHCAL_Paint(infoPtr, hdc);
return 0;
}
-
static LRESULT
MONTHCAL_SetFocus(const MONTHCAL_INFO *infoPtr)
{
@@ -1691,7 +2157,6 @@ MONTHCAL_SetFocus(const MONTHCAL_INFO *infoPtr)
/* sets the size information */
static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
{
- static const WCHAR SunW[] = { 'S','u','n',0 };
static const WCHAR O0W[] = { '0','0',0 };
HDC hdc = GetDC(infoPtr->hwndSelf);
RECT *title=&infoPtr->title;
@@ -1703,11 +2168,12 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
RECT *weeknumrect=&infoPtr->weeknums;
RECT *days=&infoPtr->days;
RECT *todayrect=&infoPtr->todayrect;
- SIZE size;
+ SIZE size, sz;
TEXTMETRICW tm;
HFONT currentFont;
- int xdiv, left_offset;
+ INT xdiv, dx, dy, i;
RECT rcClient;
+ WCHAR buff[80];
GetClientRect(infoPtr->hwndSelf, &rcClient);
@@ -1716,7 +2182,26 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
/* get the height and width of each day's text */
GetTextMetricsW(hdc, &tm);
infoPtr->textHeight = tm.tmHeight + tm.tmExternalLeading + tm.tmInternalLeading;
- GetTextExtentPoint32W(hdc, SunW, 3, &size);
+
+ /* find largest abbreviated day name for current locale */
+ size.cx = sz.cx = 0;
+ for (i = 0; i < 7; i++)
+ {
+ if(GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_SABBREVDAYNAME1 + i,
+ buff, countof(buff)))
+ {
+ GetTextExtentPoint32W(hdc, buff, lstrlenW(buff), &sz);
+ if (sz.cx > size.cx) size.cx = sz.cx;
+ }
+ else /* locale independent fallback on failure */
+ {
+ static const WCHAR SunW[] = { 'S','u','n',0 };
+
+ GetTextExtentPoint32W(hdc, SunW, lstrlenW(SunW), &size);
+ break;
+ }
+ }
+
infoPtr->textWidth = size.cx + 2;
/* recalculate the height and width increments and offsets */
@@ -1724,22 +2209,21 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
xdiv = (infoPtr->dwStyle & MCS_WEEKNUMBERS) ? 8 : 7;
- infoPtr->width_increment = size.cx * 2 + 4;
+ infoPtr->width_increment = size.cx * 2 + 4;
infoPtr->height_increment = infoPtr->textHeight;
- left_offset = (rcClient.right - rcClient.left) - (infoPtr->width_increment * xdiv);
/* calculate title area */
- title->top = rcClient.top;
- title->bottom = title->top + 3 * infoPtr->height_increment / 2;
- title->left = left_offset;
- title->right = rcClient.right;
+ title->top = 0;
+ title->bottom = 3 * infoPtr->height_increment / 2;
+ title->left = 0;
+ title->right = infoPtr->width_increment * xdiv;
/* set the dimensions of the next and previous buttons and center */
/* the month text vertically */
prev->top = next->top = title->top + 4;
prev->bottom = next->bottom = title->bottom - 4;
prev->left = title->left + 4;
- prev->right = prev->left + (title->bottom - title->top) ;
+ prev->right = prev->left + (title->bottom - title->top);
next->right = title->right - 4;
next->left = next->right - (title->bottom - title->top);
@@ -1751,24 +2235,47 @@ static void MONTHCAL_UpdateSize(MONTHCAL_INFO *infoPtr)
/* setup the dimensions of the rectangle we draw the names of the */
/* days of the week in */
- weeknumrect->left = left_offset;
+ weeknumrect->left = 0;
+
if(infoPtr->dwStyle & MCS_WEEKNUMBERS)
- weeknumrect->right=prev->right;
+ weeknumrect->right = prev->right;
else
- weeknumrect->right=weeknumrect->left;
+ weeknumrect->right = weeknumrect->left;
+
wdays->left = days->left = weeknumrect->right;
wdays->right = days->right = wdays->left + 7 * infoPtr->width_increment;
- wdays->top = title->bottom ;
+ wdays->top = title->bottom;
wdays->bottom = wdays->top + infoPtr->height_increment;
- days->top = weeknumrect->top = wdays->bottom ;
+ days->top = weeknumrect->top = wdays->bottom;
days->bottom = weeknumrect->bottom = days->top + 6 * infoPtr->height_increment;
- todayrect->left = rcClient.left;
- todayrect->right = rcClient.right;
+ todayrect->left = 0;
+ todayrect->right = title->right;
todayrect->top = days->bottom;
todayrect->bottom = days->bottom + infoPtr->height_increment;
+ /* offset all rectangles to center in client area */
+ dx = (rcClient.right - title->right) / 2;
+ dy = (rcClient.bottom - todayrect->bottom) / 2;
+
+ /* if calendar doesn't fit client area show it at left/top bounds */
+ if (title->left + dx < 0) dx = 0;
+ if (title->top + dy < 0) dy = 0;
+
+ if (dx != 0 || dy != 0)
+ {
+ OffsetRect(title, dx, dy);
+ OffsetRect(prev, dx, dy);
+ OffsetRect(next, dx, dy);
+ OffsetRect(titlemonth, dx, dy);
+ OffsetRect(titleyear, dx, dy);
+ OffsetRect(wdays, dx, dy);
+ OffsetRect(weeknumrect, dx, dy);
+ OffsetRect(days, dx, dy);
+ OffsetRect(todayrect, dx, dy);
+ }
+
TRACE("dx=%d dy=%d client[%s] title[%s] wdays[%s] days[%s] today[%s]\n",
infoPtr->width_increment,infoPtr->height_increment,
wine_dbgstr_rect(&rcClient),
@@ -1841,6 +2348,28 @@ static INT MONTHCAL_StyleChanged(MONTHCAL_INFO *infoPtr, WPARAM wStyleType,
infoPtr->dwStyle = lpss->styleNew;
+ /* make room for week numbers */
+ if ((lpss->styleNew ^ lpss->styleOld) & MCS_WEEKNUMBERS)
+ MONTHCAL_UpdateSize(infoPtr);
+
+ return 0;
+}
+
+static INT MONTHCAL_StyleChanging(MONTHCAL_INFO *infoPtr, WPARAM wStyleType,
+ STYLESTRUCT *lpss)
+{
+ TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
+ wStyleType, lpss->styleOld, lpss->styleNew);
+
+ /* block MCS_MULTISELECT change */
+ if ((lpss->styleNew ^ lpss->styleOld) & MCS_MULTISELECT)
+ {
+ if (lpss->styleOld & MCS_MULTISELECT)
+ lpss->styleNew |= MCS_MULTISELECT;
+ else
+ lpss->styleNew &= ~MCS_MULTISELECT;
+ }
+
return 0;
}
@@ -1869,33 +2398,30 @@ MONTHCAL_Create(HWND hwnd, LPCREATESTRUCTW lpcs)
/* FIXME: calculate systemtime ->> localtime(substract timezoneinfo) */
GetLocalTime(&infoPtr->todaysDate);
- infoPtr->firstDayHighWord = FALSE;
MONTHCAL_SetFirstDayOfWeek(infoPtr, -1);
- infoPtr->currentMonth = infoPtr->todaysDate.wMonth;
- infoPtr->currentYear = infoPtr->todaysDate.wYear;
- MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->minDate);
- MONTHCAL_CopyTime(&infoPtr->todaysDate, &infoPtr->maxDate);
- infoPtr->maxDate.wYear=2050;
- infoPtr->minDate.wYear=1950;
- infoPtr->maxSelCount = 7;
- infoPtr->monthRange = 3;
- infoPtr->monthdayState = Alloc
- (infoPtr->monthRange * sizeof(MONTHDAYSTATE));
- infoPtr->titlebk = comctl32_color.clrActiveCaption;
- infoPtr->titletxt = comctl32_color.clrWindow;
- infoPtr->monthbk = comctl32_color.clrWindow;
- infoPtr->trailingtxt = comctl32_color.clrGrayText;
- infoPtr->bk = comctl32_color.clrWindow;
- infoPtr->txt = comctl32_color.clrWindowText;
- /* set the current day for highlighing */
- infoPtr->minSel.wDay = infoPtr->todaysDate.wDay;
- infoPtr->maxSel.wDay = infoPtr->todaysDate.wDay;
+ infoPtr->maxSelCount = (infoPtr->dwStyle & MCS_MULTISELECT) ? 7 : 1;
+ infoPtr->monthRange = 3;
+ infoPtr->monthdayState = Alloc(infoPtr->monthRange * sizeof(MONTHDAYSTATE));
+ infoPtr->titlebk = comctl32_color.clrActiveCaption;
+ infoPtr->titletxt = comctl32_color.clrWindow;
+ infoPtr->monthbk = comctl32_color.clrWindow;
+ infoPtr->trailingtxt = comctl32_color.clrGrayText;
+ infoPtr->bk = comctl32_color.clrWindow;
+ infoPtr->txt = comctl32_color.clrWindowText;
+
+ infoPtr->minSel = infoPtr->todaysDate;
+ infoPtr->maxSel = infoPtr->todaysDate;
+ infoPtr->curSel = infoPtr->todaysDate;
+ infoPtr->isUnicode = TRUE;
/* call MONTHCAL_UpdateSize to set all of the dimensions */
/* of the control */
MONTHCAL_UpdateSize(infoPtr);
-
+
+ /* today auto update timer, to be freed only on control destruction */
+ SetTimer(infoPtr->hwndSelf, MC_TODAYUPDATETIMER, MC_TODAYUPDATEDELAY, 0);
+
OpenThemeData (infoPtr->hwndSelf, themeClass);
return 0;
@@ -1915,6 +2441,45 @@ MONTHCAL_Destroy(MONTHCAL_INFO *infoPtr)
return 0;
}
+/*
+ * Handler for WM_NOTIFY messages
+ */
+static LRESULT
+MONTHCAL_Notify(MONTHCAL_INFO *infoPtr, NMHDR *hdr)
+{
+ /* notification from year edit updown */
+ if (hdr->code == UDN_DELTAPOS)
+ {
+ NMUPDOWN *nmud = (NMUPDOWN*)hdr;
+
+ if (hdr->hwndFrom == infoPtr->hWndYearUpDown)
+ {
+ /* year value limits are set up explicitly after updown creation */
+ if ((nmud->iDelta + nmud->iPos) != infoPtr->curSel.wYear)
+ {
+ SYSTEMTIME new_date = infoPtr->curSel;
+
+ new_date.wYear = nmud->iDelta + nmud->iPos;
+ MONTHCAL_SetCurSel(infoPtr, &new_date);
+ }
+ }
+ }
+ return 0;
+}
+
+static inline BOOL
+MONTHCAL_SetUnicodeFormat(MONTHCAL_INFO *infoPtr, BOOL isUnicode)
+{
+ BOOL prev = infoPtr->isUnicode;
+ infoPtr->isUnicode = isUnicode;
+ return prev;
+}
+
+static inline BOOL
+MONTHCAL_GetUnicodeFormat(const MONTHCAL_INFO *infoPtr)
+{
+ return infoPtr->isUnicode;
+}
static LRESULT WINAPI
MONTHCAL_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -1947,7 +2512,7 @@ MONTHCAL_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return MONTHCAL_SetSelRange(infoPtr, (LPSYSTEMTIME)lParam);
case MCM_GETMONTHRANGE:
- return MONTHCAL_GetMonthRange(infoPtr);
+ return MONTHCAL_GetMonthRange(infoPtr, wParam, (SYSTEMTIME*)lParam);
case MCM_SETDAYSTATE:
return MONTHCAL_SetDayState(infoPtr, (INT)wParam, (LPMONTHDAYSTATE)lParam);
@@ -1991,14 +2556,17 @@ MONTHCAL_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case MCM_GETMAXTODAYWIDTH:
return MONTHCAL_GetMaxTodayWidth(infoPtr);
+ case MCM_SETUNICODEFORMAT:
+ return MONTHCAL_SetUnicodeFormat(infoPtr, (BOOL)wParam);
+
+ case MCM_GETUNICODEFORMAT:
+ return MONTHCAL_GetUnicodeFormat(infoPtr);
+
case WM_GETDLGCODE:
return DLGC_WANTARROWS | DLGC_WANTCHARS;
- case WM_KILLFOCUS:
- return MONTHCAL_KillFocus(infoPtr, (HWND)wParam);
-
- case WM_RBUTTONDOWN:
- return MONTHCAL_RButtonDown(infoPtr, lParam);
+ case WM_RBUTTONUP:
+ return MONTHCAL_RButtonUp(infoPtr, lParam);
case WM_LBUTTONDOWN:
return MONTHCAL_LButtonDown(infoPtr, lParam);
@@ -2009,16 +2577,24 @@ MONTHCAL_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_LBUTTONUP:
return MONTHCAL_LButtonUp(infoPtr, lParam);
- case WM_PRINTCLIENT:
case WM_PAINT:
return MONTHCAL_Paint(infoPtr, (HDC)wParam);
+ case WM_PRINTCLIENT:
+ return MONTHCAL_PrintClient(infoPtr, (HDC)wParam, (DWORD)lParam);
+
+ case WM_ERASEBKGND:
+ return MONTHCAL_EraseBkgnd(infoPtr, (HDC)wParam);
+
case WM_SETFOCUS:
return MONTHCAL_SetFocus(infoPtr);
case WM_SIZE:
return MONTHCAL_Size(infoPtr, (SHORT)LOWORD(lParam), (SHORT)HIWORD(lParam));
+ case WM_NOTIFY:
+ return MONTHCAL_Notify(infoPtr, (NMHDR*)lParam);
+
case WM_CREATE:
return MONTHCAL_Create(hwnd, (LPCREATESTRUCTW)lParam);
@@ -2044,6 +2620,9 @@ MONTHCAL_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_STYLECHANGED:
return MONTHCAL_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+ case WM_STYLECHANGING:
+ return MONTHCAL_StyleChanging(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
+
default:
if ((uMsg >= WM_USER) && (uMsg < WM_APP) && !COMCTL32_IsReflectedMessage(uMsg))
ERR( "unknown msg %04x wp=%08lx lp=%08lx\n", uMsg, wParam, lParam);
diff --git a/dll/win32/comctl32/pager.c b/dll/win32/comctl32/pager.c
index fdf470cc4c3..f3461fde88d 100644
--- a/dll/win32/comctl32/pager.c
+++ b/dll/win32/comctl32/pager.c
@@ -841,7 +841,6 @@ static LRESULT
PAGER_NCCalcSize(PAGER_INFO* infoPtr, WPARAM wParam, LPRECT lpRect)
{
RECT rcChild, rcWindow;
- INT scrollRange;
/*
* lpRect points to a RECT struct. On entry, the struct
@@ -863,8 +862,6 @@ PAGER_NCCalcSize(PAGER_INFO* infoPtr, WPARAM wParam, LPRECT lpRect)
infoPtr->nWidth = lpRect->right - lpRect->left;
PAGER_CalcSize (infoPtr, &infoPtr->nWidth, TRUE);
- scrollRange = infoPtr->nWidth - (rcWindow.right - rcWindow.left);
-
if (infoPtr->TLbtnState && (lpRect->left + infoPtr->nButtonSize < lpRect->right))
lpRect->left += infoPtr->nButtonSize;
if (infoPtr->BRbtnState && (lpRect->right - infoPtr->nButtonSize > lpRect->left))
@@ -875,8 +872,6 @@ PAGER_NCCalcSize(PAGER_INFO* infoPtr, WPARAM wParam, LPRECT lpRect)
infoPtr->nHeight = lpRect->bottom - lpRect->top;
PAGER_CalcSize (infoPtr, &infoPtr->nHeight, FALSE);
- scrollRange = infoPtr->nHeight - (rcWindow.bottom - rcWindow.top);
-
if (infoPtr->TLbtnState && (lpRect->top + infoPtr->nButtonSize < lpRect->bottom))
lpRect->top += infoPtr->nButtonSize;
if (infoPtr->BRbtnState && (lpRect->bottom - infoPtr->nButtonSize > lpRect->top))
diff --git a/dll/win32/comctl32/propsheet.c b/dll/win32/comctl32/propsheet.c
index 6264923e8ec..25a921807de 100644
--- a/dll/win32/comctl32/propsheet.c
+++ b/dll/win32/comctl32/propsheet.c
@@ -330,7 +330,7 @@ static void PROPSHEET_CollectSheetInfoA(LPCPROPSHEETHEADERA lppsh,
psInfo->ppshheader.pszCaption = NULL;
else
{
- if (HIWORD(lppsh->pszCaption))
+ if (!IS_INTRESOURCE(lppsh->pszCaption))
{
int len = MultiByteToWideChar(CP_ACP, 0, lppsh->pszCaption, -1, NULL, 0);
WCHAR *caption = Alloc( len*sizeof (WCHAR) );
@@ -373,7 +373,7 @@ static void PROPSHEET_CollectSheetInfoW(LPCPROPSHEETHEADERW lppsh,
psInfo->ppshheader.pszCaption = NULL;
else
{
- if (HIWORD(lppsh->pszCaption))
+ if (!IS_INTRESOURCE(lppsh->pszCaption))
{
int len = strlenW(lppsh->pszCaption);
WCHAR *caption = Alloc( (len+1)*sizeof(WCHAR) );
@@ -553,7 +553,7 @@ static BOOL PROPSHEET_CollectPageInfo(LPCPROPSHEETPAGEW lppsp,
WCHAR *text;
int len;
- if ( !HIWORD( lppsp->pszTitle ) )
+ if (IS_INTRESOURCE( lppsp->pszTitle ))
{
if (!LoadStringW( lppsp->hInstance, (DWORD_PTR)lppsp->pszTitle,szTitle,sizeof(szTitle)/sizeof(szTitle[0]) ))
{
@@ -1197,7 +1197,7 @@ static BOOL PROPSHEET_CreateTabControl(HWND hwndParent,
}
item.pszText = (LPWSTR) psInfo->proppage[i].pszText;
- SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, (WPARAM)i, (LPARAM)&item);
+ SendMessageW(hwndTabCtrl, TCM_INSERTITEMW, i, (LPARAM)&item);
}
SendMessageW(GetDlgItem(hwndTabCtrl, IDC_TABCONTROL), WM_SETREDRAW, 1, 0);
@@ -1370,10 +1370,10 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent,
const PropSheetInfo * psInfo,
LPCPROPSHEETPAGEW ppshpage)
{
- DLGTEMPLATE* pTemplate;
+ const DLGTEMPLATE* pTemplate;
HWND hwndPage;
DWORD resSize;
- LPVOID temp = NULL;
+ DLGTEMPLATE* pTemplateCopy = NULL;
TRACE("index %d\n", index);
@@ -1384,7 +1384,7 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent,
if (ppshpage->dwFlags & PSP_DLGINDIRECT)
{
- pTemplate = (DLGTEMPLATE*)ppshpage->u.pResource;
+ pTemplate = ppshpage->u.pResource;
resSize = GetTemplateSize(pTemplate);
}
else if(ppshpage->dwFlags & PSP_INTERNAL_UNICODE)
@@ -1431,39 +1431,38 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent,
* Make a copy of the dialog template to make it writable
*/
}
- temp = Alloc(resSize);
- if (!temp)
+ pTemplateCopy = Alloc(resSize);
+ if (!pTemplateCopy)
return FALSE;
- TRACE("copying pTemplate %p into temp %p (%d)\n", pTemplate, temp, resSize);
- memcpy(temp, pTemplate, resSize);
- pTemplate = temp;
+ TRACE("copying pTemplate %p into pTemplateCopy %p (%d)\n", pTemplate, pTemplateCopy, resSize);
+ memcpy(pTemplateCopy, pTemplate, resSize);
- if (((MyDLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF)
+ if (((MyDLGTEMPLATEEX*)pTemplateCopy)->signature == 0xFFFF)
{
- ((MyDLGTEMPLATEEX*)pTemplate)->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~DS_MODALFRAME;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_CAPTION;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_SYSMENU;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_POPUP;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_DISABLED;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_VISIBLE;
- ((MyDLGTEMPLATEEX*)pTemplate)->style &= ~WS_THICKFRAME;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~DS_MODALFRAME;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_CAPTION;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_SYSMENU;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_POPUP;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_DISABLED;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_VISIBLE;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->style &= ~WS_THICKFRAME;
- ((MyDLGTEMPLATEEX*)pTemplate)->exStyle |= WS_EX_CONTROLPARENT;
+ ((MyDLGTEMPLATEEX*)pTemplateCopy)->exStyle |= WS_EX_CONTROLPARENT;
}
else
{
- pTemplate->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
- pTemplate->style &= ~DS_MODALFRAME;
- pTemplate->style &= ~WS_CAPTION;
- pTemplate->style &= ~WS_SYSMENU;
- pTemplate->style &= ~WS_POPUP;
- pTemplate->style &= ~WS_DISABLED;
- pTemplate->style &= ~WS_VISIBLE;
- pTemplate->style &= ~WS_THICKFRAME;
+ pTemplateCopy->style |= WS_CHILD | WS_TABSTOP | DS_CONTROL;
+ pTemplateCopy->style &= ~DS_MODALFRAME;
+ pTemplateCopy->style &= ~WS_CAPTION;
+ pTemplateCopy->style &= ~WS_SYSMENU;
+ pTemplateCopy->style &= ~WS_POPUP;
+ pTemplateCopy->style &= ~WS_DISABLED;
+ pTemplateCopy->style &= ~WS_VISIBLE;
+ pTemplateCopy->style &= ~WS_THICKFRAME;
- pTemplate->dwExtendedStyle |= WS_EX_CONTROLPARENT;
+ pTemplateCopy->dwExtendedStyle |= WS_EX_CONTROLPARENT;
}
if (psInfo->proppage[index].useCallback)
@@ -1472,18 +1471,18 @@ static BOOL PROPSHEET_CreatePage(HWND hwndParent,
if(ppshpage->dwFlags & PSP_INTERNAL_UNICODE)
hwndPage = CreateDialogIndirectParamW(ppshpage->hInstance,
- pTemplate,
+ pTemplateCopy,
hwndParent,
ppshpage->pfnDlgProc,
(LPARAM)ppshpage);
else
hwndPage = CreateDialogIndirectParamA(ppshpage->hInstance,
- pTemplate,
+ pTemplateCopy,
hwndParent,
ppshpage->pfnDlgProc,
(LPARAM)ppshpage);
/* Free a no more needed copy */
- Free(temp);
+ Free(pTemplateCopy);
psInfo->proppage[index].hwndPage = hwndPage;
@@ -2131,7 +2130,7 @@ static void PROPSHEET_SetCurSelId(HWND hwndDlg, int id)
*/
static void PROPSHEET_SetTitleA(HWND hwndDlg, DWORD dwStyle, LPCSTR lpszText)
{
- if(HIWORD(lpszText))
+ if(!IS_INTRESOURCE(lpszText))
{
WCHAR szTitle[256];
MultiByteToWideChar(CP_ACP, 0, lpszText, -1,
@@ -2153,7 +2152,7 @@ static void PROPSHEET_SetTitleW(HWND hwndDlg, DWORD dwStyle, LPCWSTR lpszText)
WCHAR szTitle[256];
TRACE("%s (style %08x)\n", debugstr_w(lpszText), dwStyle);
- if (HIWORD(lpszText) == 0) {
+ if (IS_INTRESOURCE(lpszText)) {
if (!LoadStringW(psInfo->ppshheader.hInstance,
LOWORD(lpszText), szTitle, sizeof(szTitle)/sizeof(szTitle[0])))
return;
@@ -2422,28 +2421,6 @@ static BOOL PROPSHEET_RemovePage(HWND hwndDlg,
return FALSE;
}
-BOOL CALLBACK
-EnumChildProc(HWND hwnd, LPARAM lParam)
-{
- WCHAR szType[20];
- RealGetWindowClassW(hwnd, szType, 20);
-
- if (strcmpW(szType, WC_EDITW) == 0)
- {
- if (IsWindowEnabled(hwnd) && IsWindowVisible(hwnd))
- {
- SetFocus(hwnd);
- return FALSE;
- }
- }
- else
- {
- EnumChildWindows(hwnd, EnumChildProc, 0);
- }
-
- return TRUE;
-}
-
/******************************************************************************
* PROPSHEET_SetWizButtons
*
@@ -2465,6 +2442,17 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
EnableWindow(hwndNext, FALSE);
EnableWindow(hwndFinish, FALSE);
+ /* set the default pushbutton to an enabled button */
+ if (((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH))
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
+ else if (dwFlags & PSWIZB_NEXT)
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);
+ else if (dwFlags & PSWIZB_BACK)
+ SendMessageW(hwndDlg, DM_SETDEFID, IDC_BACK_BUTTON, 0);
+ else
+ SendMessageW(hwndDlg, DM_SETDEFID, IDCANCEL, 0);
+
+
if (dwFlags & PSWIZB_BACK)
EnableWindow(hwndBack, TRUE);
@@ -2494,31 +2482,6 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
}
else if (!(dwFlags & PSWIZB_DISABLEDFINISH))
EnableWindow(hwndFinish, TRUE);
-
- /* set the default pushbutton to an enabled button and give it focus */
- if (((dwFlags & PSWIZB_FINISH) || psInfo->hasFinish) && !(dwFlags & PSWIZB_DISABLEDFINISH))
- {
- SendMessageW(hwndDlg, DM_SETDEFID, IDC_FINISH_BUTTON, 0);
- SetFocus(hwndFinish);
- }
- else if (dwFlags & PSWIZB_NEXT)
- {
- SendMessageW(hwndDlg, DM_SETDEFID, IDC_NEXT_BUTTON, 0);
- SetFocus(hwndNext);
- }
- else if (dwFlags & PSWIZB_BACK)
- {
- SendMessageW(hwndDlg, DM_SETDEFID, IDC_BACK_BUTTON, 0);
- SetFocus(hwndBack);
- }
- else
- {
- SendMessageW(hwndDlg, DM_SETDEFID, IDCANCEL, 0);
- SetFocus(GetDlgItem(hwndDlg, IDCANCEL));
- }
-
- /* Now try to find an edit control that deserves focus */
- EnumChildWindows(PropSheet_GetCurrentPageHwnd(hwndDlg), EnumChildProc, 0);
}
/******************************************************************************
@@ -2526,7 +2489,7 @@ static void PROPSHEET_SetWizButtons(HWND hwndDlg, DWORD dwFlags)
*/
static BOOL PROPSHEET_InsertPage(HWND hwndDlg, HPROPSHEETPAGE hpageInsertAfter, HPROPSHEETPAGE hpage)
{
- if (!HIWORD(hpageInsertAfter))
+ if (IS_INTRESOURCE(hpageInsertAfter))
FIXME("(%p, %d, %p): stub\n", hwndDlg, LOWORD(hpageInsertAfter), hpage);
else
FIXME("(%p, %p, %p): stub\n", hwndDlg, hpageInsertAfter, hpage);
@@ -2589,6 +2552,8 @@ static LRESULT PROPSHEET_IndexToHwnd(HWND hwndDlg, int iPageIndex)
{
PropSheetInfo * psInfo = GetPropW(hwndDlg, PropSheetInfoStr);
TRACE("(%p, %d)\n", hwndDlg, iPageIndex);
+ if (!psInfo)
+ return 0;
if (iPageIndex<0 || iPageIndex>=psInfo->nPages) {
WARN("%d out of range.\n", iPageIndex);
return 0;
@@ -2658,7 +2623,7 @@ static LRESULT PROPSHEET_IndexToId(HWND hwndDlg, int iPageIndex)
return 0;
}
psp = (LPCPROPSHEETPAGEW)psInfo->proppage[iPageIndex].hpage;
- if (psp->dwFlags & PSP_DLGINDIRECT || HIWORD(psp->u.pszTemplate)) {
+ if (psp->dwFlags & PSP_DLGINDIRECT || !IS_INTRESOURCE(psp->u.pszTemplate)) {
return 0;
}
return (LRESULT)psp->u.pszTemplate;
@@ -2718,7 +2683,7 @@ static void PROPSHEET_CleanUp(HWND hwndDlg)
TRACE("\n");
if (!psInfo) return;
- if (HIWORD(psInfo->ppshheader.pszCaption))
+ if (!IS_INTRESOURCE(psInfo->ppshheader.pszCaption))
Free ((LPVOID)psInfo->ppshheader.pszCaption);
for (i = 0; i < psInfo->nPages; i++)
@@ -2974,7 +2939,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
{
- if (HIWORD( ppsp->u.pszTemplate ))
+ if (!IS_INTRESOURCE( ppsp->u.pszTemplate ))
{
int len = strlen(lpPropSheetPage->u.pszTemplate) + 1;
char *template = Alloc( len );
@@ -2985,13 +2950,13 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
if (ppsp->dwFlags & PSP_USEICONID)
{
- if (HIWORD( ppsp->u2.pszIcon ))
+ if (!IS_INTRESOURCE( ppsp->u2.pszIcon ))
PROPSHEET_AtoW(&ppsp->u2.pszIcon, lpPropSheetPage->u2.pszIcon);
}
if (ppsp->dwFlags & PSP_USETITLE)
{
- if (HIWORD( ppsp->pszTitle ))
+ if (!IS_INTRESOURCE( ppsp->pszTitle ))
PROPSHEET_AtoW( &ppsp->pszTitle, lpPropSheetPage->pszTitle );
else
ppsp->pszTitle = load_string( ppsp->hInstance, ppsp->pszTitle );
@@ -3004,7 +2969,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
if (ppsp->dwFlags & PSP_USEHEADERTITLE)
{
- if (HIWORD( ppsp->pszHeaderTitle ))
+ if (!IS_INTRESOURCE( ppsp->pszHeaderTitle ))
PROPSHEET_AtoW(&ppsp->pszHeaderTitle, lpPropSheetPage->pszHeaderTitle);
else
ppsp->pszHeaderTitle = load_string( ppsp->hInstance, ppsp->pszHeaderTitle );
@@ -3014,7 +2979,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
if (ppsp->dwFlags & PSP_USEHEADERSUBTITLE)
{
- if (HIWORD( ppsp->pszHeaderSubTitle ))
+ if (!IS_INTRESOURCE( ppsp->pszHeaderSubTitle ))
PROPSHEET_AtoW(&ppsp->pszHeaderSubTitle, lpPropSheetPage->pszHeaderSubTitle);
else
ppsp->pszHeaderSubTitle = load_string( ppsp->hInstance, ppsp->pszHeaderSubTitle );
@@ -3040,7 +3005,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
{
- if (HIWORD( ppsp->u.pszTemplate ))
+ if (!IS_INTRESOURCE( ppsp->u.pszTemplate ))
{
int len = strlenW(lpPropSheetPage->u.pszTemplate) + 1;
WCHAR *template = Alloc( len * sizeof (WCHAR) );
@@ -3051,7 +3016,7 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
if ( ppsp->dwFlags & PSP_USEICONID )
{
- if (HIWORD( ppsp->u2.pszIcon ))
+ if (!IS_INTRESOURCE( ppsp->u2.pszIcon ))
{
int len = strlenW(lpPropSheetPage->u2.pszIcon) + 1;
WCHAR *icon = Alloc( len * sizeof (WCHAR) );
@@ -3099,13 +3064,13 @@ BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
if (!psp)
return FALSE;
- if ( !(psp->dwFlags & PSP_DLGINDIRECT) && HIWORD( psp->u.pszTemplate ) )
+ if (!(psp->dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE( psp->u.pszTemplate ))
Free ((LPVOID)psp->u.pszTemplate);
- if ( (psp->dwFlags & PSP_USEICONID) && HIWORD( psp->u2.pszIcon ) )
+ if ((psp->dwFlags & PSP_USEICONID) && !IS_INTRESOURCE( psp->u2.pszIcon ))
Free ((LPVOID)psp->u2.pszIcon);
- if ((psp->dwFlags & PSP_USETITLE) && HIWORD( psp->pszTitle ))
+ if ((psp->dwFlags & PSP_USETITLE) && !IS_INTRESOURCE( psp->pszTitle ))
Free ((LPVOID)psp->pszTitle);
Free(hPropPage);
@@ -3326,7 +3291,7 @@ static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam)
if (ppshpage->dwFlags & PSP_USEHEADERTITLE) {
SetRect(&r, 20, 10, 0, 0);
- if (HIWORD(ppshpage->pszHeaderTitle))
+ if (!IS_INTRESOURCE(ppshpage->pszHeaderTitle))
DrawTextW(hdc, ppshpage->pszHeaderTitle, -1, &r, DT_LEFT | DT_SINGLELINE | DT_NOCLIP);
else
{
@@ -3342,7 +3307,7 @@ static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam)
if (ppshpage->dwFlags & PSP_USEHEADERSUBTITLE) {
SelectObject(hdc, psInfo->hFont);
SetRect(&r, 40, 25, rzone.right - 69, rzone.bottom);
- if (HIWORD(ppshpage->pszHeaderTitle))
+ if (!IS_INTRESOURCE(ppshpage->pszHeaderTitle))
DrawTextW(hdc, ppshpage->pszHeaderSubTitle, -1, &r, DT_LEFT | DT_WORDBREAK);
else
{
@@ -3504,7 +3469,7 @@ PROPSHEET_DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
}
}
- if (!HIWORD(psInfo->ppshheader.pszCaption) &&
+ if (IS_INTRESOURCE(psInfo->ppshheader.pszCaption) &&
psInfo->ppshheader.hInstance)
{
WCHAR szText[256];
diff --git a/dll/win32/comctl32/rebar.c b/dll/win32/comctl32/rebar.c
index e11d974e208..cd3abadd60c 100644
--- a/dll/win32/comctl32/rebar.c
+++ b/dll/win32/comctl32/rebar.c
@@ -78,6 +78,7 @@
* at least RB_INSERTBAND
*/
+#include
#include
#include
#include
@@ -183,7 +184,7 @@ typedef struct
INT ichevronhotBand; /* last band that had a hot chevron */
INT iGrabbedBand;/* band number of band whose gripper was grabbed */
- REBAR_BAND *bands; /* pointer to the array of rebar bands */
+ HDPA bands; /* pointer to the array of rebar bands */
} REBAR_INFO;
/* fStatus flags */
@@ -256,6 +257,13 @@ typedef struct
static LRESULT REBAR_NotifyFormat(REBAR_INFO *infoPtr, LPARAM lParam);
static void REBAR_AutoSize(REBAR_INFO *infoPtr, BOOL needsLayout);
+/* no index check here */
+static inline REBAR_BAND* REBAR_GetBand(const REBAR_INFO *infoPtr, INT i)
+{
+ assert(i >= 0 && i < infoPtr->uNumBands);
+ return DPA_GetPtr(infoPtr->bands, i);
+}
+
/* "constant values" retrieved when DLL was initialized */
/* FIXME we do this when the classes are registered. */
static UINT mindragx = 0;
@@ -379,7 +387,7 @@ REBAR_DumpBand (const REBAR_INFO *iP)
iP->hwndSelf, iP->dwStyle, (iP->bUnicode)?"TRUE":"FALSE",
(iP->DoRedraw)?"TRUE":"FALSE");
for (i = 0; i < iP->uNumBands; i++) {
- pB = &iP->bands[i];
+ pB = REBAR_GetBand(iP, i);
TRACE("band # %u:", i);
if (pB->fMask & RBBIM_ID)
TRACE(" ID=%u", pB->wID);
@@ -523,11 +531,11 @@ static INT
REBAR_Notify_NMREBAR (const REBAR_INFO *infoPtr, UINT uBand, UINT code)
{
NMREBAR notify_rebar;
- REBAR_BAND *lpBand;
notify_rebar.dwMask = 0;
- if (uBand!=-1) {
- lpBand = &infoPtr->bands[uBand];
+ if (uBand != -1) {
+ REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, uBand);
+
if (lpBand->fMask & RBBIM_ID) {
notify_rebar.dwMask |= RBNM_ID;
notify_rebar.wID = lpBand->wID;
@@ -680,7 +688,7 @@ REBAR_Refresh (const REBAR_INFO *infoPtr, HDC hdc)
if (!infoPtr->DoRedraw) return;
for (i = 0; i < infoPtr->uNumBands; i++) {
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) continue;
@@ -688,7 +696,6 @@ REBAR_Refresh (const REBAR_INFO *infoPtr, HDC hdc)
TRACE("[%p] drawing band %i, flags=%08x\n",
infoPtr->hwndSelf, i, lpBand->fDraw);
REBAR_DrawBand (hdc, infoPtr, lpBand);
-
}
}
@@ -700,11 +707,11 @@ REBAR_CalcHorzBand (const REBAR_INFO *infoPtr, UINT rstart, UINT rend)
/* *** Supports only Horizontal bars. *** */
{
REBAR_BAND *lpBand;
- UINT i, xoff, yoff;
+ UINT i, xoff;
RECT work;
for(i=rstart; ibands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) {
SetRect (&lpBand->rcChild,
lpBand->rcBand.right, lpBand->rcBand.top,
@@ -763,12 +770,24 @@ REBAR_CalcHorzBand (const REBAR_INFO *infoPtr, UINT rstart, UINT rend)
}
/* set initial child window rectangle if there is a child */
- if (lpBand->hwndChild != NULL) {
- int cyBand = lpBand->rcBand.bottom - lpBand->rcBand.top;
- yoff = (cyBand - lpBand->cyChild) / 2;
- SetRect (&lpBand->rcChild,
- lpBand->rcBand.left + lpBand->cxHeader, lpBand->rcBand.top + yoff,
- lpBand->rcBand.right - REBAR_POST_CHILD, lpBand->rcBand.top + yoff + lpBand->cyChild);
+ if (lpBand->hwndChild) {
+
+ lpBand->rcChild.left = lpBand->rcBand.left + lpBand->cxHeader;
+ lpBand->rcChild.right = lpBand->rcBand.right - REBAR_POST_CHILD;
+
+ if (lpBand->cyChild > 0) {
+
+ UINT yoff = (lpBand->rcBand.bottom - lpBand->rcBand.top - lpBand->cyChild) / 2;
+
+ /* center child if height is known */
+ lpBand->rcChild.top = lpBand->rcBand.top + yoff;
+ lpBand->rcChild.bottom = lpBand->rcBand.top + yoff + lpBand->cyChild;
+ }
+ else {
+ lpBand->rcChild.top = lpBand->rcBand.top;
+ lpBand->rcChild.bottom = lpBand->rcBand.bottom;
+ }
+
if ((lpBand->fStyle & RBBS_USECHEVRON) && (lpBand->rcChild.right - lpBand->rcChild.left < lpBand->cxIdeal))
{
lpBand->rcChild.right -= CHEVRON_WIDTH;
@@ -795,7 +814,7 @@ REBAR_CalcHorzBand (const REBAR_INFO *infoPtr, UINT rstart, UINT rend)
work.right += SEP_WIDTH;
work.bottom += SEP_WIDTH;
InvalidateRect(infoPtr->hwndSelf, &work, TRUE);
- InvalidateRect(lpBand->hwndChild, NULL, TRUE);
+ if (lpBand->hwndChild) InvalidateRect(lpBand->hwndChild, NULL, TRUE);
}
}
@@ -815,7 +834,7 @@ REBAR_CalcVertBand (const REBAR_INFO *infoPtr, UINT rstart, UINT rend)
for(i=rstart; ibands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) continue;
translate_rect(infoPtr, &rcBand, &lpBand->rcBand);
@@ -892,7 +911,7 @@ REBAR_CalcVertBand (const REBAR_INFO *infoPtr, UINT rstart, UINT rend)
}
/* set initial child window rectangle if there is a child */
- if (lpBand->hwndChild != NULL) {
+ if (lpBand->hwndChild) {
int cxBand = rcBand.right - rcBand.left;
xoff = (cxBand - lpBand->cyChild) / 2;
SetRect (&lpBand->rcChild,
@@ -916,7 +935,7 @@ REBAR_CalcVertBand (const REBAR_INFO *infoPtr, UINT rstart, UINT rend)
work.bottom += SEP_WIDTH;
work.right += SEP_WIDTH;
InvalidateRect(infoPtr->hwndSelf, &work, TRUE);
- InvalidateRect(lpBand->hwndChild, NULL, TRUE);
+ if (lpBand->hwndChild) InvalidateRect(lpBand->hwndChild, NULL, TRUE);
}
}
@@ -1006,7 +1025,7 @@ REBAR_MoveChildWindows (const REBAR_INFO *infoPtr, UINT start, UINT endplus)
ERR("BeginDeferWindowPos returned NULL\n");
for (i = start; i < endplus; i++) {
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) continue;
if (lpBand->hwndChild) {
@@ -1107,7 +1126,7 @@ static int next_visible(const REBAR_INFO *infoPtr, int i)
{
int n;
for (n = i + 1; n < infoPtr->uNumBands; n++)
- if (!HIDDENBAND(&infoPtr->bands[n]))
+ if (!HIDDENBAND(REBAR_GetBand(infoPtr, n)))
break;
return n;
}
@@ -1118,7 +1137,7 @@ static int prev_visible(const REBAR_INFO *infoPtr, int i)
{
int n;
for (n = i - 1; n >= 0; n--)
- if (!HIDDENBAND(&infoPtr->bands[n]))
+ if (!HIDDENBAND(REBAR_GetBand(infoPtr, n)))
break;
return n;
}
@@ -1133,9 +1152,9 @@ static int first_visible(const REBAR_INFO *infoPtr)
static int get_row_begin_for_band(const REBAR_INFO *infoPtr, INT iBand)
{
int iLastBand = iBand;
- int iRow = infoPtr->bands[iBand].iRow;
+ int iRow = REBAR_GetBand(infoPtr, iBand)->iRow;
while ((iBand = prev_visible(infoPtr, iBand)) >= 0) {
- if (infoPtr->bands[iBand].iRow != iRow)
+ if (REBAR_GetBand(infoPtr, iBand)->iRow != iRow)
break;
else
iLastBand = iBand;
@@ -1146,9 +1165,9 @@ static int get_row_begin_for_band(const REBAR_INFO *infoPtr, INT iBand)
/* Returns the first visible band for the next row (or infoPtr->uNumBands if none) */
static int get_row_end_for_band(const REBAR_INFO *infoPtr, INT iBand)
{
- int iRow = infoPtr->bands[iBand].iRow;
+ int iRow = REBAR_GetBand(infoPtr, iBand)->iRow;
while ((iBand = next_visible(infoPtr, iBand)) < infoPtr->uNumBands)
- if (infoPtr->bands[iBand].iRow != iRow)
+ if (REBAR_GetBand(infoPtr, iBand)->iRow != iRow)
break;
return iBand;
}
@@ -1160,9 +1179,9 @@ static void REBAR_SetRowRectsX(const REBAR_INFO *infoPtr, INT iBeginBand, INT iE
int xPos = 0, i;
for (i = iBeginBand; i < iEndBand; i = next_visible(infoPtr, i))
{
- REBAR_BAND *lpBand = &infoPtr->bands[i];
+ REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, i);
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (lpBand->rcBand.left != xPos || lpBand->rcBand.right != xPos + lpBand->cxEffective) {
lpBand->fDraw |= NTF_INVALIDATE;
TRACE("Setting rect %d to %d,%d\n", i, xPos, xPos + lpBand->cxEffective);
@@ -1183,19 +1202,20 @@ static REBAR_BAND *REBAR_FindBandToGrow(const REBAR_INFO *infoPtr, INT iBeginBan
{
INT cxMinFirstBand = 0, i;
- cxMinFirstBand = infoPtr->bands[iBeginBand].cxMinBand;
+ cxMinFirstBand = REBAR_GetBand(infoPtr, iBeginBand)->cxMinBand;
for (i = prev_visible(infoPtr, iEndBand); i >= iBeginBand; i = prev_visible(infoPtr, i))
- if (infoPtr->bands[i].cxEffective > cxMinFirstBand && !(infoPtr->bands[i].fStyle&RBBS_FIXEDSIZE))
+ if (REBAR_GetBand(infoPtr, i)->cxEffective > cxMinFirstBand &&
+ !(REBAR_GetBand(infoPtr, i)->fStyle & RBBS_FIXEDSIZE))
break;
if (i < iBeginBand)
for (i = prev_visible(infoPtr, iEndBand); i >= iBeginBand; i = prev_visible(infoPtr, i))
- if (infoPtr->bands[i].cxMinBand == cxMinFirstBand)
+ if (REBAR_GetBand(infoPtr, i)->cxMinBand == cxMinFirstBand)
break;
TRACE("Extra space for row [%d..%d) should be added to band %d\n", iBeginBand, iEndBand, i);
- return &infoPtr->bands[i];
+ return REBAR_GetBand(infoPtr, i);
}
/* Try to shrink the visible bands in [iBeginBand; iEndBand) by cxShrink, starting from the right */
@@ -1207,7 +1227,7 @@ static int REBAR_ShrinkBandsRTL(const REBAR_INFO *infoPtr, INT iBeginBand, INT i
TRACE("Shrinking bands [%d..%d) by %d, right-to-left\n", iBeginBand, iEndBand, cxShrink);
for (i = prev_visible(infoPtr, iEndBand); i >= iBeginBand; i = prev_visible(infoPtr, i))
{
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
width = max(lpBand->cxEffective - cxShrink, (int)lpBand->cxMinBand);
cxShrink -= lpBand->cxEffective - width;
@@ -1231,7 +1251,7 @@ static int REBAR_ShrinkBandsLTR(const REBAR_INFO *infoPtr, INT iBeginBand, INT i
TRACE("Shrinking bands [%d..%d) by %d, left-to-right\n", iBeginBand, iEndBand, cxShrink);
for (i = iBeginBand; i < iEndBand; i = next_visible(infoPtr, i))
{
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
width = max(lpBand->cxEffective - cxShrink, (int)lpBand->cxMinBand);
cxShrink -= lpBand->cxEffective - width;
@@ -1250,11 +1270,11 @@ static int REBAR_SetBandsHeight(const REBAR_INFO *infoPtr, INT iBeginBand, INT i
REBAR_BAND *lpBand;
int yMaxHeight = 0;
int yPos = yStart;
- int row = infoPtr->bands[iBeginBand].iRow;
+ int row = REBAR_GetBand(infoPtr, iBeginBand)->iRow;
int i;
for (i = iBeginBand; i < iEndBand; i = next_visible(infoPtr, i))
{
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
lpBand->cyRowSoFar = yMaxHeight;
yMaxHeight = max(yMaxHeight, lpBand->cyMinBand);
}
@@ -1262,7 +1282,7 @@ static int REBAR_SetBandsHeight(const REBAR_INFO *infoPtr, INT iBeginBand, INT i
for (i = iBeginBand; i < iEndBand; i = next_visible(infoPtr, i))
{
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
/* we may be called for multiple rows if RBS_VARHEIGHT not set */
if (lpBand->iRow != row) {
yPos += yMaxHeight + SEP_WIDTH;
@@ -1288,12 +1308,12 @@ static void REBAR_LayoutRow(const REBAR_INFO *infoPtr, int iBeginBand, int iEndB
TRACE("Adjusting row [%d;%d). Width: %d\n", iBeginBand, iEndBand, cx);
for (i = iBeginBand; i < iEndBand; i++)
- infoPtr->bands[i].iRow = *piRow;
+ REBAR_GetBand(infoPtr, i)->iRow = *piRow;
/* compute the extra space */
for (i = iBeginBand; i < iEndBand; i = next_visible(infoPtr, i))
{
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (i > iBeginBand)
width += SEP_WIDTH;
lpBand->cxEffective = max(lpBand->cxMinBand, lpBand->cx);
@@ -1356,7 +1376,7 @@ REBAR_Layout(REBAR_INFO *infoPtr)
/* divide rows */
for (i = rowstart; i < infoPtr->uNumBands; i = next_visible(infoPtr, i))
{
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (i > rowstart && (lpBand->fStyle & RBBS_BREAK || xMin + lpBand->cxMinBand > adjcx)) {
TRACE("%s break on band %d\n", (lpBand->fStyle & RBBS_BREAK ? "Hard" : "Soft"), i - 1);
@@ -1369,7 +1389,8 @@ REBAR_Layout(REBAR_INFO *infoPtr)
xMin += lpBand->cxMinBand;
}
- REBAR_LayoutRow(infoPtr, rowstart, infoPtr->uNumBands, adjcx, &row, &yPos);
+ if (rowstart < infoPtr->uNumBands)
+ REBAR_LayoutRow(infoPtr, rowstart, infoPtr->uNumBands, adjcx, &row, &yPos);
if (!(infoPtr->dwStyle & RBS_VARHEIGHT))
yPos = REBAR_SetBandsHeight(infoPtr, first_visible(infoPtr), infoPtr->uNumBands, 0);
@@ -1413,10 +1434,11 @@ REBAR_SizeChildrenToHeight(const REBAR_INFO *infoPtr, int iBeginBand, int iEndBa
TRACE("[%d;%d) by %d\n", iBeginBand, iEndBand, extra);
- cyBandsOld = infoPtr->bands[iBeginBand].rcBand.bottom - infoPtr->bands[iBeginBand].rcBand.top;
+ cyBandsOld = REBAR_GetBand(infoPtr, iBeginBand)->rcBand.bottom -
+ REBAR_GetBand(infoPtr, iBeginBand)->rcBand.top;
for (i = iBeginBand; i < iEndBand; i = next_visible(infoPtr, i))
{
- REBAR_BAND *lpBand = &infoPtr->bands[i];
+ REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, i);
int cyMaxChild = cyBandsOld - REBARSPACE(lpBand) + extra;
int cyChild = round_child_height(lpBand, cyMaxChild);
@@ -1452,7 +1474,7 @@ REBAR_SizeToHeight(REBAR_INFO *infoPtr, int height)
{
for (i = prev_visible(infoPtr, infoPtr->uNumBands); i > 0; i = prev_visible(infoPtr, i))
{
- REBAR_BAND *lpBand = &infoPtr->bands[i];
+ REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, i);
int height = lpBand->rcBand.bottom - lpBand->rcBand.top;
int cyBreakExtra; /* additional cy for the rebar after a RBBS_BREAK on this band */
@@ -1488,13 +1510,14 @@ REBAR_SizeToHeight(REBAR_INFO *infoPtr, int height)
int iRow = 0;
while (i < infoPtr->uNumBands)
{
- REBAR_BAND *lpBand = &infoPtr->bands[i];
+ REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, i);
int extraForRow = extra / (int)(uNumRows - iRow);
int rowEnd;
/* we can't use get_row_end_for_band as we might have added RBBS_BREAK in the first phase */
for (rowEnd = next_visible(infoPtr, i); rowEnd < infoPtr->uNumBands; rowEnd = next_visible(infoPtr, rowEnd))
- if (infoPtr->bands[rowEnd].iRow != lpBand->iRow || (infoPtr->bands[rowEnd].fStyle & RBBS_BREAK))
+ if (REBAR_GetBand(infoPtr, rowEnd)->iRow != lpBand->iRow ||
+ REBAR_GetBand(infoPtr, rowEnd)->fStyle & RBBS_BREAK)
break;
extra -= REBAR_SizeChildrenToHeight(infoPtr, i, rowEnd, extraForRow, &fChanged);
@@ -1572,7 +1595,7 @@ REBAR_ValidateBand (const REBAR_INFO *infoPtr, REBAR_BAND *lpBand)
/* count number of non-FIXEDSIZE and non-Hidden bands */
nonfixed = 0;
for (i=0; iuNumBands; i++){
- tBand = &infoPtr->bands[i];
+ tBand = REBAR_GetBand(infoPtr, i);
if (!HIDDENBAND(tBand) && !(tBand->fStyle & RBBS_FIXEDSIZE))
nonfixed++;
}
@@ -1775,7 +1798,7 @@ REBAR_CommonSetupBand(HWND hwnd, const REBARBANDINFOW *lprbbi, REBAR_BAND *lpBan
}
static LRESULT
-REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, WPARAM wParam, const RECT *clip)
+REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc, const RECT *clip)
/* Function: This erases the background rectangle by drawing */
/* each band with its background color (or the default) and */
/* draws each bands right separator if necessary. The row */
@@ -1784,7 +1807,6 @@ REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, WPARAM wParam, const RECT *
REBAR_BAND *lpBand;
UINT i;
INT oldrow;
- HDC hdc = (HDC)wParam;
RECT cr;
COLORREF old = CLR_NONE, new;
HTHEME theme = GetWindowTheme (infoPtr->hwndSelf);
@@ -1794,7 +1816,7 @@ REBAR_InternalEraseBkGnd (const REBAR_INFO *infoPtr, WPARAM wParam, const RECT *
oldrow = -1;
for(i=0; iuNumBands; i++) {
RECT rcBand;
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) continue;
translate_rect(infoPtr, &rcBand, &lpBand->rcBand);
@@ -1918,7 +1940,7 @@ REBAR_InternalHitTest (const REBAR_INFO *infoPtr, const POINT *lpPt, UINT *pFlag
/* somewhere inside */
for (iCount = 0; iCount < infoPtr->uNumBands; iCount++) {
RECT rcBand;
- lpBand = &infoPtr->bands[iCount];
+ lpBand = REBAR_GetBand(infoPtr, iCount);
translate_rect(infoPtr, &rcBand, &lpBand->rcBand);
if (HIDDENBAND(lpBand)) continue;
if (PtInRect (&rcBand, *lpPt)) {
@@ -2004,21 +2026,25 @@ REBAR_HandleLRDrag (REBAR_INFO *infoPtr, const POINT *ptsmove)
iHitBand = infoPtr->iGrabbedBand;
iRowBegin = get_row_begin_for_band(infoPtr, iHitBand);
iRowEnd = get_row_end_for_band(infoPtr, iHitBand);
- hitBand = &infoPtr->bands[iHitBand];
+ hitBand = REBAR_GetBand(infoPtr, iHitBand);
xBand = hitBand->rcBand.left;
movement = (infoPtr->dwStyle&CCS_VERT ? ptsmove->y : ptsmove->x)
- (xBand + REBAR_PRE_GRIPPER - infoPtr->ihitoffset);
if (movement < 0) {
- int cxLeft = REBAR_ShrinkBandsRTL(infoPtr, iRowBegin, iHitBand, -movement, TRUE);
+ INT cxLeft = REBAR_ShrinkBandsRTL(infoPtr, iRowBegin, iHitBand, -movement, TRUE);
hitBand->cxEffective += -movement - cxLeft;
hitBand->cx = hitBand->cxEffective;
} else if (movement > 0) {
- int cxLeft = REBAR_ShrinkBandsLTR(infoPtr, iHitBand, iRowEnd, movement, TRUE);
- REBAR_BAND *lpPrev = &infoPtr->bands[prev_visible(infoPtr, iHitBand)];
- lpPrev->cxEffective += movement - cxLeft;
- lpPrev->cx = lpPrev->cxEffective;
+ INT prev;
+
+ if ((prev = prev_visible(infoPtr, iHitBand)) >= 0) {
+ INT cxLeft = REBAR_ShrinkBandsLTR(infoPtr, iHitBand, iRowEnd, movement, TRUE);
+ REBAR_BAND *lpPrev = REBAR_GetBand(infoPtr, prev_visible(infoPtr, iHitBand));
+ lpPrev->cxEffective += movement - cxLeft;
+ lpPrev->cx = lpPrev->cxEffective;
+ }
}
REBAR_SetRowRectsX(infoPtr, iRowBegin, iRowEnd);
@@ -2044,24 +2070,23 @@ REBAR_DeleteBand (REBAR_INFO *infoPtr, WPARAM wParam)
return FALSE;
TRACE("deleting band %u!\n", uBand);
- lpBand = &infoPtr->bands[uBand];
+ lpBand = REBAR_GetBand(infoPtr, uBand);
REBAR_Notify_NMREBAR (infoPtr, uBand, RBN_DELETINGBAND);
/* TODO: a return of 1 should probably cancel the deletion */
if (lpBand->hwndChild)
ShowWindow(lpBand->hwndChild, SW_HIDE);
Free(lpBand->lpText);
+ Free(lpBand);
infoPtr->uNumBands--;
- memmove(&infoPtr->bands[uBand], &infoPtr->bands[uBand+1],
- (infoPtr->uNumBands - uBand) * sizeof(REBAR_BAND));
- infoPtr->bands = ReAlloc(infoPtr->bands, infoPtr->uNumBands * sizeof(REBAR_BAND));
+ DPA_DeletePtr(infoPtr->bands, uBand);
REBAR_Notify_NMREBAR (infoPtr, -1, RBN_DELETEDBAND);
/* if only 1 band left the re-validate to possible eliminate gripper */
if (infoPtr->uNumBands == 1)
- REBAR_ValidateBand (infoPtr, &infoPtr->bands[0]);
+ REBAR_ValidateBand (infoPtr, REBAR_GetBand(infoPtr, 0));
REBAR_Layout(infoPtr);
@@ -2074,17 +2099,16 @@ REBAR_DeleteBand (REBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-REBAR_GetBandBorders (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_GetBandBorders (const REBAR_INFO *infoPtr, UINT uBand, RECT *lpRect)
{
- LPRECT lpRect = (LPRECT)lParam;
REBAR_BAND *lpBand;
- if (!lParam)
+ if (!lpRect)
return 0;
- if ((UINT)wParam >= infoPtr->uNumBands)
+ if (uBand >= infoPtr->uNumBands)
return 0;
- lpBand = &infoPtr->bands[(UINT)wParam];
+ lpBand = REBAR_GetBand(infoPtr, uBand);
/* FIXME - the following values were determined by experimentation */
/* with the REBAR Control Spy. I have guesses as to what the 4 and */
@@ -2122,22 +2146,20 @@ REBAR_GetBandCount (const REBAR_INFO *infoPtr)
static LRESULT
-REBAR_GetBandInfoT(const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
+REBAR_GetBandInfoT(const REBAR_INFO *infoPtr, UINT uIndex, LPREBARBANDINFOW lprbbi, BOOL bUnicode)
{
- LPREBARBANDINFOW lprbbi = (LPREBARBANDINFOW)lParam;
REBAR_BAND *lpBand;
- if (lprbbi == NULL)
- return FALSE;
- if (lprbbi->cbSize < REBARBANDINFOA_V3_SIZE)
- return FALSE;
- if ((UINT)wParam >= infoPtr->uNumBands)
+ if (!lprbbi || lprbbi->cbSize < REBARBANDINFOA_V3_SIZE)
return FALSE;
- TRACE("index %u (bUnicode=%d)\n", (UINT)wParam, bUnicode);
+ if (uIndex >= infoPtr->uNumBands)
+ return FALSE;
+
+ TRACE("index %u (bUnicode=%d)\n", uIndex, bUnicode);
/* copy band information */
- lpBand = &infoPtr->bands[(UINT)wParam];
+ lpBand = REBAR_GetBand(infoPtr, uIndex);
if (lprbbi->fMask & RBBIM_STYLE)
lprbbi->fStyle = lpBand->fStyle;
@@ -2215,14 +2237,9 @@ REBAR_GetBarHeight (const REBAR_INFO *infoPtr)
static LRESULT
-REBAR_GetBarInfo (const REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_GetBarInfo (const REBAR_INFO *infoPtr, LPREBARINFO lpInfo)
{
- LPREBARINFO lpInfo = (LPREBARINFO)lParam;
-
- if (lpInfo == NULL)
- return FALSE;
-
- if (lpInfo->cbSize < sizeof (REBARINFO))
+ if (!lpInfo || lpInfo->cbSize < sizeof (REBARINFO))
return FALSE;
TRACE("getting bar info!\n");
@@ -2255,7 +2272,7 @@ REBAR_GetBkColor (const REBAR_INFO *infoPtr)
static LRESULT
-REBAR_GetPalette (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_GetPalette (const REBAR_INFO *infoPtr)
{
FIXME("empty stub!\n");
@@ -2264,18 +2281,16 @@ REBAR_GetPalette (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-REBAR_GetRect (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_GetRect (const REBAR_INFO *infoPtr, INT iBand, RECT *lprc)
{
- INT iBand = (INT)wParam;
- LPRECT lprc = (LPRECT)lParam;
REBAR_BAND *lpBand;
- if ((iBand < 0) || ((UINT)iBand >= infoPtr->uNumBands))
+ if (iBand < 0 || iBand >= infoPtr->uNumBands)
return FALSE;
if (!lprc)
return FALSE;
- lpBand = &infoPtr->bands[iBand];
+ lpBand = REBAR_GetBand(infoPtr, iBand);
/* For CCS_VERT the coordinates will be swapped - like on Windows */
CopyRect (lprc, &lpBand->rcBand);
@@ -2295,15 +2310,14 @@ REBAR_GetRowCount (const REBAR_INFO *infoPtr)
static LRESULT
-REBAR_GetRowHeight (const REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_GetRowHeight (const REBAR_INFO *infoPtr, INT iRow)
{
- INT iRow = (INT)wParam;
int j = 0, ret = 0;
UINT i;
REBAR_BAND *lpBand;
for (i=0; iuNumBands; i++) {
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
if (HIDDENBAND(lpBand)) continue;
if (lpBand->iRow != iRow) continue;
j = lpBand->rcBand.bottom - lpBand->rcBand.top;
@@ -2351,10 +2365,8 @@ REBAR_GetVersion (const REBAR_INFO *infoPtr)
static LRESULT
-REBAR_HitTest (const REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_HitTest (const REBAR_INFO *infoPtr, LPRBHITTESTINFO lprbht)
{
- LPRBHITTESTINFO lprbht = (LPRBHITTESTINFO)lParam;
-
if (!lprbht)
return -1;
@@ -2365,60 +2377,55 @@ REBAR_HitTest (const REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_IdToIndex (const REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_IdToIndex (const REBAR_INFO *infoPtr, UINT uId)
{
UINT i;
- if (infoPtr == NULL)
- return -1;
-
if (infoPtr->uNumBands < 1)
return -1;
for (i = 0; i < infoPtr->uNumBands; i++) {
- if (infoPtr->bands[i].wID == (UINT)wParam) {
- TRACE("id %u is band %u found!\n", (UINT)wParam, i);
+ if (REBAR_GetBand(infoPtr, i)->wID == uId) {
+ TRACE("id %u is band %u found!\n", uId, i);
return i;
}
}
- TRACE("id %u is not found\n", (UINT)wParam);
+ TRACE("id %u is not found\n", uId);
return -1;
}
static LRESULT
-REBAR_InsertBandT(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
+REBAR_InsertBandT(REBAR_INFO *infoPtr, INT iIndex, LPREBARBANDINFOW lprbbi, BOOL bUnicode)
{
- LPREBARBANDINFOW lprbbi = (LPREBARBANDINFOW)lParam;
- UINT uIndex = (UINT)wParam;
REBAR_BAND *lpBand;
- if (infoPtr == NULL)
- return FALSE;
- if (lprbbi == NULL)
- return FALSE;
- if (lprbbi->cbSize < REBARBANDINFOA_V3_SIZE)
+ if (!lprbbi || lprbbi->cbSize < REBARBANDINFOA_V3_SIZE)
return FALSE;
/* trace the index as signed to see the -1 */
- TRACE("insert band at %d (bUnicode=%d)!\n", (INT)uIndex, bUnicode);
+ TRACE("insert band at %d (bUnicode=%d)!\n", iIndex, bUnicode);
REBAR_DumpBandInfo(lprbbi);
- infoPtr->bands = ReAlloc(infoPtr->bands, (infoPtr->uNumBands+1) * sizeof(REBAR_BAND));
- if (((INT)uIndex == -1) || (uIndex > infoPtr->uNumBands))
- uIndex = infoPtr->uNumBands;
- memmove(&infoPtr->bands[uIndex+1], &infoPtr->bands[uIndex],
- sizeof(REBAR_BAND) * (infoPtr->uNumBands - uIndex));
+ if (!(lpBand = Alloc(sizeof(REBAR_BAND)))) return FALSE;
+ if ((iIndex == -1) || (iIndex > infoPtr->uNumBands))
+ iIndex = infoPtr->uNumBands;
+ if (DPA_InsertPtr(infoPtr->bands, iIndex, lpBand) == -1)
+ {
+ Free(lpBand);
+ return FALSE;
+ }
infoPtr->uNumBands++;
- TRACE("index %u!\n", uIndex);
+ TRACE("index %d!\n", iIndex);
- /* initialize band (infoPtr->bands[uIndex])*/
- lpBand = &infoPtr->bands[uIndex];
- ZeroMemory(lpBand, sizeof(*lpBand));
- lpBand->clrFore = infoPtr->clrText;
- lpBand->clrBack = infoPtr->clrBk;
+ /* initialize band */
+ memset(lpBand, 0, sizeof(*lpBand));
+ lpBand->clrFore = infoPtr->clrText == CLR_NONE ? infoPtr->clrBtnText :
+ infoPtr->clrText;
+ lpBand->clrBack = infoPtr->clrBk == CLR_NONE ? infoPtr->clrBtnFace :
+ infoPtr->clrBk;
lpBand->iImage = -1;
REBAR_CommonSetupBand(infoPtr->hwndSelf, lprbbi, lpBand);
@@ -2440,7 +2447,7 @@ REBAR_InsertBandT(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnico
REBAR_ValidateBand (infoPtr, lpBand);
/* On insert of second band, revalidate band 1 to possible add gripper */
if (infoPtr->uNumBands == 2)
- REBAR_ValidateBand (infoPtr, &infoPtr->bands[0]);
+ REBAR_ValidateBand (infoPtr, REBAR_GetBand(infoPtr, 0));
REBAR_DumpBand (infoPtr);
@@ -2452,29 +2459,27 @@ REBAR_InsertBandT(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnico
static LRESULT
-REBAR_MaximizeBand (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_MaximizeBand (const REBAR_INFO *infoPtr, INT iBand, LPARAM lParam)
{
REBAR_BAND *lpBand;
- UINT uBand = (UINT) wParam;
int iRowBegin, iRowEnd;
int cxDesired, extra, extraOrig;
int cxIdealBand;
/* Validate */
- if ((infoPtr->uNumBands == 0) ||
- ((INT)uBand < 0) || (uBand >= infoPtr->uNumBands)) {
+ if (infoPtr->uNumBands == 0 || iBand < 0 || iBand >= infoPtr->uNumBands) {
/* error !!! */
ERR("Illegal MaximizeBand, requested=%d, current band count=%d\n",
- (INT)uBand, infoPtr->uNumBands);
+ iBand, infoPtr->uNumBands);
return FALSE;
}
- lpBand = &infoPtr->bands[uBand];
+ lpBand = REBAR_GetBand(infoPtr, iBand);
if (lpBand->fStyle & RBBS_HIDDEN)
{
/* Windows is buggy and creates a hole */
- WARN("Ignoring maximize request on a hidden band (%d)\n", uBand);
+ WARN("Ignoring maximize request on a hidden band (%d)\n", iBand);
return FALSE;
}
@@ -2484,16 +2489,16 @@ REBAR_MaximizeBand (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
else
cxDesired = infoPtr->calcSize.cx;
- iRowBegin = get_row_begin_for_band(infoPtr, uBand);
- iRowEnd = get_row_end_for_band(infoPtr, uBand);
+ iRowBegin = get_row_begin_for_band(infoPtr, iBand);
+ iRowEnd = get_row_end_for_band(infoPtr, iBand);
extraOrig = extra = cxDesired - lpBand->cxEffective;
if (extra > 0)
- extra = REBAR_ShrinkBandsRTL(infoPtr, iRowBegin, uBand, extra, TRUE);
+ extra = REBAR_ShrinkBandsRTL(infoPtr, iRowBegin, iBand, extra, TRUE);
if (extra > 0)
- extra = REBAR_ShrinkBandsLTR(infoPtr, next_visible(infoPtr, uBand), iRowEnd, extra, TRUE);
+ extra = REBAR_ShrinkBandsLTR(infoPtr, next_visible(infoPtr, iBand), iRowEnd, extra, TRUE);
lpBand->cxEffective += extraOrig - extra;
lpBand->cx = lpBand->cxEffective;
- TRACE("(%ld, %ld): Wanted size %d, obtained %d (shrink %d, %d)\n", wParam, lParam, cxDesired, lpBand->cx, extraOrig, extra);
+ TRACE("(%d, %ld): Wanted size %d, obtained %d (shrink %d, %d)\n", iBand, lParam, cxDesired, lpBand->cx, extraOrig, extra);
REBAR_SetRowRectsX(infoPtr, iRowBegin, iRowEnd);
if (infoPtr->dwStyle & CCS_VERT)
@@ -2507,10 +2512,9 @@ REBAR_MaximizeBand (const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-REBAR_MinimizeBand (const REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_MinimizeBand (const REBAR_INFO *infoPtr, INT iBand)
{
REBAR_BAND *lpBand;
- UINT uBand = (UINT) wParam;
int iPrev, iRowBegin, iRowEnd;
/* A "minimize" band is equivalent to "dragging" the gripper
@@ -2519,43 +2523,42 @@ REBAR_MinimizeBand (const REBAR_INFO *infoPtr, WPARAM wParam)
*/
/* Validate */
- if ((infoPtr->uNumBands == 0) ||
- ((INT)uBand < 0) || (uBand >= infoPtr->uNumBands)) {
+ if (infoPtr->uNumBands == 0 || iBand < 0 || iBand >= infoPtr->uNumBands) {
/* error !!! */
ERR("Illegal MinimizeBand, requested=%d, current band count=%d\n",
- (INT)uBand, infoPtr->uNumBands);
+ iBand, infoPtr->uNumBands);
return FALSE;
}
/* compute amount of movement and validate */
- lpBand = &infoPtr->bands[uBand];
+ lpBand = REBAR_GetBand(infoPtr, iBand);
if (lpBand->fStyle & RBBS_HIDDEN)
{
/* Windows is buggy and creates a hole/overlap */
- WARN("Ignoring minimize request on a hidden band (%d)\n", uBand);
+ WARN("Ignoring minimize request on a hidden band (%d)\n", iBand);
return FALSE;
}
- iPrev = prev_visible(infoPtr, uBand);
+ iPrev = prev_visible(infoPtr, iBand);
/* if first band in row */
- if (iPrev < 0 || infoPtr->bands[iPrev].iRow != lpBand->iRow) {
- int iNext = next_visible(infoPtr, uBand);
- if (iNext < infoPtr->uNumBands && infoPtr->bands[iNext].iRow == lpBand->iRow) {
- TRACE("(%ld): Minimizing the first band in row is by maximizing the second\n", wParam);
+ if (iPrev < 0 || REBAR_GetBand(infoPtr, iPrev)->iRow != lpBand->iRow) {
+ int iNext = next_visible(infoPtr, iBand);
+ if (iNext < infoPtr->uNumBands && REBAR_GetBand(infoPtr, iNext)->iRow == lpBand->iRow) {
+ TRACE("(%d): Minimizing the first band in row is by maximizing the second\n", iBand);
REBAR_MaximizeBand(infoPtr, iNext, FALSE);
}
else
- TRACE("(%ld): Only one band in row - nothing to do\n", wParam);
+ TRACE("(%d): Only one band in row - nothing to do\n", iBand);
return TRUE;
}
- infoPtr->bands[iPrev].cxEffective += lpBand->cxEffective - lpBand->cxMinBand;
- infoPtr->bands[iPrev].cx = infoPtr->bands[iPrev].cxEffective;
+ REBAR_GetBand(infoPtr, iPrev)->cxEffective += lpBand->cxEffective - lpBand->cxMinBand;
+ REBAR_GetBand(infoPtr, iPrev)->cx = REBAR_GetBand(infoPtr, iPrev)->cxEffective;
lpBand->cx = lpBand->cxEffective = lpBand->cxMinBand;
- iRowBegin = get_row_begin_for_band(infoPtr, uBand);
- iRowEnd = get_row_end_for_band(infoPtr, uBand);
+ iRowBegin = get_row_begin_for_band(infoPtr, iBand);
+ iRowEnd = get_row_end_for_band(infoPtr, iBand);
REBAR_SetRowRectsX(infoPtr, iRowBegin, iRowEnd);
if (infoPtr->dwStyle & CCS_VERT)
@@ -2568,53 +2571,25 @@ REBAR_MinimizeBand (const REBAR_INFO *infoPtr, WPARAM wParam)
static LRESULT
-REBAR_MoveBand (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_MoveBand (REBAR_INFO *infoPtr, INT iFrom, INT iTo)
{
- REBAR_BAND *oldBands = infoPtr->bands;
- REBAR_BAND holder;
- UINT uFrom = (UINT)wParam;
- UINT uTo = (UINT)lParam;
+ REBAR_BAND *lpBand;
/* Validate */
if ((infoPtr->uNumBands == 0) ||
- ((INT)uFrom < 0) || (uFrom >= infoPtr->uNumBands) ||
- ((INT)uTo < 0) || (uTo >= infoPtr->uNumBands)) {
+ (iFrom < 0) || iFrom >= infoPtr->uNumBands ||
+ (iTo < 0) || iTo >= infoPtr->uNumBands) {
/* error !!! */
ERR("Illegal MoveBand, from=%d, to=%d, current band count=%d\n",
- (INT)uFrom, (INT)uTo, infoPtr->uNumBands);
+ iFrom, iTo, infoPtr->uNumBands);
return FALSE;
}
- /* save one to be moved */
- holder = oldBands[uFrom];
+ lpBand = REBAR_GetBand(infoPtr, iFrom);
+ DPA_DeletePtr(infoPtr->bands, iFrom);
+ DPA_InsertPtr(infoPtr->bands, iTo, lpBand);
- /* close up rest of bands (pseudo delete) */
- if (uFrom < infoPtr->uNumBands - 1) {
- memcpy (&oldBands[uFrom], &oldBands[uFrom+1],
- (infoPtr->uNumBands - uFrom - 1) * sizeof(REBAR_BAND));
- }
-
- /* allocate new space and copy rest of bands into it */
- infoPtr->bands = Alloc ((infoPtr->uNumBands)*sizeof(REBAR_BAND));
-
- /* pre insert copy */
- if (uTo > 0) {
- memcpy (&infoPtr->bands[0], &oldBands[0],
- uTo * sizeof(REBAR_BAND));
- }
-
- /* set moved band */
- infoPtr->bands[uTo] = holder;
-
- /* post copy */
- if (uTo < infoPtr->uNumBands - 1) {
- memcpy (&infoPtr->bands[uTo+1], &oldBands[uTo],
- (infoPtr->uNumBands - uTo - 1) * sizeof(REBAR_BAND));
- }
-
- Free (oldBands);
-
- TRACE("moved band %d to index %d\n", uFrom, uTo);
+ TRACE("moved band %d to index %d\n", iFrom, iTo);
REBAR_DumpBand (infoPtr);
/* **************************************************** */
@@ -2638,24 +2613,22 @@ REBAR_strdifW( LPCWSTR a, LPCWSTR b )
}
static LRESULT
-REBAR_SetBandInfoT(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
+REBAR_SetBandInfoT(REBAR_INFO *infoPtr, INT iBand, LPREBARBANDINFOW lprbbi, BOOL bUnicode)
{
- LPREBARBANDINFOW lprbbi = (LPREBARBANDINFOW)lParam;
REBAR_BAND *lpBand;
UINT uChanged;
- if (lprbbi == NULL)
- return FALSE;
- if (lprbbi->cbSize < REBARBANDINFOA_V3_SIZE)
- return FALSE;
- if ((UINT)wParam >= infoPtr->uNumBands)
+ if (!lprbbi || lprbbi->cbSize < REBARBANDINFOA_V3_SIZE)
return FALSE;
- TRACE("index %u\n", (UINT)wParam);
+ if (iBand >= infoPtr->uNumBands)
+ return FALSE;
+
+ TRACE("index %d\n", iBand);
REBAR_DumpBandInfo (lprbbi);
/* set band information */
- lpBand = &infoPtr->bands[(UINT)wParam];
+ lpBand = REBAR_GetBand(infoPtr, iBand);
uChanged = REBAR_CommonSetupBand (infoPtr->hwndSelf, lprbbi, lpBand);
if (lprbbi->fMask & RBBIM_TEXT) {
@@ -2688,16 +2661,12 @@ REBAR_SetBandInfoT(REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnic
static LRESULT
-REBAR_SetBarInfo (REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_SetBarInfo (REBAR_INFO *infoPtr, LPREBARINFO lpInfo)
{
- LPREBARINFO lpInfo = (LPREBARINFO)lParam;
REBAR_BAND *lpBand;
UINT i;
- if (lpInfo == NULL)
- return FALSE;
-
- if (lpInfo->cbSize < sizeof (REBARINFO))
+ if (!lpInfo || lpInfo->cbSize < sizeof (REBARINFO))
return FALSE;
TRACE("setting bar info!\n");
@@ -2720,7 +2689,7 @@ REBAR_SetBarInfo (REBAR_INFO *infoPtr, LPARAM lParam)
/* revalidate all bands to reset flags for images in headers of bands */
for (i=0; iuNumBands; i++) {
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
REBAR_ValidateBand (infoPtr, lpBand);
}
@@ -2729,12 +2698,12 @@ REBAR_SetBarInfo (REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_SetBkColor (REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_SetBkColor (REBAR_INFO *infoPtr, COLORREF clr)
{
COLORREF clrTemp;
clrTemp = infoPtr->clrBk;
- infoPtr->clrBk = (COLORREF)lParam;
+ infoPtr->clrBk = clr;
TRACE("background color 0x%06x!\n", infoPtr->clrBk);
@@ -2747,23 +2716,23 @@ REBAR_SetBkColor (REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_SetParent (REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_SetParent (REBAR_INFO *infoPtr, HWND parent)
{
HWND hwndTemp = infoPtr->hwndNotify;
- infoPtr->hwndNotify = (HWND)wParam;
+ infoPtr->hwndNotify = parent;
return (LRESULT)hwndTemp;
}
static LRESULT
-REBAR_SetTextColor (REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_SetTextColor (REBAR_INFO *infoPtr, COLORREF clr)
{
COLORREF clrTemp;
clrTemp = infoPtr->clrText;
- infoPtr->clrText = (COLORREF)lParam;
+ infoPtr->clrText = clr;
TRACE("text color 0x%06x!\n", infoPtr->clrText);
@@ -2775,15 +2744,15 @@ REBAR_SetTextColor (REBAR_INFO *infoPtr, LPARAM lParam)
static inline LRESULT
-REBAR_SetUnicodeFormat (REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_SetUnicodeFormat (REBAR_INFO *infoPtr, BOOL unicode)
{
BOOL bTemp = infoPtr->bUnicode;
TRACE("to %s hwnd=%p, was %s\n",
- ((BOOL)wParam) ? "TRUE" : "FALSE", infoPtr->hwndSelf,
+ unicode ? "TRUE" : "FALSE", infoPtr->hwndSelf,
(bTemp) ? "TRUE" : "FALSE");
- infoPtr->bUnicode = (BOOL)wParam;
+ infoPtr->bUnicode = unicode;
return bTemp;
}
@@ -2806,23 +2775,23 @@ REBAR_SetVersion (REBAR_INFO *infoPtr, INT iVersion)
static LRESULT
-REBAR_ShowBand (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_ShowBand (REBAR_INFO *infoPtr, INT iBand, BOOL show)
{
REBAR_BAND *lpBand;
- if (((INT)wParam < 0) || ((INT)wParam > infoPtr->uNumBands))
+ if (iBand < 0 || iBand > infoPtr->uNumBands)
return FALSE;
- lpBand = &infoPtr->bands[(INT)wParam];
+ lpBand = REBAR_GetBand(infoPtr, iBand);
- if ((BOOL)lParam) {
- TRACE("show band %d\n", (INT)wParam);
+ if (show) {
+ TRACE("show band %d\n", iBand);
lpBand->fStyle = lpBand->fStyle & ~RBBS_HIDDEN;
if (IsWindow (lpBand->hwndChild))
ShowWindow (lpBand->hwndChild, SW_SHOW);
}
else {
- TRACE("hide band %d\n", (INT)wParam);
+ TRACE("hide band %d\n", iBand);
lpBand->fStyle = lpBand->fStyle | RBBS_HIDDEN;
if (IsWindow (lpBand->hwndChild))
ShowWindow (lpBand->hwndChild, SW_HIDE);
@@ -2836,12 +2805,9 @@ REBAR_ShowBand (REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-REBAR_SizeToRect (REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_SizeToRect (REBAR_INFO *infoPtr, const RECT *lpRect)
{
- LPRECT lpRect = (LPRECT)lParam;
-
- if (lpRect == NULL)
- return FALSE;
+ if (!lpRect) return FALSE;
TRACE("[%s]\n", wine_dbgstr_rect(lpRect));
REBAR_SizeToHeight(infoPtr, get_rect_cy(infoPtr, lpRect));
@@ -2851,9 +2817,8 @@ REBAR_SizeToRect (REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_Create (REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_Create (REBAR_INFO *infoPtr, LPCREATESTRUCTW cs)
{
- LPCREATESTRUCTW cs = (LPCREATESTRUCTW) lParam;
RECT wnrc1, clrc1;
if (TRACE_ON(rebar)) {
@@ -2871,7 +2836,7 @@ REBAR_Create (REBAR_INFO *infoPtr, LPARAM lParam)
/* native seems to clear WS_BORDER when themed */
infoPtr->dwStyle &= ~WS_BORDER;
}
-
+
return 0;
}
@@ -2882,30 +2847,27 @@ REBAR_Destroy (REBAR_INFO *infoPtr)
REBAR_BAND *lpBand;
UINT i;
+ /* clean up each band */
+ for (i = 0; i < infoPtr->uNumBands; i++) {
+ lpBand = REBAR_GetBand(infoPtr, i);
- /* free rebar bands */
- if ((infoPtr->uNumBands > 0) && infoPtr->bands) {
- /* clean up each band */
- for (i = 0; i < infoPtr->uNumBands; i++) {
- lpBand = &infoPtr->bands[i];
-
- /* delete text strings */
- Free (lpBand->lpText);
- lpBand->lpText = NULL;
- /* destroy child window */
- DestroyWindow (lpBand->hwndChild);
- }
-
- /* free band array */
- Free (infoPtr->bands);
- infoPtr->bands = NULL;
+ /* delete text strings */
+ Free (lpBand->lpText);
+ lpBand->lpText = NULL;
+ /* destroy child window */
+ DestroyWindow (lpBand->hwndChild);
+ Free (lpBand);
}
+ /* free band array */
+ DPA_Destroy (infoPtr->bands);
+ infoPtr->bands = NULL;
+
DestroyCursor (infoPtr->hcurArrow);
DestroyCursor (infoPtr->hcurHorz);
DestroyCursor (infoPtr->hcurVert);
DestroyCursor (infoPtr->hcurDrag);
- if(infoPtr->hDefaultFont) DeleteObject (infoPtr->hDefaultFont);
+ if (infoPtr->hDefaultFont) DeleteObject (infoPtr->hDefaultFont);
SetWindowLongPtrW (infoPtr->hwndSelf, 0, 0);
CloseThemeData (GetWindowTheme (infoPtr->hwndSelf));
@@ -2918,12 +2880,12 @@ REBAR_Destroy (REBAR_INFO *infoPtr)
static LRESULT
-REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_EraseBkGnd (const REBAR_INFO *infoPtr, HDC hdc)
{
RECT cliprect;
- if (GetClipBox ( (HDC)wParam, &cliprect))
- return REBAR_InternalEraseBkGnd (infoPtr, wParam, &cliprect);
+ if (GetClipBox ( hdc, &cliprect))
+ return REBAR_InternalEraseBkGnd (infoPtr, hdc, &cliprect);
return 0;
}
@@ -2935,14 +2897,14 @@ REBAR_GetFont (const REBAR_INFO *infoPtr)
}
static LRESULT
-REBAR_PushChevron(const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+REBAR_PushChevron(const REBAR_INFO *infoPtr, UINT uBand, LPARAM lParam)
{
- if ((UINT)wParam < infoPtr->uNumBands)
+ if (uBand < infoPtr->uNumBands)
{
NMREBARCHEVRON nmrbc;
- REBAR_BAND *lpBand = &infoPtr->bands[wParam];
+ REBAR_BAND *lpBand = REBAR_GetBand(infoPtr, uBand);
- TRACE("Pressed chevron on band %ld\n", wParam);
+ TRACE("Pressed chevron on band %u\n", uBand);
/* redraw chevron in pushed state */
lpBand->fDraw |= DRAW_CHEVRONPUSHED;
@@ -2950,7 +2912,7 @@ REBAR_PushChevron(const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW);
/* notify app so it can display a popup menu or whatever */
- nmrbc.uBand = wParam;
+ nmrbc.uBand = uBand;
nmrbc.wID = lpBand->wID;
nmrbc.lParam = lpBand->lParam;
nmrbc.rc = lpBand->rcChevron;
@@ -2969,7 +2931,6 @@ REBAR_PushChevron(const REBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
REBAR_LButtonDown (REBAR_INFO *infoPtr, LPARAM lParam)
{
- REBAR_BAND *lpBand;
UINT htFlags;
INT iHitBand;
POINT ptMouseDown;
@@ -2977,7 +2938,6 @@ REBAR_LButtonDown (REBAR_INFO *infoPtr, LPARAM lParam)
ptMouseDown.y = (short)HIWORD(lParam);
REBAR_InternalHitTest(infoPtr, &ptMouseDown, &htFlags, &iHitBand);
- lpBand = &infoPtr->bands[iHitBand];
if (htFlags == RBHT_CHEVRON)
{
@@ -2985,8 +2945,12 @@ REBAR_LButtonDown (REBAR_INFO *infoPtr, LPARAM lParam)
}
else if (htFlags == RBHT_GRABBER || htFlags == RBHT_CAPTION)
{
+ REBAR_BAND *lpBand;
+
TRACE("Starting drag\n");
+ lpBand = REBAR_GetBand(infoPtr, iHitBand);
+
SetCapture (infoPtr->hwndSelf);
infoPtr->iGrabbedBand = iHitBand;
@@ -3036,7 +3000,7 @@ REBAR_MouseLeave (REBAR_INFO *infoPtr)
{
if (infoPtr->ichevronhotBand >= 0)
{
- REBAR_BAND *lpChevronBand = &infoPtr->bands[infoPtr->ichevronhotBand];
+ REBAR_BAND *lpChevronBand = REBAR_GetBand(infoPtr, infoPtr->ichevronhotBand);
if (lpChevronBand->fDraw & DRAW_CHEVRONHOT)
{
lpChevronBand->fDraw &= ~DRAW_CHEVRONHOT;
@@ -3061,14 +3025,15 @@ REBAR_MouseMove (REBAR_INFO *infoPtr, LPARAM lParam)
/* if we are currently dragging a band */
if (infoPtr->iGrabbedBand >= 0)
{
- REBAR_BAND *band1, *band2;
+ REBAR_BAND *band1 = NULL, *band2;
int yPtMove = (infoPtr->dwStyle & CCS_VERT ? ptMove.x : ptMove.y);
if (GetCapture() != infoPtr->hwndSelf)
ERR("We are dragging but haven't got capture?!?\n");
- band1 = &infoPtr->bands[infoPtr->iGrabbedBand-1];
- band2 = &infoPtr->bands[infoPtr->iGrabbedBand];
+ if (infoPtr->iGrabbedBand > 0)
+ band1 = REBAR_GetBand(infoPtr, infoPtr->iGrabbedBand - 1);
+ band2 = REBAR_GetBand(infoPtr, infoPtr->iGrabbedBand);
/* if mouse did not move much, exit */
if ((abs(ptMove.x - infoPtr->dragNow.x) <= mindragx) &&
@@ -3094,7 +3059,7 @@ REBAR_MouseMove (REBAR_INFO *infoPtr, LPARAM lParam)
if (infoPtr->iOldBand >= 0 && infoPtr->iOldBand == infoPtr->ichevronhotBand)
{
- lpChevronBand = &infoPtr->bands[infoPtr->ichevronhotBand];
+ lpChevronBand = REBAR_GetBand(infoPtr, infoPtr->ichevronhotBand);
if (lpChevronBand->fDraw & DRAW_CHEVRONHOT)
{
lpChevronBand->fDraw &= ~DRAW_CHEVRONHOT;
@@ -3124,7 +3089,7 @@ REBAR_MouseMove (REBAR_INFO *infoPtr, LPARAM lParam)
_TrackMouseEvent(&trackinfo);
}
- lpChevronBand = &infoPtr->bands[iHitBand];
+ lpChevronBand = REBAR_GetBand(infoPtr, iHitBand);
if (!(lpChevronBand->fDraw & DRAW_CHEVRONHOT))
{
lpChevronBand->fDraw |= DRAW_CHEVRONHOT;
@@ -3140,10 +3105,9 @@ REBAR_MouseMove (REBAR_INFO *infoPtr, LPARAM lParam)
static inline LRESULT
-REBAR_NCCalcSize (const REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_NCCalcSize (const REBAR_INFO *infoPtr, RECT *rect)
{
HTHEME theme;
- RECT *rect = (RECT *)lParam;
if (infoPtr->dwStyle & WS_BORDER) {
rect->left = min(rect->left + GetSystemMetrics(SM_CXEDGE), rect->right);
@@ -3162,15 +3126,14 @@ REBAR_NCCalcSize (const REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_NCCreate (HWND hwnd, LPARAM lParam)
+REBAR_NCCreate (HWND hwnd, LPCREATESTRUCTW cs)
{
- LPCREATESTRUCTW cs = (LPCREATESTRUCTW) lParam;
REBAR_INFO *infoPtr = REBAR_GetInfoPtr (hwnd);
RECT wnrc1, clrc1;
NONCLIENTMETRICSW ncm;
HFONT tfont;
- if (infoPtr != NULL) {
+ if (infoPtr) {
ERR("Strange info structure pointer *not* NULL\n");
return FALSE;
}
@@ -3203,6 +3166,7 @@ REBAR_NCCreate (HWND hwnd, LPARAM lParam)
infoPtr->hcurDrag = LoadCursorW (0, (LPWSTR)IDC_SIZE);
infoPtr->fStatus = 0;
infoPtr->hFont = GetStockObject (SYSTEM_FONT);
+ infoPtr->bands = DPA_Create(8);
/* issue WM_NOTIFYFORMAT to get unicode status of parent */
REBAR_NotifyFormat(infoPtr, NF_REQUERY);
@@ -3327,11 +3291,11 @@ REBAR_NCPaint (const REBAR_INFO *infoPtr)
static LRESULT
-REBAR_NotifyFormat (REBAR_INFO *infoPtr, LPARAM lParam)
+REBAR_NotifyFormat (REBAR_INFO *infoPtr, LPARAM cmd)
{
INT i;
- if (lParam == NF_REQUERY) {
+ if (cmd == NF_REQUERY) {
i = SendMessageW(REBAR_GetNotifyParent (infoPtr),
WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwndSelf, NF_QUERY);
if ((i != NFR_ANSI) && (i != NFR_UNICODE)) {
@@ -3346,10 +3310,8 @@ REBAR_NotifyFormat (REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_Paint (const REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_Paint (const REBAR_INFO *infoPtr, HDC hdc)
{
- HDC hdc = (HDC)wParam;
-
if (hdc) {
TRACE("painting\n");
REBAR_Refresh (infoPtr, hdc);
@@ -3359,7 +3321,7 @@ REBAR_Paint (const REBAR_INFO *infoPtr, WPARAM wParam)
TRACE("painting (%s)\n", wine_dbgstr_rect(&ps.rcPaint));
if (ps.fErase) {
/* Erase area of paint if requested */
- REBAR_InternalEraseBkGnd (infoPtr, wParam, &ps.rcPaint);
+ REBAR_InternalEraseBkGnd (infoPtr, hdc, &ps.rcPaint);
}
REBAR_Refresh (infoPtr, hdc);
EndPaint (infoPtr->hwndSelf, &ps);
@@ -3397,16 +3359,16 @@ REBAR_SetCursor (const REBAR_INFO *infoPtr, LPARAM lParam)
static LRESULT
-REBAR_SetFont (REBAR_INFO *infoPtr, WPARAM wParam)
+REBAR_SetFont (REBAR_INFO *infoPtr, HFONT font)
{
REBAR_BAND *lpBand;
UINT i;
- infoPtr->hFont = (HFONT)wParam;
+ infoPtr->hFont = font;
/* revalidate all bands to change sizes of text in headers of bands */
for (i=0; iuNumBands; i++) {
- lpBand = &infoPtr->bands[i];
+ lpBand = REBAR_GetBand(infoPtr, i);
REBAR_ValidateBand (infoPtr, lpBand);
}
@@ -3415,26 +3377,25 @@ REBAR_SetFont (REBAR_INFO *infoPtr, WPARAM wParam)
}
+/*****************************************************
+ *
+ * Handles the WM_SETREDRAW message.
+ *
+ * Documentation:
+ * According to testing V4.71 of COMCTL32 returns the
+ * *previous* status of the redraw flag (either 0 or -1)
+ * instead of the MSDN documented value of 0 if handled
+ *
+ *****************************************************/
static inline LRESULT
-REBAR_SetRedraw (REBAR_INFO *infoPtr, WPARAM wParam)
- /*****************************************************
- *
- * Function;
- * Handles the WM_SETREDRAW message.
- *
- * Documentation:
- * According to testing V4.71 of COMCTL32 returns the
- * *previous* status of the redraw flag (either 0 or -1)
- * instead of the MSDN documented value of 0 if handled
- *
- *****************************************************/
+REBAR_SetRedraw (REBAR_INFO *infoPtr, BOOL redraw)
{
BOOL oldredraw = infoPtr->DoRedraw;
TRACE("set to %s, fStatus=%08x\n",
- (wParam) ? "TRUE" : "FALSE", infoPtr->fStatus);
- infoPtr->DoRedraw = (BOOL) wParam;
- if (wParam) {
+ (redraw) ? "TRUE" : "FALSE", infoPtr->fStatus);
+ infoPtr->DoRedraw = redraw;
+ if (redraw) {
if (infoPtr->fStatus & BAND_NEEDS_REDRAW) {
REBAR_MoveChildWindows (infoPtr, 0, infoPtr->uNumBands);
REBAR_ForceResize (infoPtr);
@@ -3532,23 +3493,21 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case RB_ENDDRAG: */
case RB_GETBANDBORDERS:
- return REBAR_GetBandBorders (infoPtr, wParam, lParam);
+ return REBAR_GetBandBorders (infoPtr, wParam, (LPRECT)lParam);
case RB_GETBANDCOUNT:
return REBAR_GetBandCount (infoPtr);
case RB_GETBANDINFO_OLD:
case RB_GETBANDINFOA:
- return REBAR_GetBandInfoT(infoPtr, wParam, lParam, FALSE);
-
case RB_GETBANDINFOW:
- return REBAR_GetBandInfoT(infoPtr, wParam, lParam, TRUE);
-
+ return REBAR_GetBandInfoT(infoPtr, wParam, (LPREBARBANDINFOW)lParam,
+ uMsg == RB_GETBANDINFOW);
case RB_GETBARHEIGHT:
return REBAR_GetBarHeight (infoPtr);
case RB_GETBARINFO:
- return REBAR_GetBarInfo (infoPtr, lParam);
+ return REBAR_GetBarInfo (infoPtr, (LPREBARINFO)lParam);
case RB_GETBKCOLOR:
return REBAR_GetBkColor (infoPtr);
@@ -3557,10 +3516,10 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case RB_GETDROPTARGET: */
case RB_GETPALETTE:
- return REBAR_GetPalette (infoPtr, wParam, lParam);
+ return REBAR_GetPalette (infoPtr);
case RB_GETRECT:
- return REBAR_GetRect (infoPtr, wParam, lParam);
+ return REBAR_GetRect (infoPtr, wParam, (LPRECT)lParam);
case RB_GETROWCOUNT:
return REBAR_GetRowCount (infoPtr);
@@ -3581,17 +3540,15 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return REBAR_GetVersion (infoPtr);
case RB_HITTEST:
- return REBAR_HitTest (infoPtr, lParam);
+ return REBAR_HitTest (infoPtr, (LPRBHITTESTINFO)lParam);
case RB_IDTOINDEX:
return REBAR_IdToIndex (infoPtr, wParam);
case RB_INSERTBANDA:
- return REBAR_InsertBandT(infoPtr, wParam, lParam, FALSE);
-
case RB_INSERTBANDW:
- return REBAR_InsertBandT(infoPtr, wParam, lParam, TRUE);
-
+ return REBAR_InsertBandT(infoPtr, wParam, (LPREBARBANDINFOW)lParam,
+ uMsg == RB_INSERTBANDW);
case RB_MAXIMIZEBAND:
return REBAR_MaximizeBand (infoPtr, wParam, lParam);
@@ -3605,23 +3562,20 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return REBAR_PushChevron (infoPtr, wParam, lParam);
case RB_SETBANDINFOA:
- return REBAR_SetBandInfoT(infoPtr, wParam, lParam, FALSE);
-
case RB_SETBANDINFOW:
- return REBAR_SetBandInfoT(infoPtr, wParam, lParam, TRUE);
-
+ return REBAR_SetBandInfoT(infoPtr, wParam, (LPREBARBANDINFOW)lParam,
+ uMsg == RB_SETBANDINFOW);
case RB_SETBARINFO:
- return REBAR_SetBarInfo (infoPtr, lParam);
+ return REBAR_SetBarInfo (infoPtr, (LPREBARINFO)lParam);
case RB_SETBKCOLOR:
return REBAR_SetBkColor (infoPtr, lParam);
/* case RB_SETCOLORSCHEME: */
/* case RB_SETPALETTE: */
-/* return REBAR_GetPalette (infoPtr, wParam, lParam); */
case RB_SETPARENT:
- return REBAR_SetParent (infoPtr, wParam);
+ return REBAR_SetParent (infoPtr, (HWND)wParam);
case RB_SETTEXTCOLOR:
return REBAR_SetTextColor (infoPtr, lParam);
@@ -3638,7 +3592,7 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return REBAR_ShowBand (infoPtr, wParam, lParam);
case RB_SIZETORECT:
- return REBAR_SizeToRect (infoPtr, lParam);
+ return REBAR_SizeToRect (infoPtr, (LPCRECT)lParam);
/* Messages passed to parent */
@@ -3651,13 +3605,13 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* case WM_CHARTOITEM: supported according to ControlSpy */
case WM_CREATE:
- return REBAR_Create (infoPtr, lParam);
+ return REBAR_Create (infoPtr, (LPCREATESTRUCTW)lParam);
case WM_DESTROY:
return REBAR_Destroy (infoPtr);
case WM_ERASEBKGND:
- return REBAR_EraseBkGnd (infoPtr, wParam);
+ return REBAR_EraseBkGnd (infoPtr, (HDC)wParam);
case WM_GETFONT:
return REBAR_GetFont (infoPtr);
@@ -3679,10 +3633,10 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return REBAR_MouseLeave (infoPtr);
case WM_NCCALCSIZE:
- return REBAR_NCCalcSize (infoPtr, lParam);
+ return REBAR_NCCalcSize (infoPtr, (RECT*)lParam);
case WM_NCCREATE:
- return REBAR_NCCreate (hwnd, lParam);
+ return REBAR_NCCreate (hwnd, (LPCREATESTRUCTW)lParam);
case WM_NCHITTEST:
return REBAR_NCHitTest (infoPtr, lParam);
@@ -3695,7 +3649,7 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case WM_PRINTCLIENT:
case WM_PAINT:
- return REBAR_Paint (infoPtr, wParam);
+ return REBAR_Paint (infoPtr, (HDC)wParam);
/* case WM_PALETTECHANGED: supported according to ControlSpy */
/* case WM_QUERYNEWPALETTE:supported according to ControlSpy */
@@ -3706,7 +3660,7 @@ REBAR_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return REBAR_SetCursor (infoPtr, lParam);
case WM_SETFONT:
- return REBAR_SetFont (infoPtr, wParam);
+ return REBAR_SetFont (infoPtr, (HFONT)wParam);
case WM_SETREDRAW:
return REBAR_SetRedraw (infoPtr, wParam);
diff --git a/dll/win32/comctl32/rsrc.rc b/dll/win32/comctl32/rsrc.rc
index 1fac6d9ddc3..a338812e051 100644
--- a/dll/win32/comctl32/rsrc.rc
+++ b/dll/win32/comctl32/rsrc.rc
@@ -92,27 +92,29 @@ IDI_TT_ERROR_SM ICON LOADONCALL DISCARDABLE idi_tt_error_sm.ico
#include "comctl_Bg.rc"
#include "comctl_Cs.rc"
-#include "comctl_De.rc"
#include "comctl_El.rc"
-#include "comctl_En.rc"
#include "comctl_Eo.rc"
+#include "comctl_En.rc"
#include "comctl_Es.rc"
-#include "comctl_Fr.rc"
#include "comctl_Hu.rc"
#include "comctl_It.rc"
-#include "comctl_Ja.rc"
#include "comctl_Ko.rc"
-#include "comctl_Lt.rc"
#include "comctl_Nl.rc"
#include "comctl_No.rc"
#include "comctl_Pl.rc"
-#include "comctl_Pt.rc"
-#include "comctl_Ro.rc"
-#include "comctl_Ru.rc"
-#include "comctl_Si.rc"
#include "comctl_Sk.rc"
#include "comctl_Sv.rc"
#include "comctl_Th.rc"
#include "comctl_Tr.rc"
#include "comctl_Uk.rc"
+
+/* UTF-8 */
+#include "comctl_De.rc"
+#include "comctl_Fr.rc"
+#include "comctl_Ja.rc"
+#include "comctl_Lt.rc"
+#include "comctl_Pt.rc"
+#include "comctl_Ro.rc"
+#include "comctl_Ru.rc"
+#include "comctl_Si.rc"
#include "comctl_Zh.rc"
diff --git a/dll/win32/comctl32/status.c b/dll/win32/comctl32/status.c
index d6b627a9790..1b69ef2d053 100644
--- a/dll/win32/comctl32/status.c
+++ b/dll/win32/comctl32/status.c
@@ -233,7 +233,7 @@ STATUSBAR_DrawPart (const STATUS_INFO *infoPtr, HDC hdc, const STATUSWINDOWPART
dis.hDC = hdc;
dis.rcItem = r;
dis.itemData = (ULONG_PTR)part->text;
- SendMessageW (infoPtr->Notify, WM_DRAWITEM, (WPARAM)dis.CtlID, (LPARAM)&dis);
+ SendMessageW (infoPtr->Notify, WM_DRAWITEM, dis.CtlID, (LPARAM)&dis);
} else {
if (part->hIcon) {
INT cy = r.bottom - r.top;
@@ -728,7 +728,7 @@ STATUSBAR_SetParts (STATUS_INFO *infoPtr, INT count, LPINT parts)
static BOOL
STATUSBAR_SetTextT (STATUS_INFO *infoPtr, INT nPart, WORD style,
- LPCWSTR text, BOOL isW)
+ LPWSTR text, BOOL isW)
{
STATUSWINDOWPART *part=NULL;
BOOL changed = FALSE;
@@ -759,7 +759,7 @@ STATUSBAR_SetTextT (STATUS_INFO *infoPtr, INT nPart, WORD style,
if (style & SBT_OWNERDRAW) {
if (!(oldStyle & SBT_OWNERDRAW))
Free (part->text);
- part->text = (LPWSTR)text;
+ part->text = text;
} else {
LPWSTR ntext;
WCHAR *idx;
@@ -1162,7 +1162,7 @@ STATUSBAR_NotifyFormat (STATUS_INFO *infoPtr, HWND from, INT cmd)
static LRESULT
-STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, LPARAM lParam)
+STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, UINT msg, WPARAM wParam, LPARAM lParam)
{
NMMOUSE nm;
@@ -1175,7 +1175,12 @@ STATUSBAR_SendMouseNotify(const STATUS_INFO *infoPtr, UINT code, LPARAM lParam)
nm.dwItemSpec = STATUSBAR_InternalHitTest(infoPtr, &nm.pt);
nm.dwItemData = 0;
nm.dwHitInfo = 0x30000; /* seems constant */
- SendMessageW(infoPtr->Notify, WM_NOTIFY, 0, (LPARAM)&nm);
+
+ /* Do default processing if WM_NOTIFY returns zero */
+ if(!SendMessageW(infoPtr->Notify, WM_NOTIFY, nm.hdr.idFrom, (LPARAM)&nm))
+ {
+ return DefWindowProcW(infoPtr->Self, msg, wParam, lParam);
+ }
return 0;
}
@@ -1243,10 +1248,10 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return STATUSBAR_SetParts (infoPtr, (INT)wParam, (LPINT)lParam);
case SB_SETTEXTA:
- return STATUSBAR_SetTextT (infoPtr, nPart, wParam & 0xff00, (LPCWSTR)lParam, FALSE);
+ return STATUSBAR_SetTextT (infoPtr, nPart, wParam & 0xff00, (LPWSTR)lParam, FALSE);
case SB_SETTEXTW:
- return STATUSBAR_SetTextT (infoPtr, nPart, wParam & 0xff00, (LPCWSTR)lParam, TRUE);
+ return STATUSBAR_SetTextT (infoPtr, nPart, wParam & 0xff00, (LPWSTR)lParam, TRUE);
case SB_SETTIPTEXTA:
return STATUSBAR_SetTipTextA (infoPtr, (INT)wParam, (LPSTR)lParam);
@@ -1276,10 +1281,10 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return STATUSBAR_GetTextLength (infoPtr, 0);
case WM_LBUTTONDBLCLK:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_DBLCLK, msg, wParam, lParam);
case WM_LBUTTONUP:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_CLICK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_CLICK, msg, wParam, lParam);
case WM_MOUSEMOVE:
return STATUSBAR_Relay2Tip (infoPtr, msg, wParam, lParam);
@@ -1303,10 +1308,10 @@ StatusWindowProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
return STATUSBAR_WMPaint (infoPtr, (HDC)wParam);
case WM_RBUTTONDBLCLK:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_RDBLCLK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_RDBLCLK, msg, wParam, lParam);
case WM_RBUTTONUP:
- return STATUSBAR_SendMouseNotify(infoPtr, NM_RCLICK, lParam);
+ return STATUSBAR_SendMouseNotify(infoPtr, NM_RCLICK, msg, wParam, lParam);
case WM_SETFONT:
return STATUSBAR_WMSetFont (infoPtr, (HFONT)wParam, LOWORD(lParam));
diff --git a/dll/win32/comctl32/string.c b/dll/win32/comctl32/string.c
index f6dbd8c5589..7fead7ccc81 100644
--- a/dll/win32/comctl32/string.c
+++ b/dll/win32/comctl32/string.c
@@ -235,7 +235,7 @@ INT WINAPI Str_GetPtrW (LPCWSTR lpSrc, LPWSTR lpDest, INT nMaxLen)
*/
BOOL WINAPI Str_SetPtrW (LPWSTR *lppDest, LPCWSTR lpSrc)
{
- TRACE("(%p %p)\n", lppDest, lpSrc);
+ TRACE("(%p %s)\n", lppDest, debugstr_w(lpSrc));
if (lpSrc) {
INT len = strlenW (lpSrc) + 1;
diff --git a/dll/win32/comctl32/syslink.c b/dll/win32/comctl32/syslink.c
index f36177913c6..9340fc613b1 100644
--- a/dll/win32/comctl32/syslink.c
+++ b/dll/win32/comctl32/syslink.c
@@ -39,7 +39,7 @@
#include "wine/unicode.h"
#include "wine/debug.h"
-WINE_DEFAULT_DEBUG_CHANNEL(progress);
+WINE_DEFAULT_DEBUG_CHANNEL(syslink);
INT WINAPI StrCmpNIW(LPCWSTR,LPCWSTR,INT);
@@ -94,7 +94,9 @@ typedef struct
COLORREF TextColor; /* Color of the text */
COLORREF LinkColor; /* Color of links */
COLORREF VisitedColor; /* Color of visited links */
+ COLORREF BackColor; /* Background color, set on creation */
WCHAR BreakChar; /* Break Character for the current font */
+ BOOL IgnoreReturn; /* (infoPtr->Style & LWS_IGNORERETURN) on creation */
} SYSLINK_INFO;
static const WCHAR SL_LINKOPEN[] = { '<','a', 0 };
@@ -196,6 +198,8 @@ static UINT SYSLINK_ParseText (SYSLINK_INFO *infoPtr, LPCWSTR Text)
LPCWSTR lpID, lpUrl;
UINT lenId, lenUrl;
+ TRACE("(%p %s)\n", infoPtr, debugstr_w(Text));
+
for(current = Text; *current != 0;)
{
if(*current == '<')
@@ -831,7 +835,7 @@ static LRESULT SYSLINK_Draw (const SYSLINK_INFO *infoPtr, HDC hdc)
hOldFont = SelectObject(hdc, infoPtr->Font);
OldTextColor = SetTextColor(hdc, infoPtr->TextColor);
- OldBkColor = SetBkColor(hdc, comctl32_color.clrBtnFace);
+ OldBkColor = SetBkColor(hdc, infoPtr->BackColor);
GetClientRect(infoPtr->Self, &rc);
rc.right -= SL_RIGHTMARGIN + SL_LEFTMARGIN;
@@ -906,6 +910,22 @@ static LRESULT SYSLINK_Paint (const SYSLINK_INFO *infoPtr, HDC hdcParam)
return 0;
}
+/***********************************************************************
+ * SYSLINK_EraseBkgnd
+ * Handles the WM_ERASEBKGND message.
+ */
+static LRESULT SYSLINK_EraseBkgnd (const SYSLINK_INFO *infoPtr, HDC hdc)
+{
+ HBRUSH hbr;
+ RECT r;
+
+ GetClientRect(infoPtr->Self, &r);
+ hbr = CreateSolidBrush(infoPtr->BackColor);
+ FillRect(hdc, &r, hbr);
+ DeleteObject(hbr);
+
+ return 1;
+}
/***********************************************************************
* SYSLINK_SetFont
@@ -1434,13 +1454,13 @@ static LRESULT SYSLINK_LButtonUp (SYSLINK_INFO *infoPtr, const POINT *pt)
*/
static BOOL SYSLINK_OnEnter (const SYSLINK_INFO *infoPtr)
{
- if(infoPtr->HasFocus)
+ if(infoPtr->HasFocus && !infoPtr->IgnoreReturn)
{
PDOC_ITEM Focus;
int id;
Focus = SYSLINK_GetFocusLink(infoPtr, &id);
- if(Focus != NULL)
+ if(Focus)
{
SYSLINK_SendParentNotify(infoPtr, NM_RETURN, Focus, id);
return TRUE;
@@ -1551,6 +1571,9 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
case WM_PAINT:
return SYSLINK_Paint (infoPtr, (HDC)wParam);
+ case WM_ERASEBKGND:
+ return SYSLINK_EraseBkgnd(infoPtr, (HDC)wParam);
+
case WM_SETCURSOR:
{
LHITTESTINFO ht;
@@ -1730,7 +1753,10 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
infoPtr->TextColor = comctl32_color.clrWindowText;
infoPtr->LinkColor = comctl32_color.clrHighlight;
infoPtr->VisitedColor = comctl32_color.clrHighlight;
+ infoPtr->BackColor = infoPtr->Style & LWS_TRANSPARENT ?
+ comctl32_color.clrWindow : comctl32_color.clrBtnFace;
infoPtr->BreakChar = ' ';
+ infoPtr->IgnoreReturn = infoPtr->Style & LWS_IGNORERETURN;
TRACE("SysLink Ctrl creation, hwnd=%p\n", hwnd);
SYSLINK_SetText(infoPtr, ((LPCREATESTRUCTW)lParam)->lpszName);
return 0;
@@ -1746,6 +1772,8 @@ static LRESULT WINAPI SysLinkWindowProc(HWND hwnd, UINT message,
case WM_SYSCOLORCHANGE:
COMCTL32_RefreshSysColors();
+ if (infoPtr->Style & LWS_TRANSPARENT)
+ infoPtr->BackColor = comctl32_color.clrWindow;
return 0;
default:
diff --git a/dll/win32/comctl32/tab.c b/dll/win32/comctl32/tab.c
index 94da29e37b7..c99153eea31 100644
--- a/dll/win32/comctl32/tab.c
+++ b/dll/win32/comctl32/tab.c
@@ -46,7 +46,6 @@
* NM_RELEASEDCAPTURE
* TCN_FOCUSCHANGE
* TCN_GETOBJECT
- * TCN_KEYDOWN
*
* Macros:
* TabCtrl_AdjustRect
@@ -120,6 +119,7 @@ typedef struct
DWORD exStyle; /* Extended style used, currently:
TCS_EX_FLATSEPARATORS, TCS_EX_REGISTERDROP */
+ DWORD dwStyle; /* the cached window GWL_STYLE */
} TAB_INFO;
/******************************************************************************
@@ -160,6 +160,7 @@ static void TAB_InvalidateTabArea(const TAB_INFO *);
static void TAB_EnsureSelectionVisible(TAB_INFO *);
static void TAB_DrawItemInterior(const TAB_INFO *, HDC, INT, RECT*);
static LRESULT TAB_DeselectAll(TAB_INFO *, BOOL);
+static BOOL TAB_InternalGetItemRect(const TAB_INFO *, INT, RECT*, RECT*);
static BOOL
TAB_SendSimpleNotify (const TAB_INFO *infoPtr, UINT code)
@@ -220,6 +221,7 @@ TAB_DumpItemInternal(const TAB_INFO *infoPtr, UINT iItem)
* the index of the selected tab, or -1 if no tab is selected. */
static inline LRESULT TAB_GetCurSel (const TAB_INFO *infoPtr)
{
+ TRACE("(%p)\n", infoPtr);
return infoPtr->iSelected;
}
@@ -228,12 +230,13 @@ static inline LRESULT TAB_GetCurSel (const TAB_INFO *infoPtr)
static inline LRESULT
TAB_GetCurFocus (const TAB_INFO *infoPtr)
{
+ TRACE("(%p)\n", infoPtr);
return infoPtr->uFocus;
}
static inline LRESULT TAB_GetToolTips (const TAB_INFO *infoPtr)
{
- if (infoPtr == NULL) return 0;
+ TRACE("(%p)\n", infoPtr);
return (LRESULT)infoPtr->hwndToolTip;
}
@@ -241,17 +244,20 @@ static inline LRESULT TAB_SetCurSel (TAB_INFO *infoPtr, INT iItem)
{
INT prevItem = infoPtr->iSelected;
+ TRACE("(%p %d)\n", infoPtr, iItem);
+
if (iItem < 0)
- infoPtr->iSelected=-1;
+ infoPtr->iSelected = -1;
else if (iItem >= infoPtr->uNumItem)
return -1;
else {
- if (infoPtr->iSelected != iItem) {
- TAB_GetItem(infoPtr, prevItem)->dwState &= ~TCIS_BUTTONPRESSED;
+ if (prevItem != iItem) {
+ if (prevItem != -1)
+ TAB_GetItem(infoPtr, prevItem)->dwState &= ~TCIS_BUTTONPRESSED;
TAB_GetItem(infoPtr, iItem)->dwState |= TCIS_BUTTONPRESSED;
- infoPtr->iSelected=iItem;
- infoPtr->uFocus=iItem;
+ infoPtr->iSelected = iItem;
+ infoPtr->uFocus = iItem;
TAB_EnsureSelectionVisible(infoPtr);
TAB_InvalidateTabArea(infoPtr);
}
@@ -261,13 +267,37 @@ static inline LRESULT TAB_SetCurSel (TAB_INFO *infoPtr, INT iItem)
static LRESULT TAB_SetCurFocus (TAB_INFO *infoPtr, INT iItem)
{
- if (iItem < 0)
+ TRACE("(%p %d)\n", infoPtr, iItem);
+
+ if (iItem < 0) {
infoPtr->uFocus = -1;
+ if (infoPtr->iSelected != -1) {
+ infoPtr->iSelected = -1;
+ TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGE);
+ TAB_InvalidateTabArea(infoPtr);
+ }
+ }
else if (iItem < infoPtr->uNumItem) {
- if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_BUTTONS) {
- FIXME("Should set input focus\n");
+ if (infoPtr->dwStyle & TCS_BUTTONS) {
+ /* set focus to new item, leave selection as is */
+ if (infoPtr->uFocus != iItem) {
+ INT prev_focus = infoPtr->uFocus;
+ RECT r;
+
+ infoPtr->uFocus = iItem;
+
+ if (prev_focus != infoPtr->iSelected) {
+ if (TAB_InternalGetItemRect(infoPtr, prev_focus, &r, NULL))
+ InvalidateRect(infoPtr->hwnd, &r, FALSE);
+ }
+
+ if (TAB_InternalGetItemRect(infoPtr, iItem, &r, NULL))
+ InvalidateRect(infoPtr->hwnd, &r, FALSE);
+
+ TAB_SendSimpleNotify(infoPtr, TCN_FOCUSCHANGE);
+ }
} else {
- int oldFocus = infoPtr->uFocus;
+ INT oldFocus = infoPtr->uFocus;
if (infoPtr->iSelected != iItem || oldFocus == -1 ) {
infoPtr->uFocus = iItem;
if (oldFocus != -1) {
@@ -289,19 +319,18 @@ static LRESULT TAB_SetCurFocus (TAB_INFO *infoPtr, INT iItem)
static inline LRESULT
TAB_SetToolTips (TAB_INFO *infoPtr, HWND hwndToolTip)
{
- if (infoPtr)
- infoPtr->hwndToolTip = hwndToolTip;
+ TRACE("%p %p\n", infoPtr, hwndToolTip);
+ infoPtr->hwndToolTip = hwndToolTip;
return 0;
}
static inline LRESULT
TAB_SetPadding (TAB_INFO *infoPtr, LPARAM lParam)
{
- if (infoPtr)
- {
- infoPtr->uHItemPadding_s=LOWORD(lParam);
- infoPtr->uVItemPadding_s=HIWORD(lParam);
- }
+ TRACE("(%p %d %d)\n", infoPtr, LOWORD(lParam), HIWORD(lParam));
+ infoPtr->uHItemPadding_s = LOWORD(lParam);
+ infoPtr->uVItemPadding_s = HIWORD(lParam);
+
return 0;
}
@@ -321,12 +350,12 @@ static BOOL TAB_InternalGetItemRect(
RECT* selectedRect)
{
RECT tmpItemRect,clientRect;
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
/* Perform a sanity check and a trivial visibility check. */
if ( (infoPtr->uNumItem <= 0) ||
(itemIndex >= infoPtr->uNumItem) ||
- (!((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) && (itemIndex < infoPtr->leftmostVisible)) )
+ (!(((infoPtr->dwStyle & TCS_MULTILINE) || (infoPtr->dwStyle & TCS_VERTICAL))) &&
+ (itemIndex < infoPtr->leftmostVisible)))
{
TRACE("Not Visible\n");
/* need to initialize these to empty rects */
@@ -353,28 +382,28 @@ static BOOL TAB_InternalGetItemRect(
/* calculate the times bottom and top based on the row */
GetClientRect(infoPtr->hwnd, &clientRect);
- if ((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL))
+ if ((infoPtr->dwStyle & TCS_BOTTOM) && (infoPtr->dwStyle & TCS_VERTICAL))
{
itemRect->right = clientRect.right - SELECTED_TAB_OFFSET - itemRect->left * infoPtr->tabHeight -
- ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGX : 0);
+ ((infoPtr->dwStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGX : 0);
itemRect->left = itemRect->right - infoPtr->tabHeight;
}
- else if (lStyle & TCS_VERTICAL)
+ else if (infoPtr->dwStyle & TCS_VERTICAL)
{
itemRect->left = clientRect.left + SELECTED_TAB_OFFSET + itemRect->left * infoPtr->tabHeight +
- ((lStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGX : 0);
+ ((infoPtr->dwStyle & TCS_BUTTONS) ? itemRect->left * BUTTON_SPACINGX : 0);
itemRect->right = itemRect->left + infoPtr->tabHeight;
}
- else if (lStyle & TCS_BOTTOM)
+ else if (infoPtr->dwStyle & TCS_BOTTOM)
{
itemRect->bottom = clientRect.bottom - itemRect->top * infoPtr->tabHeight -
- ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET);
+ ((infoPtr->dwStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET);
itemRect->top = itemRect->bottom - infoPtr->tabHeight;
}
else /* not TCS_BOTTOM and not TCS_VERTICAL */
{
itemRect->top = clientRect.top + itemRect->top * infoPtr->tabHeight +
- ((lStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET);
+ ((infoPtr->dwStyle & TCS_BUTTONS) ? itemRect->top * BUTTON_SPACINGY : SELECTED_TAB_OFFSET);
itemRect->bottom = itemRect->top + infoPtr->tabHeight;
}
@@ -382,7 +411,7 @@ static BOOL TAB_InternalGetItemRect(
* "scroll" it to make sure the item at the very left of the
* tab control is the leftmost visible tab.
*/
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
OffsetRect(itemRect,
0,
@@ -419,23 +448,23 @@ static BOOL TAB_InternalGetItemRect(
CopyRect(selectedRect, itemRect);
/* The rectangle of a selected item is a bit wider. */
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
InflateRect(selectedRect, 0, SELECTED_TAB_OFFSET);
else
InflateRect(selectedRect, SELECTED_TAB_OFFSET, 0);
/* If it also a bit higher. */
- if ((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL))
+ if ((infoPtr->dwStyle & TCS_BOTTOM) && (infoPtr->dwStyle & TCS_VERTICAL))
{
selectedRect->left -= 2; /* the border is thicker on the right */
selectedRect->right += SELECTED_TAB_OFFSET;
}
- else if (lStyle & TCS_VERTICAL)
+ else if (infoPtr->dwStyle & TCS_VERTICAL)
{
selectedRect->left -= SELECTED_TAB_OFFSET;
selectedRect->right += 1;
}
- else if (lStyle & TCS_BOTTOM)
+ else if (infoPtr->dwStyle & TCS_BOTTOM)
{
selectedRect->bottom += SELECTED_TAB_OFFSET;
}
@@ -447,26 +476,36 @@ static BOOL TAB_InternalGetItemRect(
}
/* Check for visibility */
- if (lStyle & TCS_VERTICAL)
+ if (infoPtr->dwStyle & TCS_VERTICAL)
return (itemRect->top < clientRect.bottom) && (itemRect->bottom > clientRect.top);
else
return (itemRect->left < clientRect.right) && (itemRect->right > clientRect.left);
}
static inline BOOL
-TAB_GetItemRect(const TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
+TAB_GetItemRect(const TAB_INFO *infoPtr, INT item, RECT *rect)
{
- return TAB_InternalGetItemRect(infoPtr, wParam, (LPRECT)lParam, NULL);
+ TRACE("(%p, %d, %p)\n", infoPtr, item, rect);
+ return TAB_InternalGetItemRect(infoPtr, item, rect, NULL);
}
/******************************************************************************
- * TAB_KeyUp
+ * TAB_KeyDown
*
* This method is called to handle keyboard input
*/
-static LRESULT TAB_KeyUp(TAB_INFO* infoPtr, WPARAM keyCode)
+static LRESULT TAB_KeyDown(TAB_INFO* infoPtr, WPARAM keyCode, LPARAM lParam)
{
- int newItem = -1;
+ INT newItem = -1;
+ NMTCKEYDOWN nm;
+
+ /* TCN_KEYDOWN notification sent always */
+ nm.hdr.hwndFrom = infoPtr->hwnd;
+ nm.hdr.idFrom = GetWindowLongPtrW(infoPtr->hwnd, GWLP_ID);
+ nm.hdr.code = TCN_KEYDOWN;
+ nm.wVKey = keyCode;
+ nm.flags = lParam;
+ SendMessageW(infoPtr->hwndNotify, WM_NOTIFY, nm.hdr.idFrom, (LPARAM)&nm);
switch (keyCode)
{
@@ -478,23 +517,30 @@ static LRESULT TAB_KeyUp(TAB_INFO* infoPtr, WPARAM keyCode)
break;
}
- /*
- * If we changed to a valid item, change the selection
- */
- if (newItem >= 0 &&
- newItem < infoPtr->uNumItem &&
- infoPtr->uFocus != newItem)
- {
- if (!TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGING))
- {
- TAB_SetCurSel(infoPtr, newItem);
- TAB_SendSimpleNotify(infoPtr, TCN_SELCHANGE);
- }
- }
+ /* If we changed to a valid item, change focused item */
+ if (newItem >= 0 && newItem < infoPtr->uNumItem && infoPtr->uFocus != newItem)
+ TAB_SetCurFocus(infoPtr, newItem);
return 0;
}
+/*
+ * WM_KILLFOCUS handler
+ */
+static void TAB_KillFocus(TAB_INFO *infoPtr)
+{
+ /* clear current focused item back to selected for TCS_BUTTONS */
+ if ((infoPtr->dwStyle & TCS_BUTTONS) && (infoPtr->uFocus != infoPtr->iSelected))
+ {
+ RECT r;
+
+ if (TAB_InternalGetItemRect(infoPtr, infoPtr->uFocus, &r, NULL))
+ InvalidateRect(infoPtr->hwnd, &r, FALSE);
+
+ infoPtr->uFocus = infoPtr->iSelected;
+ }
+}
+
/******************************************************************************
* TAB_FocusChanging
*
@@ -548,6 +594,7 @@ static INT TAB_InternalHitTest (const TAB_INFO *infoPtr, POINT pt, UINT *flags)
static inline LRESULT
TAB_HitTest (const TAB_INFO *infoPtr, LPTCHITTESTINFO lptest)
{
+ TRACE("(%p, %p)\n", infoPtr, lptest);
return TAB_InternalHitTest (infoPtr, lptest->pt, &lptest->flags);
}
@@ -585,13 +632,12 @@ TAB_LButtonDown (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
POINT pt;
INT newItem;
UINT dummy;
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
if (infoPtr->hwndToolTip)
TAB_RelayEvent (infoPtr->hwndToolTip, infoPtr->hwnd,
WM_LBUTTONDOWN, wParam, lParam);
- if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_FOCUSONBUTTONDOWN ) {
+ if (!(infoPtr->dwStyle & TCS_FOCUSNEVER)) {
SetFocus (infoPtr->hwnd);
}
@@ -608,7 +654,7 @@ TAB_LButtonDown (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
if ((newItem != -1) && (infoPtr->iSelected != newItem))
{
- if ((lStyle & TCS_BUTTONS) && (lStyle & TCS_MULTISELECT) &&
+ if ((infoPtr->dwStyle & TCS_BUTTONS) && (infoPtr->dwStyle & TCS_MULTISELECT) &&
(wParam & MK_CONTROL))
{
RECT r;
@@ -782,8 +828,7 @@ TAB_RecalcHotTrack
if (out_redrawEnter != NULL)
*out_redrawEnter = -1;
- if ((GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_HOTTRACK)
- || GetWindowTheme (infoPtr->hwnd))
+ if ((infoPtr->dwStyle & TCS_HOTTRACK) || GetWindowTheme(infoPtr->hwnd))
{
POINT pt;
UINT flags;
@@ -875,7 +920,6 @@ TAB_MouseMove (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
*/
static LRESULT TAB_AdjustRect(const TAB_INFO *infoPtr, WPARAM fLarger, LPRECT prc)
{
- DWORD lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
LONG *iRightBottom, *iLeftTop;
TRACE ("hwnd=%p fLarger=%ld (%s)\n", infoPtr->hwnd, fLarger,
@@ -883,7 +927,7 @@ static LRESULT TAB_AdjustRect(const TAB_INFO *infoPtr, WPARAM fLarger, LPRECT pr
if (!prc) return -1;
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
iRightBottom = &(prc->right);
iLeftTop = &(prc->left);
@@ -897,11 +941,11 @@ static LRESULT TAB_AdjustRect(const TAB_INFO *infoPtr, WPARAM fLarger, LPRECT pr
if (fLarger) /* Go from display rectangle */
{
/* Add the height of the tabs. */
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
*iRightBottom += infoPtr->tabHeight * infoPtr->uNumRows;
else
*iLeftTop -= infoPtr->tabHeight * infoPtr->uNumRows +
- ((lStyle & TCS_BUTTONS)? 3 * (infoPtr->uNumRows - 1) : 0);
+ ((infoPtr->dwStyle & TCS_BUTTONS)? 3 * (infoPtr->uNumRows - 1) : 0);
/* Inflate the rectangle for the padding */
InflateRect(prc, DISPLAY_AREA_PADDINGX, DISPLAY_AREA_PADDINGY);
@@ -918,11 +962,11 @@ static LRESULT TAB_AdjustRect(const TAB_INFO *infoPtr, WPARAM fLarger, LPRECT pr
InflateRect(prc, -DISPLAY_AREA_PADDINGX, -DISPLAY_AREA_PADDINGY);
/* Remove the height of the tabs. */
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
*iRightBottom -= infoPtr->tabHeight * infoPtr->uNumRows;
else
*iLeftTop += (infoPtr->tabHeight) * infoPtr->uNumRows +
- ((lStyle & TCS_BUTTONS)? 3 * (infoPtr->uNumRows - 1) : 0);
+ ((infoPtr->dwStyle & TCS_BUTTONS)? 3 * (infoPtr->uNumRows - 1) : 0);
}
return 0;
@@ -959,14 +1003,11 @@ static LRESULT TAB_OnHScroll(TAB_INFO *infoPtr, int nScrollCode, int nPos)
* scrolling control is displayed (or not).
*/
static void TAB_SetupScrolling(
- HWND hwnd,
TAB_INFO* infoPtr,
const RECT* clientRect)
{
- static const WCHAR msctls_updown32W[] = { 'm','s','c','t','l','s','_','u','p','d','o','w','n','3','2',0 };
static const WCHAR emptyW[] = { 0 };
INT maxRange = 0;
- DWORD lStyle = GetWindowLongW(hwnd, GWL_STYLE);
if (infoPtr->needsScrolling)
{
@@ -976,12 +1017,12 @@ static void TAB_SetupScrolling(
/*
* Calculate the position of the scroll control.
*/
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
controlPos.right = clientRect->right;
controlPos.left = controlPos.right - 2 * GetSystemMetrics(SM_CXHSCROLL);
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
{
controlPos.top = clientRect->bottom - infoPtr->tabHeight;
controlPos.bottom = controlPos.top + GetSystemMetrics(SM_CYHSCROLL);
@@ -997,7 +1038,7 @@ static void TAB_SetupScrolling(
controlPos.right = clientRect->right;
controlPos.left = controlPos.right - 2 * GetSystemMetrics(SM_CXHSCROLL);
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
{
controlPos.top = clientRect->bottom - infoPtr->tabHeight;
controlPos.bottom = controlPos.top + GetSystemMetrics(SM_CYHSCROLL);
@@ -1015,12 +1056,12 @@ static void TAB_SetupScrolling(
*/
if (infoPtr->hwndUpDown==0)
{
- infoPtr->hwndUpDown = CreateWindowW(msctls_updown32W, emptyW,
+ infoPtr->hwndUpDown = CreateWindowW(UPDOWN_CLASSW, emptyW,
WS_VISIBLE | WS_CHILD | UDS_HORZ,
controlPos.left, controlPos.top,
controlPos.right - controlPos.left,
controlPos.bottom - controlPos.top,
- hwnd, NULL, NULL, NULL);
+ infoPtr->hwnd, NULL, NULL, NULL);
}
else
{
@@ -1055,7 +1096,7 @@ static void TAB_SetupScrolling(
else
{
/* If we once had a scroll control... hide it */
- if (infoPtr->hwndUpDown!=0)
+ if (infoPtr->hwndUpDown)
ShowWindow(infoPtr->hwndUpDown, SW_HIDE);
}
if (infoPtr->hwndUpDown)
@@ -1074,7 +1115,6 @@ static void TAB_SetupScrolling(
*/
static void TAB_SetItemBounds (TAB_INFO *infoPtr)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
TEXTMETRICW fontMetrics;
UINT curItem;
INT curItemLeftPos;
@@ -1105,7 +1145,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
/* if TCS_VERTICAL then swap the height and width so this code places the
tabs along the top of the rectangle and we can just rotate them after
rather than duplicate all of the below code */
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
iTemp = clientRect.bottom;
clientRect.bottom = clientRect.right;
@@ -1143,7 +1183,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
* selected item + extra space for the selected item.
*/
infoPtr->tabHeight = item_height +
- ((lStyle & TCS_BUTTONS) ? 2 : 1) *
+ ((infoPtr->dwStyle & TCS_BUTTONS) ? 2 : 1) *
infoPtr->uVItemPadding;
TRACE("tabH=%d, tmH=%d, iconh=%d\n",
@@ -1157,7 +1197,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
{
ImageList_GetIconSize(infoPtr->himl, &icon_width, 0);
- if (lStyle & TCS_FIXEDWIDTH)
+ if (infoPtr->dwStyle & TCS_FIXEDWIDTH)
icon_width += 4;
else
/* Add padding if icon is present */
@@ -1171,7 +1211,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
/* Set the leftmost position of the tab. */
curr->rect.left = curItemLeftPos;
- if (lStyle & TCS_FIXEDWIDTH)
+ if (infoPtr->dwStyle & TCS_FIXEDWIDTH)
{
curr->rect.right = curr->rect.left +
max(infoPtr->tabWidth, icon_width);
@@ -1219,7 +1259,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
*
*/
- if (((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) &&
+ if (((infoPtr->dwStyle & TCS_MULTILINE) || (infoPtr->dwStyle & TCS_VERTICAL)) &&
(curr->rect.right >
(clientRect.right - CONTROL_BORDER_SIZEX - DISPLAY_AREA_PADDINGX)))
{
@@ -1240,17 +1280,17 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
* The leftmost position of the next item is the rightmost position
* of this one.
*/
- if (lStyle & TCS_BUTTONS)
+ if (infoPtr->dwStyle & TCS_BUTTONS)
{
curItemLeftPos = curr->rect.right + BUTTON_SPACINGX;
- if (lStyle & TCS_FLATBUTTONS)
+ if (infoPtr->dwStyle & TCS_FLATBUTTONS)
curItemLeftPos += FLAT_BTN_SPACINGX;
}
else
curItemLeftPos = curr->rect.right;
}
- if (!((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)))
+ if (!((infoPtr->dwStyle & TCS_MULTILINE) || (infoPtr->dwStyle & TCS_VERTICAL)))
{
/*
* Check if we need a scrolling control.
@@ -1270,14 +1310,14 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
infoPtr->needsScrolling = FALSE;
infoPtr->leftmostVisible = 0;
}
- TAB_SetupScrolling(infoPtr->hwnd, infoPtr, &clientRect);
+ TAB_SetupScrolling(infoPtr, &clientRect);
/* Set the number of rows */
infoPtr->uNumRows = curItemRowCount;
/* Arrange all tabs evenly if style says so */
- if (!(lStyle & TCS_RAGGEDRIGHT) &&
- ((lStyle & TCS_MULTILINE) || (lStyle & TCS_VERTICAL)) &&
+ if (!(infoPtr->dwStyle & TCS_RAGGEDRIGHT) &&
+ ((infoPtr->dwStyle & TCS_MULTILINE) || (infoPtr->dwStyle & TCS_VERTICAL)) &&
(infoPtr->uNumItem > 0) &&
(infoPtr->uNumRows > 1))
{
@@ -1312,7 +1352,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
/* move to the next row, reset our current item left position and */
/* the count of items on this row */
- if (lStyle & TCS_VERTICAL) {
+ if (infoPtr->dwStyle & TCS_VERTICAL) {
/* Vert: Add the remaining tabs in the *last* remainder rows */
if (iCount >= ((iRow>=(INT)infoPtr->uNumRows - remTab)?tabPerRow + 1:tabPerRow)) {
iRow++;
@@ -1332,10 +1372,10 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
curr->rect.left += curItemLeftPos;
curr->rect.right += curItemLeftPos;
curr->rect.top = iRow;
- if (lStyle & TCS_BUTTONS)
+ if (infoPtr->dwStyle & TCS_BUTTONS)
{
curItemLeftPos = curr->rect.right + 1;
- if (lStyle & TCS_FLATBUTTONS)
+ if (infoPtr->dwStyle & TCS_FLATBUTTONS)
curItemLeftPos += FLAT_BTN_SPACINGX;
}
else
@@ -1418,7 +1458,7 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
}
/* if TCS_VERTICAL rotate the tabs so they are along the side of the clientRect */
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
RECT rcOriginal;
for(iIndex = 0; iIndex < infoPtr->uNumItem; iIndex++)
@@ -1447,17 +1487,16 @@ static void TAB_SetItemBounds (TAB_INFO *infoPtr)
static void
TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, const RECT *drawRect)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
HBRUSH hbr = CreateSolidBrush (comctl32_color.clrBtnFace);
BOOL deleteBrush = TRUE;
RECT rTemp = *drawRect;
- if (lStyle & TCS_BUTTONS)
+ if (infoPtr->dwStyle & TCS_BUTTONS)
{
if (iItem == infoPtr->iSelected)
{
/* Background color */
- if (!(lStyle & TCS_OWNERDRAWFIXED))
+ if (!(infoPtr->dwStyle & TCS_OWNERDRAWFIXED))
{
DeleteObject(hbr);
hbr = GetSysColorBrush(COLOR_SCROLLBAR);
@@ -1478,11 +1517,12 @@ TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, const RECT *dr
}
else /* ! selected */
{
- if (lStyle & TCS_FLATBUTTONS)
+ if (infoPtr->dwStyle & TCS_FLATBUTTONS)
{
InflateRect(&rTemp, 2, 2);
FillRect(hdc, &rTemp, hbr);
- if (iItem == infoPtr->iHotTracked)
+ if (iItem == infoPtr->iHotTracked ||
+ (iItem != infoPtr->iSelected && iItem == infoPtr->uFocus))
DrawEdge(hdc, &rTemp, BDR_RAISEDINNER, BF_RECT);
}
else
@@ -1522,8 +1562,6 @@ TAB_EraseTabInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, const RECT *dr
static void
TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
-
RECT localRect;
HPEN htextPen;
@@ -1560,7 +1598,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
else
*drawRect = itemRect;
- if (lStyle & TCS_BUTTONS)
+ if (infoPtr->dwStyle & TCS_BUTTONS)
{
if (iItem == infoPtr->iSelected)
{
@@ -1568,14 +1606,14 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
drawRect->top += 4;
drawRect->right -= 4;
- if (lStyle & TCS_VERTICAL)
+ if (infoPtr->dwStyle & TCS_VERTICAL)
{
- if (!(lStyle & TCS_BOTTOM)) drawRect->right += 1;
+ if (!(infoPtr->dwStyle & TCS_BOTTOM)) drawRect->right += 1;
drawRect->bottom -= 4;
}
else
{
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
{
drawRect->top -= 2;
drawRect->bottom -= 4;
@@ -1594,7 +1632,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
}
else
{
- if ((lStyle & TCS_VERTICAL) && (lStyle & TCS_BOTTOM))
+ if ((infoPtr->dwStyle & TCS_VERTICAL) && (infoPtr->dwStyle & TCS_BOTTOM))
{
if (iItem != infoPtr->iSelected)
{
@@ -1603,7 +1641,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
drawRect->bottom -= 2;
}
}
- else if (lStyle & TCS_VERTICAL)
+ else if (infoPtr->dwStyle & TCS_VERTICAL)
{
if (iItem == infoPtr->iSelected)
{
@@ -1616,7 +1654,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
drawRect->bottom -= 2;
}
}
- else if (lStyle & TCS_BOTTOM)
+ else if (infoPtr->dwStyle & TCS_BOTTOM)
{
if (iItem == infoPtr->iSelected)
{
@@ -1648,21 +1686,19 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
TAB_EraseTabInterior (infoPtr, hdc, iItem, drawRect);
/* Draw the focus rectangle */
- if (!(lStyle & TCS_FOCUSNEVER) &&
+ if (!(infoPtr->dwStyle & TCS_FOCUSNEVER) &&
(GetFocus() == infoPtr->hwnd) &&
(iItem == infoPtr->uFocus) )
{
RECT rFocus = *drawRect;
- InflateRect(&rFocus, -3, -3);
- if (lStyle & TCS_BOTTOM && !(lStyle & TCS_VERTICAL))
- rFocus.top -= 3;
- if (lStyle & TCS_BUTTONS)
- {
- rFocus.left -= 3;
- rFocus.top -= 3;
- }
- DrawFocusRect(hdc, &rFocus);
+ if (!(infoPtr->dwStyle & TCS_BUTTONS)) InflateRect(&rFocus, -3, -3);
+ if (infoPtr->dwStyle & TCS_BOTTOM && !(infoPtr->dwStyle & TCS_VERTICAL))
+ rFocus.top -= 3;
+
+ /* focus should stay on selected item for TCS_BUTTONS style */
+ if (!((infoPtr->dwStyle & TCS_BUTTONS) && (infoPtr->iSelected != iItem)))
+ DrawFocusRect(hdc, &rFocus);
}
/*
@@ -1676,10 +1712,10 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
* Setup for text output
*/
oldBkMode = SetBkMode(hdc, TRANSPARENT);
- if (!GetWindowTheme (infoPtr->hwnd) || (lStyle & TCS_BUTTONS))
+ if (!GetWindowTheme (infoPtr->hwnd) || (infoPtr->dwStyle & TCS_BUTTONS))
{
- if ((lStyle & TCS_HOTTRACK) && (iItem == infoPtr->iHotTracked) &&
- !(lStyle & TCS_FLATBUTTONS))
+ if ((infoPtr->dwStyle & TCS_HOTTRACK) && (iItem == infoPtr->iHotTracked) &&
+ !(infoPtr->dwStyle & TCS_FLATBUTTONS))
SetTextColor(hdc, comctl32_color.clrHighlight);
else if (TAB_GetItem(infoPtr, iItem)->dwState & TCIS_HIGHLIGHTED)
SetTextColor(hdc, comctl32_color.clrHighlightText);
@@ -1690,7 +1726,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
/*
* if owner draw, tell the owner to draw
*/
- if ((lStyle & TCS_OWNERDRAWFIXED) && GetParent(infoPtr->hwnd))
+ if ((infoPtr->dwStyle & TCS_OWNERDRAWFIXED) && GetParent(infoPtr->hwnd))
{
DRAWITEMSTRUCT dis;
UINT id;
@@ -1728,7 +1764,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
/*
* send the draw message
*/
- SendMessageW( infoPtr->hwndNotify, WM_DRAWITEM, (WPARAM)id, (LPARAM)&dis );
+ SendMessageW( infoPtr->hwndNotify, WM_DRAWITEM, id, (LPARAM)&dis );
}
else
{
@@ -1764,7 +1800,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
ImageList_GetIconSize(infoPtr->himl, &cx, &cy);
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
center_offset_h = ((drawRect->bottom - drawRect->top) - (cy + infoPtr->uHItemPadding + (rcText.right - rcText.left))) / 2;
center_offset_v = ((drawRect->right - drawRect->left) - cx) / 2;
@@ -1781,7 +1817,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
else
center_offset_v += infoPtr->uVItemPadding / 2;
- if (lStyle & TCS_FIXEDWIDTH && lStyle & (TCS_FORCELABELLEFT | TCS_FORCEICONLEFT))
+ if (infoPtr->dwStyle & TCS_FIXEDWIDTH && infoPtr->dwStyle & (TCS_FORCELABELLEFT | TCS_FORCEICONLEFT))
center_offset_h = infoPtr->uHItemPadding;
if (center_offset_h < 2)
@@ -1794,7 +1830,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
debugstr_w(item->pszText), center_offset_h, center_offset_v,
wine_dbgstr_rect(drawRect), (rcText.right-rcText.left));
- if((lStyle & TCS_VERTICAL) && (lStyle & TCS_BOTTOM))
+ if((infoPtr->dwStyle & TCS_VERTICAL) && (infoPtr->dwStyle & TCS_BOTTOM))
{
rcImage.top = drawRect->top + center_offset_h;
/* if tab is TCS_VERTICAL and TCS_BOTTOM, the text is drawn from the */
@@ -1803,7 +1839,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
rcImage.left = drawRect->right - cx - center_offset_v;
drawRect->top += cy + infoPtr->uHItemPadding;
}
- else if(lStyle & TCS_VERTICAL)
+ else if(infoPtr->dwStyle & TCS_VERTICAL)
{
rcImage.top = drawRect->bottom - cy - center_offset_h;
rcImage.left = drawRect->left + center_offset_v;
@@ -1830,17 +1866,17 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
}
/* Now position text */
- if (lStyle & TCS_FIXEDWIDTH && lStyle & TCS_FORCELABELLEFT)
+ if (infoPtr->dwStyle & TCS_FIXEDWIDTH && infoPtr->dwStyle & TCS_FORCELABELLEFT)
center_offset_h = infoPtr->uHItemPadding;
else
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
center_offset_h = ((drawRect->bottom - drawRect->top) - (rcText.right - rcText.left)) / 2;
else
center_offset_h = ((drawRect->right - drawRect->left) - (rcText.right - rcText.left)) / 2;
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
- if(lStyle & TCS_BOTTOM)
+ if(infoPtr->dwStyle & TCS_BOTTOM)
drawRect->top+=center_offset_h;
else
drawRect->bottom-=center_offset_h;
@@ -1862,13 +1898,13 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
if (center_offset_v < 0)
center_offset_v = 0;
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
drawRect->left += center_offset_v;
else
drawRect->top += center_offset_v;
/* Draw the text */
- if(lStyle & TCS_VERTICAL) /* if we are vertical rotate the text and each character */
+ if(infoPtr->dwStyle & TCS_VERTICAL) /* if we are vertical rotate the text and each character */
{
static const WCHAR ArialW[] = { 'A','r','i','a','l',0 };
LOGFONTW logfont;
@@ -1876,7 +1912,7 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
INT nEscapement = 900;
INT nOrientation = 900;
- if(lStyle & TCS_BOTTOM)
+ if(infoPtr->dwStyle & TCS_BOTTOM)
{
nEscapement = -900;
nOrientation = -900;
@@ -1907,8 +1943,8 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
if (item->pszText)
{
ExtTextOutW(hdc,
- (lStyle & TCS_BOTTOM) ? drawRect->right : drawRect->left,
- (!(lStyle & TCS_BOTTOM)) ? drawRect->bottom : drawRect->top,
+ (infoPtr->dwStyle & TCS_BOTTOM) ? drawRect->right : drawRect->left,
+ (!(infoPtr->dwStyle & TCS_BOTTOM)) ? drawRect->bottom : drawRect->top,
ETO_CLIPPED,
drawRect,
item->pszText,
@@ -1955,7 +1991,6 @@ TAB_DrawItemInterior(const TAB_INFO *infoPtr, HDC hdc, INT iItem, RECT *drawRect
*/
static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
RECT itemRect;
RECT selectedRect;
BOOL isVisible;
@@ -1993,13 +2028,13 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
bkgnd = comctl32_color.clrBtnFace;
corner = comctl32_color.clrBtnFace;
- if (lStyle & TCS_BUTTONS)
+ if (infoPtr->dwStyle & TCS_BUTTONS)
{
/* Get item rectangle */
r = itemRect;
/* Separators between flat buttons */
- if ((lStyle & TCS_FLATBUTTONS) && (infoPtr->exStyle & TCS_EX_FLATSEPARATORS))
+ if ((infoPtr->dwStyle & TCS_FLATBUTTONS) && (infoPtr->exStyle & TCS_EX_FLATSEPARATORS))
{
r1 = r;
r1.right += (FLAT_BTN_SPACINGX -2);
@@ -2016,10 +2051,10 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
{
DWORD state = TAB_GetItem(infoPtr, iItem)->dwState;
- if (state & TCIS_BUTTONPRESSED)
+ if ((state & TCIS_BUTTONPRESSED) || (iItem == infoPtr->uFocus))
DrawEdge(hdc, &r, EDGE_SUNKEN, BF_SOFT|BF_RECT);
else
- if (!(lStyle & TCS_FLATBUTTONS))
+ if (!(infoPtr->dwStyle & TCS_FLATBUTTONS))
DrawEdge(hdc, &r, EDGE_RAISED, BF_SOFT|BF_RECT);
}
}
@@ -2050,7 +2085,7 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
* However, since in Wine apps may get themed that did not opt in via
* a manifest avoid theming when we know the result will be wrong */
if ((theme = GetWindowTheme (infoPtr->hwnd))
- && ((lStyle & (TCS_VERTICAL | TCS_BOTTOM)) == 0))
+ && ((infoPtr->dwStyle & (TCS_VERTICAL | TCS_BOTTOM)) == 0))
{
static const int partIds[8] = {
/* Normal item */
@@ -2091,7 +2126,7 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
DrawThemeBackground (theme, hdc, partIds[partIndex], stateId, &r, NULL);
GetThemeBackgroundContentRect (theme, hdc, partIds[partIndex], stateId, &r, &r);
}
- else if(lStyle & TCS_VERTICAL)
+ else if(infoPtr->dwStyle & TCS_VERTICAL)
{
/* These are for adjusting the drawing of a Selected tab */
/* The initial values are for the normal case of non-Selected */
@@ -2107,7 +2142,7 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
fillRect.bottom -= CONTROL_BORDER_SIZEY;
}
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
{
/* Adjust both rectangles to match native */
r.left += (1-ZZ);
@@ -2194,7 +2229,7 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
fillRect.right -= CONTROL_BORDER_SIZEX;
}
- if (lStyle & TCS_BOTTOM)
+ if (infoPtr->dwStyle & TCS_BOTTOM)
{
/* Adjust both rectangles for topmost row */
if (TAB_GetItem(infoPtr, iItem)->rect.top == infoPtr->uNumRows-1)
@@ -2303,7 +2338,6 @@ static void TAB_DrawItem(const TAB_INFO *infoPtr, HDC hdc, INT iItem)
static void TAB_DrawBorder(const TAB_INFO *infoPtr, HDC hdc)
{
RECT rect;
- DWORD lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
HTHEME theme = GetWindowTheme (infoPtr->hwnd);
GetClientRect (infoPtr->hwnd, &rect);
@@ -2314,11 +2348,11 @@ static void TAB_DrawBorder(const TAB_INFO *infoPtr, HDC hdc)
if (infoPtr->uNumItem)
{
- if ((lStyle & TCS_BOTTOM) && !(lStyle & TCS_VERTICAL))
+ if ((infoPtr->dwStyle & TCS_BOTTOM) && !(infoPtr->dwStyle & TCS_VERTICAL))
rect.bottom -= infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX;
- else if((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL))
+ else if((infoPtr->dwStyle & TCS_BOTTOM) && (infoPtr->dwStyle & TCS_VERTICAL))
rect.right -= infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX;
- else if(lStyle & TCS_VERTICAL)
+ else if(infoPtr->dwStyle & TCS_VERTICAL)
rect.left += infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX;
else /* not TCS_VERTICAL and not TCS_BOTTOM */
rect.top += infoPtr->tabHeight * infoPtr->uNumRows + CONTROL_BORDER_SIZEX;
@@ -2337,7 +2371,7 @@ static void TAB_DrawBorder(const TAB_INFO *infoPtr, HDC hdc)
*
* This method repaints the tab control..
*/
-static void TAB_Refresh (TAB_INFO *infoPtr, HDC hdc)
+static void TAB_Refresh (const TAB_INFO *infoPtr, HDC hdc)
{
HFONT hOldFont;
INT i;
@@ -2347,7 +2381,7 @@ static void TAB_Refresh (TAB_INFO *infoPtr, HDC hdc)
hOldFont = SelectObject (hdc, infoPtr->hFont);
- if (GetWindowLongW(infoPtr->hwnd, GWL_STYLE) & TCS_BUTTONS)
+ if (infoPtr->dwStyle & TCS_BUTTONS)
{
for (i = 0; i < infoPtr->uNumItem; i++)
TAB_DrawItem (infoPtr, hdc, i);
@@ -2374,6 +2408,7 @@ static void TAB_Refresh (TAB_INFO *infoPtr, HDC hdc)
static inline DWORD TAB_GetRowCount (const TAB_INFO *infoPtr)
{
+ TRACE("(%p)\n", infoPtr);
return infoPtr->uNumRows;
}
@@ -2393,18 +2428,17 @@ static void TAB_EnsureSelectionVisible(
TAB_INFO* infoPtr)
{
INT iSelected = infoPtr->iSelected;
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
INT iOrigLeftmostVisible = infoPtr->leftmostVisible;
/* set the items row to the bottommost row or topmost row depending on
* style */
- if ((infoPtr->uNumRows > 1) && !(lStyle & TCS_BUTTONS))
+ if ((infoPtr->uNumRows > 1) && !(infoPtr->dwStyle & TCS_BUTTONS))
{
TAB_ITEM *selected = TAB_GetItem(infoPtr, iSelected);
INT newselected;
INT iTargetRow;
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
newselected = selected->rect.left;
else
newselected = selected->rect.top;
@@ -2416,7 +2450,7 @@ static void TAB_EnsureSelectionVisible(
if (newselected != iTargetRow)
{
UINT i;
- if(lStyle & TCS_VERTICAL)
+ if(infoPtr->dwStyle & TCS_VERTICAL)
{
for (i=0; i < infoPtr->uNumItem; i++)
{
@@ -2455,7 +2489,7 @@ static void TAB_EnsureSelectionVisible(
* Do the trivial cases first.
*/
if ( (!infoPtr->needsScrolling) ||
- (infoPtr->hwndUpDown==0) || (lStyle & TCS_VERTICAL))
+ (infoPtr->hwndUpDown==0) || (infoPtr->dwStyle & TCS_VERTICAL))
return;
if (infoPtr->leftmostVisible >= iSelected)
@@ -2512,7 +2546,6 @@ static void TAB_EnsureSelectionVisible(
static void TAB_InvalidateTabArea(const TAB_INFO *infoPtr)
{
RECT clientRect, rInvalidate, rAdjClient;
- DWORD lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
INT lastRow = infoPtr->uNumRows - 1;
RECT rect;
@@ -2525,19 +2558,19 @@ static void TAB_InvalidateTabArea(const TAB_INFO *infoPtr)
TAB_AdjustRect(infoPtr, 0, &rAdjClient);
TAB_InternalGetItemRect(infoPtr, infoPtr->uNumItem-1 , &rect, NULL);
- if ((lStyle & TCS_BOTTOM) && (lStyle & TCS_VERTICAL))
+ if ((infoPtr->dwStyle & TCS_BOTTOM) && (infoPtr->dwStyle & TCS_VERTICAL))
{
rInvalidate.left = rAdjClient.right;
if (infoPtr->uNumRows == 1)
rInvalidate.bottom = clientRect.top + rect.bottom + 2 * SELECTED_TAB_OFFSET;
}
- else if(lStyle & TCS_VERTICAL)
+ else if(infoPtr->dwStyle & TCS_VERTICAL)
{
rInvalidate.right = rAdjClient.left;
if (infoPtr->uNumRows == 1)
rInvalidate.bottom = clientRect.top + rect.bottom + 2 * SELECTED_TAB_OFFSET;
}
- else if (lStyle & TCS_BOTTOM)
+ else if (infoPtr->dwStyle & TCS_BOTTOM)
{
rInvalidate.top = rAdjClient.bottom;
if (infoPtr->uNumRows == 1)
@@ -2587,19 +2620,14 @@ static inline LRESULT TAB_Paint (TAB_INFO *infoPtr, HDC hdcPaint)
}
static LRESULT
-TAB_InsertItemT (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
+TAB_InsertItemT (TAB_INFO *infoPtr, INT iItem, TCITEMW *pti, BOOL bUnicode)
{
TAB_ITEM *item;
- TCITEMW *pti;
- INT iItem;
RECT rect;
GetClientRect (infoPtr->hwnd, &rect);
TRACE("Rect: %p %s\n", infoPtr->hwnd, wine_dbgstr_rect(&rect));
- pti = (TCITEMW *)lParam;
- iItem = (INT)wParam;
-
if (iItem < 0) return -1;
if (iItem > infoPtr->uNumItem)
iItem = infoPtr->uNumItem;
@@ -2677,25 +2705,24 @@ TAB_InsertItemT (TAB_INFO *infoPtr, WPARAM wParam, LPARAM lParam, BOOL bUnicode)
}
static LRESULT
-TAB_SetItemSize (TAB_INFO *infoPtr, LPARAM lParam)
+TAB_SetItemSize (TAB_INFO *infoPtr, INT cx, INT cy)
{
- LONG lStyle = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
LONG lResult = 0;
BOOL bNeedPaint = FALSE;
lResult = MAKELONG(infoPtr->tabWidth, infoPtr->tabHeight);
/* UNDOCUMENTED: If requested Width or Height is 0 this means that program wants to use auto size. */
- if (lStyle & TCS_FIXEDWIDTH && (infoPtr->tabWidth != (INT)LOWORD(lParam)))
+ if (infoPtr->dwStyle & TCS_FIXEDWIDTH && (infoPtr->tabWidth != cx))
{
- infoPtr->tabWidth = (INT)LOWORD(lParam);
+ infoPtr->tabWidth = cx;
bNeedPaint = TRUE;
}
- if (infoPtr->tabHeight != (INT)HIWORD(lParam))
+ if (infoPtr->tabHeight != cy)
{
- if ((infoPtr->fHeightSet = ((INT)HIWORD(lParam) != 0)))
- infoPtr->tabHeight = (INT)HIWORD(lParam);
+ if ((infoPtr->fHeightSet = (cy != 0)))
+ infoPtr->tabHeight = cy;
bNeedPaint = TRUE;
}
@@ -2736,9 +2763,9 @@ TAB_HighlightItem (TAB_INFO *infoPtr, INT iItem, BOOL fHighlight)
TRACE("(%p,%d,%s)\n", infoPtr, iItem, fHighlight ? "true" : "false");
- if (!infoPtr || iItem < 0 || iItem >= infoPtr->uNumItem)
+ if (iItem < 0 || iItem >= infoPtr->uNumItem)
return FALSE;
-
+
lpState = &TAB_GetItem(infoPtr, iItem)->dwState;
oldState = *lpState;
@@ -2799,7 +2826,8 @@ TAB_SetItemT (TAB_INFO *infoPtr, INT iItem, LPTCITEMW tabItem, BOOL bUnicode)
static inline LRESULT TAB_GetItemCount (const TAB_INFO *infoPtr)
{
- return infoPtr->uNumItem;
+ TRACE("\n");
+ return infoPtr->uNumItem;
}
@@ -2894,10 +2922,9 @@ static LRESULT TAB_DeleteItem (TAB_INFO *infoPtr, INT iItem)
Free(oldItems);
/* Readjust the selected index */
- if ((iItem == infoPtr->iSelected) && (iItem > 0))
- infoPtr->iSelected--;
-
- if (iItem < infoPtr->iSelected)
+ if (iItem == infoPtr->iSelected)
+ infoPtr->iSelected = -1;
+ else if (iItem < infoPtr->iSelected)
infoPtr->iSelected--;
if (infoPtr->uNumItem == 0)
@@ -2950,7 +2977,7 @@ static inline LRESULT TAB_GetImageList (const TAB_INFO *infoPtr)
static inline LRESULT TAB_SetImageList (TAB_INFO *infoPtr, HIMAGELIST himlNew)
{
HIMAGELIST himlPrev = infoPtr->himl;
- TRACE("\n");
+ TRACE("himl=%p\n", himlNew);
infoPtr->himl = himlNew;
TAB_SetItemBounds(infoPtr);
InvalidateRect(infoPtr->hwnd, NULL, TRUE);
@@ -2959,6 +2986,7 @@ static inline LRESULT TAB_SetImageList (TAB_INFO *infoPtr, HIMAGELIST himlNew)
static inline LRESULT TAB_GetUnicodeFormat (const TAB_INFO *infoPtr)
{
+ TRACE("(%p)\n", infoPtr);
return infoPtr->bUnicode;
}
@@ -2966,6 +2994,7 @@ static inline LRESULT TAB_SetUnicodeFormat (TAB_INFO *infoPtr, BOOL bUnicode)
{
BOOL bTemp = infoPtr->bUnicode;
+ TRACE("(%p %d)\n", infoPtr, bUnicode);
infoPtr->bUnicode = bUnicode;
return bTemp;
@@ -3050,9 +3079,10 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
dwStyle = GetWindowLongW(hwnd, GWL_STYLE);
SetWindowLongW(hwnd, GWL_STYLE, dwStyle|WS_CLIPSIBLINGS);
+ infoPtr->dwStyle = dwStyle | WS_CLIPSIBLINGS;
infoPtr->exStyle = (dwStyle & TCS_FLATBUTTONS) ? TCS_EX_FLATSEPARATORS : 0;
- if (dwStyle & TCS_TOOLTIPS) {
+ if (infoPtr->dwStyle & TCS_TOOLTIPS) {
/* Create tooltip control */
infoPtr->hwndToolTip =
CreateWindowExW (0, TOOLTIPS_CLASSW, NULL, WS_POPUP,
@@ -3070,7 +3100,7 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
nmttc.hwndToolTips = infoPtr->hwndToolTip;
SendMessageW (infoPtr->hwndNotify, WM_NOTIFY,
- (WPARAM)GetWindowLongPtrW(hwnd, GWLP_ID), (LPARAM)&nmttc);
+ GetWindowLongPtrW(hwnd, GWLP_ID), (LPARAM)&nmttc);
}
}
@@ -3091,11 +3121,11 @@ static LRESULT TAB_Create (HWND hwnd, LPARAM lParam)
* selected item + extra space for the selected item.
*/
infoPtr->tabHeight = fontMetrics.tmHeight + SELECTED_TAB_OFFSET +
- ((dwStyle & TCS_BUTTONS) ? 2 : 1) *
+ ((infoPtr->dwStyle & TCS_BUTTONS) ? 2 : 1) *
infoPtr->uVItemPadding;
/* Initialize the width of a tab. */
- if (dwStyle & TCS_FIXEDWIDTH)
+ if (infoPtr->dwStyle & TCS_FIXEDWIDTH)
infoPtr->tabWidth = GetDeviceCaps(hdc, LOGPIXELSX);
infoPtr->tabMinWidth = -1;
@@ -3113,9 +3143,6 @@ TAB_Destroy (TAB_INFO *infoPtr)
{
UINT iItem;
- if (!infoPtr)
- return 0;
-
SetWindowLongPtrW(infoPtr->hwnd, 0, 0);
if (infoPtr->items) {
@@ -3135,7 +3162,7 @@ TAB_Destroy (TAB_INFO *infoPtr)
KillTimer(infoPtr->hwnd, TAB_HOTTRACK_TIMER);
CloseThemeData (GetWindowTheme (infoPtr->hwnd));
-
+
Free (infoPtr);
return 0;
}
@@ -3159,7 +3186,9 @@ static LRESULT TAB_NCCalcSize(WPARAM wParam)
static inline LRESULT
TAB_SetItemExtra (TAB_INFO *infoPtr, INT cbInfo)
{
- if (!infoPtr || cbInfo <= 0)
+ TRACE("(%p %d)\n", infoPtr, cbInfo);
+
+ if (cbInfo <= 0)
return FALSE;
if (infoPtr->uNumItem)
@@ -3174,8 +3203,7 @@ TAB_SetItemExtra (TAB_INFO *infoPtr, INT cbInfo)
static LRESULT TAB_RemoveImage (TAB_INFO *infoPtr, INT image)
{
- if (!infoPtr)
- return 0;
+ TRACE("%p %d\n", infoPtr, image);
if (ImageList_Remove (infoPtr->himl, image))
{
@@ -3239,11 +3267,12 @@ TAB_GetExtendedStyle (const TAB_INFO *infoPtr)
static LRESULT
TAB_DeselectAll (TAB_INFO *infoPtr, BOOL excludesel)
{
- LONG style = GetWindowLongW(infoPtr->hwnd, GWL_STYLE);
BOOL paint = FALSE;
INT i, selected = infoPtr->iSelected;
- if (!(style & TCS_BUTTONS))
+ TRACE("(%p, %d)\n", infoPtr, excludesel);
+
+ if (!(infoPtr->dwStyle & TCS_BUTTONS))
return 0;
for (i = 0; i < infoPtr->uNumItem; i++)
@@ -3269,6 +3298,34 @@ TAB_DeselectAll (TAB_INFO *infoPtr, BOOL excludesel)
return 0;
}
+/***
+ * DESCRIPTION:
+ * Processes WM_STYLECHANGED messages.
+ *
+ * PARAMETER(S):
+ * [I] infoPtr : valid pointer to the tab data structure
+ * [I] wStyleType : window style type (normal or extended)
+ * [I] lpss : window style information
+ *
+ * RETURN:
+ * Zero
+ */
+static INT TAB_StyleChanged(TAB_INFO *infoPtr, WPARAM wStyleType,
+ const STYLESTRUCT *lpss)
+{
+ TRACE("(styletype=%lx, styleOld=0x%08x, styleNew=0x%08x)\n",
+ wStyleType, lpss->styleOld, lpss->styleNew);
+
+ if (wStyleType != GWL_STYLE) return 0;
+
+ infoPtr->dwStyle = lpss->styleNew;
+
+ TAB_SetItemBounds (infoPtr);
+ InvalidateRect(infoPtr->hwnd, NULL, TRUE);
+
+ return 0;
+}
+
static LRESULT WINAPI
TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@@ -3304,7 +3361,7 @@ TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TAB_DeleteAllItems (infoPtr);
case TCM_GETITEMRECT:
- return TAB_GetItemRect (infoPtr, wParam, lParam);
+ return TAB_GetItemRect (infoPtr, (INT)wParam, (LPRECT)lParam);
case TCM_GETCURSEL:
return TAB_GetCurSel (infoPtr);
@@ -3317,19 +3374,19 @@ TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
case TCM_INSERTITEMA:
case TCM_INSERTITEMW:
- return TAB_InsertItemT (infoPtr, wParam, lParam, uMsg == TCM_INSERTITEMW);
+ return TAB_InsertItemT (infoPtr, (INT)wParam, (TCITEMW*)lParam, uMsg == TCM_INSERTITEMW);
case TCM_SETITEMEXTRA:
- return TAB_SetItemExtra (infoPtr, (int)wParam);
+ return TAB_SetItemExtra (infoPtr, (INT)wParam);
case TCM_ADJUSTRECT:
return TAB_AdjustRect (infoPtr, (BOOL)wParam, (LPRECT)lParam);
case TCM_SETITEMSIZE:
- return TAB_SetItemSize (infoPtr, lParam);
+ return TAB_SetItemSize (infoPtr, (INT)LOWORD(lParam), (INT)HIWORD(lParam));
case TCM_REMOVEIMAGE:
- return TAB_RemoveImage (infoPtr, wParam);
+ return TAB_RemoveImage (infoPtr, (INT)wParam);
case TCM_SETPADDING:
return TAB_SetPadding (infoPtr, lParam);
@@ -3414,9 +3471,7 @@ TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TAB_OnHScroll(infoPtr, (int)LOWORD(wParam), (int)HIWORD(wParam));
case WM_STYLECHANGED:
- TAB_SetItemBounds (infoPtr);
- InvalidateRect(hwnd, NULL, TRUE);
- return 0;
+ return TAB_StyleChanged(infoPtr, wParam, (LPSTYLESTRUCT)lParam);
case WM_SYSCOLORCHANGE:
COMCTL32_RefreshSysColors();
@@ -3426,12 +3481,14 @@ TAB_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return theme_changed (infoPtr);
case WM_KILLFOCUS:
+ TAB_KillFocus(infoPtr);
case WM_SETFOCUS:
TAB_FocusChanging(infoPtr);
break; /* Don't disturb normal focus behavior */
- case WM_KEYUP:
- return TAB_KeyUp(infoPtr, wParam);
+ case WM_KEYDOWN:
+ return TAB_KeyDown(infoPtr, wParam, lParam);
+
case WM_NCHITTEST:
return TAB_NCHitTest(infoPtr, lParam);
diff --git a/dll/win32/comctl32/theme_combo.c b/dll/win32/comctl32/theme_combo.c
index 477138e1792..a6c6f8784ab 100644
--- a/dll/win32/comctl32/theme_combo.c
+++ b/dll/win32/comctl32/theme_combo.c
@@ -69,7 +69,7 @@ static void paint_text (HWND hwnd, HDC hdc, DWORD dwStyle, const COMBOBOXINFO *c
if( (pText = HeapAlloc( GetProcessHeap(), 0, (size + 1) * sizeof(WCHAR))) )
{
/* size from LB_GETTEXTLEN may be too large, from LB_GETTEXT is accurate */
- size=SendMessageW (cbi->hwndList, LB_GETTEXT, (WPARAM)id, (LPARAM)pText);
+ size = SendMessageW (cbi->hwndList, LB_GETTEXT, id, (LPARAM)pText);
pText[size] = '\0'; /* just in case */
} else return;
}
@@ -116,8 +116,7 @@ static void paint_text (HWND hwnd, HDC hdc, DWORD dwStyle, const COMBOBOXINFO *c
dis.itemState = itemState;
dis.hDC = hdc;
dis.rcItem = rectEdit;
- dis.itemData = SendMessageW(cbi->hwndList, LB_GETITEMDATA,
- (WPARAM)id, 0 );
+ dis.itemData = SendMessageW(cbi->hwndList, LB_GETITEMDATA, id, 0);
/*
* Clip the DC and have the parent draw the item.
diff --git a/dll/win32/comctl32/toolbar.c b/dll/win32/comctl32/toolbar.c
index d95dc7d9a97..d24b3dc2cfe 100644
--- a/dll/win32/comctl32/toolbar.c
+++ b/dll/win32/comctl32/toolbar.c
@@ -264,7 +264,7 @@ TOOLBAR_GetText(const TOOLBAR_INFO *infoPtr, const TBUTTON_INFO *btnPtr)
LPWSTR lpText = NULL;
/* NOTE: iString == -1 is undocumented */
- if ((HIWORD(btnPtr->iString) != 0) && (btnPtr->iString != -1))
+ if (!IS_INTRESOURCE(btnPtr->iString) && (btnPtr->iString != -1))
lpText = (LPWSTR)btnPtr->iString;
else if ((btnPtr->iString >= 0) && (btnPtr->iString < infoPtr->nNumStrings))
lpText = infoPtr->strings[btnPtr->iString];
@@ -315,6 +315,11 @@ TOOLBAR_DumpToolbar(const TOOLBAR_INFO *iP, INT line)
}
}
+static inline BOOL
+TOOLBAR_ButtonHasString(const TBUTTON_INFO *btnPtr)
+{
+ return HIWORD(btnPtr->iString) && btnPtr->iString != -1;
+}
/***********************************************************************
* TOOLBAR_CheckStyle
@@ -1832,7 +1837,7 @@ TOOLBAR_InternalInsertButtonsT(TOOLBAR_INFO *infoPtr, INT iIndex, UINT nAddButto
btnPtr->dwData = lpTbb[iButton].dwData;
if (btnPtr->fsStyle & BTNS_SEP)
btnPtr->iString = -1;
- else if(HIWORD(lpTbb[iButton].iString) && lpTbb[iButton].iString != -1)
+ else if(!IS_INTRESOURCE(lpTbb[iButton].iString) && lpTbb[iButton].iString != -1)
{
if (fUnicode)
Str_SetPtrW((LPWSTR*)&btnPtr->iString, (LPWSTR)lpTbb[iButton].iString );
@@ -2601,7 +2606,7 @@ TOOLBAR_CustomizeDialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
COLORREF oldBk = 0;
/* get item data */
- btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, wParam, LB_GETITEMDATA, (WPARAM)lpdis->itemID, 0);
+ btnInfo = (PCUSTOMBUTTON)SendDlgItemMessageW (hwnd, wParam, LB_GETITEMDATA, lpdis->itemID, 0);
if (btnInfo == NULL)
{
FIXME("btnInfo invalid!\n");
@@ -2892,7 +2897,7 @@ TOOLBAR_AddStringW (TOOLBAR_INFO *infoPtr, HINSTANCE hInstance, LPARAM lParam)
BOOL fFirstString = (infoPtr->nNumStrings == 0);
INT nIndex = infoPtr->nNumStrings;
- if (hInstance && (HIWORD(lParam) == 0)) {
+ if (hInstance && IS_INTRESOURCE(lParam)) {
WCHAR szString[MAX_RESOURCE_STRING_LENGTH];
WCHAR delimiter;
WCHAR *next_delim;
@@ -2960,7 +2965,7 @@ TOOLBAR_AddStringA (TOOLBAR_INFO *infoPtr, HINSTANCE hInstance, LPARAM lParam)
INT nIndex;
INT len;
- if (hInstance && (HIWORD(lParam) == 0)) /* load from resources */
+ if (hInstance && IS_INTRESOURCE(lParam)) /* load from resources */
return TOOLBAR_AddStringW(infoPtr, hInstance, lParam);
p = (LPSTR)lParam;
@@ -3151,8 +3156,6 @@ TOOLBAR_Customize (TOOLBAR_INFO *infoPtr)
{
CUSTDLG_INFO custInfo;
LRESULT ret;
- LPCVOID template;
- HRSRC hRes;
NMHDR nmhdr;
custInfo.tbInfo = infoPtr;
@@ -3161,17 +3164,8 @@ TOOLBAR_Customize (TOOLBAR_INFO *infoPtr)
/* send TBN_BEGINADJUST notification */
TOOLBAR_SendNotify (&nmhdr, infoPtr, TBN_BEGINADJUST);
- if (!(hRes = FindResourceW (COMCTL32_hModule,
- MAKEINTRESOURCEW(IDD_TBCUSTOMIZE),
- (LPWSTR)RT_DIALOG)))
- return FALSE;
-
- if(!(template = LoadResource (COMCTL32_hModule, hRes)))
- return FALSE;
-
- ret = DialogBoxIndirectParamW ((HINSTANCE)GetWindowLongPtrW(infoPtr->hwndSelf, GWLP_HINSTANCE),
- template, infoPtr->hwndSelf, TOOLBAR_CustomizeDialogProc,
- (LPARAM)&custInfo);
+ ret = DialogBoxParamW (COMCTL32_hModule, MAKEINTRESOURCEW(IDD_TBCUSTOMIZE),
+ infoPtr->hwndSelf, TOOLBAR_CustomizeDialogProc, (LPARAM)&custInfo);
/* send TBN_ENDADJUST notification */
TOOLBAR_SendNotify (&nmhdr, infoPtr, TBN_ENDADJUST);
@@ -3203,6 +3197,8 @@ TOOLBAR_DeleteButton (TOOLBAR_INFO *infoPtr, INT nIndex)
if (infoPtr->nNumButtons == 1) {
TRACE(" simple delete!\n");
+ if (TOOLBAR_ButtonHasString(infoPtr->buttons))
+ Free((LPWSTR)infoPtr->buttons[0].iString);
Free (infoPtr->buttons);
infoPtr->buttons = NULL;
infoPtr->nNumButtons = 0;
@@ -3223,6 +3219,8 @@ TOOLBAR_DeleteButton (TOOLBAR_INFO *infoPtr, INT nIndex)
(infoPtr->nNumButtons - nIndex) * sizeof(TBUTTON_INFO));
}
+ if (TOOLBAR_ButtonHasString(&oldButtons[nIndex]))
+ Free((LPWSTR)oldButtons[nIndex].iString);
Free (oldButtons);
}
@@ -3364,7 +3362,7 @@ TOOLBAR_GetButtonInfoT(const TOOLBAR_INFO *infoPtr, INT Id, LPTBBUTTONINFOW lpTb
if (lpTbInfo->dwMask & TBIF_TEXT) {
/* TB_GETBUTTONINFO doesn't retrieve text from the string list, so we
can't use TOOLBAR_GetText here */
- if (HIWORD(btnPtr->iString) && (btnPtr->iString != -1)) {
+ if (!IS_INTRESOURCE(btnPtr->iString) && (btnPtr->iString != -1)) {
LPWSTR lpText = (LPWSTR)btnPtr->iString;
if (bUnicode)
Str_GetPtrW(lpText, lpTbInfo->pszText, lpTbInfo->cchText);
@@ -3386,24 +3384,7 @@ TOOLBAR_GetButtonSize (const TOOLBAR_INFO *infoPtr)
static LRESULT
-TOOLBAR_GetButtonTextA (const TOOLBAR_INFO *infoPtr, INT Id, LPSTR lpText)
-{
- INT nIndex;
- LPWSTR lpTextW;
-
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, FALSE);
- if (nIndex == -1)
- return -1;
-
- lpTextW = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]);
-
- return WideCharToMultiByte( CP_ACP, 0, lpTextW, -1,
- lpText, lpText ? 0x7fffffff : 0, NULL, NULL ) - 1;
-}
-
-
-static LRESULT
-TOOLBAR_GetButtonTextW (const TOOLBAR_INFO *infoPtr, INT Id, LPWSTR lpStr)
+TOOLBAR_GetButtonText (const TOOLBAR_INFO *infoPtr, INT Id, LPWSTR lpStr, BOOL isW)
{
INT nIndex;
LPWSTR lpText;
@@ -3415,14 +3396,17 @@ TOOLBAR_GetButtonTextW (const TOOLBAR_INFO *infoPtr, INT Id, LPWSTR lpStr)
lpText = TOOLBAR_GetText(infoPtr,&infoPtr->buttons[nIndex]);
- if (lpText)
+ if (isW)
{
- ret = strlenW (lpText);
-
- if (lpStr)
- strcpyW (lpStr, lpText);
+ if (lpText)
+ {
+ ret = strlenW (lpText);
+ if (lpStr) strcpyW (lpStr, lpText);
+ }
}
-
+ else
+ ret = WideCharToMultiByte( CP_ACP, 0, lpText, -1,
+ (LPSTR)lpStr, lpStr ? 0x7fffffff : 0, NULL, NULL ) - 1;
return ret;
}
@@ -3996,7 +3980,7 @@ TOOLBAR_ReplaceBitmap (TOOLBAR_INFO *infoPtr, const TBREPLACEBITMAP *lpReplace)
FIXME("changing standard bitmaps not implemented\n");
return FALSE;
}
- else if (lpReplace->hInstOld != 0)
+ else if (lpReplace->hInstOld != 0 && lpReplace->hInstOld != lpReplace->hInstNew)
FIXME("resources not in the current module not implemented\n");
TRACE("To be replaced hInstOld %p nIDOld %lx\n", lpReplace->hInstOld, lpReplace->nIDOld);
@@ -4158,7 +4142,7 @@ TOOLBAR_Restore(TOOLBAR_INFO *infoPtr, const TBSAVEPARAMSW *lpSave)
/* can't contain real string as we don't know whether
* the client put an ANSI or Unicode string in there */
- if (HIWORD(nmtbr.tbButton.iString))
+ if (!IS_INTRESOURCE(nmtbr.tbButton.iString))
nmtbr.tbButton.iString = 0;
TOOLBAR_InsertButtonT(infoPtr, -1, &nmtbr.tbButton, TRUE);
@@ -4301,58 +4285,8 @@ TOOLBAR_SetBitmapSize (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
-TOOLBAR_SetButtonInfoA (TOOLBAR_INFO *infoPtr, INT Id, const TBBUTTONINFOA *lptbbi)
-{
- TBUTTON_INFO *btnPtr;
- INT nIndex;
- RECT oldBtnRect;
-
- if (lptbbi == NULL)
- return FALSE;
- if (lptbbi->cbSize < sizeof(TBBUTTONINFOA))
- return FALSE;
-
- nIndex = TOOLBAR_GetButtonIndex (infoPtr, Id, lptbbi->dwMask & TBIF_BYINDEX);
- if (nIndex == -1)
- return FALSE;
-
- btnPtr = &infoPtr->buttons[nIndex];
- if (lptbbi->dwMask & TBIF_COMMAND)
- btnPtr->idCommand = lptbbi->idCommand;
- if (lptbbi->dwMask & TBIF_IMAGE)
- btnPtr->iBitmap = lptbbi->iImage;
- if (lptbbi->dwMask & TBIF_LPARAM)
- btnPtr->dwData = lptbbi->lParam;
- if (lptbbi->dwMask & TBIF_SIZE)
- btnPtr->cx = lptbbi->cx;
- if (lptbbi->dwMask & TBIF_STATE)
- btnPtr->fsState = lptbbi->fsState;
- if (lptbbi->dwMask & TBIF_STYLE)
- btnPtr->fsStyle = lptbbi->fsStyle;
-
- if ((lptbbi->dwMask & TBIF_TEXT) && ((INT_PTR)lptbbi->pszText != -1)) {
- if ((HIWORD(btnPtr->iString) == 0) || (btnPtr->iString == -1))
- /* iString is index, zero it to make Str_SetPtr succeed */
- btnPtr->iString=0;
-
- Str_SetPtrAtoW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText);
- }
-
- /* save the button rect to see if we need to redraw the whole toolbar */
- oldBtnRect = btnPtr->rect;
- TOOLBAR_LayoutToolbar(infoPtr);
-
- if (!EqualRect(&oldBtnRect, &btnPtr->rect))
- InvalidateRect(infoPtr->hwndSelf, NULL, TRUE);
- else
- InvalidateRect(infoPtr->hwndSelf, &btnPtr->rect, TRUE);
-
- return TRUE;
-}
-
-
-static LRESULT
-TOOLBAR_SetButtonInfoW (TOOLBAR_INFO *infoPtr, INT Id, const TBBUTTONINFOW *lptbbi)
+TOOLBAR_SetButtonInfo (TOOLBAR_INFO *infoPtr, INT Id,
+ const TBBUTTONINFOW *lptbbi, BOOL isW)
{
TBUTTON_INFO *btnPtr;
INT nIndex;
@@ -4382,10 +4316,13 @@ TOOLBAR_SetButtonInfoW (TOOLBAR_INFO *infoPtr, INT Id, const TBBUTTONINFOW *lptb
btnPtr->fsStyle = lptbbi->fsStyle;
if ((lptbbi->dwMask & TBIF_TEXT) && ((INT_PTR)lptbbi->pszText != -1)) {
- if ((HIWORD(btnPtr->iString) == 0) || (btnPtr->iString == -1))
- /* iString is index, zero it to make Str_SetPtr succeed */
- btnPtr->iString=0;
- Str_SetPtrW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText);
+ /* iString is index, zero it to make Str_SetPtr succeed */
+ if (!TOOLBAR_ButtonHasString(btnPtr)) btnPtr->iString = 0;
+
+ if (isW)
+ Str_SetPtrW ((LPWSTR *)&btnPtr->iString, lptbbi->pszText);
+ else
+ Str_SetPtrAtoW ((LPWSTR *)&btnPtr->iString, (LPSTR)lptbbi->pszText);
}
/* save the button rect to see if we need to redraw the whole toolbar */
@@ -5205,7 +5142,7 @@ TOOLBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->dwStyle = dwStyle;
GetClientRect(hwnd, &infoPtr->client_rect);
infoPtr->bUnicode = infoPtr->hwndNotify &&
- (NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, (LPARAM)NF_REQUERY));
+ (NFR_UNICODE == SendMessageW(hwnd, WM_NOTIFYFORMAT, (WPARAM)hwnd, NF_REQUERY));
infoPtr->hwndToolTip = NULL; /* if needed the tooltip control will be created after a WM_MOUSEMOVE */
SystemParametersInfoW (SPI_GETICONTITLELOGFONT, 0, &logFont, 0);
@@ -5222,6 +5159,8 @@ TOOLBAR_Create (HWND hwnd, const CREATESTRUCTW *lpcs)
static LRESULT
TOOLBAR_Destroy (TOOLBAR_INFO *infoPtr)
{
+ INT i;
+
/* delete tooltip control */
if (infoPtr->hwndToolTip)
DestroyWindow (infoPtr->hwndToolTip);
@@ -5231,11 +5170,13 @@ TOOLBAR_Destroy (TOOLBAR_INFO *infoPtr)
Free (infoPtr->bitmaps); /* bitmaps list */
/* delete button data */
+ for (i = 0; i < infoPtr->nNumButtons; i++)
+ if (TOOLBAR_ButtonHasString(&infoPtr->buttons[i]))
+ Free ((LPWSTR)infoPtr->buttons[i].iString);
Free (infoPtr->buttons);
/* delete strings */
if (infoPtr->strings) {
- INT i;
for (i = 0; i < infoPtr->nNumStrings; i++)
Free (infoPtr->strings[i]);
@@ -5648,7 +5589,7 @@ TOOLBAR_LButtonUp (TOOLBAR_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
else
{
TRACE("button %d dragged out of toolbar\n", infoPtr->nButtonDrag);
- TOOLBAR_DeleteButton(infoPtr, (WPARAM)infoPtr->nButtonDrag);
+ TOOLBAR_DeleteButton(infoPtr, infoPtr->nButtonDrag);
}
/* button under cursor changed so need to re-set hot item */
@@ -6156,7 +6097,7 @@ static LRESULT TOOLBAR_TTGetDispInfo (TOOLBAR_INFO *infoPtr, NMTTDISPINFOW *lpnm
return 0;
}
}
- else if (tbgit.pszText[0])
+ else if (tbgit.pszText && tbgit.pszText[0])
{
MultiByteToWideChar(CP_ACP, 0, tbgit.pszText, -1,
lpnmtdi->lpszText, sizeof(lpnmtdi->szText)/sizeof(lpnmtdi->szText[0]));
@@ -6434,7 +6375,7 @@ TOOLBAR_StyleChanged (TOOLBAR_INFO *infoPtr, INT nType, const STYLESTRUCT *lpSty
static LRESULT
-TOOLBAR_SysColorChange ()
+TOOLBAR_SysColorChange (void)
{
COMCTL32_RefreshSysColors();
@@ -6469,11 +6410,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_AddBitmap (infoPtr, (INT)wParam, (TBADDBITMAP*)lParam);
case TB_ADDBUTTONSA:
- return TOOLBAR_AddButtonsT(infoPtr, wParam, (LPTBBUTTON)lParam, FALSE);
-
case TB_ADDBUTTONSW:
- return TOOLBAR_AddButtonsT(infoPtr, wParam, (LPTBBUTTON)lParam, TRUE);
-
+ return TOOLBAR_AddButtonsT (infoPtr, wParam, (LPTBBUTTON)lParam,
+ uMsg == TB_ADDBUTTONSW);
case TB_ADDSTRINGA:
return TOOLBAR_AddStringA (infoPtr, (HINSTANCE)wParam, lParam);
@@ -6520,19 +6459,16 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_GetButton (infoPtr, wParam, (TBBUTTON*)lParam);
case TB_GETBUTTONINFOA:
- return TOOLBAR_GetButtonInfoT(infoPtr, wParam, (LPTBBUTTONINFOW)lParam, FALSE);
-
case TB_GETBUTTONINFOW:
- return TOOLBAR_GetButtonInfoT(infoPtr, wParam, (LPTBBUTTONINFOW)lParam, TRUE);
-
+ return TOOLBAR_GetButtonInfoT (infoPtr, wParam, (LPTBBUTTONINFOW)lParam,
+ uMsg == TB_GETBUTTONINFOW);
case TB_GETBUTTONSIZE:
return TOOLBAR_GetButtonSize (infoPtr);
case TB_GETBUTTONTEXTA:
- return TOOLBAR_GetButtonTextA (infoPtr, wParam, (LPSTR)lParam);
-
case TB_GETBUTTONTEXTW:
- return TOOLBAR_GetButtonTextW (infoPtr, wParam, (LPWSTR)lParam);
+ return TOOLBAR_GetButtonText (infoPtr, wParam, (LPWSTR)lParam,
+ uMsg == TB_GETBUTTONTEXTW);
case TB_GETDISABLEDIMAGELIST:
return TOOLBAR_GetDisabledImageList (infoPtr, wParam);
@@ -6603,10 +6539,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_Indeterminate (infoPtr, wParam, LOWORD(lParam));
case TB_INSERTBUTTONA:
- return TOOLBAR_InsertButtonT(infoPtr, wParam, (TBBUTTON*)lParam, FALSE);
-
case TB_INSERTBUTTONW:
- return TOOLBAR_InsertButtonT(infoPtr, wParam, (TBBUTTON*)lParam, TRUE);
+ return TOOLBAR_InsertButtonT(infoPtr, wParam, (TBBUTTON*)lParam,
+ uMsg == TB_INSERTBUTTONW);
/* case TB_INSERTMARKHITTEST: */ /* 4.71 */
@@ -6660,11 +6595,9 @@ ToolbarWindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLBAR_SetBitmapSize (infoPtr, wParam, lParam);
case TB_SETBUTTONINFOA:
- return TOOLBAR_SetButtonInfoA (infoPtr, wParam, (LPTBBUTTONINFOA)lParam);
-
case TB_SETBUTTONINFOW:
- return TOOLBAR_SetButtonInfoW (infoPtr, wParam, (LPTBBUTTONINFOW)lParam);
-
+ return TOOLBAR_SetButtonInfo (infoPtr, wParam, (LPTBBUTTONINFOW)lParam,
+ uMsg == TB_SETBUTTONINFOW);
case TB_SETBUTTONSIZE:
return TOOLBAR_SetButtonSize (infoPtr, lParam);
diff --git a/dll/win32/comctl32/tooltips.c b/dll/win32/comctl32/tooltips.c
index d19d0bc9ea3..688d3b5ec44 100644
--- a/dll/win32/comctl32/tooltips.c
+++ b/dll/win32/comctl32/tooltips.c
@@ -175,6 +175,14 @@ static LRESULT CALLBACK
TOOLTIPS_SubclassProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uId, DWORD_PTR dwRef);
+static inline BOOL TOOLTIPS_IsCallbackString(LPCWSTR str, BOOL isW)
+{
+ if (isW)
+ return str == LPSTR_TEXTCALLBACKW;
+ else
+ return (LPCSTR)str == LPSTR_TEXTCALLBACKA;
+}
+
static inline UINT_PTR
TOOLTIPS_GetTitleIconIndex(HICON hIcon)
{
@@ -205,15 +213,12 @@ TOOLTIPS_InitSystemSettings (TOOLTIPS_INFO *infoPtr)
/* Custom draw routines */
static void
-TOOLTIPS_customdraw_fill(NMTTCUSTOMDRAW *lpnmttcd,
- const HWND hwnd,
+TOOLTIPS_customdraw_fill(const TOOLTIPS_INFO *infoPtr, NMTTCUSTOMDRAW *lpnmttcd,
HDC hdc, const RECT *rcBounds, UINT uFlags)
{
- TOOLTIPS_INFO *infoPtr = TOOLTIPS_GetInfoPtr(hwnd);
-
ZeroMemory(lpnmttcd, sizeof(NMTTCUSTOMDRAW));
lpnmttcd->uDrawFlags = uFlags;
- lpnmttcd->nmcd.hdr.hwndFrom = hwnd;
+ lpnmttcd->nmcd.hdr.hwndFrom = infoPtr->hwndSelf;
lpnmttcd->nmcd.hdr.code = NM_CUSTOMDRAW;
if (infoPtr->nCurrentTool != -1) {
TTTOOL_INFO *toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
@@ -268,7 +273,7 @@ TOOLTIPS_Refresh (const TOOLTIPS_INFO *infoPtr, HDC hdc)
/* Custom draw - Call PrePaint once initial properties set up */
/* Note: Contrary to MSDN, CDRF_SKIPDEFAULT still draws a tooltip */
- TOOLTIPS_customdraw_fill(&nmttcd, infoPtr->hwndSelf, hdc, &rc, uFlags);
+ TOOLTIPS_customdraw_fill(infoPtr, &nmttcd, hdc, &rc, uFlags);
cdmode = TOOLTIPS_notify_customdraw(CDDS_PREPAINT, &nmttcd);
uFlags = nmttcd.uDrawFlags;
@@ -878,36 +883,10 @@ TOOLTIPS_TrackHide (const TOOLTIPS_INFO *infoPtr)
SWP_NOZORDER | SWP_HIDEWINDOW | SWP_NOACTIVATE);
}
-
+/* Structure layout is the same for TTTOOLINFOW and TTTOOLINFOA,
+ this helper is used in both cases. */
static INT
-TOOLTIPS_GetToolFromInfoA (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
-{
- TTTOOL_INFO *toolPtr;
- UINT nTool;
-
- for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
- toolPtr = &infoPtr->tools[nTool];
-
- if (!(toolPtr->uFlags & TTF_IDISHWND) &&
- (lpToolInfo->hwnd == toolPtr->hwnd) &&
- (lpToolInfo->uId == toolPtr->uId))
- return nTool;
- }
-
- for (nTool = 0; nTool < infoPtr->uNumTools; nTool++) {
- toolPtr = &infoPtr->tools[nTool];
-
- if ((toolPtr->uFlags & TTF_IDISHWND) &&
- (lpToolInfo->uId == toolPtr->uId))
- return nTool;
- }
-
- return -1;
-}
-
-
-static INT
-TOOLTIPS_GetToolFromInfoW (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
+TOOLTIPS_GetToolFromInfoT (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
{
TTTOOL_INFO *toolPtr;
UINT nTool;
@@ -1020,19 +999,16 @@ TOOLTIPS_Activate (TOOLTIPS_INFO *infoPtr, BOOL activate)
static LRESULT
-TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
+TOOLTIPS_AddToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
{
TTTOOL_INFO *toolPtr;
INT nResult;
- if (lpToolInfo == NULL)
- return FALSE;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
- return FALSE;
+ if (!ti) return FALSE;
TRACE("add tool (%p) %p %ld%s!\n",
- infoPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
- (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
+ infoPtr->hwndSelf, ti->hwnd, ti->uId,
+ (ti->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
if (infoPtr->uNumTools == 0) {
infoPtr->tools = Alloc (sizeof(TTTOOL_INFO));
@@ -1051,39 +1027,43 @@ TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
infoPtr->uNumTools++;
/* copy tool data */
- toolPtr->uFlags = lpToolInfo->uFlags;
- toolPtr->hwnd = lpToolInfo->hwnd;
- toolPtr->uId = lpToolInfo->uId;
- toolPtr->rect = lpToolInfo->rect;
- toolPtr->hinst = lpToolInfo->hinst;
+ toolPtr->uFlags = ti->uFlags;
+ toolPtr->hwnd = ti->hwnd;
+ toolPtr->uId = ti->uId;
+ toolPtr->rect = ti->rect;
+ toolPtr->hinst = ti->hinst;
- if (IS_INTRESOURCE(lpToolInfo->lpszText)) {
- TRACE("add string id %x!\n", LOWORD(lpToolInfo->lpszText));
- toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
+ if (IS_INTRESOURCE(ti->lpszText)) {
+ TRACE("add string id %x\n", LOWORD(ti->lpszText));
+ toolPtr->lpszText = ti->lpszText;
}
- else if (lpToolInfo->lpszText) {
- if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA) {
+ else if (ti->lpszText) {
+ if (TOOLTIPS_IsCallbackString(ti->lpszText, isW)) {
TRACE("add CALLBACK!\n");
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
}
+ else if (isW) {
+ INT len = lstrlenW (ti->lpszText);
+ TRACE("add text %s!\n", debugstr_w(ti->lpszText));
+ toolPtr->lpszText = Alloc ((len + 1)*sizeof(WCHAR));
+ strcpyW (toolPtr->lpszText, ti->lpszText);
+ }
else {
- INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1,
- NULL, 0);
- TRACE("add text \"%s\"!\n", lpToolInfo->lpszText);
+ INT len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText, -1, NULL, 0);
+ TRACE("add text \"%s\"!\n", (LPSTR)ti->lpszText);
toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1,
- toolPtr->lpszText, len);
+ MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText, -1, toolPtr->lpszText, len);
}
}
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA))
- toolPtr->lParam = lpToolInfo->lParam;
+ if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
+ toolPtr->lParam = ti->lParam;
/* install subclassing hook */
if (toolPtr->uFlags & TTF_SUBCLASS) {
if (toolPtr->uFlags & TTF_IDISHWND) {
SetWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)infoPtr->hwndSelf);
+ (DWORD_PTR)infoPtr->hwndSelf);
}
else {
SetWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1,
@@ -1092,8 +1072,8 @@ TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
TRACE("subclassing installed!\n");
}
- nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
- (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
+ nResult = SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
+ (WPARAM)infoPtr->hwndSelf, NF_QUERY);
if (nResult == NFR_ANSI) {
toolPtr->bNotifyUnicode = FALSE;
TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
@@ -1109,102 +1089,24 @@ TOOLTIPS_AddToolA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
static LRESULT
-TOOLTIPS_AddToolW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
+TOOLTIPS_DelToolT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
{
TTTOOL_INFO *toolPtr;
- INT nResult;
+ INT nTool;
- if (lpToolInfo == NULL)
- return FALSE;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return FALSE;
+ if (!ti) return 0;
+ if (isW && ti->cbSize > TTTOOLINFOW_V2_SIZE &&
+ ti->cbSize != TTTOOLINFOW_V3_SIZE)
+ return 0;
+ if (infoPtr->uNumTools == 0)
+ return 0;
- TRACE("add tool (%p) %p %ld%s!\n",
- infoPtr->hwndSelf, lpToolInfo->hwnd, lpToolInfo->uId,
- (lpToolInfo->uFlags & TTF_IDISHWND) ? " TTF_IDISHWND" : "");
-
- if (infoPtr->uNumTools == 0) {
- infoPtr->tools = Alloc (sizeof(TTTOOL_INFO));
- toolPtr = infoPtr->tools;
- }
- else {
- TTTOOL_INFO *oldTools = infoPtr->tools;
- infoPtr->tools =
- Alloc (sizeof(TTTOOL_INFO) * (infoPtr->uNumTools + 1));
- memcpy (infoPtr->tools, oldTools,
- infoPtr->uNumTools * sizeof(TTTOOL_INFO));
- Free (oldTools);
- toolPtr = &infoPtr->tools[infoPtr->uNumTools];
- }
-
- infoPtr->uNumTools++;
-
- /* copy tool data */
- toolPtr->uFlags = lpToolInfo->uFlags;
- toolPtr->hwnd = lpToolInfo->hwnd;
- toolPtr->uId = lpToolInfo->uId;
- toolPtr->rect = lpToolInfo->rect;
- toolPtr->hinst = lpToolInfo->hinst;
-
- if (IS_INTRESOURCE(lpToolInfo->lpszText)) {
- TRACE("add string id %x\n", LOWORD(lpToolInfo->lpszText));
- toolPtr->lpszText = lpToolInfo->lpszText;
- }
- else if (lpToolInfo->lpszText) {
- if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW) {
- TRACE("add CALLBACK!\n");
- toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
- }
- else {
- INT len = lstrlenW (lpToolInfo->lpszText);
- TRACE("add text %s!\n",
- debugstr_w(lpToolInfo->lpszText));
- toolPtr->lpszText = Alloc ((len + 1)*sizeof(WCHAR));
- strcpyW (toolPtr->lpszText, lpToolInfo->lpszText);
- }
- }
-
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW))
- toolPtr->lParam = lpToolInfo->lParam;
-
- /* install subclassing hook */
- if (toolPtr->uFlags & TTF_SUBCLASS) {
- if (toolPtr->uFlags & TTF_IDISHWND) {
- SetWindowSubclass((HWND)toolPtr->uId, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)infoPtr->hwndSelf);
- }
- else {
- SetWindowSubclass(toolPtr->hwnd, TOOLTIPS_SubclassProc, 1,
- (DWORD_PTR)infoPtr->hwndSelf);
- }
- TRACE("subclassing installed!\n");
- }
-
- nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
- (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
- if (nResult == NFR_ANSI) {
- toolPtr->bNotifyUnicode = FALSE;
- TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
- } else if (nResult == NFR_UNICODE) {
- toolPtr->bNotifyUnicode = TRUE;
- TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
- } else {
- TRACE (" -- WM_NOTIFYFORMAT returns: error!\n");
- }
-
- return TRUE;
-}
-
-
-static void
-TOOLTIPS_DelToolCommon (TOOLTIPS_INFO *infoPtr, INT nTool)
-{
- TTTOOL_INFO *toolPtr;
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, ti);
TRACE("tool %d\n", nTool);
if (nTool == -1)
- return;
+ return 0;
/* make sure the tooltip has disappeared before deleting it */
TOOLTIPS_Hide(infoPtr);
@@ -1270,56 +1172,18 @@ TOOLTIPS_DelToolCommon (TOOLTIPS_INFO *infoPtr, INT nTool)
infoPtr->nCurrentTool--;
infoPtr->uNumTools--;
-}
-
-static LRESULT
-TOOLTIPS_DelToolA (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
-{
- INT nTool;
-
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
- return 0;
- if (infoPtr->uNumTools == 0)
- return 0;
-
- nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
-
- TOOLTIPS_DelToolCommon (infoPtr, nTool);
return 0;
}
-
static LRESULT
-TOOLTIPS_DelToolW (TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
-{
- INT nTool;
-
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return 0;
- if (infoPtr->uNumTools == 0)
- return 0;
-
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
-
- TOOLTIPS_DelToolCommon (infoPtr, nTool);
-
- return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_EnumToolsA (const TOOLTIPS_INFO *infoPtr, UINT uIndex, LPTTTOOLINFOA lpToolInfo)
+TOOLTIPS_EnumToolsT (const TOOLTIPS_INFO *infoPtr, UINT uIndex, TTTOOLINFOW *ti,
+ BOOL isW)
{
TTTOOL_INFO *toolPtr;
- if (lpToolInfo == NULL)
- return FALSE;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (!ti) return FALSE;
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
if (uIndex >= infoPtr->uNumTools)
return FALSE;
@@ -1329,48 +1193,16 @@ TOOLTIPS_EnumToolsA (const TOOLTIPS_INFO *infoPtr, UINT uIndex, LPTTTOOLINFOA lp
toolPtr = &infoPtr->tools[uIndex];
/* copy tool data */
- lpToolInfo->uFlags = toolPtr->uFlags;
- lpToolInfo->hwnd = toolPtr->hwnd;
- lpToolInfo->uId = toolPtr->uId;
- lpToolInfo->rect = toolPtr->rect;
- lpToolInfo->hinst = toolPtr->hinst;
-/* lpToolInfo->lpszText = toolPtr->lpszText; */
- lpToolInfo->lpszText = NULL; /* FIXME */
+ ti->uFlags = toolPtr->uFlags;
+ ti->hwnd = toolPtr->hwnd;
+ ti->uId = toolPtr->uId;
+ ti->rect = toolPtr->rect;
+ ti->hinst = toolPtr->hinst;
+/* ti->lpszText = toolPtr->lpszText; */
+ ti->lpszText = NULL; /* FIXME */
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA))
- lpToolInfo->lParam = toolPtr->lParam;
-
- return TRUE;
-}
-
-
-static LRESULT
-TOOLTIPS_EnumToolsW (const TOOLTIPS_INFO *infoPtr, UINT uIndex, LPTTTOOLINFOW lpToolInfo)
-{
- TTTOOL_INFO *toolPtr;
-
- if (lpToolInfo == NULL)
- return FALSE;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return FALSE;
- if (uIndex >= infoPtr->uNumTools)
- return FALSE;
-
- TRACE("index=%u\n", uIndex);
-
- toolPtr = &infoPtr->tools[uIndex];
-
- /* copy tool data */
- lpToolInfo->uFlags = toolPtr->uFlags;
- lpToolInfo->hwnd = toolPtr->hwnd;
- lpToolInfo->uId = toolPtr->uId;
- lpToolInfo->rect = toolPtr->rect;
- lpToolInfo->hinst = toolPtr->hinst;
-/* lpToolInfo->lpszText = toolPtr->lpszText; */
- lpToolInfo->lpszText = NULL; /* FIXME */
-
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW))
- lpToolInfo->lParam = toolPtr->lParam;
+ if (ti->cbSize >= TTTOOLINFOA_V2_SIZE)
+ ti->lParam = toolPtr->lParam;
return TRUE;
}
@@ -1386,7 +1218,7 @@ TOOLTIPS_GetBubbleSize (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolI
if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, lpToolInfo);
if (nTool == -1) return 0;
TRACE("tool %d\n", nTool);
@@ -1398,58 +1230,26 @@ TOOLTIPS_GetBubbleSize (const TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolI
}
static LRESULT
-TOOLTIPS_GetCurrentToolA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
+TOOLTIPS_GetCurrentToolT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
{
TTTOOL_INFO *toolPtr;
- if (lpToolInfo) {
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (ti) {
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
if (infoPtr->nCurrentTool > -1) {
toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
/* copy tool data */
- lpToolInfo->uFlags = toolPtr->uFlags;
- lpToolInfo->rect = toolPtr->rect;
- lpToolInfo->hinst = toolPtr->hinst;
-/* lpToolInfo->lpszText = toolPtr->lpszText; */
- lpToolInfo->lpszText = NULL; /* FIXME */
+ ti->uFlags = toolPtr->uFlags;
+ ti->rect = toolPtr->rect;
+ ti->hinst = toolPtr->hinst;
+/* ti->lpszText = toolPtr->lpszText; */
+ ti->lpszText = NULL; /* FIXME */
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA))
- lpToolInfo->lParam = toolPtr->lParam;
-
- return TRUE;
- }
- else
- return FALSE;
- }
- else
- return (infoPtr->nCurrentTool != -1);
-}
-
-
-static LRESULT
-TOOLTIPS_GetCurrentToolW (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
-{
- TTTOOL_INFO *toolPtr;
-
- if (lpToolInfo) {
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return FALSE;
-
- if (infoPtr->nCurrentTool > -1) {
- toolPtr = &infoPtr->tools[infoPtr->nCurrentTool];
-
- /* copy tool data */
- lpToolInfo->uFlags = toolPtr->uFlags;
- lpToolInfo->rect = toolPtr->rect;
- lpToolInfo->hinst = toolPtr->hinst;
-/* lpToolInfo->lpszText = toolPtr->lpszText; */
- lpToolInfo->lpszText = NULL; /* FIXME */
-
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW))
- lpToolInfo->lParam = toolPtr->lParam;
+ if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
+ ti->lParam = toolPtr->lParam;
return TRUE;
}
@@ -1504,50 +1304,36 @@ TOOLTIPS_GetMaxTipWidth (const TOOLTIPS_INFO *infoPtr)
static LRESULT
-TOOLTIPS_GetTextA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
-{
- WCHAR buffer[INFOTIPSIZE];
- INT nTool;
-
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
- return 0;
-
- nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
- if (nTool == -1) return 0;
-
- /* NB this API is broken, there is no way for the app to determine
- what size buffer it requires nor a way to specify how long the
- one it supplies is. We'll assume it's up to INFOTIPSIZE */
-
- buffer[0] = '\0';
- TOOLTIPS_GetTipText(infoPtr, nTool, buffer);
- WideCharToMultiByte(CP_ACP, 0, buffer, -1, lpToolInfo->lpszText,
- INFOTIPSIZE, NULL, NULL);
-
- return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_GetTextW (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
+TOOLTIPS_GetTextT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
{
INT nTool;
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
+ if (!ti) return 0;
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return 0;
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, ti);
if (nTool == -1) return 0;
if (infoPtr->tools[nTool].lpszText == NULL)
return 0;
- lpToolInfo->lpszText[0] = '\0';
- TOOLTIPS_GetTipText(infoPtr, nTool, lpToolInfo->lpszText);
+ if (isW) {
+ ti->lpszText[0] = '\0';
+ TOOLTIPS_GetTipText(infoPtr, nTool, ti->lpszText);
+ }
+ else {
+ WCHAR buffer[INFOTIPSIZE];
+
+ /* NB this API is broken, there is no way for the app to determine
+ what size buffer it requires nor a way to specify how long the
+ one it supplies is. We'll assume it's up to INFOTIPSIZE */
+
+ buffer[0] = '\0';
+ TOOLTIPS_GetTipText(infoPtr, nTool, buffer);
+ WideCharToMultiByte(CP_ACP, 0, buffer, -1, (LPSTR)ti->lpszText,
+ INFOTIPSIZE, NULL, NULL);
+ }
return 0;
}
@@ -1575,19 +1361,18 @@ TOOLTIPS_GetToolCount (const TOOLTIPS_INFO *infoPtr)
static LRESULT
-TOOLTIPS_GetToolInfoA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
+TOOLTIPS_GetToolInfoT (const TOOLTIPS_INFO *infoPtr, TTTOOLINFOW *ti, BOOL isW)
{
TTTOOL_INFO *toolPtr;
INT nTool;
- if (lpToolInfo == NULL)
- return FALSE;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (!ti) return FALSE;
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
if (infoPtr->uNumTools == 0)
return FALSE;
- nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, ti);
if (nTool == -1)
return FALSE;
@@ -1596,56 +1381,22 @@ TOOLTIPS_GetToolInfoA (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOA lpToolInfo)
toolPtr = &infoPtr->tools[nTool];
/* copy tool data */
- lpToolInfo->uFlags = toolPtr->uFlags;
- lpToolInfo->rect = toolPtr->rect;
- lpToolInfo->hinst = toolPtr->hinst;
+ ti->uFlags = toolPtr->uFlags;
+ ti->rect = toolPtr->rect;
+ ti->hinst = toolPtr->hinst;
/* lpToolInfo->lpszText = toolPtr->lpszText; */
- lpToolInfo->lpszText = NULL; /* FIXME */
+ ti->lpszText = NULL; /* FIXME */
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA))
- lpToolInfo->lParam = toolPtr->lParam;
+ if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
+ ti->lParam = toolPtr->lParam;
return TRUE;
}
static LRESULT
-TOOLTIPS_GetToolInfoW (const TOOLTIPS_INFO *infoPtr, LPTTTOOLINFOW lpToolInfo)
-{
- TTTOOL_INFO *toolPtr;
- INT nTool;
-
- if (lpToolInfo == NULL)
- return FALSE;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return FALSE;
- if (infoPtr->uNumTools == 0)
- return FALSE;
-
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
- if (nTool == -1)
- return FALSE;
-
- TRACE("tool %d\n", nTool);
-
- toolPtr = &infoPtr->tools[nTool];
-
- /* copy tool data */
- lpToolInfo->uFlags = toolPtr->uFlags;
- lpToolInfo->rect = toolPtr->rect;
- lpToolInfo->hinst = toolPtr->hinst;
-/* lpToolInfo->lpszText = toolPtr->lpszText; */
- lpToolInfo->lpszText = NULL; /* FIXME */
-
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW))
- lpToolInfo->lParam = toolPtr->lParam;
-
- return TRUE;
-}
-
-
-static LRESULT
-TOOLTIPS_HitTestA (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOA lptthit)
+TOOLTIPS_HitTestT (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW lptthit,
+ BOOL isW)
{
TTTOOL_INFO *toolPtr;
INT nTool;
@@ -1660,7 +1411,7 @@ TOOLTIPS_HitTestA (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOA lptthit)
TRACE("tool %d!\n", nTool);
/* copy tool data */
- if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOA)) {
+ if (lptthit->ti.cbSize >= TTTOOLINFOW_V1_SIZE) {
toolPtr = &infoPtr->tools[nTool];
lptthit->ti.uFlags = toolPtr->uFlags;
@@ -1670,7 +1421,8 @@ TOOLTIPS_HitTestA (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOA lptthit)
lptthit->ti.hinst = toolPtr->hinst;
/* lptthit->ti.lpszText = toolPtr->lpszText; */
lptthit->ti.lpszText = NULL; /* FIXME */
- lptthit->ti.lParam = toolPtr->lParam;
+ if (lptthit->ti.cbSize >= TTTOOLINFOW_V2_SIZE)
+ lptthit->ti.lParam = toolPtr->lParam;
}
return TRUE;
@@ -1678,77 +1430,21 @@ TOOLTIPS_HitTestA (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOA lptthit)
static LRESULT
-TOOLTIPS_HitTestW (const TOOLTIPS_INFO *infoPtr, LPTTHITTESTINFOW lptthit)
-{
- TTTOOL_INFO *toolPtr;
- INT nTool;
-
- if (lptthit == 0)
- return FALSE;
-
- nTool = TOOLTIPS_GetToolFromPoint (infoPtr, lptthit->hwnd, &lptthit->pt);
- if (nTool == -1)
- return FALSE;
-
- TRACE("tool %d!\n", nTool);
-
- /* copy tool data */
- if (lptthit->ti.cbSize >= sizeof(TTTOOLINFOW)) {
- toolPtr = &infoPtr->tools[nTool];
-
- lptthit->ti.uFlags = toolPtr->uFlags;
- lptthit->ti.hwnd = toolPtr->hwnd;
- lptthit->ti.uId = toolPtr->uId;
- lptthit->ti.rect = toolPtr->rect;
- lptthit->ti.hinst = toolPtr->hinst;
-/* lptthit->ti.lpszText = toolPtr->lpszText; */
- lptthit->ti.lpszText = NULL; /* FIXME */
- lptthit->ti.lParam = toolPtr->lParam;
- }
-
- return TRUE;
-}
-
-
-static LRESULT
-TOOLTIPS_NewToolRectA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpti)
+TOOLTIPS_NewToolRectT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
{
INT nTool;
- if (lpti == NULL)
- return 0;
- if (lpti->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (!ti) return 0;
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
- nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpti);
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, ti);
- TRACE("nTool = %d, rect = %s\n", nTool, wine_dbgstr_rect(&lpti->rect));
+ TRACE("nTool = %d, rect = %s\n", nTool, wine_dbgstr_rect(&ti->rect));
if (nTool == -1) return 0;
- infoPtr->tools[nTool].rect = lpti->rect;
-
- return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_NewToolRectW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpti)
-{
- INT nTool;
-
- if (lpti == NULL)
- return 0;
- if (lpti->cbSize < TTTOOLINFOW_V1_SIZE)
- return FALSE;
-
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpti);
-
- TRACE("nTool = %d, rect = %s\n", nTool, wine_dbgstr_rect(&lpti->rect));
-
- if (nTool == -1) return 0;
-
- infoPtr->tools[nTool].rect = lpti->rect;
+ infoPtr->tools[nTool].rect = ti->rect;
return 0;
}
@@ -1908,37 +1604,8 @@ TOOLTIPS_SetTipTextColor (TOOLTIPS_INFO *infoPtr, COLORREF clrText)
static LRESULT
-TOOLTIPS_SetTitleA (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCSTR pszTitle)
-{
- UINT size;
-
- TRACE("hwnd = %p, title = %s, icon = %p\n", infoPtr->hwndSelf, debugstr_a(pszTitle),
- (void*)uTitleIcon);
-
- Free(infoPtr->pszTitle);
-
- if (pszTitle)
- {
- size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, NULL, 0);
- infoPtr->pszTitle = Alloc(size);
- if (!infoPtr->pszTitle)
- return FALSE;
- MultiByteToWideChar(CP_ACP, 0, pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR));
- }
- else
- infoPtr->pszTitle = NULL;
-
- if (uTitleIcon <= TTI_ERROR)
- infoPtr->hTitleIcon = hTooltipIcons[uTitleIcon];
- else
- infoPtr->hTitleIcon = CopyIcon((HICON)uTitleIcon);
-
- return TRUE;
-}
-
-
-static LRESULT
-TOOLTIPS_SetTitleW (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCWSTR pszTitle)
+TOOLTIPS_SetTitleT (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCWSTR pszTitle,
+ BOOL isW)
{
UINT size;
@@ -1949,11 +1616,22 @@ TOOLTIPS_SetTitleW (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCWSTR pszTitl
if (pszTitle)
{
- size = (strlenW(pszTitle)+1)*sizeof(WCHAR);
- infoPtr->pszTitle = Alloc(size);
- if (!infoPtr->pszTitle)
- return FALSE;
- memcpy(infoPtr->pszTitle, pszTitle, size);
+ if (isW)
+ {
+ size = (strlenW(pszTitle)+1)*sizeof(WCHAR);
+ infoPtr->pszTitle = Alloc(size);
+ if (!infoPtr->pszTitle)
+ return FALSE;
+ memcpy(infoPtr->pszTitle, pszTitle, size);
+ }
+ else
+ {
+ size = sizeof(WCHAR)*MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszTitle, -1, NULL, 0);
+ infoPtr->pszTitle = Alloc(size);
+ if (!infoPtr->pszTitle)
+ return FALSE;
+ MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszTitle, -1, infoPtr->pszTitle, size/sizeof(WCHAR));
+ }
}
else
infoPtr->pszTitle = NULL;
@@ -1970,17 +1648,16 @@ TOOLTIPS_SetTitleW (TOOLTIPS_INFO *infoPtr, UINT_PTR uTitleIcon, LPCWSTR pszTitl
static LRESULT
-TOOLTIPS_SetToolInfoA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
+TOOLTIPS_SetToolInfoT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
{
TTTOOL_INFO *toolPtr;
INT nTool;
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (!ti) return 0;
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return 0;
- nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, ti);
if (nTool == -1) return 0;
TRACE("tool %d\n", nTool);
@@ -1988,74 +1665,18 @@ TOOLTIPS_SetToolInfoA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
toolPtr = &infoPtr->tools[nTool];
/* copy tool data */
- toolPtr->uFlags = lpToolInfo->uFlags;
- toolPtr->hwnd = lpToolInfo->hwnd;
- toolPtr->uId = lpToolInfo->uId;
- toolPtr->rect = lpToolInfo->rect;
- toolPtr->hinst = lpToolInfo->hinst;
+ toolPtr->uFlags = ti->uFlags;
+ toolPtr->hwnd = ti->hwnd;
+ toolPtr->uId = ti->uId;
+ toolPtr->rect = ti->rect;
+ toolPtr->hinst = ti->hinst;
- if (IS_INTRESOURCE(lpToolInfo->lpszText)) {
- TRACE("set string id %x\n", LOWORD(lpToolInfo->lpszText));
- toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
- }
- else if (lpToolInfo->lpszText) {
- if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA)
- toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
- else {
- if ( (toolPtr->lpszText) &&
- !IS_INTRESOURCE(toolPtr->lpszText) ) {
- if( toolPtr->lpszText != LPSTR_TEXTCALLBACKW)
- Free (toolPtr->lpszText);
- toolPtr->lpszText = NULL;
- }
- if (lpToolInfo->lpszText) {
- INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText,
- -1, NULL, 0);
- toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1,
- toolPtr->lpszText, len);
- }
- }
- }
-
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOA))
- toolPtr->lParam = lpToolInfo->lParam;
-
- return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
-{
- TTTOOL_INFO *toolPtr;
- INT nTool;
-
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return 0;
-
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
- if (nTool == -1) return 0;
-
- TRACE("tool %d\n", nTool);
-
- toolPtr = &infoPtr->tools[nTool];
-
- /* copy tool data */
- toolPtr->uFlags = lpToolInfo->uFlags;
- toolPtr->hwnd = lpToolInfo->hwnd;
- toolPtr->uId = lpToolInfo->uId;
- toolPtr->rect = lpToolInfo->rect;
- toolPtr->hinst = lpToolInfo->hinst;
-
- if (IS_INTRESOURCE(lpToolInfo->lpszText)) {
- TRACE("set string id %x!\n", LOWORD(lpToolInfo->lpszText));
- toolPtr->lpszText = lpToolInfo->lpszText;
+ if (IS_INTRESOURCE(ti->lpszText)) {
+ TRACE("set string id %x!\n", LOWORD(ti->lpszText));
+ toolPtr->lpszText = ti->lpszText;
}
else {
- if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW)
+ if (TOOLTIPS_IsCallbackString(ti->lpszText, isW))
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
else {
if ( (toolPtr->lpszText) &&
@@ -2064,16 +1685,25 @@ TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
Free (toolPtr->lpszText);
toolPtr->lpszText = NULL;
}
- if (lpToolInfo->lpszText) {
- INT len = lstrlenW (lpToolInfo->lpszText);
- toolPtr->lpszText = Alloc ((len+1)*sizeof(WCHAR));
- strcpyW (toolPtr->lpszText, lpToolInfo->lpszText);
+ if (ti->lpszText) {
+ if (isW) {
+ INT len = lstrlenW (ti->lpszText);
+ toolPtr->lpszText = Alloc ((len+1)*sizeof(WCHAR));
+ strcpyW (toolPtr->lpszText, ti->lpszText);
+ }
+ else {
+ INT len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText,
+ -1, NULL, 0);
+ toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText, -1,
+ toolPtr->lpszText, len);
+ }
}
}
}
- if (lpToolInfo->cbSize >= sizeof(TTTOOLINFOW))
- toolPtr->lParam = lpToolInfo->lParam;
+ if (ti->cbSize >= TTTOOLINFOW_V2_SIZE)
+ toolPtr->lParam = ti->lParam;
if (infoPtr->nCurrentTool == nTool)
{
@@ -2090,17 +1720,16 @@ TOOLTIPS_SetToolInfoW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
static LRESULT
-TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate, const TTTOOLINFOA *lpToolInfo)
+TOOLTIPS_TrackActivate (TOOLTIPS_INFO *infoPtr, BOOL track_activate, const TTTOOLINFOA *ti)
{
if (track_activate) {
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (!ti) return 0;
+ if (ti->cbSize < TTTOOLINFOA_V1_SIZE)
return FALSE;
/* activate */
- infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
+ infoPtr->nTrackTool = TOOLTIPS_GetToolFromInfoT (infoPtr, (const TTTOOLINFOW*)ti);
if (infoPtr->nTrackTool != -1) {
TRACE("activated!\n");
infoPtr->bTrackActive = TRUE;
@@ -2149,72 +1778,16 @@ TOOLTIPS_Update (TOOLTIPS_INFO *infoPtr)
static LRESULT
-TOOLTIPS_UpdateTipTextA (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOA *lpToolInfo)
+TOOLTIPS_UpdateTipTextT (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *ti, BOOL isW)
{
TTTOOL_INFO *toolPtr;
INT nTool;
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOA_V1_SIZE)
+ if (!ti) return 0;
+ if (ti->cbSize < TTTOOLINFOW_V1_SIZE)
return FALSE;
- nTool = TOOLTIPS_GetToolFromInfoA (infoPtr, lpToolInfo);
- if (nTool == -1) return 0;
-
- TRACE("tool %d\n", nTool);
-
- toolPtr = &infoPtr->tools[nTool];
-
- /* copy tool text */
- toolPtr->hinst = lpToolInfo->hinst;
-
- if (IS_INTRESOURCE(lpToolInfo->lpszText)){
- toolPtr->lpszText = (LPWSTR)lpToolInfo->lpszText;
- }
- else if (lpToolInfo->lpszText) {
- if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKA)
- toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
- else {
- if ( (toolPtr->lpszText) &&
- !IS_INTRESOURCE(toolPtr->lpszText) ) {
- if( toolPtr->lpszText != LPSTR_TEXTCALLBACKW)
- Free (toolPtr->lpszText);
- toolPtr->lpszText = NULL;
- }
- if (lpToolInfo->lpszText) {
- INT len = MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText,
- -1, NULL, 0);
- toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
- MultiByteToWideChar(CP_ACP, 0, lpToolInfo->lpszText, -1,
- toolPtr->lpszText, len);
- }
- }
- }
-
- if(infoPtr->nCurrentTool == -1) return 0;
- /* force repaint */
- if (infoPtr->bActive)
- TOOLTIPS_Show (infoPtr, FALSE);
- else if (infoPtr->bTrackActive)
- TOOLTIPS_TrackShow (infoPtr);
-
- return 0;
-}
-
-
-static LRESULT
-TOOLTIPS_UpdateTipTextW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
-{
- TTTOOL_INFO *toolPtr;
- INT nTool;
-
- if (lpToolInfo == NULL)
- return 0;
- if (lpToolInfo->cbSize < TTTOOLINFOW_V1_SIZE)
- return FALSE;
-
- nTool = TOOLTIPS_GetToolFromInfoW (infoPtr, lpToolInfo);
+ nTool = TOOLTIPS_GetToolFromInfoT (infoPtr, ti);
if (nTool == -1)
return 0;
@@ -2223,13 +1796,13 @@ TOOLTIPS_UpdateTipTextW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
toolPtr = &infoPtr->tools[nTool];
/* copy tool text */
- toolPtr->hinst = lpToolInfo->hinst;
+ toolPtr->hinst = ti->hinst;
- if (IS_INTRESOURCE(lpToolInfo->lpszText)){
- toolPtr->lpszText = lpToolInfo->lpszText;
+ if (IS_INTRESOURCE(ti->lpszText)){
+ toolPtr->lpszText = ti->lpszText;
}
- else if (lpToolInfo->lpszText) {
- if (lpToolInfo->lpszText == LPSTR_TEXTCALLBACKW)
+ else if (ti->lpszText) {
+ if (TOOLTIPS_IsCallbackString(ti->lpszText, isW))
toolPtr->lpszText = LPSTR_TEXTCALLBACKW;
else {
if ( (toolPtr->lpszText) &&
@@ -2238,10 +1811,19 @@ TOOLTIPS_UpdateTipTextW (TOOLTIPS_INFO *infoPtr, const TTTOOLINFOW *lpToolInfo)
Free (toolPtr->lpszText);
toolPtr->lpszText = NULL;
}
- if (lpToolInfo->lpszText) {
- INT len = lstrlenW (lpToolInfo->lpszText);
- toolPtr->lpszText = Alloc ((len+1)*sizeof(WCHAR));
- strcpyW (toolPtr->lpszText, lpToolInfo->lpszText);
+ if (ti->lpszText) {
+ if (isW) {
+ INT len = lstrlenW (ti->lpszText);
+ toolPtr->lpszText = Alloc ((len+1)*sizeof(WCHAR));
+ strcpyW (toolPtr->lpszText, ti->lpszText);
+ }
+ else {
+ INT len = MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText,
+ -1, NULL, 0);
+ toolPtr->lpszText = Alloc (len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, (LPSTR)ti->lpszText, -1,
+ toolPtr->lpszText, len);
+ }
}
}
}
@@ -2404,32 +1986,8 @@ TOOLTIPS_NCHitTest (const TOOLTIPS_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
static LRESULT
TOOLTIPS_NotifyFormat (TOOLTIPS_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
- TTTOOL_INFO *toolPtr = infoPtr->tools;
- INT nResult;
+ FIXME ("hwnd=%p wParam=%lx lParam=%lx\n", infoPtr->hwndSelf, wParam, lParam);
- TRACE("hwnd=%p wParam=%lx lParam=%lx\n", infoPtr->hwndSelf, wParam, lParam);
-
- if (lParam == NF_QUERY) {
- if (toolPtr->bNotifyUnicode) {
- return NFR_UNICODE;
- } else {
- return NFR_ANSI;
- }
- }
- else if (lParam == NF_REQUERY) {
- nResult = (INT) SendMessageW (toolPtr->hwnd, WM_NOTIFYFORMAT,
- (WPARAM)infoPtr->hwndSelf, (LPARAM)NF_QUERY);
- if (nResult == NFR_ANSI) {
- toolPtr->bNotifyUnicode = FALSE;
- TRACE(" -- WM_NOTIFYFORMAT returns: NFR_ANSI\n");
- } else if (nResult == NFR_UNICODE) {
- toolPtr->bNotifyUnicode = TRUE;
- TRACE(" -- WM_NOTIFYFORMAT returns: NFR_UNICODE\n");
- } else {
- TRACE (" -- WM_NOTIFYFORMAT returns: error!\n");
- }
- return nResult;
- }
return 0;
}
@@ -2609,31 +2167,24 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_Activate (infoPtr, (BOOL)wParam);
case TTM_ADDTOOLA:
- return TOOLTIPS_AddToolA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_ADDTOOLW:
- return TOOLTIPS_AddToolW (infoPtr, (LPTTTOOLINFOW)lParam);
+ return TOOLTIPS_AddToolT (infoPtr, (LPTTTOOLINFOW)lParam, uMsg == TTM_ADDTOOLW);
case TTM_DELTOOLA:
- return TOOLTIPS_DelToolA (infoPtr, (LPTOOLINFOA)lParam);
-
case TTM_DELTOOLW:
- return TOOLTIPS_DelToolW (infoPtr, (LPTOOLINFOW)lParam);
-
+ return TOOLTIPS_DelToolT (infoPtr, (LPTOOLINFOW)lParam,
+ uMsg == TTM_DELTOOLW);
case TTM_ENUMTOOLSA:
- return TOOLTIPS_EnumToolsA (infoPtr, (UINT)wParam, (LPTTTOOLINFOA)lParam);
-
case TTM_ENUMTOOLSW:
- return TOOLTIPS_EnumToolsW (infoPtr, (UINT)wParam, (LPTTTOOLINFOW)lParam);
-
+ return TOOLTIPS_EnumToolsT (infoPtr, (UINT)wParam, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_ENUMTOOLSW);
case TTM_GETBUBBLESIZE:
return TOOLTIPS_GetBubbleSize (infoPtr, (LPTTTOOLINFOW)lParam);
case TTM_GETCURRENTTOOLA:
- return TOOLTIPS_GetCurrentToolA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_GETCURRENTTOOLW:
- return TOOLTIPS_GetCurrentToolW (infoPtr, (LPTTTOOLINFOW)lParam);
+ return TOOLTIPS_GetCurrentToolT (infoPtr, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_GETCURRENTTOOLW);
case TTM_GETDELAYTIME:
return TOOLTIPS_GetDelayTime (infoPtr, (DWORD)wParam);
@@ -2645,10 +2196,9 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_GetMaxTipWidth (infoPtr);
case TTM_GETTEXTA:
- return TOOLTIPS_GetTextA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_GETTEXTW:
- return TOOLTIPS_GetTextW (infoPtr, (LPTTTOOLINFOW)lParam);
+ return TOOLTIPS_GetTextT (infoPtr, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_GETTEXTW);
case TTM_GETTIPBKCOLOR:
return TOOLTIPS_GetTipBkColor (infoPtr);
@@ -2660,23 +2210,18 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_GetToolCount (infoPtr);
case TTM_GETTOOLINFOA:
- return TOOLTIPS_GetToolInfoA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_GETTOOLINFOW:
- return TOOLTIPS_GetToolInfoW (infoPtr, (LPTTTOOLINFOW)lParam);
+ return TOOLTIPS_GetToolInfoT (infoPtr, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_GETTOOLINFOW);
case TTM_HITTESTA:
- return TOOLTIPS_HitTestA (infoPtr, (LPTTHITTESTINFOA)lParam);
-
case TTM_HITTESTW:
- return TOOLTIPS_HitTestW (infoPtr, (LPTTHITTESTINFOW)lParam);
-
+ return TOOLTIPS_HitTestT (infoPtr, (LPTTHITTESTINFOW)lParam,
+ uMsg == TTM_HITTESTW);
case TTM_NEWTOOLRECTA:
- return TOOLTIPS_NewToolRectA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_NEWTOOLRECTW:
- return TOOLTIPS_NewToolRectW (infoPtr, (LPTTTOOLINFOW)lParam);
-
+ return TOOLTIPS_NewToolRectT (infoPtr, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_NEWTOOLRECTW);
case TTM_POP:
return TOOLTIPS_Pop (infoPtr);
@@ -2699,16 +2244,14 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_SetTipTextColor (infoPtr, (COLORREF)wParam);
case TTM_SETTITLEA:
- return TOOLTIPS_SetTitleA (infoPtr, (UINT_PTR)wParam, (LPCSTR)lParam);
-
case TTM_SETTITLEW:
- return TOOLTIPS_SetTitleW (infoPtr, (UINT_PTR)wParam, (LPCWSTR)lParam);
+ return TOOLTIPS_SetTitleT (infoPtr, (UINT_PTR)wParam, (LPCWSTR)lParam,
+ uMsg == TTM_SETTITLEW);
case TTM_SETTOOLINFOA:
- return TOOLTIPS_SetToolInfoA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_SETTOOLINFOW:
- return TOOLTIPS_SetToolInfoW (infoPtr, (LPTTTOOLINFOW)lParam);
+ return TOOLTIPS_SetToolInfoT (infoPtr, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_SETTOOLINFOW);
case TTM_TRACKACTIVATE:
return TOOLTIPS_TrackActivate (infoPtr, (BOOL)wParam, (LPTTTOOLINFOA)lParam);
@@ -2720,10 +2263,9 @@ TOOLTIPS_WindowProc (HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TOOLTIPS_Update (infoPtr);
case TTM_UPDATETIPTEXTA:
- return TOOLTIPS_UpdateTipTextA (infoPtr, (LPTTTOOLINFOA)lParam);
-
case TTM_UPDATETIPTEXTW:
- return TOOLTIPS_UpdateTipTextW (infoPtr, (LPTTTOOLINFOW)lParam);
+ return TOOLTIPS_UpdateTipTextT (infoPtr, (LPTTTOOLINFOW)lParam,
+ uMsg == TTM_UPDATETIPTEXTW);
case TTM_WINDOWFROMPOINT:
return TOOLTIPS_WindowFromPoint (hwnd, wParam, lParam);
diff --git a/dll/win32/comctl32/trackbar.c b/dll/win32/comctl32/trackbar.c
index 5abc77fb8a4..c924b5304e1 100644
--- a/dll/win32/comctl32/trackbar.c
+++ b/dll/win32/comctl32/trackbar.c
@@ -135,18 +135,15 @@ static inline int notify (const TRACKBAR_INFO *infoPtr, INT code)
return notify_hdr(infoPtr, code, &nmh);
}
-static BOOL
-notify_with_scroll (const TRACKBAR_INFO *infoPtr, UINT code)
+static void notify_with_scroll (const TRACKBAR_INFO *infoPtr, UINT code)
{
- BOOL bVert = infoPtr->dwStyle & TBS_VERT;
+ UINT scroll = infoPtr->dwStyle & TBS_VERT ? WM_VSCROLL : WM_HSCROLL;
TRACE("%x\n", code);
- return (BOOL) SendMessageW (infoPtr->hwndNotify,
- bVert ? WM_VSCROLL : WM_HSCROLL,
- (WPARAM)code, (LPARAM)infoPtr->hwndSelf);
+ SendMessageW (infoPtr->hwndNotify, scroll, code, (LPARAM)infoPtr->hwndSelf);
}
-
+
static void TRACKBAR_RecalculateTics (TRACKBAR_INFO *infoPtr)
{
int tic;
diff --git a/dll/win32/comctl32/treeview.c b/dll/win32/comctl32/treeview.c
index f7b1afabcbc..8d2a6f3d1ff 100644
--- a/dll/win32/comctl32/treeview.c
+++ b/dll/win32/comctl32/treeview.c
@@ -28,7 +28,7 @@
* We use callbackMask to keep track of fields to be updated.
*
* TODO:
- * missing notifications: NM_SETCURSOR, TVN_GETINFOTIP, TVN_KEYDOWN,
+ * missing notifications: TVN_GETINFOTIP, TVN_KEYDOWN,
* TVN_SETDISPINFO, TVN_SINGLEEXPAND
*
* missing styles: TVS_FULLROWSELECT, TVS_INFOTIP, TVS_RTLREADING,
@@ -63,6 +63,8 @@
#include "wine/unicode.h"
#include "wine/debug.h"
+WINE_DEFAULT_DEBUG_CHANNEL(treeview);
+
/* internal structures */
typedef struct _TREEITEM /* HTREEITEM is a _TREEINFO *. */
@@ -153,10 +155,10 @@ typedef struct tagTREEVIEW_INFO
int stateImageWidth;
HDPA items;
- DWORD lastKeyPressTimestamp; /* Added */
- WPARAM charCode; /* Added */
- INT nSearchParamLength; /* Added */
- WCHAR szSearchParam[ MAX_PATH ]; /* Added */
+ DWORD lastKeyPressTimestamp;
+ WPARAM charCode;
+ INT nSearchParamLength;
+ WCHAR szSearchParam[ MAX_PATH ];
} TREEVIEW_INFO;
@@ -177,14 +179,6 @@ typedef struct tagTREEVIEW_INFO
#define TV_EDIT_TIMER 2
#define TV_EDIT_TIMER_SET 2
-
-VOID TREEVIEW_Register (VOID);
-VOID TREEVIEW_Unregister (VOID);
-
-
-WINE_DEFAULT_DEBUG_CHANNEL(treeview);
-
-
#define TEXT_CALLBACK_SIZE 260
#define TREEVIEW_LEFT_MARGIN 8
@@ -197,6 +191,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(treeview);
#define OVERLAYIMAGEINDEX(x) (((x) >> 8) & 0x0f)
#define ISVISIBLE(x) ((x)->visibleOrder >= 0)
+#define GETLINECOLOR(x) ((x) == CLR_DEFAULT ? comctl32_color.clrGrayText : (x))
+#define GETBKCOLOR(x) ((x) == CLR_NONE ? comctl32_color.clrWindow : (x))
+#define GETTXTCOLOR(x) ((x) == CLR_NONE ? comctl32_color.clrWindowText : (x))
+#define GETINSCOLOR(x) ((x) == CLR_DEFAULT ? comctl32_color.clrBtnText : (x))
static const WCHAR themeClass[] = { 'T','r','e','e','v','i','e','w',0 };
@@ -213,8 +211,6 @@ static LRESULT TREEVIEW_RButtonUp(const TREEVIEW_INFO *, const POINT *);
static LRESULT TREEVIEW_EndEditLabelNow(TREEVIEW_INFO *infoPtr, BOOL bCancel);
static VOID TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr);
static LRESULT TREEVIEW_HScroll(TREEVIEW_INFO *, WPARAM);
-static INT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, HWND wParam, UINT lParam);
-
/* Random Utilities *****************************************************/
@@ -842,6 +838,23 @@ TREEVIEW_HasChildren(const TREEVIEW_INFO *infoPtr, TREEVIEW_ITEM *wineItem)
return wineItem->cChildren > 0;
}
+static INT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, HWND hwndFrom, UINT nCommand)
+{
+ INT format;
+
+ TRACE("(hwndFrom=%p, nCommand=%d)\n", hwndFrom, nCommand);
+
+ if (nCommand != NF_REQUERY) return 0;
+
+ format = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwnd, NF_QUERY);
+ TRACE("format=%d\n", format);
+
+ if (format != NFR_ANSI && format != NFR_UNICODE) return 0;
+
+ infoPtr->bNtfUnicode = (format == NFR_UNICODE);
+
+ return format;
+}
/* Item Position ********************************************************/
@@ -1685,10 +1698,10 @@ TREEVIEW_GetImageList(const TREEVIEW_INFO *infoPtr, WPARAM wParam)
switch (wParam)
{
- case (WPARAM)TVSIL_NORMAL:
+ case TVSIL_NORMAL:
return (LRESULT)infoPtr->himlNormal;
- case (WPARAM)TVSIL_STATE:
+ case TVSIL_STATE:
return (LRESULT)infoPtr->himlState;
default:
@@ -1742,7 +1755,7 @@ TREEVIEW_SetImageList(TREEVIEW_INFO *infoPtr, WPARAM wParam, HIMAGELIST himlNew)
switch (wParam)
{
- case (WPARAM)TVSIL_NORMAL:
+ case TVSIL_NORMAL:
himlOld = infoPtr->himlNormal;
infoPtr->himlNormal = himlNew;
@@ -1757,7 +1770,7 @@ TREEVIEW_SetImageList(TREEVIEW_INFO *infoPtr, WPARAM wParam, HIMAGELIST himlNew)
break;
- case (WPARAM)TVSIL_STATE:
+ case TVSIL_STATE:
himlOld = infoPtr->himlState;
infoPtr->himlState = himlNew;
@@ -1871,6 +1884,7 @@ TREEVIEW_SetFont(TREEVIEW_INFO *infoPtr, HFONT hFont, BOOL bRedraw)
infoPtr->hFont = hFont ? hFont : infoPtr->hDefaultFont;
DeleteObject(infoPtr->hBoldFont);
+ DeleteObject(infoPtr->hUnderlineFont);
infoPtr->hBoldFont = TREEVIEW_CreateBoldFont(infoPtr->hFont);
infoPtr->hUnderlineFont = TREEVIEW_CreateUnderlineFont(infoPtr->hFont);
@@ -2313,15 +2327,14 @@ TREEVIEW_DrawItemLines(const TREEVIEW_INFO *infoPtr, HDC hdc, const TREEVIEW_ITE
& (TVS_LINESATROOT|TVS_HASLINES|TVS_HASBUTTONS))
> TVS_LINESATROOT);
HBRUSH hbr, hbrOld;
- COLORREF clrBk = infoPtr->clrBk == -1 ? comctl32_color.clrWindow:
- infoPtr->clrBk;
+ COLORREF clrBk = GETBKCOLOR(infoPtr->clrBk);
if (!lar && item->iLevel == 0)
return;
hbr = CreateSolidBrush(clrBk);
hbrOld = SelectObject(hdc, hbr);
-
+
centerx = (item->linesOffset + item->stateOffset) / 2;
centery = (item->rect.top + item->rect.bottom) / 2;
@@ -2333,7 +2346,7 @@ TREEVIEW_DrawItemLines(const TREEVIEW_INFO *infoPtr, HDC hdc, const TREEVIEW_ITE
/* Get a dotted grey pen */
lb.lbStyle = BS_SOLID;
- lb.lbColor = infoPtr->clrLine;
+ lb.lbColor = GETLINECOLOR(infoPtr->clrLine);
hNewPen = ExtCreatePen(PS_COSMETIC|PS_ALTERNATE, 1, &lb, 0, NULL);
hOldPen = SelectObject(hdc, hNewPen);
@@ -2402,16 +2415,20 @@ TREEVIEW_DrawItemLines(const TREEVIEW_INFO *infoPtr, HDC hdc, const TREEVIEW_ITE
LONG rectsize = min(height, width) / 4;
/* plussize = ceil(rectsize * 3/4) */
LONG plussize = (rectsize + 1) * 3 / 4;
-
- HPEN hNewPen = CreatePen(PS_SOLID, 0, infoPtr->clrLine);
- HPEN hOldPen = SelectObject(hdc, hNewPen);
-
+
+ HPEN new_pen = CreatePen(PS_SOLID, 0, GETLINECOLOR(infoPtr->clrLine));
+ HPEN old_pen = SelectObject(hdc, new_pen);
+
Rectangle(hdc, centerx - rectsize - 1, centery - rectsize - 1,
centerx + rectsize + 2, centery + rectsize + 2);
-
- SelectObject(hdc, hOldPen);
- DeleteObject(hNewPen);
-
+
+ SelectObject(hdc, old_pen);
+ DeleteObject(new_pen);
+
+ /* draw +/- signs with current text color */
+ new_pen = CreatePen(PS_SOLID, 0, GETTXTCOLOR(infoPtr->clrText));
+ old_pen = SelectObject(hdc, new_pen);
+
if (height < 18 || width < 18)
{
MoveToEx(hdc, centerx - plussize + 1, centery, NULL);
@@ -2436,6 +2453,9 @@ TREEVIEW_DrawItemLines(const TREEVIEW_INFO *infoPtr, HDC hdc, const TREEVIEW_ITE
SetPixel(hdc, centerx + 1, centery, clrBk);
}
}
+
+ SelectObject(hdc, old_pen);
+ DeleteObject(new_pen);
}
}
}
@@ -2473,22 +2493,16 @@ TREEVIEW_DrawItem(const TREEVIEW_INFO *infoPtr, HDC hdc, TREEVIEW_ITEM *wineItem
else
{
nmcdhdr.clrTextBk = comctl32_color.clrBtnFace;
- if (infoPtr->clrText == -1)
- nmcdhdr.clrText = comctl32_color.clrWindowText;
- else
- nmcdhdr.clrText = infoPtr->clrText;
+ nmcdhdr.clrText = GETTXTCOLOR(infoPtr->clrText);
}
}
else
{
- nmcdhdr.clrTextBk = infoPtr->clrBk == -1 ? comctl32_color.clrWindow:
- infoPtr->clrBk;
+ nmcdhdr.clrTextBk = GETBKCOLOR(infoPtr->clrBk);
if ((infoPtr->dwStyle & TVS_TRACKSELECT) && (wineItem == infoPtr->hotItem))
nmcdhdr.clrText = comctl32_color.clrHighlight;
- else if (infoPtr->clrText == -1)
- nmcdhdr.clrText = comctl32_color.clrWindowText;
else
- nmcdhdr.clrText = infoPtr->clrText;
+ nmcdhdr.clrText = GETTXTCOLOR(infoPtr->clrText);
}
hOldFont = SelectObject(hdc, TREEVIEW_FontForItem(infoPtr, wineItem));
@@ -2620,7 +2634,7 @@ TREEVIEW_DrawItem(const TREEVIEW_INFO *infoPtr, HDC hdc, TREEVIEW_ITEM *wineItem
int offset;
int left, right;
- hNewPen = CreatePen(PS_SOLID, 2, infoPtr->clrInsertMark);
+ hNewPen = CreatePen(PS_SOLID, 2, GETINSCOLOR(infoPtr->clrInsertMark));
hOldPen = SelectObject(hdc, hNewPen);
if (infoPtr->insertBeforeorAfter)
@@ -2788,19 +2802,27 @@ TREEVIEW_UpdateScrollBars(TREEVIEW_INFO *infoPtr)
infoPtr->uInternalStatus &= ~TV_HSCROLL;
}
-/* CtrlSpy doesn't mention this, but CorelDRAW's object manager needs it. */
-static LRESULT
-TREEVIEW_EraseBackground(const TREEVIEW_INFO *infoPtr, HDC hDC)
+static void
+TREEVIEW_FillBkgnd(const TREEVIEW_INFO *infoPtr, HDC hdc, const RECT *rc)
{
HBRUSH hBrush;
- COLORREF clrBk = infoPtr->clrBk == -1 ? comctl32_color.clrWindow:
- infoPtr->clrBk;
- RECT rect;
+ COLORREF clrBk = GETBKCOLOR(infoPtr->clrBk);
hBrush = CreateSolidBrush(clrBk);
- GetClientRect(infoPtr->hwnd, &rect);
- FillRect(hDC, &rect, hBrush);
+ FillRect(hdc, rc, hBrush);
DeleteObject(hBrush);
+}
+
+/* CtrlSpy doesn't mention this, but CorelDRAW's object manager needs it. */
+static LRESULT
+TREEVIEW_EraseBackground(const TREEVIEW_INFO *infoPtr, HDC hdc)
+{
+ RECT rect;
+
+ TRACE("%p\n", infoPtr);
+
+ GetClientRect(infoPtr->hwnd, &rect);
+ TREEVIEW_FillBkgnd(infoPtr, hdc, &rect);
return 1;
}
@@ -2855,17 +2877,23 @@ TREEVIEW_Refresh(TREEVIEW_INFO *infoPtr, HDC hdc, const RECT *rc)
TREEVIEW_SendCustomDrawNotify(infoPtr, CDDS_POSTPAINT, hdc, rect);
}
+static inline void
+TREEVIEW_InvalidateItem(const TREEVIEW_INFO *infoPtr, const TREEVIEW_ITEM *item)
+{
+ if (item) InvalidateRect(infoPtr->hwnd, &item->rect, TRUE);
+}
+
static void
TREEVIEW_Invalidate(const TREEVIEW_INFO *infoPtr, const TREEVIEW_ITEM *item)
{
- if (item != NULL)
+ if (item)
InvalidateRect(infoPtr->hwnd, &item->rect, TRUE);
else
InvalidateRect(infoPtr->hwnd, NULL, TRUE);
}
static LRESULT
-TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, WPARAM wParam)
+TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, HDC hdc_ref)
{
HDC hdc;
PAINTSTRUCT ps;
@@ -2873,27 +2901,48 @@ TREEVIEW_Paint(TREEVIEW_INFO *infoPtr, WPARAM wParam)
TRACE("\n");
- if (wParam)
+ if (hdc_ref)
{
- hdc = (HDC)wParam;
- GetClientRect(infoPtr->hwnd, &rc);
- TREEVIEW_EraseBackground(infoPtr, hdc);
+ hdc = hdc_ref;
+ GetClientRect(infoPtr->hwnd, &rc);
}
else
{
hdc = BeginPaint(infoPtr->hwnd, &ps);
- rc = ps.rcPaint;
+ rc = ps.rcPaint;
+ if(ps.fErase)
+ TREEVIEW_FillBkgnd(infoPtr, hdc, &rc);
}
if(infoPtr->bRedraw) /* WM_SETREDRAW sets bRedraw */
TREEVIEW_Refresh(infoPtr, hdc, &rc);
- if (!wParam)
+ if (!hdc_ref)
EndPaint(infoPtr->hwnd, &ps);
return 0;
}
+static LRESULT
+TREEVIEW_PrintClient(TREEVIEW_INFO *infoPtr, HDC hdc, DWORD options)
+{
+ FIXME("Partial Stub: (hdc=%p options=0x%08x)\n", hdc, options);
+
+ if ((options & PRF_CHECKVISIBLE) && !IsWindowVisible(infoPtr->hwnd))
+ return 0;
+
+ if (options & PRF_ERASEBKGND)
+ TREEVIEW_EraseBackground(infoPtr, hdc);
+
+ if (options & PRF_CLIENT)
+ {
+ RECT rc;
+ GetClientRect(infoPtr->hwnd, &rc);
+ TREEVIEW_Refresh(infoPtr, hdc, &rc);
+ }
+
+ return 0;
+}
/* Sorting **************************************************************/
@@ -3564,12 +3613,12 @@ TREEVIEW_Edit_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return DLGC_WANTARROWS | DLGC_WANTALLKEYS;
case WM_KEYDOWN:
- if (wParam == (WPARAM)VK_ESCAPE)
+ if (wParam == VK_ESCAPE)
{
bCancel = TRUE;
break;
}
- else if (wParam == (WPARAM)VK_RETURN)
+ else if (wParam == VK_RETURN)
{
break;
}
@@ -3679,7 +3728,6 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
HDC hdc;
HFONT hOldFont=0;
TEXTMETRICW textMetric;
- static const WCHAR EditW[] = {'E','d','i','t',0};
TRACE("%p %p\n", hwnd, hItem);
if (!TREEVIEW_ValidItem(infoPtr, hItem))
@@ -3726,7 +3774,7 @@ TREEVIEW_EditLabel(TREEVIEW_INFO *infoPtr, HTREEITEM hItem)
infoPtr->editItem = hItem;
hwndEdit = CreateWindowExW(WS_EX_LEFT,
- EditW,
+ WC_EDITW,
0,
WS_CHILD | WS_BORDER | ES_AUTOHSCROLL |
WS_CLIPSIBLINGS | ES_WANTRETURN |
@@ -4003,7 +4051,6 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
HWND hwnd = infoPtr->hwnd;
TVHITTESTINFO ht;
BOOL bTrack, bDoLabelEdit;
- HTREEITEM tempItem;
/* If Edit control is active - kill it and return.
* The best way to do it is to set focus to itself.
@@ -4026,10 +4073,8 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
if(ht.hItem && (ht.flags & TVHT_ONITEM))
{
infoPtr->focusedItem = ht.hItem;
- InvalidateRect(hwnd, &ht.hItem->rect, TRUE);
-
- if(infoPtr->selectedItem)
- InvalidateRect(hwnd, &(infoPtr->selectedItem->rect), TRUE);
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem);
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->selectedItem);
}
bTrack = (ht.flags & TVHT_ONITEM)
@@ -4063,12 +4108,11 @@ TREEVIEW_LButtonDown(TREEVIEW_INFO *infoPtr, LPARAM lParam)
if(infoPtr->focusedItem)
{
/* refresh the item that was focused */
- tempItem = infoPtr->focusedItem;
- infoPtr->focusedItem = 0;
- InvalidateRect(infoPtr->hwnd, &tempItem->rect, TRUE);
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem);
+ infoPtr->focusedItem = NULL;
/* refresh the selected item to return the filled background */
- InvalidateRect(infoPtr->hwnd, &(infoPtr->selectedItem->rect), TRUE);
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->selectedItem);
}
return 0;
@@ -4288,7 +4332,6 @@ TREEVIEW_DoSelectItem(TREEVIEW_INFO *infoPtr, INT action, HTREEITEM newSelect,
INT cause)
{
TREEVIEW_ITEM *prevSelect;
- RECT rcFocused;
assert(newSelect == NULL || TREEVIEW_ValidItem(infoPtr, newSelect));
@@ -4298,12 +4341,8 @@ TREEVIEW_DoSelectItem(TREEVIEW_INFO *infoPtr, INT action, HTREEITEM newSelect,
/* reset and redraw focusedItem if focusedItem was set so we don't */
/* have to worry about the previously focused item when we set a new one */
- if(infoPtr->focusedItem)
- {
- rcFocused = (infoPtr->focusedItem)->rect;
- infoPtr->focusedItem = 0;
- InvalidateRect(infoPtr->hwnd, &rcFocused, TRUE);
- }
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->focusedItem);
+ infoPtr->focusedItem = NULL;
switch (action)
{
@@ -4332,10 +4371,8 @@ TREEVIEW_DoSelectItem(TREEVIEW_INFO *infoPtr, INT action, HTREEITEM newSelect,
TREEVIEW_EnsureVisible(infoPtr, infoPtr->selectedItem, FALSE);
- if (prevSelect)
- TREEVIEW_Invalidate(infoPtr, prevSelect);
- if (newSelect)
- TREEVIEW_Invalidate(infoPtr, newSelect);
+ TREEVIEW_InvalidateItem(infoPtr, prevSelect);
+ TREEVIEW_InvalidateItem(infoPtr, newSelect);
TREEVIEW_SendTreeviewNotify(infoPtr,
TVN_SELCHANGEDW,
@@ -4428,13 +4465,8 @@ TREEVIEW_SelectItem(TREEVIEW_INFO *infoPtr, INT wParam, HTREEITEM item)
*
* TREEVIEW_ProcessLetterKeys
*/
-static INT TREEVIEW_ProcessLetterKeys(
- HWND hwnd, /* handle to the window */
- WPARAM charCode, /* the character code, the actual character */
- LPARAM keyData /* key data */
- )
+static INT TREEVIEW_ProcessLetterKeys(TREEVIEW_INFO *infoPtr, WPARAM charCode, LPARAM keyData)
{
- TREEVIEW_INFO *infoPtr;
HTREEITEM nItem;
HTREEITEM endidx,idx;
TVITEMEXW item;
@@ -4442,12 +4474,7 @@ static INT TREEVIEW_ProcessLetterKeys(
DWORD timestamp,elapsed;
/* simple parameter checking */
- if (!hwnd || !charCode || !keyData)
- return 0;
-
- infoPtr=(TREEVIEW_INFO*)GetWindowLongPtrW(hwnd, 0);
- if (!infoPtr)
- return 0;
+ if (!charCode || !keyData) return 0;
/* only allow the valid WM_CHARs through */
if (!isalnum(charCode) &&
@@ -4856,11 +4883,14 @@ scroll:
}
static LRESULT
-TREEVIEW_MouseWheel(TREEVIEW_INFO *infoPtr, WPARAM wParam)
+TREEVIEW_MouseWheel(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
short gcWheelDelta;
UINT pulScrollLines = 3;
+ if (wParam & (MK_SHIFT | MK_CONTROL))
+ return DefWindowProcW(infoPtr->hwnd, WM_MOUSEWHEEL, wParam, lParam);
+
if (infoPtr->firstVisible == NULL)
return TRUE;
@@ -4978,10 +5008,10 @@ TREEVIEW_Create(HWND hwnd, const CREATESTRUCTW *lpcs)
infoPtr->scrollX = 0;
- infoPtr->clrBk = -1; /* use system color */
- infoPtr->clrText = -1; /* use system color */
- infoPtr->clrLine = RGB(128, 128, 128);
- infoPtr->clrInsertMark = comctl32_color.clrBtnText;
+ infoPtr->clrBk = CLR_NONE; /* use system color */
+ infoPtr->clrText = CLR_NONE; /* use system color */
+ infoPtr->clrLine = CLR_DEFAULT;
+ infoPtr->clrInsertMark = CLR_DEFAULT;
/* hwndToolTip */
@@ -5048,7 +5078,11 @@ TREEVIEW_Destroy(TREEVIEW_INFO *infoPtr)
{
TRACE("\n");
+ /* free item data */
TREEVIEW_RemoveTree(infoPtr);
+ /* root isn't freed with other items */
+ TREEVIEW_FreeItem(infoPtr, infoPtr->root);
+ DPA_Destroy(infoPtr->items);
/* tool tip is automatically destroyed: we are its owner */
@@ -5236,12 +5270,10 @@ TREEVIEW_KeyDown(TREEVIEW_INFO *infoPtr, WPARAM wParam)
static LRESULT
TREEVIEW_MouseLeave (TREEVIEW_INFO * infoPtr)
{
- if (infoPtr->hotItem)
- {
- /* remove hot effect from item */
- InvalidateRect(infoPtr->hwnd, &infoPtr->hotItem->rect, TRUE);
- infoPtr->hotItem = NULL;
- }
+ /* remove hot effect from item */
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->hotItem);
+ infoPtr->hotItem = NULL;
+
return 0;
}
@@ -5252,11 +5284,12 @@ TREEVIEW_MouseMove (TREEVIEW_INFO * infoPtr, LPARAM lParam)
TRACKMOUSEEVENT trackinfo;
TREEVIEW_ITEM * item;
+ if (!(infoPtr->dwStyle & TVS_TRACKSELECT)) return 0;
+
/* fill in the TRACKMOUSEEVENT struct */
trackinfo.cbSize = sizeof(TRACKMOUSEEVENT);
trackinfo.dwFlags = TME_QUERY;
trackinfo.hwndTrack = infoPtr->hwnd;
- trackinfo.dwHoverTime = HOVER_DEFAULT;
/* call _TrackMouseEvent to see if we are currently tracking for this hwnd */
_TrackMouseEvent(&trackinfo);
@@ -5265,6 +5298,9 @@ TREEVIEW_MouseMove (TREEVIEW_INFO * infoPtr, LPARAM lParam)
if(!(trackinfo.dwFlags & TME_LEAVE))
{
trackinfo.dwFlags = TME_LEAVE; /* notify upon leaving */
+ trackinfo.hwndTrack = infoPtr->hwnd;
+ /* do it as fast as possible, minimal systimer latency will be used */
+ trackinfo.dwHoverTime = 1;
/* call TRACKMOUSEEVENT so we receive a WM_MOUSELEAVE message */
/* and can properly deactivate the hot item */
@@ -5279,19 +5315,17 @@ TREEVIEW_MouseMove (TREEVIEW_INFO * infoPtr, LPARAM lParam)
if (item != infoPtr->hotItem)
{
/* redraw old hot item */
- if (infoPtr->hotItem)
- InvalidateRect(infoPtr->hwnd, &infoPtr->hotItem->rect, TRUE);
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->hotItem);
infoPtr->hotItem = item;
/* redraw new hot item */
- if (infoPtr->hotItem)
- InvalidateRect(infoPtr->hwnd, &infoPtr->hotItem->rect, TRUE);
+ TREEVIEW_InvalidateItem(infoPtr, infoPtr->hotItem);
}
return 0;
}
/* Draw themed border */
-static BOOL nc_paint (const TREEVIEW_INFO *infoPtr, HRGN region)
+static BOOL TREEVIEW_NCPaint (const TREEVIEW_INFO *infoPtr, HRGN region, LPARAM lParam)
{
HTHEME theme = GetWindowTheme (infoPtr->hwnd);
HDC dc;
@@ -5300,7 +5334,8 @@ static BOOL nc_paint (const TREEVIEW_INFO *infoPtr, HRGN region)
int cxEdge = GetSystemMetrics (SM_CXEDGE),
cyEdge = GetSystemMetrics (SM_CYEDGE);
- if (!theme) return FALSE;
+ if (!theme)
+ return DefWindowProcW (infoPtr->hwnd, WM_NCPAINT, (WPARAM)region, lParam);
GetWindowRect(infoPtr->hwnd, &r);
@@ -5347,24 +5382,6 @@ TREEVIEW_Notify(const TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
return DefWindowProcW(infoPtr->hwnd, WM_NOTIFY, wParam, lParam);
}
-static INT TREEVIEW_NotifyFormat (TREEVIEW_INFO *infoPtr, HWND hwndFrom, UINT nCommand)
-{
- INT format;
-
- TRACE("(hwndFrom=%p, nCommand=%d)\n", hwndFrom, nCommand);
-
- if (nCommand != NF_REQUERY) return 0;
-
- format = SendMessageW(hwndFrom, WM_NOTIFYFORMAT, (WPARAM)infoPtr->hwnd, NF_QUERY);
- TRACE("format=%d\n", format);
-
- if (format != NFR_ANSI && format != NFR_UNICODE) return 0;
-
- infoPtr->bNtfUnicode = (format == NFR_UNICODE);
-
- return format;
-}
-
static LRESULT
TREEVIEW_Size(TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
@@ -5438,13 +5455,27 @@ TREEVIEW_SetCursor(const TREEVIEW_INFO *infoPtr, WPARAM wParam, LPARAM lParam)
{
POINT pt;
TREEVIEW_ITEM * item;
+ NMMOUSE nmmouse;
GetCursorPos(&pt);
ScreenToClient(infoPtr->hwnd, &pt);
item = TREEVIEW_HitTestPoint(infoPtr, pt);
- /* FIXME: send NM_SETCURSOR */
+ memset(&nmmouse, 0, sizeof(nmmouse));
+ nmmouse.hdr.hwndFrom = infoPtr->hwnd;
+ nmmouse.hdr.idFrom = GetWindowLongPtrW(infoPtr->hwnd, GWLP_ID);
+ nmmouse.hdr.code = NM_SETCURSOR;
+ if (item)
+ {
+ nmmouse.dwItemSpec = (DWORD_PTR)item;
+ nmmouse.dwItemData = item->lParam;
+ }
+ nmmouse.pt.x = 0;
+ nmmouse.pt.y = 0;
+ nmmouse.dwHitInfo = lParam;
+ if (TREEVIEW_SendRealNotify(infoPtr, nmmouse.hdr.idFrom, (LPARAM)&nmmouse))
+ return 0;
if (item && (infoPtr->dwStyle & TVS_TRACKSELECT))
{
@@ -5483,7 +5514,7 @@ TREEVIEW_KillFocus(const TREEVIEW_INFO *infoPtr)
}
/* update theme after a WM_THEMECHANGED message */
-static LRESULT theme_changed(const TREEVIEW_INFO *infoPtr)
+static LRESULT TREEVIEW_ThemeChanged(const TREEVIEW_INFO *infoPtr)
{
HTHEME theme = GetWindowTheme (infoPtr->hwnd);
CloseThemeData (theme);
@@ -5517,8 +5548,6 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_DeleteItem(infoPtr, (HTREEITEM)lParam);
case TVM_EDITLABELA:
- return (LRESULT)TREEVIEW_EditLabel(infoPtr, (HTREEITEM)lParam);
-
case TVM_EDITLABELW:
return (LRESULT)TREEVIEW_EditLabel(infoPtr, (HTREEITEM)lParam);
@@ -5558,11 +5587,9 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return 0;
case TVM_GETITEMA:
- return TREEVIEW_GetItemT(infoPtr, (LPTVITEMEXW)lParam, FALSE);
-
case TVM_GETITEMW:
- return TREEVIEW_GetItemT(infoPtr, (LPTVITEMEXW)lParam, TRUE);
-
+ return TREEVIEW_GetItemT(infoPtr, (LPTVITEMEXW)lParam,
+ uMsg == TVM_GETITEMW);
case TVM_GETITEMHEIGHT:
return TREEVIEW_GetItemHeight(infoPtr);
@@ -5597,11 +5624,9 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_HitTest(infoPtr, (LPTVHITTESTINFO)lParam);
case TVM_INSERTITEMA:
- return TREEVIEW_InsertItemT(infoPtr, (LPTVINSERTSTRUCTW)lParam, FALSE);
-
case TVM_INSERTITEMW:
- return TREEVIEW_InsertItemT(infoPtr, (LPTVINSERTSTRUCTW)lParam, TRUE);
-
+ return TREEVIEW_InsertItemT(infoPtr, (LPTVINSERTSTRUCTW)lParam,
+ uMsg == TVM_INSERTITEMW);
case TVM_SELECTITEM:
return TREEVIEW_SelectItem(infoPtr, (INT)wParam, (HTREEITEM)lParam);
@@ -5621,11 +5646,9 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_SetInsertMarkColor(infoPtr, (COLORREF)lParam);
case TVM_SETITEMA:
- return TREEVIEW_SetItemT(infoPtr, (LPTVITEMEXW)lParam, FALSE);
-
case TVM_SETITEMW:
- return TREEVIEW_SetItemT(infoPtr, (LPTVITEMEXW)lParam, TRUE);
-
+ return TREEVIEW_SetItemT(infoPtr, (LPTVITEMEXW)lParam,
+ uMsg == TVM_SETITEMW);
case TVM_SETLINECOLOR:
return TREEVIEW_SetLineColor(infoPtr, (COLORREF)lParam);
@@ -5651,7 +5674,7 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_SortChildrenCB(infoPtr, (LPTVSORTCB)lParam);
case WM_CHAR:
- return TREEVIEW_ProcessLetterKeys( hwnd, wParam, lParam );
+ return TREEVIEW_ProcessLetterKeys(infoPtr, wParam, lParam);
case WM_COMMAND:
return TREEVIEW_Command(infoPtr, wParam, lParam);
@@ -5691,10 +5714,7 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_MouseLeave(infoPtr);
case WM_MOUSEMOVE:
- if (infoPtr->dwStyle & TVS_TRACKSELECT)
- return TREEVIEW_MouseMove(infoPtr, lParam);
- else
- return 0;
+ return TREEVIEW_MouseMove(infoPtr, lParam);
case WM_NCLBUTTONDOWN:
if (infoPtr->hwndEdit)
@@ -5702,9 +5722,7 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
goto def;
case WM_NCPAINT:
- if (nc_paint (infoPtr, (HRGN)wParam))
- return 0;
- goto def;
+ return TREEVIEW_NCPaint (infoPtr, (HRGN)wParam, lParam);
case WM_NOTIFY:
return TREEVIEW_Notify(infoPtr, wParam, lParam);
@@ -5713,8 +5731,10 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_NotifyFormat(infoPtr, (HWND)wParam, (UINT)lParam);
case WM_PRINTCLIENT:
+ return TREEVIEW_PrintClient(infoPtr, (HDC)wParam, lParam);
+
case WM_PAINT:
- return TREEVIEW_Paint(infoPtr, wParam);
+ return TREEVIEW_Paint(infoPtr, (HDC)wParam);
case WM_RBUTTONDOWN:
return TREEVIEW_RButtonDown(infoPtr, lParam);
@@ -5747,7 +5767,7 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
return TREEVIEW_HandleTimer(infoPtr, wParam);
case WM_THEMECHANGED:
- return theme_changed (infoPtr);
+ return TREEVIEW_ThemeChanged (infoPtr);
case WM_VSCROLL:
return TREEVIEW_VScroll(infoPtr, wParam);
@@ -5755,9 +5775,7 @@ TREEVIEW_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
/* WM_WININICHANGE */
case WM_MOUSEWHEEL:
- if (wParam & (MK_SHIFT | MK_CONTROL))
- goto def;
- return TREEVIEW_MouseWheel(infoPtr, wParam);
+ return TREEVIEW_MouseWheel(infoPtr, wParam, lParam);
case WM_DRAWITEM:
TRACE("drawItem\n");
diff --git a/dll/win32/comctl32/updown.c b/dll/win32/comctl32/updown.c
index bb789032641..75653e18d67 100644
--- a/dll/win32/comctl32/updown.c
+++ b/dll/win32/comctl32/updown.c
@@ -71,7 +71,7 @@ typedef struct
#define AUTOPRESS_DELAY 250 /* time to keep arrow pressed on KEY_DOWN */
#define REPEAT_DELAY 50 /* delay between auto-increments */
-#define DEFAULT_WIDTH 14 /* default width of the ctrl */
+#define DEFAULT_WIDTH 16 /* default width of the ctrl */
#define DEFAULT_XSEP 0 /* default separation between buddy and ctrl */
#define DEFAULT_ADDTOP 0 /* amount to extend above the buddy window */
#define DEFAULT_ADDBOT 0 /* amount to extend below the buddy window */
@@ -100,9 +100,9 @@ typedef struct
#define UPDOWN_GetInfoPtr(hwnd) ((UPDOWN_INFO *)GetWindowLongPtrW (hwnd,0))
#define COUNT_OF(a) (sizeof(a)/sizeof(a[0]))
-static const WCHAR BUDDY_UPDOWN_HWND[] = { 'b', 'u', 'd', 'd', 'y', 'U', 'p', 'D', 'o', 'w', 'n', 'H', 'W', 'N', 'D', 0 };
-static const WCHAR BUDDY_SUPERCLASS_WNDPROC[] = { 'b', 'u', 'd', 'd', 'y', 'S', 'u', 'p', 'p', 'e', 'r',
- 'C', 'l', 'a', 's', 's', 'W', 'n', 'd', 'P', 'r', 'o', 'c', 0 };
+/* id used for SetWindowSubclass */
+#define BUDDY_SUBCLASSID 1
+
static void UPDOWN_DoAction (UPDOWN_INFO *infoPtr, int delta, int action);
/***********************************************************************
@@ -200,7 +200,7 @@ static void UPDOWN_GetArrowRect (const UPDOWN_INFO* infoPtr, RECT *rect, int arr
/* now figure out if we need a space away from the buddy */
if (IsWindow(infoPtr->Buddy) ) {
if (infoPtr->dwStyle & UDS_ALIGNLEFT) rect->right -= spacer;
- else rect->left += spacer;
+ else if (infoPtr->dwStyle & UDS_ALIGNRIGHT) rect->left += spacer;
}
/*
@@ -309,8 +309,10 @@ static BOOL UPDOWN_GetBuddyInt (UPDOWN_INFO *infoPtr)
*/
static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr)
{
- WCHAR fmt[3] = { '%', 'd', '\0' };
- WCHAR txt[20];
+ static const WCHAR fmt_hex[] = { '0', 'x', '%', '0', '4', 'X', 0 };
+ static const WCHAR fmt_dec_oct[] = { '%', 'd', '\0' };
+ const WCHAR *fmt;
+ WCHAR txt[20], txt_old[20] = { 0 };
int len;
if (!((infoPtr->Flags & FLAG_BUDDYINT) && IsWindow(infoPtr->Buddy)))
@@ -324,7 +326,7 @@ static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr)
}
/* Regular window, so set caption to the number */
- if (infoPtr->Base == 16) fmt[1] = 'X';
+ fmt = (infoPtr->Base == 16) ? fmt_hex : fmt_dec_oct;
len = wsprintfW(txt, fmt, infoPtr->CurVal);
@@ -345,6 +347,10 @@ static BOOL UPDOWN_SetBuddyInt (const UPDOWN_INFO *infoPtr)
*dst = 0;
}
+ /* if nothing changed exit earlier */
+ GetWindowTextW(infoPtr->Buddy, txt_old, sizeof(txt_old)/sizeof(WCHAR));
+ if (lstrcmpiW(txt_old, txt) == 0) return 0;
+
return SetWindowTextW(infoPtr->Buddy, txt);
}
@@ -455,7 +461,7 @@ static LRESULT UPDOWN_Paint (const UPDOWN_INFO *infoPtr, HDC hdc)
*/
static LRESULT UPDOWN_KeyPressed(UPDOWN_INFO *infoPtr, int key)
{
- int arrow;
+ int arrow, accel;
if (key == VK_UP) arrow = FLAG_INCR;
else if (key == VK_DOWN) arrow = FLAG_DECR;
@@ -466,7 +472,8 @@ static LRESULT UPDOWN_KeyPressed(UPDOWN_INFO *infoPtr, int key)
infoPtr->Flags |= FLAG_PRESSED | arrow;
InvalidateRect (infoPtr->Self, NULL, FALSE);
SetTimer(infoPtr->Self, TIMER_AUTOPRESS, AUTOPRESS_DELAY, 0);
- UPDOWN_DoAction (infoPtr, 1, arrow);
+ accel = (infoPtr->AccelCount && infoPtr->AccelVect) ? infoPtr->AccelVect[0].nInc : 1;
+ UPDOWN_DoAction (infoPtr, accel, arrow);
return 0;
}
@@ -518,14 +525,13 @@ static LRESULT UPDOWN_MouseWheel(UPDOWN_INFO *infoPtr, WPARAM wParam)
* control.
*/
static LRESULT CALLBACK
-UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
+UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
+ UINT_PTR uId, DWORD_PTR ref_data)
{
- WNDPROC superClassWndProc = (WNDPROC)GetPropW(hwnd, BUDDY_SUPERCLASS_WNDPROC);
- HWND upDownHwnd = GetPropW(hwnd, BUDDY_UPDOWN_HWND);
- UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr(upDownHwnd);
+ UPDOWN_INFO *infoPtr = UPDOWN_GetInfoPtr((HWND)ref_data);
- TRACE("hwnd=%p, wndProc=%p, uMsg=%04x, wParam=%08lx, lParam=%08lx\n",
- hwnd, superClassWndProc, uMsg, wParam, lParam);
+ TRACE("hwnd=%p, uMsg=%04x, wParam=%08lx, lParam=%08lx\n",
+ hwnd, uMsg, wParam, lParam);
switch(uMsg)
{
@@ -542,7 +548,7 @@ UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
break;
}
- return CallWindowProcW( superClassWndProc, hwnd, uMsg, wParam, lParam);
+ return DefSubclassProc(hwnd, uMsg, wParam, lParam);
}
/***********************************************************************
@@ -550,18 +556,15 @@ UPDOWN_Buddy_SubclassProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
*
* Sets bud as a new Buddy.
* Then, it should subclass the buddy
- * If window has the UDS_ARROWKEYS, it subcalsses the buddy window to
+ * If window has the UDS_ARROWKEYS, it subclasses the buddy window to
* process the UP/DOWN arrow keys.
* If window has the UDS_ALIGNLEFT or UDS_ALIGNRIGHT style
* the size/pos of the buddy and the control are adjusted accordingly.
*/
static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
{
- static const WCHAR editW[] = { 'E', 'd', 'i', 't', 0 };
- static const WCHAR listboxW[] = { 'L', 'i', 's', 't', 'b', 'o', 'x', 0 };
RECT budRect; /* new coord for the buddy */
int x, width; /* new x position and width for the up-down */
- WNDPROC baseWndProc;
WCHAR buddyClass[40];
HWND ret;
@@ -569,38 +572,27 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
ret = infoPtr->Buddy;
- /* there is already a body assigned */
- if (infoPtr->Buddy) RemovePropW(infoPtr->Buddy, BUDDY_UPDOWN_HWND);
-
- if(!IsWindow(bud))
- bud = 0;
+ /* there is already a buddy assigned */
+ if (infoPtr->Buddy) RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc,
+ BUDDY_SUBCLASSID);
+ if (!IsWindow(bud)) bud = NULL;
/* Store buddy window handle */
infoPtr->Buddy = bud;
if(bud) {
-
- /* keep upDown ctrl hwnd in a buddy property */
- SetPropW( bud, BUDDY_UPDOWN_HWND, infoPtr->Self);
-
/* Store buddy window class type */
infoPtr->BuddyType = BUDDY_TYPE_UNKNOWN;
if (GetClassNameW(bud, buddyClass, COUNT_OF(buddyClass))) {
- if (lstrcmpiW(buddyClass, editW) == 0)
+ if (lstrcmpiW(buddyClass, WC_EDITW) == 0)
infoPtr->BuddyType = BUDDY_TYPE_EDIT;
- else if (lstrcmpiW(buddyClass, listboxW) == 0)
+ else if (lstrcmpiW(buddyClass, WC_LISTBOXW) == 0)
infoPtr->BuddyType = BUDDY_TYPE_LISTBOX;
}
- if (infoPtr->dwStyle & UDS_ARROWKEYS) {
- /* Note that I don't clear the BUDDY_SUPERCLASS_WNDPROC property
- when we reset the upDown ctrl buddy to another buddy because it is not
- good to break the window proc chain. */
- if (!GetPropW(bud, BUDDY_SUPERCLASS_WNDPROC)) {
- baseWndProc = (WNDPROC)SetWindowLongPtrW(bud, GWLP_WNDPROC, (LPARAM)UPDOWN_Buddy_SubclassProc);
- SetPropW(bud, BUDDY_SUPERCLASS_WNDPROC, baseWndProc);
- }
- }
+ if (infoPtr->dwStyle & UDS_ARROWKEYS)
+ SetWindowSubclass(bud, UPDOWN_Buddy_SubclassProc, BUDDY_SUBCLASSID,
+ (DWORD_PTR)infoPtr->Self);
/* Get the rect of the buddy relative to its parent */
GetWindowRect(infoPtr->Buddy, &budRect);
@@ -661,7 +653,7 @@ static HWND UPDOWN_SetBuddy (UPDOWN_INFO* infoPtr, HWND bud)
* 'delta' amount according to the 'action' flag which can be a
* combination of FLAG_INCR and FLAG_DECR
* It notifies the parent as required.
- * It handles wraping and non-wraping correctly.
+ * It handles wrapping and non-wrapping correctly.
* It is assumed that delta>0
*/
static void UPDOWN_DoAction (UPDOWN_INFO *infoPtr, int delta, int action)
@@ -856,13 +848,16 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
switch(message)
{
case WM_CREATE:
+ {
+ CREATESTRUCTW *pcs = (CREATESTRUCTW*)lParam;
+
infoPtr = Alloc (sizeof(UPDOWN_INFO));
SetWindowLongPtrW (hwnd, 0, (DWORD_PTR)infoPtr);
/* initialize the info struct */
infoPtr->Self = hwnd;
- infoPtr->Notify = ((LPCREATESTRUCTW)lParam)->hwndParent;
- infoPtr->dwStyle = ((LPCREATESTRUCTW)lParam)->style;
+ infoPtr->Notify = pcs->hwndParent;
+ infoPtr->dwStyle = pcs->style;
infoPtr->AccelCount = 0;
infoPtr->AccelVect = 0;
infoPtr->AccelIndex = -1;
@@ -874,21 +869,26 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
infoPtr->Flags = (infoPtr->dwStyle & UDS_SETBUDDYINT) ? FLAG_BUDDYINT : 0;
SetWindowLongW (hwnd, GWL_STYLE, infoPtr->dwStyle & ~WS_BORDER);
+ if (!(infoPtr->dwStyle & UDS_HORZ))
+ SetWindowPos (hwnd, NULL, 0, 0, DEFAULT_WIDTH, pcs->cy,
+ SWP_NOOWNERZORDER | SWP_NOZORDER | SWP_NOMOVE);
/* Do we pick the buddy win ourselves? */
if (infoPtr->dwStyle & UDS_AUTOBUDDY)
UPDOWN_SetBuddy (infoPtr, GetWindow (hwnd, GW_HWNDPREV));
- OpenThemeData (hwnd, themeClass);
+ OpenThemeData (hwnd, themeClass);
TRACE("UpDown Ctrl creation, hwnd=%p\n", hwnd);
+ }
break;
case WM_DESTROY:
Free (infoPtr->AccelVect);
- if(infoPtr->Buddy) RemovePropW(infoPtr->Buddy, BUDDY_UPDOWN_HWND);
-
+ if (infoPtr->Buddy)
+ RemoveWindowSubclass(infoPtr->Buddy, UPDOWN_Buddy_SubclassProc,
+ BUDDY_SUBCLASSID);
Free (infoPtr);
SetWindowLongPtrW (hwnd, 0, 0);
theme = GetWindowTheme (hwnd);
@@ -930,18 +930,18 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
/* if initial timer, kill it and start the repeat timer */
if(wParam == TIMER_AUTOREPEAT) {
- int temp;
+ INT delay;
KillTimer(hwnd, TIMER_AUTOREPEAT);
/* if no accel info given, used default timer */
if(infoPtr->AccelCount==0 || infoPtr->AccelVect==0) {
infoPtr->AccelIndex = -1;
- temp = REPEAT_DELAY;
+ delay = REPEAT_DELAY;
} else {
infoPtr->AccelIndex = 0; /* otherwise, use it */
- temp = infoPtr->AccelVect[infoPtr->AccelIndex].nSec * 1000 + 1;
+ delay = infoPtr->AccelVect[infoPtr->AccelIndex].nSec * 1000 + 1;
}
- SetTimer(hwnd, TIMER_ACCEL, temp, 0);
+ SetTimer(hwnd, TIMER_ACCEL, delay, 0);
}
/* now, if the mouse is above us, do the thing...*/
@@ -1011,8 +1011,6 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
case UDM_SETACCEL:
{
- unsigned temp;
-
TRACE("UDM_SETACCEL\n");
if(infoPtr->AccelVect) {
@@ -1026,8 +1024,14 @@ static LRESULT WINAPI UpDownWindowProc(HWND hwnd, UINT message, WPARAM wParam, L
memcpy(infoPtr->AccelVect, (void*)lParam, wParam*sizeof(UDACCEL));
infoPtr->AccelCount = wParam;
- for (temp = 0; temp < wParam; temp++)
- TRACE("%d: nSec %u nInc %u\n", temp, infoPtr->AccelVect[temp].nSec, infoPtr->AccelVect[temp].nInc);
+ if (TRACE_ON(updown))
+ {
+ INT i;
+
+ for (i = 0; i < wParam; i++)
+ TRACE("%d: nSec %u nInc %u\n", i,
+ infoPtr->AccelVect[i].nSec, infoPtr->AccelVect[i].nInc);
+ }
return TRUE;
}
diff --git a/dll/win32/comdlg32/comdlg32.rbuild b/dll/win32/comdlg32/comdlg32.rbuild
index d9ea84d9e28..70c0322000f 100644
--- a/dll/win32/comdlg32/comdlg32.rbuild
+++ b/dll/win32/comdlg32/comdlg32.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/crypt32/cert.c b/dll/win32/crypt32/cert.c
index c25e612574f..12c013e7a4a 100644
--- a/dll/win32/crypt32/cert.c
+++ b/dll/win32/crypt32/cert.c
@@ -113,9 +113,21 @@ BOOL WINAPI CertAddCertificateLinkToStore(HCERTSTORE hCertStore,
PCCERT_CONTEXT pCertContext, DWORD dwAddDisposition,
PCCERT_CONTEXT *ppCertContext)
{
- FIXME("(%p, %p, %08x, %p)\n", hCertStore, pCertContext, dwAddDisposition,
- ppCertContext);
- return FALSE;
+ static int calls;
+ PWINECRYPT_CERTSTORE store = (PWINECRYPT_CERTSTORE)hCertStore;
+
+ if (!(calls++))
+ FIXME("(%p, %p, %08x, %p): semi-stub\n", hCertStore, pCertContext,
+ dwAddDisposition, ppCertContext);
+ if (store->dwMagic != WINE_CRYPTCERTSTORE_MAGIC)
+ return FALSE;
+ if (store->type == StoreTypeCollection)
+ {
+ SetLastError(E_INVALIDARG);
+ return FALSE;
+ }
+ return CertAddCertificateContextToStore(hCertStore, pCertContext,
+ dwAddDisposition, ppCertContext);
}
PCCERT_CONTEXT WINAPI CertCreateCertificateContext(DWORD dwCertEncodingType,
diff --git a/dll/win32/crypt32/chain.c b/dll/win32/crypt32/chain.c
index 1724f4254fe..e951ef8e9c5 100644
--- a/dll/win32/crypt32/chain.c
+++ b/dll/win32/crypt32/chain.c
@@ -152,6 +152,20 @@ HCERTCHAINENGINE CRYPT_CreateChainEngine(HCERTSTORE root,
return engine;
}
+typedef struct _CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT
+{
+ DWORD cbSize;
+ HCERTSTORE hRestrictedRoot;
+ HCERTSTORE hRestrictedTrust;
+ HCERTSTORE hRestrictedOther;
+ DWORD cAdditionalStore;
+ HCERTSTORE *rghAdditionalStore;
+ DWORD dwFlags;
+ DWORD dwUrlRetrievalTimeout;
+ DWORD MaximumCachedCertificates;
+ DWORD CycleDetectionModulus;
+} CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT;
+
BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig,
HCERTCHAINENGINE *phChainEngine)
{
@@ -159,7 +173,8 @@ BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig,
TRACE("(%p, %p)\n", pConfig, phChainEngine);
- if (pConfig->cbSize != sizeof(*pConfig))
+ if (pConfig->cbSize != sizeof(CERT_CHAIN_ENGINE_CONFIG_NO_EXCLUSIVE_ROOT)
+ && pConfig->cbSize != sizeof(CERT_CHAIN_ENGINE_CONFIG))
{
SetLastError(E_INVALIDARG);
return FALSE;
@@ -171,7 +186,10 @@ BOOL WINAPI CertCreateCertificateChainEngine(PCERT_CHAIN_ENGINE_CONFIG pConfig,
HCERTSTORE root;
HCERTCHAINENGINE engine;
- if (pConfig->hRestrictedRoot)
+ if (pConfig->cbSize >= sizeof(CERT_CHAIN_ENGINE_CONFIG) &&
+ pConfig->hExclusiveRoot)
+ root = CertDuplicateStore(pConfig->hExclusiveRoot);
+ else if (pConfig->hRestrictedRoot)
root = CertDuplicateStore(pConfig->hRestrictedRoot);
else
root = CertOpenSystemStoreW(0, rootW);
@@ -3017,7 +3035,31 @@ static BOOL match_dns_to_subject_alt_name(PCERT_EXTENSION ext,
{
TRACE_(chain)("dNSName: %s\n", debugstr_w(
subjectName->rgAltEntry[i].u.pwszDNSName));
- if (!strcmpiW(server_name,
+ if (subjectName->rgAltEntry[i].u.pwszDNSName[0] == '*')
+ {
+ LPCWSTR server_name_dot;
+
+ /* Matching a wildcard: a wildcard matches a single name
+ * component, which is terminated by a dot. RFC 1034
+ * doesn't define whether multiple wildcards are allowed,
+ * but I will assume that they are not until proven
+ * otherwise. RFC 1034 also states that 'the "*" label
+ * always matches at least one whole label and sometimes
+ * more, but always whole labels.' Native crypt32 does not
+ * match more than one label with a wildcard, so I do the
+ * same here. Thus, a wildcard only accepts the first
+ * label, then requires an exact match of the remaining
+ * string.
+ */
+ server_name_dot = strchrW(server_name, '.');
+ if (server_name_dot)
+ {
+ if (!strcmpiW(server_name_dot,
+ subjectName->rgAltEntry[i].u.pwszDNSName + 1))
+ matches = TRUE;
+ }
+ }
+ else if (!strcmpiW(server_name,
subjectName->rgAltEntry[i].u.pwszDNSName))
matches = TRUE;
}
diff --git a/dll/win32/crypt32/regstore.c b/dll/win32/crypt32/regstore.c
index 296b0c9a5b9..f4b4295835a 100644
--- a/dll/win32/crypt32/regstore.c
+++ b/dll/win32/crypt32/regstore.c
@@ -479,6 +479,10 @@ static BOOL WINAPI CRYPT_RegControl(HCERTSTORE hCertStore, DWORD dwFlags,
ret = CRYPT_RegFlushStore(store,
dwFlags & CERT_STORE_CTRL_COMMIT_FORCE_FLAG);
break;
+ case CERT_STORE_CTRL_AUTO_RESYNC:
+ FIXME("CERT_STORE_CTRL_AUTO_RESYNC: stub\n");
+ ret = TRUE;
+ break;
default:
FIXME("%d: stub\n", dwCtrlType);
ret = FALSE;
diff --git a/dll/win32/crypt32/store.c b/dll/win32/crypt32/store.c
index a8923949974..da3de5650db 100644
--- a/dll/win32/crypt32/store.c
+++ b/dll/win32/crypt32/store.c
@@ -855,7 +855,16 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
TRACE("(%p, %p, %08x, %p)\n", hCertStore, pCertContext,
dwAddDisposition, ppStoreContext);
- if (dwAddDisposition != CERT_STORE_ADD_ALWAYS)
+ switch (dwAddDisposition)
+ {
+ case CERT_STORE_ADD_ALWAYS:
+ break;
+ case CERT_STORE_ADD_NEW:
+ case CERT_STORE_ADD_REPLACE_EXISTING:
+ case CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES:
+ case CERT_STORE_ADD_USE_EXISTING:
+ case CERT_STORE_ADD_NEWER:
+ case CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES:
{
BYTE hashToAdd[20];
DWORD size = sizeof(hashToAdd);
@@ -870,6 +879,12 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
pCertContext->dwCertEncodingType, 0, CERT_FIND_SHA1_HASH, &blob,
NULL);
}
+ break;
+ }
+ default:
+ FIXME("Unimplemented add disposition %d\n", dwAddDisposition);
+ SetLastError(E_INVALIDARG);
+ ret = FALSE;
}
switch (dwAddDisposition)
@@ -940,10 +955,6 @@ BOOL WINAPI CertAddCertificateContextToStore(HCERTSTORE hCertStore,
else
toAdd = CertDuplicateCertificateContext(pCertContext);
break;
- default:
- FIXME("Unimplemented add disposition %d\n", dwAddDisposition);
- SetLastError(E_INVALIDARG);
- ret = FALSE;
}
if (toAdd)
diff --git a/dll/win32/dhcpcsvc/dhcp/adapter.c b/dll/win32/dhcpcsvc/dhcp/adapter.c
index ea848bc8bcc..324847819ba 100644
--- a/dll/win32/dhcpcsvc/dhcp/adapter.c
+++ b/dll/win32/dhcpcsvc/dhcp/adapter.c
@@ -227,141 +227,168 @@ InterfaceConnected(MIB_IFROW IfEntry)
/*
* XXX Figure out the way to bind a specific adapter to a socket.
*/
-BOOLEAN AdapterDiscover() {
+DWORD WINAPI AdapterDiscoveryThread(LPVOID Unused) {
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;
- BOOLEAN ret = TRUE;
- DH_DbgPrint(MID_TRACE,("Getting Adapter List...\n"));
+ /* FIXME: Kill this thread when the service is stopped */
- while( (Error = GetIfTable(Table, &Size, 0 )) ==
- ERROR_INSUFFICIENT_BUFFER ) {
- DH_DbgPrint(MID_TRACE,("Error %d, New Buffer Size: %d\n", Error, Size));
- free( Table );
- Table = (PMIB_IFTABLE) malloc( Size );
- }
+ do {
+ DH_DbgPrint(MID_TRACE,("Getting Adapter List...\n"));
- if( Error != NO_ERROR ) {
- ret = FALSE;
- goto term;
- }
+ while( (Error = GetIfTable(Table, &Size, 0 )) ==
+ ERROR_INSUFFICIENT_BUFFER ) {
+ DH_DbgPrint(MID_TRACE,("Error %d, New Buffer Size: %d\n", Error, Size));
+ free( Table );
+ Table = (PMIB_IFTABLE) malloc( Size );
+ }
- DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries));
+ if( Error != NO_ERROR )
+ break;
- for( i = Table->dwNumEntries - 1; i >= 0; i-- ) {
- DH_DbgPrint(MID_TRACE,("Getting adapter %d attributes\n",
- Table->table[i].dwIndex));
+ DH_DbgPrint(MID_TRACE,("Got Adapter List (%d entries)\n", Table->dwNumEntries));
- if ((Adapter = 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 && InterfaceConnected(Table->table[i])) {
- memcpy( &Adapter->IfMib, &Table->table[i],
- sizeof(Adapter->IfMib) );
- Adapter->DhclientInfo.client = &Adapter->DhclientState;
- Adapter->DhclientInfo.rbuf = Adapter->recv_buf;
- Adapter->DhclientInfo.rbuf_max = Table->table[i].dwMtu;
- Adapter->DhclientInfo.rbuf_len =
- Adapter->DhclientInfo.rbuf_offset = 0;
- memcpy(Adapter->DhclientInfo.hw_address.haddr,
- Adapter->IfMib.bPhysAddr,
- Adapter->IfMib.dwPhysAddrLen);
- Adapter->DhclientInfo.hw_address.hlen =
- Adapter->IfMib.dwPhysAddrLen;
- /* I'm not sure where else to set this, but
- some DHCP servers won't take a zero.
- We checked the hardware type earlier in
- the if statement. */
- Adapter->DhclientInfo.hw_address.htype =
- HTYPE_ETHER;
-
- if( DhcpSocket == INVALID_SOCKET ) {
- DhcpSocket =
- Adapter->DhclientInfo.rfdesc =
- Adapter->DhclientInfo.wfdesc =
- socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
-
- if (DhcpSocket != INVALID_SOCKET) {
- Adapter->ListenAddr.sin_family = AF_INET;
- Adapter->ListenAddr.sin_port = htons(LOCAL_PORT);
- Adapter->BindStatus =
- (bind( Adapter->DhclientInfo.rfdesc,
- (struct sockaddr *)&Adapter->ListenAddr,
- sizeof(Adapter->ListenAddr) ) == 0) ?
- 0 : WSAGetLastError();
- } else {
- error("socket() failed: %d\n", WSAGetLastError());
- }
- } else {
- Adapter->DhclientInfo.rfdesc =
- Adapter->DhclientInfo.wfdesc = DhcpSocket;
- }
-
- Adapter->DhclientConfig.timeout = DHCP_PANIC_TIMEOUT;
- Adapter->DhclientConfig.initial_interval = DHCP_DISCOVER_INTERVAL;
- Adapter->DhclientConfig.retry_interval = DHCP_DISCOVER_INTERVAL;
- Adapter->DhclientConfig.select_interval = 1;
- Adapter->DhclientConfig.reboot_timeout = DHCP_REBOOT_TIMEOUT;
- Adapter->DhclientConfig.backoff_cutoff = DHCP_BACKOFF_MAX;
- Adapter->DhclientState.interval =
- Adapter->DhclientConfig.retry_interval;
-
- if( PrepareAdapterForService( Adapter ) ) {
- Adapter->DhclientInfo.next = ifi;
- ifi = &Adapter->DhclientInfo;
-
- read_client_conf(&Adapter->DhclientInfo);
-
- if (Adapter->DhclientInfo.client->state == S_INIT)
- {
- add_protocol(Adapter->DhclientInfo.name,
- Adapter->DhclientInfo.rfdesc,
- got_one, &Adapter->DhclientInfo);
-
- state_init(&Adapter->DhclientInfo);
- }
-
- InsertTailList( &AdapterList, &Adapter->ListEntry );
- } else { free( Adapter ); Adapter = 0; }
- } else { free( Adapter ); Adapter = 0; }
-
- if( !Adapter )
- DH_DbgPrint(MID_TRACE,("Adapter %d was rejected\n",
+ for( i = Table->dwNumEntries - 1; i >= 0; i-- ) {
+ DH_DbgPrint(MID_TRACE,("Getting adapter %d attributes\n",
Table->table[i].dwIndex));
- }
- DH_DbgPrint(MID_TRACE,("done with AdapterInit\n"));
+ ApiLock();
+
+ if ((Adapter = 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);
+ }
+
+ ApiUnlock();
+
+ continue;
+ }
+
+ ApiUnlock();
+
+ Adapter = (DHCP_ADAPTER*) calloc( sizeof( DHCP_ADAPTER ) + Table->table[i].dwMtu, 1 );
+
+ 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;
+ Adapter->DhclientInfo.rbuf = Adapter->recv_buf;
+ Adapter->DhclientInfo.rbuf_max = Table->table[i].dwMtu;
+ Adapter->DhclientInfo.rbuf_len =
+ Adapter->DhclientInfo.rbuf_offset = 0;
+ memcpy(Adapter->DhclientInfo.hw_address.haddr,
+ Adapter->IfMib.bPhysAddr,
+ Adapter->IfMib.dwPhysAddrLen);
+ Adapter->DhclientInfo.hw_address.hlen = Adapter->IfMib.dwPhysAddrLen;
+
+ /* I'm not sure where else to set this, but
+ some DHCP servers won't take a zero.
+ We checked the hardware type earlier in
+ the if statement. */
+ Adapter->DhclientInfo.hw_address.htype = HTYPE_ETHER;
+
+ if( DhcpSocket == INVALID_SOCKET ) {
+ DhcpSocket =
+ Adapter->DhclientInfo.rfdesc =
+ Adapter->DhclientInfo.wfdesc =
+ socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP );
+
+ if (DhcpSocket != INVALID_SOCKET) {
+ Adapter->ListenAddr.sin_family = AF_INET;
+ Adapter->ListenAddr.sin_port = htons(LOCAL_PORT);
+ Adapter->BindStatus =
+ (bind( Adapter->DhclientInfo.rfdesc,
+ (struct sockaddr *)&Adapter->ListenAddr,
+ sizeof(Adapter->ListenAddr) ) == 0) ?
+ 0 : WSAGetLastError();
+ } else {
+ error("socket() failed: %d\n", WSAGetLastError());
+ }
+ } else {
+ Adapter->DhclientInfo.rfdesc =
+ Adapter->DhclientInfo.wfdesc = DhcpSocket;
+ }
+
+ Adapter->DhclientConfig.timeout = DHCP_PANIC_TIMEOUT;
+ Adapter->DhclientConfig.initial_interval = DHCP_DISCOVER_INTERVAL;
+ Adapter->DhclientConfig.retry_interval = DHCP_DISCOVER_INTERVAL;
+ Adapter->DhclientConfig.select_interval = 1;
+ Adapter->DhclientConfig.reboot_timeout = DHCP_REBOOT_TIMEOUT;
+ Adapter->DhclientConfig.backoff_cutoff = DHCP_BACKOFF_MAX;
+ Adapter->DhclientState.interval =
+ Adapter->DhclientConfig.retry_interval;
+
+ if( PrepareAdapterForService( Adapter ) ) {
+ Adapter->DhclientInfo.next = ifi;
+ ifi = &Adapter->DhclientInfo;
+
+ read_client_conf(&Adapter->DhclientInfo);
+
+ if (Adapter->DhclientInfo.client->state == S_INIT)
+ {
+ add_protocol(Adapter->DhclientInfo.name,
+ Adapter->DhclientInfo.rfdesc,
+ got_one, &Adapter->DhclientInfo);
+
+ state_init(&Adapter->DhclientInfo);
+ }
+
+ ApiLock();
+ InsertTailList( &AdapterList, &Adapter->ListEntry );
+ ApiUnlock();
+ } else { free( Adapter ); Adapter = 0; }
+ } else { free( Adapter ); Adapter = 0; }
+
+ if( !Adapter )
+ DH_DbgPrint(MID_TRACE,("Adapter %d was rejected\n",
+ Table->table[i].dwIndex));
+ }
+ } while ((Error = NotifyAddrChange(NULL, NULL)) == NO_ERROR);
+
+ DbgPrint("DHCPCSVC: Adapter discovery thread is terminating! (Error: %d)\n", Error);
-term:
if( Table ) free( Table );
- return ret;
+ return Error;
+}
+
+BOOLEAN StartAdapterDiscovery(VOID) {
+ HANDLE ThreadHandle;
+
+ ThreadHandle = CreateThread(NULL,
+ 0,
+ AdapterDiscoveryThread,
+ NULL,
+ 0,
+ NULL);
+
+ if (ThreadHandle == NULL)
+ return FALSE;
+
+ CloseHandle(ThreadHandle);
+
+ return TRUE;
}
void AdapterStop() {
PLIST_ENTRY ListEntry;
PDHCP_ADAPTER Adapter;
+ ApiLock();
while( !IsListEmpty( &AdapterList ) ) {
ListEntry = (PLIST_ENTRY)RemoveHeadList( &AdapterList );
Adapter = CONTAINING_RECORD( ListEntry, DHCP_ADAPTER, ListEntry );
free( Adapter );
}
+ ApiUnlock();
WSACleanup();
}
diff --git a/dll/win32/dhcpcsvc/dhcp/dispatch.c b/dll/win32/dhcpcsvc/dhcp/dispatch.c
index b429f9517e7..8749a121270 100644
--- a/dll/win32/dhcpcsvc/dhcp/dispatch.c
+++ b/dll/win32/dhcpcsvc/dhcp/dispatch.c
@@ -69,7 +69,7 @@ dispatch(void)
time_t howlong, cur_time;
struct timeval timeval;
- if (!AdapterDiscover())
+ if (!StartAdapterDiscovery())
return;
ApiLock();
diff --git a/dll/win32/dhcpcsvc/dhcpcsvc.rbuild b/dll/win32/dhcpcsvc/dhcpcsvc.rbuild
index 773c295b21c..7afd68b4775 100644
--- a/dll/win32/dhcpcsvc/dhcpcsvc.rbuild
+++ b/dll/win32/dhcpcsvc/dhcpcsvc.rbuild
@@ -7,6 +7,10 @@
iphlpapi
advapi32
oldnames
+
+
+ _tzset
+
adapter.c
alloc.c
diff --git a/dll/win32/dhcpcsvc/include/rosdhcp.h b/dll/win32/dhcpcsvc/include/rosdhcp.h
index 48c67167f3e..019ab12ac22 100644
--- a/dll/win32/dhcpcsvc/include/rosdhcp.h
+++ b/dll/win32/dhcpcsvc/include/rosdhcp.h
@@ -77,7 +77,7 @@ typedef DWORD (*PipeSendFunc)( COMM_DHCP_REPLY *Reply );
#define srandom srand
void AdapterInit(VOID);
-BOOLEAN AdapterDiscover(VOID);
+BOOLEAN StartAdapterDiscovery(VOID);
void AdapterStop(VOID);
extern PDHCP_ADAPTER AdapterGetFirst();
extern PDHCP_ADAPTER AdapterGetNext(PDHCP_ADAPTER);
diff --git a/dll/win32/imaadp32.acm/imaadp32.acm.rbuild b/dll/win32/imaadp32.acm/imaadp32.acm.rbuild
index f2b04bb6914..073f714f979 100644
--- a/dll/win32/imaadp32.acm/imaadp32.acm.rbuild
+++ b/dll/win32/imaadp32.acm/imaadp32.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/inetmib1/inetmib1.rbuild b/dll/win32/inetmib1/inetmib1.rbuild
index 77c39b582a1..27079b19c05 100644
--- a/dll/win32/inetmib1/inetmib1.rbuild
+++ b/dll/win32/inetmib1/inetmib1.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/iphlpapi/iphlpapi_main.c b/dll/win32/iphlpapi/iphlpapi_main.c
index 3fd68560c17..8508d2d416a 100644
--- a/dll/win32/iphlpapi/iphlpapi_main.c
+++ b/dll/win32/iphlpapi/iphlpapi_main.c
@@ -63,7 +63,6 @@ typedef struct _NAME_SERVER_LIST_CONTEXT {
BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
- DWORD Version;
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls( hinstDLL );
diff --git a/dll/win32/jscript/dispex.c b/dll/win32/jscript/dispex.c
index 6894eae0515..07880bcff5b 100644
--- a/dll/win32/jscript/dispex.c
+++ b/dll/win32/jscript/dispex.c
@@ -358,6 +358,9 @@ static HRESULT prop_put(DispatchEx *This, dispex_prop_t *prop, VARIANT *val,
{
HRESULT hres;
+ if(prop->flags & PROPF_CONST)
+ return S_OK;
+
switch(prop->type) {
case PROP_BUILTIN:
if(!(prop->flags & PROPF_METHOD)) {
@@ -974,6 +977,18 @@ HRESULT jsdisp_propput_name(DispatchEx *obj, const WCHAR *name, VARIANT *val, js
return prop_put(obj, prop, val, ei, caller);
}
+HRESULT jsdisp_propput_const(DispatchEx *obj, const WCHAR *name, VARIANT *val)
+{
+ dispex_prop_t *prop;
+ HRESULT hres;
+
+ hres = ensure_prop_name(obj, name, FALSE, PROPF_ENUM|PROPF_CONST, &prop);
+ if(FAILED(hres))
+ return hres;
+
+ return VariantCopy(&prop->u.var, val);
+}
+
HRESULT jsdisp_propput_idx(DispatchEx *obj, DWORD idx, VARIANT *val, jsexcept_t *ei, IServiceProvider *caller)
{
WCHAR buf[12];
diff --git a/dll/win32/jscript/function.c b/dll/win32/jscript/function.c
index c7494cfce6c..df46f1d996d 100644
--- a/dll/win32/jscript/function.c
+++ b/dll/win32/jscript/function.c
@@ -606,7 +606,16 @@ HRESULT create_builtin_function(script_ctx_t *ctx, builtin_invoke_t value_proc,
if(FAILED(hres))
return hres;
- hres = set_prototype(ctx, &function->dispex, prototype);
+ if(builtin_info) {
+ VARIANT var;
+
+ V_VT(&var) = VT_I4;
+ V_I4(&var) = function->length;
+ hres = jsdisp_propput_const(&function->dispex, lengthW, &var);
+ }
+
+ if(SUCCEEDED(hres))
+ hres = set_prototype(ctx, &function->dispex, prototype);
if(FAILED(hres)) {
jsdisp_release(&function->dispex);
return hres;
diff --git a/dll/win32/jscript/global.c b/dll/win32/jscript/global.c
index af142ed4db3..92a0cbecd61 100644
--- a/dll/win32/jscript/global.c
+++ b/dll/win32/jscript/global.c
@@ -550,7 +550,7 @@ static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
LONGLONG d = 0, hlp;
- int exp = 0, length;
+ int exp = 0;
VARIANT *arg;
WCHAR *str;
BSTR val_str = NULL;
@@ -569,7 +569,6 @@ static HRESULT JSGlobal_parseFloat(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
return hres;
str = val_str;
- length = SysStringLen(val_str);
while(isspaceW(*str)) str++;
diff --git a/dll/win32/jscript/jscript.c b/dll/win32/jscript/jscript.c
index 9a516aa5d71..c7c77e3aa39 100644
--- a/dll/win32/jscript/jscript.c
+++ b/dll/win32/jscript/jscript.c
@@ -71,6 +71,7 @@ void script_release(script_ctx_t *ctx)
return;
jsheap_free(&ctx->tmp_heap);
+ SysFreeString(ctx->last_match);
heap_free(ctx);
}
diff --git a/dll/win32/jscript/jscript.h b/dll/win32/jscript/jscript.h
index c1c8e60f35b..901f25d8b08 100644
--- a/dll/win32/jscript/jscript.h
+++ b/dll/win32/jscript/jscript.h
@@ -68,6 +68,7 @@ extern HINSTANCE jscript_hinstance;
#define PROPF_METHOD 0x0100
#define PROPF_ENUM 0x0200
#define PROPF_CONSTR 0x0400
+#define PROPF_CONST 0x0800
/* NOTE: Keep in sync with names in Object.toString implementation */
typedef enum {
@@ -203,6 +204,7 @@ HRESULT disp_propget(script_ctx_t*,IDispatch*,DISPID,VARIANT*,jsexcept_t*,IServi
HRESULT disp_propput(script_ctx_t*,IDispatch*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget(DispatchEx*,DISPID,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propput_name(DispatchEx*,const WCHAR*,VARIANT*,jsexcept_t*,IServiceProvider*);
+HRESULT jsdisp_propput_const(DispatchEx*,const WCHAR*,VARIANT*);
HRESULT jsdisp_propput_idx(DispatchEx*,DWORD,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_propget_name(DispatchEx*,LPCWSTR,VARIANT*,jsexcept_t*,IServiceProvider*);
HRESULT jsdisp_get_idx(DispatchEx*,DWORD,VARIANT*,jsexcept_t*,IServiceProvider*);
@@ -270,6 +272,10 @@ struct _script_ctx_t {
IDispatch *host_global;
+ BSTR last_match;
+ DWORD last_match_index;
+ DWORD last_match_length;
+
DispatchEx *global;
DispatchEx *function_constr;
DispatchEx *activex_constr;
@@ -318,8 +324,9 @@ typedef struct {
DWORD len;
} match_result_t;
-#define REM_CHECK_GLOBAL 0x0001
-#define REM_RESET_INDEX 0x0002
+#define REM_CHECK_GLOBAL 0x0001
+#define REM_RESET_INDEX 0x0002
+#define REM_NO_CTX_UPDATE 0x0004
HRESULT regexp_match_next(script_ctx_t*,DispatchEx*,DWORD,const WCHAR*,DWORD,const WCHAR**,match_result_t**,
DWORD*,DWORD*,match_result_t*);
HRESULT regexp_match(script_ctx_t*,DispatchEx*,const WCHAR*,DWORD,BOOL,match_result_t**,DWORD*);
diff --git a/dll/win32/jscript/jscript_Nl.rc b/dll/win32/jscript/jscript_Nl.rc
index c4f761a3922..fec11a08000 100644
--- a/dll/win32/jscript/jscript_Nl.rc
+++ b/dll/win32/jscript/jscript_Nl.rc
@@ -20,10 +20,13 @@
LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
+#pragma code_page(65001)
+
STRINGTABLE DISCARDABLE
{
IDS_TO_PRIMITIVE "Fout bij het omzetten van het object naar een primitief type"
IDS_INVALID_CALL_ARG "Ongeldige procedure-aanroep of argument"
+ IDS_CREATE_OBJ_ERROR "Automatiseringsserver kan het object niet creëren"
IDS_NO_PROPERTY "Dit object ondersteunt deze eigenschap of methode niet"
IDS_ARG_NOT_OPT "Argument is niet optioneel"
IDS_SYNTAX_ERROR "Syntax fout"
@@ -40,6 +43,7 @@ STRINGTABLE DISCARDABLE
IDS_NOT_BOOL "Boolean object verwacht"
IDS_JSCRIPT_EXPECTED "JScript object verwacht"
IDS_REGEXP_SYNTAX_ERROR "Syntax fout in reguliere expressie"
+ IDS_URI_INVALID_CHAR "De te coderen URI bevat ongeldige tekens"
IDS_INVALID_LENGTH "Array lengte moet een eindig, positief geheel getal zijn"
IDS_ARRAY_EXPECTED "Array object verwacht"
}
diff --git a/dll/win32/jscript/regexp.c b/dll/win32/jscript/regexp.c
index 7861d229826..fb541891a56 100644
--- a/dll/win32/jscript/regexp.c
+++ b/dll/win32/jscript/regexp.c
@@ -96,6 +96,12 @@ static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
static const WCHAR execW[] = {'e','x','e','c',0};
static const WCHAR testW[] = {'t','e','s','t',0};
+static const WCHAR leftContextW[] =
+ {'l','e','f','t','C','o','n','t','e','x','t',0};
+static const WCHAR rightContextW[] =
+ {'r','i','g','h','t','C','o','n','t','e','x','t',0};
+
+static const WCHAR undefinedW[] = {'u','n','d','e','f','i','n','e','d',0};
static const WCHAR emptyW[] = {0};
/* FIXME: Better error handling */
@@ -1977,7 +1983,7 @@ PushBackTrackState(REGlobalData *gData, REOp op,
ptrdiff_t btincr = ((char *)result + sz) -
((char *)gData->backTrackStack + btsize);
- TRACE("\tBT_Push: %lu,%lu\n", (unsigned long) parenIndex, (unsigned long) parenCount);
+ TRACE("\tBT_Push: %lu,%lu\n", (ULONG_PTR)parenIndex, (ULONG_PTR)parenCount);
JS_COUNT_OPERATION(gData->cx, JSOW_JUMP * (1 + parenCount));
if (btincr > 0) {
@@ -2729,7 +2735,7 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x)
case REOP_LPAREN:
pc = ReadCompactIndex(pc, &parenIndex);
- TRACE("[ %lu ]\n", (unsigned long) parenIndex);
+ TRACE("[ %lu ]\n", (ULONG_PTR)parenIndex);
assert(parenIndex < gData->regexp->parenCount);
if (parenIndex + 1 > parenSoFar)
parenSoFar = parenIndex + 1;
@@ -3093,8 +3099,8 @@ ExecuteREBytecode(REGlobalData *gData, REMatchState *x)
}
TRACE("\tBT_Pop: %ld,%ld\n",
- (unsigned long) backTrackData->parenIndex,
- (unsigned long) backTrackData->parenCount);
+ (ULONG_PTR)backTrackData->parenIndex,
+ (ULONG_PTR)backTrackData->parenCount);
continue;
}
x = result;
@@ -3342,8 +3348,6 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
}
if(parens) {
- DWORD i;
-
if(regexp->jsregexp->parenCount > *parens_size) {
match_result_t *new_parens;
@@ -3356,6 +3360,22 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
*parens = new_parens;
}
+ }
+
+ /* FIXME: We often already have a copy of input string that we could use to store last match */
+ if(!(rem_flags & REM_NO_CTX_UPDATE) &&
+ (!ctx->last_match || len != SysStringLen(ctx->last_match) || strncmpW(ctx->last_match, str, len))) {
+ BSTR last_match;
+
+ last_match = SysAllocStringLen(str, len);
+ if(!last_match)
+ return E_OUTOFMEMORY;
+ SysFreeString(ctx->last_match);
+ ctx->last_match = last_match;
+ }
+
+ if(parens) {
+ DWORD i;
*parens_cnt = regexp->jsregexp->parenCount;
@@ -3376,6 +3396,11 @@ static HRESULT do_regexp_match_next(script_ctx_t *ctx, RegExpInstance *regexp, D
ret->len = matchlen;
set_last_index(regexp, result->cp-str);
+ if(!(rem_flags & REM_NO_CTX_UPDATE)) {
+ ctx->last_match_index = ret->str-str;
+ ctx->last_match_length = matchlen;
+ }
+
return S_OK;
}
@@ -3712,12 +3737,24 @@ static HRESULT RegExp_test(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPP
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
match_result_t match;
+ VARIANT undef_var;
VARIANT_BOOL b;
+ DWORD argc;
HRESULT hres;
TRACE("\n");
- hres = run_exec(ctx, jsthis, arg_cnt(dp) ? get_arg(dp,0) : NULL, ei, NULL, &match, NULL, NULL, &b);
+ argc = arg_cnt(dp);
+ if(!argc) {
+ V_VT(&undef_var) = VT_BSTR;
+ V_BSTR(&undef_var) = SysAllocString(undefinedW);
+ if(!V_BSTR(&undef_var))
+ return E_OUTOFMEMORY;
+ }
+
+ hres = run_exec(ctx, jsthis, argc ? get_arg(dp,0) : &undef_var, ei, NULL, &match, NULL, NULL, &b);
+ if(!argc)
+ SysFreeString(V_BSTR(&undef_var));
if(FAILED(hres))
return hres;
@@ -3959,6 +3996,58 @@ HRESULT regexp_string_match(script_ctx_t *ctx, DispatchEx *re, BSTR str,
return hres;
}
+static HRESULT RegExpConstr_leftContext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ BSTR ret;
+
+ ret = SysAllocStringLen(ctx->last_match, ctx->last_match_index);
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = ret;
+ }
+ case DISPATCH_PROPERTYPUT:
+ return S_OK;
+ default:
+ FIXME("unsupported flags\n");
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static HRESULT RegExpConstr_rightContext(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
+ DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
+{
+ TRACE("\n");
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ BSTR ret;
+
+ ret = SysAllocString(ctx->last_match+ctx->last_match_index+ctx->last_match_length);
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ V_VT(retv) = VT_BSTR;
+ V_BSTR(retv) = ret;
+ }
+ case DISPATCH_PROPERTYPUT:
+ return S_OK;
+ default:
+ FIXME("unsupported flags\n");
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DISPPARAMS *dp,
VARIANT *retv, jsexcept_t *ei, IServiceProvider *sp)
{
@@ -4019,6 +4108,20 @@ static HRESULT RegExpConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
return S_OK;
}
+static const builtin_prop_t RegExpConstr_props[] = {
+ {leftContextW, RegExpConstr_leftContext, 0},
+ {rightContextW, RegExpConstr_rightContext, 0}
+};
+
+static const builtin_info_t RegExpConstr_info = {
+ JSCLASS_FUNCTION,
+ {NULL, Function_value, 0},
+ sizeof(RegExpConstr_props)/sizeof(*RegExpConstr_props),
+ RegExpConstr_props,
+ NULL,
+ NULL
+};
+
HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, DispatchEx **ret)
{
RegExpInstance *regexp;
@@ -4030,7 +4133,7 @@ HRESULT create_regexp_constr(script_ctx_t *ctx, DispatchEx *object_prototype, Di
if(FAILED(hres))
return hres;
- hres = create_builtin_function(ctx, RegExpConstr_value, RegExpW, NULL,
+ hres = create_builtin_function(ctx, RegExpConstr_value, RegExpW, &RegExpConstr_info,
PROPF_CONSTR|2, ®exp->dispex, ret);
jsdisp_release(®exp->dispex);
diff --git a/dll/win32/jscript/rsrc.rc b/dll/win32/jscript/rsrc.rc
index d23ea33a2f3..db7e0ff2fa3 100644
--- a/dll/win32/jscript/rsrc.rc
+++ b/dll/win32/jscript/rsrc.rc
@@ -30,3 +30,4 @@ REGINST REGINST jscript.inf
#include "jscript_Nl.rc"
#include "jscript_Pt.rc"
#include "jscript_Ru.rc"
+#include "jscript_Si.rc"
diff --git a/dll/win32/jscript/string.c b/dll/win32/jscript/string.c
index 510dcc272c6..05b9eba26e1 100644
--- a/dll/win32/jscript/string.c
+++ b/dll/win32/jscript/string.c
@@ -779,9 +779,9 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI
DWORD parens_cnt = 0, parens_size=0, rep_len=0, length;
BSTR rep_str = NULL, match_str = NULL, ret_str, val_str;
DispatchEx *rep_func = NULL, *regexp = NULL;
- match_result_t *parens = NULL, match, **parens_ptr = &parens;
+ match_result_t *parens = NULL, match = {NULL,0}, **parens_ptr = &parens;
strbuf_t ret = {NULL,0,0};
- DWORD re_flags = 0;
+ DWORD re_flags = REM_NO_CTX_UPDATE;
VARIANT *arg_var;
HRESULT hres = S_OK;
@@ -860,7 +860,7 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI
if(regexp) {
hres = regexp_match_next(ctx, regexp, re_flags, str, length, &cp, parens_ptr,
&parens_size, &parens_cnt, &match);
- re_flags = REM_CHECK_GLOBAL;
+ re_flags |= REM_CHECK_GLOBAL;
if(hres == S_FALSE) {
hres = S_OK;
@@ -969,13 +969,28 @@ static HRESULT String_replace(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, DI
if(rep_func)
jsdisp_release(rep_func);
- if(regexp)
- jsdisp_release(regexp);
- SysFreeString(val_str);
SysFreeString(rep_str);
SysFreeString(match_str);
heap_free(parens);
+ if(SUCCEEDED(hres) && match.str && regexp) {
+ if(!val_str)
+ val_str = SysAllocStringLen(str, length);
+ if(val_str) {
+ SysFreeString(ctx->last_match);
+ ctx->last_match = val_str;
+ val_str = NULL;
+ ctx->last_match_index = match.str-str;
+ ctx->last_match_length = match.len;
+ }else {
+ hres = E_OUTOFMEMORY;
+ }
+ }
+
+ if(regexp)
+ jsdisp_release(regexp);
+ SysFreeString(val_str);
+
if(SUCCEEDED(hres) && retv) {
ret_str = SysAllocStringLen(ret.buf, ret.len);
if(!ret_str)
diff --git a/dll/win32/kernel32/file/file.c b/dll/win32/kernel32/file/file.c
index 66046621821..cdbafd08839 100644
--- a/dll/win32/kernel32/file/file.c
+++ b/dll/win32/kernel32/file/file.c
@@ -1906,7 +1906,8 @@ ReplaceFileW(
)
{
HANDLE hReplaced = NULL, hReplacement = NULL;
- UNICODE_STRING NtReplacedName, NtReplacementName;
+ UNICODE_STRING NtReplacedName = { 0, 0, NULL };
+ UNICODE_STRING NtReplacementName = { 0, 0, NULL };
DWORD Error = ERROR_SUCCESS;
NTSTATUS Status;
BOOL Ret = FALSE;
@@ -2029,8 +2030,10 @@ Cleanup:
if (hReplacement) NtClose(hReplacement);
if (Buffer) RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
- RtlFreeUnicodeString(&NtReplacementName);
- RtlFreeUnicodeString(&NtReplacedName);
+ if (NtReplacementName.Buffer)
+ RtlFreeHeap(GetProcessHeap(), 0, NtReplacementName.Buffer);
+ if (NtReplacedName.Buffer)
+ RtlFreeHeap(GetProcessHeap(), 0, NtReplacedName.Buffer);
/* If there was an error, set the error code */
if(!Ret)
diff --git a/dll/win32/kernel32/file/find.c b/dll/win32/kernel32/file/find.c
index ef2346a598c..df245232e0e 100644
--- a/dll/win32/kernel32/file/find.c
+++ b/dll/win32/kernel32/file/find.c
@@ -54,7 +54,7 @@ typedef struct _KERNEL32_FIND_DATA_HEADER
/* FUNCTIONS ****************************************************************/
-static HANDLE
+static VOID
InternalCopyDeviceFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
LPCWSTR lpFileName,
ULONG DeviceNameInfo)
@@ -71,11 +71,9 @@ InternalCopyDeviceFindDataW(LPWIN32_FIND_DATAW lpFindFileData,
RtlCopyMemory(lpFindFileData->cFileName,
DeviceName.Buffer,
DeviceName.Length);
-
- return FIND_DEVICE_HANDLE;
}
-static HANDLE
+static VOID
InternalCopyDeviceFindDataA(LPWIN32_FIND_DATAA lpFindFileData,
PUNICODE_STRING FileName,
ULONG DeviceNameInfo)
@@ -101,8 +99,6 @@ InternalCopyDeviceFindDataA(LPWIN32_FIND_DATAA lpFindFileData,
RtlCopyMemory(lpFindFileData->cFileName,
BufferA.Buffer,
BufferA.Length);
-
- return FIND_DEVICE_HANDLE;
}
static VOID
diff --git a/dll/win32/kernel32/file/npipe.c b/dll/win32/kernel32/file/npipe.c
index d62527e12a5..55aeed952fc 100644
--- a/dll/win32/kernel32/file/npipe.c
+++ b/dll/win32/kernel32/file/npipe.c
@@ -496,6 +496,7 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
+ RtlFreeUnicodeString(&NamedPipeName);
return FALSE;
}
@@ -538,9 +539,11 @@ WaitNamedPipeW(LPCWSTR lpNamedPipeName,
if (!NT_SUCCESS(Status))
{
SetLastErrorByStatus(Status);
+ RtlFreeUnicodeString(&NamedPipeName);
return FALSE;
}
+ RtlFreeUnicodeString(&NamedPipeName);
return TRUE;
}
#endif
diff --git a/dll/win32/kernel32/k32.h b/dll/win32/kernel32/k32.h
index d7bbd038852..f59172c8566 100755
--- a/dll/win32/kernel32/k32.h
+++ b/dll/win32/kernel32/k32.h
@@ -22,10 +22,6 @@
#include
-
-#undef NTDDI_WS03SP1
-
-
/* CSRSS Header */
#include
diff --git a/dll/win32/kernel32/kernel32.pspec b/dll/win32/kernel32/kernel32.pspec
index cba32d9f29d..3c09b07cc44 100644
--- a/dll/win32/kernel32/kernel32.pspec
+++ b/dll/win32/kernel32/kernel32.pspec
@@ -316,6 +316,7 @@
@ stdcall GetConsoleFontInfo(long long long ptr)
@ stdcall GetConsoleFontSize(long long)
@ stdcall GetConsoleHardwareState(long long ptr)
+@ stdcall GetConsoleHistoryInfo(ptr)
@ stdcall GetConsoleInputExeNameA(long ptr)
@ stdcall GetConsoleInputExeNameW(long ptr)
@ stdcall GetConsoleInputWaitHandle()
@@ -796,7 +797,6 @@
@ stdcall SetComputerNameW(wstr)
@ stdcall SetConsoleActiveScreenBuffer(long)
@ stdcall SetConsoleCP(long)
-@ stdcall SetConsoleCommandHistoryMode(long)
@ stdcall SetConsoleCtrlHandler(ptr long)
@ stdcall SetConsoleCursor(long long)
@ stdcall SetConsoleCursorInfo(long ptr)
@@ -805,6 +805,7 @@
@ stdcall SetConsoleDisplayMode(long long ptr)
@ stdcall SetConsoleFont(long long)
@ stdcall SetConsoleHardwareState(long long long)
+@ stdcall SetConsoleHistoryInfo(ptr)
@ stdcall SetConsoleIcon(ptr)
@ stdcall SetConsoleInputExeNameA(ptr)
@ stdcall SetConsoleInputExeNameW(ptr)
diff --git a/dll/win32/kernel32/misc/console.c b/dll/win32/kernel32/misc/console.c
index aaf48ac882f..d1e8a97038e 100644
--- a/dll/win32/kernel32/misc/console.c
+++ b/dll/win32/kernel32/misc/console.c
@@ -178,6 +178,37 @@ ConsoleControlDispatcher(DWORD CodeAndFlag)
ExitThread(nExitCode);
}
+/* Get the size needed to copy a string to a capture buffer, including alignment */
+static ULONG
+IntStringSize(LPCVOID String,
+ BOOL Unicode)
+{
+ ULONG Size = (Unicode ? wcslen(String) : strlen(String)) * sizeof(WCHAR);
+ return (Size + 3) & -4;
+}
+
+/* Copy a string to a capture buffer */
+static VOID
+IntCaptureMessageString(PCSR_CAPTURE_BUFFER CaptureBuffer,
+ LPCVOID String,
+ BOOL Unicode,
+ PUNICODE_STRING RequestString)
+{
+ ULONG Size;
+ if (Unicode)
+ {
+ Size = wcslen(String) * sizeof(WCHAR);
+ CsrCaptureMessageBuffer(CaptureBuffer, (PVOID)String, Size, (PVOID *)&RequestString->Buffer);
+ }
+ else
+ {
+ Size = strlen(String);
+ CsrAllocateMessagePointer(CaptureBuffer, Size * sizeof(WCHAR), (PVOID *)&RequestString->Buffer);
+ Size = MultiByteToWideChar(CP_ACP, 0, String, Size, RequestString->Buffer, Size * sizeof(WCHAR))
+ * sizeof(WCHAR);
+ }
+ RequestString->Length = RequestString->MaximumLength = Size;
+}
/* FUNCTIONS *****************************************************************/
@@ -336,29 +367,56 @@ DuplicateConsoleHandle(HANDLE hConsole,
}
-/*
- * @unimplemented (Undocumented)
- */
-DWORD
-WINAPI
-ExpungeConsoleCommandHistoryW(DWORD Unknown0)
+static BOOL
+IntExpungeConsoleCommandHistory(LPCVOID lpExeName, BOOL bUnicode)
{
- DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(EXPUNGE_COMMAND_HISTORY, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.ExpungeCommandHistory.ExeName);
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ return TRUE;
}
+/*
+ * @implemented (Undocumented)
+ */
+BOOL
+WINAPI
+ExpungeConsoleCommandHistoryW(LPCWSTR lpExeName)
+{
+ return IntExpungeConsoleCommandHistory(lpExeName, TRUE);
+}
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
-DWORD
+BOOL
WINAPI
-ExpungeConsoleCommandHistoryA (DWORD Unknown0)
+ExpungeConsoleCommandHistoryA(LPCSTR lpExeName)
{
- DPRINT1("ExpungeConsoleCommandHistoryW(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntExpungeConsoleCommandHistory(lpExeName, FALSE);
}
@@ -772,61 +830,139 @@ GetConsoleAliasesLengthA(LPSTR lpExeName)
}
+static DWORD
+IntGetConsoleCommandHistory(LPVOID lpHistory, DWORD cbHistory, LPCVOID lpExeName, BOOL bUnicode)
+{
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(GET_COMMAND_HISTORY, CSR_CONSOLE);
+ NTSTATUS Status;
+ DWORD HistoryLength = cbHistory * (bUnicode ? 1 : sizeof(WCHAR));
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(2, IntStringSize(lpExeName, bUnicode) +
+ HistoryLength);
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.GetCommandHistory.ExeName);
+ Request.Data.GetCommandHistory.Length = HistoryLength;
+ CsrAllocateMessagePointer(CaptureBuffer, HistoryLength,
+ (PVOID*)&Request.Data.GetCommandHistory.History);
+
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+
+ if (bUnicode)
+ {
+ memcpy(lpHistory,
+ Request.Data.GetCommandHistory.History,
+ Request.Data.GetCommandHistory.Length);
+ }
+ else
+ {
+ WideCharToMultiByte(CP_ACP, 0,
+ Request.Data.GetCommandHistory.History,
+ Request.Data.GetCommandHistory.Length / sizeof(WCHAR),
+ lpHistory,
+ cbHistory,
+ NULL, NULL);
+ }
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ return Request.Data.GetCommandHistory.Length;
+}
+
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryW(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
+GetConsoleCommandHistoryW(LPWSTR lpHistory,
+ DWORD cbHistory,
+ LPCWSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryW(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistory(lpHistory, cbHistory, lpExeName, TRUE);
}
-
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryA(DWORD Unknown0,
- DWORD Unknown1,
- DWORD Unknown2)
+GetConsoleCommandHistoryA(LPSTR lpHistory,
+ DWORD cbHistory,
+ LPCSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryA(0x%x, 0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1, Unknown2);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistory(lpHistory, cbHistory, lpExeName, FALSE);
}
+static DWORD
+IntGetConsoleCommandHistoryLength(LPCVOID lpExeName, BOOL bUnicode)
+{
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(GET_COMMAND_HISTORY_LENGTH, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return 0;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.GetCommandHistoryLength.ExeName);
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+ return Request.Data.GetCommandHistoryLength.Length;
+}
+
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryLengthW(DWORD Unknown0)
+GetConsoleCommandHistoryLengthW(LPCWSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryLengthW(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistoryLength(lpExeName, TRUE);
}
-
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
DWORD
WINAPI
-GetConsoleCommandHistoryLengthA(DWORD Unknown0)
+GetConsoleCommandHistoryLengthA(LPCSTR lpExeName)
{
- DPRINT1("GetConsoleCommandHistoryLengthA(0x%x) UNIMPLEMENTED!\n", Unknown0);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ return IntGetConsoleCommandHistoryLength(lpExeName, FALSE) / sizeof(WCHAR);
}
+
/*
* @unimplemented
*/
@@ -1038,19 +1174,6 @@ OpenConsoleW(LPCWSTR wsName,
}
-/*
- * @unimplemented (Undocumented)
- */
-BOOL
-WINAPI
-SetConsoleCommandHistoryMode(DWORD dwMode)
-{
- DPRINT1("SetConsoleCommandHistoryMode(0x%x) UNIMPLEMENTED!\n", dwMode);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
-}
-
-
/*
* @unimplemented (Undocumented)
*/
@@ -1176,31 +1299,61 @@ SetConsoleMenuClose(DWORD Unknown0)
}
-/*
- * @unimplemented (Undocumented)
- */
-BOOL
-WINAPI
-SetConsoleNumberOfCommandsA(DWORD Unknown0,
- DWORD Unknown1)
+static BOOL
+IntSetConsoleNumberOfCommands(DWORD dwNumCommands,
+ LPCVOID lpExeName,
+ BOOL bUnicode)
{
- DPRINT1("SetConsoleNumberOfCommandsA(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(SET_HISTORY_NUMBER_COMMANDS, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (lpExeName == NULL || !(bUnicode ? *(PWCHAR)lpExeName : *(PCHAR)lpExeName))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, IntStringSize(lpExeName, bUnicode));
+ if (!CaptureBuffer)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return FALSE;
+ }
+ IntCaptureMessageString(CaptureBuffer, lpExeName, bUnicode,
+ &Request.Data.SetHistoryNumberCommands.ExeName);
+ Request.Data.SetHistoryNumberCommands.NumCommands = dwNumCommands;
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ return TRUE;
}
-
/*
- * @unimplemented (Undocumented)
+ * @implemented (Undocumented)
*/
BOOL
WINAPI
-SetConsoleNumberOfCommandsW(DWORD Unknown0,
- DWORD Unknown1)
+SetConsoleNumberOfCommandsA(DWORD dwNumCommands,
+ LPCWSTR lpExeName)
{
- DPRINT1("SetConsoleNumberOfCommandsW(0x%x, 0x%x) UNIMPLEMENTED!\n", Unknown0, Unknown1);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, FALSE);
+}
+
+/*
+ * @implemented (Undocumented)
+ */
+BOOL
+WINAPI
+SetConsoleNumberOfCommandsW(DWORD dwNumCommands,
+ LPCSTR lpExeName)
+{
+ return IntSetConsoleNumberOfCommands(dwNumCommands, lpExeName, TRUE);
}
@@ -1545,34 +1698,45 @@ IntReadConsole(HANDLE hConsoleInput,
PVOID lpBuffer,
DWORD nNumberOfCharsToRead,
LPDWORD lpNumberOfCharsRead,
- PCONSOLE_READCONSOLE_CONTROL lpReserved,
+ PCONSOLE_READCONSOLE_CONTROL pInputControl,
BOOL bUnicode)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- ULONG CharSize, CharsRead = 0;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(READ_CONSOLE, CSR_CONSOLE);
+ NTSTATUS Status = STATUS_SUCCESS;
+ ULONG CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
- CharSize = (bUnicode ? sizeof(WCHAR) : sizeof(CHAR));
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + min(nNumberOfCharsToRead,
- CSRSS_MAX_READ_CONSOLE / CharSize) * CharSize));
- if (Request == NULL)
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, nNumberOfCharsToRead * CharSize);
+ if (CaptureBuffer == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
- Request->Status = STATUS_SUCCESS;
- CsrRequest = MAKE_CSR_API(READ_CONSOLE, CSR_CONSOLE);
+ CsrAllocateMessagePointer(CaptureBuffer,
+ nNumberOfCharsToRead * CharSize,
+ &Request.Data.ReadConsoleRequest.Buffer);
+
+ Request.Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
+ Request.Data.ReadConsoleRequest.Unicode = bUnicode;
+ Request.Data.ReadConsoleRequest.NrCharactersToRead = (WORD)nNumberOfCharsToRead;
+ Request.Data.ReadConsoleRequest.NrCharactersRead = 0;
+ Request.Data.ReadConsoleRequest.CtrlWakeupMask = 0;
+ if (pInputControl && pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL))
+ {
+ Request.Data.ReadConsoleRequest.NrCharactersRead = pInputControl->nInitialChars;
+ memcpy(Request.Data.ReadConsoleRequest.Buffer,
+ lpBuffer,
+ pInputControl->nInitialChars * sizeof(WCHAR));
+ Request.Data.ReadConsoleRequest.CtrlWakeupMask = pInputControl->dwCtrlWakeupMask;
+ }
do
{
- if (Request->Status == STATUS_PENDING)
+ if (Status == STATUS_PENDING)
{
- Status = NtWaitForSingleObject(Request->Data.ReadConsoleRequest.EventHandle,
+ Status = NtWaitForSingleObject(Request.Data.ReadConsoleRequest.EventHandle,
FALSE,
0);
if (!NT_SUCCESS(Status))
@@ -1582,50 +1746,28 @@ IntReadConsole(HANDLE hConsoleInput,
}
}
- Request->Data.ReadConsoleRequest.ConsoleHandle = hConsoleInput;
- Request->Data.ReadConsoleRequest.Unicode = bUnicode;
- Request->Data.ReadConsoleRequest.NrCharactersToRead = (WORD)min(nNumberOfCharsToRead, CSRSS_MAX_READ_CONSOLE / CharSize);
- Request->Data.ReadConsoleRequest.nCharsCanBeDeleted = (WORD)CharsRead;
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE)
- + Request->Data.ReadConsoleRequest.NrCharactersToRead * CharSize));
-
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
DPRINT1("CSR returned error in ReadConsole\n");
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
+ CsrFreeCaptureBuffer(CaptureBuffer);
SetLastErrorByStatus(Status);
return FALSE;
}
-
- nNumberOfCharsToRead -= Request->Data.ReadConsoleRequest.NrCharactersRead;
- memcpy((PVOID)((ULONG_PTR)lpBuffer + (ULONG_PTR)(CharsRead * CharSize)),
- Request->Data.ReadConsoleRequest.Buffer,
- Request->Data.ReadConsoleRequest.NrCharactersRead * CharSize);
- CharsRead += Request->Data.ReadConsoleRequest.NrCharactersRead;
-
- if (Request->Status == STATUS_NOTIFY_CLEANUP)
- {
- if(CharsRead > 0)
- {
- CharsRead--;
- nNumberOfCharsToRead++;
- }
- Request->Status = STATUS_PENDING;
- }
}
- while (Request->Status == STATUS_PENDING && nNumberOfCharsToRead > 0);
+ while (Status == STATUS_PENDING);
+
+ memcpy(lpBuffer,
+ Request.Data.ReadConsoleRequest.Buffer,
+ Request.Data.ReadConsoleRequest.NrCharactersRead * CharSize);
if (lpNumberOfCharsRead != NULL)
- {
- *lpNumberOfCharsRead = CharsRead;
- }
+ *lpNumberOfCharsRead = Request.Data.ReadConsoleRequest.NrCharactersRead;
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
+ if (pInputControl && pInputControl->nLength == sizeof(CONSOLE_READCONSOLE_CONTROL))
+ pInputControl->dwControlKeyState = Request.Data.ReadConsoleRequest.ControlKeyState;
+
+ CsrFreeCaptureBuffer(CaptureBuffer);
return TRUE;
}
@@ -1648,7 +1790,7 @@ ReadConsoleA(HANDLE hConsoleInput,
lpBuffer,
nNumberOfCharsToRead,
lpNumberOfCharsRead,
- pInputControl,
+ NULL,
FALSE);
}
@@ -3418,6 +3560,64 @@ GenerateConsoleCtrlEvent(DWORD dwCtrlEvent,
}
+static DWORD
+IntGetConsoleTitle(LPVOID lpConsoleTitle, DWORD nSize, BOOL bUnicode)
+{
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
+ NTSTATUS Status;
+
+ if (nSize == 0)
+ return 0;
+
+ Request.Data.GetTitleRequest.Length = nSize * (bUnicode ? 1 : sizeof(WCHAR));
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.GetTitleRequest.Length);
+ if (CaptureBuffer == NULL)
+ {
+ SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+ return 0;
+ }
+
+ CsrAllocateMessagePointer(CaptureBuffer,
+ Request.Data.GetTitleRequest.Length,
+ (PVOID*)&Request.Data.GetTitleRequest.Title);
+
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request.Status)))
+ {
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ SetLastErrorByStatus(Status);
+ return 0;
+ }
+
+ if (bUnicode)
+ {
+ if (nSize >= sizeof(WCHAR))
+ wcscpy((LPWSTR)lpConsoleTitle, Request.Data.GetTitleRequest.Title);
+ }
+ else
+ {
+ if (nSize < Request.Data.GetTitleRequest.Length / sizeof(WCHAR) ||
+ !WideCharToMultiByte(CP_ACP, // ANSI code page
+ 0, // performance and mapping flags
+ Request.Data.GetTitleRequest.Title, // address of wide-character string
+ -1, // number of characters in string
+ (LPSTR)lpConsoleTitle, // address of buffer for new string
+ nSize, // size of buffer
+ NULL, // FAST
+ NULL))
+ {
+ /* Yes, if the buffer isn't big enough, it returns 0... Bad API */
+ *(LPSTR)lpConsoleTitle = '\0';
+ Request.Data.GetTitleRequest.Length = 0;
+ }
+ }
+ CsrFreeCaptureBuffer(CaptureBuffer);
+
+ return Request.Data.GetTitleRequest.Length / sizeof(WCHAR);
+}
+
/*--------------------------------------------------------------
* GetConsoleTitleW
*
@@ -3428,49 +3628,9 @@ WINAPI
GetConsoleTitleW(LPWSTR lpConsoleTitle,
DWORD nSize)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
- if (Request == NULL)
- {
- SetLastError(ERROR_NOT_ENOUGH_MEMORY);
- return FALSE;
- }
-
- CsrRequest = MAKE_CSR_API(GET_TITLE, CSR_CONSOLE);
-
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_TITLE) + CSRSS_MAX_TITLE_LENGTH * sizeof(WCHAR));
- if (!NT_SUCCESS(Status) || !(NT_SUCCESS(Status = Request->Status)))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- SetLastErrorByStatus(Status);
- return 0;
- }
-
- if (nSize * sizeof(WCHAR) <= Request->Data.GetTitleRequest.Length)
- {
- nSize--;
- }
- else
- {
- nSize = Request->Data.GetTitleRequest.Length / sizeof (WCHAR);
- }
- memcpy(lpConsoleTitle, Request->Data.GetTitleRequest.Title, nSize * sizeof(WCHAR));
- lpConsoleTitle[nSize] = L'\0';
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return nSize;
+ return IntGetConsoleTitle(lpConsoleTitle, nSize, TRUE);
}
-
/*--------------------------------------------------------------
* GetConsoleTitleA
*
@@ -3483,28 +3643,7 @@ WINAPI
GetConsoleTitleA(LPSTR lpConsoleTitle,
DWORD nSize)
{
- WCHAR WideTitle [CSRSS_MAX_TITLE_LENGTH + 1];
- DWORD nWideTitle = CSRSS_MAX_TITLE_LENGTH + 1;
- DWORD nWritten;
-
- if (!lpConsoleTitle || !nSize) return 0;
- nWideTitle = GetConsoleTitleW((LPWSTR) WideTitle, nWideTitle);
- if (!nWideTitle) return 0;
-
- if ((nWritten = WideCharToMultiByte(CP_ACP, // ANSI code page
- 0, // performance and mapping flags
- (LPWSTR) WideTitle, // address of wide-character string
- nWideTitle, // number of characters in string
- lpConsoleTitle, // address of buffer for new string
- nSize - 1, // size of buffer
- NULL, // FAST
- NULL))) // FAST
- {
- lpConsoleTitle[nWritten] = '\0';
- return nWritten;
- }
-
- return 0;
+ return IntGetConsoleTitle(lpConsoleTitle, nSize, FALSE);
}
@@ -3517,41 +3656,33 @@ BOOL
WINAPI
SetConsoleTitleW(LPCWSTR lpConsoleTitle)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
+ CSR_API_MESSAGE Request;
+ PCSR_CAPTURE_BUFFER CaptureBuffer;
+ ULONG CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
NTSTATUS Status;
- unsigned int c;
- Request = RtlAllocateHeap(RtlGetProcessHeap(), 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
- min(wcslen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
- if (Request == NULL)
+ Request.Data.SetTitleRequest.Length = wcslen(lpConsoleTitle) * sizeof(WCHAR);
+
+ CaptureBuffer = CsrAllocateCaptureBuffer(1, Request.Data.SetTitleRequest.Length);
+ if (CaptureBuffer == NULL)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
- CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
+ CsrCaptureMessageBuffer(CaptureBuffer,
+ (PVOID)lpConsoleTitle,
+ Request.Data.SetTitleRequest.Length,
+ (PVOID*)&Request.Data.SetTitleRequest.Title);
- for (c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++)
- Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
-
- Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
+ Status = CsrClientCallServer(&Request, CaptureBuffer, CsrRequest, sizeof(CSR_API_MESSAGE));
+ CsrFreeCaptureBuffer(CaptureBuffer);
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
{
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
SetLastErrorByStatus(Status);
- return(FALSE);
+ return FALSE;
}
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
return TRUE;
}
@@ -3567,43 +3698,18 @@ BOOL
WINAPI
SetConsoleTitleA(LPCSTR lpConsoleTitle)
{
- PCSR_API_MESSAGE Request;
- ULONG CsrRequest;
- NTSTATUS Status;
- unsigned int c;
-
- Request = RtlAllocateHeap(RtlGetProcessHeap(),
- 0,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) +
- min(strlen(lpConsoleTitle), CSRSS_MAX_TITLE_LENGTH) * sizeof(WCHAR)));
- if (Request == NULL)
+ ULONG Length = strlen(lpConsoleTitle) + 1;
+ LPWSTR WideTitle = HeapAlloc(GetProcessHeap(), 0, Length * sizeof(WCHAR));
+ BOOL Ret;
+ if (!WideTitle)
{
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return FALSE;
}
-
- CsrRequest = MAKE_CSR_API(SET_TITLE, CSR_CONSOLE);
-
- for (c = 0; lpConsoleTitle[c] && c < CSRSS_MAX_TITLE_LENGTH; c++)
- Request->Data.SetTitleRequest.Title[c] = lpConsoleTitle[c];
-
- Request->Data.SetTitleRequest.Length = c * sizeof(WCHAR);
- Status = CsrClientCallServer(Request,
- NULL,
- CsrRequest,
- max(sizeof(CSR_API_MESSAGE),
- CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + c * sizeof(WCHAR)));
- if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request->Status))
- {
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
- SetLastErrorByStatus(Status);
- return(FALSE);
- }
-
- RtlFreeHeap(RtlGetProcessHeap(), 0, Request);
-
- return TRUE;
+ MultiByteToWideChar(CP_ACP, 0, lpConsoleTitle, -1, WideTitle, Length);
+ Ret = SetConsoleTitleW(WideTitle);
+ HeapFree(GetProcessHeap(), 0, WideTitle);
+ return Ret;
}
@@ -4073,30 +4179,60 @@ GetConsoleInputExeNameA(DWORD nBufferLength, LPSTR lpBuffer)
/*--------------------------------------------------------------
* GetConsoleHistoryInfo
*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
GetConsoleHistoryInfo(PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{
- DPRINT1("GetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
+ NTSTATUS Status;
+ if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ lpConsoleHistoryInfo->HistoryBufferSize = Request.Data.GetHistoryInfo.HistoryBufferSize;
+ lpConsoleHistoryInfo->NumberOfHistoryBuffers = Request.Data.GetHistoryInfo.NumberOfHistoryBuffers;
+ lpConsoleHistoryInfo->dwFlags = Request.Data.GetHistoryInfo.dwFlags;
+ return TRUE;
}
/*--------------------------------------------------------------
* SetConsoleHistoryInfo
*
- * @unimplemented
+ * @implemented
*/
BOOL
WINAPI
SetConsoleHistoryInfo(IN PCONSOLE_HISTORY_INFO lpConsoleHistoryInfo)
{
- DPRINT1("SetConsoleHistoryInfo(0x%p) UNIMPLEMENTED!\n", lpConsoleHistoryInfo);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ CSR_API_MESSAGE Request;
+ ULONG CsrRequest = MAKE_CSR_API(GET_HISTORY_INFO, CSR_CONSOLE);
+ NTSTATUS Status;
+ if (lpConsoleHistoryInfo->cbSize != sizeof(CONSOLE_HISTORY_INFO))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
+ Request.Data.SetHistoryInfo.HistoryBufferSize = lpConsoleHistoryInfo->HistoryBufferSize;
+ Request.Data.SetHistoryInfo.NumberOfHistoryBuffers = lpConsoleHistoryInfo->NumberOfHistoryBuffers;
+ Request.Data.SetHistoryInfo.dwFlags = lpConsoleHistoryInfo->dwFlags;
+ Status = CsrClientCallServer(&Request, NULL, CsrRequest, sizeof(CSR_API_MESSAGE));
+ if (!NT_SUCCESS(Status) || !NT_SUCCESS(Status = Request.Status))
+ {
+ SetLastErrorByStatus(Status);
+ return FALSE;
+ }
+ return TRUE;
}
diff --git a/dll/win32/mciwave/mciwave.rbuild b/dll/win32/mciwave/mciwave.rbuild
index be21c0711ed..69e3c094388 100644
--- a/dll/win32/mciwave/mciwave.rbuild
+++ b/dll/win32/mciwave/mciwave.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msacm32/msacm32.rbuild b/dll/win32/msacm32/msacm32.rbuild
index b6f802ee5bb..e32845920d7 100644
--- a/dll/win32/msacm32/msacm32.rbuild
+++ b/dll/win32/msacm32/msacm32.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msadp32.acm/msadp32.acm.rbuild b/dll/win32/msadp32.acm/msadp32.acm.rbuild
index 89911f484c5..3dcc1c96085 100644
--- a/dll/win32/msadp32.acm/msadp32.acm.rbuild
+++ b/dll/win32/msadp32.acm/msadp32.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msafd/misc/dllmain.c b/dll/win32/msafd/misc/dllmain.c
index e43ab505bfd..b0b1f317159 100644
--- a/dll/win32/msafd/misc/dllmain.c
+++ b/dll/win32/msafd/misc/dllmain.c
@@ -22,8 +22,7 @@ DWORD DebugTraceLevel = 0;
HANDLE GlobalHeap;
WSPUPCALLTABLE Upcalls;
LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
-ULONG SocketCount = 0;
-PSOCKET_INFORMATION *Sockets = NULL;
+PSOCKET_INFORMATION SocketListHead = NULL;
LIST_ENTRY SockHelpersListHead = { NULL, NULL };
ULONG SockAsyncThreadRefCount;
HANDLE SockAsyncHelperAfdHandle;
@@ -61,7 +60,7 @@ WSPSocket(int AddressFamily,
ULONG SizeOfEA;
PAFD_CREATE_PACKET AfdPacket;
HANDLE Sock;
- PSOCKET_INFORMATION Socket = NULL, PrevSocket = NULL;
+ PSOCKET_INFORMATION Socket = NULL;
PFILE_FULL_EA_INFORMATION EABuffer = NULL;
PHELPER_DATA HelperData;
PVOID HelperDLLContext;
@@ -261,17 +260,6 @@ WSPSocket(int AddressFamily,
/* Save Handle */
Socket->Handle = (SOCKET)Sock;
- /* XXX See if there's a structure we can reuse -- We need to do this
- * more properly. */
- PrevSocket = GetSocketStructure( (SOCKET)Sock );
-
- if( PrevSocket )
- {
- RtlCopyMemory( PrevSocket, Socket, sizeof(*Socket) );
- RtlFreeHeap( GlobalHeap, 0, Socket );
- Socket = PrevSocket;
- }
-
/* Save Group Info */
if (g != 0)
{
@@ -292,8 +280,8 @@ WSPSocket(int AddressFamily,
NULL);
/* Save in Process Sockets List */
- Sockets[SocketCount] = Socket;
- SocketCount ++;
+ Socket->NextSocket = SocketListHead;
+ SocketListHead = Socket;
/* Create the Socket Context */
CreateContext(Socket);
@@ -318,79 +306,95 @@ error:
return INVALID_SOCKET;
}
+INT
+TranslateNtStatusError(NTSTATUS Status)
+{
+ switch (Status)
+ {
+ case STATUS_CANT_WAIT:
+ return WSAEWOULDBLOCK;
+
+ case STATUS_TIMEOUT:
+ return WSAETIMEDOUT;
+
+ case STATUS_SUCCESS:
+ return NO_ERROR;
+
+ case STATUS_FILE_CLOSED:
+ case STATUS_END_OF_FILE:
+ return WSAESHUTDOWN;
+
+ case STATUS_PENDING:
+ return WSA_IO_PENDING;
+
+ case STATUS_BUFFER_TOO_SMALL:
+ case STATUS_BUFFER_OVERFLOW:
+ DbgPrint("MSAFD: STATUS_BUFFER_TOO_SMALL/STATUS_BUFFER_OVERFLOW\n");
+ return WSAEMSGSIZE;
+
+ case STATUS_NO_MEMORY:
+ case STATUS_INSUFFICIENT_RESOURCES:
+ DbgPrint("MSAFD: STATUS_NO_MEMORY/STATUS_INSUFFICIENT_RESOURCES\n");
+ return WSAENOBUFS;
+
+ case STATUS_INVALID_CONNECTION:
+ DbgPrint("MSAFD: STATUS_INVALID_CONNECTION\n");
+ return WSAEAFNOSUPPORT;
+
+ case STATUS_INVALID_ADDRESS:
+ DbgPrint("MSAFD: STATUS_INVALID_ADDRESS\n");
+ return WSAEADDRNOTAVAIL;
+
+ case STATUS_REMOTE_NOT_LISTENING:
+ DbgPrint("MSAFD: STATUS_REMOTE_NOT_LISTENING\n");
+ return WSAECONNREFUSED;
+
+ case STATUS_NETWORK_UNREACHABLE:
+ DbgPrint("MSAFD: STATUS_NETWORK_UNREACHABLE\n");
+ return WSAENETUNREACH;
+
+ case STATUS_INVALID_PARAMETER:
+ DbgPrint("MSAFD: STATUS_INVALID_PARAMETER\n");
+ return WSAEINVAL;
+
+ case STATUS_CANCELLED:
+ DbgPrint("MSAFD: STATUS_CANCELLED\n");
+ return WSA_OPERATION_ABORTED;
+
+ case STATUS_ADDRESS_ALREADY_EXISTS:
+ DbgPrint("MSAFD: STATUS_ADDRESS_ALREADY_EXISTS\n");
+ return WSAEADDRINUSE;
+
+ case STATUS_LOCAL_DISCONNECT:
+ DbgPrint("MSAFD: STATUS_LOCAL_DISCONNECT\n");
+ return WSAECONNABORTED;
+
+ case STATUS_REMOTE_DISCONNECT:
+ DbgPrint("MSAFD: STATUS_REMOTE_DISCONNECT\n");
+ return WSAECONNRESET;
+
+ default:
+ DbgPrint("MSAFD: Unhandled NTSTATUS value: 0x%x\n", Status);
+ return WSAENETDOWN;
+ }
+}
DWORD MsafdReturnWithErrno(NTSTATUS Status,
LPINT Errno,
DWORD Received,
LPDWORD ReturnedBytes)
{
- if( ReturnedBytes )
- *ReturnedBytes = 0;
- if( Errno )
+ *Errno = TranslateNtStatusError(Status);
+
+ if (ReturnedBytes)
{
- switch (Status)
- {
- case STATUS_CANT_WAIT:
- *Errno = WSAEWOULDBLOCK;
- break;
- case STATUS_TIMEOUT:
- *Errno = WSAETIMEDOUT;
- break;
- case STATUS_SUCCESS:
- /* Return Number of bytes Read */
- if( ReturnedBytes )
- *ReturnedBytes = Received;
- break;
- case STATUS_FILE_CLOSED:
- case STATUS_END_OF_FILE:
- *Errno = WSAESHUTDOWN;
- break;
- case STATUS_PENDING:
- *Errno = WSA_IO_PENDING;
- break;
- case STATUS_BUFFER_TOO_SMALL:
- case STATUS_BUFFER_OVERFLOW:
- DbgPrint("MSAFD: STATUS_BUFFER_TOO_SMALL/STATUS_BUFFER_OVERFLOW\n");
- *Errno = WSAEMSGSIZE;
- break;
- case STATUS_NO_MEMORY: /* Fall through to STATUS_INSUFFICIENT_RESOURCES */
- case STATUS_INSUFFICIENT_RESOURCES:
- DbgPrint("MSAFD: STATUS_NO_MEMORY/STATUS_INSUFFICIENT_RESOURCES\n");
- *Errno = WSAENOBUFS;
- break;
- case STATUS_INVALID_CONNECTION:
- 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;
- break;
- case STATUS_NETWORK_UNREACHABLE:
- DbgPrint("MSAFD: STATUS_NETWORK_UNREACHABLE\n");
- *Errno = WSAENETUNREACH;
- break;
- case STATUS_INVALID_PARAMETER:
- DbgPrint("MSAFD: STATUS_INVALID_PARAMETER\n");
- *Errno = WSAEINVAL;
- break;
- case STATUS_CANCELLED:
- DbgPrint("MSAFD: STATUS_CANCELLED\n");
- *Errno = WSA_OPERATION_ABORTED;
- break;
- default:
- DbgPrint("MSAFD: Error %x is unknown\n", Status);
- *Errno = WSAEINVAL;
- break;
- }
+ if (!*Errno)
+ *ReturnedBytes = Received;
+ else
+ *ReturnedBytes = 0;
}
- /* Success */
- return Status == STATUS_SUCCESS ? 0 : SOCKET_ERROR;
+ return *Errno ? SOCKET_ERROR : 0;
}
/*
@@ -407,7 +411,7 @@ WSPCloseSocket(IN SOCKET Handle,
OUT LPINT lpErrno)
{
IO_STATUS_BLOCK IoStatusBlock;
- PSOCKET_INFORMATION Socket = NULL;
+ PSOCKET_INFORMATION Socket = NULL, CurrentSocket;
NTSTATUS Status;
HANDLE SockEvent;
AFD_DISCONNECT_INFO DisconnectInfo;
@@ -425,6 +429,12 @@ WSPCloseSocket(IN SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
if (Socket->HelperEvents & WSH_NOTIFY_CLOSE)
{
@@ -546,11 +556,32 @@ WSPCloseSocket(IN SOCKET Handle,
NtClose(Socket->TdiConnectionHandle);
Socket->TdiConnectionHandle = NULL;
+ if (SocketListHead == Socket)
+ {
+ SocketListHead = SocketListHead->NextSocket;
+ }
+ else
+ {
+ CurrentSocket = SocketListHead;
+ while (CurrentSocket->NextSocket)
+ {
+ if (CurrentSocket->NextSocket == Socket)
+ {
+ CurrentSocket->NextSocket = CurrentSocket->NextSocket->NextSocket;
+ break;
+ }
+
+ CurrentSocket = CurrentSocket->NextSocket;
+ }
+ }
+
+ HeapFree(GlobalHeap, 0, Socket);
+
/* Close the handle */
NtClose((HANDLE)Handle);
NtClose(SockEvent);
- return NO_ERROR;
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
}
@@ -599,6 +630,12 @@ WSPBind(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ HeapFree(GlobalHeap, 0, BindData);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Set up Address in TDI Format */
BindData->Address.TAAddressCount = 1;
@@ -650,13 +687,17 @@ WSPBind(SOCKET Handle,
Status = IOSB.Status;
}
+ NtClose( SockEvent );
+ HeapFree(GlobalHeap, 0, BindData);
+
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
+
/* Set up Socket Data */
Socket->SharedData.State = SocketBound;
Socket->TdiAddressHandle = (HANDLE)IOSB.Information;
- NtClose( SockEvent );
- HeapFree(GlobalHeap, 0, BindData);
- if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_BIND))
+ if (Socket->HelperEvents & WSH_NOTIFY_BIND)
{
Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
Socket->Handle,
@@ -688,6 +729,11 @@ WSPListen(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
if (Socket->SharedData.Listening)
return 0;
@@ -723,14 +769,17 @@ WSPListen(SOCKET Handle,
{
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB.Status;
- }
+ }
+
+ NtClose( SockEvent );
+
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno ( Status, lpErrno, 0, NULL );
/* Set to Listening */
Socket->SharedData.Listening = TRUE;
- NtClose( SockEvent );
-
- if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_LISTEN))
+ if (Socket->HelperEvents & WSH_NOTIFY_LISTEN)
{
Status = Socket->HelperData->WSHNotify(Socket->HelperContext,
Socket->Handle,
@@ -751,12 +800,12 @@ WSPListen(SOCKET Handle,
int
WSPAPI
-WSPSelect(int nfds,
- fd_set *readfds,
- fd_set *writefds,
- fd_set *exceptfds,
- const LPTIMEVAL timeout,
- LPINT lpErrno)
+WSPSelect(IN int nfds,
+ IN OUT fd_set *readfds OPTIONAL,
+ IN OUT fd_set *writefds OPTIONAL,
+ IN OUT fd_set *exceptfds OPTIONAL,
+ IN const struct timeval *timeout OPTIONAL,
+ OUT LPINT lpErrno)
{
IO_STATUS_BLOCK IOSB;
PAFD_POLL_INFO PollInfo;
@@ -891,6 +940,7 @@ WSPSelect(int nfds,
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
/* Clear the Structures */
@@ -1028,6 +1078,12 @@ WSPAccept(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return INVALID_SOCKET;
+ }
/* If this is non-blocking, make sure there's something for us to accept */
FD_ZERO(&ReadSet);
@@ -1035,12 +1091,17 @@ WSPAccept(SOCKET Handle,
Timeout.tv_sec=0;
Timeout.tv_usec=0;
- WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, NULL);
+ if (WSPSelect(0, &ReadSet, NULL, NULL, &Timeout, lpErrno) == SOCKET_ERROR)
+ {
+ NtClose(SockEvent);
+ return INVALID_SOCKET;
+ }
if (ReadSet.fd_array[0] != Socket->Handle)
{
NtClose(SockEvent);
- return 0;
+ *lpErrno = WSAEWOULDBLOCK;
+ return INVALID_SOCKET;
}
/* Send IOCTL */
@@ -1278,7 +1339,9 @@ WSPAccept(SOCKET Handle,
&ProtocolInfo,
GroupID,
Socket->SharedData.CreateFlags,
- NULL);
+ lpErrno);
+ if (AcceptSocket == INVALID_SOCKET)
+ return INVALID_SOCKET;
/* Set up the Accept Structure */
AcceptData.ListenHandle = (HANDLE)AcceptSocket;
@@ -1384,6 +1447,12 @@ WSPConnect(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Bind us First */
if (Socket->SharedData.State == SocketOpen)
@@ -1400,7 +1469,8 @@ WSPConnect(SOCKET Handle,
BindAddress,
&BindAddressLength);
/* Bind it */
- WSPBind(Handle, BindAddress, BindAddressLength, NULL);
+ if (WSPBind(Handle, BindAddress, BindAddressLength, lpErrno) == SOCKET_ERROR)
+ return INVALID_SOCKET;
}
/* Set the Connect Data */
@@ -1423,6 +1493,9 @@ WSPConnect(SOCKET Handle,
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB.Status;
}
+
+ if (Status != STATUS_SUCCESS)
+ goto notify;
}
/* Dynamic Structure...ugh */
@@ -1468,6 +1541,9 @@ WSPConnect(SOCKET Handle,
WaitForSingleObject(SockEvent, INFINITE);
Status = IOSB.Status;
}
+
+ if (Status != STATUS_SUCCESS)
+ goto notify;
}
/* AFD doesn't seem to care if these are invalid, but let's 0 them anyways */
@@ -1499,6 +1575,9 @@ WSPConnect(SOCKET Handle,
Status = IOSB.Status;
}
+ if (Status != STATUS_SUCCESS)
+ goto notify;
+
Socket->TdiConnectionHandle = (HANDLE)IOSB.Information;
/* Get any pending connect data */
@@ -1522,14 +1601,15 @@ WSPConnect(SOCKET Handle,
}
}
+ AFD_DbgPrint(MID_TRACE,("Ending\n"));
+
+notify:
/* Re-enable Async Event */
SockReenableAsyncSelectEvent(Socket, FD_WRITE);
/* FIXME: THIS IS NOT RIGHT!!! HACK HACK HACK! */
SockReenableAsyncSelectEvent(Socket, FD_CONNECT);
- AFD_DbgPrint(MID_TRACE,("Ending\n"));
-
NtClose( SockEvent );
if (Status == STATUS_SUCCESS && (Socket->HelperEvents & WSH_NOTIFY_CONNECT))
@@ -1589,6 +1669,12 @@ WSPShutdown(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Set AFD Disconnect Type */
switch (HowTo)
@@ -1663,6 +1749,12 @@ WSPGetSockName(IN SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate a buffer for the address */
TdiAddressSize =
@@ -1751,6 +1843,12 @@ WSPGetPeerName(IN SOCKET s,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(s);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate a buffer for the address */
TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + *NameLength;
@@ -1828,6 +1926,11 @@ WSPIoctl(IN SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
switch( dwIoControlCode )
{
@@ -2122,8 +2225,12 @@ GetSocketInformation(PSOCKET_INFORMATION Socket,
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
+ if (Status != STATUS_SUCCESS)
+ return -1;
+
/* Return Information */
if (Ulong != NULL)
{
@@ -2193,27 +2300,30 @@ SetSocketInformation(PSOCKET_INFORMATION Socket,
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
NtClose( SockEvent );
- return 0;
+ return Status == STATUS_SUCCESS ? 0 : -1;
}
PSOCKET_INFORMATION
GetSocketStructure(SOCKET Handle)
{
- ULONG i;
+ PSOCKET_INFORMATION CurrentSocket;
- for (i=0; iHandle == Handle)
- {
- return Sockets[i];
- }
+ if (CurrentSocket->Handle == Handle)
+ return CurrentSocket;
+
+ CurrentSocket = CurrentSocket->NextSocket;
}
- return 0;
+
+ return NULL;
}
int CreateContext(PSOCKET_INFORMATION Socket)
@@ -2258,11 +2368,12 @@ int CreateContext(PSOCKET_INFORMATION Socket)
if (Status == STATUS_PENDING)
{
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
NtClose( SockEvent );
- return 0;
+ return Status == STATUS_SUCCESS ? 0 : -1;
}
BOOLEAN SockCreateOrReferenceAsyncThread(VOID)
@@ -2730,10 +2841,6 @@ DllMain(HANDLE hInstDll,
/* Heap to use when allocating */
GlobalHeap = GetProcessHeap();
- /* Allocate Heap for 1024 Sockets, can be expanded later */
- Sockets = HeapAlloc(GetProcessHeap(), 0, sizeof(PSOCKET_INFORMATION) * 1024);
- if (!Sockets) return FALSE;
-
AFD_DbgPrint(MAX_TRACE, ("MSAFD.DLL has been loaded\n"));
break;
diff --git a/dll/win32/msafd/misc/event.c b/dll/win32/msafd/misc/event.c
index 9a49e31b282..a1dc8766148 100644
--- a/dll/win32/msafd/misc/event.c
+++ b/dll/win32/msafd/misc/event.c
@@ -36,6 +36,12 @@ WSPEventSelect(
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Set Socket to Non-Blocking */
BlockMode = 1;
@@ -104,12 +110,16 @@ WSPEventSelect(
/* Wait for return */
if (Status == STATUS_PENDING) {
WaitForSingleObject(SockEvent, INFINITE);
+ Status = IOSB.Status;
}
AFD_DbgPrint(MID_TRACE,("Waited\n"));
NtClose( SockEvent );
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
+
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
/* Set Socket Data*/
@@ -148,6 +158,12 @@ WSPEnumNetworkEvents(
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ NtClose(SockEvent);
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
EnumReq.Event = hEventObject;
@@ -168,13 +184,16 @@ WSPEnumNetworkEvents(
/* Wait for return */
if (Status == STATUS_PENDING) {
WaitForSingleObject(SockEvent, INFINITE);
- Status = STATUS_SUCCESS;
+ Status = IOSB.Status;
}
AFD_DbgPrint(MID_TRACE,("Waited\n"));
NtClose( SockEvent );
+ if (Status != STATUS_SUCCESS)
+ return MsafdReturnWithErrno(Status, lpErrno, 0, NULL);
+
AFD_DbgPrint(MID_TRACE,("Closed event\n"));
AFD_DbgPrint(MID_TRACE,("About to touch struct at %x (%d)\n",
lpNetworkEvents, sizeof(*lpNetworkEvents)));
@@ -186,44 +205,49 @@ WSPEnumNetworkEvents(
/* Set Events to wait for */
if (EnumReq.PollEvents & AFD_EVENT_RECEIVE) {
lpNetworkEvents->lNetworkEvents |= FD_READ;
+ lpNetworkEvents->iErrorCode[FD_READ_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_READ_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_SEND) {
lpNetworkEvents->lNetworkEvents |= FD_WRITE;
+ lpNetworkEvents->iErrorCode[FD_WRITE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_WRITE_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_OOB_RECEIVE) {
lpNetworkEvents->lNetworkEvents |= FD_OOB;
+ lpNetworkEvents->iErrorCode[FD_OOB_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_OOB_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_ACCEPT) {
lpNetworkEvents->lNetworkEvents |= FD_ACCEPT;
+ lpNetworkEvents->iErrorCode[FD_ACCEPT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_ACCEPT_BIT]);
}
if (EnumReq.PollEvents &
(AFD_EVENT_CONNECT | AFD_EVENT_CONNECT_FAIL)) {
lpNetworkEvents->lNetworkEvents |= FD_CONNECT;
+ lpNetworkEvents->iErrorCode[FD_CONNECT_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CONNECT_BIT]);
}
if (EnumReq.PollEvents &
(AFD_EVENT_DISCONNECT | AFD_EVENT_ABORT | AFD_EVENT_CLOSE)) {
lpNetworkEvents->lNetworkEvents |= FD_CLOSE;
+ lpNetworkEvents->iErrorCode[FD_CLOSE_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_CLOSE_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_QOS) {
lpNetworkEvents->lNetworkEvents |= FD_QOS;
+ lpNetworkEvents->iErrorCode[FD_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_QOS_BIT]);
}
if (EnumReq.PollEvents & AFD_EVENT_GROUP_QOS) {
lpNetworkEvents->lNetworkEvents |= FD_GROUP_QOS;
+ lpNetworkEvents->iErrorCode[FD_GROUP_QOS_BIT] = TranslateNtStatusError(EnumReq.EventStatus[FD_GROUP_QOS_BIT]);
}
- if( NT_SUCCESS(Status) ) *lpErrno = 0;
- else *lpErrno = WSAEINVAL;
-
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
- return 0;
+ return MsafdReturnWithErrno(STATUS_SUCCESS, lpErrno, 0, NULL);
}
/* EOF */
diff --git a/dll/win32/msafd/misc/sndrcv.c b/dll/win32/msafd/misc/sndrcv.c
index 212b4fc25ca..557fdae910e 100644
--- a/dll/win32/msafd/misc/sndrcv.c
+++ b/dll/win32/msafd/misc/sndrcv.c
@@ -29,6 +29,11 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Get the Socket Structure associated to this Socket */
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Allocate the Async Data Structure to pass on to the Thread later */
AsyncData = HeapAlloc(GetProcessHeap(), 0, sizeof(*AsyncData));
@@ -46,7 +51,11 @@ WSPAsyncSelect(IN SOCKET Handle,
/* Deactive WSPEventSelect */
if (Socket->SharedData.AsyncEvents)
{
- WSPEventSelect(Handle, NULL, 0, NULL);
+ if (WSPEventSelect(Handle, NULL, 0, lpErrno) == SOCKET_ERROR)
+ {
+ HeapFree(GetProcessHeap(), 0, AsyncData);
+ return SOCKET_ERROR;
+ }
}
/* Create the Asynch Thread if Needed */
@@ -111,6 +120,11 @@ WSPRecv(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
@@ -182,7 +196,7 @@ WSPRecv(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -223,7 +237,7 @@ WSPRecv(SOCKET Handle,
}
/* Re-enable Async Event */
- if (*ReceiveFlags == MSG_OOB)
+ if (*ReceiveFlags & MSG_OOB)
{
SockReenableAsyncSelectEvent(Socket, FD_OOB);
}
@@ -261,6 +275,11 @@ WSPRecvFrom(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
@@ -334,7 +353,7 @@ WSPRecvFrom(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -399,6 +418,11 @@ WSPSend(SOCKET Handle,
/* Get the Socket Structure associate to this Socket*/
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
Status = NtCreateEvent( &SockEvent, GENERIC_READ | GENERIC_WRITE,
NULL, 1, FALSE );
@@ -461,7 +485,7 @@ WSPSend(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -483,7 +507,7 @@ WSPSend(SOCKET Handle,
if (Status == STATUS_PENDING)
{
AFD_DbgPrint(MID_TRACE,("Leaving (Pending)\n"));
- return WSA_IO_PENDING;
+ return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
}
/* Re-enable Async Event */
@@ -523,6 +547,11 @@ WSPSendTo(SOCKET Handle,
/* Get the Socket Structure associate to this Socket */
Socket = GetSocketStructure(Handle);
+ if (!Socket)
+ {
+ *lpErrno = WSAENOTSOCK;
+ return SOCKET_ERROR;
+ }
/* Bind us First */
if (Socket->SharedData.State == SocketOpen)
@@ -540,7 +569,8 @@ WSPSendTo(SOCKET Handle,
BindAddress,
&BindAddressLength);
/* Bind it */
- WSPBind(Handle, BindAddress, BindAddressLength, NULL);
+ if (WSPBind(Handle, BindAddress, BindAddressLength, lpErrno) == SOCKET_ERROR)
+ return SOCKET_ERROR;
}
RemoteAddress = HeapAlloc(GlobalHeap, 0, 0x6 + SocketAddressLength);
@@ -612,7 +642,7 @@ WSPSendTo(SOCKET Handle,
/* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Handle,
- Event ? Event : SockEvent,
+ Event,
APCFunction,
APCContext,
IOSB,
@@ -637,11 +667,8 @@ WSPSendTo(SOCKET Handle,
HeapFree(GlobalHeap, 0, BindAddress);
}
- if (Status == STATUS_PENDING)
- return WSA_IO_PENDING;
-
- /* Re-enable Async Event */
- SockReenableAsyncSelectEvent(Socket, FD_WRITE);
+ if (Status != STATUS_PENDING)
+ SockReenableAsyncSelectEvent(Socket, FD_WRITE);
return MsafdReturnWithErrno(Status, lpErrno, IOSB->Information, lpNumberOfBytesSent);
}
diff --git a/dll/win32/msafd/msafd.h b/dll/win32/msafd/msafd.h
index fbef176ab47..f5795152f12 100755
--- a/dll/win32/msafd/msafd.h
+++ b/dll/win32/msafd/msafd.h
@@ -100,6 +100,7 @@ typedef struct _SOCKET_INFORMATION {
BOOL TrySAN;
SOCKADDR WSLocalAddress;
SOCKADDR WSRemoteAddress;
+ struct _SOCKET_INFORMATION *NextSocket;
} SOCKET_INFORMATION, *PSOCKET_INFORMATION;
@@ -325,10 +326,10 @@ INT
WSPAPI
WSPSelect(
IN INT nfds,
- IN OUT LPFD_SET readfds,
- IN OUT LPFD_SET writefds,
- IN OUT LPFD_SET exceptfds,
- IN CONST LPTIMEVAL timeout,
+ IN OUT fd_set *readfds,
+ IN OUT fd_set *writefds,
+ IN OUT fd_set *exceptfds,
+ IN CONST struct timeval *timeout,
OUT LPINT lpErrno);
INT
@@ -409,6 +410,8 @@ PSOCKET_INFORMATION GetSocketStructure(
SOCKET Handle
);
+INT TranslateNtStatusError( NTSTATUS Status );
+
VOID DeleteSocketStructure( SOCKET Handle );
int GetSocketInformation(
diff --git a/dll/win32/msg711.acm/msg711.acm.rbuild b/dll/win32/msg711.acm/msg711.acm.rbuild
index 468d9927b2f..88e87f98add 100644
--- a/dll/win32/msg711.acm/msg711.acm.rbuild
+++ b/dll/win32/msg711.acm/msg711.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/mshtml/Nl.rc b/dll/win32/mshtml/Nl.rc
index 33baf39b518..d32980ba9fb 100644
--- a/dll/win32/mshtml/Nl.rc
+++ b/dll/win32/mshtml/Nl.rc
@@ -35,9 +35,9 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "Wine-Gecko-Installatie"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Wine could not find a Gecko package which is needed for applications embedding HTML " \
- "to work correctly. Wine can automatically download and install it for you.\n\n" \
- "Note: it's recommended to use distro packages instead. See http://wiki.winehq.org/Gecko for details.",
+ LTEXT "Wine kon geen Gecko pakket vinden. Gecko is nodig voor programma's die gebruik maken " \
+ "van embedded HTML. Wine kan het automatisch voor u downloaden en installeren.\n\n" \
+ "Noot: het is aanbevolen om distro pakketten te gebruiken. Zie http://wiki.winehq.org/Gecko voor details.",
ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT
CONTROL "Voortgang", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
DEFPUSHBUTTON "&Installeren", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
diff --git a/dll/win32/mshtml/Ru.rc b/dll/win32/mshtml/Ru.rc
index 8d3a4c3cc0a..6722ddc5dfc 100644
--- a/dll/win32/mshtml/Ru.rc
+++ b/dll/win32/mshtml/Ru.rc
@@ -36,10 +36,12 @@ STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMEN
CAPTION "ĐŁŃтановка Wine Gecko"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Wine не может найти пакет Gecko который Đ˝Ńжен для приложений ŃĐľ вŃтроенным HTML " \
- "для корректной работы. Wine может автоматичеŃки загрŃзить и ŃŃтановить его для ВаŃ.\n\n" \
- "Примечание: Рекомендовано иŃпользовать пакет из ВаŃего диŃтрибŃтива. ПоŃетите http://wiki.winehq.org/Gecko для деталей.",
- ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT
+ LTEXT "Wine не может найти пакет Gecko, который необходим для корректной работы приложений"\
+ "Ń ĐżĐľĐ´Đ´ĐµŃ€Đ¶ĐşĐľĐą HTML. " \
+ "Wine может автоматичеŃки загрŃзить и ŃŃтановить его для ваŃ.\n\n" \
+ "Примечание: рекомендŃетŃŃŹ иŃпользовать пакет, предоŃтавляемый ваŃим диŃтрибŃтивом. "\
+ "ПоŃетите http://wiki.winehq.org/Gecko для полŃчения более подробной информации.",
+ ID_DWL_STATUS, 10, 10, 240, 70, SS_LEFT
CONTROL "ПрогреŃŃ", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 65, 240, 12
DEFPUSHBUTTON "&ĐŁŃтановить", ID_DWL_INSTALL, 180, 85, 70, 15, WS_GROUP | WS_TABSTOP
PUSHBUTTON "&Отмена", IDCANCEL, 100, 85, 70, 15, WS_GROUP | WS_TABSTOP
diff --git a/dll/win32/mshtml/htmlbody.c b/dll/win32/mshtml/htmlbody.c
index 5c66e65a44a..18a60418cee 100644
--- a/dll/win32/mshtml/htmlbody.c
+++ b/dll/win32/mshtml/htmlbody.c
@@ -434,6 +434,10 @@ static HRESULT WINAPI HTMLBodyElement_put_text(IHTMLBodyElement *iface, VARIANT
nsres = nsIDOMHTMLBodyElement_SetText(This->nsbody, &text);
nsAString_Finish(&text);
+ if(NS_FAILED(nsres)) {
+ ERR("SetText failed: %08x\n", nsres);
+ return E_FAIL;
+ }
return S_OK;
}
@@ -462,7 +466,7 @@ static HRESULT WINAPI HTMLBodyElement_get_text(IHTMLBodyElement *iface, VARIANT
nsAString_Finish(&text);
- return S_OK;
+ return hres;
}
static HRESULT WINAPI HTMLBodyElement_put_link(IHTMLBodyElement *iface, VARIANT v)
diff --git a/dll/win32/mshtml/htmldoc.c b/dll/win32/mshtml/htmldoc.c
index 12aa8c002dc..61476328dd1 100644
--- a/dll/win32/mshtml/htmldoc.c
+++ b/dll/win32/mshtml/htmldoc.c
@@ -889,8 +889,25 @@ static HRESULT WINAPI HTMLDocument_close(IHTMLDocument2 *iface)
static HRESULT WINAPI HTMLDocument_clear(IHTMLDocument2 *iface)
{
HTMLDocument *This = HTMLDOC_THIS(iface);
- FIXME("(%p)\n", This);
- return E_NOTIMPL;
+ nsIDOMNSHTMLDocument *nsdoc;
+ nsresult nsres;
+
+ TRACE("(%p)\n", This);
+
+ nsres = nsIDOMHTMLDocument_QueryInterface(This->doc_node->nsdoc, &IID_nsIDOMNSHTMLDocument, (void**)&nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("Could not get nsIDOMNSHTMLDocument iface: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMNSHTMLDocument_Clear(nsdoc);
+ nsIDOMNSHTMLDocument_Release(nsdoc);
+ if(NS_FAILED(nsres)) {
+ ERR("Clear failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLDocument_queryCommandSupported(IHTMLDocument2 *iface, BSTR cmdID,
diff --git a/dll/win32/mshtml/htmldoc3.c b/dll/win32/mshtml/htmldoc3.c
index e28297fce14..f4ea0962cee 100644
--- a/dll/win32/mshtml/htmldoc3.c
+++ b/dll/win32/mshtml/htmldoc3.c
@@ -308,15 +308,19 @@ static HRESULT WINAPI HTMLDocument3_get_dir(IHTMLDocument3 *iface, BSTR *p)
static HRESULT WINAPI HTMLDocument3_put_oncontextmenu(IHTMLDocument3 *iface, VARIANT v)
{
HTMLDocument *This = HTMLDOC3_THIS(iface);
- FIXME("(%p)->()\n", This);
- return E_NOTIMPL;
+
+ TRACE("(%p)->()\n", This);
+
+ return set_doc_event(This, EVENTID_CONTEXTMENU, &v);
}
static HRESULT WINAPI HTMLDocument3_get_oncontextmenu(IHTMLDocument3 *iface, VARIANT *p)
{
HTMLDocument *This = HTMLDOC3_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ return get_doc_event(This, EVENTID_CONTEXTMENU, p);
}
static HRESULT WINAPI HTMLDocument3_put_onstop(IHTMLDocument3 *iface, VARIANT v)
diff --git a/dll/win32/mshtml/htmlelem.c b/dll/win32/mshtml/htmlelem.c
index b0cb791a1e8..5bf29159aed 100644
--- a/dll/win32/mshtml/htmlelem.c
+++ b/dll/win32/mshtml/htmlelem.c
@@ -1803,13 +1803,11 @@ static HRESULT WINAPI HTMLFiltersCollection_get_length(IHTMLFiltersCollection *i
{
HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
+ if(!p)
+ return E_POINTER;
+
FIXME("(%p)->(%p) Always returning 0\n", This, p);
-
- if(!p)
- return E_POINTER;
-
- if(p)
- *p = 0;
+ *p = 0;
return S_OK;
}
diff --git a/dll/win32/mshtml/htmlevent.c b/dll/win32/mshtml/htmlevent.c
index eef006c962c..6925a0cf2ac 100644
--- a/dll/win32/mshtml/htmlevent.c
+++ b/dll/win32/mshtml/htmlevent.c
@@ -56,6 +56,9 @@ static const WCHAR onchangeW[] = {'o','n','c','h','a','n','g','e',0};
static const WCHAR clickW[] = {'c','l','i','c','k',0};
static const WCHAR onclickW[] = {'o','n','c','l','i','c','k',0};
+static const WCHAR contextmenuW[] = {'c','o','n','t','e','x','t','m','e','n','u',0};
+static const WCHAR oncontextmenuW[] = {'o','n','c','o','n','t','e','x','t','m','e','n','u',0};
+
static const WCHAR dblclickW[] = {'d','b','l','c','l','i','c','k',0};
static const WCHAR ondblclickW[] = {'o','n','d','b','l','c','l','i','c','k',0};
@@ -141,6 +144,8 @@ static const event_info_t event_info[] = {
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
{clickW, onclickW, EVENTT_MOUSE, DISPID_EVMETH_ONCLICK,
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
+ {contextmenuW, oncontextmenuW, EVENTT_MOUSE, DISPID_EVMETH_ONCONTEXTMENU,
+ EVENT_BUBBLE},
{dblclickW, ondblclickW, EVENTT_MOUSE, DISPID_EVMETH_ONDBLCLICK,
EVENT_DEFAULTLISTENER|EVENT_BUBBLE},
{dragW, ondragW, EVENTT_MOUSE, DISPID_EVMETH_ONDRAG,
@@ -283,16 +288,14 @@ static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface)
static HRESULT WINAPI HTMLEventObj_GetTypeInfoCount(IHTMLEventObj *iface, UINT *pctinfo)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%p)\n", This, pctinfo);
- return E_NOTIMPL;
+ return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
}
static HRESULT WINAPI HTMLEventObj_GetTypeInfo(IHTMLEventObj *iface, UINT iTInfo,
LCID lcid, ITypeInfo **ppTInfo)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
- return E_NOTIMPL;
+ return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
}
static HRESULT WINAPI HTMLEventObj_GetIDsOfNames(IHTMLEventObj *iface, REFIID riid,
@@ -300,9 +303,7 @@ static HRESULT WINAPI HTMLEventObj_GetIDsOfNames(IHTMLEventObj *iface, REFIID ri
LCID lcid, DISPID *rgDispId)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
- lcid, rgDispId);
- return E_NOTIMPL;
+ return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
}
static HRESULT WINAPI HTMLEventObj_Invoke(IHTMLEventObj *iface, DISPID dispIdMember,
@@ -310,9 +311,8 @@ static HRESULT WINAPI HTMLEventObj_Invoke(IHTMLEventObj *iface, DISPID dispIdMem
VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
- lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
- return E_NOTIMPL;
+ return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid,
+ wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
}
static HRESULT WINAPI HTMLEventObj_get_srcElement(IHTMLEventObj *iface, IHTMLElement **p)
diff --git a/dll/win32/mshtml/htmlevent.h b/dll/win32/mshtml/htmlevent.h
index 6ba2fe29dc7..3a8619a068f 100644
--- a/dll/win32/mshtml/htmlevent.h
+++ b/dll/win32/mshtml/htmlevent.h
@@ -21,6 +21,7 @@ typedef enum {
EVENTID_BLUR,
EVENTID_CHANGE,
EVENTID_CLICK,
+ EVENTID_CONTEXTMENU,
EVENTID_DBLCLICK,
EVENTID_DRAG,
EVENTID_DRAGSTART,
diff --git a/dll/win32/mshtml/htmlform.c b/dll/win32/mshtml/htmlform.c
index 68860560148..8e169170a4b 100644
--- a/dll/win32/mshtml/htmlform.c
+++ b/dll/win32/mshtml/htmlform.c
@@ -41,6 +41,41 @@ struct HTMLFormElement {
#define HTMLFORM(x) (&(x)->lpHTMLFormElementVtbl)
+static HRESULT htmlform_item(HTMLFormElement *This, int i, IDispatch **ret)
+{
+ nsIDOMHTMLCollection *elements;
+ nsIDOMNode *item;
+ HTMLDOMNode *node;
+ nsresult nsres;
+
+ nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements);
+ if(NS_FAILED(nsres)) {
+ FIXME("GetElements failed: 0x%08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMHTMLCollection_Item(elements, i, &item);
+ nsIDOMHTMLCollection_Release(elements);
+ if(NS_FAILED(nsres)) {
+ FIXME("Item failed: 0x%08x\n", nsres);
+ return E_FAIL;
+ }
+
+ if(item) {
+ node = get_node(This->element.node.doc, item, TRUE);
+ if(!node)
+ return E_OUTOFMEMORY;
+
+ IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+ nsIDOMNode_Release(item);
+ *ret = (IDispatch*)HTMLDOMNODE(node);
+ }else {
+ *ret = NULL;
+ }
+
+ return S_OK;
+}
+
#define HTMLFORM_THIS(iface) DEFINE_THIS(HTMLFormElement, HTMLFormElement, iface)
static HRESULT WINAPI HTMLFormElement_QueryInterface(IHTMLFormElement *iface,
@@ -98,15 +133,43 @@ static HRESULT WINAPI HTMLFormElement_Invoke(IHTMLFormElement *iface, DISPID dis
static HRESULT WINAPI HTMLFormElement_put_action(IHTMLFormElement *iface, BSTR v)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(%s)\n", This, wine_dbgstr_w(v));
- return E_NOTIMPL;
+ nsAString action_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v));
+
+ nsAString_InitDepend(&action_str, v);
+ nsres = nsIDOMHTMLFormElement_SetAction(This->nsform, &action_str);
+ nsAString_Finish(&action_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetAction failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLFormElement_get_action(IHTMLFormElement *iface, BSTR *p)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ nsAString action_str;
+ nsresult nsres;
+ HRESULT hres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsAString_Init(&action_str, NULL);
+ nsres = nsIDOMHTMLFormElement_GetAction(This->nsform, &action_str);
+ if(NS_SUCCEEDED(nsres)) {
+ const PRUnichar *action;
+ nsAString_GetData(&action_str, &action);
+ hres = nsuri_to_url(action, FALSE, p);
+ }else {
+ ERR("GetAction failed: %08x\n", nsres);
+ hres = E_FAIL;
+ }
+
+ return hres;
}
static HRESULT WINAPI HTMLFormElement_put_dir(IHTMLFormElement *iface, BSTR v)
@@ -238,8 +301,19 @@ static HRESULT WINAPI HTMLFormElement_put_length(IHTMLFormElement *iface, LONG v
static HRESULT WINAPI HTMLFormElement_get_length(IHTMLFormElement *iface, LONG *p)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRInt32 length;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMHTMLFormElement_GetLength(This->nsform, &length);
+ if(NS_FAILED(nsres)) {
+ ERR("GetLength failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = length;
+ return S_OK;
}
static HRESULT WINAPI HTMLFormElement__newEnum(IHTMLFormElement *iface, IUnknown **p)
@@ -253,7 +327,20 @@ static HRESULT WINAPI HTMLFormElement_item(IHTMLFormElement *iface, VARIANT name
VARIANT index, IDispatch **pdisp)
{
HTMLFormElement *This = HTMLFORM_THIS(iface);
- FIXME("(%p)->(v v %p)\n", This, pdisp);
+
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp);
+
+ if(!pdisp)
+ return E_INVALIDARG;
+ *pdisp = NULL;
+
+ if(V_VT(&name) == VT_I4) {
+ if(V_I4(&name) < 0)
+ return E_INVALIDARG;
+ return htmlform_item(This, V_I4(&name), pdisp);
+ }
+
+ FIXME("Unsupported args\n");
return E_NOTIMPL;
}
@@ -428,34 +515,21 @@ static HRESULT HTMLFormElement_invoke(HTMLDOMNode *iface,
EXCEPINFO *ei, IServiceProvider *caller)
{
HTMLFormElement *This = HTMLFORM_NODE_THIS(iface);
- nsIDOMHTMLCollection *elements;
- nsIDOMNode *item;
- HTMLDOMNode *node;
- nsresult nsres;
+ IDispatch *ret;
+ HRESULT hres;
TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
- nsres = nsIDOMHTMLFormElement_GetElements(This->nsform, &elements);
- if(NS_FAILED(nsres)) {
- FIXME("GetElements failed: 0x%08x\n", nsres);
- return E_FAIL;
+ hres = htmlform_item(This, id - MSHTML_DISPID_CUSTOM_MIN, &ret);
+ if(FAILED(hres))
+ return hres;
+
+ if(ret) {
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = ret;
+ }else {
+ V_VT(res) = VT_NULL;
}
-
- nsres = nsIDOMHTMLCollection_Item(elements, id - MSHTML_DISPID_CUSTOM_MIN, &item);
- nsIDOMHTMLCollection_Release(elements);
- if(NS_FAILED(nsres)) {
- FIXME("Item failed: 0x%08x\n", nsres);
- return E_FAIL;
- }
-
- node = get_node(This->element.node.doc, item, TRUE);
-
- V_VT(res) = VT_DISPATCH;
- V_DISPATCH(res) = (IDispatch*)node;
-
- IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
- nsIDOMNode_Release(item);
-
return S_OK;
}
diff --git a/dll/win32/mshtml/htmlinput.c b/dll/win32/mshtml/htmlinput.c
index 1b8d1c5413f..76a5063bc2e 100644
--- a/dll/win32/mshtml/htmlinput.c
+++ b/dll/win32/mshtml/htmlinput.c
@@ -106,8 +106,24 @@ static HRESULT WINAPI HTMLInputElement_Invoke(IHTMLInputElement *iface, DISPID d
static HRESULT WINAPI HTMLInputElement_put_type(IHTMLInputElement *iface, BSTR v)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString type_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ /*
+ * FIXME:
+ * On IE setting type works only on dynamically created elements before adding them to DOM tree.
+ */
+ nsAString_InitDepend(&type_str, v);
+ nsres = nsIDOMHTMLInputElement_SetType(This->nsinput, &type_str);
+ nsAString_Finish(&type_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetType failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_type(IHTMLInputElement *iface, BSTR *p)
@@ -180,8 +196,20 @@ static HRESULT WINAPI HTMLInputElement_get_value(IHTMLInputElement *iface, BSTR
static HRESULT WINAPI HTMLInputElement_put_name(IHTMLInputElement *iface, BSTR v)
{
HTMLInputElement *This = HTMLINPUT_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString name_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ nsAString_InitDepend(&name_str, v);
+ nsres = nsIDOMHTMLInputElement_SetName(This->nsinput, &name_str);
+ nsAString_Finish(&name_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetName failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *p)
@@ -190,6 +218,7 @@ static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *
nsAString name_str;
const PRUnichar *name;
nsresult nsres;
+ HRESULT hres = S_OK;
TRACE("(%p)->(%p)\n", This, p);
@@ -198,16 +227,14 @@ static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *
nsres = nsIDOMHTMLInputElement_GetName(This->nsinput, &name_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&name_str, &name);
- *p = SysAllocString(name);
+ *p = *name ? SysAllocString(name) : NULL;
}else {
ERR("GetName failed: %08x\n", nsres);
- return E_FAIL;
+ hres = E_FAIL;
}
nsAString_Finish(&name_str);
-
- TRACE("name=%s\n", debugstr_w(*p));
- return S_OK;
+ return hres;
}
static HRESULT WINAPI HTMLInputElement_put_status(IHTMLInputElement *iface, VARIANT_BOOL v)
diff --git a/dll/win32/mshtml/htmloption.c b/dll/win32/mshtml/htmloption.c
index 3e037627bf1..b8166341bd4 100644
--- a/dll/win32/mshtml/htmloption.c
+++ b/dll/win32/mshtml/htmloption.c
@@ -98,15 +98,35 @@ static HRESULT WINAPI HTMLOptionElement_Invoke(IHTMLOptionElement *iface, DISPID
static HRESULT WINAPI HTMLOptionElement_put_selected(IHTMLOptionElement *iface, VARIANT_BOOL v)
{
HTMLOptionElement *This = HTMLOPTION_THIS(iface);
- FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ nsresult nsres;
+
+ TRACE("(%p)->(%x)\n", This, v);
+
+ nsres = nsIDOMHTMLOptionElement_SetSelected(This->nsoption, v != VARIANT_FALSE);
+ if(NS_FAILED(nsres)) {
+ ERR("SetSelected failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLOptionElement_get_selected(IHTMLOptionElement *iface, VARIANT_BOOL *p)
{
HTMLOptionElement *This = HTMLOPTION_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRBool selected;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMHTMLOptionElement_GetSelected(This->nsoption, &selected);
+ if(NS_FAILED(nsres)) {
+ ERR("GetSelected failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = selected ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI HTMLOptionElement_put_value(IHTMLOptionElement *iface, BSTR v)
diff --git a/dll/win32/mshtml/htmlselect.c b/dll/win32/mshtml/htmlselect.c
index 6698606a4c4..f3aa36f650f 100644
--- a/dll/win32/mshtml/htmlselect.c
+++ b/dll/win32/mshtml/htmlselect.c
@@ -42,6 +42,43 @@ typedef struct {
#define HTMLSELECT(x) ((IHTMLSelectElement*) &(x)->lpHTMLSelectElementVtbl)
+static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret)
+{
+ nsIDOMHTMLOptionsCollection *nscol;
+ nsIDOMNode *nsnode;
+ nsresult nsres;
+
+ nsres = nsIDOMHTMLSelectElement_GetOptions(This->nsselect, &nscol);
+ if(NS_FAILED(nsres)) {
+ ERR("GetOptions failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ nsres = nsIDOMHTMLOptionsCollection_Item(nscol, i, &nsnode);
+ nsIDOMHTMLOptionsCollection_Release(nscol);
+ if(NS_FAILED(nsres)) {
+ ERR("Item failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ if(nsnode) {
+ HTMLDOMNode *node;
+
+ node = get_node(This->element.node.doc, nsnode, TRUE);
+ nsIDOMNode_Release(nsnode);
+ if(!node) {
+ ERR("Could not find node\n");
+ return E_FAIL;
+ }
+
+ IHTMLDOMNode_AddRef(HTMLDOMNODE(node));
+ *ret = (IDispatch*)HTMLDOMNODE(node);
+ }else {
+ *ret = NULL;
+ }
+ return S_OK;
+}
+
#define HTMLSELECT_THIS(iface) DEFINE_THIS(HTMLSelectElement, HTMLSelectElement, iface)
static HRESULT WINAPI HTMLSelectElement_QueryInterface(IHTMLSelectElement *iface,
@@ -170,8 +207,12 @@ static HRESULT WINAPI HTMLSelectElement_get_name(IHTMLSelectElement *iface, BSTR
static HRESULT WINAPI HTMLSelectElement_get_options(IHTMLSelectElement *iface, IDispatch **p)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ *p = (IDispatch*)HTMLSELECT(This);
+ IDispatch_AddRef(*p);
+ return S_OK;
}
static HRESULT WINAPI HTMLSelectElement_put_onchange(IHTMLSelectElement *iface, VARIANT v)
@@ -364,8 +405,15 @@ static HRESULT WINAPI HTMLSelectElement_remove(IHTMLSelectElement *iface, LONG i
static HRESULT WINAPI HTMLSelectElement_put_length(IHTMLSelectElement *iface, LONG v)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
- FIXME("(%p)->(%d)\n", This, v);
- return E_NOTIMPL;
+ nsresult nsres;
+
+ TRACE("(%p)->(%d)\n", This, v);
+
+ nsres = nsIDOMHTMLSelectElement_SetLength(This->nsselect, v);
+ if(NS_FAILED(nsres))
+ ERR("SetLength failed: %08x\n", nsres);
+
+ return S_OK;
}
static HRESULT WINAPI HTMLSelectElement_get_length(IHTMLSelectElement *iface, LONG *p)
@@ -397,7 +445,20 @@ static HRESULT WINAPI HTMLSelectElement_item(IHTMLSelectElement *iface, VARIANT
VARIANT index, IDispatch **pdisp)
{
HTMLSelectElement *This = HTMLSELECT_THIS(iface);
- FIXME("(%p)->(v v %p)\n", This, pdisp);
+
+ TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&name), debugstr_variant(&index), pdisp);
+
+ if(!pdisp)
+ return E_POINTER;
+ *pdisp = NULL;
+
+ if(V_VT(&name) == VT_I4) {
+ if(V_I4(&name) < 0)
+ return E_INVALIDARG;
+ return htmlselect_item(This, V_I4(&name), pdisp);
+ }
+
+ FIXME("Unsupported args\n");
return E_NOTIMPL;
}
@@ -493,6 +554,60 @@ static HRESULT HTMLSelectElementImpl_get_disabled(HTMLDOMNode *iface, VARIANT_BO
return IHTMLSelectElement_get_disabled(HTMLSELECT(This), p);
}
+#define DISPID_OPTIONCOL_0 MSHTML_DISPID_CUSTOM_MIN
+
+static HRESULT HTMLSelectElement_get_dispid(HTMLDOMNode *iface, BSTR name, DWORD flags, DISPID *dispid)
+{
+ const WCHAR *ptr;
+ DWORD idx = 0;
+
+ for(ptr = name; *ptr && isdigitW(*ptr); ptr++) {
+ idx = idx*10 + (*ptr-'0');
+ if(idx > MSHTML_CUSTOM_DISPID_CNT) {
+ WARN("too big idx\n");
+ return DISP_E_UNKNOWNNAME;
+ }
+ }
+ if(*ptr)
+ return DISP_E_UNKNOWNNAME;
+
+ *dispid = DISPID_OPTIONCOL_0 + idx;
+ return S_OK;
+}
+
+static HRESULT HTMLSelectElement_invoke(HTMLDOMNode *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ HTMLSelectElement *This = HTMLSELECT_NODE_THIS(iface);
+
+ TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ IDispatch *ret;
+ HRESULT hres;
+
+ hres = htmlselect_item(This, id-DISPID_OPTIONCOL_0, &ret);
+ if(FAILED(hres))
+ return hres;
+
+ if(ret) {
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = ret;
+ }else {
+ V_VT(res) = VT_NULL;
+ }
+ break;
+ }
+
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
#undef HTMLSELECT_NODE_THIS
static const NodeImplVtbl HTMLSelectElementImplVtbl = {
@@ -501,7 +616,11 @@ static const NodeImplVtbl HTMLSelectElementImplVtbl = {
NULL,
NULL,
HTMLSelectElementImpl_put_disabled,
- HTMLSelectElementImpl_get_disabled
+ HTMLSelectElementImpl_get_disabled,
+ NULL,
+ NULL,
+ HTMLSelectElement_get_dispid,
+ HTMLSelectElement_invoke
};
static const tid_t HTMLSelectElement_tids[] = {
diff --git a/dll/win32/mshtml/htmltextarea.c b/dll/win32/mshtml/htmltextarea.c
index 9ded8ac6e12..dd33c72df21 100644
--- a/dll/win32/mshtml/htmltextarea.c
+++ b/dll/win32/mshtml/htmltextarea.c
@@ -105,8 +105,20 @@ static HRESULT WINAPI HTMLTextAreaElement_get_type(IHTMLTextAreaElement *iface,
static HRESULT WINAPI HTMLTextAreaElement_put_value(IHTMLTextAreaElement *iface, BSTR v)
{
HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ nsAString value_str;
+ nsresult nsres;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ nsAString_InitDepend(&value_str, v);
+ nsres = nsIDOMHTMLTextAreaElement_SetValue(This->nstextarea, &value_str);
+ nsAString_Finish(&value_str);
+ if(NS_FAILED(nsres)) {
+ ERR("SetValue failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface, BSTR *p)
@@ -115,6 +127,7 @@ static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface,
nsAString value_str;
const PRUnichar *value;
nsresult nsres;
+ HRESULT hres = S_OK;
TRACE("(%p)->(%p)\n", This, p);
@@ -123,15 +136,14 @@ static HRESULT WINAPI HTMLTextAreaElement_get_value(IHTMLTextAreaElement *iface,
nsres = nsIDOMHTMLTextAreaElement_GetValue(This->nstextarea, &value_str);
if(NS_SUCCEEDED(nsres)) {
nsAString_GetData(&value_str, &value);
- *p = SysAllocString(value);
+ *p = *value ? SysAllocString(value) : NULL;
}else {
ERR("GetValue failed: %08x\n", nsres);
+ hres = E_FAIL;
}
nsAString_Finish(&value_str);
-
- TRACE("%s\n", debugstr_w(*p));
- return S_OK;
+ return hres;
}
static HRESULT WINAPI HTMLTextAreaElement_put_name(IHTMLTextAreaElement *iface, BSTR v)
@@ -253,15 +265,35 @@ static HRESULT WINAPI HTMLTextAreaElement_get_onselect(IHTMLTextAreaElement *ifa
static HRESULT WINAPI HTMLTextAreaElement_put_readOnly(IHTMLTextAreaElement *iface, VARIANT_BOOL v)
{
HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface);
- FIXME("(%p)->(%x)\n", This, v);
- return E_NOTIMPL;
+ nsresult nsres;
+
+ TRACE("(%p)->(%x)\n", This, v);
+
+ nsres = nsIDOMHTMLTextAreaElement_SetReadOnly(This->nstextarea, v != VARIANT_FALSE);
+ if(NS_FAILED(nsres)) {
+ ERR("SetReadOnly failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ return S_OK;
}
static HRESULT WINAPI HTMLTextAreaElement_get_readOnly(IHTMLTextAreaElement *iface, VARIANT_BOOL *p)
{
HTMLTextAreaElement *This = HTMLTXTAREA_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRBool b;
+ nsresult nsres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsres = nsIDOMHTMLTextAreaElement_GetReadOnly(This->nstextarea, &b);
+ if(NS_FAILED(nsres)) {
+ ERR("GetReadOnly failed: %08x\n", nsres);
+ return E_FAIL;
+ }
+
+ *p = b ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI HTMLTextAreaElement_put_rows(IHTMLTextAreaElement *iface, LONG v)
diff --git a/dll/win32/mshtml/htmlwindow.c b/dll/win32/mshtml/htmlwindow.c
index 5dbea55905c..1701b533288 100644
--- a/dll/win32/mshtml/htmlwindow.c
+++ b/dll/win32/mshtml/htmlwindow.c
@@ -511,20 +511,34 @@ static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID
return clear_task_timer(&This->doc->basedoc, FALSE, timerID);
}
+#define MAX_MESSAGE_LEN 2000
+
static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
{
HTMLWindow *This = HTMLWINDOW2_THIS(iface);
- WCHAR wszTitle[100];
+ WCHAR title[100], *msg = message;
+ DWORD len;
TRACE("(%p)->(%s)\n", This, debugstr_w(message));
- if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, wszTitle,
- sizeof(wszTitle)/sizeof(WCHAR))) {
+ if(!LoadStringW(get_shdoclc(), IDS_MESSAGE_BOX_TITLE, title,
+ sizeof(title)/sizeof(WCHAR))) {
WARN("Could not load message box title: %d\n", GetLastError());
return S_OK;
}
- MessageBoxW(This->doc_obj->hwnd, message, wszTitle, MB_ICONWARNING);
+ len = SysStringLen(message);
+ if(len > MAX_MESSAGE_LEN) {
+ msg = heap_alloc((MAX_MESSAGE_LEN+1)*sizeof(WCHAR));
+ if(!msg)
+ return E_OUTOFMEMORY;
+ memcpy(msg, message, MAX_MESSAGE_LEN*sizeof(WCHAR));
+ msg[MAX_MESSAGE_LEN] = 0;
+ }
+
+ MessageBoxW(This->doc_obj->hwnd, msg, title, MB_ICONWARNING);
+ if(msg != message)
+ heap_free(msg);
return S_OK;
}
diff --git a/dll/win32/mshtml/install.c b/dll/win32/mshtml/install.c
index 4122194a7cc..e47c28423d0 100644
--- a/dll/win32/mshtml/install.c
+++ b/dll/win32/mshtml/install.c
@@ -60,6 +60,11 @@ static const WCHAR mshtml_keyW[] =
'\\','W','i','n','e',
'\\','M','S','H','T','M','L',0};
+static const CHAR mshtml_keyA[] =
+ {'S','o','f','t','w','a','r','e',
+ '\\','W','i','n','e',
+ '\\','M','S','H','T','M','L',0};
+
static HWND install_dialog = NULL;
static LPWSTR tmp_file_name = NULL;
static HANDLE tmp_file = INVALID_HANDLE_VALUE;
@@ -225,23 +230,18 @@ static BOOL install_from_unix_file(const char *file_name)
static BOOL install_from_registered_dir(void)
{
char *file_name;
- HKEY hkey;
DWORD res, type, size = MAX_PATH;
BOOL ret;
- /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
- res = RegOpenKeyW(HKEY_CURRENT_USER, mshtml_keyW, &hkey);
- if(res != ERROR_SUCCESS)
- return FALSE;
-
file_name = heap_alloc(size+sizeof(GECKO_FILE_NAME));
- res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size);
+ /* @@ Wine registry key: HKCU\Software\Wine\MSHTML */
+ res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size);
if(res == ERROR_MORE_DATA) {
file_name = heap_realloc(file_name, size+sizeof(GECKO_FILE_NAME));
- res = RegQueryValueExA(hkey, "GeckoCabDir", NULL, &type, (PBYTE)file_name, &size);
+ res = RegGetValueA(HKEY_CURRENT_USER, mshtml_keyA, "GeckoCabDir", RRF_RT_ANY, &type, (PBYTE)file_name, &size);
}
- RegCloseKey(hkey);
- if(res != ERROR_SUCCESS || type != REG_SZ) {
+
+ if(res != ERROR_SUCCESS || (type != REG_SZ && type != REG_EXPAND_SZ)) {
heap_free(file_name);
return FALSE;
}
diff --git a/dll/win32/mshtml/mshtml_private.h b/dll/win32/mshtml/mshtml_private.h
index 3db8d791e48..4deb4d6357d 100644
--- a/dll/win32/mshtml/mshtml_private.h
+++ b/dll/win32/mshtml/mshtml_private.h
@@ -144,6 +144,7 @@ typedef struct dispex_dynamic_data_t dispex_dynamic_data_t;
#define MSHTML_DISPID_CUSTOM_MIN 0x60000000
#define MSHTML_DISPID_CUSTOM_MAX 0x6fffffff
+#define MSHTML_CUSTOM_DISPID_CNT (MSHTML_DISPID_CUSTOM_MAX-MSHTML_DISPID_CUSTOM_MIN)
typedef struct {
HRESULT (*value)(IUnknown*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
@@ -727,8 +728,10 @@ HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*);
void *nsalloc(size_t) __WINE_ALLOC_SIZE(1);
void nsfree(void*);
+void nsACString_InitDepend(nsACString*,const char*);
void nsACString_SetData(nsACString*,const char*);
PRUint32 nsACString_GetData(const nsACString*,const char**);
+void nsACString_Finish(nsACString*);
BOOL nsAString_Init(nsAString*,const PRUnichar*);
void nsAString_InitDepend(nsAString*,const PRUnichar*);
diff --git a/dll/win32/mshtml/nsembed.c b/dll/win32/mshtml/nsembed.c
index 8a590079278..56c5d945618 100644
--- a/dll/win32/mshtml/nsembed.c
+++ b/dll/win32/mshtml/nsembed.c
@@ -32,6 +32,7 @@
#include "wine/unicode.h"
#include "mshtml_private.h"
+#include "htmlevent.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
WINE_DECLARE_DEBUG_CHANNEL(gecko);
@@ -48,20 +49,14 @@ WINE_DECLARE_DEBUG_CHANNEL(gecko);
#define PR_UINT32_MAX 0xffffffff
-struct nsCStringContainer {
- void *v;
- void *d1;
- PRUint32 d2;
- PRUint32 d3;
-};
-
#define NS_STRING_CONTAINER_INIT_DEPEND 0x0002
+#define NS_CSTRING_CONTAINER_INIT_DEPEND 0x0002
static nsresult (*NS_InitXPCOM2)(nsIServiceManager**,void*,void*);
static nsresult (*NS_ShutdownXPCOM)(nsIServiceManager*);
static nsresult (*NS_GetComponentRegistrar)(nsIComponentRegistrar**);
static nsresult (*NS_StringContainerInit2)(nsStringContainer*,const PRUnichar*,PRUint32,PRUint32);
-static nsresult (*NS_CStringContainerInit)(nsCStringContainer*);
+static nsresult (*NS_CStringContainerInit2)(nsCStringContainer*,const char*,PRUint32,PRUint32);
static nsresult (*NS_StringContainerFinish)(nsStringContainer*);
static nsresult (*NS_CStringContainerFinish)(nsCStringContainer*);
static nsresult (*NS_StringSetData)(nsAString*,const PRUnichar*,PRUint32);
@@ -188,7 +183,7 @@ static BOOL load_xpcom(const PRUnichar *gre_path)
NS_DLSYM(NS_ShutdownXPCOM);
NS_DLSYM(NS_GetComponentRegistrar);
NS_DLSYM(NS_StringContainerInit2);
- NS_DLSYM(NS_CStringContainerInit);
+ NS_DLSYM(NS_CStringContainerInit2);
NS_DLSYM(NS_StringContainerFinish);
NS_DLSYM(NS_CStringContainerFinish);
NS_DLSYM(NS_StringSetData);
@@ -526,11 +521,18 @@ void nsfree(void *mem)
nsIMemory_Free(nsmem, mem);
}
-static void nsACString_Init(nsACString *str, const char *data)
+static BOOL nsACString_Init(nsACString *str, const char *data)
{
- NS_CStringContainerInit(str);
- if(data)
- nsACString_SetData(str, data);
+ return NS_SUCCEEDED(NS_CStringContainerInit2(str, data, PR_UINT32_MAX, 0));
+}
+
+/*
+ * Initializes nsACString with data owned by caller.
+ * Caller must ensure that data is valid during lifetime of string object.
+ */
+void nsACString_InitDepend(nsACString *str, const char *data)
+{
+ NS_CStringContainerInit2(str, data, PR_UINT32_MAX, NS_CSTRING_CONTAINER_INIT_DEPEND);
}
void nsACString_SetData(nsACString *str, const char *data)
@@ -543,7 +545,7 @@ PRUint32 nsACString_GetData(const nsACString *str, const char **data)
return NS_CStringGetData(str, data, NULL);
}
-static void nsACString_Finish(nsACString *str)
+void nsACString_Finish(nsACString *str)
{
NS_CStringContainerFinish(str);
}
@@ -1006,6 +1008,8 @@ static nsresult NSAPI nsContextMenuListener_OnShowContextMenu(nsIContextMenuList
TRACE("(%p)->(%08x %p %p)\n", This, aContextFlags, aEvent, aNode);
+ fire_event(This->doc->basedoc.doc_node /* FIXME */, EVENTID_CONTEXTMENU, TRUE, aNode, aEvent);
+
nsres = nsIDOMEvent_QueryInterface(aEvent, &IID_nsIDOMMouseEvent, (void**)&event);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMMouseEvent interface: %08x\n", nsres);
diff --git a/dll/win32/mshtml/nsiface.idl b/dll/win32/mshtml/nsiface.idl
index 66ab8e6a49b..4ccc64a7c02 100644
--- a/dll/win32/mshtml/nsiface.idl
+++ b/dll/win32/mshtml/nsiface.idl
@@ -119,7 +119,6 @@ typedef nsISupports nsIDOMDOMImplementation;
typedef nsISupports nsIDOMCDATASection;
typedef nsISupports nsIDOMProcessingInstruction;
typedef nsISupports nsIDOMEntityReference;
-typedef nsISupports nsIDOMHTMLOptionsCollection;
typedef nsISupports nsIWebProgressListener;
typedef nsISupports nsIDOMCSSValue;
typedef nsISupports nsIPrintSession;
@@ -1319,6 +1318,20 @@ interface nsIDOMHTMLOptionElement : nsIDOMHTMLElement
nsresult SetValue(const nsAString *aValue);
}
+[
+ object,
+ uuid(bce0213c-f70f-488f-b93f-688acca55d63),
+ local
+ /* FROZEN */
+]
+interface nsIDOMHTMLOptionsCollection : nsISupports
+{
+ nsresult GetLength(PRUint32 *aLength);
+ nsresult SetLength(PRUint32 aLength);
+ nsresult Item(PRUint32 index, nsIDOMNode **_retval);
+ nsresult NamedItem(const nsAString *name, nsIDOMNode **_retval);
+}
+
[
object,
uuid(a6cf9090-15b3-11d2-932e-00805f8add32),
diff --git a/dll/win32/mshtml/nsio.c b/dll/win32/mshtml/nsio.c
index 0c8e45704d7..63c9a6a3d6a 100644
--- a/dll/win32/mshtml/nsio.c
+++ b/dll/win32/mshtml/nsio.c
@@ -196,16 +196,15 @@ static BOOL translate_url(HTMLDocumentObj *doc, nsWineURI *uri)
url = heap_strdupW(uri->wine_url);
hres = IDocHostUIHandler_TranslateUrl(doc->hostui, 0, url, &new_url);
- heap_free(url);
- if(hres != S_OK || !new_url)
- return FALSE;
-
- if(strcmpW(url, new_url)) {
- FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
- ret = TRUE;
+ if(hres == S_OK && new_url) {
+ if(strcmpW(url, new_url)) {
+ FIXME("TranslateUrl returned new URL %s -> %s\n", debugstr_w(url), debugstr_w(new_url));
+ ret = TRUE;
+ }
+ CoTaskMemFree(new_url);
}
- CoTaskMemFree(new_url);
+ heap_free(url);
return ret;
}
@@ -229,7 +228,7 @@ nsresult on_start_uri_open(NSContainer *nscontainer, nsIURI *uri, PRBool *_retva
}
wine_uri->is_doc_uri = TRUE;
- *_retval = translate_url(nscontainer->doc->basedoc.doc_obj, wine_uri);
+ *_retval = translate_url(nscontainer->doc, wine_uri);
}
nsIURI_Release(NSURI(wine_uri));
@@ -2453,6 +2452,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
HTMLWindow *window = NULL;
nsIURI *uri = NULL;
LPCWSTR base_wine_url = NULL;
+ nsACString spec_str;
nsresult nsres;
nsACString_GetData(aSpec, &spec);
@@ -2485,7 +2485,9 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
}
}
+ nsACString_InitDepend(&spec_str, spec);
nsres = nsIIOService_NewURI(nsio, aSpec, aOriginCharset, aBaseURI, &uri);
+ nsACString_Finish(&spec_str);
if(NS_FAILED(nsres))
TRACE("NewURI failed: %08x\n", nsres);
diff --git a/dll/win32/mshtml/secmgr.c b/dll/win32/mshtml/secmgr.c
index e35a83b5c29..c74e19fd93b 100644
--- a/dll/win32/mshtml/secmgr.c
+++ b/dll/win32/mshtml/secmgr.c
@@ -90,6 +90,8 @@ static HRESULT confirm_safety(HTMLDocumentNode *This, const WCHAR *url, struct C
IObjectSafety *obj_safety;
HRESULT hres;
+ TRACE("%s %p %s\n", debugstr_w(url), cs->pUnk, debugstr_guid(&cs->clsid));
+
/* FIXME: Check URLACTION_ACTIVEX_OVERRIDE_SCRIPT_SAFETY */
hres = IInternetSecurityManager_ProcessUrlAction(This->secmgr, url, URLACTION_SCRIPT_SAFE_ACTIVEX,
@@ -119,11 +121,17 @@ static HRESULT confirm_safety(HTMLDocumentNode *This, const WCHAR *url, struct C
}
hres = IObjectSafety_GetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, &supported_opts, &enabled_opts);
- if(SUCCEEDED(hres)) {
- enabled_opts = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
- if(supported_opts & INTERFACE_USES_SECURITY_MANAGER)
- enabled_opts |= INTERFACE_USES_SECURITY_MANAGER;
- hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, enabled_opts, enabled_opts);
+ if(FAILED(hres))
+ supported_opts = 0;
+
+ enabled_opts = INTERFACESAFE_FOR_UNTRUSTED_CALLER;
+ if(supported_opts & INTERFACE_USES_SECURITY_MANAGER)
+ enabled_opts |= INTERFACE_USES_SECURITY_MANAGER;
+
+ hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatchEx, enabled_opts, enabled_opts);
+ if(FAILED(hres)) {
+ enabled_opts &= ~INTERFACE_USES_SECURITY_MANAGER;
+ hres = IObjectSafety_SetInterfaceSafetyOptions(obj_safety, &IID_IDispatch, enabled_opts, enabled_opts);
}
IObjectSafety_Release(obj_safety);
@@ -175,6 +183,7 @@ static HRESULT WINAPI InternetHostSecurityManager_QueryCustomPolicy(IInternetHos
*(DWORD*)*ppPolicy = policy;
*pcbPolicy = sizeof(policy);
+ TRACE("policy %x\n", policy);
return S_OK;
}
diff --git a/dll/win32/mshtml/task.c b/dll/win32/mshtml/task.c
index eae51cacd15..c896179715b 100644
--- a/dll/win32/mshtml/task.c
+++ b/dll/win32/mshtml/task.c
@@ -222,7 +222,6 @@ static void call_timer_disp(IDispatch *disp)
static LRESULT process_timer(void)
{
thread_data_t *thread_data = get_thread_data(TRUE);
- HTMLDocument *doc;
IDispatch *disp;
DWORD tc;
task_timer_t *timer;
@@ -238,7 +237,6 @@ static LRESULT process_timer(void)
return 0;
}
- doc = timer->doc;
disp = timer->disp;
IDispatch_AddRef(disp);
diff --git a/dll/win32/msi/action.c b/dll/win32/msi/action.c
index 81dcba43ae9..4c5597279ab 100644
--- a/dll/win32/msi/action.c
+++ b/dll/win32/msi/action.c
@@ -96,8 +96,6 @@ static const WCHAR szAllocateRegistrySpace[] =
{'A','l','l','o','c','a','t','e','R','e','g','i','s','t','r','y','S','p','a','c','e',0};
static const WCHAR szBindImage[] =
{'B','i','n','d','I','m','a','g','e',0};
-static const WCHAR szCCPSearch[] =
- {'C','C','P','S','e','a','r','c','h',0};
static const WCHAR szDeleteServices[] =
{'D','e','l','e','t','e','S','e','r','v','i','c','e','s',0};
static const WCHAR szDisableRollback[] =
@@ -126,8 +124,6 @@ static const WCHAR szPublishComponents[] =
{'P','u','b','l','i','s','h','C','o','m','p','o','n','e','n','t','s',0};
static const WCHAR szRegisterComPlus[] =
{'R','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0};
-static const WCHAR szRegisterFonts[] =
- {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
static const WCHAR szRegisterUser[] =
{'R','e','g','i','s','t','e','r','U','s','e','r',0};
static const WCHAR szRemoveEnvironmentStrings[] =
@@ -160,18 +156,8 @@ static const WCHAR szUnpublishComponents[] =
{'U','n','p','u','b','l','i','s','h', 'C','o','m','p','o','n','e','n','t','s',0};
static const WCHAR szUnpublishFeatures[] =
{'U','n','p','u','b','l','i','s','h','F','e','a','t','u','r','e','s',0};
-static const WCHAR szUnregisterClassInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0};
static const WCHAR szUnregisterComPlus[] =
{'U','n','r','e','g','i','s','t','e','r','C','o','m','P','l','u','s',0};
-static const WCHAR szUnregisterExtensionInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0};
-static const WCHAR szUnregisterFonts[] =
- {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
-static const WCHAR szUnregisterMIMEInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0};
-static const WCHAR szUnregisterProgIdInfo[] =
- {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0};
static const WCHAR szUnregisterTypeLibraries[] =
{'U','n','r','e','g','i','s','t','e','r','T','y','p','e','L','i','b','r','a','r','i','e','s',0};
static const WCHAR szValidateProductID[] =
@@ -291,9 +277,13 @@ UINT msi_parse_command_line( MSIPACKAGE *package, LPCWSTR szCommandLine,
if (lstrlenW(prop) > 0)
{
+ UINT r = msi_set_property( package->db, prop, val );
+
TRACE("Found commandline property (%s) = (%s)\n",
debugstr_w(prop), debugstr_w(val));
- MSI_SetPropertyW(package,prop,val);
+
+ if (r == ERROR_SUCCESS && !strcmpW( prop, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
}
msi_free(val);
msi_free(prop);
@@ -347,7 +337,7 @@ static UINT msi_check_transform_applicable( MSIPACKAGE *package, IStorage *patch
LPWSTR prod_code, patch_product, langid = NULL, template = NULL;
UINT ret = ERROR_FUNCTION_FAILED;
- prod_code = msi_dup_property( package, szProductCode );
+ prod_code = msi_dup_property( package->db, szProductCode );
patch_product = msi_get_suminfo_product( patch );
TRACE("db = %s patch = %s\n", debugstr_w(prod_code), debugstr_w(patch_product));
@@ -379,7 +369,7 @@ static UINT msi_check_transform_applicable( MSIPACKAGE *package, IStorage *patch
goto end;
}
- langid = msi_dup_property( package, szSystemLanguageID );
+ langid = msi_dup_property( package->db, szSystemLanguageID );
if (!langid)
{
msiobj_release( &si->hdr );
@@ -443,7 +433,7 @@ UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si )
LPWSTR guid_list, *guids, product_code;
UINT i, ret = ERROR_FUNCTION_FAILED;
- product_code = msi_dup_property( package, szProductCode );
+ product_code = msi_dup_property( package->db, szProductCode );
if (!product_code)
{
/* FIXME: the property ProductCode should be written into the DB somewhere */
@@ -490,8 +480,8 @@ static UINT msi_set_media_source_prop(MSIPACKAGE *package)
if (MSI_ViewFetch(view, &rec) == ERROR_SUCCESS)
{
prop = MSI_RecordGetString(rec, 1);
- patch = msi_dup_property(package, szPatch);
- MSI_SetPropertyW(package, prop, patch);
+ patch = msi_dup_property(package->db, szPatch);
+ msi_set_property(package->db, prop, patch);
msi_free(patch);
}
@@ -502,76 +492,130 @@ done:
return r;
}
-static UINT msi_parse_patch_summary( MSIPACKAGE *package, MSIDATABASE *patch_db )
+UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch )
{
- MSISUMMARYINFO *si;
- LPWSTR str, *substorage;
- UINT i, r = ERROR_SUCCESS;
+ MSIPATCHINFO *pi;
+ UINT r = ERROR_SUCCESS;
- si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
- if (!si)
- return ERROR_FUNCTION_FAILED;
+ pi = msi_alloc_zero( sizeof(MSIPATCHINFO) );
+ if (!pi)
+ return ERROR_OUTOFMEMORY;
- if (msi_check_patch_applicable( package, si ) != ERROR_SUCCESS)
+ pi->patchcode = msi_suminfo_dup_string( si, PID_REVNUMBER );
+ if (!pi->patchcode)
{
- TRACE("Patch not applicable\n");
- return ERROR_SUCCESS;
+ msi_free( pi );
+ return ERROR_OUTOFMEMORY;
}
- package->patch = msi_alloc(sizeof(MSIPATCHINFO));
- if (!package->patch)
+ pi->transforms = msi_suminfo_dup_string( si, PID_LASTAUTHOR );
+ if (!pi->transforms)
+ {
+ msi_free( pi->patchcode );
+ msi_free( pi );
return ERROR_OUTOFMEMORY;
+ }
- package->patch->patchcode = msi_suminfo_dup_string(si, PID_REVNUMBER);
- if (!package->patch->patchcode)
- return ERROR_OUTOFMEMORY;
+ *patch = pi;
+ return r;
+}
- /* enumerate the substorage */
- str = msi_suminfo_dup_string( si, PID_LASTAUTHOR );
- package->patch->transforms = str;
+UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch )
+{
+ UINT i, r = ERROR_SUCCESS;
+ WCHAR **substorage;
- substorage = msi_split_string( str, ';' );
- for ( i = 0; substorage && substorage[i] && r == ERROR_SUCCESS; i++ )
+ /* apply substorage transforms */
+ substorage = msi_split_string( patch->transforms, ';' );
+ for (i = 0; substorage && substorage[i] && r == ERROR_SUCCESS; i++)
r = msi_apply_substorage_transform( package, patch_db, substorage[i] );
msi_free( substorage );
- msiobj_release( &si->hdr );
+ if (r != ERROR_SUCCESS)
+ return r;
- msi_set_media_source_prop(package);
+ msi_set_media_source_prop( package );
- return r;
+ /*
+ * There might be a CAB file in the patch package,
+ * so append it to the list of storages to search for streams.
+ */
+ append_storage_to_db( package->db, patch_db->storage );
+
+ list_add_tail( &package->patches, &patch->entry );
+ return ERROR_SUCCESS;
}
static UINT msi_apply_patch_package( MSIPACKAGE *package, LPCWSTR file )
{
+ static const WCHAR dotmsp[] = {'.','m','s','p',0};
MSIDATABASE *patch_db = NULL;
- UINT r;
+ WCHAR localfile[MAX_PATH];
+ MSISUMMARYINFO *si;
+ MSIPATCHINFO *patch = NULL;
+ UINT r = ERROR_SUCCESS;
TRACE("%p %s\n", package, debugstr_w( file ) );
- /* FIXME:
- * We probably want to make sure we only open a patch collection here.
- * Patch collections (.msp) and databases (.msi) have different GUIDs
- * but currently MSI_OpenDatabaseW will accept both.
- */
- r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY, &patch_db );
+ r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db );
if ( r != ERROR_SUCCESS )
{
ERR("failed to open patch collection %s\n", debugstr_w( file ) );
return r;
}
- msi_parse_patch_summary( package, patch_db );
+ si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
+ if (!si)
+ {
+ msiobj_release( &patch_db->hdr );
+ return ERROR_FUNCTION_FAILED;
+ }
- /*
- * There might be a CAB file in the patch package,
- * so append it to the list of storage to search for streams.
- */
- append_storage_to_db( package->db, patch_db->storage );
+ r = msi_check_patch_applicable( package, si );
+ if (r != ERROR_SUCCESS)
+ {
+ TRACE("patch not applicable\n");
+ r = ERROR_SUCCESS;
+ goto done;
+ }
+ r = msi_parse_patch_summary( si, &patch );
+ if ( r != ERROR_SUCCESS )
+ goto done;
+
+ r = msi_get_local_package_name( localfile, dotmsp );
+ if ( r != ERROR_SUCCESS )
+ goto done;
+
+ TRACE("copying to local package %s\n", debugstr_w(localfile));
+
+ if (!CopyFileW( file, localfile, FALSE ))
+ {
+ ERR("Unable to copy package (%s -> %s) (error %u)\n",
+ debugstr_w(file), debugstr_w(localfile), GetLastError());
+ r = GetLastError();
+ goto done;
+ }
+ patch->localfile = strdupW( localfile );
+
+ r = msi_apply_patch_db( package, patch_db, patch );
+ if ( r != ERROR_SUCCESS )
+ WARN("patch failed to apply %u\n", r);
+
+done:
+ msiobj_release( &si->hdr );
msiobj_release( &patch_db->hdr );
+ if (patch && r != ERROR_SUCCESS)
+ {
+ if (patch->localfile)
+ DeleteFileW( patch->localfile );
- return ERROR_SUCCESS;
+ msi_free( patch->patchcode );
+ msi_free( patch->transforms );
+ msi_free( patch->localfile );
+ msi_free( patch );
+ }
+ return r;
}
/* get the PATCH property, and apply all the patches it specifies */
@@ -580,7 +624,7 @@ static UINT msi_apply_patches( MSIPACKAGE *package )
LPWSTR patch_list, *patches;
UINT i, r = ERROR_SUCCESS;
- patch_list = msi_dup_property( package, szPatch );
+ patch_list = msi_dup_property( package->db, szPatch );
TRACE("patches to be applied: %s\n", debugstr_w( patch_list ) );
@@ -601,7 +645,7 @@ static UINT msi_apply_transforms( MSIPACKAGE *package )
LPWSTR xform_list, *xforms;
UINT i, r = ERROR_SUCCESS;
- xform_list = msi_dup_property( package, szTransforms );
+ xform_list = msi_dup_property( package->db, szTransforms );
xforms = msi_split_string( xform_list, ';' );
for( i=0; xforms && xforms[i] && r == ERROR_SUCCESS; i++ )
@@ -644,71 +688,76 @@ static BOOL ui_sequence_exists( MSIPACKAGE *package )
static UINT msi_set_sourcedir_props(MSIPACKAGE *package, BOOL replace)
{
- LPWSTR p, db;
LPWSTR source, check;
- DWORD len;
- static const WCHAR szOriginalDatabase[] =
- {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
-
- db = msi_dup_property( package, szOriginalDatabase );
- if (!db)
- return ERROR_OUTOFMEMORY;
-
- p = strrchrW( db, '\\' );
- if (!p)
+ if (msi_get_property_int( package->db, szInstalled, 0 ))
{
- p = strrchrW( db, '/' );
+ HKEY hkey;
+
+ MSIREG_OpenInstallProps( package->ProductCode, package->Context, NULL, &hkey, FALSE );
+ source = msi_reg_get_val_str( hkey, INSTALLPROPERTY_INSTALLSOURCEW );
+ RegCloseKey( hkey );
+ }
+ else
+ {
+ LPWSTR p, db;
+ DWORD len;
+
+ db = msi_dup_property( package->db, szOriginalDatabase );
+ if (!db)
+ return ERROR_OUTOFMEMORY;
+
+ p = strrchrW( db, '\\' );
if (!p)
{
- msi_free(db);
- return ERROR_SUCCESS;
+ p = strrchrW( db, '/' );
+ if (!p)
+ {
+ msi_free(db);
+ return ERROR_SUCCESS;
+ }
}
+
+ len = p - db + 2;
+ source = msi_alloc( len * sizeof(WCHAR) );
+ lstrcpynW( source, db, len );
+ msi_free( db );
}
- len = p - db + 2;
- source = msi_alloc( len * sizeof(WCHAR) );
- lstrcpynW( source, db, len );
-
- check = msi_dup_property( package, cszSourceDir );
+ check = msi_dup_property( package->db, cszSourceDir );
if (!check || replace)
- MSI_SetPropertyW( package, cszSourceDir, source );
-
+ {
+ UINT r = msi_set_property( package->db, cszSourceDir, source );
+ if (r == ERROR_SUCCESS)
+ msi_reset_folders( package, TRUE );
+ }
msi_free( check );
- check = msi_dup_property( package, cszSOURCEDIR );
+ check = msi_dup_property( package->db, cszSOURCEDIR );
if (!check || replace)
- MSI_SetPropertyW( package, cszSOURCEDIR, source );
+ msi_set_property( package->db, cszSOURCEDIR, source );
msi_free( check );
msi_free( source );
- msi_free( db );
return ERROR_SUCCESS;
}
static BOOL needs_ui_sequence(MSIPACKAGE *package)
{
- INT level = msi_get_property_int(package, szUILevel, 0);
+ INT level = msi_get_property_int(package->db, szUILevel, 0);
return (level & INSTALLUILEVEL_MASK) >= INSTALLUILEVEL_REDUCED;
}
-static UINT msi_set_context(MSIPACKAGE *package)
+UINT msi_set_context(MSIPACKAGE *package)
{
- WCHAR val[10];
- DWORD sz = 10;
- DWORD num;
- UINT r;
+ int num;
package->Context = MSIINSTALLCONTEXT_USERUNMANAGED;
- r = MSI_GetPropertyW(package, szAllUsers, val, &sz);
- if (r == ERROR_SUCCESS)
- {
- num = atolW(val);
- if (num == 1 || num == 2)
- package->Context = MSIINSTALLCONTEXT_MACHINE;
- }
+ num = msi_get_property_int(package->db, szAllUsers, 0);
+ if (num == 1 || num == 2)
+ package->Context = MSIINSTALLCONTEXT_MACHINE;
return ERROR_SUCCESS;
}
@@ -1325,6 +1374,26 @@ done:
return r;
}
+static UINT load_file_disk_id( MSIPACKAGE *package, MSIFILE *file )
+{
+ MSIRECORD *row;
+ static const WCHAR query[] = {
+ 'S','E','L','E','C','T',' ','`','D','i','s','k','I','d','`',' ', 'F','R','O','M',' ',
+ '`','M','e','d','i','a','`',' ','W','H','E','R','E',' ',
+ '`','L','a','s','t','S','e','q','u','e','n','c','e','`',' ','>','=',' ','%','i',0};
+
+ row = MSI_QueryGetRecord( package->db, query, file->Sequence );
+ if (!row)
+ {
+ WARN("query failed\n");
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ file->disk_id = MSI_RecordGetInteger( row, 1 );
+ msiobj_release( &row->hdr );
+ return ERROR_SUCCESS;
+}
+
static UINT load_file(MSIRECORD *row, LPVOID param)
{
MSIPACKAGE* package = param;
@@ -1386,6 +1455,7 @@ static UINT load_file(MSIRECORD *row, LPVOID param)
}
load_file_hash(package, file);
+ load_file_disk_id(package, file);
TRACE("File Loaded (%s)\n",debugstr_w(file->File));
@@ -1470,7 +1540,7 @@ static UINT load_folder( MSIRECORD *row, LPVOID param )
folder->Parent = msi_dup_record_field( row, 2 );
- folder->Property = msi_dup_property( package, folder->Directory );
+ folder->Property = msi_dup_property( package->db, folder->Directory );
list_add_tail( &package->folders, &folder->entry );
@@ -1517,8 +1587,8 @@ static UINT ACTION_CostInitialize(MSIPACKAGE *package)
static const WCHAR szCosting[] =
{'C','o','s','t','i','n','g','C','o','m','p','l','e','t','e',0 };
- MSI_SetPropertyW(package, szCosting, szZero);
- MSI_SetPropertyW(package, cszRootDrive, c_colon);
+ msi_set_property( package->db, szCosting, szZero );
+ msi_set_property( package->db, cszRootDrive, c_colon );
load_all_folders( package );
load_all_components( package );
@@ -1611,7 +1681,7 @@ static BOOL process_state_property(MSIPACKAGE* package, int level,
LPWSTR override;
MSIFEATURE *feature;
- override = msi_dup_property( package, property );
+ override = msi_dup_property( package->db, property );
if (!override)
return FALSE;
@@ -1688,7 +1758,7 @@ static BOOL process_overrides( MSIPACKAGE *package, int level )
ret |= process_state_property( package, level, szAdvertise, INSTALLSTATE_ADVERTISED );
if (ret)
- MSI_SetPropertyW( package, szPreselected, szOne );
+ msi_set_property( package->db, szPreselected, szOne );
return ret;
}
@@ -1703,9 +1773,9 @@ UINT MSI_SetFeatureStates(MSIPACKAGE *package)
TRACE("Checking Install Level\n");
- level = msi_get_property_int(package, szlevel, 1);
+ level = msi_get_property_int(package->db, szlevel, 1);
- if (!msi_get_property_int( package, szPreselected, 0 ))
+ if (!msi_get_property_int( package->db, szPreselected, 0 ))
{
LIST_FOR_EACH_ENTRY( feature, &package->features, MSIFEATURE, entry )
{
@@ -1906,7 +1976,7 @@ static UINT ITERATE_CostFinalizeConditions(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
-static LPWSTR msi_get_disk_file_version( LPCWSTR filename )
+static LPWSTR get_disk_file_version( LPCWSTR filename )
{
static const WCHAR name_fmt[] =
{'%','u','.','%','u','.','%','u','.','%','u',0};
@@ -1944,7 +2014,36 @@ static LPWSTR msi_get_disk_file_version( LPCWSTR filename )
return strdupW( filever );
}
-static UINT msi_check_file_install_states( MSIPACKAGE *package )
+static DWORD get_disk_file_size( LPCWSTR filename )
+{
+ HANDLE file;
+ DWORD size;
+
+ TRACE("%s\n", debugstr_w(filename));
+
+ file = CreateFileW( filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL );
+ if (file == INVALID_HANDLE_VALUE)
+ return INVALID_FILE_SIZE;
+
+ size = GetFileSize( file, NULL );
+ CloseHandle( file );
+ return size;
+}
+
+static BOOL hash_matches( MSIFILE *file )
+{
+ UINT r;
+ MSIFILEHASHINFO hash;
+
+ hash.dwFileHashInfoSize = sizeof(MSIFILEHASHINFO);
+ r = MsiGetFileHashW( file->TargetPath, 0, &hash );
+ if (r != ERROR_SUCCESS)
+ return FALSE;
+
+ return !memcmp( &hash, &file->hash, sizeof(MSIFILEHASHINFO) );
+}
+
+static UINT set_file_install_states( MSIPACKAGE *package )
{
LPWSTR file_version;
MSIFILE *file;
@@ -1952,6 +2051,7 @@ static UINT msi_check_file_install_states( MSIPACKAGE *package )
LIST_FOR_EACH_ENTRY( file, &package->files, MSIFILE, entry )
{
MSICOMPONENT* comp = file->Component;
+ DWORD file_size;
LPWSTR p;
if (!comp)
@@ -1975,38 +2075,43 @@ static UINT msi_check_file_install_states( MSIPACKAGE *package )
TRACE("file %s resolves to %s\n",
debugstr_w(file->File), debugstr_w(file->TargetPath));
- /* don't check files of components that aren't installed */
- if (comp->Installed == INSTALLSTATE_UNKNOWN ||
- comp->Installed == INSTALLSTATE_ABSENT)
- {
- file->state = msifs_missing; /* assume files are missing */
- continue;
- }
-
if (GetFileAttributesW(file->TargetPath) == INVALID_FILE_ATTRIBUTES)
{
file->state = msifs_missing;
comp->Cost += file->FileSize;
continue;
}
-
- if (file->Version &&
- (file_version = msi_get_disk_file_version( file->TargetPath )))
+ if (file->Version && (file_version = get_disk_file_version( file->TargetPath )))
{
- TRACE("new %s old %s\n", debugstr_w(file->Version),
- debugstr_w(file_version));
- /* FIXME: seems like a bad way to compare version numbers */
- if (lstrcmpiW(file_version, file->Version)<0)
+ TRACE("new %s old %s\n", debugstr_w(file->Version), debugstr_w(file_version));
+
+ if (strcmpiW(file_version, file->Version) < 0)
{
file->state = msifs_overwrite;
comp->Cost += file->FileSize;
}
else
+ {
+ TRACE("Destination file version equal or greater, not overwriting\n");
file->state = msifs_present;
+ }
msi_free( file_version );
+ continue;
}
- else
+ if ((file_size = get_disk_file_size( file->TargetPath )) != file->FileSize)
+ {
+ file->state = msifs_overwrite;
+ comp->Cost += file->FileSize - file_size;
+ continue;
+ }
+ if (file->hash.dwFileHashInfoSize && hash_matches( file ))
+ {
+ TRACE("File hashes match, not overwriting\n");
file->state = msifs_present;
+ continue;
+ }
+ file->state = msifs_overwrite;
+ comp->Cost += file->FileSize - file_size;
}
return ERROR_SUCCESS;
@@ -2051,12 +2156,12 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
ACTION_GetComponentInstallStates(package);
ACTION_GetFeatureInstallStates(package);
- TRACE("File calculations\n");
- msi_check_file_install_states( package );
+ TRACE("Calculating file install states\n");
+ set_file_install_states( package );
- if (!process_overrides( package, msi_get_property_int( package, szlevel, 1 ) ))
+ if (!process_overrides( package, msi_get_property_int( package->db, szlevel, 1 ) ))
{
- TRACE("Evaluating Condition Table\n");
+ TRACE("Evaluating feature conditions\n");
rc = MSI_DatabaseOpenViewW( package->db, ConditionQuery, &view );
if (rc == ERROR_SUCCESS)
@@ -2064,29 +2169,29 @@ static UINT ACTION_CostFinalize(MSIPACKAGE *package)
rc = MSI_IterateRecords( view, NULL, ITERATE_CostFinalizeConditions, package );
msiobj_release( &view->hdr );
}
+ }
+ TRACE("Evaluating component conditions\n");
- TRACE("Enabling or Disabling Components\n");
- LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
+ LIST_FOR_EACH_ENTRY( comp, &package->components, MSICOMPONENT, entry )
+ {
+ if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE)
{
- if (MSI_EvaluateConditionW( package, comp->Condition ) == MSICONDITION_FALSE)
- {
- TRACE("Disabling component %s\n", debugstr_w(comp->Component));
- comp->Enabled = FALSE;
- }
- else
- comp->Enabled = TRUE;
+ TRACE("Disabling component %s\n", debugstr_w(comp->Component));
+ comp->Enabled = FALSE;
}
+ else
+ comp->Enabled = TRUE;
}
- MSI_SetPropertyW(package,szCosting,szOne);
+ msi_set_property( package->db, szCosting, szOne );
/* set default run level if not set */
- level = msi_dup_property( package, szlevel );
+ level = msi_dup_property( package->db, szlevel );
if (!level)
- MSI_SetPropertyW(package,szlevel, szOne);
+ msi_set_property( package->db, szlevel, szOne );
msi_free(level);
/* FIXME: check volume disk space */
- MSI_SetPropertyW(package, szOutOfDiskSpace, szZero);
+ msi_set_property( package->db, szOutOfDiskSpace, szZero );
return MSI_SetFeatureStates(package);
}
@@ -2220,7 +2325,7 @@ static const WCHAR *get_root_key( MSIPACKAGE *package, INT root, HKEY *root_key
switch (root)
{
case -1:
- if (msi_get_property_int( package, szAllUsers, 0 ))
+ if (msi_get_property_int( package->db, szAllUsers, 0 ))
{
*root_key = HKEY_LOCAL_MACHINE;
ret = szHLM;
@@ -2364,12 +2469,8 @@ static UINT ITERATE_WriteRegistryValues(MSIRECORD *row, LPVOID param)
uirow = MSI_CreateRecord(3);
MSI_RecordSetStringW(uirow,2,deformated);
MSI_RecordSetStringW(uirow,1,uikey);
-
- if (type == REG_SZ)
+ if (type == REG_SZ || type == REG_EXPAND_SZ)
MSI_RecordSetStringW(uirow,3,(LPWSTR)value_data);
- else
- MSI_RecordSetStringW(uirow,3,value);
-
ui_actiondata(package,szWriteRegistryValues,uirow);
msiobj_release( &uirow->hdr );
@@ -2995,6 +3096,7 @@ static UINT ACTION_ProcessComponents(MSIPACKAGE *package)
else
MSIREG_DeleteUserDataComponentKey(comp->ComponentId, NULL);
}
+ comp->Action = comp->ActionRequest;
/* UI stuff */
uirow = MSI_CreateRecord(3);
@@ -3103,7 +3205,7 @@ static UINT ITERATE_RegisterTypeLibraries(MSIRECORD *row, LPVOID param)
{
LPCWSTR guid;
guid = MSI_RecordGetString(row,1);
- CLSIDFromString((LPWSTR)guid, &tl_struct.clsid);
+ CLSIDFromString((LPCWSTR)guid, &tl_struct.clsid);
tl_struct.source = strdupW( file->TargetPath );
tl_struct.path = NULL;
@@ -3204,7 +3306,7 @@ static UINT ITERATE_UnregisterTypeLibraries( MSIRECORD *row, LPVOID param )
ui_actiondata( package, szUnregisterTypeLibraries, row );
guid = MSI_RecordGetString( row, 1 );
- CLSIDFromString( (LPWSTR)guid, &libid );
+ CLSIDFromString( (LPCWSTR)guid, &libid );
version = MSI_RecordGetInteger( row, 4 );
language = MSI_RecordGetInteger( row, 2 );
@@ -3610,17 +3712,17 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
{'C','l','i','e','n','t','s',0};
static const WCHAR szColon[] = {':',0};
- buffer = msi_dup_property(package, INSTALLPROPERTY_PRODUCTNAMEW);
+ buffer = msi_dup_property(package->db, INSTALLPROPERTY_PRODUCTNAMEW);
msi_reg_set_val_str(hkey, INSTALLPROPERTY_PRODUCTNAMEW, buffer);
msi_free(buffer);
- langid = msi_get_property_int(package, szProductLanguage, 0);
+ langid = msi_get_property_int(package->db, szProductLanguage, 0);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
/* FIXME */
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_AUTHORIZED_LUA_APPW, 0);
- buffer = msi_dup_property(package, szARPProductIcon);
+ buffer = msi_dup_property(package->db, szARPProductIcon);
if (buffer)
{
LPWSTR path = build_icon_path(package,buffer);
@@ -3629,7 +3731,7 @@ static UINT msi_publish_product_properties(MSIPACKAGE *package, HKEY hkey)
msi_free(buffer);
}
- buffer = msi_dup_property(package, szProductVersion);
+ buffer = msi_dup_property(package->db, szProductVersion);
if (buffer)
{
DWORD verdword = msi_version_str_to_dword(buffer);
@@ -3677,7 +3779,7 @@ static UINT msi_publish_upgrade_code(MSIPACKAGE *package)
static const WCHAR szUpgradeCode[] =
{'U','p','g','r','a','d','e','C','o','d','e',0};
- upgrade = msi_dup_property(package, szUpgradeCode);
+ upgrade = msi_dup_property(package->db, szUpgradeCode);
if (!upgrade)
return ERROR_SUCCESS;
@@ -3730,34 +3832,80 @@ static BOOL msi_check_unpublish(MSIPACKAGE *package)
return TRUE;
}
-static UINT msi_publish_patch(MSIPACKAGE *package, HKEY prodkey, HKEY hudkey)
+static UINT msi_publish_patches( MSIPACKAGE *package, HKEY prodkey )
{
+ static const WCHAR szAllPatches[] = {'A','l','l','P','a','t','c','h','e','s',0};
WCHAR patch_squashed[GUID_SIZE];
- HKEY patches;
+ HKEY patches_key = NULL, product_patches_key;
LONG res;
- UINT r = ERROR_FUNCTION_FAILED;
+ MSIPATCHINFO *patch;
+ UINT r;
+ WCHAR *p, *all_patches = NULL;
+ DWORD len = 0;
- res = RegCreateKeyExW(prodkey, szPatches, 0, NULL, 0, KEY_ALL_ACCESS, NULL,
- &patches, NULL);
+ res = RegCreateKeyExW( prodkey, szPatches, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patches_key, NULL );
if (res != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
- squash_guid(package->patch->patchcode, patch_squashed);
+ r = MSIREG_OpenUserDataProductPatchesKey( package->ProductCode, package->Context, &product_patches_key, TRUE );
+ if (r != ERROR_SUCCESS)
+ goto done;
- res = RegSetValueExW(patches, szPatches, 0, REG_MULTI_SZ,
- (const BYTE *)patch_squashed,
- (lstrlenW(patch_squashed) + 1) * sizeof(WCHAR));
+ LIST_FOR_EACH_ENTRY( patch, &package->patches, MSIPATCHINFO, entry )
+ {
+ squash_guid( patch->patchcode, patch_squashed );
+ len += strlenW( patch_squashed ) + 1;
+ }
+
+ p = all_patches = msi_alloc( (len + 1) * sizeof(WCHAR) );
+ if (!all_patches)
+ goto done;
+
+ LIST_FOR_EACH_ENTRY( patch, &package->patches, MSIPATCHINFO, entry )
+ {
+ HKEY patch_key;
+
+ squash_guid( patch->patchcode, p );
+ p += strlenW( p ) + 1;
+
+ res = RegSetValueExW( patches_key, patch_squashed, 0, REG_SZ,
+ (const BYTE *)patch->transforms,
+ (strlenW(patch->transforms) + 1) * sizeof(WCHAR) );
+ if (res != ERROR_SUCCESS)
+ goto done;
+
+ r = MSIREG_OpenUserDataPatchKey( patch->patchcode, package->Context, &patch_key, TRUE );
+ if (r != ERROR_SUCCESS)
+ goto done;
+
+ res = RegSetValueExW( patch_key, szLocalPackage, 0, REG_SZ,
+ (const BYTE *)patch->localfile,
+ (strlenW(patch->localfile) + 1) * sizeof(WCHAR) );
+ RegCloseKey( patch_key );
+ if (res != ERROR_SUCCESS)
+ goto done;
+
+ res = RegCreateKeyExW( product_patches_key, patch_squashed, 0, NULL, 0, KEY_ALL_ACCESS, NULL, &patch_key, NULL );
+ RegCloseKey( patch_key );
+ if (res != ERROR_SUCCESS)
+ goto done;
+ }
+
+ all_patches[len] = 0;
+ res = RegSetValueExW( patches_key, szPatches, 0, REG_MULTI_SZ,
+ (const BYTE *)all_patches, (len + 1) * sizeof(WCHAR) );
if (res != ERROR_SUCCESS)
goto done;
- res = RegSetValueExW(patches, patch_squashed, 0, REG_SZ,
- (const BYTE *)package->patch->transforms,
- (lstrlenW(package->patch->transforms) + 1) * sizeof(WCHAR));
- if (res == ERROR_SUCCESS)
- r = ERROR_SUCCESS;
+ res = RegSetValueExW( product_patches_key, szAllPatches, 0, REG_MULTI_SZ,
+ (const BYTE *)all_patches, (len + 1) * sizeof(WCHAR) );
+ if (res != ERROR_SUCCESS)
+ r = ERROR_FUNCTION_FAILED;
done:
- RegCloseKey(patches);
+ RegCloseKey( product_patches_key );
+ RegCloseKey( patches_key );
+ msi_free( all_patches );
return r;
}
@@ -3791,9 +3939,9 @@ static UINT ACTION_PublishProduct(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS)
goto end;
- if (package->patch)
+ if (!list_empty(&package->patches))
{
- rc = msi_publish_patch(package, hukey, hudkey);
+ rc = msi_publish_patches(package, hukey);
if (rc != ERROR_SUCCESS)
goto end;
}
@@ -3836,10 +3984,10 @@ static WCHAR *get_ini_file_name( MSIPACKAGE *package, MSIRECORD *row )
{
folder = resolve_folder( package, dirprop, FALSE, FALSE, TRUE, NULL );
if (!folder)
- folder = msi_dup_property( package, dirprop );
+ folder = msi_dup_property( package->db, dirprop );
}
else
- folder = msi_dup_property( package, szWindowsFolder );
+ folder = msi_dup_property( package->db, szWindowsFolder );
if (!folder)
{
@@ -4152,21 +4300,16 @@ static UINT ITERATE_SelfRegModules(MSIRECORD *row, LPVOID param)
CloseHandle(info.hProcess);
}
- msi_free(FullName);
-
- /* the UI chunk */
uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, filename );
uipath = strdupW( file->TargetPath );
- p = strrchrW(uipath,'\\');
- if (p)
- p[0]=0;
- MSI_RecordSetStringW( uirow, 1, &p[1] );
- MSI_RecordSetStringW( uirow, 2, uipath);
- ui_actiondata( package, szSelfRegModules, uirow);
+ if ((p = strrchrW( uipath,'\\' ))) *p = 0;
+ MSI_RecordSetStringW( uirow, 2, uipath );
+ ui_actiondata( package, szSelfRegModules, uirow );
msiobj_release( &uirow->hdr );
- msi_free( uipath );
- /* FIXME: call ui_progress? */
+ msi_free( FullName );
+ msi_free( uipath );
return ERROR_SUCCESS;
}
@@ -4235,21 +4378,16 @@ static UINT ITERATE_SelfUnregModules( MSIRECORD *row, LPVOID param )
CloseHandle( pi.hProcess );
}
- msi_free( cmdline );
-
uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, filename );
uipath = strdupW( file->TargetPath );
- if ((p = strrchrW( uipath, '\\' )))
- {
- *p = 0;
- MSI_RecordSetStringW( uirow, 1, ++p );
- }
+ if ((p = strrchrW( uipath,'\\' ))) *p = 0;
MSI_RecordSetStringW( uirow, 2, uipath );
ui_actiondata( package, szSelfUnregModules, uirow );
msiobj_release( &uirow->hdr );
- msi_free( uipath );
- /* FIXME call ui_progress? */
+ msi_free( cmdline );
+ msi_free( uipath );
return ERROR_SUCCESS;
}
@@ -4351,7 +4489,7 @@ static UINT ACTION_PublishFeatures(MSIPACKAGE *package)
{
size += sizeof(WCHAR);
RegSetValueExW(hkey,feature->Feature,0,REG_SZ,
- (LPBYTE)(feature->Feature_Parent ? feature->Feature_Parent : szEmpty),size);
+ (const BYTE*)(feature->Feature_Parent ? feature->Feature_Parent : szEmpty),size);
}
else
{
@@ -4384,6 +4522,7 @@ static UINT msi_unpublish_feature(MSIPACKAGE *package, MSIFEATURE *feature)
{
UINT r;
HKEY hkey;
+ MSIRECORD *uirow;
TRACE("unpublishing feature %s\n", debugstr_w(feature->Feature));
@@ -4403,6 +4542,11 @@ static UINT msi_unpublish_feature(MSIPACKAGE *package, MSIFEATURE *feature)
RegCloseKey(hkey);
}
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, feature->Feature );
+ ui_actiondata( package, szUnpublishFeatures, uirow );
+ msiobj_release( &uirow->hdr );
+
return ERROR_SUCCESS;
}
@@ -4423,11 +4567,10 @@ static UINT ACTION_UnpublishFeatures(MSIPACKAGE *package)
static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
{
- LPWSTR prop, val, key;
SYSTEMTIME systime;
DWORD size, langid;
- WCHAR date[9];
- LPWSTR buffer;
+ WCHAR date[9], *val, *buffer;
+ const WCHAR *prop, *key;
static const WCHAR date_fmt[] = {'%','i','%','0','2','i','%','0','2','i',0};
static const WCHAR szWindowsInstaller[] =
@@ -4445,43 +4588,84 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
{'P','r','o','d','u','c','t','L','a','n','g','u','a','g','e',0};
static const WCHAR szProductVersion[] =
{'P','r','o','d','u','c','t','V','e','r','s','i','o','n',0};
+ static const WCHAR szDisplayVersion[] =
+ {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
+ static const WCHAR szInstallSource[] =
+ {'I','n','s','t','a','l','l','S','o','u','r','c','e',0};
+ static const WCHAR szARPAUTHORIZEDCDFPREFIX[] =
+ {'A','R','P','A','U','T','H','O','R','I','Z','E','D','C','D','F','P','R','E','F','I','X',0};
+ static const WCHAR szAuthorizedCDFPrefix[] =
+ {'A','u','t','h','o','r','i','z','e','d','C','D','F','P','r','e','f','i','x',0};
+ static const WCHAR szARPCONTACT[] =
+ {'A','R','P','C','O','N','T','A','C','T',0};
+ static const WCHAR szContact[] =
+ {'C','o','n','t','a','c','t',0};
+ static const WCHAR szARPCOMMENTS[] =
+ {'A','R','P','C','O','M','M','E','N','T','S',0};
+ static const WCHAR szComments[] =
+ {'C','o','m','m','e','n','t','s',0};
static const WCHAR szProductName[] =
{'P','r','o','d','u','c','t','N','a','m','e',0};
static const WCHAR szDisplayName[] =
{'D','i','s','p','l','a','y','N','a','m','e',0};
- static const WCHAR szDisplayVersion[] =
- {'D','i','s','p','l','a','y','V','e','r','s','i','o','n',0};
+ static const WCHAR szARPHELPLINK[] =
+ {'A','R','P','H','E','L','P','L','I','N','K',0};
+ static const WCHAR szHelpLink[] =
+ {'H','e','l','p','L','i','n','k',0};
+ static const WCHAR szARPHELPTELEPHONE[] =
+ {'A','R','P','H','E','L','P','T','E','L','E','P','H','O','N','E',0};
+ static const WCHAR szHelpTelephone[] =
+ {'H','e','l','p','T','e','l','e','p','h','o','n','e',0};
+ static const WCHAR szARPINSTALLLOCATION[] =
+ {'A','R','P','I','N','S','T','A','L','L','L','O','C','A','T','I','O','N',0};
+ static const WCHAR szInstallLocation[] =
+ {'I','n','s','t','a','l','l','L','o','c','a','t','i','o','n',0};
static const WCHAR szManufacturer[] =
{'M','a','n','u','f','a','c','t','u','r','e','r',0};
+ static const WCHAR szPublisher[] =
+ {'P','u','b','l','i','s','h','e','r',0};
+ static const WCHAR szARPREADME[] =
+ {'A','R','P','R','E','A','D','M','E',0};
+ static const WCHAR szReadme[] =
+ {'R','e','a','d','M','e',0};
+ static const WCHAR szARPSIZE[] =
+ {'A','R','P','S','I','Z','E',0};
+ static const WCHAR szSize[] =
+ {'S','i','z','e',0};
+ static const WCHAR szARPURLINFOABOUT[] =
+ {'A','R','P','U','R','L','I','N','F','O','A','B','O','U','T',0};
+ static const WCHAR szURLInfoAbout[] =
+ {'U','R','L','I','n','f','o','A','b','o','u','t',0};
+ static const WCHAR szARPURLUPDATEINFO[] =
+ {'A','R','P','U','R','L','U','P','D','A','T','E','I','N','F','O',0};
+ static const WCHAR szURLUpdateInfo[] =
+ {'U','R','L','U','p','d','a','t','e','I','n','f','o',0};
- static const LPCSTR propval[] = {
- "ARPAUTHORIZEDCDFPREFIX", "AuthorizedCDFPrefix",
- "ARPCONTACT", "Contact",
- "ARPCOMMENTS", "Comments",
- "ProductName", "DisplayName",
- "ProductVersion", "DisplayVersion",
- "ARPHELPLINK", "HelpLink",
- "ARPHELPTELEPHONE", "HelpTelephone",
- "ARPINSTALLLOCATION", "InstallLocation",
- "SourceDir", "InstallSource",
- "Manufacturer", "Publisher",
- "ARPREADME", "Readme",
- "ARPSIZE", "Size",
- "ARPURLINFOABOUT", "URLInfoAbout",
- "ARPURLUPDATEINFO", "URLUpdateInfo",
- NULL,
+ static const WCHAR *propval[] = {
+ szARPAUTHORIZEDCDFPREFIX, szAuthorizedCDFPrefix,
+ szARPCONTACT, szContact,
+ szARPCOMMENTS, szComments,
+ szProductName, szDisplayName,
+ szARPHELPLINK, szHelpLink,
+ szARPHELPTELEPHONE, szHelpTelephone,
+ szARPINSTALLLOCATION, szInstallLocation,
+ cszSourceDir, szInstallSource,
+ szManufacturer, szPublisher,
+ szARPREADME, szReadme,
+ szARPSIZE, szSize,
+ szARPURLINFOABOUT, szURLInfoAbout,
+ szARPURLUPDATEINFO, szURLUpdateInfo,
+ NULL
};
- const LPCSTR *p = propval;
+ const WCHAR **p = propval;
while (*p)
{
- prop = strdupAtoW(*p++);
- key = strdupAtoW(*p++);
- val = msi_dup_property(package, prop);
+ prop = *p++;
+ key = *p++;
+ val = msi_dup_property(package->db, prop);
msi_reg_set_val_str(hkey, key, val);
msi_free(val);
- msi_free(key);
- msi_free(prop);
}
msi_reg_set_val_dword(hkey, szWindowsInstaller, 1);
@@ -4494,26 +4678,14 @@ static UINT msi_publish_install_properties(MSIPACKAGE *package, HKEY hkey)
/* FIXME: Write real Estimated Size when we have it */
msi_reg_set_val_dword(hkey, szEstimatedSize, 0);
- buffer = msi_dup_property(package, szProductName);
- msi_reg_set_val_str(hkey, szDisplayName, buffer);
- msi_free(buffer);
-
- buffer = msi_dup_property(package, cszSourceDir);
- msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLSOURCEW, buffer);
- msi_free(buffer);
-
- buffer = msi_dup_property(package, szManufacturer);
- msi_reg_set_val_str(hkey, INSTALLPROPERTY_PUBLISHERW, buffer);
- msi_free(buffer);
-
GetLocalTime(&systime);
sprintfW(date, date_fmt, systime.wYear, systime.wMonth, systime.wDay);
msi_reg_set_val_str(hkey, INSTALLPROPERTY_INSTALLDATEW, date);
- langid = msi_get_property_int(package, szProductLanguage, 0);
+ langid = msi_get_property_int(package->db, szProductLanguage, 0);
msi_reg_set_val_dword(hkey, INSTALLPROPERTY_LANGUAGEW, langid);
- buffer = msi_dup_property(package, szProductVersion);
+ buffer = msi_dup_property(package->db, szProductVersion);
msi_reg_set_val_str(hkey, szDisplayVersion, buffer);
if (buffer)
{
@@ -4565,7 +4737,7 @@ static UINT ACTION_RegisterProduct(MSIPACKAGE *package)
if (rc != ERROR_SUCCESS)
goto done;
- upgrade_code = msi_dup_property(package, szUpgradeCode);
+ upgrade_code = msi_dup_property(package->db, szUpgradeCode);
if (upgrade_code)
{
MSIREG_OpenUpgradeCodesKey(upgrade_code, &upgrade, TRUE);
@@ -4597,11 +4769,12 @@ static UINT msi_unpublish_product(MSIPACKAGE *package)
LPWSTR *features = NULL;
BOOL full_uninstall = TRUE;
MSIFEATURE *feature;
+ MSIPATCHINFO *patch;
static const WCHAR szUpgradeCode[] =
{'U','p','g','r','a','d','e','C','o','d','e',0};
- remove = msi_dup_property(package, szRemove);
+ remove = msi_dup_property(package->db, szRemove);
if (!remove)
return ERROR_SUCCESS;
@@ -4642,13 +4815,18 @@ static UINT msi_unpublish_product(MSIPACKAGE *package)
MSIREG_DeleteUserFeaturesKey(package->ProductCode);
}
- upgrade = msi_dup_property(package, szUpgradeCode);
+ upgrade = msi_dup_property(package->db, szUpgradeCode);
if (upgrade)
{
MSIREG_DeleteUserUpgradeCodesKey(upgrade);
msi_free(upgrade);
}
+ LIST_FOR_EACH_ENTRY(patch, &package->patches, MSIPATCHINFO, entry)
+ {
+ MSIREG_DeleteUserDataPatchKey(patch->patchcode, package->Context);
+ }
+
done:
msi_free(remove);
msi_free(features);
@@ -4809,7 +4987,7 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package)
goto end;
}
- productid = msi_dup_property( package, INSTALLPROPERTY_PRODUCTIDW );
+ productid = msi_dup_property( package->db, INSTALLPROPERTY_PRODUCTIDW );
if (!productid)
goto end;
@@ -4820,7 +4998,7 @@ static UINT ACTION_RegisterUser(MSIPACKAGE *package)
for( i = 0; szPropKeys[i][0]; i++ )
{
- buffer = msi_dup_property( package, szPropKeys[i] );
+ buffer = msi_dup_property( package->db, szPropKeys[i] );
msi_reg_set_val_str( hkey, szRegKeys[i], buffer );
msi_free( buffer );
}
@@ -5162,10 +5340,11 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param)
{
MSIPACKAGE *package = param;
MSICOMPONENT *comp;
+ MSIRECORD *uirow;
SC_HANDLE scm = NULL, service = NULL;
LPCWSTR component, *vector = NULL;
- LPWSTR name, args;
- DWORD event, numargs;
+ LPWSTR name, args, display_name = NULL;
+ DWORD event, numargs, len;
UINT r = ERROR_FUNCTION_FAILED;
component = MSI_RecordGetString(rec, 6);
@@ -5198,6 +5377,14 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param)
goto done;
}
+ len = 0;
+ if (!GetServiceDisplayNameW( scm, name, NULL, &len ) &&
+ GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if ((display_name = msi_alloc( ++len * sizeof(WCHAR ))))
+ GetServiceDisplayNameW( scm, name, display_name, &len );
+ }
+
service = OpenServiceW(scm, name, SERVICE_START);
if (!service)
{
@@ -5217,12 +5404,19 @@ static UINT ITERATE_StartService(MSIRECORD *rec, LPVOID param)
r = ERROR_SUCCESS;
done:
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, display_name );
+ MSI_RecordSetStringW( uirow, 2, name );
+ ui_actiondata( package, szStartServices, uirow );
+ msiobj_release( &uirow->hdr );
+
CloseServiceHandle(service);
CloseServiceHandle(scm);
msi_free(name);
msi_free(args);
msi_free(vector);
+ msi_free(display_name);
return r;
}
@@ -5335,9 +5529,11 @@ static UINT ITERATE_StopService( MSIRECORD *rec, LPVOID param )
{
MSIPACKAGE *package = param;
MSICOMPONENT *comp;
+ MSIRECORD *uirow;
LPCWSTR component;
- LPWSTR name;
- DWORD event;
+ LPWSTR name = NULL, display_name = NULL;
+ DWORD event, len;
+ SC_HANDLE scm;
event = MSI_RecordGetInteger( rec, 3 );
if (!(event & msidbServiceControlEventStop))
@@ -5356,10 +5552,34 @@ static UINT ITERATE_StopService( MSIRECORD *rec, LPVOID param )
}
comp->Action = INSTALLSTATE_ABSENT;
+ scm = OpenSCManagerW( NULL, NULL, SC_MANAGER_CONNECT );
+ if (!scm)
+ {
+ ERR("Failed to open the service control manager\n");
+ goto done;
+ }
+
+ len = 0;
+ if (!GetServiceDisplayNameW( scm, name, NULL, &len ) &&
+ GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ if ((display_name = msi_alloc( ++len * sizeof(WCHAR ))))
+ GetServiceDisplayNameW( scm, name, display_name, &len );
+ }
+ CloseServiceHandle( scm );
+
deformat_string( package, MSI_RecordGetString( rec, 2 ), &name );
stop_service( name );
- msi_free( name );
+done:
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, display_name );
+ MSI_RecordSetStringW( uirow, 2, name );
+ ui_actiondata( package, szStopServices, uirow );
+ msiobj_release( &uirow->hdr );
+
+ msi_free( name );
+ msi_free( display_name );
return ERROR_SUCCESS;
}
@@ -6749,19 +6969,19 @@ static UINT ACTION_ValidateProductID( MSIPACKAGE *package )
LPWSTR key, template, id;
UINT r = ERROR_SUCCESS;
- id = msi_dup_property( package, szProductID );
+ id = msi_dup_property( package->db, szProductID );
if (id)
{
msi_free( id );
return ERROR_SUCCESS;
}
- template = msi_dup_property( package, szPIDTemplate );
- key = msi_dup_property( package, szPIDKEY );
+ template = msi_dup_property( package->db, szPIDTemplate );
+ key = msi_dup_property( package->db, szPIDKEY );
if (key && template)
{
FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) );
- r = MSI_SetPropertyW( package, szProductID, key );
+ r = msi_set_property( package->db, szProductID, key );
}
msi_free( template );
msi_free( key );
@@ -6780,7 +7000,7 @@ static UINT ACTION_AllocateRegistrySpace( MSIPACKAGE *package )
static const WCHAR szAvailableFreeReg[] =
{'A','V','A','I','L','A','B','L','E','F','R','E','E','R','E','G',0};
MSIRECORD *uirow;
- int space = msi_get_property_int( package, szAvailableFreeReg, 0 );
+ int space = msi_get_property_int( package->db, szAvailableFreeReg, 0 );
TRACE("%p %d kilobytes\n", package, space);
@@ -6804,6 +7024,40 @@ static UINT ACTION_InstallAdminPackage( MSIPACKAGE *package )
return ERROR_SUCCESS;
}
+static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
+{
+ UINT r, count;
+ MSIQUERY *view;
+
+ static const WCHAR driver_query[] = {
+ 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+ 'O','D','B','C','D','r','i','v','e','r',0 };
+
+ static const WCHAR translator_query[] = {
+ 'S','E','L','E','C','T',' ','*',' ','F','R','O','M',' ',
+ 'O','D','B','C','T','r','a','n','s','l','a','t','o','r',0 };
+
+ r = MSI_DatabaseOpenViewW( package->db, driver_query, &view );
+ if (r == ERROR_SUCCESS)
+ {
+ count = 0;
+ r = MSI_IterateRecords( view, &count, NULL, package );
+ msiobj_release( &view->hdr );
+ if (count) FIXME("ignored %u rows in ODBCDriver table\n", count);
+ }
+
+ r = MSI_DatabaseOpenViewW( package->db, translator_query, &view );
+ if (r == ERROR_SUCCESS)
+ {
+ count = 0;
+ r = MSI_IterateRecords( view, &count, NULL, package );
+ msiobj_release( &view->hdr );
+ if (count) FIXME("ignored %u rows in ODBCTranslator table\n", count);
+ }
+
+ return ERROR_SUCCESS;
+}
+
static UINT msi_unimplemented_action_stub( MSIPACKAGE *package,
LPCSTR action, LPCWSTR table )
{
@@ -6890,36 +7144,6 @@ static UINT ACTION_RemoveExistingProducts( MSIPACKAGE *package )
return msi_unimplemented_action_stub( package, "RemoveExistingProducts", table );
}
-static UINT ACTION_SetODBCFolders( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'D','i','r','e','c','t','o','r','y',0 };
- return msi_unimplemented_action_stub( package, "SetODBCFolders", table );
-}
-
-static UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'A','p','p','I','d',0 };
- return msi_unimplemented_action_stub( package, "UnregisterClassInfo", table );
-}
-
-static UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'E','x','t','e','n','s','i','o','n',0 };
- return msi_unimplemented_action_stub( package, "UnregisterExtensionInfo", table );
-}
-
-static UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'M','I','M','E',0 };
- return msi_unimplemented_action_stub( package, "UnregisterMIMEInfo", table );
-}
-
-static UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
-{
- static const WCHAR table[] = { 'P','r','o','g','I','d',0 };
- return msi_unimplemented_action_stub( package, "UnregisterProgIdInfo", table );
-}
-
typedef UINT (*STANDARDACTIONHANDLER)(MSIPACKAGE*);
static const struct
@@ -7171,7 +7395,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
static const WCHAR szAction[] = {'A','C','T','I','O','N',0};
static const WCHAR szInstall[] = {'I','N','S','T','A','L','L',0};
- MSI_SetPropertyW(package, szAction, szInstall);
+ msi_set_property( package->db, szAction, szInstall );
package->script->InWhatSequence = SEQUENCE_INSTALL;
@@ -7216,10 +7440,10 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
msi_apply_transforms( package );
msi_apply_patches( package );
- if (!szCommandLine && msi_get_property_int( package, szInstalled, 0 ))
+ if (!szCommandLine && msi_get_property_int( package->db, szInstalled, 0 ))
{
TRACE("setting reinstall property\n");
- MSI_SetPropertyW( package, szReinstall, szAll );
+ msi_set_property( package->db, szReinstall, szAll );
}
/* properties may have been added by a transform */
diff --git a/dll/win32/msi/appsearch.c b/dll/win32/msi/appsearch.c
index 12c741178e3..336bfcae0f8 100644
--- a/dll/win32/msi/appsearch.c
+++ b/dll/win32/msi/appsearch.c
@@ -929,7 +929,8 @@ static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATU
'D','r','L','o','c','a','t','o','r',' ',
'w','h','e','r','e',' ',
'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0};
- LPWSTR parentName = NULL, parent = NULL;
+ LPWSTR parent = NULL;
+ LPCWSTR parentName;
WCHAR path[MAX_PATH];
WCHAR expanded[MAX_PATH];
MSIRECORD *row;
@@ -949,14 +950,15 @@ static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATU
}
/* check whether parent is set */
- parentName = msi_dup_record_field(row,2);
+ parentName = MSI_RecordGetString(row, 2);
if (parentName)
{
MSISIGNATURE parentSig;
rc = ACTION_AppSearchSigName(package, parentName, &parentSig, &parent);
ACTION_FreeSignature(&parentSig);
- msi_free(parentName);
+ if (!parent)
+ return ERROR_SUCCESS;
}
sz = MAX_PATH;
@@ -1041,7 +1043,10 @@ static UINT iterate_appsearch(MSIRECORD *row, LPVOID param)
r = ACTION_AppSearchSigName(package, sigName, &sig, &value);
if (value)
{
- MSI_SetPropertyW(package, propName, value);
+ r = msi_set_property( package->db, propName, value );
+ if (r == ERROR_SUCCESS && !strcmpW( propName, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+
msi_free(value);
}
ACTION_FreeSignature(&sig);
@@ -1064,6 +1069,14 @@ UINT ACTION_AppSearch(MSIPACKAGE *package)
MSIQUERY *view = NULL;
UINT r;
+ if (check_unique_action(package, szAppSearch))
+ {
+ TRACE("Skipping AppSearch action: already done in UI sequence\n");
+ return ERROR_SUCCESS;
+ }
+ else
+ register_unique_action(package, szAppSearch);
+
r = MSI_OpenQuery( package->db, &view, query );
if (r != ERROR_SUCCESS)
return ERROR_SUCCESS;
@@ -1092,7 +1105,7 @@ static UINT ITERATE_CCPSearch(MSIRECORD *row, LPVOID param)
if (value)
{
TRACE("Found signature %s\n", debugstr_w(signature));
- MSI_SetPropertyW(package, success, szOne);
+ msi_set_property(package->db, success, szOne);
msi_free(value);
r = ERROR_NO_MORE_ITEMS;
}
@@ -1111,6 +1124,14 @@ UINT ACTION_CCPSearch(MSIPACKAGE *package)
MSIQUERY *view = NULL;
UINT r;
+ if (check_unique_action(package, szCCPSearch))
+ {
+ TRACE("Skipping AppSearch action: already done in UI sequence\n");
+ return ERROR_SUCCESS;
+ }
+ else
+ register_unique_action(package, szCCPSearch);
+
r = MSI_OpenQuery(package->db, &view, query);
if (r != ERROR_SUCCESS)
return ERROR_SUCCESS;
diff --git a/dll/win32/msi/automation.c b/dll/win32/msi/automation.c
index f935a64397d..d6ef5c98781 100644
--- a/dll/win32/msi/automation.c
+++ b/dll/win32/msi/automation.c
@@ -167,7 +167,7 @@ static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter
if( pUnkOuter )
return CLASS_E_NOAGGREGATION;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(AutomationObject)+sizetPrivateData);
+ object = msi_alloc_zero( sizeof(AutomationObject) + sizetPrivateData );
/* Set all the VTable references */
object->lpVtbl = &AutomationObject_Vtbl;
@@ -184,7 +184,7 @@ static HRESULT create_automation_object(MSIHANDLE msiHandle, IUnknown *pUnkOuter
object->iTypeInfo = NULL;
hr = load_type_info((IDispatch *)object, &object->iTypeInfo, clsid, 0x0);
if (FAILED(hr)) {
- HeapFree(GetProcessHeap(), 0, object);
+ msi_free( object );
return hr;
}
@@ -203,7 +203,7 @@ static HRESULT create_list_enumerator(IUnknown *pUnkOuter, LPVOID *ppObj, Automa
if( pUnkOuter )
return CLASS_E_NOAGGREGATION;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ListEnumerator));
+ object = msi_alloc_zero( sizeof(ListEnumerator) );
/* Set all the VTable references */
object->lpVtbl = &ListEnumerator_Vtbl;
@@ -288,7 +288,7 @@ static ULONG WINAPI AutomationObject_Release(IDispatch* iface)
if (This->funcFree) This->funcFree(This);
ITypeInfo_Release(This->iTypeInfo);
MsiCloseHandle(This->msiHandle);
- HeapFree(GetProcessHeap(), 0, This);
+ msi_free(This);
}
return ref;
@@ -607,7 +607,7 @@ static ULONG WINAPI ListEnumerator_Release(IEnumVARIANT* iface)
if (!ref)
{
if (This->pObj) IDispatch_Release((IDispatch *)This->pObj);
- HeapFree(GetProcessHeap(), 0, This);
+ msi_free(This);
}
return ref;
@@ -1043,7 +1043,7 @@ static void WINAPI ListImpl_Free(AutomationObject *This)
for (idx=0; idxulCount; idx++)
VariantClear(&data->pVars[idx]);
- HeapFree(GetProcessHeap(), 0, data->pVars);
+ msi_free(data->pVars);
}
static HRESULT WINAPI ViewImpl_Invoke(
diff --git a/dll/win32/msi/classes.c b/dll/win32/msi/classes.c
index acd8429bec4..22d11c1441c 100644
--- a/dll/win32/msi/classes.c
+++ b/dll/win32/msi/classes.c
@@ -18,15 +18,16 @@
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
-/* actions handled in this module
+/* Actions handled in this module:
+ *
* RegisterClassInfo
* RegisterProgIdInfo
* RegisterExtensionInfo
* RegisterMIMEInfo
- * UnRegisterClassInfo (TODO)
- * UnRegisterProgIdInfo (TODO)
- * UnRegisterExtensionInfo (TODO)
- * UnRegisterMIMEInfo (TODO)
+ * UnregisterClassInfo
+ * UnregisterProgIdInfo
+ * UnregisterExtensionInfo
+ * UnregisterMIMEInfo
*/
#include
@@ -343,7 +344,7 @@ static MSIEXTENSION *load_given_extension( MSIPACKAGE *package, LPCWSTR extensio
static MSIMIME *load_mime( MSIPACKAGE* package, MSIRECORD *row )
{
- LPCWSTR buffer;
+ LPCWSTR extension;
MSIMIME *mt;
/* fill in the data */
@@ -355,8 +356,9 @@ static MSIMIME *load_mime( MSIPACKAGE* package, MSIRECORD *row )
mt->ContentType = msi_dup_record_field( row, 1 );
TRACE("loading mime %s\n", debugstr_w(mt->ContentType));
- buffer = MSI_RecordGetString( row, 2 );
- mt->Extension = load_given_extension( package, buffer );
+ extension = MSI_RecordGetString( row, 2 );
+ mt->Extension = load_given_extension( package, extension );
+ mt->suffix = strdupW( extension );
mt->clsid = msi_dup_record_field( row, 3 );
mt->Class = load_given_class( package, mt->clsid );
@@ -720,6 +722,25 @@ static void mark_progid_for_install( MSIPACKAGE* package, MSIPROGID *progid )
}
}
+static void mark_progid_for_uninstall( MSIPACKAGE *package, MSIPROGID *progid )
+{
+ MSIPROGID *child;
+
+ if (!progid)
+ return;
+
+ if (!progid->InstallMe)
+ return;
+
+ progid->InstallMe = FALSE;
+
+ LIST_FOR_EACH_ENTRY( child, &package->progids, MSIPROGID, entry )
+ {
+ if (child->Parent == progid)
+ mark_progid_for_uninstall( package, child );
+ }
+}
+
static void mark_mime_for_install( MSIMIME *mime )
{
if (!mime)
@@ -727,9 +748,15 @@ static void mark_mime_for_install( MSIMIME *mime )
mime->InstallMe = TRUE;
}
+static void mark_mime_for_uninstall( MSIMIME *mime )
+{
+ if (!mime)
+ return;
+ mime->InstallMe = FALSE;
+}
+
static UINT register_appid(const MSIAPPID *appid, LPCWSTR app )
{
- static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
static const WCHAR szRemoteServerName[] =
{'R','e','m','o','t','e','S','e','r','v','e','r','N','a','m','e',0};
static const WCHAR szLocalService[] =
@@ -776,24 +803,13 @@ static UINT register_appid(const MSIAPPID *appid, LPCWSTR app )
UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
{
- /*
- * Again I am assuming the words, "Whose key file represents" when referring
- * to a Component as to meaning that Components KeyPath file
- */
-
- UINT rc;
- MSIRECORD *uirow;
- static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
- static const WCHAR szProgID[] = { 'P','r','o','g','I','D',0 };
- static const WCHAR szVIProgID[] = { 'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0 };
- static const WCHAR szAppID[] = { 'A','p','p','I','D',0 };
static const WCHAR szFileType_fmt[] = {'F','i','l','e','T','y','p','e','\\','%','s','\\','%','i',0};
+ MSIRECORD *uirow;
HKEY hkey,hkey2,hkey3;
MSICLASS *cls;
load_classes_and_such(package);
- rc = RegCreateKeyW(HKEY_CLASSES_ROOT,szCLSID,&hkey);
- if (rc != ERROR_SUCCESS)
+ if (RegCreateKeyW(HKEY_CLASSES_ROOT, szCLSID, &hkey) != ERROR_SUCCESS)
return ERROR_FUNCTION_FAILED;
LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry )
@@ -812,16 +828,21 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
if (!feature)
continue;
- /*
- * MSDN says that these are based on Feature not on Component.
- */
if (feature->ActionRequest != INSTALLSTATE_LOCAL &&
feature->ActionRequest != INSTALLSTATE_ADVERTISED )
{
- TRACE("Feature %s not scheduled for installation, skipping regstration of class %s\n",
+ TRACE("Feature %s not scheduled for installation, skipping registration of class %s\n",
debugstr_w(feature->Feature), debugstr_w(cls->clsid));
continue;
}
+ feature->Action = feature->ActionRequest;
+
+ file = get_loaded_file( package, comp->KeyPath );
+ if (!file)
+ {
+ TRACE("COM server not provided, skipping class %s\n", debugstr_w(cls->clsid));
+ continue;
+ }
TRACE("Registering class %s (%p)\n", debugstr_w(cls->clsid), cls);
@@ -834,12 +855,6 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
msi_reg_set_val_str( hkey2, NULL, cls->Description );
RegCreateKeyW( hkey2, cls->Context, &hkey3 );
- file = get_loaded_file( package, comp->KeyPath );
- if (!file)
- {
- TRACE("COM server not provided, skipping class %s\n", debugstr_w(cls->clsid));
- continue;
- }
/*
* FIXME: Implement install on demand (advertised components).
@@ -887,35 +902,18 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
if (cls->AppID)
{
MSIAPPID *appid = cls->AppID;
-
msi_reg_set_val_str( hkey2, szAppID, appid->AppID );
-
register_appid( appid, cls->Description );
}
if (cls->IconPath)
- {
- static const WCHAR szDefaultIcon[] =
- {'D','e','f','a','u','l','t','I','c','o','n',0};
-
msi_reg_set_subkey_val( hkey2, szDefaultIcon, NULL, cls->IconPath );
- }
if (cls->DefInprocHandler)
- {
- static const WCHAR szInproc[] =
- {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
-
- msi_reg_set_subkey_val( hkey2, szInproc, NULL, cls->DefInprocHandler );
- }
+ msi_reg_set_subkey_val( hkey2, szInprocHandler, NULL, cls->DefInprocHandler );
if (cls->DefInprocHandler32)
- {
- static const WCHAR szInproc32[] =
- {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
-
- msi_reg_set_subkey_val( hkey2, szInproc32, NULL, cls->DefInprocHandler32 );
- }
+ msi_reg_set_subkey_val( hkey2, szInprocHandler32, NULL, cls->DefInprocHandler32 );
RegCloseKey(hkey2);
@@ -947,14 +945,92 @@ UINT ACTION_RegisterClassInfo(MSIPACKAGE *package)
}
uirow = MSI_CreateRecord(1);
-
MSI_RecordSetStringW( uirow, 1, cls->clsid );
ui_actiondata(package,szRegisterClassInfo,uirow);
msiobj_release(&uirow->hdr);
}
RegCloseKey(hkey);
- return rc;
+ return ERROR_SUCCESS;
+}
+
+UINT ACTION_UnregisterClassInfo( MSIPACKAGE *package )
+{
+ static const WCHAR szFileType[] = {'F','i','l','e','T','y','p','e','\\',0};
+ MSIRECORD *uirow;
+ MSICLASS *cls;
+ HKEY hkey, hkey2;
+
+ load_classes_and_such( package );
+ if (RegOpenKeyW( HKEY_CLASSES_ROOT, szCLSID, &hkey ) != ERROR_SUCCESS)
+ return ERROR_SUCCESS;
+
+ LIST_FOR_EACH_ENTRY( cls, &package->classes, MSICLASS, entry )
+ {
+ MSIFEATURE *feature;
+ MSICOMPONENT *comp;
+ LPWSTR filetype;
+ LONG res;
+
+ comp = cls->Component;
+ if (!comp)
+ continue;
+
+ feature = cls->Feature;
+ if (!feature)
+ continue;
+
+ if (feature->ActionRequest != INSTALLSTATE_ABSENT)
+ {
+ TRACE("Feature %s not scheduled for removal, skipping unregistration of class %s\n",
+ debugstr_w(feature->Feature), debugstr_w(cls->clsid));
+ continue;
+ }
+ feature->Action = feature->ActionRequest;
+
+ TRACE("Unregistering class %s (%p)\n", debugstr_w(cls->clsid), cls);
+
+ cls->Installed = FALSE;
+ mark_progid_for_uninstall( package, cls->ProgID );
+
+ res = RegDeleteTreeW( hkey, cls->clsid );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete class key %d\n", res);
+
+ if (cls->AppID)
+ {
+ res = RegOpenKeyW( HKEY_CLASSES_ROOT, szAppID, &hkey2 );
+ if (res == ERROR_SUCCESS)
+ {
+ res = RegDeleteKeyW( hkey2, cls->AppID->AppID );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete appid key %d\n", res);
+ RegCloseKey( hkey2 );
+ }
+ }
+ if (cls->FileTypeMask)
+ {
+ filetype = msi_alloc( (strlenW( szFileType ) + strlenW( cls->clsid ) + 1) * sizeof(WCHAR) );
+ if (filetype)
+ {
+ strcpyW( filetype, szFileType );
+ strcatW( filetype, cls->clsid );
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, filetype );
+ msi_free( filetype );
+
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete file type %d\n", res);
+ }
+ }
+
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, cls->clsid );
+ ui_actiondata( package, szUnregisterClassInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ RegCloseKey( hkey );
+ return ERROR_SUCCESS;
}
static LPCWSTR get_clsid_of_progid( const MSIPROGID *progid )
@@ -972,11 +1048,7 @@ static LPCWSTR get_clsid_of_progid( const MSIPROGID *progid )
static UINT register_progid( const MSIPROGID* progid )
{
- static const WCHAR szCLSID[] = { 'C','L','S','I','D',0 };
- static const WCHAR szDefaultIcon[] =
- {'D','e','f','a','u','l','t','I','c','o','n',0};
- static const WCHAR szCurVer[] =
- {'C','u','r','V','e','r',0};
+ static const WCHAR szCurVer[] = {'C','u','r','V','e','r',0};
HKEY hkey = 0;
UINT rc;
@@ -1041,6 +1113,41 @@ UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package)
return ERROR_SUCCESS;
}
+UINT ACTION_UnregisterProgIdInfo( MSIPACKAGE *package )
+{
+ MSIPROGID *progid;
+ MSIRECORD *uirow;
+ LONG res;
+
+ load_classes_and_such( package );
+
+ LIST_FOR_EACH_ENTRY( progid, &package->progids, MSIPROGID, entry )
+ {
+ /* check if this progid is to be removed */
+ if (progid->Class && !progid->Class->Installed)
+ progid->InstallMe = FALSE;
+
+ if (progid->InstallMe)
+ {
+ TRACE("progid %s not scheduled to be removed\n", debugstr_w(progid->ProgID));
+ continue;
+ }
+
+ TRACE("Unregistering progid %s\n", debugstr_w(progid->ProgID));
+
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid->ProgID );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete progid key %d\n", res);
+
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, progid->ProgID );
+ ui_actiondata( package, szUnregisterProgIdInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ return ERROR_SUCCESS;
+}
+
static UINT register_verb(MSIPACKAGE *package, LPCWSTR progid,
MSICOMPONENT* component, const MSIEXTENSION* extension,
MSIVERB* verb, INT* Sequence )
@@ -1122,10 +1229,11 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
{
static const WCHAR szContentType[] =
{'C','o','n','t','e','n','t',' ','T','y','p','e',0 };
- HKEY hkey;
+ HKEY hkey = NULL;
MSIEXTENSION *ext;
MSIRECORD *uirow;
BOOL install_on_demand = TRUE;
+ LONG res;
load_classes_and_such(package);
@@ -1157,6 +1265,7 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
debugstr_w(feature->Feature), debugstr_w(ext->Extension));
continue;
}
+ feature->Action = feature->ActionRequest;
TRACE("Registering extension %s (%p)\n", debugstr_w(ext->Extension), ext);
@@ -1170,12 +1279,16 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
mark_mime_for_install(ext->Mime);
- extension = msi_alloc( (lstrlenW( ext->Extension ) + 2)*sizeof(WCHAR) );
- extension[0] = '.';
- lstrcpyW(extension+1,ext->Extension);
-
- RegCreateKeyW(HKEY_CLASSES_ROOT,extension,&hkey);
- msi_free( extension );
+ extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
+ if (extension)
+ {
+ extension[0] = '.';
+ strcpyW( extension + 1, ext->Extension );
+ res = RegCreateKeyW( HKEY_CLASSES_ROOT, extension, &hkey );
+ msi_free( extension );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to create extension key %d\n", res);
+ }
if (ext->Mime)
msi_reg_set_val_str( hkey, szContentType, ext->Mime->ContentType );
@@ -1225,6 +1338,86 @@ UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package)
return ERROR_SUCCESS;
}
+UINT ACTION_UnregisterExtensionInfo( MSIPACKAGE *package )
+{
+ MSIEXTENSION *ext;
+ MSIRECORD *uirow;
+ LONG res;
+
+ load_classes_and_such( package );
+
+ LIST_FOR_EACH_ENTRY( ext, &package->extensions, MSIEXTENSION, entry )
+ {
+ LPWSTR extension;
+ MSIFEATURE *feature;
+
+ if (!ext->Component)
+ continue;
+
+ feature = ext->Feature;
+ if (!feature)
+ continue;
+
+ if (feature->ActionRequest != INSTALLSTATE_ABSENT)
+ {
+ TRACE("Feature %s not scheduled for removal, skipping unregistration of extension %s\n",
+ debugstr_w(feature->Feature), debugstr_w(ext->Extension));
+ continue;
+ }
+
+ TRACE("Unregistering extension %s\n", debugstr_w(ext->Extension));
+
+ ext->Installed = FALSE;
+
+ if (ext->ProgID && !list_empty( &ext->verbs ))
+ mark_progid_for_uninstall( package, ext->ProgID );
+
+ mark_mime_for_uninstall( ext->Mime );
+
+ extension = msi_alloc( (strlenW( ext->Extension ) + 2) * sizeof(WCHAR) );
+ if (extension)
+ {
+ extension[0] = '.';
+ strcpyW( extension + 1, ext->Extension );
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, extension );
+ msi_free( extension );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete extension key %d\n", res);
+ }
+
+ if (ext->ProgID || ext->ProgIDText)
+ {
+ static const WCHAR shellW[] = {'\\','s','h','e','l','l',0};
+ LPCWSTR progid;
+ LPWSTR progid_shell;
+
+ if (ext->ProgID)
+ progid = ext->ProgID->ProgID;
+ else
+ progid = ext->ProgIDText;
+
+ progid_shell = msi_alloc( (strlenW( progid ) + strlenW( shellW ) + 1) * sizeof(WCHAR) );
+ if (progid_shell)
+ {
+ strcpyW( progid_shell, progid );
+ strcatW( progid_shell, shellW );
+ res = RegDeleteTreeW( HKEY_CLASSES_ROOT, progid_shell );
+ msi_free( progid_shell );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete shell key %d\n", res);
+ RegDeleteKeyW( HKEY_CLASSES_ROOT, progid );
+ }
+ }
+
+ uirow = MSI_CreateRecord( 1 );
+ MSI_RecordSetStringW( uirow, 1, ext->Extension );
+ ui_actiondata( package, szUnregisterExtensionInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ return ERROR_SUCCESS;
+}
+
UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
{
static const WCHAR szExten[] =
@@ -1237,11 +1430,6 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
LIST_FOR_EACH_ENTRY( mt, &package->mimes, MSIMIME, entry )
{
LPWSTR extension;
- LPCWSTR exten;
- LPCWSTR mime;
- static const WCHAR fmt[] =
- {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\',
- 'C','o','n','t','e','n','t',' ','T','y','p','e','\\', '%','s',0};
LPWSTR key;
/*
@@ -1254,33 +1442,80 @@ UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package)
if (!mt->InstallMe)
{
- TRACE("MIME %s not scheduled to be installed\n",
- debugstr_w(mt->ContentType));
+ TRACE("MIME %s not scheduled to be installed\n", debugstr_w(mt->ContentType));
continue;
}
-
- mime = mt->ContentType;
- exten = mt->Extension->Extension;
- extension = msi_alloc( (lstrlenW( exten ) + 2)*sizeof(WCHAR) );
- extension[0] = '.';
- lstrcpyW(extension+1,exten);
+ TRACE("Registering MIME type %s\n", debugstr_w(mt->ContentType));
- key = msi_alloc( (strlenW(mime)+strlenW(fmt)+1) * sizeof(WCHAR) );
- sprintfW(key,fmt,mime);
- msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExten, extension );
+ extension = msi_alloc( (strlenW( mt->Extension->Extension ) + 2) * sizeof(WCHAR) );
+ key = msi_alloc( (strlenW( mt->ContentType ) + strlenW( szMIMEDatabase ) + 1) * sizeof(WCHAR) );
- msi_free(extension);
- msi_free(key);
+ if (extension && key)
+ {
+ extension[0] = '.';
+ strcpyW( extension + 1, mt->Extension->Extension );
- if (mt->clsid)
- FIXME("Handle non null for field 3\n");
+ strcpyW( key, szMIMEDatabase );
+ strcatW( key, mt->ContentType );
+ msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szExten, extension );
- uirow = MSI_CreateRecord(2);
- MSI_RecordSetStringW(uirow,1,mt->ContentType);
- MSI_RecordSetStringW(uirow,2,exten);
- ui_actiondata(package,szRegisterMIMEInfo,uirow);
- msiobj_release(&uirow->hdr);
+ if (mt->clsid)
+ msi_reg_set_subkey_val( HKEY_CLASSES_ROOT, key, szCLSID, mt->clsid );
+ }
+ msi_free( extension );
+ msi_free( key );
+
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, mt->ContentType );
+ MSI_RecordSetStringW( uirow, 2, mt->suffix );
+ ui_actiondata( package, szRegisterMIMEInfo, uirow );
+ msiobj_release( &uirow->hdr );
+ }
+
+ return ERROR_SUCCESS;
+}
+
+UINT ACTION_UnregisterMIMEInfo( MSIPACKAGE *package )
+{
+ MSIRECORD *uirow;
+ MSIMIME *mime;
+
+ load_classes_and_such( package );
+
+ LIST_FOR_EACH_ENTRY( mime, &package->mimes, MSIMIME, entry )
+ {
+ LONG res;
+ LPWSTR mime_key;
+
+ mime->InstallMe = (mime->InstallMe ||
+ (mime->Class && mime->Class->Installed) ||
+ (mime->Extension && mime->Extension->Installed));
+
+ if (mime->InstallMe)
+ {
+ TRACE("MIME %s not scheduled to be removed\n", debugstr_w(mime->ContentType));
+ continue;
+ }
+
+ TRACE("Unregistering MIME type %s\n", debugstr_w(mime->ContentType));
+
+ mime_key = msi_alloc( (strlenW( szMIMEDatabase ) + strlenW( mime->ContentType ) + 1) * sizeof(WCHAR) );
+ if (mime_key)
+ {
+ strcpyW( mime_key, szMIMEDatabase );
+ strcatW( mime_key, mime->ContentType );
+ res = RegDeleteKeyW( HKEY_CLASSES_ROOT, mime_key );
+ if (res != ERROR_SUCCESS)
+ WARN("Failed to delete MIME key %d\n", res);
+ msi_free( mime_key );
+ }
+
+ uirow = MSI_CreateRecord( 2 );
+ MSI_RecordSetStringW( uirow, 1, mime->ContentType );
+ MSI_RecordSetStringW( uirow, 2, mime->suffix );
+ ui_actiondata( package, szUnregisterMIMEInfo, uirow );
+ msiobj_release( &uirow->hdr );
}
return ERROR_SUCCESS;
diff --git a/dll/win32/msi/cond.tab.c b/dll/win32/msi/cond.tab.c
index 5449d99fdab..2b10d209be6 100644
--- a/dll/win32/msi/cond.tab.c
+++ b/dll/win32/msi/cond.tab.c
@@ -1989,7 +1989,7 @@ yyreduce:
COND_input* cond = (COND_input*) info;
UINT len;
- (yyval.string) = msi_dup_property( cond->package, (yyvsp[(1) - (1)].string) );
+ (yyval.string) = msi_dup_property( cond->package->db, (yyvsp[(1) - (1)].string) );
if ((yyval.string))
{
len = (lstrlenW((yyval.string)) + 1) * sizeof (WCHAR);
diff --git a/dll/win32/msi/cond.y b/dll/win32/msi/cond.y
index f3db635a10a..9a7a16d67df 100644
--- a/dll/win32/msi/cond.y
+++ b/dll/win32/msi/cond.y
@@ -347,7 +347,7 @@ symbol_s:
COND_input* cond = (COND_input*) info;
UINT len;
- $$ = msi_dup_property( cond->package, $1 );
+ $$ = msi_dup_property( cond->package->db, $1 );
if ($$)
{
len = (lstrlenW($$) + 1) * sizeof (WCHAR);
diff --git a/dll/win32/msi/custom.c b/dll/win32/msi/custom.c
index 584c0507c53..5a1787f7d15 100644
--- a/dll/win32/msi/custom.c
+++ b/dll/win32/msi/custom.c
@@ -163,17 +163,17 @@ static void set_deferred_action_props(MSIPACKAGE *package, LPWSTR deferred_data)
end = strstrW(beg, sep);
*end = '\0';
- MSI_SetPropertyW(package, szCustomActionData, beg);
+ msi_set_property(package->db, szCustomActionData, beg);
beg = end + 3;
end = strstrW(beg, sep);
*end = '\0';
- MSI_SetPropertyW(package, szUserSID, beg);
+ msi_set_property(package->db, szUserSID, beg);
beg = end + 3;
end = strchrW(beg, ']');
*end = '\0';
- MSI_SetPropertyW(package, szProductCode, beg);
+ msi_set_property(package->db, szProductCode, beg);
}
UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL execute)
@@ -231,9 +231,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
}
if (!execute)
{
- LPWSTR actiondata = msi_dup_property(package, action);
- LPWSTR usersid = msi_dup_property(package, szUserSID);
- LPWSTR prodcode = msi_dup_property(package, szProductCode);
+ LPWSTR actiondata = msi_dup_property(package->db, action);
+ LPWSTR usersid = msi_dup_property(package->db, szUserSID);
+ LPWSTR prodcode = msi_dup_property(package->db, szProductCode);
LPWSTR deferred = msi_get_deferred_action(action, actiondata, usersid, prodcode);
if (type & msidbCustomActionTypeCommit)
@@ -256,7 +256,7 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
}
else
{
- LPWSTR actiondata = msi_dup_property( package, action );
+ LPWSTR actiondata = msi_dup_property( package->db, action );
switch (script)
{
@@ -276,9 +276,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
if (deferred_data)
set_deferred_action_props(package, deferred_data);
else if (actiondata)
- MSI_SetPropertyW(package, szCustomActionData, actiondata);
+ msi_set_property(package->db, szCustomActionData, actiondata);
else
- MSI_SetPropertyW(package, szCustomActionData, szEmpty);
+ msi_set_property(package->db, szCustomActionData, szEmpty);
msi_free(actiondata);
}
@@ -327,7 +327,9 @@ UINT ACTION_CustomAction(MSIPACKAGE *package, LPCWSTR action, UINT script, BOOL
break;
deformat_string(package,target,&deformated);
- rc = MSI_SetPropertyW(package,source,deformated);
+ rc = msi_set_property( package->db, source, deformated );
+ if (rc == ERROR_SUCCESS && !strcmpW( source, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
msi_free(deformated);
break;
case 37: /* JScript/VBScript text stored in target column. */
@@ -376,7 +378,7 @@ static UINT store_binary_to_temp(MSIPACKAGE *package, LPCWSTR source,
DWORD sz = MAX_PATH;
UINT r;
- if (MSI_GetPropertyW(package, cszTempFolder, fmt, &sz) != ERROR_SUCCESS)
+ if (msi_get_property(package->db, cszTempFolder, fmt, &sz) != ERROR_SUCCESS)
GetTempPathW(MAX_PATH, fmt);
if (GetTempFileNameW(fmt, szMsi, 0, tmp_file) == 0)
@@ -864,7 +866,7 @@ static UINT HANDLE_CustomType23(MSIPACKAGE *package, LPCWSTR source,
UINT r;
size = MAX_PATH;
- MSI_GetPropertyW(package, cszSourceDir, package_path, &size);
+ msi_get_property(package->db, cszSourceDir, package_path, &size);
lstrcatW(package_path, szBackSlash);
lstrcatW(package_path, source);
@@ -1078,7 +1080,7 @@ static UINT HANDLE_CustomType50(MSIPACKAGE *package, LPCWSTR source,
memset(&si,0,sizeof(STARTUPINFOW));
memset(&info,0,sizeof(PROCESS_INFORMATION));
- prop = msi_dup_property( package, source );
+ prop = msi_dup_property( package->db, source );
if (!prop)
return ERROR_SUCCESS;
@@ -1380,7 +1382,7 @@ static UINT HANDLE_CustomType53_54(MSIPACKAGE *package, LPCWSTR source,
TRACE("%s %s\n", debugstr_w(source), debugstr_w(target));
- prop = msi_dup_property(package,source);
+ prop = msi_dup_property( package->db, source );
if (!prop)
return ERROR_SUCCESS;
@@ -1415,7 +1417,7 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package)
EnterCriticalSection( &msi_custom_action_cs );
handle_count = list_count( &msi_pending_custom_actions );
- wait_handles = HeapAlloc( GetProcessHeap(), 0, handle_count * sizeof(HANDLE) );
+ wait_handles = msi_alloc( handle_count * sizeof(HANDLE) );
handle_count = 0;
LIST_FOR_EACH_ENTRY_SAFE( info, cursor, &msi_pending_custom_actions, msi_custom_action_info, entry )
@@ -1435,7 +1437,7 @@ void ACTION_FinishCustomActions(const MSIPACKAGE* package)
CloseHandle( wait_handles[i] );
}
- HeapFree( GetProcessHeap(), 0, wait_handles );
+ msi_free( wait_handles );
}
typedef struct _msi_custom_remote_impl {
diff --git a/dll/win32/msi/database.c b/dll/win32/msi/database.c
index cfa11e97ed5..3e577926340 100644
--- a/dll/win32/msi/database.c
+++ b/dll/win32/msi/database.c
@@ -164,64 +164,6 @@ UINT db_get_raw_stream( MSIDATABASE *db, LPCWSTR stname, IStream **stm )
return SUCCEEDED(r) ? ERROR_SUCCESS : ERROR_FUNCTION_FAILED;
}
-UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
- USHORT **pdata, UINT *psz )
-{
- HRESULT r;
- UINT ret = ERROR_FUNCTION_FAILED;
- VOID *data;
- ULONG sz, count;
- IStream *stm = NULL;
- STATSTG stat;
- LPWSTR encname;
-
- encname = encode_streamname( FALSE, stname );
- r = db_get_raw_stream( db, encname, &stm );
- msi_free( encname );
-
- if( r != ERROR_SUCCESS)
- return ret;
-
- r = IStream_Stat(stm, &stat, STATFLAG_NONAME );
- if( FAILED( r ) )
- {
- WARN("open stream failed r = %08x!\n", r);
- goto end;
- }
-
- if( stat.cbSize.QuadPart >> 32 )
- {
- WARN("Too big!\n");
- goto end;
- }
-
- sz = stat.cbSize.QuadPart;
- data = msi_alloc( sz );
- if( !data )
- {
- WARN("couldn't allocate memory r=%08x!\n", r);
- ret = ERROR_NOT_ENOUGH_MEMORY;
- goto end;
- }
-
- r = IStream_Read(stm, data, sz, &count );
- if( FAILED( r ) || ( count != sz ) )
- {
- msi_free( data );
- WARN("read stream failed r = %08x!\n", r);
- goto end;
- }
-
- *pdata = data;
- *psz = sz;
- ret = ERROR_SUCCESS;
-
-end:
- IStream_Release( stm );
-
- return ret;
-}
-
static void free_transforms( MSIDATABASE *db )
{
while( !list_empty( &db->transforms ) )
@@ -234,6 +176,37 @@ static void free_transforms( MSIDATABASE *db )
}
}
+void db_destroy_stream( MSIDATABASE *db, LPCWSTR stname )
+{
+ MSISTREAM *stream, *stream2;
+
+ LIST_FOR_EACH_ENTRY_SAFE( stream, stream2, &db->streams, MSISTREAM, entry )
+ {
+ HRESULT r;
+ STATSTG stat;
+
+ r = IStream_Stat( stream->stm, &stat, 0 );
+ if (FAILED(r))
+ {
+ WARN("failed to stat stream r = %08x\n", r);
+ continue;
+ }
+
+ if (!strcmpW( stname, stat.pwcsName ))
+ {
+ TRACE("destroying %s\n", debugstr_w(stname));
+
+ list_remove( &stream->entry );
+ IStream_Release( stream->stm );
+ msi_free( stream );
+ IStorage_DestroyElement( db->storage, stname );
+ CoTaskMemFree( stat.pwcsName );
+ break;
+ }
+ CoTaskMemFree( stat.pwcsName );
+ }
+}
+
static void free_streams( MSIDATABASE *db )
{
while( !list_empty( &db->streams ) )
@@ -289,7 +262,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
UINT ret = ERROR_FUNCTION_FAILED;
LPCWSTR szMode, save_path;
STATSTG stat;
- BOOL created = FALSE;
+ BOOL created = FALSE, patch = FALSE;
WCHAR path[MAX_PATH];
static const WCHAR szTables[] = { '_','T','a','b','l','e','s',0 };
@@ -304,6 +277,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
{
TRACE("Database is a patch\n");
szPersist -= MSIDBOPEN_PATCHFILE;
+ patch = TRUE;
}
save_path = szDBPath;
@@ -331,7 +305,7 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
STGM_CREATE|STGM_DIRECT|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, &stg);
if( r == ERROR_SUCCESS )
{
- IStorage_SetClass( stg, &CLSID_MsiDatabase );
+ IStorage_SetClass( stg, patch ? &CLSID_MsiPatch : &CLSID_MsiDatabase );
/* create the _Tables stream */
r = write_stream_data(stg, szTables, NULL, 0, TRUE);
if (SUCCEEDED(r))
@@ -379,6 +353,14 @@ UINT MSI_OpenDatabaseW(LPCWSTR szDBPath, LPCWSTR szPersist, MSIDATABASE **pdb)
goto end;
}
+ if ( patch && !IsEqualGUID( &stat.clsid, &CLSID_MsiPatch ) )
+ {
+ ERR("storage GUID is not the MSI patch GUID %s\n",
+ debugstr_guid(&stat.clsid) );
+ ret = ERROR_OPEN_FAILED;
+ goto end;
+ }
+
db = alloc_msiobject( MSIHANDLETYPE_DATABASE, sizeof (MSIDATABASE),
MSI_CloseDatabase );
if( !db )
diff --git a/dll/win32/msi/dialog.c b/dll/win32/msi/dialog.c
index ac2e95af91f..2a00aa7cdeb 100644
--- a/dll/win32/msi/dialog.c
+++ b/dll/win32/msi/dialog.c
@@ -171,6 +171,8 @@ static MSIFEATURE *msi_seltree_get_selected_feature( msi_control *control );
static DWORD uiThreadId;
static HWND hMsiHiddenWindow;
+static LPWSTR msi_get_window_text( HWND hwnd );
+
static INT msi_dialog_scale_unit( msi_dialog *dialog, INT val )
{
return MulDiv( val, dialog->scale, 12 );
@@ -234,7 +236,7 @@ static LPWSTR msi_dialog_dup_property( msi_dialog *dialog, LPCWSTR property, BOO
return NULL;
if (indirect)
- prop = msi_dup_property( dialog->package, property );
+ prop = msi_dup_property( dialog->package->db, property );
if (!prop)
prop = strdupW( property );
@@ -581,6 +583,13 @@ static void msi_dialog_update_controls( msi_dialog *dialog, LPCWSTR property )
}
}
+static void msi_dialog_set_property( MSIPACKAGE *package, LPCWSTR property, LPCWSTR value )
+{
+ UINT r = msi_set_property( package->db, property, value );
+ if (r == ERROR_SUCCESS && !strcmpW( property, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+}
+
/* called from the Control Event subscription code */
void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
LPCWSTR attribute, MSIRECORD *rec )
@@ -634,14 +643,14 @@ void msi_dialog_handle_event( msi_dialog* dialog, LPCWSTR control,
else if ( !lstrcmpW(attribute, szProperty) )
{
MSIFEATURE *feature = msi_seltree_get_selected_feature( ctrl );
- MSI_SetPropertyW( dialog->package, ctrl->property, feature->Directory );
+ msi_dialog_set_property( dialog->package, ctrl->property, feature->Directory );
}
else if ( !lstrcmpW(attribute, szSelectionPath) )
{
LPWSTR prop = msi_dialog_dup_property( dialog, ctrl->property, TRUE );
LPWSTR path;
if (!prop) return;
- path = msi_dup_property( dialog->package, prop );
+ path = msi_dup_property( dialog->package->db, prop );
SetWindowTextW( ctrl->hwnd, path );
msi_free(prop);
msi_free(path);
@@ -884,7 +893,7 @@ static LPWSTR msi_get_checkbox_value( msi_dialog *dialog, LPCWSTR prop )
if (ret)
return ret;
- ret = msi_dup_property( dialog->package, prop );
+ ret = msi_dup_property( dialog->package->db, prop );
if( ret && !ret[0] )
{
msi_free( ret );
@@ -1222,10 +1231,167 @@ static UINT msi_dialog_icon_control( msi_dialog *dialog, MSIRECORD *rec )
return ERROR_SUCCESS;
}
+/******************** Combo Box ***************************************/
+
+struct msi_combobox_info
+{
+ msi_dialog *dialog;
+ HWND hwnd;
+ WNDPROC oldproc;
+ DWORD num_items;
+ DWORD addpos_items;
+ LPWSTR *items;
+};
+
+static LRESULT WINAPI MSIComboBox_WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+ struct msi_combobox_info *info;
+ LRESULT r;
+ DWORD j;
+
+ TRACE("%p %04x %08lx %08lx\n", hWnd, msg, wParam, lParam);
+
+ info = GetPropW( hWnd, szButtonData );
+ if (!info)
+ return 0;
+
+ r = CallWindowProcW( info->oldproc, hWnd, msg, wParam, lParam );
+
+ switch (msg)
+ {
+ case WM_NCDESTROY:
+ for (j = 0; j < info->num_items; j++)
+ msi_free( info->items[j] );
+ msi_free( info->items );
+ msi_free( info );
+ RemovePropW( hWnd, szButtonData );
+ break;
+ }
+
+ return r;
+}
+
+static UINT msi_combobox_add_item( MSIRECORD *rec, LPVOID param )
+{
+ struct msi_combobox_info *info = param;
+ LPCWSTR value, text;
+ int pos;
+
+ value = MSI_RecordGetString( rec, 3 );
+ text = MSI_RecordGetString( rec, 4 );
+
+ info->items[info->addpos_items] = strdupW( value );
+
+ pos = SendMessageW( info->hwnd, CB_ADDSTRING, 0, (LPARAM)text );
+ SendMessageW( info->hwnd, CB_SETITEMDATA, pos, (LPARAM)info->items[info->addpos_items] );
+ info->addpos_items++;
+
+ return ERROR_SUCCESS;
+}
+
+static UINT msi_combobox_add_items( struct msi_combobox_info *info, LPCWSTR property )
+{
+ UINT r;
+ MSIQUERY *view = NULL;
+ DWORD count;
+
+ static const WCHAR query[] = {
+ 'S','E','L','E','C','T',' ','*',' ',
+ 'F','R','O','M',' ','`','C','o','m','b','o','B','o','x','`',' ',
+ 'W','H','E','R','E',' ',
+ '`','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',' ',
+ 'O','R','D','E','R',' ','B','Y',' ','`','O','r','d','e','r','`',0
+ };
+
+ r = MSI_OpenQuery( info->dialog->package->db, &view, query, property );
+ if (r != ERROR_SUCCESS)
+ return r;
+
+ /* just get the number of records */
+ count = 0;
+ r = MSI_IterateRecords( view, &count, NULL, NULL );
+
+ info->num_items = count;
+ info->items = msi_alloc( sizeof(*info->items) * count );
+
+ r = MSI_IterateRecords( view, NULL, msi_combobox_add_item, info );
+ msiobj_release( &view->hdr );
+
+ return r;
+}
+
+static UINT msi_dialog_combobox_handler( msi_dialog *dialog,
+ msi_control *control, WPARAM param )
+{
+ struct msi_combobox_info *info;
+ int index;
+ LPWSTR value;
+
+ if (HIWORD(param) != CBN_SELCHANGE && HIWORD(param) != CBN_EDITCHANGE)
+ return ERROR_SUCCESS;
+
+ info = GetPropW( control->hwnd, szButtonData );
+ index = SendMessageW( control->hwnd, CB_GETCURSEL, 0, 0 );
+ if (index == CB_ERR)
+ value = msi_get_window_text( control->hwnd );
+ else
+ value = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, index, 0 );
+
+ msi_dialog_set_property( info->dialog->package, control->property, value );
+ msi_dialog_evaluate_control_conditions( info->dialog );
+
+ if (index == CB_ERR)
+ msi_free( value );
+
+ return ERROR_SUCCESS;
+}
+
+static void msi_dialog_combobox_update( msi_dialog *dialog,
+ msi_control *control )
+{
+ struct msi_combobox_info *info;
+ LPWSTR value, tmp;
+ DWORD j;
+
+ info = GetPropW( control->hwnd, szButtonData );
+
+ value = msi_dup_property( dialog->package->db, control->property );
+ if (!value)
+ {
+ SendMessageW( control->hwnd, CB_SETCURSEL, -1, 0 );
+ return;
+ }
+
+ for (j = 0; j < info->num_items; j++)
+ {
+ tmp = (LPWSTR) SendMessageW( control->hwnd, CB_GETITEMDATA, j, 0 );
+ if (!lstrcmpW( value, tmp ))
+ break;
+ }
+
+ if (j < info->num_items)
+ {
+ SendMessageW( control->hwnd, CB_SETCURSEL, j, 0 );
+ }
+ else
+ {
+ SendMessageW( control->hwnd, CB_SETCURSEL, -1, 0 );
+ SetWindowTextW( control->hwnd, value );
+ }
+
+ msi_free(value);
+}
+
static UINT msi_dialog_combo_control( msi_dialog *dialog, MSIRECORD *rec )
{
- static const WCHAR szCombo[] = { 'C','O','M','B','O','B','O','X',0 };
+ struct msi_combobox_info *info;
+ msi_control *control;
DWORD attributes, style;
+ LPCWSTR prop;
+
+ info = msi_alloc( sizeof *info );
+ if (!info)
+ return ERROR_FUNCTION_FAILED;
style = CBS_AUTOHSCROLL | WS_TABSTOP | WS_GROUP | WS_CHILD;
attributes = MSI_RecordGetInteger( rec, 8 );
@@ -1236,7 +1402,33 @@ static UINT msi_dialog_combo_control( msi_dialog *dialog, MSIRECORD *rec )
else
style |= CBS_DROPDOWN;
- msi_dialog_add_control( dialog, rec, szCombo, style );
+ control = msi_dialog_add_control( dialog, rec, WC_COMBOBOXW, style );
+ if (!control)
+ {
+ msi_free( info );
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ control->handler = msi_dialog_combobox_handler;
+ control->update = msi_dialog_combobox_update;
+
+ prop = MSI_RecordGetString( rec, 9 );
+ control->property = msi_dialog_dup_property( dialog, prop, FALSE );
+
+ /* subclass */
+ info->dialog = dialog;
+ info->hwnd = control->hwnd;
+ info->items = NULL;
+ info->addpos_items = 0;
+ info->oldproc = (WNDPROC)SetWindowLongPtrW( control->hwnd, GWLP_WNDPROC,
+ (LONG_PTR)MSIComboBox_WndProc );
+ SetPropW( control->hwnd, szButtonData, info );
+
+ if (control->property)
+ msi_combobox_add_items( info, control->property );
+
+ msi_dialog_combobox_update( dialog, control );
+
return ERROR_SUCCESS;
}
@@ -1276,7 +1468,7 @@ static UINT msi_dialog_edit_control( msi_dialog *dialog, MSIRECORD *rec )
if( prop )
control->property = strdupW( prop );
- val = msi_dup_property( dialog->package, control->property );
+ val = msi_dup_property( dialog->package->db, control->property );
SetWindowTextW( control->hwnd, val );
msi_free( val );
return ERROR_SUCCESS;
@@ -1352,10 +1544,9 @@ static void msi_mask_control_change( struct msi_maskedit_info *info )
if( i == info->num_groups )
{
- TRACE("Set property %s to %s\n",
- debugstr_w(info->prop), debugstr_w(val) );
+ TRACE("Set property %s to %s\n", debugstr_w(info->prop), debugstr_w(val));
CharUpperBuffW( val, info->num_chars );
- MSI_SetPropertyW( info->dialog->package, info->prop, val );
+ msi_dialog_set_property( info->dialog->package, info->prop, val );
msi_dialog_evaluate_control_conditions( info->dialog );
}
msi_free( val );
@@ -1587,7 +1778,7 @@ static UINT msi_dialog_maskedit_control( msi_dialog *dialog, MSIRECORD *rec )
if( prop )
{
- val = msi_dup_property( dialog->package, prop );
+ val = msi_dup_property( dialog->package->db, prop );
if( val )
{
msi_maskedit_set_text( info, val );
@@ -1705,7 +1896,7 @@ static BOOL msi_dialog_onkillfocus( msi_dialog *dialog, msi_control *control )
else
{
valid = TRUE;
- MSI_SetPropertyW( dialog->package, prop, buf );
+ msi_dialog_set_property( dialog->package, prop, buf );
}
msi_dialog_update_pathedit( dialog, control );
@@ -1855,7 +2046,7 @@ static UINT msi_dialog_radiogroup_control( msi_dialog *dialog, MSIRECORD *rec )
group.dialog = dialog;
group.parent = control;
group.attributes = MSI_RecordGetInteger( rec, 8 );
- group.propval = msi_dup_property( dialog->package, control->property );
+ group.propval = msi_dup_property( dialog->package->db, control->property );
r = MSI_IterateRecords( view, 0, msi_dialog_create_radiobutton, &group );
msiobj_release( &view->hdr );
@@ -2357,8 +2548,7 @@ static UINT msi_dialog_listbox_handler( msi_dialog *dialog,
index = SendMessageW( control->hwnd, LB_GETCURSEL, 0, 0 );
value = (LPCWSTR) SendMessageW( control->hwnd, LB_GETITEMDATA, index, 0 );
- MSI_SetPropertyW( info->dialog->package,
- control->property, value );
+ msi_dialog_set_property( info->dialog->package, control->property, value );
msi_dialog_evaluate_control_conditions( info->dialog );
return ERROR_SUCCESS;
@@ -2521,7 +2711,7 @@ UINT msi_dialog_directorylist_up( msi_dialog *dialog )
if (ptr != path) *(ptr - 1) = '\0';
PathAddBackslashW( path );
- MSI_SetPropertyW( dialog->package, prop, path );
+ msi_dialog_set_property( dialog->package, prop, path );
msi_dialog_update_directory_list( dialog, NULL );
msi_dialog_update_directory_combo( dialog, NULL );
@@ -2567,7 +2757,7 @@ static UINT msi_dialog_dirlist_handler( msi_dialog *dialog,
lstrcatW( new_path, text );
lstrcatW( new_path, szBackSlash );
- MSI_SetPropertyW( dialog->package, prop, new_path );
+ msi_dialog_set_property( dialog->package, prop, new_path );
msi_dialog_update_directory_list( dialog, NULL );
msi_dialog_update_directory_combo( dialog, NULL );
@@ -2810,7 +3000,7 @@ static UINT msi_dialog_volsel_handler( msi_dialog *dialog,
indirect = control->attributes & msidbControlAttributesIndirect;
prop = msi_dialog_dup_property( dialog, control->property, indirect );
- MSI_SetPropertyW( dialog->package, prop, text );
+ msi_dialog_set_property( dialog->package, prop, text );
msi_free( prop );
return ERROR_SUCCESS;
@@ -3078,8 +3268,8 @@ static void msi_dialog_adjust_dialog_pos( msi_dialog *dialog, MSIRECORD *rec, LP
sz.cx = msi_dialog_scale_unit( dialog, sz.cx );
sz.cy = msi_dialog_scale_unit( dialog, sz.cy );
- xres = msi_get_property_int( dialog->package, szScreenX, 0 );
- yres = msi_get_property_int( dialog->package, szScreenY, 0 );
+ xres = msi_get_property_int( dialog->package->db, szScreenX, 0 );
+ yres = msi_get_property_int( dialog->package->db, szScreenY, 0 );
center.x = MulDiv( center.x, xres, 100 );
center.y = MulDiv( center.y, yres, 100 );
@@ -3172,7 +3362,7 @@ static LRESULT msi_dialog_oncreate( HWND hwnd, LPCREATESTRUCTW cs )
dialog->attributes = MSI_RecordGetInteger( rec, 6 );
- dialog->default_font = msi_dup_property( dialog->package, df );
+ dialog->default_font = msi_dup_property( dialog->package->db, df );
if (!dialog->default_font)
{
dialog->default_font = strdupW(dfv);
@@ -3213,7 +3403,7 @@ static UINT msi_dialog_send_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR ar
return ERROR_SUCCESS;
}
-static UINT msi_dialog_set_property( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg )
+static UINT msi_dialog_set_property_event( msi_dialog *dialog, LPCWSTR event, LPCWSTR arg )
{
static const WCHAR szNullArg[] = { '{','}',0 };
LPWSTR p, prop, arg_fmt = NULL;
@@ -3228,7 +3418,7 @@ static UINT msi_dialog_set_property( msi_dialog *dialog, LPCWSTR event, LPCWSTR
*p = 0;
if( strcmpW( szNullArg, arg ) )
deformat_string( dialog->package, arg, &arg_fmt );
- MSI_SetPropertyW( dialog->package, prop, arg_fmt );
+ msi_dialog_set_property( dialog->package, prop, arg_fmt );
msi_dialog_update_controls( dialog, prop );
msi_free( arg_fmt );
}
@@ -3251,7 +3441,7 @@ static UINT msi_dialog_control_event( MSIRECORD *rec, LPVOID param )
event = MSI_RecordGetString( rec, 3 );
arg = MSI_RecordGetString( rec, 4 );
if( event[0] == '[' )
- msi_dialog_set_property( dialog, event, arg );
+ msi_dialog_set_property_event( dialog, event, arg );
else
msi_dialog_send_event( dialog, event, arg );
}
@@ -3366,7 +3556,7 @@ static UINT msi_dialog_get_checkbox_state( msi_dialog *dialog,
WCHAR state[2] = { 0 };
DWORD sz = 2;
- MSI_GetPropertyW( dialog->package, control->property, state, &sz );
+ msi_get_property( dialog->package->db, control->property, state, &sz );
return state[0] ? 1 : 0;
}
@@ -3379,7 +3569,7 @@ static void msi_dialog_set_checkbox_state( msi_dialog *dialog,
/* if uncheck then the property is set to NULL */
if (!state)
{
- MSI_SetPropertyW( dialog->package, control->property, NULL );
+ msi_dialog_set_property( dialog->package, control->property, NULL );
return;
}
@@ -3389,7 +3579,7 @@ static void msi_dialog_set_checkbox_state( msi_dialog *dialog,
else
val = szState;
- MSI_SetPropertyW( dialog->package, control->property, val );
+ msi_dialog_set_property( dialog->package, control->property, val );
}
static void msi_dialog_checkbox_sync_state( msi_dialog *dialog,
@@ -3433,8 +3623,7 @@ static UINT msi_dialog_edit_handler( msi_dialog *dialog,
debugstr_w(control->property));
buf = msi_get_window_text( control->hwnd );
- MSI_SetPropertyW( dialog->package, control->property, buf );
-
+ msi_dialog_set_property( dialog->package, control->property, buf );
msi_free( buf );
return ERROR_SUCCESS;
@@ -3449,7 +3638,7 @@ static UINT msi_dialog_radiogroup_handler( msi_dialog *dialog,
TRACE("clicked radio button %s, set %s\n", debugstr_w(control->name),
debugstr_w(control->property));
- MSI_SetPropertyW( dialog->package, control->property, control->name );
+ msi_dialog_set_property( dialog->package, control->property, control->name );
return msi_dialog_button_handler( dialog, control, param );
}
@@ -3835,7 +4024,7 @@ static UINT error_dialog_handler(MSIPACKAGE *package, LPCWSTR event,
if ( !lstrcmpW( argument, error_abort ) || !lstrcmpW( argument, error_cancel ) ||
!lstrcmpW( argument, error_no ) )
{
- MSI_SetPropertyW( package, result_prop, error_abort );
+ msi_set_property( package->db, result_prop, error_abort );
}
ControlEvent_CleanupSubscriptions(package);
@@ -3878,12 +4067,12 @@ UINT msi_spawn_error_dialog( MSIPACKAGE *package, LPWSTR error_dialog, LPWSTR er
'M','S','I','E','r','r','o','r','D','i','a','l','o','g','R','e','s','u','l','t',0
};
- if ( (msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) == INSTALLUILEVEL_NONE )
+ if ( (msi_get_property_int( package->db, szUILevel, 0 ) & INSTALLUILEVEL_MASK) == INSTALLUILEVEL_NONE )
return ERROR_SUCCESS;
if ( !error_dialog )
{
- LPWSTR product_name = msi_dup_property( package, pn_prop );
+ LPWSTR product_name = msi_dup_property( package->db, pn_prop );
WCHAR title[MAX_PATH];
sprintfW( title, title_fmt, product_name );
@@ -3911,7 +4100,7 @@ UINT msi_spawn_error_dialog( MSIPACKAGE *package, LPWSTR error_dialog, LPWSTR er
if ( r != ERROR_SUCCESS )
goto done;
- r = MSI_GetPropertyW( package, result_prop, result, &size );
+ r = msi_get_property( package->db, result_prop, result, &size );
if ( r != ERROR_SUCCESS)
r = ERROR_SUCCESS;
diff --git a/dll/win32/msi/events.c b/dll/win32/msi/events.c
index e8f22975594..4ed395bbc59 100644
--- a/dll/win32/msi/events.c
+++ b/dll/win32/msi/events.c
@@ -226,7 +226,7 @@ static UINT ControlEvent_AddSource(MSIPACKAGE* package, LPCWSTR argument,
static UINT ControlEvent_SetTargetPath(MSIPACKAGE* package, LPCWSTR argument,
msi_dialog* dialog)
{
- LPWSTR path = msi_dup_property( package, argument );
+ LPWSTR path = msi_dup_property( package->db, argument );
MSIRECORD *rec = MSI_CreateRecord( 1 );
UINT r;
@@ -380,7 +380,13 @@ static UINT ControlEvent_DirectoryListUp(MSIPACKAGE *package, LPCWSTR argument,
static UINT ControlEvent_ReinstallMode(MSIPACKAGE *package, LPCWSTR argument,
msi_dialog *dialog)
{
- return MSI_SetPropertyW( package, szReinstallMode, argument );
+ return msi_set_property( package->db, szReinstallMode, argument );
+}
+
+static UINT ControlEvent_Reinstall( MSIPACKAGE *package, LPCWSTR argument,
+ msi_dialog *dialog )
+{
+ return msi_set_property( package->db, szReinstall, argument );
}
static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument,
@@ -389,13 +395,13 @@ static UINT ControlEvent_ValidateProductID(MSIPACKAGE *package, LPCWSTR argument
LPWSTR key, template;
UINT ret = ERROR_SUCCESS;
- template = msi_dup_property( package, szPIDTemplate );
- key = msi_dup_property( package, szPIDKEY );
+ template = msi_dup_property( package->db, szPIDTemplate );
+ key = msi_dup_property( package->db, szPIDKEY );
if (key && template)
{
FIXME( "partial stub: template %s key %s\n", debugstr_w(template), debugstr_w(key) );
- ret = MSI_SetPropertyW( package, szProductID, key );
+ ret = msi_set_property( package->db, szProductID, key );
}
msi_free( template );
msi_free( key );
@@ -417,6 +423,7 @@ static const struct _events Events[] = {
{ "DirectoryListUp",ControlEvent_DirectoryListUp },
{ "SelectionBrowse",ControlEvent_SpawnDialog },
{ "ReinstallMode",ControlEvent_ReinstallMode },
+ { "Reinstall",ControlEvent_Reinstall },
{ "ValidateProductID",ControlEvent_ValidateProductID },
{ NULL,NULL },
};
diff --git a/dll/win32/msi/files.c b/dll/win32/msi/files.c
index 40501636af2..052a1588e2e 100644
--- a/dll/win32/msi/files.c
+++ b/dll/win32/msi/files.c
@@ -98,6 +98,8 @@ static void schedule_install_files(MSIPACKAGE *package)
ui_progress(package,2,file->FileSize,0,0);
file->state = msifs_skipped;
}
+ else
+ file->Component->Action = INSTALLSTATE_LOCAL;
}
}
@@ -119,8 +121,7 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
{
UINT gle;
- TRACE("Copying %s to %s\n", debugstr_w(source),
- debugstr_w(file->TargetPath));
+ TRACE("Copying %s to %s\n", debugstr_w(source), debugstr_w(file->TargetPath));
gle = copy_file(file, source);
if (gle == ERROR_SUCCESS)
@@ -147,7 +148,7 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
GetTempFileNameW(szBackSlash, szMsi, 0, tmpfileW);
len = strlenW(file->TargetPath) + strlenW(tmpfileW) + 1;
- if (!(pathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
+ if (!(pathW = msi_alloc(len * sizeof(WCHAR))))
return ERROR_OUTOFMEMORY;
strcpyW(pathW, file->TargetPath);
@@ -167,32 +168,17 @@ static UINT copy_install_file(MSIPACKAGE *package, MSIFILE *file, LPWSTR source)
gle = GetLastError();
WARN("failed to schedule rename operation: %d)\n", gle);
}
- HeapFree(GetProcessHeap(), 0, pathW);
+ msi_free(pathW);
}
return gle;
}
-static BOOL check_dest_hash_matches(MSIFILE *file)
-{
- MSIFILEHASHINFO hash;
- UINT r;
-
- if (!file->hash.dwFileHashInfoSize)
- return FALSE;
-
- hash.dwFileHashInfoSize = sizeof(MSIFILEHASHINFO);
- r = MsiGetFileHashW(file->TargetPath, 0, &hash);
- if (r != ERROR_SUCCESS)
- return FALSE;
-
- return !memcmp(&hash, &file->hash, sizeof(MSIFILEHASHINFO));
-}
-
static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action,
LPWSTR *path, DWORD *attrs, PVOID user)
{
static MSIFILE *f = NULL;
+ MSIMEDIAINFO *mi = user;
if (action == MSICABEXTRACT_BEGINEXTRACT)
{
@@ -203,11 +189,8 @@ static BOOL installfiles_cb(MSIPACKAGE *package, LPCWSTR file, DWORD action,
return FALSE;
}
- if (f->state != msifs_missing && f->state != msifs_overwrite)
- {
- TRACE("Skipping extraction of %s\n", debugstr_w(file));
+ if (f->disk_id != mi->disk_id || (f->state != msifs_missing && f->state != msifs_overwrite))
return FALSE;
- }
msi_file_update_ui(package, f, szInstallFiles);
@@ -256,19 +239,6 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
if (file->state != msifs_missing && !mi->is_continuous && file->state != msifs_overwrite)
continue;
- if (check_dest_hash_matches(file))
- {
- TRACE("File hashes match, not overwriting\n");
- continue;
- }
-
- if (MsiGetFileVersionW(file->TargetPath, NULL, NULL, NULL, NULL) == ERROR_SUCCESS &&
- msi_compare_file_version(file) >= 0)
- {
- TRACE("Destination file version greater, not overwriting\n");
- continue;
- }
-
if (file->Sequence > mi->last_sequence || mi->is_continuous ||
(file->IsCompressed && !mi->is_extracted))
{
@@ -277,20 +247,20 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
rc = ready_media(package, file, mi);
if (rc != ERROR_SUCCESS)
{
- ERR("Failed to ready media\n");
+ ERR("Failed to ready media for %s\n", debugstr_w(file->File));
break;
}
data.mi = mi;
data.package = package;
data.cb = installfiles_cb;
- data.user = NULL;
+ data.user = mi;
if (file->IsCompressed &&
!msi_cabextract(package, mi, &data))
{
ERR("Failed to extract cabinet: %s\n", debugstr_w(mi->cabinet));
- rc = ERROR_FUNCTION_FAILED;
+ rc = ERROR_INSTALL_FAILURE;
break;
}
}
@@ -317,8 +287,7 @@ UINT ACTION_InstallFiles(MSIPACKAGE *package)
}
else if (file->state != msifs_installed)
{
- ERR("compressed file wasn't extracted (%s)\n",
- debugstr_w(file->TargetPath));
+ ERR("compressed file wasn't installed (%s)\n", debugstr_w(file->TargetPath));
rc = ERROR_INSTALL_FAILURE;
break;
}
@@ -555,11 +524,11 @@ static UINT ITERATE_MoveFiles( MSIRECORD *rec, LPVOID param )
sourcename = MSI_RecordGetString(rec, 3);
options = MSI_RecordGetInteger(rec, 7);
- sourcedir = msi_dup_property(package, MSI_RecordGetString(rec, 5));
+ sourcedir = msi_dup_property(package->db, MSI_RecordGetString(rec, 5));
if (!sourcedir)
goto done;
- destdir = msi_dup_property(package, MSI_RecordGetString(rec, 6));
+ destdir = msi_dup_property(package->db, MSI_RecordGetString(rec, 6));
if (!destdir)
goto done;
@@ -704,7 +673,7 @@ static WCHAR *get_duplicate_filename( MSIPACKAGE *package, MSIRECORD *row, const
if (!dst_path)
{
/* try a property */
- dst_path = msi_dup_property( package, dst_key );
+ dst_path = msi_dup_property( package->db, dst_key );
if (!dst_path)
{
FIXME("Unable to get destination folder, try AppSearch properties\n");
@@ -917,7 +886,7 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
UINT install_mode;
LPWSTR dir = NULL, path = NULL;
DWORD size;
- UINT r;
+ UINT ret = ERROR_SUCCESS;
component = MSI_RecordGetString(row, 2);
filename = MSI_RecordGetString(row, 3);
@@ -938,7 +907,7 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
return ERROR_SUCCESS;
}
- dir = msi_dup_property(package, dirprop);
+ dir = msi_dup_property(package->db, dirprop);
if (!dir)
return ERROR_OUTOFMEMORY;
@@ -947,7 +916,7 @@ static UINT ITERATE_RemoveFiles(MSIRECORD *row, LPVOID param)
path = msi_alloc(size * sizeof(WCHAR));
if (!path)
{
- r = ERROR_OUTOFMEMORY;
+ ret = ERROR_OUTOFMEMORY;
goto done;
}
@@ -975,7 +944,7 @@ done:
msi_free(path);
msi_free(dir);
- return ERROR_SUCCESS;
+ return ret;
}
UINT ACTION_RemoveFiles( MSIPACKAGE *package )
diff --git a/dll/win32/msi/font.c b/dll/win32/msi/font.c
index 1b2c3c729dd..1d99a4c0d3a 100644
--- a/dll/win32/msi/font.c
+++ b/dll/win32/msi/font.c
@@ -64,11 +64,6 @@ typedef struct _tagTT_NAME_RECORD {
#define SWAPWORD(x) MAKEWORD(HIBYTE(x), LOBYTE(x))
#define SWAPLONG(x) MAKELONG(SWAPWORD(HIWORD(x)), SWAPWORD(LOWORD(x)))
-static const WCHAR szRegisterFonts[] =
- {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
-static const WCHAR szUnregisterFonts[] =
- {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
-
static const WCHAR regfont1[] =
{'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
diff --git a/dll/win32/msi/format.c b/dll/win32/msi/format.c
index f59024abf86..c4ff30f4111 100644
--- a/dll/win32/msi/format.c
+++ b/dll/win32/msi/format.c
@@ -175,7 +175,7 @@ static LPWSTR deformat_property(FORMAT *format, FORMSTR *str)
val = msi_alloc((str->len + 1) * sizeof(WCHAR));
lstrcpynW(val, get_formstr_data(format, str), str->len + 1);
- ret = msi_dup_property(format->package, val);
+ ret = msi_dup_property(format->package->db, val);
msi_free(val);
return ret;
@@ -805,12 +805,12 @@ static DWORD deformat_string_internal(MSIPACKAGE *package, LPCWSTR ptr,
format.deformatted = *data;
format.len = *len;
- stack = create_stack();
- temp = create_stack();
-
if (!verify_format(*data))
return ERROR_SUCCESS;
+ stack = create_stack();
+ temp = create_stack();
+
while ((type = format_lex(&format, &str)) != FORMAT_NULL)
{
if (type == FORMAT_LBRACK || type == FORMAT_LBRACE ||
diff --git a/dll/win32/msi/helpers.c b/dll/win32/msi/helpers.c
index c45ba236d50..54d21994a6d 100644
--- a/dll/win32/msi/helpers.c
+++ b/dll/win32/msi/helpers.c
@@ -47,7 +47,7 @@ LPWSTR build_icon_path(MSIPACKAGE *package, LPCWSTR icon_name )
static const WCHAR szFolder[] =
{'A','p','p','D','a','t','a','F','o','l','d','e','r',0};
- SystemFolder = msi_dup_property( package, szFolder );
+ SystemFolder = msi_dup_property( package->db, szFolder );
dest = build_directory_name(3, SystemFolder, szInstaller, package->ProductCode);
@@ -160,11 +160,11 @@ static LPWSTR get_source_root( MSIPACKAGE *package )
{
LPWSTR path, p;
- path = msi_dup_property( package, cszSourceDir );
+ path = msi_dup_property( package->db, cszSourceDir );
if (path)
return path;
- path = msi_dup_property( package, cszDatabase );
+ path = msi_dup_property( package->db, cszDatabase );
if (path)
{
p = strrchrW(path,'\\');
@@ -265,19 +265,19 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
if (!f->ResolvedTarget && !f->Property)
{
LPWSTR check_path;
- check_path = msi_dup_property( package, cszTargetDir );
+ check_path = msi_dup_property( package->db, cszTargetDir );
if (!check_path)
{
- check_path = msi_dup_property( package, cszRootDrive );
+ check_path = msi_dup_property( package->db, cszRootDrive );
if (set_prop)
- MSI_SetPropertyW(package,cszTargetDir,check_path);
+ msi_set_property( package->db, cszTargetDir, check_path );
}
/* correct misbuilt target dir */
path = build_directory_name(2, check_path, NULL);
clean_spaces_from_path( path );
if (strcmpiW(path,check_path)!=0)
- MSI_SetPropertyW(package,cszTargetDir,path);
+ msi_set_property( package->db, cszTargetDir, path );
msi_free(check_path);
f->ResolvedTarget = path;
@@ -310,11 +310,11 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
TRACE(" internally set to %s\n",debugstr_w(path));
if (set_prop)
- MSI_SetPropertyW( package, name, path );
+ msi_set_property( package->db, name, path );
return path;
}
- if (!source && load_prop && (path = msi_dup_property( package, name )))
+ if (!source && load_prop && (path = msi_dup_property( package->db, name )))
{
f->ResolvedTarget = strdupW( path );
TRACE(" property set to %s\n", debugstr_w(path));
@@ -338,7 +338,7 @@ LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
f->ResolvedTarget = strdupW( path );
TRACE("target -> %s\n", debugstr_w(path));
if (set_prop)
- MSI_SetPropertyW(package,name,path);
+ msi_set_property( package->db, name, path );
}
else
{
diff --git a/dll/win32/msi/install.c b/dll/win32/msi/install.c
index c23075d61d3..fda49b90d8d 100644
--- a/dll/win32/msi/install.c
+++ b/dll/win32/msi/install.c
@@ -709,7 +709,7 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
break;
case MSIRUNMODE_MAINTENANCE:
- r = msi_get_property_int( package, szInstalled, 0 ) != 0;
+ r = msi_get_property_int( package->db, szInstalled, 0 ) != 0;
break;
case MSIRUNMODE_REBOOTATEND:
@@ -721,6 +721,7 @@ BOOL WINAPI MsiGetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode)
r = TRUE;
}
+ msiobj_release( &package->hdr );
return r;
}
@@ -774,6 +775,7 @@ UINT WINAPI MsiSetMode(MSIHANDLE hInstall, MSIRUNMODE iRunMode, BOOL fState)
r = ERROR_ACCESS_DENIED;
}
+ msiobj_release( &package->hdr );
return r;
}
@@ -1262,7 +1264,7 @@ LANGID WINAPI MsiGetLanguage(MSIHANDLE hInstall)
return 0;
}
- langid = msi_get_property_int( package, szProductLanguage, 0 );
+ langid = msi_get_property_int( package->db, szProductLanguage, 0 );
msiobj_release( &package->hdr );
return langid;
}
@@ -1284,7 +1286,7 @@ UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel )
return MSI_SetFeatureStates( package );
sprintfW( level, fmt, iInstallLevel );
- r = MSI_SetPropertyW( package, szInstallLevel, level );
+ r = msi_set_property( package->db, szInstallLevel, level );
if ( r == ERROR_SUCCESS )
r = MSI_SetFeatureStates( package );
diff --git a/dll/win32/msi/media.c b/dll/win32/msi/media.c
index 0a6c4314fbc..49bc199cc36 100644
--- a/dll/win32/msi/media.c
+++ b/dll/win32/msi/media.c
@@ -20,6 +20,8 @@
#include
+#define COBJMACROS
+
#include "windef.h"
#include "winerror.h"
#include "wine/debug.h"
@@ -28,6 +30,7 @@
#include "winuser.h"
#include "winreg.h"
#include "shlwapi.h"
+#include "objidl.h"
#include "wine/unicode.h"
WINE_DEFAULT_DEBUG_CHANNEL(msi);
@@ -76,13 +79,13 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
static const WCHAR error_prop[] = {'E','r','r','o','r','D','i','a','l','o','g',0};
- if ((msi_get_property_int(package, szUILevel, 0) & INSTALLUILEVEL_MASK) ==
+ if ((msi_get_property_int(package->db, szUILevel, 0) & INSTALLUILEVEL_MASK) ==
INSTALLUILEVEL_NONE && !gUIHandlerA && !gUIHandlerW && !gUIHandlerRecord)
return ERROR_SUCCESS;
error = generate_error_string(package, 1302, 1, mi->disk_prompt);
- error_dialog = msi_dup_property(package, error_prop);
- source_dir = msi_dup_property(package, cszSourceDir);
+ error_dialog = msi_dup_property(package->db, error_prop);
+ source_dir = msi_dup_property(package->db, cszSourceDir);
while (r == ERROR_SUCCESS && !source_matches_volume(mi, source_dir))
{
@@ -114,49 +117,6 @@ static UINT msi_change_media(MSIPACKAGE *package, MSIMEDIAINFO *mi)
return r;
}
-static UINT writeout_cabinet_stream(MSIPACKAGE *package, LPCWSTR stream,
- WCHAR* source)
-{
- UINT rc;
- USHORT* data;
- UINT size;
- DWORD write;
- HANDLE hfile;
- WCHAR tmp[MAX_PATH];
-
- static const WCHAR cszTempFolder[]= {
- 'T','e','m','p','F','o','l','d','e','r',0};
-
- rc = read_raw_stream_data(package->db, stream, &data, &size);
- if (rc != ERROR_SUCCESS)
- return rc;
-
- write = MAX_PATH;
- if (MSI_GetPropertyW(package, cszTempFolder, tmp, &write))
- GetTempPathW(MAX_PATH, tmp);
-
- GetTempFileNameW(tmp, stream, 0, source);
-
- track_tempfile(package, source);
- hfile = CreateFileW(source, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL, NULL);
-
- if (hfile == INVALID_HANDLE_VALUE)
- {
- ERR("Unable to create file %s\n", debugstr_w(source));
- rc = ERROR_FUNCTION_FAILED;
- goto end;
- }
-
- WriteFile(hfile, data, size, &write, NULL);
- CloseHandle(hfile);
- TRACE("wrote %i bytes to %s\n", write, debugstr_w(source));
-
-end:
- msi_free(data);
- return rc;
-}
-
static void * CDECL cabinet_alloc(ULONG cb)
{
return msi_alloc(cb);
@@ -238,10 +198,72 @@ static LONG CDECL cabinet_seek(INT_PTR hf, LONG dist, int seektype)
return SetFilePointer(handle, dist, NULL, seektype);
}
+struct cab_stream
+{
+ MSIDATABASE *db;
+ WCHAR *name;
+};
+
+static struct cab_stream cab_stream;
+
+static INT_PTR CDECL cabinet_open_stream( char *pszFile, int oflag, int pmode )
+{
+ UINT r;
+ IStream *stm;
+
+ if (oflag)
+ WARN("ignoring open flags 0x%08x\n", oflag);
+
+ r = db_get_raw_stream( cab_stream.db, cab_stream.name, &stm );
+ if (r != ERROR_SUCCESS)
+ {
+ WARN("Failed to get cabinet stream %u\n", r);
+ return 0;
+ }
+
+ return (INT_PTR)stm;
+}
+
+static UINT CDECL cabinet_read_stream( INT_PTR hf, void *pv, UINT cb )
+{
+ IStream *stm = (IStream *)hf;
+ DWORD read;
+ HRESULT hr;
+
+ hr = IStream_Read( stm, pv, cb, &read );
+ if (hr == S_OK || hr == S_FALSE)
+ return read;
+
+ return 0;
+}
+
+static int CDECL cabinet_close_stream( INT_PTR hf )
+{
+ IStream *stm = (IStream *)hf;
+ IStream_Release( stm );
+ return 0;
+}
+
+static LONG CDECL cabinet_seek_stream( INT_PTR hf, LONG dist, int seektype )
+{
+ IStream *stm = (IStream *)hf;
+ LARGE_INTEGER move;
+ ULARGE_INTEGER newpos;
+ HRESULT hr;
+
+ move.QuadPart = dist;
+ hr = IStream_Seek( stm, move, seektype, &newpos );
+ if (SUCCEEDED(hr))
+ {
+ if (newpos.QuadPart <= MAXLONG) return newpos.QuadPart;
+ ERR("Too big!\n");
+ }
+ return -1;
+}
+
static UINT CDECL msi_media_get_disk_info(MSIPACKAGE *package, MSIMEDIAINFO *mi)
{
MSIRECORD *row;
- LPWSTR ptr;
static const WCHAR query[] = {
'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@@ -262,10 +284,7 @@ static UINT CDECL msi_media_get_disk_info(MSIPACKAGE *package, MSIMEDIAINFO *mi)
if (!mi->first_volume)
mi->first_volume = strdupW(mi->volume_label);
- ptr = strrchrW(mi->source, '\\') + 1;
- lstrcpyW(ptr, mi->cabinet);
msiobj_release(&row->hdr);
-
return ERROR_SUCCESS;
}
@@ -277,12 +296,24 @@ static INT_PTR cabinet_partial_file(FDINOTIFICATIONTYPE fdint,
return 0;
}
+static WCHAR *get_cabinet_filename(MSIMEDIAINFO *mi)
+{
+ int len;
+ WCHAR *ret;
+
+ len = strlenW(mi->sourcedir) + strlenW(mi->cabinet) + 1;
+ if (!(ret = msi_alloc(len * sizeof(WCHAR)))) return NULL;
+ strcpyW(ret, mi->sourcedir);
+ strcatW(ret, mi->cabinet);
+ return ret;
+}
+
static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
PFDINOTIFICATION pfdin)
{
MSICABDATA *data = pfdin->pv;
MSIMEDIAINFO *mi = data->mi;
- LPWSTR cab = strdupAtoW(pfdin->psz1);
+ LPWSTR cabinet_file = NULL, cab = strdupAtoW(pfdin->psz1);
INT_PTR res = -1;
UINT rc;
@@ -309,10 +340,13 @@ static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
goto done;
}
- TRACE("Searching for %s\n", debugstr_w(mi->source));
+ if (!(cabinet_file = get_cabinet_filename(mi)))
+ goto done;
+
+ TRACE("Searching for %s\n", debugstr_w(cabinet_file));
res = 0;
- if (GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+ if (GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES)
{
if (msi_change_media(data->package, mi) != ERROR_SUCCESS)
res = -1;
@@ -320,6 +354,7 @@ static INT_PTR cabinet_next_cabinet(FDINOTIFICATIONTYPE fdint,
done:
msi_free(cab);
+ msi_free(cabinet_file);
return res;
}
@@ -376,7 +411,7 @@ static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint,
GetTempFileNameW(szBackSlash, szMsi, 0, tmpfileW);
len = strlenW(path) + strlenW(tmpfileW) + 1;
- if (!(tmppathW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR))))
+ if (!(tmppathW = msi_alloc(len * sizeof(WCHAR))))
return ERROR_OUTOFMEMORY;
strcpyW(tmppathW, path);
@@ -394,7 +429,7 @@ static INT_PTR cabinet_copy_file(FDINOTIFICATIONTYPE fdint,
else
WARN("failed to schedule rename operation %s (error %d)\n", debugstr_w(path), GetLastError());
- HeapFree(GetProcessHeap(), 0, tmppathW);
+ msi_free(tmppathW);
}
else
WARN("failed to create %s (error %d)\n", debugstr_w(path), err);
@@ -436,8 +471,6 @@ static INT_PTR cabinet_close_file_info(FDINOTIFICATIONTYPE fdint,
static INT_PTR CDECL cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin)
{
- TRACE("(%d)\n", fdint);
-
switch (fdint)
{
case fdintPARTIAL_FILE:
@@ -457,48 +490,58 @@ static INT_PTR CDECL cabinet_notify(FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION
}
}
-/***********************************************************************
- * msi_cabextract
- *
- * Extract files from a cab file.
- */
-BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data)
+static INT_PTR CDECL cabinet_notify_stream( FDINOTIFICATIONTYPE fdint, PFDINOTIFICATION pfdin )
+{
+ switch (fdint)
+ {
+ case fdintCOPY_FILE:
+ return cabinet_copy_file( fdint, pfdin );
+
+ case fdintCLOSE_FILE_INFO:
+ return cabinet_close_file_info( fdint, pfdin );
+
+ case fdintCABINET_INFO:
+ return 0;
+
+ default:
+ ERR("Unexpected notification %d\n", fdint);
+ return 0;
+ }
+}
+
+static BOOL extract_cabinet( MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data )
{
LPSTR cabinet, cab_path = NULL;
- LPWSTR ptr;
HFDI hfdi;
ERF erf;
BOOL ret = FALSE;
- TRACE("Extracting %s\n", debugstr_w(mi->source));
+ TRACE("Extracting %s\n", debugstr_w(mi->cabinet));
- hfdi = FDICreate(cabinet_alloc, cabinet_free, cabinet_open, cabinet_read,
- cabinet_write, cabinet_close, cabinet_seek, 0, &erf);
+ hfdi = FDICreate( cabinet_alloc, cabinet_free, cabinet_open, cabinet_read,
+ cabinet_write, cabinet_close, cabinet_seek, 0, &erf );
if (!hfdi)
{
ERR("FDICreate failed\n");
return FALSE;
}
- ptr = strrchrW(mi->source, '\\') + 1;
- cabinet = strdupWtoA(ptr);
+ cabinet = strdupWtoA( mi->cabinet );
if (!cabinet)
goto done;
- cab_path = strdupWtoA(mi->source);
+ cab_path = strdupWtoA( mi->sourcedir );
if (!cab_path)
goto done;
- cab_path[ptr - mi->source] = '\0';
-
- ret = FDICopy(hfdi, cabinet, cab_path, 0, cabinet_notify, NULL, data);
+ ret = FDICopy( hfdi, cabinet, cab_path, 0, cabinet_notify, NULL, data );
if (!ret)
ERR("FDICopy failed\n");
done:
- FDIDestroy(hfdi);
- msi_free(cabinet);
- msi_free(cab_path);
+ FDIDestroy( hfdi );
+ msi_free(cabinet );
+ msi_free( cab_path );
if (ret)
mi->is_extracted = TRUE;
@@ -506,6 +549,56 @@ done:
return ret;
}
+static BOOL extract_cabinet_stream( MSIPACKAGE *package, MSIMEDIAINFO *mi, LPVOID data )
+{
+ static char filename[] = {'<','S','T','R','E','A','M','>',0};
+ HFDI hfdi;
+ ERF erf;
+ BOOL ret = FALSE;
+
+ TRACE("Extracting %s\n", debugstr_w(mi->cabinet));
+
+ hfdi = FDICreate( cabinet_alloc, cabinet_free, cabinet_open_stream, cabinet_read_stream,
+ cabinet_write, cabinet_close_stream, cabinet_seek_stream, 0, &erf );
+ if (!hfdi)
+ {
+ ERR("FDICreate failed\n");
+ return FALSE;
+ }
+
+ cab_stream.db = package->db;
+ cab_stream.name = encode_streamname( FALSE, mi->cabinet + 1 );
+ if (!cab_stream.name)
+ goto done;
+
+ ret = FDICopy( hfdi, filename, NULL, 0, cabinet_notify_stream, NULL, data );
+ if (!ret)
+ ERR("FDICopy failed\n");
+
+done:
+ FDIDestroy( hfdi );
+ msi_free( cab_stream.name );
+
+ if (ret)
+ mi->is_extracted = TRUE;
+
+ return ret;
+}
+
+/***********************************************************************
+ * msi_cabextract
+ *
+ * Extract files from a cabinet file or stream.
+ */
+BOOL msi_cabextract(MSIPACKAGE* package, MSIMEDIAINFO *mi, LPVOID data)
+{
+ if (mi->cabinet[0] == '#')
+ {
+ return extract_cabinet_stream( package, mi, data );
+ }
+ return extract_cabinet( package, mi, data );
+}
+
void msi_free_media_info(MSIMEDIAINFO *mi)
{
msi_free(mi->disk_prompt);
@@ -532,7 +625,6 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
LPWSTR source_dir;
LPWSTR source;
DWORD options;
- UINT r;
static const WCHAR query[] = {
'S','E','L','E','C','T',' ','*',' ', 'F','R','O','M',' ',
@@ -563,25 +655,10 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
if (!mi->first_volume)
mi->first_volume = strdupW(mi->volume_label);
- source_dir = msi_dup_property(package, cszSourceDir);
- lstrcpyW(mi->source, source_dir);
+ source_dir = msi_dup_property(package->db, cszSourceDir);
+ lstrcpyW(mi->sourcedir, source_dir);
mi->type = get_drive_type(source_dir);
- if (file->IsCompressed && mi->cabinet)
- {
- if (mi->cabinet[0] == '#')
- {
- r = writeout_cabinet_stream(package, &mi->cabinet[1], mi->source);
- if (r != ERROR_SUCCESS)
- {
- ERR("Failed to extract cabinet stream\n");
- return ERROR_FUNCTION_FAILED;
- }
- }
- else
- lstrcatW(mi->source, mi->cabinet);
- }
-
options = MSICODE_PRODUCT;
if (mi->type == DRIVE_CDROM || mi->type == DRIVE_REMOVABLE)
{
@@ -595,7 +672,7 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
}
else
{
- source = mi->source;
+ source = mi->sourcedir;
options |= MSISOURCETYPE_NETWORK;
}
@@ -610,7 +687,7 @@ static UINT msi_load_media_info(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO
return ERROR_SUCCESS;
}
-/* FIXME: search NETWORK and URL sources as well */
+/* FIXME: search URL sources as well */
static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
{
WCHAR source[MAX_PATH];
@@ -618,8 +695,16 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
WCHAR prompt[MAX_PATH];
DWORD volumesz, promptsz;
DWORD index, size, id;
+ WCHAR last_type[2];
UINT r;
+ size = 2;
+ r = MsiSourceListGetInfoW(package->ProductCode, NULL,
+ package->Context, MSICODE_PRODUCT,
+ INSTALLPROPERTY_LASTUSEDTYPEW, last_type, &size);
+ if (r != ERROR_SUCCESS)
+ return r;
+
size = MAX_PATH;
r = MsiSourceListGetInfoW(package->ProductCode, NULL,
package->Context, MSICODE_PRODUCT,
@@ -627,6 +712,26 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
if (r != ERROR_SUCCESS)
return r;
+ index = 0;
+ volumesz = MAX_PATH;
+ promptsz = MAX_PATH;
+
+ if (last_type[0] == 'n')
+ {
+ while (MsiSourceListEnumSourcesW(package->ProductCode, NULL,
+ package->Context,
+ MSISOURCETYPE_NETWORK, index++,
+ volume, &volumesz) == ERROR_SUCCESS)
+ {
+ if (!strncmpiW(source, volume, strlenW(source)))
+ {
+ lstrcpyW(mi->sourcedir, source);
+ TRACE("Found network source %s\n", debugstr_w(mi->sourcedir));
+ return ERROR_SUCCESS;
+ }
+ }
+ }
+
index = 0;
volumesz = MAX_PATH;
promptsz = MAX_PATH;
@@ -644,7 +749,8 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
if (source_matches_volume(mi, source))
{
/* FIXME: what about SourceDir */
- lstrcpyW(mi->source, source);
+ lstrcpyW(mi->sourcedir, source);
+ TRACE("Found disk source %s\n", debugstr_w(mi->sourcedir));
return ERROR_SUCCESS;
}
}
@@ -655,6 +761,7 @@ static UINT find_published_source(MSIPACKAGE *package, MSIMEDIAINFO *mi)
UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
{
UINT rc = ERROR_SUCCESS;
+ WCHAR *cabinet_file;
/* media info for continuous cabinet is already loaded */
if (mi->is_continuous)
@@ -663,7 +770,7 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
rc = msi_load_media_info(package, file, mi);
if (rc != ERROR_SUCCESS)
{
- ERR("Unable to load media info\n");
+ ERR("Unable to load media info %u\n", rc);
return ERROR_FUNCTION_FAILED;
}
@@ -671,15 +778,24 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
if (!mi->cabinet || mi->cabinet[0] == '#')
return ERROR_SUCCESS;
+ cabinet_file = get_cabinet_filename(mi);
+
/* package should be downloaded */
if (file->IsCompressed &&
- GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES &&
+ GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES &&
package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
{
- WCHAR temppath[MAX_PATH];
+ WCHAR temppath[MAX_PATH], *p;
- msi_download_file(mi->source, temppath);
- lstrcpyW(mi->source, temppath);
+ msi_download_file(cabinet_file, temppath);
+ if ((p = strrchrW(temppath, '\\'))) *p = 0;
+
+ msi_free(mi->sourcedir);
+ strcpyW(mi->sourcedir, temppath);
+ msi_free(mi->cabinet);
+ strcpyW(mi->cabinet, p + 1);
+
+ msi_free(cabinet_file);
return ERROR_SUCCESS;
}
@@ -687,7 +803,7 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
if (mi->volume_label && mi->disk_id > 1 &&
lstrcmpW(mi->first_volume, mi->volume_label))
{
- LPWSTR source = msi_dup_property(package, cszSourceDir);
+ LPWSTR source = msi_dup_property(package->db, cszSourceDir);
BOOL matches;
matches = source_matches_volume(mi, source);
@@ -697,20 +813,25 @@ UINT ready_media(MSIPACKAGE *package, MSIFILE *file, MSIMEDIAINFO *mi)
{
rc = msi_change_media(package, mi);
if (rc != ERROR_SUCCESS)
+ {
+ msi_free(cabinet_file);
return rc;
+ }
}
}
if (file->IsCompressed &&
- GetFileAttributesW(mi->source) == INVALID_FILE_ATTRIBUTES)
+ GetFileAttributesW(cabinet_file) == INVALID_FILE_ATTRIBUTES)
{
rc = find_published_source(package, mi);
if (rc != ERROR_SUCCESS)
{
- ERR("Cabinet not found: %s\n", debugstr_w(mi->source));
+ ERR("Cabinet not found: %s\n", debugstr_w(cabinet_file));
+ msi_free(cabinet_file);
return ERROR_INSTALL_FAILURE;
}
}
+ msi_free(cabinet_file);
return ERROR_SUCCESS;
}
diff --git a/dll/win32/msi/msi.c b/dll/win32/msi/msi.c
index 07356405718..9d8a88a48fe 100644
--- a/dll/win32/msi/msi.c
+++ b/dll/win32/msi/msi.c
@@ -305,9 +305,8 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
UINT r = ERROR_SUCCESS, type;
DWORD size = 0;
LPCWSTR cmd_ptr = szCommandLine;
- LPCWSTR product_code = szProductCode;
- LPWSTR beg, end;
- LPWSTR cmd = NULL, codes = NULL;
+ LPWSTR beg, end, cmd = NULL, codes = NULL;
+ BOOL succeeded = FALSE;
static const WCHAR patcheq[] = {'P','A','T','C','H','=',0};
static WCHAR empty[] = {0};
@@ -342,8 +341,6 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
r = MsiSummaryInfoGetPropertyW(info, PID_TEMPLATE, &type, NULL, NULL, codes, &size);
if (r != ERROR_SUCCESS)
goto done;
-
- product_code = codes;
}
if (!szCommandLine)
@@ -362,16 +359,25 @@ static UINT MSI_ApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szProductCode, LPCWS
lstrcatW(cmd, patcheq);
lstrcatW(cmd, szPatchPackage);
- beg = codes;
- while ((end = strchrW(beg, '}')))
+ if (szProductCode)
+ r = MsiConfigureProductExW(szProductCode, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, cmd);
+ else
{
- *(end + 1) = '\0';
+ beg = codes;
+ while ((end = strchrW(beg, '}')))
+ {
+ *(end + 1) = '\0';
+ r = MsiConfigureProductExW(beg, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, cmd);
+ if (r == ERROR_SUCCESS)
+ {
+ TRACE("patch applied\n");
+ succeeded = TRUE;
+ }
+ beg = end + 2;
+ }
- r = MsiConfigureProductExW(beg, INSTALLLEVEL_DEFAULT, INSTALLSTATE_DEFAULT, cmd);
- if (r != ERROR_SUCCESS)
- goto done;
-
- beg = end + 2;
+ if (succeeded)
+ r = ERROR_SUCCESS;
}
done:
@@ -480,10 +486,43 @@ UINT WINAPI MsiApplyMultiplePatchesW(LPCWSTR szPatchPackages,
UINT WINAPI MsiDetermineApplicablePatchesA(LPCSTR szProductPackagePath,
DWORD cPatchInfo, PMSIPATCHSEQUENCEINFOA pPatchInfo)
{
- FIXME("(%s, %d, %p): stub!\n", debugstr_a(szProductPackagePath),
- cPatchInfo, pPatchInfo);
+ UINT i, r;
+ WCHAR *package_path = NULL;
+ MSIPATCHSEQUENCEINFOW *psi;
- return ERROR_CALL_NOT_IMPLEMENTED;
+ TRACE("(%s, %d, %p)\n", debugstr_a(szProductPackagePath), cPatchInfo, pPatchInfo);
+
+ if (szProductPackagePath && !(package_path = strdupAtoW( szProductPackagePath )))
+ return ERROR_OUTOFMEMORY;
+
+ psi = msi_alloc( cPatchInfo * sizeof(*psi) );
+ if (!psi)
+ {
+ msi_free( package_path );
+ return ERROR_OUTOFMEMORY;
+ }
+
+ for (i = 0; i < cPatchInfo; i++)
+ {
+ psi[i].szPatchData = strdupAtoW( pPatchInfo[i].szPatchData );
+ psi[i].ePatchDataType = pPatchInfo[i].ePatchDataType;
+ }
+
+ r = MsiDetermineApplicablePatchesW( package_path, cPatchInfo, psi );
+ if (r == ERROR_SUCCESS)
+ {
+ for (i = 0; i < cPatchInfo; i++)
+ {
+ pPatchInfo[i].dwOrder = psi[i].dwOrder;
+ pPatchInfo[i].uStatus = psi[i].uStatus;
+ }
+ }
+
+ msi_free( package_path );
+ for (i = 0; i < cPatchInfo; i++)
+ msi_free( (WCHAR *)psi[i].szPatchData );
+ msi_free( psi );
+ return r;
}
static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch )
@@ -502,15 +541,14 @@ static UINT MSI_ApplicablePatchW( MSIPACKAGE *package, LPCWSTR patch )
si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
if (!si)
{
- r = ERROR_FUNCTION_FAILED;
- goto done;
+ msiobj_release( &patch_db->hdr );
+ return ERROR_FUNCTION_FAILED;
}
r = msi_check_patch_applicable( package, si );
if (r != ERROR_SUCCESS)
TRACE("patch not applicable\n");
-done:
msiobj_release( &patch_db->hdr );
msiobj_release( &si->hdr );
return r;
@@ -596,10 +634,6 @@ static UINT msi_open_package(LPCWSTR product, MSIINSTALLCONTEXT context,
WCHAR sourcepath[MAX_PATH];
WCHAR filename[MAX_PATH];
- static const WCHAR szLocalPackage[] = {
- 'L','o','c','a','l','P','a','c','k','a','g','e',0};
-
-
r = MSIREG_OpenInstallProps(product, context, NULL, &props, FALSE);
if (r != ERROR_SUCCESS)
return ERROR_BAD_CONFIGURATION;
@@ -1181,7 +1215,7 @@ done:
static UINT msi_copy_outval(LPWSTR val, LPWSTR out, LPDWORD size)
{
- UINT r;
+ UINT r = ERROR_SUCCESS;
if (!val)
return ERROR_UNKNOWN_PROPERTY;
@@ -1201,7 +1235,7 @@ static UINT msi_copy_outval(LPWSTR val, LPWSTR out, LPDWORD size)
if (size)
*size = lstrlenW(val);
- return ERROR_SUCCESS;
+ return r;
}
UINT WINAPI MsiGetProductInfoExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
@@ -2149,6 +2183,22 @@ UINT WINAPI MsiMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uT
return MessageBoxExW(hWnd,lpText,lpCaption,uType,wLanguageId);
}
+UINT WINAPI MsiMessageBoxExA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType,
+ DWORD unknown, WORD wLanguageId, DWORD f)
+{
+ FIXME("(%p, %s, %s, %u, 0x%08x, 0x%08x, 0x%08x): semi-stub\n", hWnd, debugstr_a(lpText),
+ debugstr_a(lpCaption), uType, unknown, wLanguageId, f);
+ return MessageBoxExA(hWnd, lpText, lpCaption, uType, wLanguageId);
+}
+
+UINT WINAPI MsiMessageBoxExW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType,
+ DWORD unknown, WORD wLanguageId, DWORD f)
+{
+ FIXME("(%p, %s, %s, %u, 0x%08x, 0x%08x, 0x%08x): semi-stub\n", hWnd, debugstr_w(lpText),
+ debugstr_w(lpCaption), uType, unknown, wLanguageId, f);
+ return MessageBoxExW(hWnd, lpText, lpCaption, uType, wLanguageId);
+}
+
UINT WINAPI MsiProvideAssemblyA( LPCSTR szAssemblyName, LPCSTR szAppContext,
DWORD dwInstallMode, DWORD dwAssemblyInfo, LPSTR lpPathBuf,
LPDWORD pcchPathBuf )
@@ -2337,6 +2387,7 @@ done:
r = ERROR_SUCCESS;
}
+ msiobj_release(&package->hdr);
return r;
}
@@ -3519,10 +3570,10 @@ UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature,
if (r != ERROR_SUCCESS)
return r;
- MSI_SetPropertyW( package, szReinstallMode, reinstallmode );
- MSI_SetPropertyW( package, szInstalled, szOne );
- MSI_SetPropertyW( package, szLogVerbose, szOne );
- MSI_SetPropertyW( package, szReinstall, szFeature );
+ msi_set_property( package->db, szReinstallMode, reinstallmode );
+ msi_set_property( package->db, szInstalled, szOne );
+ msi_set_property( package->db, szLogVerbose, szOne );
+ msi_set_property( package->db, szReinstall, szFeature );
r = MSI_InstallPackage( package, sourcepath, NULL );
diff --git a/dll/win32/msi/msi.spec b/dll/win32/msi/msi.spec
index 30daec931a6..94e3ed3cb23 100644
--- a/dll/win32/msi/msi.spec
+++ b/dll/win32/msi/msi.spec
@@ -272,8 +272,8 @@
276 stub MsiSourceListClearMediaDiskW
277 stdcall MsiDetermineApplicablePatchesA(str long ptr)
278 stdcall MsiDetermineApplicablePatchesW(wstr long ptr)
-279 stub MsiMessageBoxExA
-280 stub MsiMessageBoxExW
+279 stdcall MsiMessageBoxExA(long str str long long long long)
+280 stdcall MsiMessageBoxExW(long wstr wstr long long long long)
281 stdcall MsiSetExternalUIRecord(ptr long ptr ptr)
@ stdcall -private DllCanUnloadNow()
diff --git a/dll/win32/msi/msi_Bg.rc b/dll/win32/msi/msi_Bg.rc
index d3b8ca84abb..8aea16940f3 100644
--- a/dll/win32/msi/msi_Bg.rc
+++ b/dll/win32/msi/msi_Bg.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "ďúň˙ň %s íĺ ĺ íŕěĺđĺí"
9 "ďîńňŕâĺňĺ äčńę %s"
- 10 "íĺęîđĺęňíč ďŕđŕěĺňđč"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "âúâĺäĺňĺ ďŕďęŕňŕ, ęî˙ňî ńúäúđćŕ %s"
12 "čçňî÷íčęŕ çŕ číńňŕëŕöč˙ íŕ ôóíęöčîíŕëíîńňňŕ ëčďńâŕ"
13 "ěđĺćîâîňî óńňđîéńňâŕ íóćíî çŕ ôóíęöčîíŕëíîńňňŕ ëčďńâŕ "
diff --git a/dll/win32/msi/msi_Da.rc b/dll/win32/msi/msi_Da.rc
index beee42765ee..fa7e1c43c39 100644
--- a/dll/win32/msi/msi_Da.rc
+++ b/dll/win32/msi/msi_Da.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "Kunne ikke ĺbne den specificerede installationspakke. Kontroller stien og prřv igen."
5 "kunne ikke finden stien '%s'."
9 "indsćt disk '%s'"
- 10 "forkerte parametere."
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "angiv kataloget som indeholder '%s'."
12 "featurens installationskilde mangler."
13 "featurens netvćrksdrev mangler."
diff --git a/dll/win32/msi/msi_De.rc b/dll/win32/msi/msi_De.rc
index e0cccf07806..e07b5efd127 100644
--- a/dll/win32/msi/msi_De.rc
+++ b/dll/win32/msi/msi_De.rc
@@ -2,6 +2,7 @@
* German resources for MSI
*
* Copyright 2005 Henning Gerhardt
+ * Copyright 2010 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -29,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Das angegebene Installationspaket konnte nicht geöffnet werden. Bitte überprüfen Sie den Pfadnamen und versuchen Sie es noch einmal."
5 "Der Pfad %s wurde nicht gefunden."
9 "Bitte Disk %s einlegen."
- 10 "Falsche Parameter"
+ 10 "Windows Installer %s\n\n" \
+ "Benutzung:\n" \
+ "msiexec Befehl {Parameter} [Zusätzliche Parammeter]\n\n" \
+ "Produkt installieren:\n" \
+ "\t/i {Paket|Produktcode} [Eigenschaft]\n" \
+ "\t/package {Paket|Produktcode} [Eigenschaft]\n" \
+ "\t/a Paket [Eigenschaft]\n" \
+ "Installation reparieren:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {Paket|Produktcode}\n" \
+ "Produkt deinstallieren:\n" \
+ "\t/uninstall {Paket|Produktcode} [Eigenschaft]\n" \
+ "\t/x {Paket|Produktcode} [Eigenschaft]\n" \
+ "Produkt ankĂĽndigen:\n" \
+ "\t/j[u|m] Paket [/t Transformationspaket] [/g Sprachkennung]\n" \
+ "Patch integrieren:\n" \
+ "\t/p Patchpaket [Eigenschaft]\n" \
+ "\t/p Patchpaket /a Paket [Eigenschaft]\n" \
+ "Protokollierung und Benutzeroberfläche für die oberen Befehle anpassen:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] Protokolldatei\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "MSI Service registrieren:\n" \
+ "\t/y\n" \
+ "Registrierung des MSI Service aufheben:\n" \
+ "\t/z\n" \
+ "Hilfe anzeigen:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Geben Sie das Verzeichnis ein, dass %s enthält."
12 "Die Installationsquelle fĂĽr das Feature fehlt."
13 "Das Netzwerklaufwerk fĂĽr das Feature fehlt."
diff --git a/dll/win32/msi/msi_En.rc b/dll/win32/msi/msi_En.rc
index 74fc5c14a85..c506e003445 100644
--- a/dll/win32/msi/msi_En.rc
+++ b/dll/win32/msi/msi_En.rc
@@ -2,6 +2,7 @@
* English resources for MSI
*
* Copyright 2005 Mike McCormack
+ * Copyright 2010 Detlef Riekenberg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -27,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "path %s not found"
9 "insert disk %s"
- 10 "bad parameters"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parameter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "enter which folder contains %s"
12 "install source for feature missing"
13 "network drive for feature missing"
diff --git a/dll/win32/msi/msi_Eo.rc b/dll/win32/msi/msi_Eo.rc
index 7579bdc65cb..8b8c8d36fbd 100644
--- a/dll/win32/msi/msi_Eo.rc
+++ b/dll/win32/msi/msi_Eo.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "Mi ne trovis la vojon %s"
9 "enţovu la diskon %s"
- 10 "nekorektaj parametroj"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "enigu la nomon de dosierujo kiu enhavas %s"
12 "instalad-fonto por mankanta taýgeco"
13 "retdrajvo por mankanta taýgeco"
diff --git a/dll/win32/msi/msi_Es.rc b/dll/win32/msi/msi_Es.rc
index 781be071802..f5425dbb654 100644
--- a/dll/win32/msi/msi_Es.rc
+++ b/dll/win32/msi/msi_Es.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "No se ha podido abrir el paquete de instalación especificado. Por favor, compruebe la ruta del archivo y vuelva a intentarlo."
5 "ruta %s no encontrada"
9 "inserte el disco %s"
- 10 "parámetros incorrectos"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "introduzca qué carpeta contiene %s"
12 "instalar fuente para característica ausente"
13 "unidad de red para característica ausente"
diff --git a/dll/win32/msi/msi_Fi.rc b/dll/win32/msi/msi_Fi.rc
index 17721aa4b01..f3d58bff2bc 100644
--- a/dll/win32/msi/msi_Fi.rc
+++ b/dll/win32/msi/msi_Fi.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "Polkua %s ei löydy."
9 "Anna levy %s"
- 10 "Virheelliset parametrit."
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Anna kansio, joka sisältää %s"
12 "Ominaisuuden asennuslähde puuttuu."
13 "Ominaisuuden verkkolevy puuttuu."
diff --git a/dll/win32/msi/msi_Fr.rc b/dll/win32/msi/msi_Fr.rc
index f7f733803bc..6cd1fc5ca21 100644
--- a/dll/win32/msi/msi_Fr.rc
+++ b/dll/win32/msi/msi_Fr.rc
@@ -2,6 +2,7 @@
* French resources for MSI
*
* Copyright 2005 Jonathan Ernst
+ * Copyright 2009-2010 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
@@ -30,7 +31,33 @@ STRINGTABLE DISCARDABLE
4 "Le paquet d'installation spécifié n'a pu être ouvert. Veuillez vérifier le chemin du fichier et réessayer."
5 "Le chemin %s est introuvable"
9 "insérez le disque %s"
- 10 "mauvais paramètres"
+ 10 "Programme d'installation Windows %s\n\n" \
+ "Usage :\n" \
+ "msiexec commande {paramètre obligatoire} [paramètre optionnel]\n\n" \
+ "Installer un produit :\n" \
+ "\t/i {paquet|code_produit} [propriété]\n" \
+ "\t/package {paquet|code_produit} [propriété]\n" \
+ "\t/a paquet [propriété]\n" \
+ "Réparer une installation :\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {paquet|code_produit}\n" \
+ "Désinstaller un produit :\n" \
+ "\t/uninstall {paquet|code_produit} [propriété]\n" \
+ "\t/x {paquet|code_produit} [propriété]\n" \
+ "Publier un produit :\n" \
+ "\t/j[u|m] paquet [/t transformation] [/g id_langue]\n" \
+ "Appliquer un patch :\n" \
+ "\t/p paquet_patch [propriété]\n" \
+ "\t/p paquet_patch /a paquet [propriété]\n" \
+ "Modificateurs de journalisation et d'interface utilisateur pour les commandes ci-dessus :\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] fichier_journal\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Enregistrer le service MSI :\n" \
+ "\t/y\n" \
+ "Annuler l'enregistrement du service MSI :\n" \
+ "\t/z\n" \
+ "Afficher cette aide :\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "saisissez le nom du dossier contenant %s"
12 "source d'installation pour la fonctionnalité manquante"
13 "lecteur réseau pour la fonctionnalité manquante"
diff --git a/dll/win32/msi/msi_Hu.rc b/dll/win32/msi/msi_Hu.rc
index 21ba5cf30c1..846de4ccada 100644
--- a/dll/win32/msi/msi_Hu.rc
+++ b/dll/win32/msi/msi_Hu.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "%s útvonal nem található"
9 "helyezze be a lemezt: %s"
- 10 "rossz paraméterek"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "adja meg melyik mappa tartalmazza ezt: %s"
12 "hiányzó tulajdonság a telepítési forráshoz"
13 "hiányzó tulajdonság a hálózati meghajtóhoz"
diff --git a/dll/win32/msi/msi_It.rc b/dll/win32/msi/msi_It.rc
index a40a7303425..0586bb4bab5 100644
--- a/dll/win32/msi/msi_It.rc
+++ b/dll/win32/msi/msi_It.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Impossibile aprire il pacchetto di installazione specificato. Per favore controlla l'indirizzo del file e riprova."
5 "percorso %s non trovato"
9 "inserire disco %s"
- 10 "parametri incorretti"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "immettere il nome della cartella che contiene %s"
12 "sorgente di installazione per la funzionalitĂ mancante"
13 "periferica di rete per la funzionalitĂ mancante"
diff --git a/dll/win32/msi/msi_Ko.rc b/dll/win32/msi/msi_Ko.rc
index ca14253307d..17ab488ce2f 100644
--- a/dll/win32/msi/msi_Ko.rc
+++ b/dll/win32/msi/msi_Ko.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 " ÁöÁ¤ÇŃ ĽłÄˇ ĆĐŰÁö¸¦ ż Ľö ľř˝Ŕ´Ď´Ů. ĆÄŔĎ °ć·Î¸¦ Č®ŔÎÇĎ°í ´Ů˝Ă ˝ĂµµÇϽʽÿŔ."
5 "%s °ć·Î¸¦ ĂŁŔ»Ľö ľř˝Ŕ´Ď´Ů"
9 "µđ˝şĹ© %s »đŔÔ"
- 10 "Ŕ߸řµČ ¸Ĺ°łşŻĽö"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "%s¸¦ Ć÷ÇÔÇĎ´Â Ćú´ő¸¦ ŔÔ·ÂÇĎĽĽż©"
12 "şüÁř şÎşĐ(feature)Ŕ» Ŕ§ÇŃ ĽłÄˇ żřş»"
13 "şüÁř şÎşĐ(feature)Ŕ» Ŕ§ÇŃ ł×Ć®żöĹ© µĺ¶óŔĚşę"
diff --git a/dll/win32/msi/msi_Lt.rc b/dll/win32/msi/msi_Lt.rc
index 1cf1c52924e..c88592c49bc 100644
--- a/dll/win32/msi/msi_Lt.rc
+++ b/dll/win32/msi/msi_Lt.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Nepavyko atverti nurodyto diegimo paketo. Patikrinkite failo keliÄ… ir mÄ—ginkite dar kartÄ…."
5 "kelias %s nerastas"
9 "ÄŻdÄ—kite diskÄ… %s"
- 10 "blogi parametrai"
+ 10 "Windows diegimo programa %s\n\n" \
+ "Naudojimas:\n" \
+ "msiexec komanda {būtinas parametras} [nebūtinas parametras]\n\n" \
+ "Įdiegti produktą:\n" \
+ "\t/i {paketas|produkto_kodas} [savybÄ—]\n" \
+ "\t/package {paketas|produkto_kodas} [savybÄ—]\n" \
+ "\t/a paketas [savybÄ—]\n" \
+ "Taisyti ÄŻdiegimÄ…:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {paketas|produkto_kodas}\n" \
+ "Pašalinti produktą:\n" \
+ "\t/uninstall {paketas|produkto_kodas} [savybÄ—]\n" \
+ "\t/x {paketas|produkto_kodas} [savybÄ—]\n" \
+ "Skelbti produktÄ…:\n" \
+ "\t/j[u|m] paketas [/t pakeitimas] [/g kalbos_identifikatorius]\n" \
+ "Pritaikyti pataisÄ…:\n" \
+ "\t/p pataisos_paketas [savybÄ—]\n" \
+ "\t/p pataisos_paketas /a paketas [savybÄ—]\n" \
+ "Žurnalo ir sąsajos modifikatoriai aukščiau išvardintoms komandoms:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] Ĺľurnalo_failas\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Registruoti MSI tarnybÄ…:\n" \
+ "\t/y\n" \
+ "Išregistruoti MSI tarnybą:\n" \
+ "\t/z\n" \
+ "Parodyti šią pagalbą:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "ÄŻveskite aplankÄ…, kuris turi %s"
12 "trūksta diegimo šaltinio komponentui"
13 "trūksta tinklo disko komponentui"
diff --git a/dll/win32/msi/msi_Nl.rc b/dll/win32/msi/msi_Nl.rc
index da304304ed3..306cfd7e30a 100644
--- a/dll/win32/msi/msi_Nl.rc
+++ b/dll/win32/msi/msi_Nl.rc
@@ -1,5 +1,5 @@
/*
- * Durch resources for MSI
+ * Dutch resources for MSI
*
* Copyright 2005 Hans Leidekker
*
@@ -24,13 +24,39 @@ LANGUAGE LANG_DUTCH, SUBLANG_NEUTRAL
STRINGTABLE DISCARDABLE
{
- 4 "The specified installation package could not be opened. Please check the file path and try again."
+ 4 "Het opgegeven installatie pakket kon niet worden geopend. Verifieer het bestandspad en probeer opnieuw."
5 "Pad %s niet gevonden"
9 "Plaats disk %s"
- 10 "Ongeldige parameters"
+ 10 "Windows Installer %s\n\n" \
+ "Gebruik:\n" \
+ "msiexec commando {vereiste parameter} [optionele parameter]\n\n" \
+ "Installeer een product:\n" \
+ "\t/i {pakket|productcode} [eigenschap]\n" \
+ "\t/package {pakket|productcode} [eigenschap]\n" \
+ "\t/a pakket [eigenschap]\n" \
+ "Herstel een installatie:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {pakket|productcode}\n" \
+ "Verwijder een product:\n" \
+ "\t/uninstall {pakket|productcode} [eigenschap]\n" \
+ "\t/x {pakket|productcode} [eigenschap]\n" \
+ "Adverteer een product:\n" \
+ "\t/j[u|m] pakket [/t transform] [/g languageid]\n" \
+ "Pas een patch toe:\n" \
+ "\t/p patchpakket [eigenschap]\n" \
+ "\t/p patchpakket /a pakket [eigenschap]\n" \
+ "Log en UI Modifiers voor bovenstaande commando's:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logbestand\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Registreer MSI Service:\n" \
+ "\t/y\n" \
+ "Maak registratie MSI Service ongedaan:\n" \
+ "\t/z\n" \
+ "Laat dit helpvenster zien:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Voer de map in die %s bevat"
- 12 "De installatiebron van het feature ontbreekt"
- 13 "De netwerkschijf met het feature ontbreekt"
+ 12 "De installatiebron van de feature ontbreekt"
+ 13 "De netwerkschijf met de feature ontbreekt"
14 "Feature van:"
15 "Kies de map die %s bevat"
}
diff --git a/dll/win32/msi/msi_No.rc b/dll/win32/msi/msi_No.rc
index e885f5adbda..93e26c67211 100644
--- a/dll/win32/msi/msi_No.rc
+++ b/dll/win32/msi/msi_No.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "Klarte ikke ĺpne den oppgitte installasjonspakken. Kontroller filbanen og prřv igjen."
5 "Fant ikke stien '%s'."
9 "Sett i disk '%s'"
- 10 "Gale parametere."
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Oppgi katalogen som inneholder '%s'."
12 "Egenskapens installasjonskilde mangler."
13 "Egenskapens nettverksstasjon mangler."
diff --git a/dll/win32/msi/msi_Pl.rc b/dll/win32/msi/msi_Pl.rc
index c31311ebf7e..ceb64dd9c8c 100644
--- a/dll/win32/msi/msi_Pl.rc
+++ b/dll/win32/msi/msi_Pl.rc
@@ -28,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "Nie udało się otworzyć wybranego pakietu instalacyjnego. Sprawdź czy ścieżka jest poprawna i spróbuj ponownie."
5 "ścieżka '%s' nie została odnaleziona"
9 "włóż dysk '%s'"
- 10 "złe parametry"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "wprowadź siceżkę do folderu zawierającego '%s'"
12 "źródło danych zawierające żądanę funkcję jest niedostępne"
13 "dysk siecowy zawierający żądaną funckje jest niedostępny"
diff --git a/dll/win32/msi/msi_Pt.rc b/dll/win32/msi/msi_Pt.rc
index 64ab16348d4..94cc6330e0c 100644
--- a/dll/win32/msi/msi_Pt.rc
+++ b/dll/win32/msi/msi_Pt.rc
@@ -28,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "caminho %s năo encontrado"
9 "insira disco %s"
- 10 "parâmetros inválidos"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "entre qual pasta contém %s"
12 "instalar fonte para característica faltando"
13 "drive de rede para característica faltando"
@@ -43,7 +69,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "localizaçăo %s năo encontrada"
9 "insira o disco %s"
- 10 "parâmetros inválidos"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "indique que pasta contém %s"
12 "instalar fonte para a opçăo em falta"
13 "controlador de rede para a opçăo em falta"
diff --git a/dll/win32/msi/msi_Ro.rc b/dll/win32/msi/msi_Ro.rc
index b877b42a34e..ffd9c5e08d7 100644
--- a/dll/win32/msi/msi_Ro.rc
+++ b/dll/win32/msi/msi_Ro.rc
@@ -28,7 +28,33 @@ STRINGTABLE DISCARDABLE
4 "Pachetul de instalare menționat nu a putut fi deschis. Verificați calea și încercați din nou."
5 "calea %s nu a fost gÄsitÄ"
9 "inserați discul %s"
- 10 "parameteri greșiți"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "introduceți fișierul care conține %s"
12 "lipseČ™te sursa de instalare pentru aceastÄ caracteristicÄ"
13 "lipseČ™te unitatea de reČ›ea pentru aceastÄ caracteristicÄ"
diff --git a/dll/win32/msi/msi_Ru.rc b/dll/win32/msi/msi_Ru.rc
index 8e7aafdda31..7cd4a2b0737 100644
--- a/dll/win32/msi/msi_Ru.rc
+++ b/dll/win32/msi/msi_Ru.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "Указанный пакет не может быть открыт. Проверьте файл и повторите попыткŃ."
5 "ĐżŃть %s не найден"
9 "вŃтавьте диŃĐş %s"
- 10 "неверные параметры"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "Ńкажите каталог, Ńодержащий %s"
12 "иŃточник ŃŃтановки данной возможноŃти не Ńказан"
13 "Ńетевой диŃĐş для данной возможноŃти не Ńказан"
diff --git a/dll/win32/msi/msi_Si.rc b/dll/win32/msi/msi_Si.rc
index 75823390635..3477f1ba6e5 100644
--- a/dll/win32/msi/msi_Si.rc
+++ b/dll/win32/msi/msi_Si.rc
@@ -29,7 +29,33 @@ STRINGTABLE DISCARDABLE
4 "Navedenega namestitvenega paketa ni mogoÄŤe odpreti. Preverite ime datoteke in poskusite znova."
5 "pot %s ne obstaja"
9 "vnesite disk %s"
- 10 "neveljavni parametri"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "vnesite ime mape, ki vsebuje %s"
12 "manjkajoÄŤ namestitveni vir za namestitev funkcije"
13 "manjkajoÄŤ omreĹľni pogon za namestitev funkcijo"
diff --git a/dll/win32/msi/msi_Sv.rc b/dll/win32/msi/msi_Sv.rc
index 47bf09b00c4..4c37cfc475b 100644
--- a/dll/win32/msi/msi_Sv.rc
+++ b/dll/win32/msi/msi_Sv.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "Det angivna installationspaketet kunde inte öppnas. Kontrollera filsökvägen och försök igen."
5 "sökvägen %s hittades inte"
9 "mata in %s"
- 10 "felaktiga parametrar"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "ange vilken mapp som innehĺller %s"
12 "installationskälla för funktion saknar"
13 "nätverksenhet för funktion saknar"
diff --git a/dll/win32/msi/msi_Tr.rc b/dll/win32/msi/msi_Tr.rc
index a8e0f369666..c6a12c1ae07 100644
--- a/dll/win32/msi/msi_Tr.rc
+++ b/dll/win32/msi/msi_Tr.rc
@@ -27,7 +27,33 @@ STRINGTABLE DISCARDABLE
4 "The specified installation package could not be opened. Please check the file path and try again."
5 "%s yolu bulunamadý"
9 "%s nolu diski yerleţtirin"
- 10 "bozuk parametreler"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "%s öđesini içeren dizini girin"
12 "eksik özellik için kurulum kaynađý"
13 "eksik özellik için ađ sürücüsü"
diff --git a/dll/win32/msi/msi_Uk.rc b/dll/win32/msi/msi_Uk.rc
index 4b7173e8d4a..2407bbe6e6d 100644
--- a/dll/win32/msi/msi_Uk.rc
+++ b/dll/win32/msi/msi_Uk.rc
@@ -32,7 +32,33 @@ STRINGTABLE DISCARDABLE
4 "Не вдалоŃŃŹ відкрити вказаний пакет Ń–Đ˝Ńталяції. Перевірте Ńлях Đ´Đľ Ń„Đ°ĐąĐ»Ń Ń‚Đ° ŃпробŃйте знов."
5 "Ńлях %s не знайдено"
9 "вŃтавте диŃĐş %s"
- 10 "невірні параметри"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "вкажіть папкŃ, що ĐĽŃ–Ńтить %s"
12 "джерело вŃтановлення даної можливоŃті не вказане"
13 "мережевий диŃĐş для даної можливоŃті не вказаний"
diff --git a/dll/win32/msi/msi_Zh.rc b/dll/win32/msi/msi_Zh.rc
index a6d5cd1eff6..91fd5400258 100644
--- a/dll/win32/msi/msi_Zh.rc
+++ b/dll/win32/msi/msi_Zh.rc
@@ -30,7 +30,33 @@ STRINGTABLE DISCARDABLE
4 "不č˝ć‰“开所指定的安装软件包. 请检查文件路径ĺŽĺ†ŤčŻ•."
5 "č·Żĺľ„ %s 没找ĺ°"
9 "ćŹ’ĺ…Ąč˝Żç› %s"
- 10 "错误参数"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "čľ“ĺ…ĄĺŚ…ĺ« %s 的文件夹"
12 "本功č˝çš„安装ćşä¸Ťĺ在"
13 "本功č˝çš„网络驱动器不ĺ在"
@@ -45,7 +71,33 @@ STRINGTABLE DISCARDABLE
4 "不č˝é–‹ĺ•źć‰€ćŚ‡ĺ®šçš„ĺ®‰čŁťč»źä»¶ĺŚ…. 請檢查檔ćˇč·Żĺľ‘後再試."
5 "č·Żĺľ‘ %s 沒找ĺ°"
9 "插入軟碟 %s"
- 10 "錯誤ĺŹć•¸"
+ 10 "Windows Installer %s\n\n" \
+ "Usage:\n" \
+ "msiexec command {required parameter} [optional parammeter]\n\n" \
+ "Install a product:\n" \
+ "\t/i {package|productcode} [property]\n" \
+ "\t/package {package|productcode} [property]\n" \
+ "\t/a package [property]\n" \
+ "Repair an installation:\n" \
+ "\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
+ "Uninstall a product:\n" \
+ "\t/uninstall {package|productcode} [property]\n" \
+ "\t/x {package|productcode} [property]\n" \
+ "Advertise a product:\n" \
+ "\t/j[u|m] package [/t transform] [/g languageid]\n" \
+ "Apply a patch:\n" \
+ "\t/p patchpackage [property]\n" \
+ "\t/p patchpackage /a package [property]\n" \
+ "Log and UI Modifiers for above commands:\n" \
+ "\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
+ "\t/q{|n|b|r|f|n+|b+|b-}\n" \
+ "Register MSI Service:\n" \
+ "\t/y\n" \
+ "Unregister MSI Service:\n" \
+ "\t/z\n" \
+ "Display this help:\n" \
+ "\t/help\n" \
+ "\t/?\n"
11 "čĽ¸ĺ…ĄĺŚ…ĺ« %s 的檔ćˇĺ¤ľ"
12 "本功č˝çš„安裝ćşä¸Ťĺ在"
13 "本功č˝çš„網路儲ĺ槽不ĺ在"
diff --git a/dll/win32/msi/msi_ros.diff b/dll/win32/msi/msi_ros.diff
deleted file mode 100644
index 1e88f29fb3f..00000000000
--- a/dll/win32/msi/msi_ros.diff
+++ /dev/null
@@ -1,5400 +0,0 @@
-Index: cond.tab.c
-===================================================================
---- cond.tab.c (revision 31639)
-+++ cond.tab.c (working copy)
-@@ -0,0 +1,2439 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ 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, 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., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Written by Richard Stallman by simplifying the original so called
-+ ``semantic'' parser. */
-+
-+/* All symbols defined below should begin with yy or YY, to avoid
-+ infringing on user name space. This should be done even for local
-+ variables, as they might otherwise be expanded by user macros.
-+ There are some unavoidable exceptions within include files to
-+ define necessary library symbols; they are noted "INFRINGES ON
-+ USER NAME SPACE" below. */
-+
-+/* Identify Bison output. */
-+#define YYBISON 1
-+
-+/* Bison version. */
-+#define YYBISON_VERSION "2.1"
-+
-+/* Skeleton name. */
-+#define YYSKELETON_NAME "yacc.c"
-+
-+/* Pure parsers. */
-+#define YYPURE 1
-+
-+/* Using locations. */
-+#define YYLSP_NEEDED 0
-+
-+/* Substitute the variable and function names. */
-+#define yyparse cond_parse
-+#define yylex cond_lex
-+#define yyerror cond_error
-+#define yylval cond_lval
-+#define yychar cond_char
-+#define yydebug cond_debug
-+#define yynerrs cond_nerrs
-+
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ COND_SPACE = 258,
-+ COND_EOF = 259,
-+ COND_OR = 260,
-+ COND_AND = 261,
-+ COND_NOT = 262,
-+ COND_XOR = 263,
-+ COND_IMP = 264,
-+ COND_EQV = 265,
-+ COND_LT = 266,
-+ COND_GT = 267,
-+ COND_EQ = 268,
-+ COND_NE = 269,
-+ COND_GE = 270,
-+ COND_LE = 271,
-+ COND_ILT = 272,
-+ COND_IGT = 273,
-+ COND_IEQ = 274,
-+ COND_INE = 275,
-+ COND_IGE = 276,
-+ COND_ILE = 277,
-+ COND_LPAR = 278,
-+ COND_RPAR = 279,
-+ COND_TILDA = 280,
-+ COND_SS = 281,
-+ COND_ISS = 282,
-+ COND_ILHS = 283,
-+ COND_IRHS = 284,
-+ COND_LHS = 285,
-+ COND_RHS = 286,
-+ COND_PERCENT = 287,
-+ COND_DOLLARS = 288,
-+ COND_QUESTION = 289,
-+ COND_AMPER = 290,
-+ COND_EXCLAM = 291,
-+ COND_IDENT = 292,
-+ COND_NUMBER = 293,
-+ COND_LITER = 294,
-+ COND_ERROR = 295
-+ };
-+#endif
-+/* Tokens. */
-+#define COND_SPACE 258
-+#define COND_EOF 259
-+#define COND_OR 260
-+#define COND_AND 261
-+#define COND_NOT 262
-+#define COND_XOR 263
-+#define COND_IMP 264
-+#define COND_EQV 265
-+#define COND_LT 266
-+#define COND_GT 267
-+#define COND_EQ 268
-+#define COND_NE 269
-+#define COND_GE 270
-+#define COND_LE 271
-+#define COND_ILT 272
-+#define COND_IGT 273
-+#define COND_IEQ 274
-+#define COND_INE 275
-+#define COND_IGE 276
-+#define COND_ILE 277
-+#define COND_LPAR 278
-+#define COND_RPAR 279
-+#define COND_TILDA 280
-+#define COND_SS 281
-+#define COND_ISS 282
-+#define COND_ILHS 283
-+#define COND_IRHS 284
-+#define COND_LHS 285
-+#define COND_RHS 286
-+#define COND_PERCENT 287
-+#define COND_DOLLARS 288
-+#define COND_QUESTION 289
-+#define COND_AMPER 290
-+#define COND_EXCLAM 291
-+#define COND_IDENT 292
-+#define COND_NUMBER 293
-+#define COND_LITER 294
-+#define COND_ERROR 295
-+
-+
-+
-+
-+/* Copy the first part of user declarations. */
-+#line 1 "cond.y"
-+
-+
-+/*
-+ * Implementation of the Microsoft Installer (msi.dll)
-+ *
-+ * Copyright 2003 Mike McCormack for CodeWeavers
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-+ */
-+
-+#define COBJMACROS
-+
-+#include "config.h"
-+
-+#include
-+#include
-+#include
-+
-+#include "windef.h"
-+#include "winbase.h"
-+#include "winuser.h"
-+#include "msi.h"
-+#include "msiquery.h"
-+#include "objbase.h"
-+#include "oleauto.h"
-+
-+#include "msipriv.h"
-+#include "msiserver.h"
-+#include "wine/debug.h"
-+#include "wine/unicode.h"
-+
-+#define YYLEX_PARAM info
-+#define YYPARSE_PARAM info
-+
-+static int cond_error(const char *str);
-+
-+WINE_DEFAULT_DEBUG_CHANNEL(msi);
-+
-+typedef struct tag_yyinput
-+{
-+ MSIPACKAGE *package;
-+ LPCWSTR str;
-+ INT n;
-+ MSICONDITION result;
-+} COND_input;
-+
-+struct cond_str {
-+ LPCWSTR data;
-+ INT len;
-+};
-+
-+static LPWSTR COND_GetString( const struct cond_str *str );
-+static LPWSTR COND_GetLiteral( const struct cond_str *str );
-+static int cond_lex( void *COND_lval, COND_input *info);
-+static const WCHAR szEmpty[] = { 0 };
-+
-+static INT compare_int( INT a, INT operator, INT b );
-+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert );
-+
-+static INT compare_and_free_strings( LPWSTR a, INT op, LPWSTR b, BOOL convert )
-+{
-+ INT r;
-+
-+ r = compare_string( a, op, b, convert );
-+ msi_free( a );
-+ msi_free( b );
-+ return r;
-+}
-+
-+static BOOL num_from_prop( LPCWSTR p, INT *val )
-+{
-+ INT ret = 0, sign = 1;
-+
-+ if (!p)
-+ return FALSE;
-+ if (*p == '-')
-+ {
-+ sign = -1;
-+ p++;
-+ }
-+ if (!*p)
-+ return FALSE;
-+ while (*p)
-+ {
-+ if( *p < '0' || *p > '9' )
-+ return FALSE;
-+ ret = ret*10 + (*p - '0');
-+ p++;
-+ }
-+ *val = ret*sign;
-+ return TRUE;
-+}
-+
-+
-+
-+/* Enabling traces. */
-+#ifndef YYDEBUG
-+# define YYDEBUG 0
-+#endif
-+
-+/* Enabling verbose error messages. */
-+#ifdef YYERROR_VERBOSE
-+# undef YYERROR_VERBOSE
-+# define YYERROR_VERBOSE 1
-+#else
-+# define YYERROR_VERBOSE 0
-+#endif
-+
-+/* Enabling the token table. */
-+#ifndef YYTOKEN_TABLE
-+# define YYTOKEN_TABLE 0
-+#endif
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 111 "cond.y"
-+typedef union YYSTYPE {
-+ struct cond_str str;
-+ LPWSTR string;
-+ INT value;
-+} YYSTYPE;
-+/* Line 196 of yacc.c. */
-+#line 286 "cond.tab.c"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+/* Copy the second part of user declarations. */
-+
-+
-+/* Line 219 of yacc.c. */
-+#line 298 "cond.tab.c"
-+
-+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-+# define YYSIZE_T __SIZE_TYPE__
-+#endif
-+#if ! defined (YYSIZE_T) && defined (size_t)
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T)
-+# define YYSIZE_T unsigned int
-+#endif
-+
-+#ifndef YY_
-+# if YYENABLE_NLS
-+# if ENABLE_NLS
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YY_(msgid) dgettext ("bison-runtime", msgid)
-+# endif
-+# endif
-+# ifndef YY_
-+# define YY_(msgid) msgid
-+# endif
-+#endif
-+
-+#if ! defined (yyoverflow) || YYERROR_VERBOSE
-+
-+/* The parser invokes alloca or malloc; define the necessary symbols. */
-+
-+# ifdef YYSTACK_USE_ALLOCA
-+# if YYSTACK_USE_ALLOCA
-+# ifdef __GNUC__
-+# define YYSTACK_ALLOC __builtin_alloca
-+# else
-+# define YYSTACK_ALLOC alloca
-+# if defined (__STDC__) || defined (__cplusplus)
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYINCLUDED_STDLIB_H
-+# endif
-+# endif
-+# endif
-+# endif
-+
-+# ifdef YYSTACK_ALLOC
-+ /* Pacify GCC's `empty if-body' warning. */
-+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+ /* The OS might guarantee only one guard page at the bottom of the stack,
-+ and a page size can be as small as 4096 bytes. So we cannot safely
-+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
-+ to allow for a few compiler-allocated temporary stack slots. */
-+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
-+# endif
-+# else
-+# define YYSTACK_ALLOC YYMALLOC
-+# define YYSTACK_FREE YYFREE
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
-+# endif
-+# ifdef __cplusplus
-+extern "C" {
-+# endif
-+# ifndef YYMALLOC
-+# define YYMALLOC malloc
-+# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifndef YYFREE
-+# define YYFREE free
-+# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void free (void *); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifdef __cplusplus
-+}
-+# endif
-+# endif
-+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
-+
-+
-+#if (! defined (yyoverflow) \
-+ && (! defined (__cplusplus) \
-+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
-+
-+/* A type that is properly aligned for any stack member. */
-+union yyalloc
-+{
-+ short int yyss;
-+ YYSTYPE yyvs;
-+ };
-+
-+/* The size of the maximum gap between one aligned stack and the next. */
-+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-+
-+/* The size of an array large to enough to hold all stacks, each with
-+ N elements. */
-+# define YYSTACK_BYTES(N) \
-+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
-+ + YYSTACK_GAP_MAXIMUM)
-+
-+/* Copy COUNT objects from FROM to TO. The source and destination do
-+ not overlap. */
-+# ifndef YYCOPY
-+# if defined (__GNUC__) && 1 < __GNUC__
-+# define YYCOPY(To, From, Count) \
-+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-+# else
-+# define YYCOPY(To, From, Count) \
-+ do \
-+ { \
-+ YYSIZE_T yyi; \
-+ for (yyi = 0; yyi < (Count); yyi++) \
-+ (To)[yyi] = (From)[yyi]; \
-+ } \
-+ while (0)
-+# endif
-+# endif
-+
-+/* Relocate STACK from its old location to the new one. The
-+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
-+ elements in the stack, and YYPTR gives the new location of the
-+ stack. Advance YYPTR to a properly aligned location for the next
-+ stack. */
-+# define YYSTACK_RELOCATE(Stack) \
-+ do \
-+ { \
-+ YYSIZE_T yynewbytes; \
-+ YYCOPY (&yyptr->Stack, Stack, yysize); \
-+ Stack = &yyptr->Stack; \
-+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-+ yyptr += yynewbytes / sizeof (*yyptr); \
-+ } \
-+ while (0)
-+
-+#endif
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+ typedef signed char yysigned_char;
-+#else
-+ typedef short int yysigned_char;
-+#endif
-+
-+/* YYFINAL -- State number of the termination state. */
-+#define YYFINAL 28
-+/* YYLAST -- Last index in YYTABLE. */
-+#define YYLAST 71
-+
-+/* YYNTOKENS -- Number of terminals. */
-+#define YYNTOKENS 41
-+/* YYNNTS -- Number of nonterminals. */
-+#define YYNNTS 12
-+/* YYNRULES -- Number of rules. */
-+#define YYNRULES 53
-+/* YYNRULES -- Number of states. */
-+#define YYNSTATES 70
-+
-+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-+#define YYUNDEFTOK 2
-+#define YYMAXUTOK 295
-+
-+#define YYTRANSLATE(YYX) \
-+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-+
-+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-+static const unsigned char yytranslate[] =
-+{
-+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
-+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
-+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-+ 35, 36, 37, 38, 39, 40
-+};
-+
-+#if YYDEBUG
-+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-+ YYRHS. */
-+static const unsigned char yyprhs[] =
-+{
-+ 0, 0, 3, 5, 6, 8, 12, 16, 20, 24,
-+ 26, 30, 33, 35, 37, 41, 45, 49, 53, 57,
-+ 61, 65, 69, 73, 77, 79, 81, 83, 85, 87,
-+ 89, 91, 93, 95, 97, 99, 101, 103, 105, 107,
-+ 109, 111, 113, 115, 117, 119, 121, 124, 127, 130,
-+ 133, 135, 138, 140
-+};
-+
-+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-+static const yysigned_char yyrhs[] =
-+{
-+ 42, 0, -1, 43, -1, -1, 44, -1, 43, 5,
-+ 44, -1, 43, 9, 44, -1, 43, 8, 44, -1,
-+ 43, 10, 44, -1, 45, -1, 44, 6, 45, -1,
-+ 7, 45, -1, 49, -1, 47, -1, 49, 46, 49,
-+ -1, 50, 46, 49, -1, 49, 46, 50, -1, 50,
-+ 46, 50, -1, 50, 46, 48, -1, 48, 46, 50,
-+ -1, 48, 46, 48, -1, 48, 46, 49, -1, 49,
-+ 46, 48, -1, 23, 43, 24, -1, 13, -1, 14,
-+ -1, 11, -1, 12, -1, 16, -1, 15, -1, 26,
-+ -1, 19, -1, 20, -1, 17, -1, 18, -1, 22,
-+ -1, 21, -1, 27, -1, 30, -1, 31, -1, 28,
-+ -1, 29, -1, 50, -1, 48, -1, 39, -1, 52,
-+ -1, 33, 51, -1, 34, 51, -1, 35, 51, -1,
-+ 36, 51, -1, 51, -1, 32, 51, -1, 37, -1,
-+ 38, -1
-+};
-+
-+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-+static const unsigned short int yyrline[] =
-+{
-+ 0, 135, 135, 141, 148, 152, 156, 160, 164, 171,
-+ 175, 182, 186, 190, 195, 199, 208, 217, 221, 225,
-+ 229, 233, 238, 243, 251, 252, 253, 254, 255, 256,
-+ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266,
-+ 267, 268, 272, 276, 283, 292, 296, 305, 314, 327,
-+ 339, 346, 360, 369
-+};
-+#endif
-+
-+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-+static const char *const yytname[] =
-+{
-+ "$end", "error", "$undefined", "COND_SPACE", "COND_EOF", "COND_OR",
-+ "COND_AND", "COND_NOT", "COND_XOR", "COND_IMP", "COND_EQV", "COND_LT",
-+ "COND_GT", "COND_EQ", "COND_NE", "COND_GE", "COND_LE", "COND_ILT",
-+ "COND_IGT", "COND_IEQ", "COND_INE", "COND_IGE", "COND_ILE", "COND_LPAR",
-+ "COND_RPAR", "COND_TILDA", "COND_SS", "COND_ISS", "COND_ILHS",
-+ "COND_IRHS", "COND_LHS", "COND_RHS", "COND_PERCENT", "COND_DOLLARS",
-+ "COND_QUESTION", "COND_AMPER", "COND_EXCLAM", "COND_IDENT",
-+ "COND_NUMBER", "COND_LITER", "COND_ERROR", "$accept", "condition",
-+ "expression", "boolean_term", "boolean_factor", "operator", "value_s",
-+ "literal", "value_i", "symbol_s", "identifier", "integer", 0
-+};
-+#endif
-+
-+# ifdef YYPRINT
-+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-+ token YYLEX-NUM. */
-+static const unsigned short int yytoknum[] =
-+{
-+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
-+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
-+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
-+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
-+ 295
-+};
-+# endif
-+
-+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-+static const unsigned char yyr1[] =
-+{
-+ 0, 41, 42, 42, 43, 43, 43, 43, 43, 44,
-+ 44, 45, 45, 45, 45, 45, 45, 45, 45, 45,
-+ 45, 45, 45, 45, 46, 46, 46, 46, 46, 46,
-+ 46, 46, 46, 46, 46, 46, 46, 46, 46, 46,
-+ 46, 46, 47, 47, 48, 49, 49, 49, 49, 49,
-+ 50, 50, 51, 52
-+};
-+
-+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-+static const unsigned char yyr2[] =
-+{
-+ 0, 2, 1, 0, 1, 3, 3, 3, 3, 1,
-+ 3, 2, 1, 1, 3, 3, 3, 3, 3, 3,
-+ 3, 3, 3, 3, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-+ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
-+ 1, 2, 1, 1
-+};
-+
-+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
-+ means the default is an error. */
-+static const unsigned char yydefact[] =
-+{
-+ 3, 0, 0, 0, 0, 0, 0, 0, 52, 53,
-+ 44, 0, 2, 4, 9, 13, 43, 12, 42, 50,
-+ 45, 11, 0, 51, 46, 47, 48, 49, 1, 0,
-+ 0, 0, 0, 0, 26, 27, 24, 25, 29, 28,
-+ 33, 34, 31, 32, 36, 35, 30, 37, 40, 41,
-+ 38, 39, 0, 0, 0, 23, 5, 7, 6, 8,
-+ 10, 20, 21, 19, 22, 14, 16, 18, 15, 17
-+};
-+
-+/* YYDEFGOTO[NTERM-NUM]. */
-+static const yysigned_char yydefgoto[] =
-+{
-+ -1, 11, 12, 13, 14, 52, 15, 16, 17, 18,
-+ 19, 20
-+};
-+
-+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+ STATE-NUM. */
-+#define YYPACT_NINF -15
-+static const yysigned_char yypact[] =
-+{
-+ -7, -7, -7, -14, -14, -14, -14, -14, -15, -15,
-+ -15, 24, 46, 30, -15, -15, -9, -9, -9, -15,
-+ -15, -15, 29, -15, -15, -15, -15, -15, -15, -7,
-+ -7, -7, -7, -7, -15, -15, -15, -15, -15, -15,
-+ -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
-+ -15, -15, 8, 8, 8, -15, 30, 30, 30, 30,
-+ -15, -15, -15, -15, -15, -15, -15, -15, -15, -15
-+};
-+
-+/* YYPGOTO[NTERM-NUM]. */
-+static const yysigned_char yypgoto[] =
-+{
-+ -15, -15, 50, 33, 0, -3, -15, -4, 14, 17,
-+ 54, -15
-+};
-+
-+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
-+ positive, shift that token. If negative, reduce the rule which
-+ number is the opposite. If zero, do what YYDEFACT says.
-+ If YYTABLE_NINF, syntax error. */
-+#define YYTABLE_NINF -1
-+static const unsigned char yytable[] =
-+{
-+ 1, 21, 34, 35, 36, 37, 38, 39, 40, 41,
-+ 42, 43, 44, 45, 53, 54, 2, 46, 47, 48,
-+ 49, 50, 51, 8, 28, 3, 4, 5, 6, 7,
-+ 8, 9, 10, 60, 29, 0, 33, 30, 31, 32,
-+ 3, 4, 5, 6, 7, 8, 9, 10, 61, 64,
-+ 67, 29, 22, 55, 30, 31, 32, 23, 24, 25,
-+ 26, 27, 56, 57, 58, 59, 62, 65, 68, 63,
-+ 66, 69
-+};
-+
-+static const yysigned_char yycheck[] =
-+{
-+ 7, 1, 11, 12, 13, 14, 15, 16, 17, 18,
-+ 19, 20, 21, 22, 17, 18, 23, 26, 27, 28,
-+ 29, 30, 31, 37, 0, 32, 33, 34, 35, 36,
-+ 37, 38, 39, 33, 5, -1, 6, 8, 9, 10,
-+ 32, 33, 34, 35, 36, 37, 38, 39, 52, 53,
-+ 54, 5, 2, 24, 8, 9, 10, 3, 4, 5,
-+ 6, 7, 29, 30, 31, 32, 52, 53, 54, 52,
-+ 53, 54
-+};
-+
-+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+ symbol of state STATE-NUM. */
-+static const unsigned char yystos[] =
-+{
-+ 0, 7, 23, 32, 33, 34, 35, 36, 37, 38,
-+ 39, 42, 43, 44, 45, 47, 48, 49, 50, 51,
-+ 52, 45, 43, 51, 51, 51, 51, 51, 0, 5,
-+ 8, 9, 10, 6, 11, 12, 13, 14, 15, 16,
-+ 17, 18, 19, 20, 21, 22, 26, 27, 28, 29,
-+ 30, 31, 46, 46, 46, 24, 44, 44, 44, 44,
-+ 45, 48, 49, 50, 48, 49, 50, 48, 49, 50
-+};
-+
-+#define yyerrok (yyerrstatus = 0)
-+#define yyclearin (yychar = YYEMPTY)
-+#define YYEMPTY (-2)
-+#define YYEOF 0
-+
-+#define YYACCEPT goto yyacceptlab
-+#define YYABORT goto yyabortlab
-+#define YYERROR goto yyerrorlab
-+
-+
-+/* Like YYERROR except do call yyerror. This remains here temporarily
-+ to ease the transition to the new meaning of YYERROR, for GCC.
-+ Once GCC version 2 has supplanted version 1, this can go. */
-+
-+#define YYFAIL goto yyerrlab
-+
-+#define YYRECOVERING() (!!yyerrstatus)
-+
-+#define YYBACKUP(Token, Value) \
-+do \
-+ if (yychar == YYEMPTY && yylen == 1) \
-+ { \
-+ yychar = (Token); \
-+ yylval = (Value); \
-+ yytoken = YYTRANSLATE (yychar); \
-+ YYPOPSTACK; \
-+ goto yybackup; \
-+ } \
-+ else \
-+ { \
-+ yyerror (YY_("syntax error: cannot back up")); \
-+ YYERROR; \
-+ } \
-+while (0)
-+
-+
-+#define YYTERROR 1
-+#define YYERRCODE 256
-+
-+
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+ If N is 0, then set CURRENT to the empty location which ends
-+ the previous symbol: RHS[0] (always defined). */
-+
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N) \
-+ do \
-+ if (N) \
-+ { \
-+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
-+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
-+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
-+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
-+ } \
-+ else \
-+ { \
-+ (Current).first_line = (Current).last_line = \
-+ YYRHSLOC (Rhs, 0).last_line; \
-+ (Current).first_column = (Current).last_column = \
-+ YYRHSLOC (Rhs, 0).last_column; \
-+ } \
-+ while (0)
-+#endif
-+
-+
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+ This macro was not mandated originally: define only if we know
-+ we won't break user code: when these are the locations we know. */
-+
-+#ifndef YY_LOCATION_PRINT
-+# if YYLTYPE_IS_TRIVIAL
-+# define YY_LOCATION_PRINT(File, Loc) \
-+ fprintf (File, "%d.%d-%d.%d", \
-+ (Loc).first_line, (Loc).first_column, \
-+ (Loc).last_line, (Loc).last_column)
-+# else
-+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
-+#endif
-+
-+
-+/* YYLEX -- calling `yylex' with the right arguments. */
-+
-+#ifdef YYLEX_PARAM
-+# define YYLEX yylex (&yylval, YYLEX_PARAM)
-+#else
-+# define YYLEX yylex (&yylval)
-+#endif
-+
-+/* Enable debugging if requested. */
-+#if YYDEBUG
-+
-+# ifndef YYFPRINTF
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYFPRINTF fprintf
-+# endif
-+
-+# define YYDPRINTF(Args) \
-+do { \
-+ if (yydebug) \
-+ YYFPRINTF Args; \
-+} while (0)
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-+do { \
-+ if (yydebug) \
-+ { \
-+ YYFPRINTF (stderr, "%s ", Title); \
-+ yysymprint (stderr, \
-+ Type, Value); \
-+ YYFPRINTF (stderr, "\n"); \
-+ } \
-+} while (0)
-+
-+/*------------------------------------------------------------------.
-+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-+| TOP (included). |
-+`------------------------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_stack_print (short int *bottom, short int *top)
-+#else
-+static void
-+yy_stack_print (bottom, top)
-+ short int *bottom;
-+ short int *top;
-+#endif
-+{
-+ YYFPRINTF (stderr, "Stack now");
-+ for (/* Nothing. */; bottom <= top; ++bottom)
-+ YYFPRINTF (stderr, " %d", *bottom);
-+ YYFPRINTF (stderr, "\n");
-+}
-+
-+# define YY_STACK_PRINT(Bottom, Top) \
-+do { \
-+ if (yydebug) \
-+ yy_stack_print ((Bottom), (Top)); \
-+} while (0)
-+
-+
-+/*------------------------------------------------.
-+| Report that the YYRULE is going to be reduced. |
-+`------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_reduce_print (int yyrule)
-+#else
-+static void
-+yy_reduce_print (yyrule)
-+ int yyrule;
-+#endif
-+{
-+ int yyi;
-+ unsigned long int yylno = yyrline[yyrule];
-+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-+ yyrule - 1, yylno);
-+ /* Print the symbols being reduced, and their result. */
-+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-+ YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
-+}
-+
-+# define YY_REDUCE_PRINT(Rule) \
-+do { \
-+ if (yydebug) \
-+ yy_reduce_print (Rule); \
-+} while (0)
-+
-+/* Nonzero means print parse trace. It is left uninitialized so that
-+ multiple parsers can coexist. */
-+int yydebug;
-+#else /* !YYDEBUG */
-+# define YYDPRINTF(Args)
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-+# define YY_STACK_PRINT(Bottom, Top)
-+# define YY_REDUCE_PRINT(Rule)
-+#endif /* !YYDEBUG */
-+
-+
-+/* YYINITDEPTH -- initial size of the parser's stacks. */
-+#ifndef YYINITDEPTH
-+# define YYINITDEPTH 200
-+#endif
-+
-+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-+ if the built-in stack extension method is used).
-+
-+ Do not make this value too large; the results are undefined if
-+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-+ evaluated with infinite-precision integer arithmetic. */
-+
-+#ifndef YYMAXDEPTH
-+# define YYMAXDEPTH 10000
-+#endif
-+
-+
-+
-+#if YYERROR_VERBOSE
-+
-+# ifndef yystrlen
-+# if defined (__GLIBC__) && defined (_STRING_H)
-+# define yystrlen strlen
-+# else
-+/* Return the length of YYSTR. */
-+static YYSIZE_T
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystrlen (const char *yystr)
-+# else
-+yystrlen (yystr)
-+ const char *yystr;
-+# endif
-+{
-+ const char *yys = yystr;
-+
-+ while (*yys++ != '\0')
-+ continue;
-+
-+ return yys - yystr - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yystpcpy
-+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
-+# define yystpcpy stpcpy
-+# else
-+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-+ YYDEST. */
-+static char *
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystpcpy (char *yydest, const char *yysrc)
-+# else
-+yystpcpy (yydest, yysrc)
-+ char *yydest;
-+ const char *yysrc;
-+# endif
-+{
-+ char *yyd = yydest;
-+ const char *yys = yysrc;
-+
-+ while ((*yyd++ = *yys++) != '\0')
-+ continue;
-+
-+ return yyd - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yytnamerr
-+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-+ quotes and backslashes, so that it's suitable for yyerror. The
-+ heuristic is that double-quoting is unnecessary unless the string
-+ contains an apostrophe, a comma, or backslash (other than
-+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
-+ null, do not copy; instead, return the length of what the result
-+ would have been. */
-+static YYSIZE_T
-+yytnamerr (char *yyres, const char *yystr)
-+{
-+ if (*yystr == '"')
-+ {
-+ size_t yyn = 0;
-+ char const *yyp = yystr;
-+
-+ for (;;)
-+ switch (*++yyp)
-+ {
-+ case '\'':
-+ case ',':
-+ goto do_not_strip_quotes;
-+
-+ case '\\':
-+ if (*++yyp != '\\')
-+ goto do_not_strip_quotes;
-+ /* Fall through. */
-+ default:
-+ if (yyres)
-+ yyres[yyn] = *yyp;
-+ yyn++;
-+ break;
-+
-+ case '"':
-+ if (yyres)
-+ yyres[yyn] = '\0';
-+ return yyn;
-+ }
-+ do_not_strip_quotes: ;
-+ }
-+
-+ if (! yyres)
-+ return yystrlen (yystr);
-+
-+ return yystpcpy (yyres, yystr) - yyres;
-+}
-+# endif
-+
-+#endif /* YYERROR_VERBOSE */
-+
-+
-+
-+#if YYDEBUG
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT. |
-+`--------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yysymprint (yyoutput, yytype, yyvaluep)
-+ FILE *yyoutput;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (yytype < YYNTOKENS)
-+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-+ else
-+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+
-+
-+# ifdef YYPRINT
-+ if (yytype < YYNTOKENS)
-+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-+# endif
-+ switch (yytype)
-+ {
-+ default:
-+ break;
-+ }
-+ YYFPRINTF (yyoutput, ")");
-+}
-+
-+#endif /* ! YYDEBUG */
-+/*-----------------------------------------------.
-+| Release the memory associated to this symbol. |
-+`-----------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yydestruct (yymsg, yytype, yyvaluep)
-+ const char *yymsg;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (!yymsg)
-+ yymsg = "Deleting";
-+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+
-+ switch (yytype)
-+ {
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+/* Prevent warnings from -Wmissing-prototypes. */
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM);
-+# else
-+int yyparse ();
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void);
-+#else
-+int yyparse ();
-+#endif
-+#endif /* ! YYPARSE_PARAM */
-+
-+
-+
-+
-+
-+
-+/*----------.
-+| yyparse. |
-+`----------*/
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM)
-+# else
-+int yyparse (YYPARSE_PARAM)
-+ void *YYPARSE_PARAM;
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int
-+yyparse (void)
-+#else
-+int
-+yyparse ()
-+ ;
-+#endif
-+#endif
-+{
-+ /* The look-ahead symbol. */
-+int yychar;
-+
-+/* The semantic value of the look-ahead symbol. */
-+YYSTYPE yylval;
-+
-+/* Number of syntax errors so far. */
-+int yynerrs;
-+
-+ int yystate;
-+ int yyn;
-+ int yyresult;
-+ /* Number of tokens to shift before error messages enabled. */
-+ int yyerrstatus;
-+ /* Look-ahead token as an internal (translated) token number. */
-+ int yytoken = 0;
-+
-+ /* Three stacks and their tools:
-+ `yyss': related to states,
-+ `yyvs': related to semantic values,
-+ `yyls': related to locations.
-+
-+ Refer to the stacks thru separate pointers, to allow yyoverflow
-+ to reallocate them elsewhere. */
-+
-+ /* The state stack. */
-+ short int yyssa[YYINITDEPTH];
-+ short int *yyss = yyssa;
-+ short int *yyssp;
-+
-+ /* The semantic value stack. */
-+ YYSTYPE yyvsa[YYINITDEPTH];
-+ YYSTYPE *yyvs = yyvsa;
-+ YYSTYPE *yyvsp;
-+
-+
-+
-+#define YYPOPSTACK (yyvsp--, yyssp--)
-+
-+ YYSIZE_T yystacksize = YYINITDEPTH;
-+
-+ /* The variables used to return semantic value and location from the
-+ action routines. */
-+ YYSTYPE yyval;
-+
-+
-+ /* When reducing, the number of symbols on the RHS of the reduced
-+ rule. */
-+ int yylen;
-+
-+ YYDPRINTF ((stderr, "Starting parse\n"));
-+
-+ yystate = 0;
-+ yyerrstatus = 0;
-+ yynerrs = 0;
-+ yychar = YYEMPTY; /* Cause a token to be read. */
-+
-+ /* Initialize stack pointers.
-+ Waste one element of value and location stack
-+ so that they stay on the same level as the state stack.
-+ The wasted elements are never initialized. */
-+
-+ yyssp = yyss;
-+ yyvsp = yyvs;
-+
-+ goto yysetstate;
-+
-+/*------------------------------------------------------------.
-+| yynewstate -- Push a new state, which is found in yystate. |
-+`------------------------------------------------------------*/
-+ yynewstate:
-+ /* In all cases, when you get here, the value and location stacks
-+ have just been pushed. so pushing a state here evens the stacks.
-+ */
-+ yyssp++;
-+
-+ yysetstate:
-+ *yyssp = yystate;
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ {
-+ /* Get the current used size of the three stacks, in elements. */
-+ YYSIZE_T yysize = yyssp - yyss + 1;
-+
-+#ifdef yyoverflow
-+ {
-+ /* Give user a chance to reallocate the stack. Use copies of
-+ these so that the &'s don't force the real ones into
-+ memory. */
-+ YYSTYPE *yyvs1 = yyvs;
-+ short int *yyss1 = yyss;
-+
-+
-+ /* Each stack pointer address is followed by the size of the
-+ data in use in that stack, in bytes. This used to be a
-+ conditional around just the two extra args, but that might
-+ be undefined if yyoverflow is a macro. */
-+ yyoverflow (YY_("memory exhausted"),
-+ &yyss1, yysize * sizeof (*yyssp),
-+ &yyvs1, yysize * sizeof (*yyvsp),
-+
-+ &yystacksize);
-+
-+ yyss = yyss1;
-+ yyvs = yyvs1;
-+ }
-+#else /* no yyoverflow */
-+# ifndef YYSTACK_RELOCATE
-+ goto yyexhaustedlab;
-+# else
-+ /* Extend the stack our own way. */
-+ if (YYMAXDEPTH <= yystacksize)
-+ goto yyexhaustedlab;
-+ yystacksize *= 2;
-+ if (YYMAXDEPTH < yystacksize)
-+ yystacksize = YYMAXDEPTH;
-+
-+ {
-+ short int *yyss1 = yyss;
-+ union yyalloc *yyptr =
-+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+ if (! yyptr)
-+ goto yyexhaustedlab;
-+ YYSTACK_RELOCATE (yyss);
-+ YYSTACK_RELOCATE (yyvs);
-+
-+# undef YYSTACK_RELOCATE
-+ if (yyss1 != yyssa)
-+ YYSTACK_FREE (yyss1);
-+ }
-+# endif
-+#endif /* no yyoverflow */
-+
-+ yyssp = yyss + yysize - 1;
-+ yyvsp = yyvs + yysize - 1;
-+
-+
-+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-+ (unsigned long int) yystacksize));
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ YYABORT;
-+ }
-+
-+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-+
-+ goto yybackup;
-+
-+/*-----------.
-+| yybackup. |
-+`-----------*/
-+yybackup:
-+
-+/* Do appropriate processing given the current state. */
-+/* Read a look-ahead token if we need one and don't already have one. */
-+/* yyresume: */
-+
-+ /* First try to decide what to do without reference to look-ahead token. */
-+
-+ yyn = yypact[yystate];
-+ if (yyn == YYPACT_NINF)
-+ goto yydefault;
-+
-+ /* Not known => get a look-ahead token if don't already have one. */
-+
-+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
-+ if (yychar == YYEMPTY)
-+ {
-+ YYDPRINTF ((stderr, "Reading a token: "));
-+ yychar = YYLEX;
-+ }
-+
-+ if (yychar <= YYEOF)
-+ {
-+ yychar = yytoken = YYEOF;
-+ YYDPRINTF ((stderr, "Now at end of input.\n"));
-+ }
-+ else
-+ {
-+ yytoken = YYTRANSLATE (yychar);
-+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-+ }
-+
-+ /* If the proper action on seeing token YYTOKEN is to reduce or to
-+ detect an error, take that action. */
-+ yyn += yytoken;
-+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-+ goto yydefault;
-+ yyn = yytable[yyn];
-+ if (yyn <= 0)
-+ {
-+ if (yyn == 0 || yyn == YYTABLE_NINF)
-+ goto yyerrlab;
-+ yyn = -yyn;
-+ goto yyreduce;
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ /* Shift the look-ahead token. */
-+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-+
-+ /* Discard the token being shifted unless it is eof. */
-+ if (yychar != YYEOF)
-+ yychar = YYEMPTY;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Count tokens shifted since error; after three, turn off error
-+ status. */
-+ if (yyerrstatus)
-+ yyerrstatus--;
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-----------------------------------------------------------.
-+| yydefault -- do the default action for the current state. |
-+`-----------------------------------------------------------*/
-+yydefault:
-+ yyn = yydefact[yystate];
-+ if (yyn == 0)
-+ goto yyerrlab;
-+ goto yyreduce;
-+
-+
-+/*-----------------------------.
-+| yyreduce -- Do a reduction. |
-+`-----------------------------*/
-+yyreduce:
-+ /* yyn is the number of a rule to reduce with. */
-+ yylen = yyr2[yyn];
-+
-+ /* If YYLEN is nonzero, implement the default value of the action:
-+ `$$ = $1'.
-+
-+ Otherwise, the following line sets YYVAL to garbage.
-+ This behavior is undocumented and Bison
-+ users should not rely upon it. Assigning to YYVAL
-+ unconditionally makes the parser a bit smaller, and it avoids a
-+ GCC warning that YYVAL may be used uninitialized. */
-+ yyval = yyvsp[1-yylen];
-+
-+
-+ YY_REDUCE_PRINT (yyn);
-+ switch (yyn)
-+ {
-+ case 2:
-+#line 136 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ cond->result = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 3:
-+#line 141 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ cond->result = MSICONDITION_NONE;
-+ ;}
-+ break;
-+
-+ case 4:
-+#line 149 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 5:
-+#line 153 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[-2].value) || (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 6:
-+#line 157 "cond.y"
-+ {
-+ (yyval.value) = !(yyvsp[-2].value) || (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 7:
-+#line 161 "cond.y"
-+ {
-+ (yyval.value) = ( (yyvsp[-2].value) || (yyvsp[0].value) ) && !( (yyvsp[-2].value) && (yyvsp[0].value) );
-+ ;}
-+ break;
-+
-+ case 8:
-+#line 165 "cond.y"
-+ {
-+ (yyval.value) = ( (yyvsp[-2].value) && (yyvsp[0].value) ) || ( !(yyvsp[-2].value) && !(yyvsp[0].value) );
-+ ;}
-+ break;
-+
-+ case 9:
-+#line 172 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 10:
-+#line 176 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[-2].value) && (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 11:
-+#line 183 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value) ? 0 : 1;
-+ ;}
-+ break;
-+
-+ case 12:
-+#line 187 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value) ? 1 : 0;
-+ ;}
-+ break;
-+
-+ case 13:
-+#line 191 "cond.y"
-+ {
-+ (yyval.value) = ((yyvsp[0].string) && (yyvsp[0].string)[0]) ? 1 : 0;
-+ msi_free((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 14:
-+#line 196 "cond.y"
-+ {
-+ (yyval.value) = compare_int( (yyvsp[-2].value), (yyvsp[-1].value), (yyvsp[0].value) );
-+ ;}
-+ break;
-+
-+ case 15:
-+#line 200 "cond.y"
-+ {
-+ int num;
-+ if (num_from_prop( (yyvsp[-2].string), &num ))
-+ (yyval.value) = compare_int( num, (yyvsp[-1].value), (yyvsp[0].value) );
-+ else
-+ (yyval.value) = ((yyvsp[-1].value) == COND_NE || (yyvsp[-1].value) == COND_INE );
-+ msi_free((yyvsp[-2].string));
-+ ;}
-+ break;
-+
-+ case 16:
-+#line 209 "cond.y"
-+ {
-+ int num;
-+ if (num_from_prop( (yyvsp[0].string), &num ))
-+ (yyval.value) = compare_int( (yyvsp[-2].value), (yyvsp[-1].value), num );
-+ else
-+ (yyval.value) = ((yyvsp[-1].value) == COND_NE || (yyvsp[-1].value) == COND_INE );
-+ msi_free((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 17:
-+#line 218 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
-+ ;}
-+ break;
-+
-+ case 18:
-+#line 222 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
-+ ;}
-+ break;
-+
-+ case 19:
-+#line 226 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), TRUE );
-+ ;}
-+ break;
-+
-+ case 20:
-+#line 230 "cond.y"
-+ {
-+ (yyval.value) = compare_and_free_strings( (yyvsp[-2].string), (yyvsp[-1].value), (yyvsp[0].string), FALSE );
-+ ;}
-+ break;
-+
-+ case 21:
-+#line 234 "cond.y"
-+ {
-+ (yyval.value) = 0;
-+ msi_free((yyvsp[-2].string));
-+ ;}
-+ break;
-+
-+ case 22:
-+#line 239 "cond.y"
-+ {
-+ (yyval.value) = 0;
-+ msi_free((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 23:
-+#line 244 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[-1].value);
-+ ;}
-+ break;
-+
-+ case 24:
-+#line 251 "cond.y"
-+ { (yyval.value) = COND_EQ; ;}
-+ break;
-+
-+ case 25:
-+#line 252 "cond.y"
-+ { (yyval.value) = COND_NE; ;}
-+ break;
-+
-+ case 26:
-+#line 253 "cond.y"
-+ { (yyval.value) = COND_LT; ;}
-+ break;
-+
-+ case 27:
-+#line 254 "cond.y"
-+ { (yyval.value) = COND_GT; ;}
-+ break;
-+
-+ case 28:
-+#line 255 "cond.y"
-+ { (yyval.value) = COND_LE; ;}
-+ break;
-+
-+ case 29:
-+#line 256 "cond.y"
-+ { (yyval.value) = COND_GE; ;}
-+ break;
-+
-+ case 30:
-+#line 257 "cond.y"
-+ { (yyval.value) = COND_SS; ;}
-+ break;
-+
-+ case 31:
-+#line 258 "cond.y"
-+ { (yyval.value) = COND_IEQ; ;}
-+ break;
-+
-+ case 32:
-+#line 259 "cond.y"
-+ { (yyval.value) = COND_INE; ;}
-+ break;
-+
-+ case 33:
-+#line 260 "cond.y"
-+ { (yyval.value) = COND_ILT; ;}
-+ break;
-+
-+ case 34:
-+#line 261 "cond.y"
-+ { (yyval.value) = COND_IGT; ;}
-+ break;
-+
-+ case 35:
-+#line 262 "cond.y"
-+ { (yyval.value) = COND_ILE; ;}
-+ break;
-+
-+ case 36:
-+#line 263 "cond.y"
-+ { (yyval.value) = COND_IGE; ;}
-+ break;
-+
-+ case 37:
-+#line 264 "cond.y"
-+ { (yyval.value) = COND_ISS; ;}
-+ break;
-+
-+ case 38:
-+#line 265 "cond.y"
-+ { (yyval.value) = COND_LHS; ;}
-+ break;
-+
-+ case 39:
-+#line 266 "cond.y"
-+ { (yyval.value) = COND_RHS; ;}
-+ break;
-+
-+ case 40:
-+#line 267 "cond.y"
-+ { (yyval.value) = COND_ILHS; ;}
-+ break;
-+
-+ case 41:
-+#line 268 "cond.y"
-+ { (yyval.value) = COND_IRHS; ;}
-+ break;
-+
-+ case 42:
-+#line 273 "cond.y"
-+ {
-+ (yyval.string) = (yyvsp[0].string);
-+ ;}
-+ break;
-+
-+ case 43:
-+#line 277 "cond.y"
-+ {
-+ (yyval.string) = (yyvsp[0].string);
-+ ;}
-+ break;
-+
-+ case 44:
-+#line 284 "cond.y"
-+ {
-+ (yyval.string) = COND_GetLiteral(&(yyvsp[0].str));
-+ if( !(yyval.string) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 45:
-+#line 293 "cond.y"
-+ {
-+ (yyval.value) = (yyvsp[0].value);
-+ ;}
-+ break;
-+
-+ case 46:
-+#line 297 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetComponentStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ (yyval.value) = action;
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 47:
-+#line 306 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetComponentStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ (yyval.value) = install;
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 48:
-+#line 315 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetFeatureStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ if (action == INSTALLSTATE_UNKNOWN)
-+ (yyval.value) = MSICONDITION_FALSE;
-+ else
-+ (yyval.value) = action;
-+
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 49:
-+#line 328 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+ INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
-+
-+ MSI_GetFeatureStateW(cond->package, (yyvsp[0].string), &install, &action );
-+ (yyval.value) = install;
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 50:
-+#line 340 "cond.y"
-+ {
-+ COND_input* cond = (COND_input*) info;
-+
-+ (yyval.string) = msi_dup_property( cond->package, (yyvsp[0].string) );
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 51:
-+#line 347 "cond.y"
-+ {
-+ UINT len = GetEnvironmentVariableW( (yyvsp[0].string), NULL, 0 );
-+ (yyval.string) = NULL;
-+ if (len++)
-+ {
-+ (yyval.string) = msi_alloc( len*sizeof (WCHAR) );
-+ GetEnvironmentVariableW( (yyvsp[0].string), (yyval.string), len );
-+ }
-+ msi_free( (yyvsp[0].string) );
-+ ;}
-+ break;
-+
-+ case 52:
-+#line 361 "cond.y"
-+ {
-+ (yyval.string) = COND_GetString(&(yyvsp[0].str));
-+ if( !(yyval.string) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 53:
-+#line 370 "cond.y"
-+ {
-+ LPWSTR szNum = COND_GetString(&(yyvsp[0].str));
-+ if( !szNum )
-+ YYABORT;
-+ (yyval.value) = atoiW( szNum );
-+ msi_free( szNum );
-+ ;}
-+ break;
-+
-+
-+ default: break;
-+ }
-+
-+/* Line 1126 of yacc.c. */
-+#line 1740 "cond.tab.c"
-+
-+ yyvsp -= yylen;
-+ yyssp -= yylen;
-+
-+
-+ YY_STACK_PRINT (yyss, yyssp);
-+
-+ *++yyvsp = yyval;
-+
-+
-+ /* Now `shift' the result of the reduction. Determine what state
-+ that goes to, based on the state we popped back to and the rule
-+ number reduced by. */
-+
-+ yyn = yyr1[yyn];
-+
-+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-+ yystate = yytable[yystate];
-+ else
-+ yystate = yydefgoto[yyn - YYNTOKENS];
-+
-+ goto yynewstate;
-+
-+
-+/*------------------------------------.
-+| yyerrlab -- here on detecting error |
-+`------------------------------------*/
-+yyerrlab:
-+ /* If not already recovering from an error, report this error. */
-+ if (!yyerrstatus)
-+ {
-+ ++yynerrs;
-+#if YYERROR_VERBOSE
-+ yyn = yypact[yystate];
-+
-+ if (YYPACT_NINF < yyn && yyn < YYLAST)
-+ {
-+ int yytype = YYTRANSLATE (yychar);
-+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-+ YYSIZE_T yysize = yysize0;
-+ YYSIZE_T yysize1;
-+ int yysize_overflow = 0;
-+ char *yymsg = 0;
-+# define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-+ int yyx;
-+
-+#if 0
-+ /* This is so xgettext sees the translatable formats that are
-+ constructed on the fly. */
-+ YY_("syntax error, unexpected %s");
-+ YY_("syntax error, unexpected %s, expecting %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-+#endif
-+ char *yyfmt;
-+ char const *yyf;
-+ static char const yyunexpected[] = "syntax error, unexpected %s";
-+ static char const yyexpecting[] = ", expecting %s";
-+ static char const yyor[] = " or %s";
-+ char yyformat[sizeof yyunexpected
-+ + sizeof yyexpecting - 1
-+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-+ * (sizeof yyor - 1))];
-+ char const *yyprefix = yyexpecting;
-+
-+ /* Start YYX at -YYN if negative to avoid negative indexes in
-+ YYCHECK. */
-+ int yyxbegin = yyn < 0 ? -yyn : 0;
-+
-+ /* Stay within bounds of both yycheck and yytname. */
-+ int yychecklim = YYLAST - yyn;
-+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-+ int yycount = 1;
-+
-+ yyarg[0] = yytname[yytype];
-+ yyfmt = yystpcpy (yyformat, yyunexpected);
-+
-+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-+ {
-+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-+ {
-+ yycount = 1;
-+ yysize = yysize0;
-+ yyformat[sizeof yyunexpected - 1] = '\0';
-+ break;
-+ }
-+ yyarg[yycount++] = yytname[yyx];
-+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+ yyfmt = yystpcpy (yyfmt, yyprefix);
-+ yyprefix = yyor;
-+ }
-+
-+ yyf = YY_(yyformat);
-+ yysize1 = yysize + yystrlen (yyf);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+
-+ if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-+ yymsg = (char *) YYSTACK_ALLOC (yysize);
-+ if (yymsg)
-+ {
-+ /* Avoid sprintf, as that infringes on the user's name space.
-+ Don't have undefined behavior even if the translation
-+ produced a string with the wrong number of "%s"s. */
-+ char *yyp = yymsg;
-+ int yyi = 0;
-+ while ((*yyp = *yyf))
-+ {
-+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-+ {
-+ yyp += yytnamerr (yyp, yyarg[yyi++]);
-+ yyf += 2;
-+ }
-+ else
-+ {
-+ yyp++;
-+ yyf++;
-+ }
-+ }
-+ yyerror (yymsg);
-+ YYSTACK_FREE (yymsg);
-+ }
-+ else
-+ {
-+ yyerror (YY_("syntax error"));
-+ goto yyexhaustedlab;
-+ }
-+ }
-+ else
-+#endif /* YYERROR_VERBOSE */
-+ yyerror (YY_("syntax error"));
-+ }
-+
-+
-+
-+ if (yyerrstatus == 3)
-+ {
-+ /* If just tried and failed to reuse look-ahead token after an
-+ error, discard it. */
-+
-+ if (yychar <= YYEOF)
-+ {
-+ /* Return failure if at end of input. */
-+ if (yychar == YYEOF)
-+ YYABORT;
-+ }
-+ else
-+ {
-+ yydestruct ("Error: discarding", yytoken, &yylval);
-+ yychar = YYEMPTY;
-+ }
-+ }
-+
-+ /* Else will try to reuse look-ahead token after shifting the error
-+ token. */
-+ goto yyerrlab1;
-+
-+
-+/*---------------------------------------------------.
-+| yyerrorlab -- error raised explicitly by YYERROR. |
-+`---------------------------------------------------*/
-+yyerrorlab:
-+
-+ /* Pacify compilers like GCC when the user code never invokes
-+ YYERROR and the label yyerrorlab therefore never appears in user
-+ code. */
-+ if (0)
-+ goto yyerrorlab;
-+
-+yyvsp -= yylen;
-+ yyssp -= yylen;
-+ yystate = *yyssp;
-+ goto yyerrlab1;
-+
-+
-+/*-------------------------------------------------------------.
-+| yyerrlab1 -- common code for both syntax error and YYERROR. |
-+`-------------------------------------------------------------*/
-+yyerrlab1:
-+ yyerrstatus = 3; /* Each real token shifted decrements this. */
-+
-+ for (;;)
-+ {
-+ yyn = yypact[yystate];
-+ if (yyn != YYPACT_NINF)
-+ {
-+ yyn += YYTERROR;
-+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-+ {
-+ yyn = yytable[yyn];
-+ if (0 < yyn)
-+ break;
-+ }
-+ }
-+
-+ /* Pop the current state because it cannot handle the error token. */
-+ if (yyssp == yyss)
-+ YYABORT;
-+
-+
-+ yydestruct ("Error: popping", yystos[yystate], yyvsp);
-+ YYPOPSTACK;
-+ yystate = *yyssp;
-+ YY_STACK_PRINT (yyss, yyssp);
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Shift the error token. */
-+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-------------------------------------.
-+| yyacceptlab -- YYACCEPT comes here. |
-+`-------------------------------------*/
-+yyacceptlab:
-+ yyresult = 0;
-+ goto yyreturn;
-+
-+/*-----------------------------------.
-+| yyabortlab -- YYABORT comes here. |
-+`-----------------------------------*/
-+yyabortlab:
-+ yyresult = 1;
-+ goto yyreturn;
-+
-+#ifndef yyoverflow
-+/*-------------------------------------------------.
-+| yyexhaustedlab -- memory exhaustion comes here. |
-+`-------------------------------------------------*/
-+yyexhaustedlab:
-+ yyerror (YY_("memory exhausted"));
-+ yyresult = 2;
-+ /* Fall through. */
-+#endif
-+
-+yyreturn:
-+ if (yychar != YYEOF && yychar != YYEMPTY)
-+ yydestruct ("Cleanup: discarding lookahead",
-+ yytoken, &yylval);
-+ while (yyssp != yyss)
-+ {
-+ yydestruct ("Cleanup: popping",
-+ yystos[*yyssp], yyvsp);
-+ YYPOPSTACK;
-+ }
-+#ifndef yyoverflow
-+ if (yyss != yyssa)
-+ YYSTACK_FREE (yyss);
-+#endif
-+ return yyresult;
-+}
-+
-+
-+#line 379 "cond.y"
-+
-+
-+
-+static int COND_IsAlpha( WCHAR x )
-+{
-+ return( ( ( x >= 'A' ) && ( x <= 'Z' ) ) ||
-+ ( ( x >= 'a' ) && ( x <= 'z' ) ) ||
-+ ( ( x == '_' ) ) );
-+}
-+
-+static int COND_IsNumber( WCHAR x )
-+{
-+ return( (( x >= '0' ) && ( x <= '9' )) || (x =='-') || (x =='.') );
-+}
-+
-+static WCHAR *strstriW( const WCHAR *str, const WCHAR *sub )
-+{
-+ LPWSTR strlower, sublower, r;
-+ strlower = CharLowerW( strdupW( str ) );
-+ sublower = CharLowerW( strdupW( sub ) );
-+ r = strstrW( strlower, sublower );
-+ if (r)
-+ r = (LPWSTR)str + (r - strlower);
-+ msi_free( strlower );
-+ msi_free( sublower );
-+ return r;
-+}
-+
-+static BOOL str_is_number( LPCWSTR str )
-+{
-+ int i;
-+
-+ if (!*str)
-+ return FALSE;
-+
-+ for (i = 0; i < lstrlenW( str ); i++)
-+ if (!isdigitW(str[i]))
-+ return FALSE;
-+
-+ return TRUE;
-+}
-+
-+static INT compare_substring( LPCWSTR a, INT operator, LPCWSTR b )
-+{
-+ int lhs, rhs;
-+
-+ /* substring operators return 0 if LHS is missing */
-+ if (!a || !*a)
-+ return 0;
-+
-+ /* substring operators return 1 if RHS is missing */
-+ if (!b || !*b)
-+ return 1;
-+
-+ /* if both strings contain only numbers, use integer comparison */
-+ lhs = atoiW(a);
-+ rhs = atoiW(b);
-+ if (str_is_number(a) && str_is_number(b))
-+ return compare_int( lhs, operator, rhs );
-+
-+ switch (operator)
-+ {
-+ case COND_SS:
-+ return strstrW( a, b ) ? 1 : 0;
-+ case COND_ISS:
-+ return strstriW( a, b ) ? 1 : 0;
-+ case COND_LHS:
-+ return 0 == strncmpW( a, b, lstrlenW( b ) );
-+ case COND_RHS:
-+ return 0 == lstrcmpW( a + (lstrlenW( a ) - lstrlenW( b )), b );
-+ case COND_ILHS:
-+ return 0 == strncmpiW( a, b, lstrlenW( b ) );
-+ case COND_IRHS:
-+ return 0 == lstrcmpiW( a + (lstrlenW( a ) - lstrlenW( b )), b );
-+ default:
-+ ERR("invalid substring operator\n");
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+static INT compare_string( LPCWSTR a, INT operator, LPCWSTR b, BOOL convert )
-+{
-+ if (operator >= COND_SS && operator <= COND_RHS)
-+ return compare_substring( a, operator, b );
-+
-+ /* null and empty string are equivalent */
-+ if (!a) a = szEmpty;
-+ if (!b) b = szEmpty;
-+
-+ if (convert && str_is_number(a) && str_is_number(b))
-+ return compare_int( atoiW(a), operator, atoiW(b) );
-+
-+ /* a or b may be NULL */
-+ switch (operator)
-+ {
-+ case COND_LT:
-+ return -1 == lstrcmpW( a, b );
-+ case COND_GT:
-+ return 1 == lstrcmpW( a, b );
-+ case COND_EQ:
-+ return 0 == lstrcmpW( a, b );
-+ case COND_NE:
-+ return 0 != lstrcmpW( a, b );
-+ case COND_GE:
-+ return -1 != lstrcmpW( a, b );
-+ case COND_LE:
-+ return 1 != lstrcmpW( a, b );
-+ case COND_ILT:
-+ return -1 == lstrcmpiW( a, b );
-+ case COND_IGT:
-+ return 1 == lstrcmpiW( a, b );
-+ case COND_IEQ:
-+ return 0 == lstrcmpiW( a, b );
-+ case COND_INE:
-+ return 0 != lstrcmpiW( a, b );
-+ case COND_IGE:
-+ return -1 != lstrcmpiW( a, b );
-+ case COND_ILE:
-+ return 1 != lstrcmpiW( a, b );
-+ default:
-+ ERR("invalid string operator\n");
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+
-+static INT compare_int( INT a, INT operator, INT b )
-+{
-+ switch (operator)
-+ {
-+ case COND_LT:
-+ case COND_ILT:
-+ return a < b;
-+ case COND_GT:
-+ case COND_IGT:
-+ return a > b;
-+ case COND_EQ:
-+ case COND_IEQ:
-+ return a == b;
-+ case COND_NE:
-+ case COND_INE:
-+ return a != b;
-+ case COND_GE:
-+ case COND_IGE:
-+ return a >= b;
-+ case COND_LE:
-+ case COND_ILE:
-+ return a <= b;
-+ case COND_SS:
-+ case COND_ISS:
-+ return ( a & b ) ? 1 : 0;
-+ case COND_RHS:
-+ return ( ( a & 0xffff ) == b ) ? 1 : 0;
-+ case COND_LHS:
-+ return ( ( (a>>16) & 0xffff ) == b ) ? 1 : 0;
-+ default:
-+ ERR("invalid integer operator\n");
-+ return 0;
-+ }
-+ return 0;
-+}
-+
-+
-+static int COND_IsIdent( WCHAR x )
-+{
-+ return( COND_IsAlpha( x ) || COND_IsNumber( x ) || ( x == '_' )
-+ || ( x == '#' ) || (x == '.') );
-+}
-+
-+static int COND_GetOperator( COND_input *cond )
-+{
-+ static const struct {
-+ const WCHAR str[4];
-+ int id;
-+ } table[] = {
-+ { {'~','=',0}, COND_IEQ },
-+ { {'~','<','=',0}, COND_ILE },
-+ { {'~','>','<',0}, COND_ISS },
-+ { {'~','>','>',0}, COND_IRHS },
-+ { {'~','<','>',0}, COND_INE },
-+ { {'~','<',0}, COND_ILT },
-+ { {'~','>','=',0}, COND_IGE },
-+ { {'~','<','<',0}, COND_ILHS },
-+ { {'~','>',0}, COND_IGT },
-+ { {'>','=',0}, COND_GE },
-+ { {'>','<',0}, COND_SS },
-+ { {'<','<',0}, COND_LHS },
-+ { {'<','>',0}, COND_NE },
-+ { {'<','=',0}, COND_LE },
-+ { {'>','>',0}, COND_RHS },
-+ { {'>',0}, COND_GT },
-+ { {'<',0}, COND_LT },
-+ { {0}, 0 }
-+ };
-+ LPCWSTR p = &cond->str[cond->n];
-+ int i = 0, len;
-+
-+ while ( 1 )
-+ {
-+ len = lstrlenW( table[i].str );
-+ if ( !len || 0 == strncmpW( table[i].str, p, len ) )
-+ break;
-+ i++;
-+ }
-+ cond->n += len;
-+ return table[i].id;
-+}
-+
-+static int COND_GetOne( struct cond_str *str, COND_input *cond )
-+{
-+ int rc, len = 1;
-+ WCHAR ch;
-+
-+ str->data = &cond->str[cond->n];
-+
-+ ch = str->data[0];
-+
-+ switch( ch )
-+ {
-+ case 0: return 0;
-+ case '(': rc = COND_LPAR; break;
-+ case ')': rc = COND_RPAR; break;
-+ case '&': rc = COND_AMPER; break;
-+ case '!': rc = COND_EXCLAM; break;
-+ case '$': rc = COND_DOLLARS; break;
-+ case '?': rc = COND_QUESTION; break;
-+ case '%': rc = COND_PERCENT; break;
-+ case ' ': rc = COND_SPACE; break;
-+ case '=': rc = COND_EQ; break;
-+
-+ case '~':
-+ case '<':
-+ case '>':
-+ rc = COND_GetOperator( cond );
-+ if (!rc)
-+ rc = COND_ERROR;
-+ return rc;
-+ default:
-+ rc = 0;
-+ }
-+
-+ if ( rc )
-+ {
-+ cond->n += len;
-+ return rc;
-+ }
-+
-+ if (ch == '"' )
-+ {
-+ LPCWSTR p = strchrW( str->data + 1, '"' );
-+ if (!p)
-+ return COND_ERROR;
-+ len = p - str->data + 1;
-+ rc = COND_LITER;
-+ }
-+ else if( COND_IsAlpha( ch ) )
-+ {
-+ static const WCHAR szNot[] = {'N','O','T',0};
-+ static const WCHAR szAnd[] = {'A','N','D',0};
-+ static const WCHAR szXor[] = {'X','O','R',0};
-+ static const WCHAR szEqv[] = {'E','Q','V',0};
-+ static const WCHAR szImp[] = {'I','M','P',0};
-+ static const WCHAR szOr[] = {'O','R',0};
-+
-+ while( COND_IsIdent( str->data[len] ) )
-+ len++;
-+ rc = COND_IDENT;
-+
-+ if ( len == 3 )
-+ {
-+ if ( !strncmpiW( str->data, szNot, len ) )
-+ rc = COND_NOT;
-+ else if( !strncmpiW( str->data, szAnd, len ) )
-+ rc = COND_AND;
-+ else if( !strncmpiW( str->data, szXor, len ) )
-+ rc = COND_XOR;
-+ else if( !strncmpiW( str->data, szEqv, len ) )
-+ rc = COND_EQV;
-+ else if( !strncmpiW( str->data, szImp, len ) )
-+ rc = COND_IMP;
-+ }
-+ else if( (len == 2) && !strncmpiW( str->data, szOr, len ) )
-+ rc = COND_OR;
-+ }
-+ else if( COND_IsNumber( ch ) )
-+ {
-+ while( COND_IsNumber( str->data[len] ) )
-+ len++;
-+ rc = COND_NUMBER;
-+ }
-+ else
-+ {
-+ ERR("Got unknown character %c(%x)\n",ch,ch);
-+ return COND_ERROR;
-+ }
-+
-+ cond->n += len;
-+ str->len = len;
-+
-+ return rc;
-+}
-+
-+static int cond_lex( void *COND_lval, COND_input *cond )
-+{
-+ int rc;
-+ struct cond_str *str = COND_lval;
-+
-+ do {
-+ rc = COND_GetOne( str, cond );
-+ } while (rc == COND_SPACE);
-+
-+ return rc;
-+}
-+
-+static LPWSTR COND_GetString( const struct cond_str *str )
-+{
-+ LPWSTR ret;
-+
-+ ret = msi_alloc( (str->len+1) * sizeof (WCHAR) );
-+ if( ret )
-+ {
-+ memcpy( ret, str->data, str->len * sizeof(WCHAR));
-+ ret[str->len]=0;
-+ }
-+ TRACE("Got identifier %s\n",debugstr_w(ret));
-+ return ret;
-+}
-+
-+static LPWSTR COND_GetLiteral( const struct cond_str *str )
-+{
-+ LPWSTR ret;
-+
-+ ret = msi_alloc( (str->len-1) * sizeof (WCHAR) );
-+ if( ret )
-+ {
-+ memcpy( ret, str->data+1, (str->len-2) * sizeof(WCHAR) );
-+ ret[str->len - 2]=0;
-+ }
-+ TRACE("Got literal %s\n",debugstr_w(ret));
-+ return ret;
-+}
-+
-+static int cond_error(const char *str)
-+{
-+ TRACE("%s\n", str );
-+ return 0;
-+}
-+
-+MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *package, LPCWSTR szCondition )
-+{
-+ COND_input cond;
-+ MSICONDITION r;
-+
-+ TRACE("%s\n", debugstr_w( szCondition ) );
-+
-+ if ( szCondition == NULL )
-+ return MSICONDITION_NONE;
-+
-+ cond.package = package;
-+ cond.str = szCondition;
-+ cond.n = 0;
-+ cond.result = MSICONDITION_ERROR;
-+
-+ if ( !cond_parse( &cond ) )
-+ r = cond.result;
-+ else
-+ r = MSICONDITION_ERROR;
-+
-+ TRACE("%i <- %s\n", r, debugstr_w(szCondition));
-+ return r;
-+}
-+
-+MSICONDITION WINAPI MsiEvaluateConditionW( MSIHANDLE hInstall, LPCWSTR szCondition )
-+{
-+ MSIPACKAGE *package;
-+ UINT ret;
-+
-+ package = msihandle2msiinfo( hInstall, MSIHANDLETYPE_PACKAGE);
-+ if( !package )
-+ {
-+ HRESULT hr;
-+ BSTR condition;
-+ IWineMsiRemotePackage *remote_package;
-+
-+ remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall );
-+ if (!remote_package)
-+ return MSICONDITION_ERROR;
-+
-+ condition = SysAllocString( szCondition );
-+ if (!condition)
-+ {
-+ IWineMsiRemotePackage_Release( remote_package );
-+ return ERROR_OUTOFMEMORY;
-+ }
-+
-+ hr = IWineMsiRemotePackage_EvaluateCondition( remote_package, condition );
-+
-+ SysFreeString( condition );
-+ IWineMsiRemotePackage_Release( remote_package );
-+
-+ if (FAILED(hr))
-+ {
-+ if (HRESULT_FACILITY(hr) == FACILITY_WIN32)
-+ return HRESULT_CODE(hr);
-+
-+ return ERROR_FUNCTION_FAILED;
-+ }
-+
-+ return ERROR_SUCCESS;
-+ }
-+
-+ ret = MSI_EvaluateConditionW( package, szCondition );
-+ msiobj_release( &package->hdr );
-+ return ret;
-+}
-+
-+MSICONDITION WINAPI MsiEvaluateConditionA( MSIHANDLE hInstall, LPCSTR szCondition )
-+{
-+ LPWSTR szwCond = NULL;
-+ MSICONDITION r;
-+
-+ szwCond = strdupAtoW( szCondition );
-+ if( szCondition && !szwCond )
-+ return MSICONDITION_ERROR;
-+
-+ r = MsiEvaluateConditionW( hInstall, szwCond );
-+ msi_free( szwCond );
-+ return r;
-+}
-+
-Index: cond.tab.h
-===================================================================
---- cond.tab.h (revision 31639)
-+++ cond.tab.h (working copy)
-@@ -0,0 +1,132 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ 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, 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., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ COND_SPACE = 258,
-+ COND_EOF = 259,
-+ COND_OR = 260,
-+ COND_AND = 261,
-+ COND_NOT = 262,
-+ COND_XOR = 263,
-+ COND_IMP = 264,
-+ COND_EQV = 265,
-+ COND_LT = 266,
-+ COND_GT = 267,
-+ COND_EQ = 268,
-+ COND_NE = 269,
-+ COND_GE = 270,
-+ COND_LE = 271,
-+ COND_ILT = 272,
-+ COND_IGT = 273,
-+ COND_IEQ = 274,
-+ COND_INE = 275,
-+ COND_IGE = 276,
-+ COND_ILE = 277,
-+ COND_LPAR = 278,
-+ COND_RPAR = 279,
-+ COND_TILDA = 280,
-+ COND_SS = 281,
-+ COND_ISS = 282,
-+ COND_ILHS = 283,
-+ COND_IRHS = 284,
-+ COND_LHS = 285,
-+ COND_RHS = 286,
-+ COND_PERCENT = 287,
-+ COND_DOLLARS = 288,
-+ COND_QUESTION = 289,
-+ COND_AMPER = 290,
-+ COND_EXCLAM = 291,
-+ COND_IDENT = 292,
-+ COND_NUMBER = 293,
-+ COND_LITER = 294,
-+ COND_ERROR = 295
-+ };
-+#endif
-+/* Tokens. */
-+#define COND_SPACE 258
-+#define COND_EOF 259
-+#define COND_OR 260
-+#define COND_AND 261
-+#define COND_NOT 262
-+#define COND_XOR 263
-+#define COND_IMP 264
-+#define COND_EQV 265
-+#define COND_LT 266
-+#define COND_GT 267
-+#define COND_EQ 268
-+#define COND_NE 269
-+#define COND_GE 270
-+#define COND_LE 271
-+#define COND_ILT 272
-+#define COND_IGT 273
-+#define COND_IEQ 274
-+#define COND_INE 275
-+#define COND_IGE 276
-+#define COND_ILE 277
-+#define COND_LPAR 278
-+#define COND_RPAR 279
-+#define COND_TILDA 280
-+#define COND_SS 281
-+#define COND_ISS 282
-+#define COND_ILHS 283
-+#define COND_IRHS 284
-+#define COND_LHS 285
-+#define COND_RHS 286
-+#define COND_PERCENT 287
-+#define COND_DOLLARS 288
-+#define COND_QUESTION 289
-+#define COND_AMPER 290
-+#define COND_EXCLAM 291
-+#define COND_IDENT 292
-+#define COND_NUMBER 293
-+#define COND_LITER 294
-+#define COND_ERROR 295
-+
-+
-+
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 111 "cond.y"
-+typedef union YYSTYPE {
-+ struct cond_str str;
-+ LPWSTR string;
-+ INT value;
-+} YYSTYPE;
-+/* Line 1447 of yacc.c. */
-+#line 124 "cond.tab.h"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+
-+
-Index: msi.rbuild
-===================================================================
---- msi.rbuild (revision 31639)
-+++ msi.rbuild (working copy)
-@@ -14,6 +14,7 @@
- appsearch.c
- automation.c
- classes.c
-+ cond.tab.c
- create.c
- custom.c
- database.c
-@@ -40,6 +41,7 @@
- script.c
- select.c
- source.c
-+ sql.tab.c
- streams.c
- string.c
- suminfo.c
-Index: msi_Ja.rc
-===================================================================
---- msi_Ja.rc (revision 31639)
-+++ msi_Ja.rc (working copy)
-@@ -0,0 +1,13 @@
-+LANGUAGE LANG_JAPANESE, SUBLANG_NEUTRAL
-+
-+STRINGTABLE DISCARDABLE
-+{
-+ 5 "pX %s ‚Ş‚Ý‚Â‚©‚č‚Ü‚ą‚ń‚Ĺ‚µ‚˝"
-+ 9 "fBXN %s ‚đ‘}“ü‚µ‚Ä‚‚ľ‚ł‚˘"
-+ 10 "–łŚř‚Čp‰[^‚Ĺ‚·"
-+ 11 "%s ‚Ě‚ ‚étH‹_‚đ“ü—Í‚µ‚Ä‚‚ľ‚ł‚˘"
-+ 12 "‹@”\\‚ĚC“Xg[‹Śł‚Ş‚ ‚č‚Ü‚ą‚ń"
-+ 13 "‹@”\\‚Ş‚ ‚élbgŹ[N h‰Cu‚Ş‚ ‚č‚Ü‚ą‚ń"
-+ 14 "‹@”\\‚̏ꏊ:"
-+ 15 "%s ‚Ě‚ ‚étH‹_‚đ‘I‘đ‚µ‚Ä‚‚ľ‚ł‚˘"
-+}
-Index: regsvr.c
-===================================================================
---- regsvr.c (revision 31639)
-+++ regsvr.c (working copy)
-@@ -40,6 +40,7 @@
- #include "msi.h"
- #include "initguid.h"
- #include "msipriv.h"
-+#include "msiserver.h"
-
- WINE_DEFAULT_DEBUG_CHANNEL(msi);
-
-Index: sql.tab.c
-===================================================================
---- sql.tab.c (revision 31639)
-+++ sql.tab.c (working copy)
-@@ -0,0 +1,2579 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ 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, 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., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Written by Richard Stallman by simplifying the original so called
-+ ``semantic'' parser. */
-+
-+/* All symbols defined below should begin with yy or YY, to avoid
-+ infringing on user name space. This should be done even for local
-+ variables, as they might otherwise be expanded by user macros.
-+ There are some unavoidable exceptions within include files to
-+ define necessary library symbols; they are noted "INFRINGES ON
-+ USER NAME SPACE" below. */
-+
-+/* Identify Bison output. */
-+#define YYBISON 1
-+
-+/* Bison version. */
-+#define YYBISON_VERSION "2.1"
-+
-+/* Skeleton name. */
-+#define YYSKELETON_NAME "yacc.c"
-+
-+/* Pure parsers. */
-+#define YYPURE 1
-+
-+/* Using locations. */
-+#define YYLSP_NEEDED 0
-+
-+/* Substitute the variable and function names. */
-+#define yyparse sql_parse
-+#define yylex sql_lex
-+#define yyerror sql_error
-+#define yylval sql_lval
-+#define yychar sql_char
-+#define yydebug sql_debug
-+#define yynerrs sql_nerrs
-+
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ TK_ALTER = 258,
-+ TK_AND = 259,
-+ TK_BY = 260,
-+ TK_CHAR = 261,
-+ TK_COMMA = 262,
-+ TK_CREATE = 263,
-+ TK_DELETE = 264,
-+ TK_DISTINCT = 265,
-+ TK_DOT = 266,
-+ TK_EQ = 267,
-+ TK_FREE = 268,
-+ TK_FROM = 269,
-+ TK_GE = 270,
-+ TK_GT = 271,
-+ TK_HOLD = 272,
-+ TK_ADD = 273,
-+ TK_ID = 274,
-+ TK_ILLEGAL = 275,
-+ TK_INSERT = 276,
-+ TK_INT = 277,
-+ TK_INTEGER = 278,
-+ TK_INTO = 279,
-+ TK_IS = 280,
-+ TK_KEY = 281,
-+ TK_LE = 282,
-+ TK_LONG = 283,
-+ TK_LONGCHAR = 284,
-+ TK_LP = 285,
-+ TK_LT = 286,
-+ TK_LOCALIZABLE = 287,
-+ TK_MINUS = 288,
-+ TK_NE = 289,
-+ TK_NOT = 290,
-+ TK_NULL = 291,
-+ TK_OBJECT = 292,
-+ TK_OR = 293,
-+ TK_ORDER = 294,
-+ TK_PRIMARY = 295,
-+ TK_RP = 296,
-+ TK_SELECT = 297,
-+ TK_SET = 298,
-+ TK_SHORT = 299,
-+ TK_SPACE = 300,
-+ TK_STAR = 301,
-+ TK_STRING = 302,
-+ TK_TABLE = 303,
-+ TK_TEMPORARY = 304,
-+ TK_UPDATE = 305,
-+ TK_VALUES = 306,
-+ TK_WHERE = 307,
-+ TK_WILDCARD = 308,
-+ COLUMN = 310,
-+ FUNCTION = 311,
-+ COMMENT = 312,
-+ UNCLOSED_STRING = 313,
-+ SPACE = 314,
-+ ILLEGAL = 315,
-+ END_OF_FILE = 316,
-+ TK_LIKE = 317,
-+ TK_NEGATION = 318
-+ };
-+#endif
-+/* Tokens. */
-+#define TK_ALTER 258
-+#define TK_AND 259
-+#define TK_BY 260
-+#define TK_CHAR 261
-+#define TK_COMMA 262
-+#define TK_CREATE 263
-+#define TK_DELETE 264
-+#define TK_DISTINCT 265
-+#define TK_DOT 266
-+#define TK_EQ 267
-+#define TK_FREE 268
-+#define TK_FROM 269
-+#define TK_GE 270
-+#define TK_GT 271
-+#define TK_HOLD 272
-+#define TK_ADD 273
-+#define TK_ID 274
-+#define TK_ILLEGAL 275
-+#define TK_INSERT 276
-+#define TK_INT 277
-+#define TK_INTEGER 278
-+#define TK_INTO 279
-+#define TK_IS 280
-+#define TK_KEY 281
-+#define TK_LE 282
-+#define TK_LONG 283
-+#define TK_LONGCHAR 284
-+#define TK_LP 285
-+#define TK_LT 286
-+#define TK_LOCALIZABLE 287
-+#define TK_MINUS 288
-+#define TK_NE 289
-+#define TK_NOT 290
-+#define TK_NULL 291
-+#define TK_OBJECT 292
-+#define TK_OR 293
-+#define TK_ORDER 294
-+#define TK_PRIMARY 295
-+#define TK_RP 296
-+#define TK_SELECT 297
-+#define TK_SET 298
-+#define TK_SHORT 299
-+#define TK_SPACE 300
-+#define TK_STAR 301
-+#define TK_STRING 302
-+#define TK_TABLE 303
-+#define TK_TEMPORARY 304
-+#define TK_UPDATE 305
-+#define TK_VALUES 306
-+#define TK_WHERE 307
-+#define TK_WILDCARD 308
-+#define COLUMN 310
-+#define FUNCTION 311
-+#define COMMENT 312
-+#define UNCLOSED_STRING 313
-+#define SPACE 314
-+#define ILLEGAL 315
-+#define END_OF_FILE 316
-+#define TK_LIKE 317
-+#define TK_NEGATION 318
-+
-+
-+
-+
-+/* Copy the first part of user declarations. */
-+#line 1 "sql.y"
-+
-+
-+/*
-+ * Implementation of the Microsoft Installer (msi.dll)
-+ *
-+ * Copyright 2002-2004 Mike McCormack for CodeWeavers
-+ *
-+ * This library is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU Lesser General Public
-+ * License as published by the Free Software Foundation; either
-+ * version 2.1 of the License, or (at your option) any later version.
-+ *
-+ * This library is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-+ * Lesser General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU Lesser General Public
-+ * License along with this library; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
-+ */
-+
-+
-+#include "config.h"
-+
-+#include
-+#include
-+#include
-+
-+#include "windef.h"
-+#include "winbase.h"
-+#include "query.h"
-+#include "wine/list.h"
-+#include "wine/debug.h"
-+
-+#define YYLEX_PARAM info
-+#define YYPARSE_PARAM info
-+
-+static int sql_error(const char *str);
-+
-+WINE_DEFAULT_DEBUG_CHANNEL(msi);
-+
-+typedef struct tag_SQL_input
-+{
-+ MSIDATABASE *db;
-+ LPCWSTR command;
-+ DWORD n, len;
-+ MSIVIEW **view; /* view structure for the resulting query */
-+ struct list *mem;
-+} SQL_input;
-+
-+static LPWSTR SQL_getstring( void *info, const struct sql_str *str );
-+static INT SQL_getint( void *info );
-+static int sql_lex( void *SQL_lval, SQL_input *info );
-+
-+static LPWSTR parser_add_table( LPWSTR list, LPWSTR table );
-+static void *parser_alloc( void *info, unsigned int sz );
-+static column_info *parser_alloc_column( void *info, LPCWSTR table, LPCWSTR column );
-+
-+static BOOL SQL_MarkPrimaryKeys( column_info *cols, column_info *keys);
-+
-+static struct expr * EXPR_complex( void *info, struct expr *l, UINT op, struct expr *r );
-+static struct expr * EXPR_unary( void *info, struct expr *l, UINT op );
-+static struct expr * EXPR_column( void *info, const column_info *column );
-+static struct expr * EXPR_ival( void *info, int val );
-+static struct expr * EXPR_sval( void *info, const struct sql_str *str );
-+static struct expr * EXPR_wildcard( void *info );
-+
-+
-+
-+/* Enabling traces. */
-+#ifndef YYDEBUG
-+# define YYDEBUG 0
-+#endif
-+
-+/* Enabling verbose error messages. */
-+#ifdef YYERROR_VERBOSE
-+# undef YYERROR_VERBOSE
-+# define YYERROR_VERBOSE 1
-+#else
-+# define YYERROR_VERBOSE 0
-+#endif
-+
-+/* Enabling the token table. */
-+#ifndef YYTOKEN_TABLE
-+# define YYTOKEN_TABLE 0
-+#endif
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 74 "sql.y"
-+typedef union YYSTYPE {
-+ struct sql_str str;
-+ LPWSTR string;
-+ column_info *column_list;
-+ MSIVIEW *query;
-+ struct expr *expr;
-+ USHORT column_type;
-+ int integer;
-+} YYSTYPE;
-+/* Line 196 of yacc.c. */
-+#line 297 "sql.tab.c"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+/* Copy the second part of user declarations. */
-+
-+
-+/* Line 219 of yacc.c. */
-+#line 309 "sql.tab.c"
-+
-+#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
-+# define YYSIZE_T __SIZE_TYPE__
-+#endif
-+#if ! defined (YYSIZE_T) && defined (size_t)
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T) && (defined (__STDC__) || defined (__cplusplus))
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYSIZE_T size_t
-+#endif
-+#if ! defined (YYSIZE_T)
-+# define YYSIZE_T unsigned int
-+#endif
-+
-+#ifndef YY_
-+# if YYENABLE_NLS
-+# if ENABLE_NLS
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YY_(msgid) dgettext ("bison-runtime", msgid)
-+# endif
-+# endif
-+# ifndef YY_
-+# define YY_(msgid) msgid
-+# endif
-+#endif
-+
-+#if ! defined (yyoverflow) || YYERROR_VERBOSE
-+
-+/* The parser invokes alloca or malloc; define the necessary symbols. */
-+
-+# ifdef YYSTACK_USE_ALLOCA
-+# if YYSTACK_USE_ALLOCA
-+# ifdef __GNUC__
-+# define YYSTACK_ALLOC __builtin_alloca
-+# else
-+# define YYSTACK_ALLOC alloca
-+# if defined (__STDC__) || defined (__cplusplus)
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYINCLUDED_STDLIB_H
-+# endif
-+# endif
-+# endif
-+# endif
-+
-+# ifdef YYSTACK_ALLOC
-+ /* Pacify GCC's `empty if-body' warning. */
-+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+ /* The OS might guarantee only one guard page at the bottom of the stack,
-+ and a page size can be as small as 4096 bytes. So we cannot safely
-+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
-+ to allow for a few compiler-allocated temporary stack slots. */
-+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2005 */
-+# endif
-+# else
-+# define YYSTACK_ALLOC YYMALLOC
-+# define YYSTACK_FREE YYFREE
-+# ifndef YYSTACK_ALLOC_MAXIMUM
-+# define YYSTACK_ALLOC_MAXIMUM ((YYSIZE_T) -1)
-+# endif
-+# ifdef __cplusplus
-+extern "C" {
-+# endif
-+# ifndef YYMALLOC
-+# define YYMALLOC malloc
-+# if (! defined (malloc) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifndef YYFREE
-+# define YYFREE free
-+# if (! defined (free) && ! defined (YYINCLUDED_STDLIB_H) \
-+ && (defined (__STDC__) || defined (__cplusplus)))
-+void free (void *); /* INFRINGES ON USER NAME SPACE */
-+# endif
-+# endif
-+# ifdef __cplusplus
-+}
-+# endif
-+# endif
-+#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
-+
-+
-+#if (! defined (yyoverflow) \
-+ && (! defined (__cplusplus) \
-+ || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
-+
-+/* A type that is properly aligned for any stack member. */
-+union yyalloc
-+{
-+ short int yyss;
-+ YYSTYPE yyvs;
-+ };
-+
-+/* The size of the maximum gap between one aligned stack and the next. */
-+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
-+
-+/* The size of an array large to enough to hold all stacks, each with
-+ N elements. */
-+# define YYSTACK_BYTES(N) \
-+ ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \
-+ + YYSTACK_GAP_MAXIMUM)
-+
-+/* Copy COUNT objects from FROM to TO. The source and destination do
-+ not overlap. */
-+# ifndef YYCOPY
-+# if defined (__GNUC__) && 1 < __GNUC__
-+# define YYCOPY(To, From, Count) \
-+ __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
-+# else
-+# define YYCOPY(To, From, Count) \
-+ do \
-+ { \
-+ YYSIZE_T yyi; \
-+ for (yyi = 0; yyi < (Count); yyi++) \
-+ (To)[yyi] = (From)[yyi]; \
-+ } \
-+ while (0)
-+# endif
-+# endif
-+
-+/* Relocate STACK from its old location to the new one. The
-+ local variables YYSIZE and YYSTACKSIZE give the old and new number of
-+ elements in the stack, and YYPTR gives the new location of the
-+ stack. Advance YYPTR to a properly aligned location for the next
-+ stack. */
-+# define YYSTACK_RELOCATE(Stack) \
-+ do \
-+ { \
-+ YYSIZE_T yynewbytes; \
-+ YYCOPY (&yyptr->Stack, Stack, yysize); \
-+ Stack = &yyptr->Stack; \
-+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
-+ yyptr += yynewbytes / sizeof (*yyptr); \
-+ } \
-+ while (0)
-+
-+#endif
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+ typedef signed char yysigned_char;
-+#else
-+ typedef short int yysigned_char;
-+#endif
-+
-+/* YYFINAL -- State number of the termination state. */
-+#define YYFINAL 32
-+/* YYLAST -- Last index in YYTABLE. */
-+#define YYLAST 138
-+
-+/* YYNTOKENS -- Number of terminals. */
-+#define YYNTOKENS 64
-+/* YYNNTS -- Number of nonterminals. */
-+#define YYNNTS 34
-+/* YYNRULES -- Number of rules. */
-+#define YYNRULES 79
-+/* YYNRULES -- Number of states. */
-+#define YYNSTATES 141
-+
-+/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
-+#define YYUNDEFTOK 2
-+#define YYMAXUTOK 318
-+
-+#define YYTRANSLATE(YYX) \
-+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
-+
-+/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
-+static const unsigned char yytranslate[] =
-+{
-+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
-+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
-+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
-+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
-+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
-+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
-+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
-+ 55, 56, 57, 58, 59, 60, 61, 62, 63
-+};
-+
-+#if YYDEBUG
-+/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
-+ YYRHS. */
-+static const unsigned short int yyprhs[] =
-+{
-+ 0, 0, 3, 5, 7, 9, 11, 13, 15, 17,
-+ 28, 40, 47, 55, 62, 67, 70, 75, 81, 88,
-+ 90, 92, 97, 101, 103, 106, 108, 111, 114, 116,
-+ 120, 122, 127, 129, 131, 133, 135, 137, 139, 144,
-+ 146, 149, 153, 156, 158, 162, 164, 166, 170, 173,
-+ 176, 178, 182, 186, 190, 194, 198, 202, 206, 210,
-+ 214, 218, 222, 227, 229, 231, 233, 237, 239, 243,
-+ 247, 249, 252, 254, 256, 258, 262, 264, 266, 268
-+};
-+
-+/* YYRHS -- A `-1'-separated list of the rules' RHS. */
-+static const yysigned_char yyrhs[] =
-+{
-+ 65, 0, -1, 66, -1, 80, -1, 68, -1, 67,
-+ -1, 69, -1, 70, -1, 71, -1, 21, 24, 95,
-+ 30, 83, 41, 51, 30, 89, 41, -1, 21, 24,
-+ 95, 30, 83, 41, 51, 30, 89, 41, 49, -1,
-+ 8, 48, 95, 30, 73, 41, -1, 8, 48, 95,
-+ 30, 73, 41, 17, -1, 50, 95, 43, 90, 52,
-+ 87, -1, 50, 95, 43, 90, -1, 9, 84, -1,
-+ 3, 48, 95, 72, -1, 3, 48, 95, 18, 75,
-+ -1, 3, 48, 95, 18, 75, 17, -1, 17, -1,
-+ 13, -1, 74, 40, 26, 83, -1, 74, 7, 75,
-+ -1, 75, -1, 94, 76, -1, 77, -1, 77, 32,
-+ -1, 77, 49, -1, 78, -1, 78, 35, 36, -1,
-+ 6, -1, 6, 30, 79, 41, -1, 29, -1, 44,
-+ -1, 22, -1, 28, -1, 37, -1, 97, -1, 81,
-+ 39, 5, 83, -1, 81, -1, 42, 82, -1, 42,
-+ 10, 82, -1, 83, 84, -1, 94, -1, 94, 7,
-+ 83, -1, 46, -1, 85, -1, 85, 52, 87, -1,
-+ 14, 95, -1, 14, 86, -1, 95, -1, 95, 7,
-+ 86, -1, 30, 87, 41, -1, 87, 4, 87, -1,
-+ 87, 38, 87, -1, 93, 12, 88, -1, 93, 16,
-+ 88, -1, 93, 31, 88, -1, 93, 27, 88, -1,
-+ 93, 15, 88, -1, 93, 34, 88, -1, 93, 25,
-+ 36, -1, 93, 25, 35, 36, -1, 93, -1, 92,
-+ -1, 92, -1, 92, 7, 89, -1, 91, -1, 91,
-+ 7, 90, -1, 94, 12, 92, -1, 97, -1, 33,
-+ 97, -1, 47, -1, 53, -1, 94, -1, 95, 11,
-+ 96, -1, 96, -1, 96, -1, 19, -1, 23, -1
-+};
-+
-+/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
-+static const unsigned short int yyrline[] =
-+{
-+ 0, 124, 124, 132, 133, 134, 135, 136, 137, 141,
-+ 151, 164, 176, 191, 201, 214, 227, 237, 247, 260,
-+ 264, 271, 281, 291, 298, 307, 311, 315, 322, 326,
-+ 333, 337, 341, 345, 349, 353, 357, 364, 373, 386,
-+ 390, 394, 410, 431, 432, 436, 443, 444, 460, 470,
-+ 483, 488, 497, 503, 509, 515, 521, 527, 533, 539,
-+ 545, 551, 557, 566, 567, 571, 578, 589, 590, 598,
-+ 606, 612, 618, 624, 633, 642, 648, 657, 664, 673
-+};
-+#endif
-+
-+#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
-+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
-+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */
-+static const char *const yytname[] =
-+{
-+ "$end", "error", "$undefined", "TK_ALTER", "TK_AND", "TK_BY", "TK_CHAR",
-+ "TK_COMMA", "TK_CREATE", "TK_DELETE", "TK_DISTINCT", "TK_DOT", "TK_EQ",
-+ "TK_FREE", "TK_FROM", "TK_GE", "TK_GT", "TK_HOLD", "TK_ADD", "TK_ID",
-+ "TK_ILLEGAL", "TK_INSERT", "TK_INT", "TK_INTEGER", "TK_INTO", "TK_IS",
-+ "TK_KEY", "TK_LE", "TK_LONG", "TK_LONGCHAR", "TK_LP", "TK_LT",
-+ "TK_LOCALIZABLE", "TK_MINUS", "TK_NE", "TK_NOT", "TK_NULL", "TK_OBJECT",
-+ "TK_OR", "TK_ORDER", "TK_PRIMARY", "TK_RP", "TK_SELECT", "TK_SET",
-+ "TK_SHORT", "TK_SPACE", "TK_STAR", "TK_STRING", "TK_TABLE",
-+ "TK_TEMPORARY", "TK_UPDATE", "TK_VALUES", "TK_WHERE", "TK_WILDCARD",
-+ "AGG_FUNCTION.", "COLUMN", "FUNCTION", "COMMENT", "UNCLOSED_STRING",
-+ "SPACE", "ILLEGAL", "END_OF_FILE", "TK_LIKE", "TK_NEGATION", "$accept",
-+ "query", "onequery", "oneinsert", "onecreate", "oneupdate", "onedelete",
-+ "onealter", "alterop", "table_def", "column_def", "column_and_type",
-+ "column_type", "data_type_l", "data_type", "data_count", "oneselect",
-+ "unorderedsel", "selectfrom", "selcollist", "from", "fromtable",
-+ "tablelist", "expr", "val", "constlist", "update_assign_list",
-+ "column_assignment", "const_val", "column_val", "column", "table", "id",
-+ "number", 0
-+};
-+#endif
-+
-+# ifdef YYPRINT
-+/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
-+ token YYLEX-NUM. */
-+static const unsigned short int yytoknum[] =
-+{
-+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
-+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
-+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
-+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
-+ 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
-+ 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
-+ 315, 316, 317, 318
-+};
-+# endif
-+
-+/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
-+static const unsigned char yyr1[] =
-+{
-+ 0, 64, 65, 66, 66, 66, 66, 66, 66, 67,
-+ 67, 68, 68, 69, 69, 70, 71, 71, 71, 72,
-+ 72, 73, 74, 74, 75, 76, 76, 76, 77, 77,
-+ 78, 78, 78, 78, 78, 78, 78, 79, 80, 80,
-+ 81, 81, 82, 83, 83, 83, 84, 84, 85, 85,
-+ 86, 86, 87, 87, 87, 87, 87, 87, 87, 87,
-+ 87, 87, 87, 88, 88, 89, 89, 90, 90, 91,
-+ 92, 92, 92, 92, 93, 94, 94, 95, 96, 97
-+};
-+
-+/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
-+static const unsigned char yyr2[] =
-+{
-+ 0, 2, 1, 1, 1, 1, 1, 1, 1, 10,
-+ 11, 6, 7, 6, 4, 2, 4, 5, 6, 1,
-+ 1, 4, 3, 1, 2, 1, 2, 2, 1, 3,
-+ 1, 4, 1, 1, 1, 1, 1, 1, 4, 1,
-+ 2, 3, 2, 1, 3, 1, 1, 3, 2, 2,
-+ 1, 3, 3, 3, 3, 3, 3, 3, 3, 3,
-+ 3, 3, 4, 1, 1, 1, 3, 1, 3, 3,
-+ 1, 2, 1, 1, 1, 3, 1, 1, 1, 1
-+};
-+
-+/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
-+ STATE-NUM when YYTABLE doesn't specify something else to do. Zero
-+ means the default is an error. */
-+static const unsigned char yydefact[] =
-+{
-+ 0, 0, 0, 0, 0, 0, 0, 0, 2, 5,
-+ 4, 6, 7, 8, 3, 39, 0, 0, 0, 15,
-+ 46, 0, 0, 78, 45, 40, 0, 43, 0, 76,
-+ 0, 77, 1, 0, 0, 0, 49, 48, 0, 0,
-+ 41, 42, 0, 0, 0, 0, 20, 19, 0, 16,
-+ 0, 0, 0, 47, 0, 74, 0, 44, 75, 14,
-+ 67, 0, 38, 17, 0, 0, 0, 23, 51, 50,
-+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-+ 0, 0, 0, 0, 18, 30, 34, 35, 32, 36,
-+ 33, 24, 25, 28, 11, 0, 0, 52, 53, 54,
-+ 79, 0, 72, 73, 55, 64, 63, 70, 59, 56,
-+ 0, 61, 58, 57, 60, 0, 13, 68, 69, 0,
-+ 26, 27, 0, 12, 22, 0, 71, 62, 0, 0,
-+ 37, 29, 21, 0, 31, 0, 65, 9, 0, 10,
-+ 66
-+};
-+
-+/* YYDEFGOTO[NTERM-NUM]. */
-+static const short int yydefgoto[] =
-+{
-+ -1, 7, 8, 9, 10, 11, 12, 13, 49, 65,
-+ 66, 63, 91, 92, 93, 129, 14, 15, 25, 26,
-+ 19, 20, 36, 53, 104, 135, 59, 60, 105, 106,
-+ 55, 28, 29, 107
-+};
-+
-+/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
-+ STATE-NUM. */
-+#define YYPACT_NINF -96
-+static const yysigned_char yypact[] =
-+{
-+ 0, -43, -34, 4, 24, 1, 6, 19, -96, -96,
-+ -96, -96, -96, -96, -96, 31, 6, 6, 6, -96,
-+ 30, 6, 35, -96, -96, -96, 4, 67, 47, 65,
-+ 42, -96, -96, 81, 101, 59, -96, 89, 48, 68,
-+ -96, -96, 35, 6, 6, 35, -96, -96, 6, -96,
-+ 6, 6, 48, 3, 76, -96, 35, -96, -96, 45,
-+ 95, 93, -96, 98, 43, 75, 22, -96, -96, 89,
-+ 18, 48, 48, 13, 13, 13, -23, 13, 13, 13,
-+ 80, 48, 6, 46, -96, 87, -96, -96, -96, -96,
-+ -96, -96, 51, 71, 105, 6, 97, -96, -96, 120,
-+ -96, 102, -96, -96, -96, -96, -96, -96, -96, -96,
-+ 90, -96, -96, -96, -96, 77, 3, -96, -96, 102,
-+ -96, -96, 91, -96, -96, 35, -96, -96, 99, 92,
-+ -96, -96, -96, 46, -96, 94, 123, 82, 46, -96,
-+ -96
-+};
-+
-+/* YYPGOTO[NTERM-NUM]. */
-+static const yysigned_char yypgoto[] =
-+{
-+ -96, -96, -96, -96, -96, -96, -96, -96, -96, -96,
-+ -96, -40, -96, -96, -96, -96, -96, -96, 110, -41,
-+ 108, -96, 85, 23, 34, -1, 56, -96, -81, -8,
-+ -5, 17, 10, -95
-+};
-+
-+/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
-+ positive, shift that token. If negative, reduce the rule which
-+ number is the opposite. If zero, do what YYDEFACT says.
-+ If YYTABLE_NINF, syntax error. */
-+#define YYTABLE_NINF -78
-+static const short int yytable[] =
-+{
-+ 27, 57, 118, 1, 62, 16, 126, 71, 2, 3,
-+ 67, 22, 110, 111, 17, 80, 31, 27, 18, 32,
-+ 23, 4, 71, 30, 130, 23, 31, 31, 31, 95,
-+ 54, 31, 23, 34, 35, 37, 100, 27, 39, 61,
-+ 27, 72, 5, 64, 54, 64, 101, 24, 21, 85,
-+ 6, 27, 136, 58, 23, 124, 72, 136, 43, 97,
-+ 102, 31, 96, 54, 54, 86, 103, 23, 69, 100,
-+ 33, 87, 88, 54, 42, 70, -77, 61, 52, 101,
-+ 89, 24, 38, 120, 132, 44, 45, 90, 73, 50,
-+ 64, 74, 75, 102, 98, 99, 51, 81, 56, 103,
-+ 121, 76, 82, 77, 116, 83, 122, 78, 108, 109,
-+ 79, 112, 113, 114, 46, 84, 94, 119, 47, 48,
-+ 27, 115, 123, 125, 71, 100, 127, 131, 128, 133,
-+ 138, 139, 40, 134, 41, 137, 68, 140, 117
-+};
-+
-+static const unsigned char yycheck[] =
-+{
-+ 5, 42, 83, 3, 45, 48, 101, 4, 8, 9,
-+ 50, 10, 35, 36, 48, 56, 6, 22, 14, 0,
-+ 19, 21, 4, 6, 119, 19, 16, 17, 18, 7,
-+ 38, 21, 19, 16, 17, 18, 23, 42, 21, 44,
-+ 45, 38, 42, 48, 52, 50, 33, 46, 24, 6,
-+ 50, 56, 133, 43, 19, 95, 38, 138, 11, 41,
-+ 47, 51, 40, 71, 72, 22, 53, 19, 51, 23,
-+ 39, 28, 29, 81, 7, 52, 11, 82, 30, 33,
-+ 37, 46, 52, 32, 125, 43, 5, 44, 12, 30,
-+ 95, 15, 16, 47, 71, 72, 7, 52, 30, 53,
-+ 49, 25, 7, 27, 81, 12, 35, 31, 74, 75,
-+ 34, 77, 78, 79, 13, 17, 41, 30, 17, 18,
-+ 125, 41, 17, 26, 4, 23, 36, 36, 51, 30,
-+ 7, 49, 22, 41, 26, 41, 51, 138, 82
-+};
-+
-+/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
-+ symbol of state STATE-NUM. */
-+static const unsigned char yystos[] =
-+{
-+ 0, 3, 8, 9, 21, 42, 50, 65, 66, 67,
-+ 68, 69, 70, 71, 80, 81, 48, 48, 14, 84,
-+ 85, 24, 10, 19, 46, 82, 83, 94, 95, 96,
-+ 95, 96, 0, 39, 95, 95, 86, 95, 52, 95,
-+ 82, 84, 7, 11, 43, 5, 13, 17, 18, 72,
-+ 30, 7, 30, 87, 93, 94, 30, 83, 96, 90,
-+ 91, 94, 83, 75, 94, 73, 74, 75, 86, 95,
-+ 87, 4, 38, 12, 15, 16, 25, 27, 31, 34,
-+ 83, 52, 7, 12, 17, 6, 22, 28, 29, 37,
-+ 44, 76, 77, 78, 41, 7, 40, 41, 87, 87,
-+ 23, 33, 47, 53, 88, 92, 93, 97, 88, 88,
-+ 35, 36, 88, 88, 88, 41, 87, 90, 92, 30,
-+ 32, 49, 35, 17, 75, 26, 97, 36, 51, 79,
-+ 97, 36, 83, 30, 41, 89, 92, 41, 7, 49,
-+ 89
-+};
-+
-+#define yyerrok (yyerrstatus = 0)
-+#define yyclearin (yychar = YYEMPTY)
-+#define YYEMPTY (-2)
-+#define YYEOF 0
-+
-+#define YYACCEPT goto yyacceptlab
-+#define YYABORT goto yyabortlab
-+#define YYERROR goto yyerrorlab
-+
-+
-+/* Like YYERROR except do call yyerror. This remains here temporarily
-+ to ease the transition to the new meaning of YYERROR, for GCC.
-+ Once GCC version 2 has supplanted version 1, this can go. */
-+
-+#define YYFAIL goto yyerrlab
-+
-+#define YYRECOVERING() (!!yyerrstatus)
-+
-+#define YYBACKUP(Token, Value) \
-+do \
-+ if (yychar == YYEMPTY && yylen == 1) \
-+ { \
-+ yychar = (Token); \
-+ yylval = (Value); \
-+ yytoken = YYTRANSLATE (yychar); \
-+ YYPOPSTACK; \
-+ goto yybackup; \
-+ } \
-+ else \
-+ { \
-+ yyerror (YY_("syntax error: cannot back up")); \
-+ YYERROR; \
-+ } \
-+while (0)
-+
-+
-+#define YYTERROR 1
-+#define YYERRCODE 256
-+
-+
-+/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
-+ If N is 0, then set CURRENT to the empty location which ends
-+ the previous symbol: RHS[0] (always defined). */
-+
-+#define YYRHSLOC(Rhs, K) ((Rhs)[K])
-+#ifndef YYLLOC_DEFAULT
-+# define YYLLOC_DEFAULT(Current, Rhs, N) \
-+ do \
-+ if (N) \
-+ { \
-+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
-+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
-+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
-+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
-+ } \
-+ else \
-+ { \
-+ (Current).first_line = (Current).last_line = \
-+ YYRHSLOC (Rhs, 0).last_line; \
-+ (Current).first_column = (Current).last_column = \
-+ YYRHSLOC (Rhs, 0).last_column; \
-+ } \
-+ while (0)
-+#endif
-+
-+
-+/* YY_LOCATION_PRINT -- Print the location on the stream.
-+ This macro was not mandated originally: define only if we know
-+ we won't break user code: when these are the locations we know. */
-+
-+#ifndef YY_LOCATION_PRINT
-+# if YYLTYPE_IS_TRIVIAL
-+# define YY_LOCATION_PRINT(File, Loc) \
-+ fprintf (File, "%d.%d-%d.%d", \
-+ (Loc).first_line, (Loc).first_column, \
-+ (Loc).last_line, (Loc).last_column)
-+# else
-+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
-+# endif
-+#endif
-+
-+
-+/* YYLEX -- calling `yylex' with the right arguments. */
-+
-+#ifdef YYLEX_PARAM
-+# define YYLEX yylex (&yylval, YYLEX_PARAM)
-+#else
-+# define YYLEX yylex (&yylval)
-+#endif
-+
-+/* Enable debugging if requested. */
-+#if YYDEBUG
-+
-+# ifndef YYFPRINTF
-+# include /* INFRINGES ON USER NAME SPACE */
-+# define YYFPRINTF fprintf
-+# endif
-+
-+# define YYDPRINTF(Args) \
-+do { \
-+ if (yydebug) \
-+ YYFPRINTF Args; \
-+} while (0)
-+
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
-+do { \
-+ if (yydebug) \
-+ { \
-+ YYFPRINTF (stderr, "%s ", Title); \
-+ yysymprint (stderr, \
-+ Type, Value); \
-+ YYFPRINTF (stderr, "\n"); \
-+ } \
-+} while (0)
-+
-+/*------------------------------------------------------------------.
-+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
-+| TOP (included). |
-+`------------------------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_stack_print (short int *bottom, short int *top)
-+#else
-+static void
-+yy_stack_print (bottom, top)
-+ short int *bottom;
-+ short int *top;
-+#endif
-+{
-+ YYFPRINTF (stderr, "Stack now");
-+ for (/* Nothing. */; bottom <= top; ++bottom)
-+ YYFPRINTF (stderr, " %d", *bottom);
-+ YYFPRINTF (stderr, "\n");
-+}
-+
-+# define YY_STACK_PRINT(Bottom, Top) \
-+do { \
-+ if (yydebug) \
-+ yy_stack_print ((Bottom), (Top)); \
-+} while (0)
-+
-+
-+/*------------------------------------------------.
-+| Report that the YYRULE is going to be reduced. |
-+`------------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yy_reduce_print (int yyrule)
-+#else
-+static void
-+yy_reduce_print (yyrule)
-+ int yyrule;
-+#endif
-+{
-+ int yyi;
-+ unsigned long int yylno = yyrline[yyrule];
-+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu), ",
-+ yyrule - 1, yylno);
-+ /* Print the symbols being reduced, and their result. */
-+ for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
-+ YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-+ YYFPRINTF (stderr, "-> %s\n", yytname[yyr1[yyrule]]);
-+}
-+
-+# define YY_REDUCE_PRINT(Rule) \
-+do { \
-+ if (yydebug) \
-+ yy_reduce_print (Rule); \
-+} while (0)
-+
-+/* Nonzero means print parse trace. It is left uninitialized so that
-+ multiple parsers can coexist. */
-+int yydebug;
-+#else /* !YYDEBUG */
-+# define YYDPRINTF(Args)
-+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
-+# define YY_STACK_PRINT(Bottom, Top)
-+# define YY_REDUCE_PRINT(Rule)
-+#endif /* !YYDEBUG */
-+
-+
-+/* YYINITDEPTH -- initial size of the parser's stacks. */
-+#ifndef YYINITDEPTH
-+# define YYINITDEPTH 200
-+#endif
-+
-+/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
-+ if the built-in stack extension method is used).
-+
-+ Do not make this value too large; the results are undefined if
-+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
-+ evaluated with infinite-precision integer arithmetic. */
-+
-+#ifndef YYMAXDEPTH
-+# define YYMAXDEPTH 10000
-+#endif
-+
-+
-+
-+#if YYERROR_VERBOSE
-+
-+# ifndef yystrlen
-+# if defined (__GLIBC__) && defined (_STRING_H)
-+# define yystrlen strlen
-+# else
-+/* Return the length of YYSTR. */
-+static YYSIZE_T
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystrlen (const char *yystr)
-+# else
-+yystrlen (yystr)
-+ const char *yystr;
-+# endif
-+{
-+ const char *yys = yystr;
-+
-+ while (*yys++ != '\0')
-+ continue;
-+
-+ return yys - yystr - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yystpcpy
-+# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
-+# define yystpcpy stpcpy
-+# else
-+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
-+ YYDEST. */
-+static char *
-+# if defined (__STDC__) || defined (__cplusplus)
-+yystpcpy (char *yydest, const char *yysrc)
-+# else
-+yystpcpy (yydest, yysrc)
-+ char *yydest;
-+ const char *yysrc;
-+# endif
-+{
-+ char *yyd = yydest;
-+ const char *yys = yysrc;
-+
-+ while ((*yyd++ = *yys++) != '\0')
-+ continue;
-+
-+ return yyd - 1;
-+}
-+# endif
-+# endif
-+
-+# ifndef yytnamerr
-+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
-+ quotes and backslashes, so that it's suitable for yyerror. The
-+ heuristic is that double-quoting is unnecessary unless the string
-+ contains an apostrophe, a comma, or backslash (other than
-+ backslash-backslash). YYSTR is taken from yytname. If YYRES is
-+ null, do not copy; instead, return the length of what the result
-+ would have been. */
-+static YYSIZE_T
-+yytnamerr (char *yyres, const char *yystr)
-+{
-+ if (*yystr == '"')
-+ {
-+ size_t yyn = 0;
-+ char const *yyp = yystr;
-+
-+ for (;;)
-+ switch (*++yyp)
-+ {
-+ case '\'':
-+ case ',':
-+ goto do_not_strip_quotes;
-+
-+ case '\\':
-+ if (*++yyp != '\\')
-+ goto do_not_strip_quotes;
-+ /* Fall through. */
-+ default:
-+ if (yyres)
-+ yyres[yyn] = *yyp;
-+ yyn++;
-+ break;
-+
-+ case '"':
-+ if (yyres)
-+ yyres[yyn] = '\0';
-+ return yyn;
-+ }
-+ do_not_strip_quotes: ;
-+ }
-+
-+ if (! yyres)
-+ return yystrlen (yystr);
-+
-+ return yystpcpy (yyres, yystr) - yyres;
-+}
-+# endif
-+
-+#endif /* YYERROR_VERBOSE */
-+
-+
-+
-+#if YYDEBUG
-+/*--------------------------------.
-+| Print this symbol on YYOUTPUT. |
-+`--------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yysymprint (yyoutput, yytype, yyvaluep)
-+ FILE *yyoutput;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (yytype < YYNTOKENS)
-+ YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
-+ else
-+ YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
-+
-+
-+# ifdef YYPRINT
-+ if (yytype < YYNTOKENS)
-+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
-+# endif
-+ switch (yytype)
-+ {
-+ default:
-+ break;
-+ }
-+ YYFPRINTF (yyoutput, ")");
-+}
-+
-+#endif /* ! YYDEBUG */
-+/*-----------------------------------------------.
-+| Release the memory associated to this symbol. |
-+`-----------------------------------------------*/
-+
-+#if defined (__STDC__) || defined (__cplusplus)
-+static void
-+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
-+#else
-+static void
-+yydestruct (yymsg, yytype, yyvaluep)
-+ const char *yymsg;
-+ int yytype;
-+ YYSTYPE *yyvaluep;
-+#endif
-+{
-+ /* Pacify ``unused variable'' warnings. */
-+ (void) yyvaluep;
-+
-+ if (!yymsg)
-+ yymsg = "Deleting";
-+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
-+
-+ switch (yytype)
-+ {
-+
-+ default:
-+ break;
-+ }
-+}
-+
-+
-+/* Prevent warnings from -Wmissing-prototypes. */
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM);
-+# else
-+int yyparse ();
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void);
-+#else
-+int yyparse ();
-+#endif
-+#endif /* ! YYPARSE_PARAM */
-+
-+
-+
-+
-+
-+
-+/*----------.
-+| yyparse. |
-+`----------*/
-+
-+#ifdef YYPARSE_PARAM
-+# if defined (__STDC__) || defined (__cplusplus)
-+int yyparse (void *YYPARSE_PARAM)
-+# else
-+int yyparse (YYPARSE_PARAM)
-+ void *YYPARSE_PARAM;
-+# endif
-+#else /* ! YYPARSE_PARAM */
-+#if defined (__STDC__) || defined (__cplusplus)
-+int
-+yyparse (void)
-+#else
-+int
-+yyparse ()
-+ ;
-+#endif
-+#endif
-+{
-+ /* The look-ahead symbol. */
-+int yychar;
-+
-+/* The semantic value of the look-ahead symbol. */
-+YYSTYPE yylval;
-+
-+/* Number of syntax errors so far. */
-+int yynerrs;
-+
-+ int yystate;
-+ int yyn;
-+ int yyresult;
-+ /* Number of tokens to shift before error messages enabled. */
-+ int yyerrstatus;
-+ /* Look-ahead token as an internal (translated) token number. */
-+ int yytoken = 0;
-+
-+ /* Three stacks and their tools:
-+ `yyss': related to states,
-+ `yyvs': related to semantic values,
-+ `yyls': related to locations.
-+
-+ Refer to the stacks thru separate pointers, to allow yyoverflow
-+ to reallocate them elsewhere. */
-+
-+ /* The state stack. */
-+ short int yyssa[YYINITDEPTH];
-+ short int *yyss = yyssa;
-+ short int *yyssp;
-+
-+ /* The semantic value stack. */
-+ YYSTYPE yyvsa[YYINITDEPTH];
-+ YYSTYPE *yyvs = yyvsa;
-+ YYSTYPE *yyvsp;
-+
-+
-+
-+#define YYPOPSTACK (yyvsp--, yyssp--)
-+
-+ YYSIZE_T yystacksize = YYINITDEPTH;
-+
-+ /* The variables used to return semantic value and location from the
-+ action routines. */
-+ YYSTYPE yyval;
-+
-+
-+ /* When reducing, the number of symbols on the RHS of the reduced
-+ rule. */
-+ int yylen;
-+
-+ YYDPRINTF ((stderr, "Starting parse\n"));
-+
-+ yystate = 0;
-+ yyerrstatus = 0;
-+ yynerrs = 0;
-+ yychar = YYEMPTY; /* Cause a token to be read. */
-+
-+ /* Initialize stack pointers.
-+ Waste one element of value and location stack
-+ so that they stay on the same level as the state stack.
-+ The wasted elements are never initialized. */
-+
-+ yyssp = yyss;
-+ yyvsp = yyvs;
-+
-+ goto yysetstate;
-+
-+/*------------------------------------------------------------.
-+| yynewstate -- Push a new state, which is found in yystate. |
-+`------------------------------------------------------------*/
-+ yynewstate:
-+ /* In all cases, when you get here, the value and location stacks
-+ have just been pushed. so pushing a state here evens the stacks.
-+ */
-+ yyssp++;
-+
-+ yysetstate:
-+ *yyssp = yystate;
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ {
-+ /* Get the current used size of the three stacks, in elements. */
-+ YYSIZE_T yysize = yyssp - yyss + 1;
-+
-+#ifdef yyoverflow
-+ {
-+ /* Give user a chance to reallocate the stack. Use copies of
-+ these so that the &'s don't force the real ones into
-+ memory. */
-+ YYSTYPE *yyvs1 = yyvs;
-+ short int *yyss1 = yyss;
-+
-+
-+ /* Each stack pointer address is followed by the size of the
-+ data in use in that stack, in bytes. This used to be a
-+ conditional around just the two extra args, but that might
-+ be undefined if yyoverflow is a macro. */
-+ yyoverflow (YY_("memory exhausted"),
-+ &yyss1, yysize * sizeof (*yyssp),
-+ &yyvs1, yysize * sizeof (*yyvsp),
-+
-+ &yystacksize);
-+
-+ yyss = yyss1;
-+ yyvs = yyvs1;
-+ }
-+#else /* no yyoverflow */
-+# ifndef YYSTACK_RELOCATE
-+ goto yyexhaustedlab;
-+# else
-+ /* Extend the stack our own way. */
-+ if (YYMAXDEPTH <= yystacksize)
-+ goto yyexhaustedlab;
-+ yystacksize *= 2;
-+ if (YYMAXDEPTH < yystacksize)
-+ yystacksize = YYMAXDEPTH;
-+
-+ {
-+ short int *yyss1 = yyss;
-+ union yyalloc *yyptr =
-+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
-+ if (! yyptr)
-+ goto yyexhaustedlab;
-+ YYSTACK_RELOCATE (yyss);
-+ YYSTACK_RELOCATE (yyvs);
-+
-+# undef YYSTACK_RELOCATE
-+ if (yyss1 != yyssa)
-+ YYSTACK_FREE (yyss1);
-+ }
-+# endif
-+#endif /* no yyoverflow */
-+
-+ yyssp = yyss + yysize - 1;
-+ yyvsp = yyvs + yysize - 1;
-+
-+
-+ YYDPRINTF ((stderr, "Stack size increased to %lu\n",
-+ (unsigned long int) yystacksize));
-+
-+ if (yyss + yystacksize - 1 <= yyssp)
-+ YYABORT;
-+ }
-+
-+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
-+
-+ goto yybackup;
-+
-+/*-----------.
-+| yybackup. |
-+`-----------*/
-+yybackup:
-+
-+/* Do appropriate processing given the current state. */
-+/* Read a look-ahead token if we need one and don't already have one. */
-+/* yyresume: */
-+
-+ /* First try to decide what to do without reference to look-ahead token. */
-+
-+ yyn = yypact[yystate];
-+ if (yyn == YYPACT_NINF)
-+ goto yydefault;
-+
-+ /* Not known => get a look-ahead token if don't already have one. */
-+
-+ /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
-+ if (yychar == YYEMPTY)
-+ {
-+ YYDPRINTF ((stderr, "Reading a token: "));
-+ yychar = YYLEX;
-+ }
-+
-+ if (yychar <= YYEOF)
-+ {
-+ yychar = yytoken = YYEOF;
-+ YYDPRINTF ((stderr, "Now at end of input.\n"));
-+ }
-+ else
-+ {
-+ yytoken = YYTRANSLATE (yychar);
-+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
-+ }
-+
-+ /* If the proper action on seeing token YYTOKEN is to reduce or to
-+ detect an error, take that action. */
-+ yyn += yytoken;
-+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
-+ goto yydefault;
-+ yyn = yytable[yyn];
-+ if (yyn <= 0)
-+ {
-+ if (yyn == 0 || yyn == YYTABLE_NINF)
-+ goto yyerrlab;
-+ yyn = -yyn;
-+ goto yyreduce;
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ /* Shift the look-ahead token. */
-+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
-+
-+ /* Discard the token being shifted unless it is eof. */
-+ if (yychar != YYEOF)
-+ yychar = YYEMPTY;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Count tokens shifted since error; after three, turn off error
-+ status. */
-+ if (yyerrstatus)
-+ yyerrstatus--;
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-----------------------------------------------------------.
-+| yydefault -- do the default action for the current state. |
-+`-----------------------------------------------------------*/
-+yydefault:
-+ yyn = yydefact[yystate];
-+ if (yyn == 0)
-+ goto yyerrlab;
-+ goto yyreduce;
-+
-+
-+/*-----------------------------.
-+| yyreduce -- Do a reduction. |
-+`-----------------------------*/
-+yyreduce:
-+ /* yyn is the number of a rule to reduce with. */
-+ yylen = yyr2[yyn];
-+
-+ /* If YYLEN is nonzero, implement the default value of the action:
-+ `$$ = $1'.
-+
-+ Otherwise, the following line sets YYVAL to garbage.
-+ This behavior is undocumented and Bison
-+ users should not rely upon it. Assigning to YYVAL
-+ unconditionally makes the parser a bit smaller, and it avoids a
-+ GCC warning that YYVAL may be used uninitialized. */
-+ yyval = yyvsp[1-yylen];
-+
-+
-+ YY_REDUCE_PRINT (yyn);
-+ switch (yyn)
-+ {
-+ case 2:
-+#line 125 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ *sql->view = (yyvsp[0].query);
-+ ;}
-+ break;
-+
-+ case 9:
-+#line 142 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input*) info;
-+ MSIVIEW *insert = NULL;
-+
-+ INSERT_CreateView( sql->db, &insert, (yyvsp[-7].string), (yyvsp[-5].column_list), (yyvsp[-1].column_list), FALSE );
-+ if( !insert )
-+ YYABORT;
-+ (yyval.query) = insert;
-+ ;}
-+ break;
-+
-+ case 10:
-+#line 152 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input*) info;
-+ MSIVIEW *insert = NULL;
-+
-+ INSERT_CreateView( sql->db, &insert, (yyvsp[-8].string), (yyvsp[-6].column_list), (yyvsp[-2].column_list), TRUE );
-+ if( !insert )
-+ YYABORT;
-+ (yyval.query) = insert;
-+ ;}
-+ break;
-+
-+ case 11:
-+#line 165 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *create = NULL;
-+
-+ if( !(yyvsp[-1].column_list) )
-+ YYABORT;
-+ CREATE_CreateView( sql->db, &create, (yyvsp[-3].string), (yyvsp[-1].column_list), FALSE );
-+ if( !create )
-+ YYABORT;
-+ (yyval.query) = create;
-+ ;}
-+ break;
-+
-+ case 12:
-+#line 177 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *create = NULL;
-+
-+ if( !(yyvsp[-2].column_list) )
-+ YYABORT;
-+ CREATE_CreateView( sql->db, &create, (yyvsp[-4].string), (yyvsp[-2].column_list), TRUE );
-+ if( !create )
-+ YYABORT;
-+ (yyval.query) = create;
-+ ;}
-+ break;
-+
-+ case 13:
-+#line 192 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *update = NULL;
-+
-+ UPDATE_CreateView( sql->db, &update, (yyvsp[-4].string), (yyvsp[-2].column_list), (yyvsp[0].expr) );
-+ if( !update )
-+ YYABORT;
-+ (yyval.query) = update;
-+ ;}
-+ break;
-+
-+ case 14:
-+#line 202 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *update = NULL;
-+
-+ UPDATE_CreateView( sql->db, &update, (yyvsp[-2].string), (yyvsp[0].column_list), NULL );
-+ if( !update )
-+ YYABORT;
-+ (yyval.query) = update;
-+ ;}
-+ break;
-+
-+ case 15:
-+#line 215 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *delete = NULL;
-+
-+ DELETE_CreateView( sql->db, &delete, (yyvsp[0].query) );
-+ if( !delete )
-+ YYABORT;
-+ (yyval.query) = delete;
-+ ;}
-+ break;
-+
-+ case 16:
-+#line 228 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ MSIVIEW *alter = NULL;
-+
-+ ALTER_CreateView( sql->db, &alter, (yyvsp[-1].string), NULL, (yyvsp[0].integer) );
-+ if( !alter )
-+ YYABORT;
-+ (yyval.query) = alter;
-+ ;}
-+ break;
-+
-+ case 17:
-+#line 238 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input *)info;
-+ MSIVIEW *alter = NULL;
-+
-+ ALTER_CreateView( sql->db, &alter, (yyvsp[-2].string), (yyvsp[0].column_list), 0 );
-+ if (!alter)
-+ YYABORT;
-+ (yyval.query) = alter;
-+ ;}
-+ break;
-+
-+ case 18:
-+#line 248 "sql.y"
-+ {
-+ SQL_input *sql = (SQL_input *)info;
-+ MSIVIEW *alter = NULL;
-+
-+ ALTER_CreateView( sql->db, &alter, (yyvsp[-3].string), (yyvsp[-1].column_list), 1 );
-+ if (!alter)
-+ YYABORT;
-+ (yyval.query) = alter;
-+ ;}
-+ break;
-+
-+ case 19:
-+#line 261 "sql.y"
-+ {
-+ (yyval.integer) = 1;
-+ ;}
-+ break;
-+
-+ case 20:
-+#line 265 "sql.y"
-+ {
-+ (yyval.integer) = -1;
-+ ;}
-+ break;
-+
-+ case 21:
-+#line 272 "sql.y"
-+ {
-+ if( SQL_MarkPrimaryKeys( (yyvsp[-3].column_list), (yyvsp[0].column_list) ) )
-+ (yyval.column_list) = (yyvsp[-3].column_list);
-+ else
-+ (yyval.column_list) = NULL;
-+ ;}
-+ break;
-+
-+ case 22:
-+#line 282 "sql.y"
-+ {
-+ column_info *ci;
-+
-+ for( ci = (yyvsp[-2].column_list); ci->next; ci = ci->next )
-+ ;
-+
-+ ci->next = (yyvsp[0].column_list);
-+ (yyval.column_list) = (yyvsp[-2].column_list);
-+ ;}
-+ break;
-+
-+ case 23:
-+#line 292 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 24:
-+#line 299 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[-1].column_list);
-+ (yyval.column_list)->type = ((yyvsp[0].column_type) | MSITYPE_VALID);
-+ (yyval.column_list)->temporary = (yyvsp[0].column_type) & MSITYPE_TEMPORARY ? TRUE : FALSE;
-+ ;}
-+ break;
-+
-+ case 25:
-+#line 308 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[0].column_type);
-+ ;}
-+ break;
-+
-+ case 26:
-+#line 312 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_LOCALIZABLE;
-+ ;}
-+ break;
-+
-+ case 27:
-+#line 316 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[-1].column_type) | MSITYPE_TEMPORARY;
-+ ;}
-+ break;
-+
-+ case 28:
-+#line 323 "sql.y"
-+ {
-+ (yyval.column_type) |= MSITYPE_NULLABLE;
-+ ;}
-+ break;
-+
-+ case 29:
-+#line 327 "sql.y"
-+ {
-+ (yyval.column_type) = (yyvsp[-2].column_type);
-+ ;}
-+ break;
-+
-+ case 30:
-+#line 334 "sql.y"
-+ {
-+ (yyval.column_type) = MSITYPE_STRING | 1;
-+ ;}
-+ break;
-+
-+ case 31:
-+#line 338 "sql.y"
-+ {
-+ (yyval.column_type) = MSITYPE_STRING | 0x400 | (yyvsp[-1].column_type);
-+ ;}
-+ break;
-+
-+ case 32:
-+#line 342 "sql.y"
-+ {
-+ (yyval.column_type) = 2;
-+ ;}
-+ break;
-+
-+ case 33:
-+#line 346 "sql.y"
-+ {
-+ (yyval.column_type) = 2;
-+ ;}
-+ break;
-+
-+ case 34:
-+#line 350 "sql.y"
-+ {
-+ (yyval.column_type) = 2;
-+ ;}
-+ break;
-+
-+ case 35:
-+#line 354 "sql.y"
-+ {
-+ (yyval.column_type) = 4;
-+ ;}
-+ break;
-+
-+ case 36:
-+#line 358 "sql.y"
-+ {
-+ (yyval.column_type) = MSITYPE_STRING | MSITYPE_VALID;
-+ ;}
-+ break;
-+
-+ case 37:
-+#line 365 "sql.y"
-+ {
-+ if( ( (yyvsp[0].integer) > 255 ) || ( (yyvsp[0].integer) < 0 ) )
-+ YYABORT;
-+ (yyval.column_type) = (yyvsp[0].integer);
-+ ;}
-+ break;
-+
-+ case 38:
-+#line 374 "sql.y"
-+ {
-+ UINT r;
-+
-+ if( (yyvsp[0].column_list) )
-+ {
-+ r = (yyvsp[-3].query)->ops->sort( (yyvsp[-3].query), (yyvsp[0].column_list) );
-+ if ( r != ERROR_SUCCESS)
-+ YYABORT;
-+ }
-+
-+ (yyval.query) = (yyvsp[-3].query);
-+ ;}
-+ break;
-+
-+ case 40:
-+#line 391 "sql.y"
-+ {
-+ (yyval.query) = (yyvsp[0].query);
-+ ;}
-+ break;
-+
-+ case 41:
-+#line 395 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ r = DISTINCT_CreateView( sql->db, &(yyval.query), (yyvsp[0].query) );
-+ if (r != ERROR_SUCCESS)
-+ {
-+ (yyvsp[0].query)->ops->delete((yyvsp[0].query));
-+ YYABORT;
-+ }
-+ ;}
-+ break;
-+
-+ case 42:
-+#line 411 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ if( (yyvsp[-1].column_list) )
-+ {
-+ r = SELECT_CreateView( sql->db, &(yyval.query), (yyvsp[0].query), (yyvsp[-1].column_list) );
-+ if (r != ERROR_SUCCESS)
-+ {
-+ (yyvsp[0].query)->ops->delete((yyvsp[0].query));
-+ YYABORT;
-+ }
-+ }
-+ else
-+ (yyval.query) = (yyvsp[0].query);
-+ ;}
-+ break;
-+
-+ case 44:
-+#line 433 "sql.y"
-+ {
-+ (yyvsp[-2].column_list)->next = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 45:
-+#line 437 "sql.y"
-+ {
-+ (yyval.column_list) = NULL;
-+ ;}
-+ break;
-+
-+ case 47:
-+#line 445 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ r = WHERE_CreateView( sql->db, &(yyval.query), (yyvsp[-2].query), (yyvsp[0].expr) );
-+ if( r != ERROR_SUCCESS )
-+ {
-+ (yyvsp[-2].query)->ops->delete( (yyvsp[-2].query) );
-+ YYABORT;
-+ }
-+ ;}
-+ break;
-+
-+ case 48:
-+#line 461 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ (yyval.query) = NULL;
-+ r = TABLE_CreateView( sql->db, (yyvsp[0].string), &(yyval.query) );
-+ if( r != ERROR_SUCCESS || !(yyval.query) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 49:
-+#line 471 "sql.y"
-+ {
-+ SQL_input* sql = (SQL_input*) info;
-+ UINT r;
-+
-+ r = JOIN_CreateView( sql->db, &(yyval.query), (yyvsp[0].string) );
-+ msi_free( (yyvsp[0].string) );
-+ if( r != ERROR_SUCCESS )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 50:
-+#line 484 "sql.y"
-+ {
-+ (yyval.string) = strdupW((yyvsp[0].string));
-+ ;}
-+ break;
-+
-+ case 51:
-+#line 489 "sql.y"
-+ {
-+ (yyval.string) = parser_add_table((yyvsp[0].string), (yyvsp[-2].string));
-+ if (!(yyval.string))
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 52:
-+#line 498 "sql.y"
-+ {
-+ (yyval.expr) = (yyvsp[-1].expr);
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 53:
-+#line 504 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_AND, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 54:
-+#line 510 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_OR, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 55:
-+#line 516 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_EQ, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 56:
-+#line 522 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GT, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 57:
-+#line 528 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LT, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 58:
-+#line 534 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_LE, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 59:
-+#line 540 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_GE, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 60:
-+#line 546 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_complex( info, (yyvsp[-2].expr), OP_NE, (yyvsp[0].expr) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 61:
-+#line 552 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_unary( info, (yyvsp[-2].expr), OP_ISNULL );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 62:
-+#line 558 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_unary( info, (yyvsp[-3].expr), OP_NOTNULL );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 65:
-+#line 572 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ (yyval.column_list)->val = (yyvsp[0].expr);
-+ ;}
-+ break;
-+
-+ case 66:
-+#line 579 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, NULL, NULL );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ (yyval.column_list)->val = (yyvsp[-2].expr);
-+ (yyval.column_list)->next = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 68:
-+#line 591 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[-2].column_list);
-+ (yyval.column_list)->next = (yyvsp[0].column_list);
-+ ;}
-+ break;
-+
-+ case 69:
-+#line 599 "sql.y"
-+ {
-+ (yyval.column_list) = (yyvsp[-2].column_list);
-+ (yyval.column_list)->val = (yyvsp[0].expr);
-+ ;}
-+ break;
-+
-+ case 70:
-+#line 607 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_ival( info, (yyvsp[0].integer) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 71:
-+#line 613 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_ival( info, -(yyvsp[0].integer) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 72:
-+#line 619 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_sval( info, &(yyvsp[0].str) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 73:
-+#line 625 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_wildcard( info );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 74:
-+#line 634 "sql.y"
-+ {
-+ (yyval.expr) = EXPR_column( info, (yyvsp[0].column_list) );
-+ if( !(yyval.expr) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 75:
-+#line 643 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, (yyvsp[-2].string), (yyvsp[0].string) );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 76:
-+#line 649 "sql.y"
-+ {
-+ (yyval.column_list) = parser_alloc_column( info, NULL, (yyvsp[0].string) );
-+ if( !(yyval.column_list) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 77:
-+#line 658 "sql.y"
-+ {
-+ (yyval.string) = (yyvsp[0].string);
-+ ;}
-+ break;
-+
-+ case 78:
-+#line 665 "sql.y"
-+ {
-+ (yyval.string) = SQL_getstring( info, &(yyvsp[0].str) );
-+ if( !(yyval.string) )
-+ YYABORT;
-+ ;}
-+ break;
-+
-+ case 79:
-+#line 674 "sql.y"
-+ {
-+ (yyval.integer) = SQL_getint( info );
-+ ;}
-+ break;
-+
-+
-+ default: break;
-+ }
-+
-+/* Line 1126 of yacc.c. */
-+#line 2080 "sql.tab.c"
-+
-+ yyvsp -= yylen;
-+ yyssp -= yylen;
-+
-+
-+ YY_STACK_PRINT (yyss, yyssp);
-+
-+ *++yyvsp = yyval;
-+
-+
-+ /* Now `shift' the result of the reduction. Determine what state
-+ that goes to, based on the state we popped back to and the rule
-+ number reduced by. */
-+
-+ yyn = yyr1[yyn];
-+
-+ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
-+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
-+ yystate = yytable[yystate];
-+ else
-+ yystate = yydefgoto[yyn - YYNTOKENS];
-+
-+ goto yynewstate;
-+
-+
-+/*------------------------------------.
-+| yyerrlab -- here on detecting error |
-+`------------------------------------*/
-+yyerrlab:
-+ /* If not already recovering from an error, report this error. */
-+ if (!yyerrstatus)
-+ {
-+ ++yynerrs;
-+#if YYERROR_VERBOSE
-+ yyn = yypact[yystate];
-+
-+ if (YYPACT_NINF < yyn && yyn < YYLAST)
-+ {
-+ int yytype = YYTRANSLATE (yychar);
-+ YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
-+ YYSIZE_T yysize = yysize0;
-+ YYSIZE_T yysize1;
-+ int yysize_overflow = 0;
-+ char *yymsg = 0;
-+# define YYERROR_VERBOSE_ARGS_MAXIMUM 5
-+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
-+ int yyx;
-+
-+#if 0
-+ /* This is so xgettext sees the translatable formats that are
-+ constructed on the fly. */
-+ YY_("syntax error, unexpected %s");
-+ YY_("syntax error, unexpected %s, expecting %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s");
-+ YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
-+#endif
-+ char *yyfmt;
-+ char const *yyf;
-+ static char const yyunexpected[] = "syntax error, unexpected %s";
-+ static char const yyexpecting[] = ", expecting %s";
-+ static char const yyor[] = " or %s";
-+ char yyformat[sizeof yyunexpected
-+ + sizeof yyexpecting - 1
-+ + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
-+ * (sizeof yyor - 1))];
-+ char const *yyprefix = yyexpecting;
-+
-+ /* Start YYX at -YYN if negative to avoid negative indexes in
-+ YYCHECK. */
-+ int yyxbegin = yyn < 0 ? -yyn : 0;
-+
-+ /* Stay within bounds of both yycheck and yytname. */
-+ int yychecklim = YYLAST - yyn;
-+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
-+ int yycount = 1;
-+
-+ yyarg[0] = yytname[yytype];
-+ yyfmt = yystpcpy (yyformat, yyunexpected);
-+
-+ for (yyx = yyxbegin; yyx < yyxend; ++yyx)
-+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-+ {
-+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
-+ {
-+ yycount = 1;
-+ yysize = yysize0;
-+ yyformat[sizeof yyunexpected - 1] = '\0';
-+ break;
-+ }
-+ yyarg[yycount++] = yytname[yyx];
-+ yysize1 = yysize + yytnamerr (0, yytname[yyx]);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+ yyfmt = yystpcpy (yyfmt, yyprefix);
-+ yyprefix = yyor;
-+ }
-+
-+ yyf = YY_(yyformat);
-+ yysize1 = yysize + yystrlen (yyf);
-+ yysize_overflow |= yysize1 < yysize;
-+ yysize = yysize1;
-+
-+ if (!yysize_overflow && yysize <= YYSTACK_ALLOC_MAXIMUM)
-+ yymsg = (char *) YYSTACK_ALLOC (yysize);
-+ if (yymsg)
-+ {
-+ /* Avoid sprintf, as that infringes on the user's name space.
-+ Don't have undefined behavior even if the translation
-+ produced a string with the wrong number of "%s"s. */
-+ char *yyp = yymsg;
-+ int yyi = 0;
-+ while ((*yyp = *yyf))
-+ {
-+ if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
-+ {
-+ yyp += yytnamerr (yyp, yyarg[yyi++]);
-+ yyf += 2;
-+ }
-+ else
-+ {
-+ yyp++;
-+ yyf++;
-+ }
-+ }
-+ yyerror (yymsg);
-+ YYSTACK_FREE (yymsg);
-+ }
-+ else
-+ {
-+ yyerror (YY_("syntax error"));
-+ goto yyexhaustedlab;
-+ }
-+ }
-+ else
-+#endif /* YYERROR_VERBOSE */
-+ yyerror (YY_("syntax error"));
-+ }
-+
-+
-+
-+ if (yyerrstatus == 3)
-+ {
-+ /* If just tried and failed to reuse look-ahead token after an
-+ error, discard it. */
-+
-+ if (yychar <= YYEOF)
-+ {
-+ /* Return failure if at end of input. */
-+ if (yychar == YYEOF)
-+ YYABORT;
-+ }
-+ else
-+ {
-+ yydestruct ("Error: discarding", yytoken, &yylval);
-+ yychar = YYEMPTY;
-+ }
-+ }
-+
-+ /* Else will try to reuse look-ahead token after shifting the error
-+ token. */
-+ goto yyerrlab1;
-+
-+
-+/*---------------------------------------------------.
-+| yyerrorlab -- error raised explicitly by YYERROR. |
-+`---------------------------------------------------*/
-+yyerrorlab:
-+
-+ /* Pacify compilers like GCC when the user code never invokes
-+ YYERROR and the label yyerrorlab therefore never appears in user
-+ code. */
-+ if (0)
-+ goto yyerrorlab;
-+
-+yyvsp -= yylen;
-+ yyssp -= yylen;
-+ yystate = *yyssp;
-+ goto yyerrlab1;
-+
-+
-+/*-------------------------------------------------------------.
-+| yyerrlab1 -- common code for both syntax error and YYERROR. |
-+`-------------------------------------------------------------*/
-+yyerrlab1:
-+ yyerrstatus = 3; /* Each real token shifted decrements this. */
-+
-+ for (;;)
-+ {
-+ yyn = yypact[yystate];
-+ if (yyn != YYPACT_NINF)
-+ {
-+ yyn += YYTERROR;
-+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
-+ {
-+ yyn = yytable[yyn];
-+ if (0 < yyn)
-+ break;
-+ }
-+ }
-+
-+ /* Pop the current state because it cannot handle the error token. */
-+ if (yyssp == yyss)
-+ YYABORT;
-+
-+
-+ yydestruct ("Error: popping", yystos[yystate], yyvsp);
-+ YYPOPSTACK;
-+ yystate = *yyssp;
-+ YY_STACK_PRINT (yyss, yyssp);
-+ }
-+
-+ if (yyn == YYFINAL)
-+ YYACCEPT;
-+
-+ *++yyvsp = yylval;
-+
-+
-+ /* Shift the error token. */
-+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
-+
-+ yystate = yyn;
-+ goto yynewstate;
-+
-+
-+/*-------------------------------------.
-+| yyacceptlab -- YYACCEPT comes here. |
-+`-------------------------------------*/
-+yyacceptlab:
-+ yyresult = 0;
-+ goto yyreturn;
-+
-+/*-----------------------------------.
-+| yyabortlab -- YYABORT comes here. |
-+`-----------------------------------*/
-+yyabortlab:
-+ yyresult = 1;
-+ goto yyreturn;
-+
-+#ifndef yyoverflow
-+/*-------------------------------------------------.
-+| yyexhaustedlab -- memory exhaustion comes here. |
-+`-------------------------------------------------*/
-+yyexhaustedlab:
-+ yyerror (YY_("memory exhausted"));
-+ yyresult = 2;
-+ /* Fall through. */
-+#endif
-+
-+yyreturn:
-+ if (yychar != YYEOF && yychar != YYEMPTY)
-+ yydestruct ("Cleanup: discarding lookahead",
-+ yytoken, &yylval);
-+ while (yyssp != yyss)
-+ {
-+ yydestruct ("Cleanup: popping",
-+ yystos[*yyssp], yyvsp);
-+ YYPOPSTACK;
-+ }
-+#ifndef yyoverflow
-+ if (yyss != yyssa)
-+ YYSTACK_FREE (yyss);
-+#endif
-+ return yyresult;
-+}
-+
-+
-+#line 679 "sql.y"
-+
-+
-+static LPWSTR parser_add_table(LPWSTR list, LPWSTR table)
-+{
-+ DWORD size = lstrlenW(list) + lstrlenW(table) + 2;
-+ static const WCHAR space[] = {' ',0};
-+
-+ list = msi_realloc(list, size * sizeof(WCHAR));
-+ if (!list) return NULL;
-+
-+ lstrcatW(list, space);
-+ lstrcatW(list, table);
-+ return list;
-+}
-+
-+static void *parser_alloc( void *info, unsigned int sz )
-+{
-+ SQL_input* sql = (SQL_input*) info;
-+ struct list *mem;
-+
-+ mem = msi_alloc( sizeof (struct list) + sz );
-+ list_add_tail( sql->mem, mem );
-+ return &mem[1];
-+}
-+
-+static column_info *parser_alloc_column( void *info, LPCWSTR table, LPCWSTR column )
-+{
-+ column_info *col;
-+
-+ col = parser_alloc( info, sizeof (*col) );
-+ if( col )
-+ {
-+ col->table = table;
-+ col->column = column;
-+ col->val = NULL;
-+ col->type = 0;
-+ col->next = NULL;
-+ }
-+
-+ return col;
-+}
-+
-+static int sql_lex( void *SQL_lval, SQL_input *sql )
-+{
-+ int token;
-+ struct sql_str * str = SQL_lval;
-+
-+ do
-+ {
-+ sql->n += sql->len;
-+ if( ! sql->command[sql->n] )
-+ return 0; /* end of input */
-+
-+ /* TRACE("string : %s\n", debugstr_w(&sql->command[sql->n])); */
-+ sql->len = sqliteGetToken( &sql->command[sql->n], &token );
-+ if( sql->len==0 )
-+ break;
-+ str->data = &sql->command[sql->n];
-+ str->len = sql->len;
-+ }
-+ while( token == TK_SPACE );
-+
-+ /* TRACE("token : %d (%s)\n", token, debugstr_wn(&sql->command[sql->n], sql->len)); */
-+
-+ return token;
-+}
-+
-+LPWSTR SQL_getstring( void *info, const struct sql_str *strdata )
-+{
-+ LPCWSTR p = strdata->data;
-+ UINT len = strdata->len;
-+ LPWSTR str;
-+
-+ /* if there's quotes, remove them */
-+ if( ( (p[0]=='`') && (p[len-1]=='`') ) ||
-+ ( (p[0]=='\'') && (p[len-1]=='\'') ) )
-+ {
-+ p++;
-+ len -= 2;
-+ }
-+ str = parser_alloc( info, (len + 1)*sizeof(WCHAR) );
-+ if( !str )
-+ return str;
-+ memcpy( str, p, len*sizeof(WCHAR) );
-+ str[len]=0;
-+
-+ return str;
-+}
-+
-+INT SQL_getint( void *info )
-+{
-+ SQL_input* sql = (SQL_input*) info;
-+ LPCWSTR p = &sql->command[sql->n];
-+ INT i, r = 0;
-+
-+ for( i=0; ilen; i++ )
-+ {
-+ if( '0' > p[i] || '9' < p[i] )
-+ {
-+ ERR("should only be numbers here!\n");
-+ break;
-+ }
-+ r = (p[i]-'0') + r*10;
-+ }
-+
-+ return r;
-+}
-+
-+static int sql_error( const char *str )
-+{
-+ return 0;
-+}
-+
-+static struct expr * EXPR_wildcard( void *info )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_WILDCARD;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_complex( void *info, struct expr *l, UINT op, struct expr *r )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_COMPLEX;
-+ e->u.expr.left = l;
-+ e->u.expr.op = op;
-+ e->u.expr.right = r;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_unary( void *info, struct expr *l, UINT op )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_UNARY;
-+ e->u.expr.left = l;
-+ e->u.expr.op = op;
-+ e->u.expr.right = NULL;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_column( void *info, const column_info *column )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_COLUMN;
-+ e->u.sval = column->column;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_ival( void *info, int val )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_IVAL;
-+ e->u.ival = val;
-+ }
-+ return e;
-+}
-+
-+static struct expr * EXPR_sval( void *info, const struct sql_str *str )
-+{
-+ struct expr *e = parser_alloc( info, sizeof *e );
-+ if( e )
-+ {
-+ e->type = EXPR_SVAL;
-+ e->u.sval = SQL_getstring( info, str );
-+ }
-+ return e;
-+}
-+
-+static BOOL SQL_MarkPrimaryKeys( column_info *cols,
-+ column_info *keys )
-+{
-+ column_info *k;
-+ BOOL found = TRUE;
-+
-+ for( k = keys; k && found; k = k->next )
-+ {
-+ column_info *c;
-+
-+ found = FALSE;
-+ for( c = cols; c && !found; c = c->next )
-+ {
-+ if( lstrcmpW( k->column, c->column ) )
-+ continue;
-+ c->type |= MSITYPE_KEY;
-+ found = TRUE;
-+ }
-+ }
-+
-+ return found;
-+}
-+
-+UINT MSI_ParseSQL( MSIDATABASE *db, LPCWSTR command, MSIVIEW **phview,
-+ struct list *mem )
-+{
-+ SQL_input sql;
-+ int r;
-+
-+ *phview = NULL;
-+
-+ sql.db = db;
-+ sql.command = command;
-+ sql.n = 0;
-+ sql.len = 0;
-+ sql.view = phview;
-+ sql.mem = mem;
-+
-+ r = sql_parse(&sql);
-+
-+ TRACE("Parse returned %d\n", r);
-+ if( r )
-+ {
-+ *sql.view = NULL;
-+ return ERROR_BAD_QUERY_SYNTAX;
-+ }
-+
-+ return ERROR_SUCCESS;
-+}
-+
-Index: sql.tab.h
-===================================================================
---- sql.tab.h (revision 31639)
-+++ sql.tab.h (working copy)
-@@ -0,0 +1,180 @@
-+/* A Bison parser, made by GNU Bison 2.1. */
-+
-+/* Skeleton parser for Yacc-like parsing with Bison,
-+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
-+
-+ 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, 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., 51 Franklin Street, Fifth Floor,
-+ Boston, MA 02110-1301, USA. */
-+
-+/* As a special exception, when this file is copied by Bison into a
-+ Bison output file, you may use that output file without restriction.
-+ This special exception was added by the Free Software Foundation
-+ in version 1.24 of Bison. */
-+
-+/* Tokens. */
-+#ifndef YYTOKENTYPE
-+# define YYTOKENTYPE
-+ /* Put the tokens into the symbol table, so that GDB and other debuggers
-+ know about them. */
-+ enum yytokentype {
-+ TK_ALTER = 258,
-+ TK_AND = 259,
-+ TK_BY = 260,
-+ TK_CHAR = 261,
-+ TK_COMMA = 262,
-+ TK_CREATE = 263,
-+ TK_DELETE = 264,
-+ TK_DISTINCT = 265,
-+ TK_DOT = 266,
-+ TK_EQ = 267,
-+ TK_FREE = 268,
-+ TK_FROM = 269,
-+ TK_GE = 270,
-+ TK_GT = 271,
-+ TK_HOLD = 272,
-+ TK_ADD = 273,
-+ TK_ID = 274,
-+ TK_ILLEGAL = 275,
-+ TK_INSERT = 276,
-+ TK_INT = 277,
-+ TK_INTEGER = 278,
-+ TK_INTO = 279,
-+ TK_IS = 280,
-+ TK_KEY = 281,
-+ TK_LE = 282,
-+ TK_LONG = 283,
-+ TK_LONGCHAR = 284,
-+ TK_LP = 285,
-+ TK_LT = 286,
-+ TK_LOCALIZABLE = 287,
-+ TK_MINUS = 288,
-+ TK_NE = 289,
-+ TK_NOT = 290,
-+ TK_NULL = 291,
-+ TK_OBJECT = 292,
-+ TK_OR = 293,
-+ TK_ORDER = 294,
-+ TK_PRIMARY = 295,
-+ TK_RP = 296,
-+ TK_SELECT = 297,
-+ TK_SET = 298,
-+ TK_SHORT = 299,
-+ TK_SPACE = 300,
-+ TK_STAR = 301,
-+ TK_STRING = 302,
-+ TK_TABLE = 303,
-+ TK_TEMPORARY = 304,
-+ TK_UPDATE = 305,
-+ TK_VALUES = 306,
-+ TK_WHERE = 307,
-+ TK_WILDCARD = 308,
-+ COLUMN = 310,
-+ FUNCTION = 311,
-+ COMMENT = 312,
-+ UNCLOSED_STRING = 313,
-+ SPACE = 314,
-+ ILLEGAL = 315,
-+ END_OF_FILE = 316,
-+ TK_LIKE = 317,
-+ TK_NEGATION = 318
-+ };
-+#endif
-+/* Tokens. */
-+#define TK_ALTER 258
-+#define TK_AND 259
-+#define TK_BY 260
-+#define TK_CHAR 261
-+#define TK_COMMA 262
-+#define TK_CREATE 263
-+#define TK_DELETE 264
-+#define TK_DISTINCT 265
-+#define TK_DOT 266
-+#define TK_EQ 267
-+#define TK_FREE 268
-+#define TK_FROM 269
-+#define TK_GE 270
-+#define TK_GT 271
-+#define TK_HOLD 272
-+#define TK_ADD 273
-+#define TK_ID 274
-+#define TK_ILLEGAL 275
-+#define TK_INSERT 276
-+#define TK_INT 277
-+#define TK_INTEGER 278
-+#define TK_INTO 279
-+#define TK_IS 280
-+#define TK_KEY 281
-+#define TK_LE 282
-+#define TK_LONG 283
-+#define TK_LONGCHAR 284
-+#define TK_LP 285
-+#define TK_LT 286
-+#define TK_LOCALIZABLE 287
-+#define TK_MINUS 288
-+#define TK_NE 289
-+#define TK_NOT 290
-+#define TK_NULL 291
-+#define TK_OBJECT 292
-+#define TK_OR 293
-+#define TK_ORDER 294
-+#define TK_PRIMARY 295
-+#define TK_RP 296
-+#define TK_SELECT 297
-+#define TK_SET 298
-+#define TK_SHORT 299
-+#define TK_SPACE 300
-+#define TK_STAR 301
-+#define TK_STRING 302
-+#define TK_TABLE 303
-+#define TK_TEMPORARY 304
-+#define TK_UPDATE 305
-+#define TK_VALUES 306
-+#define TK_WHERE 307
-+#define TK_WILDCARD 308
-+#define COLUMN 310
-+#define FUNCTION 311
-+#define COMMENT 312
-+#define UNCLOSED_STRING 313
-+#define SPACE 314
-+#define ILLEGAL 315
-+#define END_OF_FILE 316
-+#define TK_LIKE 317
-+#define TK_NEGATION 318
-+
-+
-+
-+
-+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-+#line 74 "sql.y"
-+typedef union YYSTYPE {
-+ struct sql_str str;
-+ LPWSTR string;
-+ column_info *column_list;
-+ MSIVIEW *query;
-+ struct expr *expr;
-+ USHORT column_type;
-+ int integer;
-+} YYSTYPE;
-+/* Line 1447 of yacc.c. */
-+#line 172 "sql.tab.h"
-+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
-+# define YYSTYPE_IS_DECLARED 1
-+# define YYSTYPE_IS_TRIVIAL 1
-+#endif
-+
-+
-+
-+
-+
diff --git a/dll/win32/msi/msipriv.h b/dll/win32/msi/msipriv.h
index 0516dd18da7..cf9e6909f5d 100644
--- a/dll/win32/msi/msipriv.h
+++ b/dll/win32/msi/msipriv.h
@@ -143,13 +143,15 @@ typedef struct tagMSIMEDIAINFO
LPWSTR volume_label;
BOOL is_continuous;
BOOL is_extracted;
- WCHAR source[MAX_PATH];
+ WCHAR sourcedir[MAX_PATH];
} MSIMEDIAINFO;
typedef struct tagMSIPATCHINFO
{
+ struct list entry;
LPWSTR patchcode;
LPWSTR transforms;
+ LPWSTR localfile;
} MSIPATCHINFO;
typedef struct _column_info
@@ -302,7 +304,7 @@ typedef struct tagMSIPACKAGE
{
MSIOBJECTHDR hdr;
MSIDATABASE *db;
- MSIPATCHINFO *patch;
+ struct list patches;
struct list components;
struct list features;
struct list files;
@@ -466,6 +468,7 @@ typedef struct tagMSIFILE
LPWSTR TargetPath;
BOOL IsCompressed;
MSIFILEHASHINFO hash;
+ UINT disk_id;
} MSIFILE;
typedef struct tagMSITEMPFILE
@@ -553,6 +556,7 @@ struct tagMSIMIME
struct list entry;
LPWSTR ContentType; /* Primary Key */
MSIEXTENSION *Extension;
+ LPWSTR suffix;
LPWSTR clsid;
MSICLASS *Class;
/* not in the table, set during installation */
@@ -660,8 +664,7 @@ enum StringPersistence
StringNonPersistent = 1
};
-extern BOOL msi_addstringW( string_table *st, UINT string_no, const WCHAR *data, int len, UINT refcount, enum StringPersistence persistence );
-
+extern BOOL msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence );
extern UINT msi_string2idW( const string_table *st, LPCWSTR buffer, UINT *id );
extern VOID msi_destroy_stringtable( string_table *st );
extern const WCHAR *msi_string_lookup_id( const string_table *st, UINT id );
@@ -672,8 +675,6 @@ extern UINT msi_save_string_table( const string_table *st, IStorage *storage );
extern BOOL TABLE_Exists( MSIDATABASE *db, LPCWSTR name );
extern MSICONDITION MSI_DatabaseIsTablePersistent( MSIDATABASE *db, LPCWSTR table );
-extern UINT read_raw_stream_data( MSIDATABASE *db, LPCWSTR stname,
- USHORT **pdata, UINT *psz );
extern UINT read_stream_data( IStorage *stg, LPCWSTR stname, BOOL table,
BYTE **pdata, UINT *psz );
extern UINT write_stream_data( IStorage *stg, LPCWSTR stname,
@@ -685,7 +686,10 @@ extern UINT MSI_DatabaseApplyTransformW( MSIDATABASE *db,
LPCWSTR szTransformFile, int iErrorCond );
extern void append_storage_to_db( MSIDATABASE *db, IStorage *stg );
+/* patch functions */
extern UINT msi_check_patch_applicable( MSIPACKAGE *package, MSISUMMARYINFO *si );
+extern UINT msi_parse_patch_summary( MSISUMMARYINFO *si, MSIPATCHINFO **patch );
+extern UINT msi_apply_patch_db( MSIPACKAGE *package, MSIDATABASE *patch_db, MSIPATCHINFO *patch );
/* action internals */
extern UINT MSI_InstallPackage( MSIPACKAGE *, LPCWSTR, LPCWSTR );
@@ -724,6 +728,7 @@ extern BOOL decode_streamname(LPCWSTR in, LPWSTR out);
/* database internals */
extern UINT db_get_raw_stream( MSIDATABASE *, LPCWSTR, IStream ** );
+void db_destroy_stream( MSIDATABASE *, LPCWSTR );
extern UINT MSI_OpenDatabaseW( LPCWSTR, LPCWSTR, MSIDATABASE ** );
extern UINT MSI_DatabaseOpenViewW(MSIDATABASE *, LPCWSTR, MSIQUERY ** );
extern UINT MSI_OpenQuery( MSIDATABASE *, MSIQUERY **, LPCWSTR, ... );
@@ -748,10 +753,7 @@ extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel );
extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR );
extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage );
extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
-extern UINT MSI_SetPropertyW( MSIPACKAGE *, LPCWSTR, LPCWSTR );
extern INT MSI_ProcessMessage( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * );
-extern UINT MSI_GetPropertyW( MSIPACKAGE *, LPCWSTR, LPWSTR, LPDWORD );
-extern UINT MSI_GetPropertyA(MSIPACKAGE *, LPCSTR, LPSTR, LPDWORD );
extern MSICONDITION MSI_EvaluateConditionW( MSIPACKAGE *, LPCWSTR );
extern UINT MSI_GetComponentStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * );
extern UINT MSI_GetFeatureStateW( MSIPACKAGE *, LPCWSTR, INSTALLSTATE *, INSTALLSTATE * );
@@ -760,6 +762,7 @@ extern UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename );
extern UINT msi_package_add_info(MSIPACKAGE *, DWORD, DWORD, LPCWSTR, LPWSTR);
extern UINT msi_package_add_media_disk(MSIPACKAGE *, DWORD, DWORD, DWORD, LPWSTR, LPWSTR);
extern UINT msi_clone_properties(MSIPACKAGE *);
+extern UINT msi_set_context(MSIPACKAGE *);
extern UINT MSI_GetFeatureCost(MSIPACKAGE *, MSIFEATURE *, MSICOSTTREE, INSTALLSTATE, LPINT);
/* for deformating */
@@ -787,12 +790,15 @@ extern UINT MSIREG_OpenUserDataProductKey(LPCWSTR szProduct, MSIINSTALLCONTEXT d
LPCWSTR szUserSid, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
HKEY *key, BOOL create);
+extern UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context,
+ HKEY *key, BOOL create);
extern UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
LPCWSTR szUserSid, HKEY *key, BOOL create);
extern UINT MSIREG_OpenUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_OpenUserUpgradeCodesKey(LPCWSTR szProduct, HKEY* key, BOOL create);
extern UINT MSIREG_DeleteProductKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserProductKey(LPCWSTR szProduct);
+extern UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context);
extern UINT MSIREG_DeleteUserDataProductKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserFeaturesKey(LPCWSTR szProduct);
extern UINT MSIREG_DeleteUserDataComponentKey(LPCWSTR szComponent, LPCWSTR szUserSid);
@@ -963,16 +969,23 @@ extern UINT ACTION_RegisterProgIdInfo(MSIPACKAGE *package);
extern UINT ACTION_RegisterExtensionInfo(MSIPACKAGE *package);
extern UINT ACTION_RegisterMIMEInfo(MSIPACKAGE *package);
extern UINT ACTION_RegisterFonts(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterClassInfo(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterExtensionInfo(MSIPACKAGE *package);
extern UINT ACTION_UnregisterFonts(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterMIMEInfo(MSIPACKAGE *package);
+extern UINT ACTION_UnregisterProgIdInfo(MSIPACKAGE *package);
/* Helpers */
extern DWORD deformat_string(MSIPACKAGE *package, LPCWSTR ptr, WCHAR** data );
extern LPWSTR msi_dup_record_field(MSIRECORD *row, INT index);
-extern LPWSTR msi_dup_property(MSIPACKAGE *package, LPCWSTR prop);
-extern int msi_get_property_int( MSIPACKAGE *package, LPCWSTR prop, int def );
+extern LPWSTR msi_dup_property( MSIDATABASE *db, LPCWSTR prop );
+extern UINT msi_set_property( MSIDATABASE *, LPCWSTR, LPCWSTR );
+extern UINT msi_get_property( MSIDATABASE *, LPCWSTR, LPWSTR, LPDWORD );
+extern int msi_get_property_int( MSIDATABASE *package, LPCWSTR prop, int def );
extern LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source,
BOOL set_prop, BOOL load_prop, MSIFOLDER **folder);
extern LPWSTR resolve_file_source(MSIPACKAGE *package, MSIFILE *file);
+extern void msi_reset_folders( MSIPACKAGE *package, BOOL source );
extern MSICOMPONENT *get_loaded_component( MSIPACKAGE* package, LPCWSTR Component );
extern MSIFEATURE *get_loaded_feature( MSIPACKAGE* package, LPCWSTR Feature );
extern MSIFILE *get_loaded_file( MSIPACKAGE* package, LPCWSTR file );
@@ -992,6 +1005,7 @@ extern WCHAR* generate_error_string(MSIPACKAGE *, UINT, DWORD, ... );
extern UINT msi_create_component_directories( MSIPACKAGE *package );
extern UINT msi_set_last_used_source(LPCWSTR product, LPCWSTR usersid,
MSIINSTALLCONTEXT context, DWORD options, LPCWSTR value);
+extern UINT msi_get_local_package_name(LPWSTR path, LPCWSTR suffix);
/* media */
@@ -1084,6 +1098,23 @@ static const WCHAR szHU[] = {'H','K','E','Y','_','U','S','E','R','S','\\',0};
static const WCHAR szWindowsFolder[] = {'W','i','n','d','o','w','s','F','o','l','d','e','r',0};
static const WCHAR szAppSearch[] = {'A','p','p','S','e','a','r','c','h',0};
static const WCHAR szMoveFiles[] = {'M','o','v','e','F','i','l','e','s',0};
+static const WCHAR szCCPSearch[] = {'C','C','P','S','e','a','r','c','h',0};
+static const WCHAR szUnregisterClassInfo[] = {'U','n','r','e','g','i','s','t','e','r','C','l','a','s','s','I','n','f','o',0};
+static const WCHAR szUnregisterExtensionInfo[] = {'U','n','r','e','g','i','s','t','e','r','E','x','t','e','n','s','i','o','n','I','n','f','o',0};
+static const WCHAR szUnregisterMIMEInfo[] = {'U','n','r','e','g','i','s','t','e','r','M','I','M','E','I','n','f','o',0};
+static const WCHAR szUnregisterProgIdInfo[] = {'U','n','r','e','g','i','s','t','e','r','P','r','o','g','I','d','I','n','f','o',0};
+static const WCHAR szRegisterFonts[] = {'R','e','g','i','s','t','e','r','F','o','n','t','s',0};
+static const WCHAR szUnregisterFonts[] = {'U','n','r','e','g','i','s','t','e','r','F','o','n','t','s',0};
+static const WCHAR szCLSID[] = {'C','L','S','I','D',0};
+static const WCHAR szProgID[] = {'P','r','o','g','I','D',0};
+static const WCHAR szVIProgID[] = {'V','e','r','s','i','o','n','I','n','d','e','p','e','n','d','e','n','t','P','r','o','g','I','D',0};
+static const WCHAR szAppID[] = {'A','p','p','I','D',0};
+static const WCHAR szDefaultIcon[] = {'D','e','f','a','u','l','t','I','c','o','n',0};
+static const WCHAR szInprocHandler[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r',0};
+static const WCHAR szInprocHandler32[] = {'I','n','p','r','o','c','H','a','n','d','l','e','r','3','2',0};
+static const WCHAR szMIMEDatabase[] = {'M','I','M','E','\\','D','a','t','a','b','a','s','e','\\','C','o','n','t','e','n','t',' ','T','y','p','e','\\',0};
+static const WCHAR szLocalPackage[] = {'L','o','c','a','l','P','a','c','k','a','g','e',0};
+static const WCHAR szOriginalDatabase[] = {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
/* memory allocation macro functions */
static void *msi_alloc( size_t len ) __WINE_ALLOC_SIZE(1);
diff --git a/dll/win32/msi/package.c b/dll/win32/msi/package.c
index b1741ae87cf..fba722fe55c 100644
--- a/dll/win32/msi/package.c
+++ b/dll/win32/msi/package.c
@@ -214,6 +214,7 @@ static void free_package_structures( MSIPACKAGE *package )
MSIMIME *mt = LIST_ENTRY( item, MSIMIME, entry );
list_remove( &mt->entry );
+ msi_free( mt->suffix );
msi_free( mt->clsid );
msi_free( mt->ContentType );
msi_free( mt );
@@ -263,11 +264,15 @@ static void free_package_structures( MSIPACKAGE *package )
msi_free( package->script );
}
- if (package->patch)
+ LIST_FOR_EACH_SAFE( item, cursor, &package->patches )
{
- msi_free( package->patch->patchcode );
- msi_free( package->patch->transforms );
- msi_free( package->patch );
+ MSIPATCHINFO *patch = LIST_ENTRY( item, MSIPATCHINFO, entry );
+
+ list_remove( &patch->entry );
+ msi_free( patch->patchcode );
+ msi_free( patch->transforms );
+ msi_free( patch->localfile );
+ msi_free( patch );
}
msi_free( package->BaseURL );
@@ -388,7 +393,7 @@ static UINT set_installed_prop( MSIPACKAGE *package )
if (r == ERROR_SUCCESS)
{
RegCloseKey( hkey );
- MSI_SetPropertyW( package, szInstalled, szOne );
+ msi_set_property( package->db, szInstalled, szOne );
}
return r;
@@ -431,7 +436,7 @@ static UINT set_user_sid_prop( MSIPACKAGE *package )
if (!ConvertSidToStringSidW( psid, &sid_str ))
goto done;
- r = MSI_SetPropertyW( package, szUserSID, sid_str );
+ r = msi_set_property( package->db, szUserSID, sid_str );
done:
LocalFree( sid_str );
@@ -563,7 +568,7 @@ static void set_msi_assembly_prop(MSIPACKAGE *package)
if (!val_len || !verstr)
goto done;
- MSI_SetPropertyW(package, netasm, verstr);
+ msi_set_property(package->db, netasm, verstr);
done:
msi_free(fusion);
@@ -689,96 +694,96 @@ static VOID set_installer_properties(MSIPACKAGE *package)
SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES_COMMON,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, CFF, pth);
+ msi_set_property(package->db, CFF, pth);
SHGetFolderPathW(NULL,CSIDL_PROGRAM_FILES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, PFF, pth);
+ msi_set_property(package->db, PFF, pth);
SHGetFolderPathW(NULL,CSIDL_COMMON_APPDATA,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, CADF, pth);
+ msi_set_property(package->db, CADF, pth);
SHGetFolderPathW(NULL,CSIDL_FAVORITES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, FaF, pth);
+ msi_set_property(package->db, FaF, pth);
SHGetFolderPathW(NULL,CSIDL_FONTS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, FoF, pth);
+ msi_set_property(package->db, FoF, pth);
SHGetFolderPathW(NULL,CSIDL_SENDTO,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, SendTF, pth);
+ msi_set_property(package->db, SendTF, pth);
SHGetFolderPathW(NULL,CSIDL_STARTMENU,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, SMF, pth);
+ msi_set_property(package->db, SMF, pth);
SHGetFolderPathW(NULL,CSIDL_STARTUP,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, StF, pth);
+ msi_set_property(package->db, StF, pth);
SHGetFolderPathW(NULL,CSIDL_TEMPLATES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, TemplF, pth);
+ msi_set_property(package->db, TemplF, pth);
SHGetFolderPathW(NULL,CSIDL_DESKTOP,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, DF, pth);
+ msi_set_property(package->db, DF, pth);
SHGetFolderPathW(NULL,CSIDL_PROGRAMS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, PMF, pth);
+ msi_set_property(package->db, PMF, pth);
SHGetFolderPathW(NULL,CSIDL_ADMINTOOLS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, ATF, pth);
+ msi_set_property(package->db, ATF, pth);
SHGetFolderPathW(NULL,CSIDL_APPDATA,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, ADF, pth);
+ msi_set_property(package->db, ADF, pth);
SHGetFolderPathW(NULL,CSIDL_SYSTEM,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, SF, pth);
- MSI_SetPropertyW(package, SF16, pth);
+ msi_set_property(package->db, SF, pth);
+ msi_set_property(package->db, SF16, pth);
SHGetFolderPathW(NULL,CSIDL_LOCAL_APPDATA,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, LADF, pth);
+ msi_set_property(package->db, LADF, pth);
SHGetFolderPathW(NULL,CSIDL_MYPICTURES,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, MPF, pth);
+ msi_set_property(package->db, MPF, pth);
SHGetFolderPathW(NULL,CSIDL_PERSONAL,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, PF, pth);
+ msi_set_property(package->db, PF, pth);
SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth);
strcatW(pth, szBackSlash);
- MSI_SetPropertyW(package, WF, pth);
+ msi_set_property(package->db, WF, pth);
/* Physical Memory is specified in MB. Using total amount. */
msex.dwLength = sizeof(msex);
GlobalMemoryStatusEx( &msex );
sprintfW( bufstr, szIntFormat, (int)(msex.ullTotalPhys/1024/1024));
- MSI_SetPropertyW(package, szPhysicalMemory, bufstr);
+ msi_set_property(package->db, szPhysicalMemory, bufstr);
SHGetFolderPathW(NULL,CSIDL_WINDOWS,NULL,0,pth);
ptr = strchrW(pth,'\\');
if (ptr)
*(ptr+1) = 0;
- MSI_SetPropertyW(package, WV, pth);
+ msi_set_property(package->db, WV, pth);
GetTempPathW(MAX_PATH,pth);
- MSI_SetPropertyW(package, TF, pth);
+ msi_set_property(package->db, TF, pth);
/* in a wine environment the user is always admin and privileged */
- MSI_SetPropertyW(package,szAdminUser,szOne);
- MSI_SetPropertyW(package,szPriv,szOne);
+ msi_set_property(package->db, szAdminUser, szOne);
+ msi_set_property(package->db, szPriv, szOne);
/* set the os things */
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXW);
@@ -788,54 +793,54 @@ static VOID set_installer_properties(MSIPACKAGE *package)
switch (OSVersion.dwPlatformId)
{
case VER_PLATFORM_WIN32_WINDOWS:
- MSI_SetPropertyW(package,v9x,verstr);
+ msi_set_property(package->db, v9x, verstr);
break;
case VER_PLATFORM_WIN32_NT:
- MSI_SetPropertyW(package,vNT,verstr);
+ msi_set_property(package->db, vNT, verstr);
sprintfW(verstr,szFormat,OSVersion.wProductType);
- MSI_SetPropertyW(package,szMsiNTProductType,verstr);
+ msi_set_property(package->db, szMsiNTProductType, verstr);
break;
}
sprintfW(verstr,szFormat,OSVersion.dwBuildNumber);
- MSI_SetPropertyW(package,szWinBuild,verstr);
+ msi_set_property(package->db, szWinBuild, verstr);
/* just fudge this */
- MSI_SetPropertyW(package,szSPL,szSix);
+ msi_set_property(package->db, szSPL, szSix);
sprintfW( bufstr, szFormat2, MSI_MAJORVERSION, MSI_MINORVERSION);
- MSI_SetPropertyW( package, szVersionMsi, bufstr );
+ msi_set_property( package->db, szVersionMsi, bufstr );
sprintfW( bufstr, szFormat, MSI_MAJORVERSION * 100);
- MSI_SetPropertyW( package, szVersionDatabase, bufstr );
+ msi_set_property( package->db, szVersionDatabase, bufstr );
GetSystemInfo( &sys_info );
if (sys_info.u.s.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL)
{
sprintfW( bufstr, szIntFormat, sys_info.wProcessorLevel );
- MSI_SetPropertyW( package, szIntel, bufstr );
+ msi_set_property( package->db, szIntel, bufstr );
}
/* Screen properties. */
dc = GetDC(0);
sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, HORZRES ) );
- MSI_SetPropertyW( package, szScreenX, bufstr );
+ msi_set_property( package->db, szScreenX, bufstr );
sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, VERTRES ));
- MSI_SetPropertyW( package, szScreenY, bufstr );
+ msi_set_property( package->db, szScreenY, bufstr );
sprintfW( bufstr, szIntFormat, GetDeviceCaps( dc, BITSPIXEL ));
- MSI_SetPropertyW( package, szColorBits, bufstr );
+ msi_set_property( package->db, szColorBits, bufstr );
ReleaseDC(0, dc);
/* USERNAME and COMPANYNAME */
- username = msi_dup_property( package, szUSERNAME );
- companyname = msi_dup_property( package, szCOMPANYNAME );
+ username = msi_dup_property( package->db, szUSERNAME );
+ companyname = msi_dup_property( package->db, szCOMPANYNAME );
if ((!username || !companyname) &&
RegOpenKeyW( HKEY_CURRENT_USER, szUserInfo, &hkey ) == ERROR_SUCCESS)
{
if (!username &&
(username = msi_reg_get_val_str( hkey, szDefName )))
- MSI_SetPropertyW( package, szUSERNAME, username );
+ msi_set_property( package->db, szUSERNAME, username );
if (!companyname &&
(companyname = msi_reg_get_val_str( hkey, szDefCompany )))
- MSI_SetPropertyW( package, szCOMPANYNAME, companyname );
+ msi_set_property( package->db, szCOMPANYNAME, companyname );
CloseHandle( hkey );
}
if ((!username || !companyname) &&
@@ -843,10 +848,10 @@ static VOID set_installer_properties(MSIPACKAGE *package)
{
if (!username &&
(username = msi_reg_get_val_str( hkey, szRegisteredUser )))
- MSI_SetPropertyW( package, szUSERNAME, username );
+ msi_set_property( package->db, szUSERNAME, username );
if (!companyname &&
(companyname = msi_reg_get_val_str( hkey, szRegisteredOrg )))
- MSI_SetPropertyW( package, szCOMPANYNAME, companyname );
+ msi_set_property( package->db, szCOMPANYNAME, companyname );
CloseHandle( hkey );
}
msi_free( username );
@@ -859,7 +864,7 @@ static VOID set_installer_properties(MSIPACKAGE *package)
GetSystemTime( &systemtime );
if (GetDateFormatW( LOCALE_USER_DEFAULT, DATE_SHORTDATE, &systemtime,
NULL, bufstr, sizeof(bufstr)/sizeof(bufstr[0]) ))
- MSI_SetPropertyW( package, szDate, bufstr );
+ msi_set_property( package->db, szDate, bufstr );
else
ERR("Couldn't set Date property: GetDateFormat failed with error %d\n", GetLastError());
@@ -867,7 +872,7 @@ static VOID set_installer_properties(MSIPACKAGE *package)
TIME_FORCE24HOURFORMAT | TIME_NOTIMEMARKER,
&systemtime, NULL, bufstr,
sizeof(bufstr)/sizeof(bufstr[0]) ))
- MSI_SetPropertyW( package, szTime, bufstr );
+ msi_set_property( package->db, szTime, bufstr );
else
ERR("Couldn't set Time property: GetTimeFormat failed with error %d\n", GetLastError());
@@ -875,26 +880,24 @@ static VOID set_installer_properties(MSIPACKAGE *package)
langid = GetUserDefaultLangID();
sprintfW(bufstr, szIntFormat, langid);
-
- MSI_SetPropertyW( package, szUserLangID, bufstr );
+ msi_set_property( package->db, szUserLangID, bufstr );
langid = GetSystemDefaultLangID();
sprintfW(bufstr, szIntFormat, langid);
-
- MSI_SetPropertyW( package, szSystemLangID, bufstr );
+ msi_set_property( package->db, szSystemLangID, bufstr );
sprintfW(bufstr, szIntFormat, MsiQueryProductStateW(package->ProductCode));
- MSI_SetPropertyW( package, szProductState, bufstr );
+ msi_set_property( package->db, szProductState, bufstr );
len = 0;
if (!GetUserNameW( NULL, &len ) && GetLastError() == ERROR_MORE_DATA)
{
WCHAR *username;
- if ((username = HeapAlloc( GetProcessHeap(), 0, len * sizeof(WCHAR) )))
+ if ((username = msi_alloc( len * sizeof(WCHAR) )))
{
if (GetUserNameW( username, &len ))
- MSI_SetPropertyW( package, szLogonUser, username );
- HeapFree( GetProcessHeap(), 0, username );
+ msi_set_property( package->db, szLogonUser, username );
+ msi_free( username );
}
}
}
@@ -952,7 +955,7 @@ static UINT msi_load_summary_properties( MSIPACKAGE *package )
goto done;
}
- MSI_SetPropertyW( package, szPackageCode, package_code );
+ msi_set_property( package->db, szPackageCode, package_code );
msi_free( package_code );
/* load package attributes */
@@ -988,6 +991,7 @@ static MSIPACKAGE *msi_alloc_package( void )
list_init( &package->RunningActions );
list_init( &package->sourcelist_info );
list_init( &package->sourcelist_media );
+ list_init( &package->patches );
}
return package;
@@ -1013,10 +1017,10 @@ static UINT msi_load_admin_properties(MSIPACKAGE *package)
static void adjust_allusers_property( MSIPACKAGE *package )
{
/* FIXME: this should depend on the user's privileges */
- if (msi_get_property_int( package, szAllUsers, 0 ) == 2)
+ if (msi_get_property_int( package->db, szAllUsers, 0 ) == 2)
{
TRACE("resetting ALLUSERS property from 2 to 1\n");
- MSI_SetPropertyW( package, szAllUsers, szOne );
+ msi_set_property( package->db, szAllUsers, szOne );
}
}
@@ -1043,12 +1047,14 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
create_temp_property_table( package );
msi_clone_properties( package );
- package->ProductCode = msi_dup_property( package, szProductCode );
+ package->ProductCode = msi_dup_property( package->db, szProductCode );
+ package->script = msi_alloc_zero( sizeof(MSISCRIPT) );
+
set_installed_prop( package );
set_installer_properties( package );
sprintfW(uilevel,szpi,gUILevel);
- MSI_SetPropertyW(package, szLevel, uilevel);
+ msi_set_property(package->db, szLevel, uilevel);
r = msi_load_summary_properties( package );
if (r != ERROR_SUCCESS)
@@ -1107,16 +1113,16 @@ UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename )
GetUrlCacheEntryInfoW( szUrl, NULL, &size );
if ( GetLastError() != ERROR_FILE_NOT_FOUND )
{
- cache_entry = HeapAlloc( GetProcessHeap(), 0, size );
+ cache_entry = msi_alloc( size );
if ( !GetUrlCacheEntryInfoW( szUrl, cache_entry, &size ) )
{
UINT error = GetLastError();
- HeapFree( GetProcessHeap(), 0, cache_entry );
+ msi_free( cache_entry );
return error;
}
lstrcpyW( filename, cache_entry->lpszLocalFileName );
- HeapFree( GetProcessHeap(), 0, cache_entry );
+ msi_free( cache_entry );
return ERROR_SUCCESS;
}
@@ -1130,12 +1136,12 @@ UINT msi_download_file( LPCWSTR szUrl, LPWSTR filename )
return ERROR_SUCCESS;
}
-static UINT msi_get_local_package_name( LPWSTR path )
+UINT msi_get_local_package_name( LPWSTR path, LPCWSTR suffix )
{
static const WCHAR szInstaller[] = {
'\\','I','n','s','t','a','l','l','e','r','\\',0};
- static const WCHAR fmt[] = { '%','x','.','m','s','i',0};
- DWORD time, len, i;
+ static const WCHAR fmt[] = {'%','x',0};
+ DWORD time, len, i, offset;
HANDLE handle;
time = GetTickCount();
@@ -1146,7 +1152,8 @@ static UINT msi_get_local_package_name( LPWSTR path )
len = strlenW(path);
for (i = 0; i < 0x10000; i++)
{
- snprintfW( &path[len], MAX_PATH - len, fmt, (time + i)&0xffff );
+ offset = snprintfW( path + len, MAX_PATH - len, fmt, (time + i) & 0xffff );
+ memcpy( path + len + offset, suffix, (strlenW( suffix ) + 1) * sizeof(WCHAR) );
handle = CreateFileW( path, GENERIC_WRITE, 0, NULL,
CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0 );
if (handle != INVALID_HANDLE_VALUE)
@@ -1162,11 +1169,64 @@ static UINT msi_get_local_package_name( LPWSTR path )
return ERROR_SUCCESS;
}
+static UINT apply_registered_patch( MSIPACKAGE *package, LPCWSTR patch_code )
+{
+ UINT r;
+ DWORD len;
+ WCHAR patch_file[MAX_PATH];
+ MSIDATABASE *patch_db;
+ MSIPATCHINFO *patch_info;
+ MSISUMMARYINFO *si;
+
+ len = sizeof(patch_file) / sizeof(WCHAR);
+ r = MsiGetPatchInfoExW( patch_code, package->ProductCode, NULL, package->Context,
+ INSTALLPROPERTY_LOCALPACKAGEW, patch_file, &len );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to get patch filename %u\n", r);
+ return r;
+ }
+
+ r = MSI_OpenDatabaseW( patch_file, MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE, &patch_db );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to open patch database %s\n", debugstr_w( patch_file ));
+ return r;
+ }
+
+ si = MSI_GetSummaryInformationW( patch_db->storage, 0 );
+ if (!si)
+ {
+ msiobj_release( &patch_db->hdr );
+ return ERROR_FUNCTION_FAILED;
+ }
+
+ r = msi_parse_patch_summary( si, &patch_info );
+ msiobj_release( &si->hdr );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to parse patch summary %u\n", r);
+ msiobj_release( &patch_db->hdr );
+ return r;
+ }
+
+ r = msi_apply_patch_db( package, patch_db, patch_info );
+ msiobj_release( &patch_db->hdr );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("failed to apply patch %u\n", r);
+ msi_free( patch_info->patchcode );
+ msi_free( patch_info->transforms );
+ msi_free( patch_info->localfile );
+ msi_free( patch_info );
+ }
+ return r;
+}
+
UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
{
- static const WCHAR OriginalDatabase[] =
- {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0};
+ static const WCHAR dotmsi[] = {'.','m','s','i',0};
MSIDATABASE *db = NULL;
MSIPACKAGE *package;
MSIHANDLE handle;
@@ -1174,6 +1234,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
UINT r;
WCHAR temppath[MAX_PATH], localfile[MAX_PATH], cachefile[MAX_PATH];
LPCWSTR file = szPackage;
+ DWORD index = 0;
TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
@@ -1225,7 +1286,7 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
file = temppath;
}
- r = msi_get_local_package_name( localfile );
+ r = msi_get_local_package_name( localfile, dotmsi );
if (r != ERROR_SUCCESS)
return r;
@@ -1273,23 +1334,44 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
if( file != szPackage )
track_tempfile( package, file );
- MSI_SetPropertyW( package, Database, db->path );
+ msi_set_property( package->db, Database, db->path );
if( UrlIsW( szPackage, URLIS_URL ) )
- MSI_SetPropertyW( package, OriginalDatabase, szPackage );
+ msi_set_property( package->db, szOriginalDatabase, szPackage );
else if( szPackage[0] == '#' )
- MSI_SetPropertyW( package, OriginalDatabase, db->path );
+ msi_set_property( package->db, szOriginalDatabase, db->path );
else
{
WCHAR fullpath[MAX_PATH];
GetFullPathNameW( szPackage, MAX_PATH, fullpath, NULL );
- MSI_SetPropertyW( package, OriginalDatabase, fullpath );
+ msi_set_property( package->db, szOriginalDatabase, fullpath );
}
- package->script = msi_alloc_zero( sizeof(MSISCRIPT) );
- *pPackage = package;
+ msi_set_context( package );
+ while (1)
+ {
+ WCHAR patch_code[GUID_SIZE];
+ r = MsiEnumPatchesExW( package->ProductCode, NULL, package->Context,
+ MSIPATCHSTATE_APPLIED, index, patch_code, NULL, NULL, NULL, NULL );
+ if (r != ERROR_SUCCESS)
+ break;
+
+ TRACE("found registered patch %s\n", debugstr_w(patch_code));
+
+ r = apply_registered_patch( package, patch_code );
+ if (r != ERROR_SUCCESS)
+ {
+ ERR("registered patch failed to apply %u\n", r);
+ MSI_FreePackage( (MSIOBJECTHDR *)package );
+ return r;
+ }
+
+ index++;
+ }
+
+ *pPackage = package;
return ERROR_SUCCESS;
}
@@ -1357,6 +1439,7 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
{
MSIPACKAGE *package;
MSIHANDLE handle = 0;
+ IUnknown *remote_unk;
IWineMsiRemotePackage *remote_package;
TRACE("(%d)\n",hInstall);
@@ -1367,10 +1450,19 @@ MSIHANDLE WINAPI MsiGetActiveDatabase(MSIHANDLE hInstall)
handle = alloc_msihandle( &package->db->hdr );
msiobj_release( &package->hdr );
}
- else if ((remote_package = (IWineMsiRemotePackage *)msi_get_remote( hInstall )))
+ else if ((remote_unk = msi_get_remote(hInstall)))
{
- IWineMsiRemotePackage_GetActiveDatabase(remote_package, &handle);
- IWineMsiRemotePackage_Release(remote_package);
+ if (IUnknown_QueryInterface(remote_unk, &IID_IWineMsiRemotePackage,
+ (LPVOID *)&remote_package) == S_OK)
+ {
+ IWineMsiRemotePackage_GetActiveDatabase(remote_package, &handle);
+ IWineMsiRemotePackage_Release(remote_package);
+ }
+ else
+ {
+ WARN("remote handle %d is not a package\n", hInstall);
+ }
+ IUnknown_Release(remote_unk);
}
return handle;
@@ -1621,7 +1713,7 @@ end:
return r;
}
-static void msi_reset_folders( MSIPACKAGE *package, BOOL source )
+void msi_reset_folders( MSIPACKAGE *package, BOOL source )
{
MSIFOLDER *folder;
@@ -1640,7 +1732,7 @@ static void msi_reset_folders( MSIPACKAGE *package, BOOL source )
}
}
-UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
+UINT msi_set_property( MSIDATABASE *db, LPCWSTR szName, LPCWSTR szValue )
{
MSIQUERY *view;
MSIRECORD *row = NULL;
@@ -1664,7 +1756,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
'`','_','P','r','o','p','e','r','t','y','`',' ','W','H','E','R','E',' ',
'`','_','P','r','o','p','e','r','t','y','`',' ','=',' ','\'','%','s','\'',0};
- TRACE("%p %s %s\n", package, debugstr_w(szName), debugstr_w(szValue));
+ TRACE("%p %s %s\n", db, debugstr_w(szName), debugstr_w(szValue));
if (!szName)
return ERROR_INVALID_PARAMETER;
@@ -1673,7 +1765,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
if (!szName[0])
return szValue ? ERROR_FUNCTION_FAILED : ERROR_SUCCESS;
- rc = MSI_GetPropertyW(package, szName, 0, &sz);
+ rc = msi_get_property(db, szName, 0, &sz);
if (!szValue || !*szValue)
{
sprintfW(Query, Delete, szName);
@@ -1694,7 +1786,7 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
MSI_RecordSetStringW(row, 2, szValue);
}
- rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
+ rc = MSI_DatabaseOpenViewW(db, Query, &view);
if (rc == ERROR_SUCCESS)
{
rc = MSI_ViewExecute(view, row);
@@ -1705,9 +1797,6 @@ UINT MSI_SetPropertyW( MSIPACKAGE *package, LPCWSTR szName, LPCWSTR szValue)
if (row)
msiobj_release(&row->hdr);
- if (rc == ERROR_SUCCESS && (!lstrcmpW(szName, cszSourceDir)))
- msi_reset_folders(package, TRUE);
-
return rc;
}
@@ -1754,12 +1843,15 @@ UINT WINAPI MsiSetPropertyW( MSIHANDLE hInstall, LPCWSTR szName, LPCWSTR szValue
return ERROR_SUCCESS;
}
- ret = MSI_SetPropertyW( package, szName, szValue);
+ ret = msi_set_property( package->db, szName, szValue );
+ if (ret == ERROR_SUCCESS && !strcmpW( szName, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+
msiobj_release( &package->hdr );
return ret;
}
-static MSIRECORD *MSI_GetPropertyRow( MSIPACKAGE *package, LPCWSTR name )
+static MSIRECORD *msi_get_property_row( MSIDATABASE *db, LPCWSTR name )
{
MSIQUERY *view;
MSIRECORD *rec, *row = NULL;
@@ -1780,7 +1872,7 @@ static MSIRECORD *MSI_GetPropertyRow( MSIPACKAGE *package, LPCWSTR name )
MSI_RecordSetStringW(rec, 1, name);
- r = MSI_DatabaseOpenViewW(package->db, query, &view);
+ r = MSI_DatabaseOpenViewW(db, query, &view);
if (r == ERROR_SUCCESS)
{
MSI_ViewExecute(view, rec);
@@ -1794,13 +1886,13 @@ static MSIRECORD *MSI_GetPropertyRow( MSIPACKAGE *package, LPCWSTR name )
}
/* internal function, not compatible with MsiGetPropertyW */
-UINT MSI_GetPropertyW( MSIPACKAGE *package, LPCWSTR szName,
+UINT msi_get_property( MSIDATABASE *db, LPCWSTR szName,
LPWSTR szValueBuf, LPDWORD pchValueBuf )
{
MSIRECORD *row;
UINT rc = ERROR_FUNCTION_FAILED;
- row = MSI_GetPropertyRow( package, szName );
+ row = msi_get_property_row( db, szName );
if (*pchValueBuf > 0)
szValueBuf[0] = 0;
@@ -1826,19 +1918,19 @@ UINT MSI_GetPropertyW( MSIPACKAGE *package, LPCWSTR szName,
return rc;
}
-LPWSTR msi_dup_property(MSIPACKAGE *package, LPCWSTR prop)
+LPWSTR msi_dup_property(MSIDATABASE *db, LPCWSTR prop)
{
DWORD sz = 0;
LPWSTR str;
UINT r;
- r = MSI_GetPropertyW(package, prop, NULL, &sz);
+ r = msi_get_property(db, prop, NULL, &sz);
if (r != ERROR_SUCCESS && r != ERROR_MORE_DATA)
return NULL;
sz++;
str = msi_alloc(sz * sizeof(WCHAR));
- r = MSI_GetPropertyW(package, prop, str, &sz);
+ r = msi_get_property(db, prop, str, &sz);
if (r != ERROR_SUCCESS)
{
msi_free(str);
@@ -1848,9 +1940,9 @@ LPWSTR msi_dup_property(MSIPACKAGE *package, LPCWSTR prop)
return str;
}
-int msi_get_property_int(MSIPACKAGE *package, LPCWSTR prop, int def)
+int msi_get_property_int( MSIDATABASE *db, LPCWSTR prop, int def )
{
- LPWSTR str = msi_dup_property(package, prop);
+ LPWSTR str = msi_dup_property( db, prop );
int val = str ? atoiW(str) : def;
msi_free(str);
return val;
@@ -1929,7 +2021,7 @@ done:
return r;
}
- row = MSI_GetPropertyRow( package, name );
+ row = msi_get_property_row( package->db, name );
if (row)
val = MSI_RecordGetString( row, 1 );
diff --git a/dll/win32/msi/registry.c b/dll/win32/msi/registry.c
index 1cbdcc95288..518303f5da0 100644
--- a/dll/win32/msi/registry.c
+++ b/dll/win32/msi/registry.c
@@ -183,6 +183,16 @@ static const WCHAR szUserDataPatch_fmt[] = {
'U','s','e','r','D','a','t','a','\\',
'%','s','\\','P','a','t','c','h','e','s','\\','%','s',0};
+static const WCHAR szUserDataProductPatches_fmt[] = {
+'S','o','f','t','w','a','r','e','\\',
+'M','i','c','r','o','s','o','f','t','\\',
+'W','i','n','d','o','w','s','\\',
+'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+'I','n','s','t','a','l','l','e','r','\\',
+'U','s','e','r','D','a','t','a','\\',
+'%','s','\\','P','r','o','d','u','c','t','s','\\','%','s','\\',
+'P','a','t','c','h','e','s',0};
+
static const WCHAR szInstallProperties_fmt[] = {
'S','o','f','t','w','a','r','e','\\',
'M','i','c','r','o','s','o','f','t','\\',
@@ -286,7 +296,7 @@ BOOL squash_guid(LPCWSTR in, LPWSTR out)
out[0] = 0;
- if (FAILED(CLSIDFromString((LPOLESTR)in, &guid)))
+ if (FAILED(CLSIDFromString((LPCOLESTR)in, &guid)))
return FALSE;
for(i=0; i<8; i++)
@@ -887,6 +897,69 @@ UINT MSIREG_OpenUserDataPatchKey(LPCWSTR szPatch, MSIINSTALLCONTEXT dwContext,
return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
}
+UINT MSIREG_DeleteUserDataPatchKey(LPCWSTR patch, MSIINSTALLCONTEXT context)
+{
+ UINT r;
+ WCHAR squished_patch[GUID_SIZE];
+ WCHAR keypath[0x200];
+ LPWSTR usersid;
+
+ TRACE("%s\n", debugstr_w(patch));
+ if (!squash_guid(patch, squished_patch))
+ return ERROR_FUNCTION_FAILED;
+ TRACE("squished (%s)\n", debugstr_w(squished_patch));
+
+ if (context == MSIINSTALLCONTEXT_MACHINE)
+ sprintfW(keypath, szUserDataPatch_fmt, szLocalSid, squished_patch);
+ else
+ {
+ r = get_user_sid(&usersid);
+ if (r != ERROR_SUCCESS || !usersid)
+ {
+ ERR("Failed to retrieve user SID: %d\n", r);
+ return r;
+ }
+
+ sprintfW(keypath, szUserDataPatch_fmt, usersid, squished_patch);
+ LocalFree(usersid);
+ }
+
+ return RegDeleteTreeW(HKEY_LOCAL_MACHINE, keypath);
+}
+
+UINT MSIREG_OpenUserDataProductPatchesKey(LPCWSTR product, MSIINSTALLCONTEXT context,
+ HKEY *key, BOOL create)
+{
+ UINT rc;
+ WCHAR squished_product[GUID_SIZE];
+ WCHAR keypath[0x200];
+ LPWSTR usersid;
+
+ TRACE("%s\n", debugstr_w(product));
+ if (!squash_guid(product, squished_product))
+ return ERROR_FUNCTION_FAILED;
+
+ if (context == MSIINSTALLCONTEXT_MACHINE)
+ sprintfW(keypath, szUserDataProductPatches_fmt, szLocalSid, squished_product);
+ else
+ {
+ rc = get_user_sid(&usersid);
+ if (rc != ERROR_SUCCESS || !usersid)
+ {
+ ERR("Failed to retrieve user SID: %d\n", rc);
+ return rc;
+ }
+
+ sprintfW(keypath, szUserDataProductPatches_fmt, usersid, squished_product);
+ LocalFree(usersid);
+ }
+
+ if (create)
+ return RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+
+ return RegOpenKeyW(HKEY_LOCAL_MACHINE, keypath, key);
+}
+
UINT MSIREG_OpenInstallProps(LPCWSTR szProduct, MSIINSTALLCONTEXT dwContext,
LPCWSTR szUserSid, HKEY *key, BOOL create)
{
@@ -1156,7 +1229,7 @@ UINT WINAPI MsiDecomposeDescriptorW( LPCWSTR szDescriptor, LPWSTR szProduct,
len = ( &p[21] - szDescriptor );
TRACE("length = %d\n", len);
- *pUsed = len;
+ if (pUsed) *pUsed = len;
return ERROR_SUCCESS;
}
@@ -1236,17 +1309,13 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
if (index && index - last_index != 1)
return ERROR_INVALID_PARAMETER;
+ key = 0;
r = RegCreateKeyW(HKEY_LOCAL_MACHINE, szInstaller_LocalClassesProd, &key);
- if( r != ERROR_SUCCESS )
- return ERROR_NO_MORE_ITEMS;
+ if( r != ERROR_SUCCESS ) goto failed;
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &machine_count, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
- if( r != ERROR_SUCCESS )
- {
- RegCloseKey(key);
- return ERROR_NO_MORE_ITEMS;
- }
+ if( r != ERROR_SUCCESS ) goto failed;
if (machine_count && index <= machine_count)
{
@@ -1261,26 +1330,23 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
}
RegCloseKey(key);
+ key = 0;
r = get_user_sid(&usersid);
if (r != ERROR_SUCCESS || !usersid)
{
ERR("Failed to retrieve user SID: %d\n", r);
+ last_index = 0;
return r;
}
sprintfW(keypath, szInstaller_LocalManaged_fmt, usersid);
LocalFree(usersid);
r = RegCreateKeyW(HKEY_LOCAL_MACHINE, keypath, &key);
- if( r != ERROR_SUCCESS )
- return ERROR_NO_MORE_ITEMS;
+ if( r != ERROR_SUCCESS ) goto failed;
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &managed_count, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
- if( r != ERROR_SUCCESS )
- {
- RegCloseKey(key);
- return ERROR_NO_MORE_ITEMS;
- }
+ if( r != ERROR_SUCCESS ) goto failed;
if (managed_count && index <= machine_count + managed_count)
{
@@ -1295,17 +1361,13 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
}
RegCloseKey(key);
+ key = 0;
r = RegCreateKeyW(HKEY_CURRENT_USER, szUserProduct, &key);
- if( r != ERROR_SUCCESS )
- return ERROR_NO_MORE_ITEMS;
+ if( r != ERROR_SUCCESS ) goto failed;
r = RegQueryInfoKeyW(key, NULL, NULL, NULL, &unmanaged_count, NULL, NULL,
NULL, NULL, NULL, NULL, NULL);
- if( r != ERROR_SUCCESS )
- {
- RegCloseKey(key);
- return ERROR_NO_MORE_ITEMS;
- }
+ if( r != ERROR_SUCCESS ) goto failed;
if (unmanaged_count && index <= machine_count + managed_count + unmanaged_count)
{
@@ -1318,8 +1380,9 @@ UINT WINAPI MsiEnumProductsW(DWORD index, LPWSTR lpguid)
return ERROR_SUCCESS;
}
}
+failed:
RegCloseKey(key);
-
+ last_index = 0;
return ERROR_NO_MORE_ITEMS;
}
@@ -2051,7 +2114,7 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
DWORD idx = 0;
UINT r;
- static int last_index = 0;
+ static DWORD last_index;
TRACE("(%s, %s, %d, %d, %d, %p, %p, %p, %p, %p)\n",
debugstr_w(szProductCode), debugstr_w(szUserSid), dwContext, dwFilter,
@@ -2087,6 +2150,8 @@ UINT WINAPI MsiEnumPatchesExW(LPCWSTR szProductCode, LPCWSTR szUserSid,
if (r == ERROR_SUCCESS)
last_index = dwIndex;
+ else
+ last_index = 0;
return r;
}
diff --git a/dll/win32/msi/script.c b/dll/win32/msi/script.c
index 8dfa6d2ac05..4f223daa8b0 100644
--- a/dll/win32/msi/script.c
+++ b/dll/win32/msi/script.c
@@ -62,7 +62,7 @@ static HRESULT create_ActiveScriptSite(IUnknown *pUnkOuter, LPVOID *ppObj)
if( pUnkOuter )
return CLASS_E_NOAGGREGATION;
- object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MsiActiveScriptSite));
+ object = msi_alloc_zero( sizeof(MsiActiveScriptSite) );
object->lpVtbl.lpVtbl = &ASS_Vtbl;
object->ref = 1;
@@ -236,7 +236,7 @@ static ULONG WINAPI MsiActiveScriptSite_Release(IActiveScriptSite* iface)
TRACE("(%p/%p)\n", iface, This);
if (!ref)
- HeapFree(GetProcessHeap(), 0, This);
+ msi_free(This);
return ref;
}
diff --git a/dll/win32/msi/storages.c b/dll/win32/msi/storages.c
index 6a8134b5627..3e8887437a7 100644
--- a/dll/win32/msi/storages.c
+++ b/dll/win32/msi/storages.c
@@ -43,7 +43,6 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb);
typedef struct tabSTORAGE
{
UINT str_index;
- LPWSTR name;
IStorage *storage;
} STORAGE;
@@ -70,7 +69,7 @@ static BOOL storages_set_table_size(MSISTORAGESVIEW *sv, UINT size)
return TRUE;
}
-static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPWSTR name, IStorage *stg)
+static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPCWSTR name, IStorage *stg)
{
STORAGE *storage;
@@ -78,14 +77,7 @@ static STORAGE *create_storage(MSISTORAGESVIEW *sv, LPWSTR name, IStorage *stg)
if (!storage)
return NULL;
- storage->name = strdupW(name);
- if (!storage->name)
- {
- msi_free(storage);
- return NULL;
- }
-
- storage->str_index = msi_addstringW(sv->db->strings, 0, storage->name, -1, 1, StringNonPersistent);
+ storage->str_index = msi_addstringW(sv->db->strings, name, -1, 1, StringNonPersistent);
storage->storage = stg;
if (storage->storage)
@@ -436,8 +428,6 @@ static UINT STORAGES_delete(struct tagMSIVIEW *view)
{
if (sv->storages[i]->storage)
IStorage_Release(sv->storages[i]->storage);
-
- msi_free(sv->storages[i]->name);
msi_free(sv->storages[i]);
}
diff --git a/dll/win32/msi/streams.c b/dll/win32/msi/streams.c
index 66bda767a00..59e845df82d 100644
--- a/dll/win32/msi/streams.c
+++ b/dll/win32/msi/streams.c
@@ -68,7 +68,7 @@ static BOOL streams_set_table_size(MSISTREAMSVIEW *sv, UINT size)
return TRUE;
}
-static STREAM *create_stream(MSISTREAMSVIEW *sv, LPWSTR name, BOOL encoded, IStream *stm)
+static STREAM *create_stream(MSISTREAMSVIEW *sv, LPCWSTR name, BOOL encoded, IStream *stm)
{
STREAM *stream;
WCHAR decoded[MAX_STREAM_NAME_LEN];
@@ -84,7 +84,7 @@ static STREAM *create_stream(MSISTREAMSVIEW *sv, LPWSTR name, BOOL encoded, IStr
name = decoded;
}
- stream->str_index = msi_addstringW(sv->db->strings, 0, name, -1, 1, StringNonPersistent);
+ stream->str_index = msi_addstringW(sv->db->strings, name, -1, 1, StringNonPersistent);
stream->stream = stm;
return stream;
}
@@ -183,7 +183,7 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
}
encname = encode_streamname(FALSE, name);
- IStorage_DestroyElement(sv->db->storage, encname);
+ db_destroy_stream(sv->db, encname);
r = write_stream_data(sv->db->storage, name, data, count, FALSE);
if (r != ERROR_SUCCESS)
diff --git a/dll/win32/msi/string.c b/dll/win32/msi/string.c
index 3bdc4360bd0..21b1db2a405 100644
--- a/dll/win32/msi/string.c
+++ b/dll/win32/msi/string.c
@@ -44,8 +44,8 @@ WINE_DEFAULT_DEBUG_CHANNEL(msidb);
typedef struct _msistring
{
- UINT persistent_refcount;
- UINT nonpersistent_refcount;
+ USHORT persistent_refcount;
+ USHORT nonpersistent_refcount;
LPWSTR str;
} msistring;
@@ -188,7 +188,7 @@ static void insert_string_sorted( string_table *st, UINT string_id )
st->sortcount++;
}
-static void set_st_entry( string_table *st, UINT n, LPWSTR str, UINT refcount, enum StringPersistence persistence )
+static void set_st_entry( string_table *st, UINT n, LPWSTR str, USHORT refcount, enum StringPersistence persistence )
{
if (persistence == StringPersistent)
{
@@ -237,7 +237,7 @@ static UINT msi_string2idA( const string_table *st, LPCSTR buffer, UINT *id )
return r;
}
-static int msi_addstring( string_table *st, UINT n, const CHAR *data, int len, UINT refcount, enum StringPersistence persistence )
+static int msi_addstring( string_table *st, UINT n, const CHAR *data, int len, USHORT refcount, enum StringPersistence persistence )
{
LPWSTR str;
int sz;
@@ -288,42 +288,28 @@ static int msi_addstring( string_table *st, UINT n, const CHAR *data, int len, U
return n;
}
-int msi_addstringW( string_table *st, UINT n, const WCHAR *data, int len, UINT refcount, enum StringPersistence persistence )
+int msi_addstringW( string_table *st, const WCHAR *data, int len, USHORT refcount, enum StringPersistence persistence )
{
+ UINT n;
LPWSTR str;
- /* TRACE("[%2d] = %s\n", string_no, debugstr_an(data,len) ); */
-
if( !data )
return 0;
if( !data[0] )
return 0;
- if( n > 0 )
+
+ if( msi_string2idW( st, data, &n ) == ERROR_SUCCESS )
{
- if( st->strings[n].persistent_refcount ||
- st->strings[n].nonpersistent_refcount )
- return -1;
- }
- else
- {
- if( ERROR_SUCCESS == msi_string2idW( st, data, &n ) )
- {
- if (persistence == StringPersistent)
- st->strings[n].persistent_refcount += refcount;
- else
- st->strings[n].nonpersistent_refcount += refcount;
- return n;
- }
- n = st_find_free_entry( st );
- if( n == -1 )
- return -1;
+ if (persistence == StringPersistent)
+ st->strings[n].persistent_refcount += refcount;
+ else
+ st->strings[n].nonpersistent_refcount += refcount;
+ return n;
}
- if( n < 1 )
- {
- ERR("invalid index adding %s (%d)\n", debugstr_w( data ), n );
+ n = st_find_free_entry( st );
+ if( n == -1 )
return -1;
- }
/* allocate a new string */
if(len<0)
diff --git a/dll/win32/msi/table.c b/dll/win32/msi/table.c
index 6737ac59168..3b117ae53c4 100644
--- a/dll/win32/msi/table.c
+++ b/dll/win32/msi/table.c
@@ -1383,7 +1383,7 @@ static UINT TABLE_set_row( struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, UI
if ( r != ERROR_SUCCESS )
{
LPCWSTR sval = MSI_RecordGetString( rec, i + 1 );
- val = msi_addstringW( tv->db->strings, 0, sval, -1, 1,
+ val = msi_addstringW( tv->db->strings, sval, -1, 1,
persistent ? StringPersistent : StringNonPersistent );
}
diff --git a/dll/win32/msi/upgrade.c b/dll/win32/msi/upgrade.c
index a440070a4d8..b131d666fe2 100644
--- a/dll/win32/msi/upgrade.c
+++ b/dll/win32/msi/upgrade.c
@@ -61,8 +61,9 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property,
LPWSTR prop;
LPWSTR newprop;
DWORD len;
+ UINT r;
- prop = msi_dup_property(package, action_property );
+ prop = msi_dup_property(package->db, action_property );
if (prop)
len = strlenW(prop);
else
@@ -87,9 +88,13 @@ static void append_productcode(MSIPACKAGE* package, LPCWSTR action_property,
newprop[0] = 0;
strcatW(newprop,productid);
- MSI_SetPropertyW(package, action_property, newprop);
- TRACE("Found Related Product... %s now %s\n",debugstr_w(action_property),
- debugstr_w(newprop));
+ r = msi_set_property( package->db, action_property, newprop );
+ if (r == ERROR_SUCCESS && !strcmpW( action_property, cszSourceDir ))
+ msi_reset_folders( package, TRUE );
+
+ TRACE("Found Related Product... %s now %s\n",
+ debugstr_w(action_property), debugstr_w(newprop));
+
msi_free( prop );
msi_free( newprop );
}
@@ -146,26 +151,30 @@ static UINT ITERATE_FindRelatedProducts(MSIRECORD *rec, LPVOID param)
(LPBYTE)&check, &sz);
/* check min */
ver = MSI_RecordGetString(rec,2);
- comp_ver = msi_version_str_to_dword(ver);
- r = check - comp_ver;
- if (r < 0 || (r == 0 && !(attributes &
- msidbUpgradeAttributesVersionMinInclusive)))
+ if (ver)
{
- RegCloseKey(hukey);
- index ++;
- continue;
+ comp_ver = msi_version_str_to_dword(ver);
+ r = check - comp_ver;
+ if (r < 0 || (r == 0 && !(attributes & msidbUpgradeAttributesVersionMinInclusive)))
+ {
+ RegCloseKey(hukey);
+ index ++;
+ continue;
+ }
}
/* check max */
ver = MSI_RecordGetString(rec,3);
- comp_ver = msi_version_str_to_dword(ver);
- r = check - comp_ver;
- if (r > 0 || (r == 0 && !(attributes &
- msidbUpgradeAttributesVersionMaxInclusive)))
+ if (ver)
{
- RegCloseKey(hukey);
- index ++;
- continue;
+ comp_ver = msi_version_str_to_dword(ver);
+ r = check - comp_ver;
+ if (r > 0 || (r == 0 && !(attributes & msidbUpgradeAttributesVersionMaxInclusive)))
+ {
+ RegCloseKey(hukey);
+ index ++;
+ continue;
+ }
}
/* check language*/
@@ -203,19 +212,19 @@ UINT ACTION_FindRelatedProducts(MSIPACKAGE *package)
UINT rc = ERROR_SUCCESS;
MSIQUERY *view;
- if (msi_get_property_int(package, szInstalled, 0))
+ if (msi_get_property_int(package->db, szInstalled, 0))
{
TRACE("Skipping FindRelatedProducts action: product already installed\n");
return ERROR_SUCCESS;
}
- if (check_unique_action(package,szFindRelatedProducts))
+ if (check_unique_action(package, szFindRelatedProducts))
{
- TRACE("Skipping FindRelatedProducts action: already done on client side\n");
+ TRACE("Skipping FindRelatedProducts action: already done in UI sequence\n");
return ERROR_SUCCESS;
}
else
- register_unique_action(package,szFindRelatedProducts);
+ register_unique_action(package, szFindRelatedProducts);
rc = MSI_DatabaseOpenViewW(package->db, Query, &view);
if (rc != ERROR_SUCCESS)
diff --git a/dll/win32/msrle32/msrle32.rbuild b/dll/win32/msrle32/msrle32.rbuild
index 6ef26447334..2b8a6ca4dc6 100644
--- a/dll/win32/msrle32/msrle32.rbuild
+++ b/dll/win32/msrle32/msrle32.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/msxml3/domdoc.c b/dll/win32/msxml3/domdoc.c
index aae8a343500..d72d20be8dc 100644
--- a/dll/win32/msxml3/domdoc.c
+++ b/dll/win32/msxml3/domdoc.c
@@ -2177,8 +2177,7 @@ xmldoc_SetSite( IObjectWithSite *iface, IUnknown *punk )
return S_OK;
}
- if ( punk )
- IUnknown_AddRef( punk );
+ IUnknown_AddRef( punk );
if(This->site)
IUnknown_Release( This->site );
diff --git a/dll/win32/msxml3/regsvr.c b/dll/win32/msxml3/regsvr.c
index d9b47dde89b..415e5af613a 100644
--- a/dll/win32/msxml3/regsvr.c
+++ b/dll/win32/msxml3/regsvr.c
@@ -515,8 +515,23 @@ static struct regsvr_coclass const coclass_list[] = {
"Both",
"Microsoft.FreeThreadedXMLDOM.1.0",
"1.0"
+ },
+ { &CLSID_FreeThreadedDOMDocument26,
+ "Free Threaded XML DOM Document 2.6",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Microsoft.FreeThreadedXMLDOM.1.0",
+ "1.0"
+ },
+ { &CLSID_FreeThreadedDOMDocument30,
+ "Free Threaded XML DOM Document 3.0",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Microsoft.FreeThreadedDOMDocument.1.0",
+ "1.0"
},
-
{ &CLSID_XMLHTTPRequest,
"XML HTTP Request",
NULL,
@@ -548,6 +563,14 @@ static struct regsvr_coclass const coclass_list[] = {
"Msxml2.XMLSchemaCache",
"3.0"
},
+ { &CLSID_XMLSchemaCache26,
+ "XML Schema Cache 2.6",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.XMLSchemaCache",
+ "2.6"
+ },
{ &CLSID_XMLSchemaCache30,
"XML Schema Cache 3.0",
NULL,
@@ -588,6 +611,22 @@ static struct regsvr_coclass const coclass_list[] = {
"Msxml2.MXXMLWriter",
"3.0"
},
+ { &CLSID_SAXAttributes,
+ "SAX Attribute",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.SAXAttributes",
+ NULL
+ },
+ { &CLSID_SAXAttributes30,
+ "SAX Attribute 3.0",
+ NULL,
+ "msxml3.dll",
+ "Both",
+ "Msxml2.SAXAttributes",
+ "3.0"
+ },
{ NULL } /* list terminator */
};
@@ -642,6 +681,16 @@ static struct progid const progid_list[] = {
&CLSID_DOMFreeThreadedDocument,
"Microsoft.FreeThreadedXMLDOM.1.0"
},
+ { "MSXML.FreeThreadedDOMDocument26",
+ "Free threaded XML DOM Document 2.6",
+ &CLSID_FreeThreadedDOMDocument26,
+ NULL
+ },
+ { "MSXML.FreeThreadedDOMDocument30",
+ "Free threaded XML DOM Document 3.0",
+ &CLSID_FreeThreadedDOMDocument30,
+ NULL
+ },
{ "Microsoft.XMLHTTP",
"XML HTTP Request",
&CLSID_XMLHTTPRequest,
@@ -672,6 +721,11 @@ static struct progid const progid_list[] = {
&CLSID_XMLSchemaCache,
"Msxml2.XMLSchemaCache.3.0"
},
+ { "Msxml2.XMLSchemaCache.2.6",
+ "XML Schema Cache 2.6",
+ &CLSID_XMLSchemaCache26,
+ "Msxml2.XMLSchemaCache.2.6"
+ },
{ "Msxml2.XMLSchemaCache.3.0",
"XML Schema Cache 3.0",
&CLSID_XMLSchemaCache30,
@@ -697,7 +751,16 @@ static struct progid const progid_list[] = {
&CLSID_MXXMLWriter30,
NULL
},
-
+ { "Msxml2.SAXAttributes",
+ "SAX Attribute",
+ &CLSID_SAXAttributes,
+ NULL
+ },
+ { "Msxml2.SAXAttributes.3.0",
+ "SAX Attribute 3.0",
+ &CLSID_SAXAttributes30,
+ NULL
+ },
{ NULL } /* list terminator */
};
diff --git a/dll/win32/netshell/res/neterror.ico b/dll/win32/netshell/res/neterror.ico
index c80f6b7c97d..f20a0a4995b 100644
Binary files a/dll/win32/netshell/res/neterror.ico and b/dll/win32/netshell/res/neterror.ico differ
diff --git a/dll/win32/netshell/res/netidle.ico b/dll/win32/netshell/res/netidle.ico
index fbbdd17da96..6c175cc3d3c 100644
Binary files a/dll/win32/netshell/res/netidle.ico and b/dll/win32/netshell/res/netidle.ico differ
diff --git a/dll/win32/netshell/res/netoff.ico b/dll/win32/netshell/res/netoff.ico
index 0d3bb295e2a..9cb3f62e895 100644
Binary files a/dll/win32/netshell/res/netoff.ico and b/dll/win32/netshell/res/netoff.ico differ
diff --git a/dll/win32/netshell/res/netrec.ico b/dll/win32/netshell/res/netrec.ico
index 5aaffe27e6e..3ada0c28d99 100644
Binary files a/dll/win32/netshell/res/netrec.ico and b/dll/win32/netshell/res/netrec.ico differ
diff --git a/dll/win32/netshell/res/nettrans.ico b/dll/win32/netshell/res/nettrans.ico
index b3f647f20e9..cfad0528c99 100644
Binary files a/dll/win32/netshell/res/nettrans.ico and b/dll/win32/netshell/res/nettrans.ico differ
diff --git a/dll/win32/netshell/res/nettrrec.ico b/dll/win32/netshell/res/nettrrec.ico
index 8c7420827c1..27a2c1aaf4d 100644
Binary files a/dll/win32/netshell/res/nettrrec.ico and b/dll/win32/netshell/res/nettrrec.ico differ
diff --git a/dll/win32/odbccp32/odbccp32.rbuild b/dll/win32/odbccp32/odbccp32.rbuild
index 253485a359e..15bb8d84bb4 100644
--- a/dll/win32/odbccp32/odbccp32.rbuild
+++ b/dll/win32/odbccp32/odbccp32.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/ole32/clipboard.c b/dll/win32/ole32/clipboard.c
index 2afc77e35f0..3064bb04156 100644
--- a/dll/win32/ole32/clipboard.c
+++ b/dll/win32/ole32/clipboard.c
@@ -1266,10 +1266,10 @@ static HRESULT WINAPI snapshot_GetDataHere(IDataObject *iface, FORMATETC *fmt,
ole_priv_data_entry *entry;
TYMED supported;
- TRACE("(%p, %p {%s}, %p (tymed %x)\n", iface, fmt, dump_fmtetc(fmt), med, med->tymed);
-
if ( !fmt || !med ) return E_INVALIDARG;
+ TRACE("(%p, %p {%s}, %p (tymed %x)\n", iface, fmt, dump_fmtetc(fmt), med, med->tymed);
+
if ( !OpenClipboard(NULL)) return CLIPBRD_E_CANT_OPEN;
if(!This->data)
diff --git a/dll/win32/ole32/comcat.c b/dll/win32/ole32/comcat.c
index b8060bdefca..fe0f7e5962e 100644
--- a/dll/win32/ole32/comcat.c
+++ b/dll/win32/ole32/comcat.c
@@ -232,18 +232,20 @@ static HRESULT COMCAT_IsClassOfCategories(
LPCWSTR string;
/* Check that every given category is implemented by class. */
- res = RegOpenKeyExW(key, impl_keyname, 0, KEY_READ, &subkey);
- if (res != ERROR_SUCCESS) return S_FALSE;
- for (string = categories->impl_strings; *string; string += 39) {
- HKEY catkey;
- res = RegOpenKeyExW(subkey, string, 0, 0, &catkey);
- if (res != ERROR_SUCCESS) {
- RegCloseKey(subkey);
- return S_FALSE;
+ if (*categories->impl_strings) {
+ res = RegOpenKeyExW(key, impl_keyname, 0, KEY_READ, &subkey);
+ if (res != ERROR_SUCCESS) return S_FALSE;
+ for (string = categories->impl_strings; *string; string += 39) {
+ HKEY catkey;
+ res = RegOpenKeyExW(subkey, string, 0, 0, &catkey);
+ if (res != ERROR_SUCCESS) {
+ RegCloseKey(subkey);
+ return S_FALSE;
+ }
+ RegCloseKey(catkey);
}
- RegCloseKey(catkey);
+ RegCloseKey(subkey);
}
- RegCloseKey(subkey);
/* Check that all categories required by class are given. */
res = RegOpenKeyExW(key, req_keyname, 0, KEY_READ, &subkey);
diff --git a/dll/win32/ole32/compobj.c b/dll/win32/ole32/compobj.c
index 0fb074dc50c..937f3d8a06c 100644
--- a/dll/win32/ole32/compobj.c
+++ b/dll/win32/ole32/compobj.c
@@ -4156,7 +4156,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID fImpLoad)
break;
case DLL_PROCESS_DETACH:
- OLEDD_UnInitialize();
COMPOBJ_UninitProcess();
RPC_UnregisterAllChannelHooks();
COMPOBJ_DllList_Free();
diff --git a/dll/win32/ole32/compositemoniker.c b/dll/win32/ole32/compositemoniker.c
index 7402b8edbbf..275d875362b 100644
--- a/dll/win32/ole32/compositemoniker.c
+++ b/dll/win32/ole32/compositemoniker.c
@@ -445,7 +445,6 @@ static HRESULT WINAPI
CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar,
IMoniker** ppmkToLeft, IMoniker** ppmkReduced)
{
- HRESULT res;
IMoniker *tempMk,*antiMk,*mostRigthMk,*leftReducedComposedMk,*mostRigthReducedMk;
IEnumMoniker *enumMoniker;
@@ -462,8 +461,8 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
IEnumMoniker_Release(enumMoniker);
- res=CreateAntiMoniker(&antiMk);
- res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
+ CreateAntiMoniker(&antiMk);
+ IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
return IMoniker_Reduce(mostRigthMk,pbc,dwReduceHowFar,&tempMk, ppmkReduced);
@@ -479,8 +478,8 @@ CompositeMonikerImpl_Reduce(IMoniker* iface, IBindCtx* pbc, DWORD dwReduceHowFar
IEnumMoniker_Next(enumMoniker,1,&mostRigthMk,NULL);
IEnumMoniker_Release(enumMoniker);
- res=CreateAntiMoniker(&antiMk);
- res=IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
+ CreateAntiMoniker(&antiMk);
+ IMoniker_ComposeWith(iface,antiMk,0,&tempMk);
IMoniker_Release(antiMk);
/* If any of the components reduces itself, the method returns S_OK and passes back a composite */
diff --git a/dll/win32/ole32/defaulthandler.c b/dll/win32/ole32/defaulthandler.c
index 5130513d57f..d0a871f17c0 100644
--- a/dll/win32/ole32/defaulthandler.c
+++ b/dll/win32/ole32/defaulthandler.c
@@ -365,7 +365,7 @@ static HRESULT WINAPI DefaultHandler_SetClientSite(
if (This->clientSite)
IOleClientSite_AddRef(This->clientSite);
- return S_OK;
+ return hr;
}
/************************************************************************
diff --git a/dll/win32/ole32/hglobalstream.c b/dll/win32/ole32/hglobalstream.c
index 5742f99619a..ef616defec5 100644
--- a/dll/win32/ole32/hglobalstream.c
+++ b/dll/win32/ole32/hglobalstream.c
@@ -371,12 +371,6 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
TRACE("(%p, %x%08x, %d, %p)\n", iface, dlibMove.u.HighPart,
dlibMove.u.LowPart, dwOrigin, plibNewPosition);
- if (dlibMove.u.LowPart >= 0x80000000)
- {
- hr = STG_E_SEEKERROR;
- goto end;
- }
-
/*
* The file pointer is moved depending on the given "function"
* parameter.
@@ -405,10 +399,19 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
newPosition.u.HighPart = 0;
newPosition.u.LowPart += dlibMove.QuadPart;
-end:
- if (plibNewPosition) *plibNewPosition = newPosition;
+ if (dlibMove.u.LowPart >= 0x80000000 &&
+ newPosition.u.LowPart >= dlibMove.u.LowPart)
+ {
+ /* We tried to seek backwards and went past the start. */
+ hr = STG_E_SEEKERROR;
+ goto end;
+ }
+
This->currentPosition = newPosition;
+end:
+ if (plibNewPosition) *plibNewPosition = This->currentPosition;
+
return hr;
}
diff --git a/dll/win32/ole32/ifs.c b/dll/win32/ole32/ifs.c
index c6a6962cd72..1a10c3e1f53 100644
--- a/dll/win32/ole32/ifs.c
+++ b/dll/win32/ole32/ifs.c
@@ -501,7 +501,7 @@ HRESULT WINAPI CoRevokeMallocSpy(void)
}
LeaveCriticalSection(&IMalloc32_SpyCS);
- return S_OK;
+ return hres;
}
/******************************************************************************
diff --git a/dll/win32/ole32/marshal.c b/dll/win32/ole32/marshal.c
index 54a3a87b2b6..d14516f6dec 100644
--- a/dll/win32/ole32/marshal.c
+++ b/dll/win32/ole32/marshal.c
@@ -1214,16 +1214,13 @@ StdMarshalImpl_MarshalInterface(
RPC_StartRemoting(apt);
hres = marshal_object(apt, &stdobjref, riid, pv, mshlflags);
- if (hres)
+ if (hres != S_OK)
{
ERR("Failed to create ifstub, hres=0x%x\n", hres);
return hres;
}
- hres = IStream_Write(pStm, &stdobjref, sizeof(stdobjref), &res);
- if (hres) return hres;
-
- return S_OK;
+ return IStream_Write(pStm, &stdobjref, sizeof(stdobjref), &res);
}
/* helper for StdMarshalImpl_UnmarshalInterface - does the unmarshaling with
@@ -1321,10 +1318,10 @@ StdMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, v
/* read STDOBJREF from wire */
hres = IStream_Read(pStm, &stdobjref, sizeof(stdobjref), &res);
- if (hres) return STG_E_READFAULT;
+ if (hres != S_OK) return STG_E_READFAULT;
hres = apartment_getoxid(apt, &oxid);
- if (hres) return hres;
+ if (hres != S_OK) return hres;
/* check if we're marshalling back to ourselves */
if ((oxid == stdobjref.oxid) && (stubmgr = get_stub_manager(apt, stdobjref.oid)))
@@ -1374,7 +1371,7 @@ StdMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, v
if (stubmgr) stub_manager_int_release(stubmgr);
if (stub_apt) apartment_release(stub_apt);
- if (hres) WARN("Failed with error 0x%08x\n", hres);
+ if (hres != S_OK) WARN("Failed with error 0x%08x\n", hres);
else TRACE("Successfully created proxy %p\n", *ppv);
return hres;
@@ -1392,7 +1389,7 @@ StdMarshalImpl_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm)
TRACE("iface=%p, pStm=%p\n", iface, pStm);
hres = IStream_Read(pStm, &stdobjref, sizeof(stdobjref), &res);
- if (hres) return STG_E_READFAULT;
+ if (hres != S_OK) return STG_E_READFAULT;
TRACE("oxid = %s, oid = %s, ipid = %s\n",
wine_dbgstr_longlong(stdobjref.oxid),
@@ -1516,7 +1513,7 @@ static HRESULT get_marshaler(REFIID riid, IUnknown *pUnk, DWORD dwDestContext,
if (!pUnk)
return E_POINTER;
hr = IUnknown_QueryInterface(pUnk, &IID_IMarshal, (LPVOID*)pMarshal);
- if (hr)
+ if (hr != S_OK)
hr = CoGetStandardMarshal(riid, pUnk, dwDestContext, pvDestContext,
mshlFlags, pMarshal);
return hr;
@@ -1537,7 +1534,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
/* read common OBJREF header */
hr = IStream_Read(stream, &objref, FIELD_OFFSET(OBJREF, u_objref), &res);
- if (hr || (res != FIELD_OFFSET(OBJREF, u_objref)))
+ if (hr != S_OK || (res != FIELD_OFFSET(OBJREF, u_objref)))
{
ERR("Failed to read common OBJREF header, 0x%08x\n", hr);
return STG_E_READFAULT;
@@ -1566,7 +1563,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
/* read constant sized OR_CUSTOM data from stream */
hr = IStream_Read(stream, &objref.u_objref.u_custom,
custom_header_size, &res);
- if (hr || (res != custom_header_size))
+ if (hr != S_OK || (res != custom_header_size))
{
ERR("Failed to read OR_CUSTOM header, 0x%08x\n", hr);
return STG_E_READFAULT;
@@ -1583,7 +1580,7 @@ static HRESULT get_unmarshaler_from_stream(IStream *stream, IMarshal **marshal,
return RPC_E_INVALID_OBJREF;
}
- if (hr)
+ if (hr != S_OK)
ERR("Failed to create marshal, 0x%08x\n", hr);
return hr;
@@ -1618,12 +1615,12 @@ HRESULT WINAPI CoGetMarshalSizeMax(ULONG *pulSize, REFIID riid, IUnknown *pUnk,
CLSID marshaler_clsid;
hr = get_marshaler(riid, pUnk, dwDestContext, pvDestContext, mshlFlags, &pMarshal);
- if (hr)
+ if (hr != S_OK)
return hr;
hr = IMarshal_GetUnmarshalClass(pMarshal, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags, &marshaler_clsid);
- if (hr)
+ if (hr != S_OK)
{
ERR("IMarshal::GetUnmarshalClass failed, 0x%08x\n", hr);
IMarshal_Release(pMarshal);
@@ -1711,7 +1708,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
/* get the marshaler for the specified interface */
hr = get_marshaler(riid, pUnk, dwDestContext, pvDestContext, mshlFlags, &pMarshal);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to get marshaller, 0x%08x\n", hr);
return hr;
@@ -1719,7 +1716,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
hr = IMarshal_GetUnmarshalClass(pMarshal, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags, &marshaler_clsid);
- if (hr)
+ if (hr != S_OK)
{
ERR("IMarshal::GetUnmarshalClass failed, 0x%08x\n", hr);
goto cleanup;
@@ -1733,7 +1730,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
/* write the common OBJREF header to the stream */
hr = IStream_Write(pStream, &objref, FIELD_OFFSET(OBJREF, u_objref), NULL);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to write OBJREF header to stream, 0x%08x\n", hr);
goto cleanup;
@@ -1749,7 +1746,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
hr = IMarshal_GetMarshalSizeMax(pMarshal, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags,
&objref.u_objref.u_custom.size);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to get max size of marshal data, error 0x%08x\n", hr);
goto cleanup;
@@ -1757,7 +1754,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
/* write constant sized common header and OR_CUSTOM data into stream */
hr = IStream_Write(pStream, &objref,
FIELD_OFFSET(OBJREF, u_objref.u_custom.pData), NULL);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to write OR_CUSTOM header to stream with 0x%08x\n", hr);
goto cleanup;
@@ -1769,7 +1766,7 @@ HRESULT WINAPI CoMarshalInterface(IStream *pStream, REFIID riid, IUnknown *pUnk,
hr = IMarshal_MarshalInterface(pMarshal, pStream, riid, pUnk, dwDestContext,
pvDestContext, mshlFlags);
- if (hr)
+ if (hr != S_OK)
{
ERR("Failed to marshal the interface %s, %x\n", debugstr_guid(riid), hr);
goto cleanup;
@@ -1821,7 +1818,7 @@ HRESULT WINAPI CoUnmarshalInterface(IStream *pStream, REFIID riid, LPVOID *ppv)
/* call the helper object to do the actual unmarshaling */
hr = IMarshal_UnmarshalInterface(pMarshal, pStream, &iid, (LPVOID*)&object);
- if (hr)
+ if (hr != S_OK)
ERR("IMarshal::UnmarshalInterface failed, 0x%08x\n", hr);
if (hr == S_OK)
@@ -1831,7 +1828,7 @@ HRESULT WINAPI CoUnmarshalInterface(IStream *pStream, REFIID riid, LPVOID *ppv)
{
TRACE("requested interface != marshalled interface, additional QI needed\n");
hr = IUnknown_QueryInterface(object, riid, ppv);
- if (hr)
+ if (hr != S_OK)
ERR("Couldn't query for interface %s, hr = 0x%08x\n",
debugstr_guid(riid), hr);
IUnknown_Release(object);
@@ -1885,7 +1882,7 @@ HRESULT WINAPI CoReleaseMarshalData(IStream *pStream)
/* call the helper object to do the releasing of marshal data */
hr = IMarshal_ReleaseMarshalData(pMarshal, pStream);
- if (hr)
+ if (hr != S_OK)
ERR("IMarshal::ReleaseMarshalData failed with error 0x%08x\n", hr);
IMarshal_Release(pMarshal);
diff --git a/dll/win32/ole32/moniker.c b/dll/win32/ole32/moniker.c
index 2fb03ae6650..b0030dee59b 100644
--- a/dll/win32/ole32/moniker.c
+++ b/dll/win32/ole32/moniker.c
@@ -1109,7 +1109,13 @@ HRESULT WINAPI MkParseDisplayName(LPBC pbc, LPCOLESTR szDisplayName,
TRACE("(%p, %s, %p, %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
- if (!(IsValidInterface((LPUNKNOWN) pbc)))
+ if (!pbc || !IsValidInterface((LPUNKNOWN) pbc))
+ return E_INVALIDARG;
+
+ if (!szDisplayName || !*szDisplayName)
+ return E_INVALIDARG;
+
+ if (!pchEaten || !ppmk)
return E_INVALIDARG;
*pchEaten = 0;
diff --git a/dll/win32/ole32/ole2.c b/dll/win32/ole32/ole2.c
index 6bf79fdb507..41989f3331b 100644
--- a/dll/win32/ole32/ole2.c
+++ b/dll/win32/ole32/ole2.c
@@ -57,13 +57,6 @@ WINE_DECLARE_DEBUG_CHANNEL(accel);
* These are static/global variables and internal data structures that the
* OLE module uses to maintain it's state.
*/
-typedef struct tagDropTargetNode
-{
- HWND hwndTarget;
- IDropTarget* dropTarget;
- struct list entry;
-} DropTargetNode;
-
typedef struct tagTrackerWindowInfo
{
IDataObject* dataObject;
@@ -110,12 +103,25 @@ static LONG OLE_moduleLockCount = 0;
/*
* Name of our registered window class.
*/
-static const char OLEDD_DRAGTRACKERCLASS[] = "WineDragDropTracker32";
+static const WCHAR OLEDD_DRAGTRACKERCLASS[] =
+ {'W','i','n','e','D','r','a','g','D','r','o','p','T','r','a','c','k','e','r','3','2',0};
/*
- * This is the head of the Drop target container.
+ * Name of menu descriptor property.
*/
-static struct list targetListHead = LIST_INIT(targetListHead);
+static const WCHAR prop_olemenuW[] =
+ {'P','R','O','P','_','O','L','E','M','e','n','u','D','e','s','c','r','i','p','t','o','r',0};
+
+/* property to store IDropTarget pointer */
+static const WCHAR prop_oledroptarget[] =
+ {'O','l','e','D','r','o','p','T','a','r','g','e','t','I','n','t','e','r','f','a','c','e',0};
+
+static const WCHAR clsidfmtW[] =
+ {'C','L','S','I','D','\\','{','%','0','8','x','-','%','0','4','x','-','%','0','4','x','-',
+ '%','0','2','x','%','0','2','x','-','%','0','2','x','%','0','2','x','%','0','2','x','%','0','2','x',
+ '%','0','2','x','%','0','2','x','}','\\',0};
+
+static const WCHAR emptyW[] = { 0 };
/******************************************************************************
* These are the prototypes of miscellaneous utility methods
@@ -144,22 +150,12 @@ extern void OLEClipbrd_Initialize(void);
/******************************************************************************
* These are the prototypes of the utility methods used for OLE Drag n Drop
*/
-static void OLEDD_Initialize(void);
-static DropTargetNode* OLEDD_FindDropTarget(
- HWND hwndOfTarget);
-static void OLEDD_FreeDropTarget(DropTargetNode*, BOOL);
-static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
- HWND hwnd,
- UINT uMsg,
- WPARAM wParam,
- LPARAM lParam);
-static void OLEDD_TrackMouseMove(
- TrackerWindowInfo* trackerInfo);
-static void OLEDD_TrackStateChange(
- TrackerWindowInfo* trackerInfo);
+static void OLEDD_Initialize(void);
+static LRESULT WINAPI OLEDD_DragTrackerWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo);
+static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo);
static DWORD OLEDD_GetButtonState(void);
-
/******************************************************************************
* OleBuildVersion [OLE32.@]
*/
@@ -270,14 +266,22 @@ HRESULT WINAPI OleInitializeWOW(DWORD x, DWORD y) {
return 0;
}
+/***
+ * OLEDD_FindDropTarget()
+ *
+ * Returns IDropTarget pointer registered for this window.
+ */
+static inline IDropTarget* OLEDD_FindDropTarget(HWND hwnd)
+{
+ return GetPropW(hwnd, prop_oledroptarget);
+}
+
/***********************************************************************
* RegisterDragDrop (OLE32.@)
*/
-HRESULT WINAPI RegisterDragDrop(
- HWND hwnd,
- LPDROPTARGET pDropTarget)
+HRESULT WINAPI RegisterDragDrop(HWND hwnd, LPDROPTARGET pDropTarget)
{
- DropTargetNode* dropTargetInfo;
+ DWORD pid = 0;
TRACE("(%p,%p)\n", hwnd, pDropTarget);
@@ -296,32 +300,20 @@ HRESULT WINAPI RegisterDragDrop(
return DRAGDROP_E_INVALIDHWND;
}
- /*
- * First, check if the window is already registered.
- */
- dropTargetInfo = OLEDD_FindDropTarget(hwnd);
+ /* block register for other processes windows */
+ GetWindowThreadProcessId(hwnd, &pid);
+ if (pid != GetCurrentProcessId())
+ {
+ FIXME("register for another process windows is disabled\n");
+ return DRAGDROP_E_INVALIDHWND;
+ }
- if (dropTargetInfo!=NULL)
+ /* check if the window is already registered */
+ if (OLEDD_FindDropTarget(hwnd))
return DRAGDROP_E_ALREADYREGISTERED;
- /*
- * If it's not there, we can add it. We first create a node for it.
- */
- dropTargetInfo = HeapAlloc(GetProcessHeap(), 0, sizeof(DropTargetNode));
-
- if (dropTargetInfo==NULL)
- return E_OUTOFMEMORY;
-
- dropTargetInfo->hwndTarget = hwnd;
-
- /*
- * Don't forget that this is an interface pointer, need to nail it down since
- * we keep a copy of it.
- */
IDropTarget_AddRef(pDropTarget);
- dropTargetInfo->dropTarget = pDropTarget;
-
- list_add_tail(&targetListHead, &dropTargetInfo->entry);
+ SetPropW(hwnd, prop_oledroptarget, pDropTarget);
return S_OK;
}
@@ -329,10 +321,9 @@ HRESULT WINAPI RegisterDragDrop(
/***********************************************************************
* RevokeDragDrop (OLE32.@)
*/
-HRESULT WINAPI RevokeDragDrop(
- HWND hwnd)
+HRESULT WINAPI RevokeDragDrop(HWND hwnd)
{
- DropTargetNode* dropTargetInfo;
+ IDropTarget* droptarget;
TRACE("(%p)\n", hwnd);
@@ -342,18 +333,12 @@ HRESULT WINAPI RevokeDragDrop(
return DRAGDROP_E_INVALIDHWND;
}
- /*
- * First, check if the window is already registered.
- */
- dropTargetInfo = OLEDD_FindDropTarget(hwnd);
-
- /*
- * If it ain't in there, it's an error.
- */
- if (dropTargetInfo==NULL)
+ /* no registration data */
+ if (!(droptarget = OLEDD_FindDropTarget(hwnd)))
return DRAGDROP_E_NOTREGISTERED;
- OLEDD_FreeDropTarget(dropTargetInfo, TRUE);
+ IDropTarget_Release(droptarget);
+ RemovePropW(hwnd, prop_oledroptarget);
return S_OK;
}
@@ -371,13 +356,12 @@ HRESULT WINAPI OleRegGetUserType(
DWORD dwFormOfType,
LPOLESTR* pszUserType)
{
- char keyName[60];
+ WCHAR keyName[60];
DWORD dwKeyType;
DWORD cbData;
HKEY clsidKey;
LONG hres;
- LPSTR buffer;
- HRESULT retVal;
+
/*
* Initialize the out parameter.
*/
@@ -386,17 +370,17 @@ HRESULT WINAPI OleRegGetUserType(
/*
* Build the key name we're looking for
*/
- sprintf( keyName, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\",
- clsid->Data1, clsid->Data2, clsid->Data3,
- clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
- clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
+ sprintfW( keyName, clsidfmtW,
+ clsid->Data1, clsid->Data2, clsid->Data3,
+ clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
+ clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
- TRACE("(%s, %d, %p)\n", keyName, dwFormOfType, pszUserType);
+ TRACE("(%s, %d, %p)\n", debugstr_w(keyName), dwFormOfType, pszUserType);
/*
* Open the class id Key
*/
- hres = RegOpenKeyA(HKEY_CLASSES_ROOT,
+ hres = RegOpenKeyW(HKEY_CLASSES_ROOT,
keyName,
&clsidKey);
@@ -408,8 +392,8 @@ HRESULT WINAPI OleRegGetUserType(
*/
cbData = 0;
- hres = RegQueryValueExA(clsidKey,
- "",
+ hres = RegQueryValueExW(clsidKey,
+ emptyW,
NULL,
&dwKeyType,
NULL,
@@ -424,7 +408,7 @@ HRESULT WINAPI OleRegGetUserType(
/*
* Allocate a buffer for the registry value.
*/
- *pszUserType = CoTaskMemAlloc(cbData*2);
+ *pszUserType = CoTaskMemAlloc(cbData);
if (*pszUserType==NULL)
{
@@ -432,41 +416,24 @@ HRESULT WINAPI OleRegGetUserType(
return E_OUTOFMEMORY;
}
- buffer = HeapAlloc(GetProcessHeap(), 0, cbData);
-
- if (buffer == NULL)
- {
- RegCloseKey(clsidKey);
- CoTaskMemFree(*pszUserType);
- *pszUserType=NULL;
- return E_OUTOFMEMORY;
- }
-
- hres = RegQueryValueExA(clsidKey,
- "",
+ hres = RegQueryValueExW(clsidKey,
+ emptyW,
NULL,
&dwKeyType,
- (LPBYTE) buffer,
+ (LPBYTE) *pszUserType,
&cbData);
RegCloseKey(clsidKey);
-
- if (hres!=ERROR_SUCCESS)
+ if (hres != ERROR_SUCCESS)
{
CoTaskMemFree(*pszUserType);
- *pszUserType=NULL;
+ *pszUserType = NULL;
- retVal = REGDB_E_READREGDB;
+ return REGDB_E_READREGDB;
}
- else
- {
- MultiByteToWideChar( CP_ACP, 0, buffer, -1, *pszUserType, cbData /*FIXME*/ );
- retVal = S_OK;
- }
- HeapFree(GetProcessHeap(), 0, buffer);
- return retVal;
+ return S_OK;
}
/***********************************************************************
@@ -478,17 +445,19 @@ HRESULT WINAPI DoDragDrop (
DWORD dwOKEffect, /* [in] effects allowed by the source */
DWORD *pdwEffect) /* [out] ptr to effects of the source */
{
+ static const WCHAR trackerW[] = {'T','r','a','c','k','e','r','W','i','n','d','o','w',0};
TrackerWindowInfo trackerInfo;
HWND hwndTrackWindow;
MSG msg;
- TRACE("(DataObject %p, DropSource %p)\n", pDataObject, pDropSource);
+ TRACE("(%p, %p, %d, %p)\n", pDataObject, pDropSource, dwOKEffect, pdwEffect);
+
+ if (!pDataObject || !pDropSource || !pdwEffect)
+ return E_INVALIDARG;
/*
* Setup the drag n drop tracking window.
*/
- if (!IsValidInterface((LPUNKNOWN)pDropSource))
- return E_INVALIDARG;
trackerInfo.dataObject = pDataObject;
trackerInfo.dropSource = pDropSource;
@@ -500,12 +469,12 @@ HRESULT WINAPI DoDragDrop (
trackerInfo.curTargetHWND = 0;
trackerInfo.curDragTarget = 0;
- hwndTrackWindow = CreateWindowA(OLEDD_DRAGTRACKERCLASS, "TrackerWindow",
+ hwndTrackWindow = CreateWindowW(OLEDD_DRAGTRACKERCLASS, trackerW,
WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, 0,
&trackerInfo);
- if (hwndTrackWindow!=0)
+ if (hwndTrackWindow)
{
/*
* Capture the mouse input
@@ -517,7 +486,7 @@ HRESULT WINAPI DoDragDrop (
/*
* Pump messages. All mouse input should go to the capture window.
*/
- while (!trackerInfo.trackingDone && GetMessageA(&msg, 0, 0, 0) )
+ while (!trackerInfo.trackingDone && GetMessageW(&msg, 0, 0, 0) )
{
trackerInfo.curMousePos.x = msg.pt.x;
trackerInfo.curMousePos.y = msg.pt.y;
@@ -548,7 +517,7 @@ HRESULT WINAPI DoDragDrop (
/*
* Dispatch the messages only when it's not a keyboard message.
*/
- DispatchMessageA(&msg);
+ DispatchMessageW(&msg);
}
}
@@ -584,7 +553,9 @@ HRESULT WINAPI OleRegGetMiscStatus(
DWORD dwAspect,
DWORD* pdwStatus)
{
- char keyName[60];
+ static const WCHAR miscstatusW[] = {'M','i','s','c','S','t','a','t','u','s',0};
+ static const WCHAR dfmtW[] = {'%','d',0};
+ WCHAR keyName[60];
HKEY clsidKey;
HKEY miscStatusKey;
HKEY aspectKey;
@@ -598,17 +569,17 @@ HRESULT WINAPI OleRegGetMiscStatus(
/*
* Build the key name we're looking for
*/
- sprintf( keyName, "CLSID\\{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}\\",
- clsid->Data1, clsid->Data2, clsid->Data3,
- clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
- clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
+ sprintfW( keyName, clsidfmtW,
+ clsid->Data1, clsid->Data2, clsid->Data3,
+ clsid->Data4[0], clsid->Data4[1], clsid->Data4[2], clsid->Data4[3],
+ clsid->Data4[4], clsid->Data4[5], clsid->Data4[6], clsid->Data4[7] );
- TRACE("(%s, %d, %p)\n", keyName, dwAspect, pdwStatus);
+ TRACE("(%s, %d, %p)\n", debugstr_w(keyName), dwAspect, pdwStatus);
/*
* Open the class id Key
*/
- result = RegOpenKeyA(HKEY_CLASSES_ROOT,
+ result = RegOpenKeyW(HKEY_CLASSES_ROOT,
keyName,
&clsidKey);
@@ -618,8 +589,8 @@ HRESULT WINAPI OleRegGetMiscStatus(
/*
* Get the MiscStatus
*/
- result = RegOpenKeyA(clsidKey,
- "MiscStatus",
+ result = RegOpenKeyW(clsidKey,
+ miscstatusW,
&miscStatusKey);
@@ -637,9 +608,9 @@ HRESULT WINAPI OleRegGetMiscStatus(
/*
* Open the key specific to the requested aspect.
*/
- sprintf(keyName, "%d", dwAspect);
+ sprintfW(keyName, dfmtW, dwAspect);
- result = RegOpenKeyA(miscStatusKey,
+ result = RegOpenKeyW(miscStatusKey,
keyName,
&aspectKey);
@@ -1180,7 +1151,7 @@ static void OLEMenu_UnInitialize(void)
*/
static BOOL OLEMenu_InstallHooks( DWORD tid )
{
- OleMenuHookItem *pHookItem = NULL;
+ OleMenuHookItem *pHookItem;
/* Create an entry for the hook table */
if ( !(pHookItem = HeapAlloc(GetProcessHeap(), 0,
@@ -1189,15 +1160,16 @@ static BOOL OLEMenu_InstallHooks( DWORD tid )
pHookItem->tid = tid;
pHookItem->hHeap = GetProcessHeap();
+ pHookItem->CallWndProc_hHook = NULL;
/* Install a thread scope message hook for WH_GETMESSAGE */
- pHookItem->GetMsg_hHook = SetWindowsHookExA( WH_GETMESSAGE, OLEMenu_GetMsgProc,
+ pHookItem->GetMsg_hHook = SetWindowsHookExW( WH_GETMESSAGE, OLEMenu_GetMsgProc,
0, GetCurrentThreadId() );
if ( !pHookItem->GetMsg_hHook )
goto CLEANUP;
/* Install a thread scope message hook for WH_CALLWNDPROC */
- pHookItem->CallWndProc_hHook = SetWindowsHookExA( WH_CALLWNDPROC, OLEMenu_CallWndProc,
+ pHookItem->CallWndProc_hHook = SetWindowsHookExW( WH_CALLWNDPROC, OLEMenu_CallWndProc,
0, GetCurrentThreadId() );
if ( !pHookItem->CallWndProc_hHook )
goto CLEANUP;
@@ -1271,7 +1243,7 @@ CLEANUP:
*/
static OleMenuHookItem * OLEMenu_IsHookInstalled( DWORD tid )
{
- OleMenuHookItem *pHookItem = NULL;
+ OleMenuHookItem *pHookItem;
/* Do a simple linear search for an entry whose tid matches ours.
* We really need a map but efficiency is not a concern here. */
@@ -1376,7 +1348,7 @@ static BOOL OLEMenu_SetIsServerMenu( HMENU hmenu, OleMenuDescriptor *pOleMenuDes
*/
static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lParam)
{
- LPCWPSTRUCT pMsg = NULL;
+ LPCWPSTRUCT pMsg;
HOLEMENU hOleMenu = 0;
OleMenuDescriptor *pOleMenuDescriptor = NULL;
OleMenuHookItem *pHookItem = NULL;
@@ -1395,7 +1367,7 @@ static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lPar
* If the window has an OLEMenu property we may need to dispatch
* the menu message to its active objects window instead. */
- hOleMenu = GetPropA( pMsg->hwnd, "PROP_OLEMenuDescriptor" );
+ hOleMenu = GetPropW( pMsg->hwnd, prop_olemenuW );
if ( !hOleMenu )
goto NEXTHOOK;
@@ -1413,7 +1385,7 @@ static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lPar
pOleMenuDescriptor->bIsServerItem = FALSE;
/* Send this message to the server as well */
- SendMessageA( pOleMenuDescriptor->hwndActiveObject,
+ SendMessageW( pOleMenuDescriptor->hwndActiveObject,
pMsg->message, pMsg->wParam, pMsg->lParam );
goto NEXTHOOK;
}
@@ -1454,7 +1426,7 @@ static LRESULT CALLBACK OLEMenu_CallWndProc(INT code, WPARAM wParam, LPARAM lPar
/* If the message was for the server dispatch it accordingly */
if ( pOleMenuDescriptor->bIsServerItem )
{
- SendMessageA( pOleMenuDescriptor->hwndActiveObject,
+ SendMessageW( pOleMenuDescriptor->hwndActiveObject,
pMsg->message, pMsg->wParam, pMsg->lParam );
}
@@ -1481,7 +1453,7 @@ NEXTHOOK:
*/
static LRESULT CALLBACK OLEMenu_GetMsgProc(INT code, WPARAM wParam, LPARAM lParam)
{
- LPMSG pMsg = NULL;
+ LPMSG pMsg;
HOLEMENU hOleMenu = 0;
OleMenuDescriptor *pOleMenuDescriptor = NULL;
OleMenuHookItem *pHookItem = NULL;
@@ -1500,7 +1472,7 @@ static LRESULT CALLBACK OLEMenu_GetMsgProc(INT code, WPARAM wParam, LPARAM lPara
* If the window has an OLEMenu property we may need to dispatch
* the menu message to its active objects window instead. */
- hOleMenu = GetPropA( pMsg->hwnd, "PROP_OLEMenuDescriptor" );
+ hOleMenu = GetPropW( pMsg->hwnd, prop_olemenuW );
if ( !hOleMenu )
goto NEXTHOOK;
@@ -1671,7 +1643,7 @@ HRESULT WINAPI OleSetMenuDescriptor(
pOleMenuDescriptor = NULL;
/* Add a menu descriptor windows property to the frame window */
- SetPropA( hwndFrame, "PROP_OLEMenuDescriptor", hOleMenu );
+ SetPropW( hwndFrame, prop_olemenuW, hOleMenu );
/* Install thread scope message hooks for WH_GETMESSAGE and WH_CALLWNDPROC */
if ( !OLEMenu_InstallHooks( GetCurrentThreadId() ) )
@@ -1684,7 +1656,7 @@ HRESULT WINAPI OleSetMenuDescriptor(
return E_FAIL;
/* Remove the menu descriptor property from the frame window */
- RemovePropA( hwndFrame, "PROP_OLEMenuDescriptor" );
+ RemovePropW( hwndFrame, prop_olemenuW );
}
return S_OK;
@@ -1870,9 +1842,9 @@ void WINAPI ReleaseStgMedium(
*/
static void OLEDD_Initialize(void)
{
- WNDCLASSA wndClass;
+ WNDCLASSW wndClass;
- ZeroMemory (&wndClass, sizeof(WNDCLASSA));
+ ZeroMemory (&wndClass, sizeof(WNDCLASSW));
wndClass.style = CS_GLOBALCLASS;
wndClass.lpfnWndProc = OLEDD_DragTrackerWindowProc;
wndClass.cbClsExtra = 0;
@@ -1881,58 +1853,7 @@ static void OLEDD_Initialize(void)
wndClass.hbrBackground = 0;
wndClass.lpszClassName = OLEDD_DRAGTRACKERCLASS;
- RegisterClassA (&wndClass);
-}
-
-/***
- * OLEDD_FreeDropTarget()
- *
- * Frees the drag and drop data structure
- */
-static void OLEDD_FreeDropTarget(DropTargetNode *dropTargetInfo, BOOL release_drop_target)
-{
- list_remove(&dropTargetInfo->entry);
- if (release_drop_target) IDropTarget_Release(dropTargetInfo->dropTarget);
- HeapFree(GetProcessHeap(), 0, dropTargetInfo);
-}
-
-/***
- * OLEDD_UnInitialize()
- *
- * Releases the OLE drag and drop data structures.
- */
-void OLEDD_UnInitialize(void)
-{
- /*
- * Simply empty the list.
- */
- while (!list_empty(&targetListHead))
- {
- DropTargetNode* curNode = LIST_ENTRY(list_head(&targetListHead), DropTargetNode, entry);
- OLEDD_FreeDropTarget(curNode, FALSE);
- }
-}
-
-/***
- * OLEDD_FindDropTarget()
- *
- * Finds information about the drop target.
- */
-static DropTargetNode* OLEDD_FindDropTarget(HWND hwndOfTarget)
-{
- DropTargetNode* curNode;
-
- /*
- * Iterate the list to find the HWND value.
- */
- LIST_FOR_EACH_ENTRY(curNode, &targetListHead, DropTargetNode, entry)
- if (hwndOfTarget==curNode->hwndTarget)
- return curNode;
-
- /*
- * If we get here, the item is not in the list
- */
- return NULL;
+ RegisterClassW (&wndClass);
}
/***
@@ -1958,7 +1879,7 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
{
LPCREATESTRUCTA createStruct = (LPCREATESTRUCTA)lParam;
- SetWindowLongPtrA(hwnd, 0, (LONG_PTR)createStruct->lpCreateParams);
+ SetWindowLongPtrW(hwnd, 0, (LONG_PTR)createStruct->lpCreateParams);
SetTimer(hwnd, DRAG_TIMER_ID, 50, NULL);
break;
@@ -1989,7 +1910,7 @@ static LRESULT WINAPI OLEDD_DragTrackerWindowProc(
/*
* This is a window proc after all. Let's call the default.
*/
- return DefWindowProcA (hwnd, uMsg, wParam, lParam);
+ return DefWindowProcW (hwnd, uMsg, wParam, lParam);
}
/***
@@ -2038,46 +1959,65 @@ static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
}
else
{
- DropTargetNode* newDropTargetNode = 0;
-
/*
* If we changed window, we have to notify our old target and check for
* the new one.
*/
- if (trackerInfo->curDragTarget!=0)
- {
+ if (trackerInfo->curDragTarget)
IDropTarget_DragLeave(trackerInfo->curDragTarget);
- }
/*
* Make sure we're hovering over a window.
*/
- if (hwndNewTarget!=0)
+ if (hwndNewTarget)
{
/*
* Find-out if there is a drag target under the mouse
*/
- HWND nexttar = hwndNewTarget;
+ HWND next_target_wnd = hwndNewTarget;
+ IDropTarget *new_target;
+ DWORD pid;
+
trackerInfo->curTargetHWND = hwndNewTarget;
do {
- newDropTargetNode = OLEDD_FindDropTarget(nexttar);
- } while (!newDropTargetNode && (nexttar = GetParent(nexttar)) != 0);
- if(nexttar) hwndNewTarget = nexttar;
+ new_target = OLEDD_FindDropTarget(next_target_wnd);
+ } while (!new_target && (next_target_wnd = GetParent(next_target_wnd)));
- trackerInfo->curDragTargetHWND = hwndNewTarget;
- trackerInfo->curDragTarget = newDropTargetNode ? newDropTargetNode->dropTarget : 0;
+ if (next_target_wnd) hwndNewTarget = next_target_wnd;
+
+ GetWindowThreadProcessId(hwndNewTarget, &pid);
+ if (pid != GetCurrentProcessId())
+ {
+ FIXME("drop to another process window is unsupported\n");
+ trackerInfo->curDragTargetHWND = 0;
+ trackerInfo->curTargetHWND = 0;
+ trackerInfo->curDragTarget = 0;
+ }
+ else
+ {
+ trackerInfo->curDragTargetHWND = hwndNewTarget;
+ trackerInfo->curDragTarget = new_target;
+ }
/*
* If there is, notify it that we just dragged-in
*/
- if (trackerInfo->curDragTarget!=0)
+ if (trackerInfo->curDragTarget)
{
- IDropTarget_DragEnter(trackerInfo->curDragTarget,
- trackerInfo->dataObject,
- trackerInfo->dwKeyState,
- trackerInfo->curMousePos,
- trackerInfo->pdwEffect);
+ hr = IDropTarget_DragEnter(trackerInfo->curDragTarget,
+ trackerInfo->dataObject,
+ trackerInfo->dwKeyState,
+ trackerInfo->curMousePos,
+ trackerInfo->pdwEffect);
+
+ /* failed DragEnter() means invalid target */
+ if (hr != S_OK)
+ {
+ trackerInfo->curDragTargetHWND = 0;
+ trackerInfo->curTargetHWND = 0;
+ trackerInfo->curDragTarget = 0;
+ }
}
}
else
@@ -2110,24 +2050,28 @@ static void OLEDD_TrackMouseMove(TrackerWindowInfo* trackerInfo)
* when that's the case, we must display the standard drag and drop
* cursors.
*/
- if (hr==DRAGDROP_S_USEDEFAULTCURSORS)
+ if (hr == DRAGDROP_S_USEDEFAULTCURSORS)
{
+ HCURSOR hCur;
+
if (*trackerInfo->pdwEffect & DROPEFFECT_MOVE)
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(1)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(1));
}
else if (*trackerInfo->pdwEffect & DROPEFFECT_COPY)
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(2)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(2));
}
else if (*trackerInfo->pdwEffect & DROPEFFECT_LINK)
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(3)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(3));
}
else
{
- SetCursor(LoadCursorA(hProxyDll, MAKEINTRESOURCEA(0)));
+ hCur = LoadCursorW(hProxyDll, MAKEINTRESOURCEW(0));
}
+
+ SetCursor(hCur);
}
}
@@ -2174,7 +2118,7 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
* If we end-up over a target, drop the object in the target or
* inform the target that the operation was cancelled.
*/
- if (trackerInfo->curDragTarget!=0)
+ if (trackerInfo->curDragTarget)
{
switch (trackerInfo->returnValue)
{
@@ -2183,14 +2127,16 @@ static void OLEDD_TrackStateChange(TrackerWindowInfo* trackerInfo)
* the drop target that we just dropped the object in it.
*/
case DRAGDROP_S_DROP:
- {
- IDropTarget_Drop(trackerInfo->curDragTarget,
- trackerInfo->dataObject,
- trackerInfo->dwKeyState,
- trackerInfo->curMousePos,
- trackerInfo->pdwEffect);
- break;
- }
+ if (*trackerInfo->pdwEffect != DROPEFFECT_NONE)
+ IDropTarget_Drop(trackerInfo->curDragTarget,
+ trackerInfo->dataObject,
+ trackerInfo->dwKeyState,
+ trackerInfo->curMousePos,
+ trackerInfo->pdwEffect);
+ else
+ IDropTarget_DragLeave(trackerInfo->curDragTarget);
+ break;
+
/*
* If the source told us that we should cancel, fool the drop
* target by telling it that the mouse left it's window.
@@ -2256,13 +2202,13 @@ static void OLEUTL_ReadRegistryDWORDValue(
HKEY regKey,
DWORD* pdwValue)
{
- char buffer[20];
+ WCHAR buffer[20];
+ DWORD cbData = sizeof(buffer);
DWORD dwKeyType;
- DWORD cbData = 20;
LONG lres;
- lres = RegQueryValueExA(regKey,
- "",
+ lres = RegQueryValueExW(regKey,
+ emptyW,
NULL,
&dwKeyType,
(LPBYTE)buffer,
@@ -2278,7 +2224,7 @@ static void OLEUTL_ReadRegistryDWORDValue(
case REG_EXPAND_SZ:
case REG_MULTI_SZ:
case REG_SZ:
- *pdwValue = (DWORD)strtoul(buffer, NULL, 10);
+ *pdwValue = (DWORD)strtoulW(buffer, NULL, 10);
break;
}
}
diff --git a/dll/win32/ole32/ole32.rbuild b/dll/win32/ole32/ole32.rbuild
index 85710a6b20f..57c6b9f64a6 100644
--- a/dll/win32/ole32/ole32.rbuild
+++ b/dll/win32/ole32/ole32.rbuild
@@ -1,7 +1,7 @@
-
+
.
diff --git a/dll/win32/ole32/stg_prop.c b/dll/win32/ole32/stg_prop.c
index b3362bc21de..f887d10c0cf 100644
--- a/dll/win32/ole32/stg_prop.c
+++ b/dll/win32/ole32/stg_prop.c
@@ -1314,6 +1314,13 @@ static HRESULT PropertyStorage_ReadFromStream(PropertyStorage_impl *This)
hr = PropertyStorage_ReadFmtIdOffsetFromStream(This->stm, &fmtOffset);
if (FAILED(hr))
goto end;
+ if (!IsEqualGUID(&fmtOffset.fmtid, &FMTID_DocSummaryInformation) &&
+ !IsEqualGUID(&fmtOffset.fmtid, &FMTID_SummaryInformation))
+ {
+ WARN("not reading unknown fmtid %s\n", debugstr_guid(&fmtOffset.fmtid));
+ hr = S_FALSE;
+ goto end;
+ }
if (fmtOffset.dwOffset > stat.cbSize.u.LowPart)
{
WARN("invalid offset %d (stream length is %d)\n", fmtOffset.dwOffset,
diff --git a/dll/win32/ole32/storage32.c b/dll/win32/ole32/storage32.c
index 434d8b24606..98df144976c 100644
--- a/dll/win32/ole32/storage32.c
+++ b/dll/win32/ole32/storage32.c
@@ -118,17 +118,61 @@ static BOOL StorageImpl_ReadDWordFromBigBlock( StorageImpl* This,
static BOOL StorageBaseImpl_IsStreamOpen(StorageBaseImpl * stg, DirRef streamEntry);
static BOOL StorageBaseImpl_IsStorageOpen(StorageBaseImpl * stg, DirRef storageEntry);
+typedef struct TransactedDirEntry
+{
+ /* If applicable, a reference to the original DirEntry in the transacted
+ * parent. If this is a newly-created entry, DIRENTRY_NULL. */
+ DirRef transactedParentEntry;
+
+ /* True if this entry is being used. */
+ int inuse;
+
+ /* True if data is up to date. */
+ int read;
+
+ /* True if this entry has been modified. */
+ int dirty;
+
+ /* True if this entry's stream has been modified. */
+ int stream_dirty;
+
+ /* True if this entry has been deleted in the transacted storage, but the
+ * delete has not yet been committed. */
+ int deleted;
+
+ /* If this entry's stream has been modified, a reference to where the stream
+ * is stored in the snapshot file. */
+ DirRef stream_entry;
+
+ /* This directory entry's data, including any changes that have been made. */
+ DirEntry data;
+
+ /* A reference to the parent of this node. This is only valid while we are
+ * committing changes. */
+ DirRef parent;
+
+ /* A reference to a newly-created entry in the transacted parent. This is
+ * always equal to transactedParentEntry except when committing changes. */
+ DirRef newTransactedParentEntry;
+} TransactedDirEntry;
+
/****************************************************************************
- * Transacted storage object that reads/writes a snapshot file.
+ * Transacted storage object.
*/
typedef struct TransactedSnapshotImpl
{
struct StorageBaseImpl base;
/*
- * Changes are temporarily saved to the snapshot.
+ * Modified streams are temporarily saved to the scratch file.
*/
- StorageBaseImpl *snapshot;
+ StorageBaseImpl *scratch;
+
+ /* The directory structure is kept here, so that we can track how these
+ * entries relate to those in the parent storage. */
+ TransactedDirEntry *entries;
+ ULONG entries_size;
+ ULONG firstFreeEntry;
/*
* Changes are committed to the transacted parent.
@@ -1296,46 +1340,6 @@ static HRESULT StorageImpl_DestroyDirEntry(
}
-/***************************************************************************
- *
- * Internal Method
- *
- * Destroy an entry, its attached data, and all entries reachable from it.
- */
-static HRESULT DestroyReachableEntries(
- StorageBaseImpl *base,
- DirRef index)
-{
- HRESULT hr = S_OK;
- DirEntry data;
- ULARGE_INTEGER zero;
-
- zero.QuadPart = 0;
-
- if (index != DIRENTRY_NULL)
- {
- hr = StorageBaseImpl_ReadDirEntry(base, index, &data);
-
- if (SUCCEEDED(hr))
- hr = DestroyReachableEntries(base, data.dirRootEntry);
-
- if (SUCCEEDED(hr))
- hr = DestroyReachableEntries(base, data.leftChild);
-
- if (SUCCEEDED(hr))
- hr = DestroyReachableEntries(base, data.rightChild);
-
- if (SUCCEEDED(hr))
- hr = StorageBaseImpl_StreamSetSize(base, index, zero);
-
- if (SUCCEEDED(hr))
- hr = StorageBaseImpl_DestroyDirEntry(base, index);
- }
-
- return hr;
-}
-
-
/****************************************************************************
*
* Internal Method
@@ -2347,6 +2351,21 @@ static BlockChainStream **StorageImpl_GetCachedBlockChainStream(StorageImpl *Thi
return &This->blockChainCache[free_index];
}
+static void StorageImpl_DeleteCachedBlockChainStream(StorageImpl *This, DirRef index)
+{
+ int i;
+
+ for (i=0; iblockChainCache[i] && This->blockChainCache[i]->ownerDirEntry == index)
+ {
+ BlockChainStream_Destroy(This->blockChainCache[i]);
+ This->blockChainCache[i] = NULL;
+ return;
+ }
+ }
+}
+
static HRESULT StorageImpl_StreamReadAt(StorageBaseImpl *base, DirRef index,
ULARGE_INTEGER offset, ULONG size, void *buffer, ULONG *bytesRead)
{
@@ -2538,6 +2557,30 @@ static HRESULT StorageImpl_StreamWriteAt(StorageBaseImpl *base, DirRef index,
}
}
+static HRESULT StorageImpl_StreamLink(StorageBaseImpl *base, DirRef dst,
+ DirRef src)
+{
+ StorageImpl *This = (StorageImpl*)base;
+ DirEntry dst_data, src_data;
+ HRESULT hr;
+
+ hr = StorageImpl_ReadDirEntry(This, dst, &dst_data);
+
+ if (SUCCEEDED(hr))
+ hr = StorageImpl_ReadDirEntry(This, src, &src_data);
+
+ if (SUCCEEDED(hr))
+ {
+ StorageImpl_DeleteCachedBlockChainStream(This, src);
+ dst_data.startingBlock = src_data.startingBlock;
+ dst_data.size = src_data.size;
+
+ hr = StorageImpl_WriteDirEntry(This, dst, &dst_data);
+ }
+
+ return hr;
+}
+
/*
* Virtual function table for the IStorage32Impl class.
*/
@@ -2573,7 +2616,8 @@ static const StorageBaseImplVtbl StorageImpl_BaseVtbl =
StorageImpl_DestroyDirEntry,
StorageImpl_StreamReadAt,
StorageImpl_StreamWriteAt,
- StorageImpl_StreamSetSize
+ StorageImpl_StreamSetSize,
+ StorageImpl_StreamLink
};
static HRESULT StorageImpl_Construct(
@@ -3540,6 +3584,9 @@ HRESULT StorageImpl_ReadRawDirEntry(StorageImpl *This, ULONG index, BYTE *buffer
buffer,
&bytesRead);
+ if (bytesRead != RAW_DIRENTRY_SIZE)
+ return STG_E_READFAULT;
+
return hr;
}
@@ -3885,6 +3932,11 @@ BlockChainStream* Storage32Impl_SmallBlocksToBigBlocks(
offset.u.LowPart += cbRead;
}
+ else
+ {
+ resRead = STG_E_READFAULT;
+ break;
+ }
} while (cbTotalRead.QuadPart < size.QuadPart);
HeapFree(GetProcessHeap(),0,buffer);
@@ -3983,6 +4035,11 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
offset.u.LowPart += cbRead;
}
+ else
+ {
+ resRead = STG_E_READFAULT;
+ break;
+ }
}while(cbTotalRead.QuadPart < size.QuadPart);
HeapFree(GetProcessHeap(), 0, buffer);
@@ -4011,40 +4068,384 @@ SmallBlockChainStream* Storage32Impl_BigBlocksToSmallBlocks(
return SmallBlockChainStream_Construct(This, NULL, streamEntryRef);
}
-static HRESULT CreateSnapshotFile(StorageBaseImpl* original, StorageBaseImpl **snapshot)
+static HRESULT StorageBaseImpl_CopyStream(
+ StorageBaseImpl *dst, DirRef dst_entry,
+ StorageBaseImpl *src, DirRef src_entry)
{
HRESULT hr;
- DirEntry parentData, snapshotData;
+ BYTE data[4096];
+ DirEntry srcdata;
+ ULARGE_INTEGER bytes_copied;
+ ULONG bytestocopy, bytesread, byteswritten;
- hr = StgCreateDocfile(NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_DELETEONRELEASE,
- 0, (IStorage**)snapshot);
+ hr = StorageBaseImpl_ReadDirEntry(src, src_entry, &srcdata);
if (SUCCEEDED(hr))
{
- hr = StorageBaseImpl_ReadDirEntry(original,
- original->storageDirEntry, &parentData);
+ hr = StorageBaseImpl_StreamSetSize(dst, dst_entry, srcdata.size);
- if (SUCCEEDED(hr))
- hr = StorageBaseImpl_ReadDirEntry((*snapshot),
- (*snapshot)->storageDirEntry, &snapshotData);
-
- if (SUCCEEDED(hr))
+ bytes_copied.QuadPart = 0;
+ while (bytes_copied.QuadPart < srcdata.size.QuadPart && SUCCEEDED(hr))
{
- memcpy(snapshotData.name, parentData.name, sizeof(snapshotData.name));
- snapshotData.sizeOfNameString = parentData.sizeOfNameString;
- snapshotData.stgType = parentData.stgType;
- snapshotData.clsid = parentData.clsid;
- snapshotData.ctime = parentData.ctime;
- snapshotData.mtime = parentData.mtime;
- hr = StorageBaseImpl_WriteDirEntry((*snapshot),
- (*snapshot)->storageDirEntry, &snapshotData);
+ bytestocopy = min(4096, srcdata.size.QuadPart - bytes_copied.QuadPart);
+
+ hr = StorageBaseImpl_StreamReadAt(src, src_entry, bytes_copied, bytestocopy,
+ data, &bytesread);
+ if (SUCCEEDED(hr) && bytesread != bytestocopy) hr = STG_E_READFAULT;
+
+ if (SUCCEEDED(hr))
+ hr = StorageBaseImpl_StreamWriteAt(dst, dst_entry, bytes_copied, bytestocopy,
+ data, &byteswritten);
+ if (SUCCEEDED(hr))
+ {
+ if (byteswritten != bytestocopy) hr = STG_E_WRITEFAULT;
+ bytes_copied.QuadPart += byteswritten;
+ }
+ }
+ }
+
+ return hr;
+}
+
+static DirRef TransactedSnapshotImpl_FindFreeEntry(TransactedSnapshotImpl *This)
+{
+ DirRef result=This->firstFreeEntry;
+
+ while (result < This->entries_size && This->entries[result].inuse)
+ result++;
+
+ if (result == This->entries_size)
+ {
+ ULONG new_size = This->entries_size * 2;
+ TransactedDirEntry *new_entries;
+
+ new_entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TransactedDirEntry) * new_size);
+ if (!new_entries) return DIRENTRY_NULL;
+
+ memcpy(new_entries, This->entries, sizeof(TransactedDirEntry) * This->entries_size);
+ HeapFree(GetProcessHeap(), 0, This->entries);
+
+ This->entries = new_entries;
+ This->entries_size = new_size;
+ }
+
+ This->entries[result].inuse = 1;
+
+ This->firstFreeEntry = result+1;
+
+ return result;
+}
+
+static DirRef TransactedSnapshotImpl_CreateStubEntry(
+ TransactedSnapshotImpl *This, DirRef parentEntryRef)
+{
+ DirRef stubEntryRef;
+ TransactedDirEntry *entry;
+
+ stubEntryRef = TransactedSnapshotImpl_FindFreeEntry(This);
+
+ if (stubEntryRef != DIRENTRY_NULL)
+ {
+ entry = &This->entries[stubEntryRef];
+
+ entry->newTransactedParentEntry = entry->transactedParentEntry = parentEntryRef;
+
+ entry->read = 0;
+ }
+
+ return stubEntryRef;
+}
+
+static HRESULT TransactedSnapshotImpl_EnsureReadEntry(
+ TransactedSnapshotImpl *This, DirRef entry)
+{
+ HRESULT hr=S_OK;
+ DirEntry data;
+
+ if (!This->entries[entry].read)
+ {
+ hr = StorageBaseImpl_ReadDirEntry(This->transactedParent,
+ This->entries[entry].transactedParentEntry,
+ &data);
+
+ if (SUCCEEDED(hr) && data.leftChild != DIRENTRY_NULL)
+ {
+ data.leftChild = TransactedSnapshotImpl_CreateStubEntry(This, data.leftChild);
+
+ if (data.leftChild == DIRENTRY_NULL)
+ hr = E_OUTOFMEMORY;
+ }
+
+ if (SUCCEEDED(hr) && data.rightChild != DIRENTRY_NULL)
+ {
+ data.rightChild = TransactedSnapshotImpl_CreateStubEntry(This, data.rightChild);
+
+ if (data.rightChild == DIRENTRY_NULL)
+ hr = E_OUTOFMEMORY;
+ }
+
+ if (SUCCEEDED(hr) && data.dirRootEntry != DIRENTRY_NULL)
+ {
+ data.dirRootEntry = TransactedSnapshotImpl_CreateStubEntry(This, data.dirRootEntry);
+
+ if (data.dirRootEntry == DIRENTRY_NULL)
+ hr = E_OUTOFMEMORY;
}
if (SUCCEEDED(hr))
- hr = IStorage_CopyTo((IStorage*)original, 0, NULL, NULL,
- (IStorage*)(*snapshot));
+ {
+ memcpy(&This->entries[entry].data, &data, sizeof(DirEntry));
+ This->entries[entry].read = 1;
+ }
+ }
- if (FAILED(hr)) IStorage_Release((IStorage*)(*snapshot));
+ return hr;
+}
+
+static HRESULT TransactedSnapshotImpl_MakeStreamDirty(
+ TransactedSnapshotImpl *This, DirRef entry)
+{
+ HRESULT hr = S_OK;
+
+ if (!This->entries[entry].stream_dirty)
+ {
+ DirEntry new_entrydata;
+
+ memset(&new_entrydata, 0, sizeof(DirEntry));
+ new_entrydata.name[0] = 'S';
+ new_entrydata.sizeOfNameString = 1;
+ new_entrydata.stgType = STGTY_STREAM;
+ new_entrydata.startingBlock = BLOCK_END_OF_CHAIN;
+ new_entrydata.leftChild = DIRENTRY_NULL;
+ new_entrydata.rightChild = DIRENTRY_NULL;
+ new_entrydata.dirRootEntry = DIRENTRY_NULL;
+
+ hr = StorageBaseImpl_CreateDirEntry(This->scratch, &new_entrydata,
+ &This->entries[entry].stream_entry);
+
+ if (SUCCEEDED(hr) && This->entries[entry].transactedParentEntry != DIRENTRY_NULL)
+ {
+ hr = StorageBaseImpl_CopyStream(
+ This->scratch, This->entries[entry].stream_entry,
+ This->transactedParent, This->entries[entry].transactedParentEntry);
+
+ if (FAILED(hr))
+ StorageBaseImpl_DestroyDirEntry(This->scratch, This->entries[entry].stream_entry);
+ }
+
+ if (SUCCEEDED(hr))
+ This->entries[entry].stream_dirty = 1;
+
+ if (This->entries[entry].transactedParentEntry != DIRENTRY_NULL)
+ {
+ /* Since this entry is modified, and we aren't using its stream data, we
+ * no longer care about the original entry. */
+ DirRef delete_ref;
+ delete_ref = TransactedSnapshotImpl_CreateStubEntry(This, This->entries[entry].transactedParentEntry);
+
+ if (delete_ref != DIRENTRY_NULL)
+ This->entries[delete_ref].deleted = 1;
+
+ This->entries[entry].transactedParentEntry = This->entries[entry].newTransactedParentEntry = DIRENTRY_NULL;
+ }
+ }
+
+ return hr;
+}
+
+/* Find the first entry in a depth-first traversal. */
+static DirRef TransactedSnapshotImpl_FindFirstChild(
+ TransactedSnapshotImpl* This, DirRef parent)
+{
+ DirRef cursor, prev;
+ TransactedDirEntry *entry;
+
+ cursor = parent;
+ entry = &This->entries[cursor];
+ while (entry->read)
+ {
+ if (entry->data.leftChild != DIRENTRY_NULL)
+ {
+ prev = cursor;
+ cursor = entry->data.leftChild;
+ entry = &This->entries[cursor];
+ entry->parent = prev;
+ }
+ else if (entry->data.rightChild != DIRENTRY_NULL)
+ {
+ prev = cursor;
+ cursor = entry->data.rightChild;
+ entry = &This->entries[cursor];
+ entry->parent = prev;
+ }
+ else if (entry->data.dirRootEntry != DIRENTRY_NULL)
+ {
+ prev = cursor;
+ cursor = entry->data.dirRootEntry;
+ entry = &This->entries[cursor];
+ entry->parent = prev;
+ }
+ else
+ break;
+ }
+
+ return cursor;
+}
+
+/* Find the next entry in a depth-first traversal. */
+static DirRef TransactedSnapshotImpl_FindNextChild(
+ TransactedSnapshotImpl* This, DirRef current)
+{
+ DirRef parent;
+ TransactedDirEntry *parent_entry;
+
+ parent = This->entries[current].parent;
+ parent_entry = &This->entries[parent];
+
+ if (parent != DIRENTRY_NULL && parent_entry->data.dirRootEntry != current)
+ {
+ if (parent_entry->data.rightChild != current && parent_entry->data.rightChild != DIRENTRY_NULL)
+ {
+ This->entries[parent_entry->data.rightChild].parent = parent;
+ return TransactedSnapshotImpl_FindFirstChild(This, parent_entry->data.rightChild);
+ }
+
+ if (parent_entry->data.dirRootEntry != DIRENTRY_NULL)
+ {
+ This->entries[parent_entry->data.dirRootEntry].parent = parent;
+ return TransactedSnapshotImpl_FindFirstChild(This, parent_entry->data.dirRootEntry);
+ }
+ }
+
+ return parent;
+}
+
+/* Return TRUE if we've made a copy of this entry for committing to the parent. */
+static inline BOOL TransactedSnapshotImpl_MadeCopy(
+ TransactedSnapshotImpl* This, DirRef entry)
+{
+ return entry != DIRENTRY_NULL &&
+ This->entries[entry].newTransactedParentEntry != This->entries[entry].transactedParentEntry;
+}
+
+/* Destroy the entries created by CopyTree. */
+static void TransactedSnapshotImpl_DestroyTemporaryCopy(
+ TransactedSnapshotImpl* This, DirRef stop)
+{
+ DirRef cursor;
+ TransactedDirEntry *entry;
+ ULARGE_INTEGER zero;
+
+ zero.QuadPart = 0;
+
+ if (!This->entries[This->base.storageDirEntry].read)
+ return;
+
+ cursor = This->entries[This->base.storageDirEntry].data.dirRootEntry;
+
+ if (cursor == DIRENTRY_NULL)
+ return;
+
+ cursor = TransactedSnapshotImpl_FindFirstChild(This, cursor);
+
+ while (cursor != DIRENTRY_NULL && cursor != stop)
+ {
+ if (TransactedSnapshotImpl_MadeCopy(This, cursor))
+ {
+ entry = &This->entries[cursor];
+
+ if (entry->stream_dirty)
+ StorageBaseImpl_StreamSetSize(This->transactedParent,
+ entry->newTransactedParentEntry, zero);
+
+ StorageBaseImpl_DestroyDirEntry(This->transactedParent,
+ entry->newTransactedParentEntry);
+
+ entry->newTransactedParentEntry = entry->transactedParentEntry;
+ }
+
+ cursor = TransactedSnapshotImpl_FindNextChild(This, cursor);
+ }
+}
+
+/* Make a copy of our edited tree that we can use in the parent. */
+static HRESULT TransactedSnapshotImpl_CopyTree(TransactedSnapshotImpl* This)
+{
+ DirRef cursor;
+ TransactedDirEntry *entry;
+ HRESULT hr = S_OK;
+
+ cursor = This->base.storageDirEntry;
+ entry = &This->entries[cursor];
+ entry->parent = DIRENTRY_NULL;
+ entry->newTransactedParentEntry = entry->transactedParentEntry;
+
+ if (entry->data.dirRootEntry == DIRENTRY_NULL)
+ return S_OK;
+
+ This->entries[entry->data.dirRootEntry].parent = DIRENTRY_NULL;
+
+ cursor = TransactedSnapshotImpl_FindFirstChild(This, entry->data.dirRootEntry);
+ entry = &This->entries[cursor];
+
+ while (cursor != DIRENTRY_NULL)
+ {
+ /* Make a copy of this entry in the transacted parent. */
+ if (!entry->read ||
+ (!entry->dirty && !entry->stream_dirty &&
+ !TransactedSnapshotImpl_MadeCopy(This, entry->data.leftChild) &&
+ !TransactedSnapshotImpl_MadeCopy(This, entry->data.rightChild) &&
+ !TransactedSnapshotImpl_MadeCopy(This, entry->data.dirRootEntry)))
+ entry->newTransactedParentEntry = entry->transactedParentEntry;
+ else
+ {
+ DirEntry newData;
+
+ memcpy(&newData, &entry->data, sizeof(DirEntry));
+
+ newData.size.QuadPart = 0;
+ newData.startingBlock = BLOCK_END_OF_CHAIN;
+
+ if (newData.leftChild != DIRENTRY_NULL)
+ newData.leftChild = This->entries[newData.leftChild].newTransactedParentEntry;
+
+ if (newData.rightChild != DIRENTRY_NULL)
+ newData.rightChild = This->entries[newData.rightChild].newTransactedParentEntry;
+
+ if (newData.dirRootEntry != DIRENTRY_NULL)
+ newData.dirRootEntry = This->entries[newData.dirRootEntry].newTransactedParentEntry;
+
+ hr = StorageBaseImpl_CreateDirEntry(This->transactedParent, &newData,
+ &entry->newTransactedParentEntry);
+ if (FAILED(hr))
+ {
+ TransactedSnapshotImpl_DestroyTemporaryCopy(This, cursor);
+ return hr;
+ }
+
+ if (entry->stream_dirty)
+ {
+ hr = StorageBaseImpl_CopyStream(
+ This->transactedParent, entry->newTransactedParentEntry,
+ This->scratch, entry->stream_entry);
+ }
+ else if (entry->data.size.QuadPart)
+ {
+ hr = StorageBaseImpl_StreamLink(
+ This->transactedParent, entry->newTransactedParentEntry,
+ entry->transactedParentEntry);
+ }
+
+ if (FAILED(hr))
+ {
+ cursor = TransactedSnapshotImpl_FindNextChild(This, cursor);
+ TransactedSnapshotImpl_DestroyTemporaryCopy(This, cursor);
+ return hr;
+ }
+ }
+
+ cursor = TransactedSnapshotImpl_FindNextChild(This, cursor);
+ entry = &This->entries[cursor];
}
return hr;
@@ -4055,10 +4456,13 @@ static HRESULT WINAPI TransactedSnapshotImpl_Commit(
DWORD grfCommitFlags) /* [in] */
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) iface;
+ TransactedDirEntry *root_entry;
+ DirRef i, dir_root_ref;
+ DirEntry data;
+ ULARGE_INTEGER zero;
HRESULT hr;
- DirEntry data, tempStorageData, snapshotRootData;
- DirRef tempStorageEntry, oldDirRoot;
- StorageInternalImpl *tempStorage;
+
+ zero.QuadPart = 0;
TRACE("(%p,%x)\n", iface, grfCommitFlags);
@@ -4072,75 +4476,71 @@ static HRESULT WINAPI TransactedSnapshotImpl_Commit(
* needed in the rare situation where we have just enough free disk space to
* overwrite the existing data. */
- /* Create an orphaned storage in the parent for the new directory structure. */
- memset(&data, 0, sizeof(data));
- data.name[0] = 'D';
- data.sizeOfNameString = 1;
- data.stgType = STGTY_STORAGE;
- data.leftChild = DIRENTRY_NULL;
- data.rightChild = DIRENTRY_NULL;
- data.dirRootEntry = DIRENTRY_NULL;
- hr = StorageBaseImpl_CreateDirEntry(This->transactedParent, &data, &tempStorageEntry);
+ root_entry = &This->entries[This->base.storageDirEntry];
+ if (!root_entry->read)
+ return S_OK;
+
+ hr = TransactedSnapshotImpl_CopyTree(This);
if (FAILED(hr)) return hr;
- tempStorage = StorageInternalImpl_Construct(This->transactedParent,
- STGM_READWRITE|STGM_SHARE_EXCLUSIVE, tempStorageEntry);
- if (tempStorage)
- {
- hr = IStorage_CopyTo((IStorage*)This->snapshot, 0, NULL, NULL,
- (IStorage*)tempStorage);
-
- list_init(&tempStorage->ParentListEntry);
-
- IStorage_Release((IStorage*) tempStorage);
- }
+ if (root_entry->data.dirRootEntry == DIRENTRY_NULL)
+ dir_root_ref = DIRENTRY_NULL;
else
- hr = E_OUTOFMEMORY;
-
- if (FAILED(hr))
- {
- DestroyReachableEntries(This->transactedParent, tempStorageEntry);
- return hr;
- }
+ dir_root_ref = This->entries[root_entry->data.dirRootEntry].newTransactedParentEntry;
/* Update the storage to use the new data in one step. */
hr = StorageBaseImpl_ReadDirEntry(This->transactedParent,
- This->transactedParent->storageDirEntry, &data);
+ root_entry->transactedParentEntry, &data);
if (SUCCEEDED(hr))
{
- hr = StorageBaseImpl_ReadDirEntry(This->transactedParent,
- tempStorageEntry, &tempStorageData);
- }
-
- if (SUCCEEDED(hr))
- {
- hr = StorageBaseImpl_ReadDirEntry(This->snapshot,
- This->snapshot->storageDirEntry, &snapshotRootData);
- }
-
- if (SUCCEEDED(hr))
- {
- oldDirRoot = data.dirRootEntry;
- data.dirRootEntry = tempStorageData.dirRootEntry;
- data.clsid = snapshotRootData.clsid;
- data.ctime = snapshotRootData.ctime;
- data.mtime = snapshotRootData.mtime;
+ data.dirRootEntry = dir_root_ref;
+ data.clsid = root_entry->data.clsid;
+ data.ctime = root_entry->data.ctime;
+ data.mtime = root_entry->data.mtime;
hr = StorageBaseImpl_WriteDirEntry(This->transactedParent,
- This->transactedParent->storageDirEntry, &data);
+ root_entry->transactedParentEntry, &data);
}
if (SUCCEEDED(hr))
{
/* Destroy the old now-orphaned data. */
- DestroyReachableEntries(This->transactedParent, oldDirRoot);
- StorageBaseImpl_DestroyDirEntry(This->transactedParent, tempStorageEntry);
+ for (i=0; ientries_size; i++)
+ {
+ TransactedDirEntry *entry = &This->entries[i];
+ if (entry->inuse)
+ {
+ if (entry->deleted)
+ {
+ StorageBaseImpl_StreamSetSize(This->transactedParent,
+ entry->transactedParentEntry, zero);
+ StorageBaseImpl_DestroyDirEntry(This->transactedParent,
+ entry->transactedParentEntry);
+ memset(entry, 0, sizeof(TransactedDirEntry));
+ This->firstFreeEntry = min(i, This->firstFreeEntry);
+ }
+ else if (entry->read && entry->transactedParentEntry != entry->newTransactedParentEntry)
+ {
+ if (entry->transactedParentEntry != DIRENTRY_NULL)
+ StorageBaseImpl_DestroyDirEntry(This->transactedParent,
+ entry->transactedParentEntry);
+ if (entry->stream_dirty)
+ {
+ StorageBaseImpl_StreamSetSize(This->scratch, entry->stream_entry, zero);
+ StorageBaseImpl_DestroyDirEntry(This->scratch, entry->stream_entry);
+ entry->stream_dirty = 0;
+ }
+ entry->dirty = 0;
+ entry->transactedParentEntry = entry->newTransactedParentEntry;
+ }
+ }
+ }
}
else
{
- DestroyReachableEntries(This->transactedParent, tempStorageEntry);
+ TransactedSnapshotImpl_DestroyTemporaryCopy(This, DIRENTRY_NULL);
}
return hr;
@@ -4150,21 +4550,31 @@ static HRESULT WINAPI TransactedSnapshotImpl_Revert(
IStorage* iface)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) iface;
- StorageBaseImpl *newSnapshot;
- HRESULT hr;
+ ULARGE_INTEGER zero;
+ ULONG i;
TRACE("(%p)\n", iface);
- /* Create a new copy of the parent data. */
- hr = CreateSnapshotFile(This->transactedParent, &newSnapshot);
- if (FAILED(hr)) return hr;
-
/* Destroy the open objects. */
StorageBaseImpl_DeleteAll(&This->base);
- /* Replace our current snapshot. */
- IStorage_Release((IStorage*)This->snapshot);
- This->snapshot = newSnapshot;
+ /* Clear out the scratch file. */
+ zero.QuadPart = 0;
+ for (i=0; ientries_size; i++)
+ {
+ if (This->entries[i].stream_dirty)
+ {
+ StorageBaseImpl_StreamSetSize(This->scratch, This->entries[i].stream_entry,
+ zero);
+
+ StorageBaseImpl_DestroyDirEntry(This->scratch, This->entries[i].stream_entry);
+ }
+ }
+
+ memset(This->entries, 0, sizeof(TransactedDirEntry) * This->entries_size);
+
+ This->firstFreeEntry = 0;
+ This->base.storageDirEntry = TransactedSnapshotImpl_CreateStubEntry(This, This->transactedParent->storageDirEntry);
return S_OK;
}
@@ -4185,11 +4595,13 @@ static void TransactedSnapshotImpl_Destroy( StorageBaseImpl *iface)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) iface;
- TransactedSnapshotImpl_Invalidate(iface);
+ TransactedSnapshotImpl_Revert((IStorage*)iface);
IStorage_Release((IStorage*)This->transactedParent);
- IStorage_Release((IStorage*)This->snapshot);
+ IStorage_Release((IStorage*)This->scratch);
+
+ HeapFree(GetProcessHeap(), 0, This->entries);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -4198,27 +4610,76 @@ static HRESULT TransactedSnapshotImpl_CreateDirEntry(StorageBaseImpl *base,
const DirEntry *newData, DirRef *index)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ DirRef new_ref;
+ TransactedDirEntry *new_entry;
- return StorageBaseImpl_CreateDirEntry(This->snapshot,
- newData, index);
+ new_ref = TransactedSnapshotImpl_FindFreeEntry(This);
+ if (new_ref == DIRENTRY_NULL)
+ return E_OUTOFMEMORY;
+
+ new_entry = &This->entries[new_ref];
+
+ new_entry->newTransactedParentEntry = new_entry->transactedParentEntry = DIRENTRY_NULL;
+ new_entry->read = 1;
+ new_entry->dirty = 1;
+ memcpy(&new_entry->data, newData, sizeof(DirEntry));
+
+ *index = new_ref;
+
+ TRACE("%s l=%x r=%x d=%x <-- %x\n", debugstr_w(newData->name), newData->leftChild, newData->rightChild, newData->dirRootEntry, *index);
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_WriteDirEntry(StorageBaseImpl *base,
DirRef index, const DirEntry *data)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_WriteDirEntry(This->snapshot,
- index, data);
+ TRACE("%x %s l=%x r=%x d=%x\n", index, debugstr_w(data->name), data->leftChild, data->rightChild, data->dirRootEntry);
+
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ memcpy(&This->entries[index].data, data, sizeof(DirEntry));
+
+ if (index != This->base.storageDirEntry)
+ {
+ This->entries[index].dirty = 1;
+
+ if (data->size.QuadPart == 0 &&
+ This->entries[index].transactedParentEntry != DIRENTRY_NULL)
+ {
+ /* Since this entry is modified, and we aren't using its stream data, we
+ * no longer care about the original entry. */
+ DirRef delete_ref;
+ delete_ref = TransactedSnapshotImpl_CreateStubEntry(This, This->entries[index].transactedParentEntry);
+
+ if (delete_ref != DIRENTRY_NULL)
+ This->entries[delete_ref].deleted = 1;
+
+ This->entries[index].transactedParentEntry = This->entries[index].newTransactedParentEntry = DIRENTRY_NULL;
+ }
+ }
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_ReadDirEntry(StorageBaseImpl *base,
DirRef index, DirEntry *data)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_ReadDirEntry(This->snapshot,
- index, data);
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ memcpy(data, &This->entries[index].data, sizeof(DirEntry));
+
+ TRACE("%x %s l=%x r=%x d=%x\n", index, debugstr_w(data->name), data->leftChild, data->rightChild, data->dirRootEntry);
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_DestroyDirEntry(StorageBaseImpl *base,
@@ -4226,8 +4687,21 @@ static HRESULT TransactedSnapshotImpl_DestroyDirEntry(StorageBaseImpl *base,
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
- return StorageBaseImpl_DestroyDirEntry(This->snapshot,
- index);
+ if (This->entries[index].transactedParentEntry == DIRENTRY_NULL ||
+ This->entries[index].data.size.QuadPart != 0)
+ {
+ /* If we deleted this entry while it has stream data. We must have left the
+ * data because some other entry is using it, and we need to leave the
+ * original entry alone. */
+ memset(&This->entries[index], 0, sizeof(TransactedDirEntry));
+ This->firstFreeEntry = min(index, This->firstFreeEntry);
+ }
+ else
+ {
+ This->entries[index].deleted = 1;
+ }
+
+ return S_OK;
}
static HRESULT TransactedSnapshotImpl_StreamReadAt(StorageBaseImpl *base,
@@ -4235,26 +4709,122 @@ static HRESULT TransactedSnapshotImpl_StreamReadAt(StorageBaseImpl *base,
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
- return StorageBaseImpl_StreamReadAt(This->snapshot,
- index, offset, size, buffer, bytesRead);
+ if (This->entries[index].stream_dirty)
+ {
+ return StorageBaseImpl_StreamReadAt(This->scratch,
+ This->entries[index].stream_entry, offset, size, buffer, bytesRead);
+ }
+ else if (This->entries[index].transactedParentEntry == DIRENTRY_NULL)
+ {
+ /* This stream doesn't live in the parent, and we haven't allocated storage
+ * for it yet */
+ *bytesRead = 0;
+ return S_OK;
+ }
+ else
+ {
+ return StorageBaseImpl_StreamReadAt(This->transactedParent,
+ This->entries[index].transactedParentEntry, offset, size, buffer, bytesRead);
+ }
}
static HRESULT TransactedSnapshotImpl_StreamWriteAt(StorageBaseImpl *base,
DirRef index, ULARGE_INTEGER offset, ULONG size, const void *buffer, ULONG *bytesWritten)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_StreamWriteAt(This->snapshot,
- index, offset, size, buffer, bytesWritten);
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ hr = TransactedSnapshotImpl_MakeStreamDirty(This, index);
+ if (FAILED(hr)) return hr;
+
+ hr = StorageBaseImpl_StreamWriteAt(This->scratch,
+ This->entries[index].stream_entry, offset, size, buffer, bytesWritten);
+
+ if (SUCCEEDED(hr) && size != 0)
+ This->entries[index].data.size.QuadPart = max(
+ This->entries[index].data.size.QuadPart,
+ offset.QuadPart + size);
+
+ return hr;
}
static HRESULT TransactedSnapshotImpl_StreamSetSize(StorageBaseImpl *base,
DirRef index, ULARGE_INTEGER newsize)
{
TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
- return StorageBaseImpl_StreamSetSize(This->snapshot,
- index, newsize);
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, index);
+ if (FAILED(hr)) return hr;
+
+ if (This->entries[index].data.size.QuadPart == newsize.QuadPart)
+ return S_OK;
+
+ if (newsize.QuadPart == 0)
+ {
+ /* Destroy any parent references or entries in the scratch file. */
+ if (This->entries[index].stream_dirty)
+ {
+ ULARGE_INTEGER zero;
+ zero.QuadPart = 0;
+ StorageBaseImpl_StreamSetSize(This->scratch,
+ This->entries[index].stream_entry, zero);
+ StorageBaseImpl_DestroyDirEntry(This->scratch,
+ This->entries[index].stream_entry);
+ This->entries[index].stream_dirty = 0;
+ }
+ else if (This->entries[index].transactedParentEntry != DIRENTRY_NULL)
+ {
+ DirRef delete_ref;
+ delete_ref = TransactedSnapshotImpl_CreateStubEntry(This, This->entries[index].transactedParentEntry);
+
+ if (delete_ref != DIRENTRY_NULL)
+ This->entries[delete_ref].deleted = 1;
+
+ This->entries[index].transactedParentEntry = This->entries[index].newTransactedParentEntry = DIRENTRY_NULL;
+ }
+ }
+ else
+ {
+ hr = TransactedSnapshotImpl_MakeStreamDirty(This, index);
+ if (FAILED(hr)) return hr;
+
+ hr = StorageBaseImpl_StreamSetSize(This->scratch,
+ This->entries[index].stream_entry, newsize);
+ }
+
+ if (SUCCEEDED(hr))
+ This->entries[index].data.size = newsize;
+
+ return hr;
+}
+
+static HRESULT TransactedSnapshotImpl_StreamLink(StorageBaseImpl *base,
+ DirRef dst, DirRef src)
+{
+ TransactedSnapshotImpl* This = (TransactedSnapshotImpl*) base;
+ HRESULT hr;
+ TransactedDirEntry *dst_entry, *src_entry;
+
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, src);
+ if (FAILED(hr)) return hr;
+
+ hr = TransactedSnapshotImpl_EnsureReadEntry(This, dst);
+ if (FAILED(hr)) return hr;
+
+ dst_entry = &This->entries[dst];
+ src_entry = &This->entries[src];
+
+ dst_entry->stream_dirty = src_entry->stream_dirty;
+ dst_entry->stream_entry = src_entry->stream_entry;
+ dst_entry->transactedParentEntry = src_entry->transactedParentEntry;
+ dst_entry->newTransactedParentEntry = src_entry->newTransactedParentEntry;
+ dst_entry->data.size = src_entry->data.size;
+
+ return S_OK;
}
static const IStorageVtbl TransactedSnapshotImpl_Vtbl =
@@ -4289,7 +4859,8 @@ static const StorageBaseImplVtbl TransactedSnapshotImpl_BaseVtbl =
TransactedSnapshotImpl_DestroyDirEntry,
TransactedSnapshotImpl_StreamReadAt,
TransactedSnapshotImpl_StreamWriteAt,
- TransactedSnapshotImpl_StreamSetSize
+ TransactedSnapshotImpl_StreamSetSize,
+ TransactedSnapshotImpl_StreamLink
};
static HRESULT TransactedSnapshotImpl_Construct(StorageBaseImpl *parentStorage,
@@ -4317,17 +4888,35 @@ static HRESULT TransactedSnapshotImpl_Construct(StorageBaseImpl *parentStorage,
(*result)->base.filename = parentStorage->filename;
- /* Create a new temporary storage to act as the snapshot */
- hr = CreateSnapshotFile(parentStorage, &(*result)->snapshot);
+ /* Create a new temporary storage to act as the scratch file. */
+ hr = StgCreateDocfile(NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_CREATE,
+ 0, (IStorage**)&(*result)->scratch);
if (SUCCEEDED(hr))
{
- (*result)->base.storageDirEntry = (*result)->snapshot->storageDirEntry;
+ ULONG num_entries = 20;
- /* parentStorage already has 1 reference, which we take over here. */
- (*result)->transactedParent = parentStorage;
+ (*result)->entries = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(TransactedDirEntry) * num_entries);
- parentStorage->transactedChild = (StorageBaseImpl*)*result;
+ (*result)->entries_size = num_entries;
+
+ (*result)->firstFreeEntry = 0;
+
+ if ((*result)->entries)
+ {
+ /* parentStorage already has 1 reference, which we take over here. */
+ (*result)->transactedParent = parentStorage;
+
+ parentStorage->transactedChild = (StorageBaseImpl*)*result;
+
+ (*result)->base.storageDirEntry = TransactedSnapshotImpl_CreateStubEntry(*result, parentStorage->storageDirEntry);
+ }
+ else
+ {
+ IStorage_Release((IStorage*)(*result)->scratch);
+
+ hr = E_OUTOFMEMORY;
+ }
}
if (FAILED(hr)) HeapFree(GetProcessHeap(), 0, (*result));
@@ -4474,6 +5063,15 @@ static HRESULT StorageInternalImpl_StreamSetSize(StorageBaseImpl *base,
index, newsize);
}
+static HRESULT StorageInternalImpl_StreamLink(StorageBaseImpl *base,
+ DirRef dst, DirRef src)
+{
+ StorageInternalImpl* This = (StorageInternalImpl*) base;
+
+ return StorageBaseImpl_StreamLink(This->parentStorage,
+ dst, src);
+}
+
/******************************************************************************
**
** Storage32InternalImpl_Commit
@@ -4833,7 +5431,8 @@ static const StorageBaseImplVtbl StorageInternalImpl_BaseVtbl =
StorageInternalImpl_DestroyDirEntry,
StorageInternalImpl_StreamReadAt,
StorageInternalImpl_StreamWriteAt,
- StorageInternalImpl_StreamSetSize
+ StorageInternalImpl_StreamSetSize,
+ StorageInternalImpl_StreamLink
};
/******************************************************************************
@@ -5026,38 +5625,134 @@ void StorageUtl_CopyDirEntryToSTATSTG(
** BlockChainStream implementation
*/
+/* Read and save the index of all blocks in this stream. */
+HRESULT BlockChainStream_UpdateIndexCache(BlockChainStream* This)
+{
+ ULONG next_sector, next_offset;
+ HRESULT hr;
+ struct BlockChainRun *last_run;
+
+ if (This->indexCacheLen == 0)
+ {
+ last_run = NULL;
+ next_offset = 0;
+ next_sector = BlockChainStream_GetHeadOfChain(This);
+ }
+ else
+ {
+ last_run = &This->indexCache[This->indexCacheLen-1];
+ next_offset = last_run->lastOffset+1;
+ hr = StorageImpl_GetNextBlockInChain(This->parentStorage,
+ last_run->firstSector + last_run->lastOffset - last_run->firstOffset,
+ &next_sector);
+ if (FAILED(hr)) return hr;
+ }
+
+ while (next_sector != BLOCK_END_OF_CHAIN)
+ {
+ if (!last_run || next_sector != last_run->firstSector + next_offset - last_run->firstOffset)
+ {
+ /* Add the current block to the cache. */
+ if (This->indexCacheSize == 0)
+ {
+ This->indexCache = HeapAlloc(GetProcessHeap(), 0, sizeof(struct BlockChainRun)*16);
+ if (!This->indexCache) return E_OUTOFMEMORY;
+ This->indexCacheSize = 16;
+ }
+ else if (This->indexCacheSize == This->indexCacheLen)
+ {
+ struct BlockChainRun *new_cache;
+ ULONG new_size;
+
+ new_size = This->indexCacheSize * 2;
+ new_cache = HeapAlloc(GetProcessHeap(), 0, sizeof(struct BlockChainRun)*new_size);
+ if (!new_cache) return E_OUTOFMEMORY;
+ memcpy(new_cache, This->indexCache, sizeof(struct BlockChainRun)*This->indexCacheLen);
+
+ HeapFree(GetProcessHeap(), 0, This->indexCache);
+ This->indexCache = new_cache;
+ This->indexCacheSize = new_size;
+ }
+
+ This->indexCacheLen++;
+ last_run = &This->indexCache[This->indexCacheLen-1];
+ last_run->firstSector = next_sector;
+ last_run->firstOffset = next_offset;
+ }
+
+ last_run->lastOffset = next_offset;
+
+ /* Find the next block. */
+ next_offset++;
+ hr = StorageImpl_GetNextBlockInChain(This->parentStorage, next_sector, &next_sector);
+ if (FAILED(hr)) return hr;
+ }
+
+ if (This->indexCacheLen)
+ {
+ This->tailIndex = last_run->firstSector + last_run->lastOffset - last_run->firstOffset;
+ This->numBlocks = last_run->lastOffset+1;
+ }
+ else
+ {
+ This->tailIndex = BLOCK_END_OF_CHAIN;
+ This->numBlocks = 0;
+ }
+
+ return S_OK;
+}
+
+/* Locate the nth block in this stream. */
+ULONG BlockChainStream_GetSectorOfOffset(BlockChainStream *This, ULONG offset)
+{
+ ULONG min_offset = 0, max_offset = This->numBlocks-1;
+ ULONG min_run = 0, max_run = This->indexCacheLen-1;
+
+ if (offset >= This->numBlocks)
+ return BLOCK_END_OF_CHAIN;
+
+ while (min_run < max_run)
+ {
+ ULONG run_to_check = min_run + (offset - min_offset) * (max_run - min_run) / (max_offset - min_offset);
+ if (offset < This->indexCache[run_to_check].firstOffset)
+ {
+ max_offset = This->indexCache[run_to_check].firstOffset-1;
+ max_run = run_to_check-1;
+ }
+ else if (offset > This->indexCache[run_to_check].lastOffset)
+ {
+ min_offset = This->indexCache[run_to_check].lastOffset+1;
+ min_run = run_to_check+1;
+ }
+ else
+ /* Block is in this run. */
+ min_run = max_run = run_to_check;
+ }
+
+ return This->indexCache[min_run].firstSector + offset - This->indexCache[min_run].firstOffset;
+}
+
BlockChainStream* BlockChainStream_Construct(
StorageImpl* parentStorage,
ULONG* headOfStreamPlaceHolder,
DirRef dirEntry)
{
BlockChainStream* newStream;
- ULONG blockIndex;
newStream = HeapAlloc(GetProcessHeap(), 0, sizeof(BlockChainStream));
newStream->parentStorage = parentStorage;
newStream->headOfStreamPlaceHolder = headOfStreamPlaceHolder;
newStream->ownerDirEntry = dirEntry;
- newStream->lastBlockNoInSequence = 0xFFFFFFFF;
- newStream->tailIndex = BLOCK_END_OF_CHAIN;
- newStream->numBlocks = 0;
+ newStream->indexCache = NULL;
+ newStream->indexCacheLen = 0;
+ newStream->indexCacheSize = 0;
- blockIndex = BlockChainStream_GetHeadOfChain(newStream);
-
- while (blockIndex != BLOCK_END_OF_CHAIN)
+ if (FAILED(BlockChainStream_UpdateIndexCache(newStream)))
{
- newStream->numBlocks++;
- newStream->tailIndex = blockIndex;
-
- if(FAILED(StorageImpl_GetNextBlockInChain(
- parentStorage,
- blockIndex,
- &blockIndex)))
- {
- HeapFree(GetProcessHeap(), 0, newStream);
- return NULL;
- }
+ HeapFree(GetProcessHeap(), 0, newStream->indexCache);
+ HeapFree(GetProcessHeap(), 0, newStream);
+ return NULL;
}
return newStream;
@@ -5065,6 +5760,8 @@ BlockChainStream* BlockChainStream_Construct(
void BlockChainStream_Destroy(BlockChainStream* This)
{
+ if (This)
+ HeapFree(GetProcessHeap(), 0, This->indexCache);
HeapFree(GetProcessHeap(), 0, This);
}
@@ -5105,27 +5802,10 @@ static ULONG BlockChainStream_GetHeadOfChain(BlockChainStream* This)
*
* Returns the number of blocks that comprises this chain.
* This is not the size of the stream as the last block may not be full!
- *
*/
static ULONG BlockChainStream_GetCount(BlockChainStream* This)
{
- ULONG blockIndex;
- ULONG count = 0;
-
- blockIndex = BlockChainStream_GetHeadOfChain(This);
-
- while (blockIndex != BLOCK_END_OF_CHAIN)
- {
- count++;
-
- if(FAILED(StorageImpl_GetNextBlockInChain(
- This->parentStorage,
- blockIndex,
- &blockIndex)))
- return 0;
- }
-
- return count;
+ return This->numBlocks;
}
/******************************************************************************
@@ -5146,44 +5826,26 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
ULONG bytesToReadInBuffer;
ULONG blockIndex;
BYTE* bufferWalker;
+ ULARGE_INTEGER stream_size;
TRACE("(%p)-> %i %p %i %p\n",This, offset.u.LowPart, buffer, size, bytesRead);
/*
* Find the first block in the stream that contains part of the buffer.
*/
- if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
- (This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
- (blockNoInSequence < This->lastBlockNoInSequence) )
- {
- blockIndex = BlockChainStream_GetHeadOfChain(This);
- This->lastBlockNoInSequence = blockNoInSequence;
- }
+ blockIndex = BlockChainStream_GetSectorOfOffset(This, blockNoInSequence);
+
+ *bytesRead = 0;
+
+ stream_size = BlockChainStream_GetSize(This);
+ if (stream_size.QuadPart > offset.QuadPart)
+ size = min(stream_size.QuadPart - offset.QuadPart, size);
else
- {
- ULONG temp = blockNoInSequence;
-
- blockIndex = This->lastBlockNoInSequenceIndex;
- blockNoInSequence -= This->lastBlockNoInSequence;
- This->lastBlockNoInSequence = temp;
- }
-
- while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
- {
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex, &blockIndex)))
- return STG_E_DOCFILECORRUPT;
- blockNoInSequence--;
- }
-
- if ((blockNoInSequence > 0) && (blockIndex == BLOCK_END_OF_CHAIN))
- return STG_E_DOCFILECORRUPT; /* We failed to find the starting block */
-
- This->lastBlockNoInSequenceIndex = blockIndex;
+ return S_OK;
/*
* Start reading the buffer.
*/
- *bytesRead = 0;
bufferWalker = buffer;
while ( (size > 0) && (blockIndex != BLOCK_END_OF_CHAIN) )
@@ -5221,7 +5883,7 @@ HRESULT BlockChainStream_ReadAt(BlockChainStream* This,
break;
}
- return (size == 0) ? S_OK : STG_E_READFAULT;
+ return S_OK;
}
/******************************************************************************
@@ -5245,31 +5907,7 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
/*
* Find the first block in the stream that contains part of the buffer.
*/
- if ( (This->lastBlockNoInSequence == 0xFFFFFFFF) ||
- (This->lastBlockNoInSequenceIndex == BLOCK_END_OF_CHAIN) ||
- (blockNoInSequence < This->lastBlockNoInSequence) )
- {
- blockIndex = BlockChainStream_GetHeadOfChain(This);
- This->lastBlockNoInSequence = blockNoInSequence;
- }
- else
- {
- ULONG temp = blockNoInSequence;
-
- blockIndex = This->lastBlockNoInSequenceIndex;
- blockNoInSequence -= This->lastBlockNoInSequence;
- This->lastBlockNoInSequence = temp;
- }
-
- while ( (blockNoInSequence > 0) && (blockIndex != BLOCK_END_OF_CHAIN))
- {
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex,
- &blockIndex)))
- return STG_E_DOCFILECORRUPT;
- blockNoInSequence--;
- }
-
- This->lastBlockNoInSequenceIndex = blockIndex;
+ blockIndex = BlockChainStream_GetSectorOfOffset(This, blockNoInSequence);
/* BlockChainStream_SetSize should have already been called to ensure we have
* enough blocks in the chain to write into */
@@ -5330,15 +5968,8 @@ HRESULT BlockChainStream_WriteAt(BlockChainStream* This,
static BOOL BlockChainStream_Shrink(BlockChainStream* This,
ULARGE_INTEGER newSize)
{
- ULONG blockIndex, extraBlock;
+ ULONG blockIndex;
ULONG numBlocks;
- ULONG count = 1;
-
- /*
- * Reset the last accessed block cache.
- */
- This->lastBlockNoInSequence = 0xFFFFFFFF;
- This->lastBlockNoInSequenceIndex = BLOCK_END_OF_CHAIN;
/*
* Figure out how many blocks are needed to contain the new size
@@ -5348,43 +5979,62 @@ static BOOL BlockChainStream_Shrink(BlockChainStream* This,
if ((newSize.u.LowPart % This->parentStorage->bigBlockSize) != 0)
numBlocks++;
- blockIndex = BlockChainStream_GetHeadOfChain(This);
-
- /*
- * Go to the new end of chain
- */
- while (count < numBlocks)
+ if (numBlocks)
{
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex,
- &blockIndex)))
- return FALSE;
- count++;
+ /*
+ * Go to the new end of chain
+ */
+ blockIndex = BlockChainStream_GetSectorOfOffset(This, numBlocks-1);
+
+ /* Mark the new end of chain */
+ StorageImpl_SetNextBlockInChain(
+ This->parentStorage,
+ blockIndex,
+ BLOCK_END_OF_CHAIN);
+
+ This->tailIndex = blockIndex;
+ }
+ else
+ {
+ if (This->headOfStreamPlaceHolder != 0)
+ {
+ *This->headOfStreamPlaceHolder = BLOCK_END_OF_CHAIN;
+ }
+ else
+ {
+ DirEntry chainEntry;
+ assert(This->ownerDirEntry != DIRENTRY_NULL);
+
+ StorageImpl_ReadDirEntry(
+ This->parentStorage,
+ This->ownerDirEntry,
+ &chainEntry);
+
+ chainEntry.startingBlock = BLOCK_END_OF_CHAIN;
+
+ StorageImpl_WriteDirEntry(
+ This->parentStorage,
+ This->ownerDirEntry,
+ &chainEntry);
+ }
+
+ This->tailIndex = BLOCK_END_OF_CHAIN;
}
- /* Get the next block before marking the new end */
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, blockIndex,
- &extraBlock)))
- return FALSE;
-
- /* Mark the new end of chain */
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- blockIndex,
- BLOCK_END_OF_CHAIN);
-
- This->tailIndex = blockIndex;
This->numBlocks = numBlocks;
/*
* Mark the extra blocks as free
*/
- while (extraBlock != BLOCK_END_OF_CHAIN)
+ while (This->indexCacheLen && This->indexCache[This->indexCacheLen-1].lastOffset >= numBlocks)
{
- if(FAILED(StorageImpl_GetNextBlockInChain(This->parentStorage, extraBlock,
- &blockIndex)))
- return FALSE;
- StorageImpl_FreeBigBlock(This->parentStorage, extraBlock);
- extraBlock = blockIndex;
+ struct BlockChainRun *last_run = &This->indexCache[This->indexCacheLen-1];
+ StorageImpl_FreeBigBlock(This->parentStorage,
+ last_run->firstSector + last_run->lastOffset - last_run->firstOffset);
+ if (last_run->lastOffset == last_run->firstOffset)
+ This->indexCacheLen--;
+ else
+ last_run->lastOffset--;
}
return TRUE;
@@ -5498,6 +6148,9 @@ static BOOL BlockChainStream_Enlarge(BlockChainStream* This,
This->numBlocks = newNumBlocks;
}
+ if (FAILED(BlockChainStream_UpdateIndexCache(This)))
+ return FALSE;
+
return TRUE;
}
@@ -5663,6 +6316,9 @@ static HRESULT SmallBlockChainStream_GetNextBlockInChain(
&buffer,
&bytesRead);
+ if (SUCCEEDED(res) && bytesRead != sizeof(DWORD))
+ res = STG_E_READFAULT;
+
if (SUCCEEDED(res))
{
StorageUtl_ReadDWord((BYTE *)&buffer, 0, nextBlockInChain);
@@ -5734,6 +6390,9 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
ULONG nextBlockIndex = BLOCK_END_OF_CHAIN;
HRESULT res = S_OK;
ULONG smallBlocksPerBigBlock;
+ DirEntry rootEntry;
+ ULONG blocksRequired;
+ ULARGE_INTEGER old_size, size_required;
offsetOfBlockInDepot.u.HighPart = 0;
@@ -5754,7 +6413,7 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
/*
* If we run out of space for the small block depot, enlarge it
*/
- if (SUCCEEDED(res))
+ if (SUCCEEDED(res) && bytesRead == sizeof(DWORD))
{
StorageUtl_ReadDWord((BYTE *)&buffer, 0, &nextBlockIndex);
@@ -5766,76 +6425,22 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
ULONG count =
BlockChainStream_GetCount(This->parentStorage->smallBlockDepotChain);
- ULONG sbdIndex = This->parentStorage->smallBlockDepotStart;
- ULONG nextBlock, newsbdIndex;
BYTE smallBlockDepot[MAX_BIG_BLOCK_SIZE];
+ ULARGE_INTEGER newSize, offset;
+ ULONG bytesWritten;
- nextBlock = sbdIndex;
- while (nextBlock != BLOCK_END_OF_CHAIN)
- {
- sbdIndex = nextBlock;
- StorageImpl_GetNextBlockInChain(This->parentStorage, sbdIndex, &nextBlock);
- }
-
- newsbdIndex = StorageImpl_GetNextFreeBigBlock(This->parentStorage);
- if (sbdIndex != BLOCK_END_OF_CHAIN)
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- sbdIndex,
- newsbdIndex);
-
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- newsbdIndex,
- BLOCK_END_OF_CHAIN);
+ newSize.QuadPart = (count + 1) * This->parentStorage->bigBlockSize;
+ BlockChainStream_Enlarge(This->parentStorage->smallBlockDepotChain, newSize);
/*
* Initialize all the small blocks to free
*/
memset(smallBlockDepot, BLOCK_UNUSED, This->parentStorage->bigBlockSize);
- StorageImpl_WriteBigBlock(This->parentStorage, newsbdIndex, smallBlockDepot);
+ offset.QuadPart = count * This->parentStorage->bigBlockSize;
+ BlockChainStream_WriteAt(This->parentStorage->smallBlockDepotChain,
+ offset, This->parentStorage->bigBlockSize, smallBlockDepot, &bytesWritten);
- if (count == 0)
- {
- /*
- * We have just created the small block depot.
- */
- DirEntry rootEntry;
- ULONG sbStartIndex;
-
- /*
- * Save it in the header
- */
- This->parentStorage->smallBlockDepotStart = newsbdIndex;
- StorageImpl_SaveFileHeader(This->parentStorage);
-
- /*
- * And allocate the first big block that will contain small blocks
- */
- sbStartIndex =
- StorageImpl_GetNextFreeBigBlock(This->parentStorage);
-
- StorageImpl_SetNextBlockInChain(
- This->parentStorage,
- sbStartIndex,
- BLOCK_END_OF_CHAIN);
-
- StorageImpl_ReadDirEntry(
- This->parentStorage,
- This->parentStorage->base.storageDirEntry,
- &rootEntry);
-
- rootEntry.startingBlock = sbStartIndex;
- rootEntry.size.u.HighPart = 0;
- rootEntry.size.u.LowPart = This->parentStorage->bigBlockSize;
-
- StorageImpl_WriteDirEntry(
- This->parentStorage,
- This->parentStorage->base.storageDirEntry,
- &rootEntry);
- }
- else
- StorageImpl_SaveFileHeader(This->parentStorage);
+ StorageImpl_SaveFileHeader(This->parentStorage);
}
}
@@ -5847,30 +6452,29 @@ static ULONG SmallBlockChainStream_GetNextFreeBlock(
/*
* Verify if we have to allocate big blocks to contain small blocks
*/
- if (blockIndex % smallBlocksPerBigBlock == 0)
+ blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
+
+ size_required.QuadPart = blocksRequired * This->parentStorage->bigBlockSize;
+
+ old_size = BlockChainStream_GetSize(This->parentStorage->smallBlockRootChain);
+
+ if (size_required.QuadPart > old_size.QuadPart)
{
- DirEntry rootEntry;
- ULONG blocksRequired = (blockIndex / smallBlocksPerBigBlock) + 1;
+ BlockChainStream_SetSize(
+ This->parentStorage->smallBlockRootChain,
+ size_required);
StorageImpl_ReadDirEntry(
This->parentStorage,
This->parentStorage->base.storageDirEntry,
&rootEntry);
- if (rootEntry.size.u.LowPart <
- (blocksRequired * This->parentStorage->bigBlockSize))
- {
- rootEntry.size.u.LowPart += This->parentStorage->bigBlockSize;
+ rootEntry.size = size_required;
- BlockChainStream_SetSize(
- This->parentStorage->smallBlockRootChain,
- rootEntry.size);
-
- StorageImpl_WriteDirEntry(
- This->parentStorage,
- This->parentStorage->base.storageDirEntry,
- &rootEntry);
- }
+ StorageImpl_WriteDirEntry(
+ This->parentStorage,
+ This->parentStorage->base.storageDirEntry,
+ &rootEntry);
}
return blockIndex;
@@ -5900,12 +6504,21 @@ HRESULT SmallBlockChainStream_ReadAt(
ULONG blockIndex;
ULONG bytesReadFromBigBlockFile;
BYTE* bufferWalker;
+ ULARGE_INTEGER stream_size;
/*
* This should never happen on a small block file.
*/
assert(offset.u.HighPart==0);
+ *bytesRead = 0;
+
+ stream_size = SmallBlockChainStream_GetSize(This);
+ if (stream_size.QuadPart > offset.QuadPart)
+ size = min(stream_size.QuadPart - offset.QuadPart, size);
+ else
+ return S_OK;
+
/*
* Find the first block in the stream that contains part of the buffer.
*/
@@ -5922,7 +6535,6 @@ HRESULT SmallBlockChainStream_ReadAt(
/*
* Start reading the buffer.
*/
- *bytesRead = 0;
bufferWalker = buffer;
while ( (size > 0) && (blockIndex != BLOCK_END_OF_CHAIN) )
@@ -5956,6 +6568,9 @@ HRESULT SmallBlockChainStream_ReadAt(
if (FAILED(rc))
return rc;
+ if (!bytesReadFromBigBlockFile)
+ return STG_E_DOCFILECORRUPT;
+
/*
* Step to the next big block.
*/
@@ -5969,7 +6584,7 @@ HRESULT SmallBlockChainStream_ReadAt(
offsetInBlock = (offsetInBlock + bytesReadFromBigBlockFile) % This->parentStorage->smallBlockSize;
}
- return (size == 0) ? S_OK : STG_E_READFAULT;
+ return S_OK;
}
/******************************************************************************
diff --git a/dll/win32/ole32/storage32.h b/dll/win32/ole32/storage32.h
index 36a7d679af6..19f3f2d682c 100644
--- a/dll/win32/ole32/storage32.h
+++ b/dll/win32/ole32/storage32.h
@@ -263,6 +263,7 @@ struct StorageBaseImplVtbl {
HRESULT (*StreamReadAt)(StorageBaseImpl*,DirRef,ULARGE_INTEGER,ULONG,void*,ULONG*);
HRESULT (*StreamWriteAt)(StorageBaseImpl*,DirRef,ULARGE_INTEGER,ULONG,const void*,ULONG*);
HRESULT (*StreamSetSize)(StorageBaseImpl*,DirRef,ULARGE_INTEGER);
+ HRESULT (*StreamLink)(StorageBaseImpl*,DirRef,DirRef);
};
static inline void StorageBaseImpl_Destroy(StorageBaseImpl *This)
@@ -320,6 +321,16 @@ static inline HRESULT StorageBaseImpl_StreamSetSize(StorageBaseImpl *This,
return This->baseVtbl->StreamSetSize(This, index, newsize);
}
+/* Make dst point to the same stream that src points to. Other stream operations
+ * will not work properly for entries that point to the same stream, so this
+ * must be a very temporary state, and only one entry pointing to a given stream
+ * may be reachable at any given time. */
+static inline HRESULT StorageBaseImpl_StreamLink(StorageBaseImpl *This,
+ DirRef dst, DirRef src)
+{
+ return This->baseVtbl->StreamLink(This, dst, src);
+}
+
/****************************************************************************
* StorageBaseImpl stream list handlers
*/
@@ -513,13 +524,22 @@ void StorageUtl_CopyDirEntryToSTATSTG(StorageBaseImpl *storage,STATSTG* destinat
* The BlockChainStream class is a utility class that is used to create an
* abstraction of the big block chains in the storage file.
*/
+struct BlockChainRun
+{
+ /* This represents a range of blocks that happen reside in consecutive sectors. */
+ ULONG firstSector;
+ ULONG firstOffset;
+ ULONG lastOffset;
+};
+
struct BlockChainStream
{
StorageImpl* parentStorage;
ULONG* headOfStreamPlaceHolder;
DirRef ownerDirEntry;
- ULONG lastBlockNoInSequence;
- ULONG lastBlockNoInSequenceIndex;
+ struct BlockChainRun* indexCache;
+ ULONG indexCacheLen;
+ ULONG indexCacheSize;
ULONG tailIndex;
ULONG numBlocks;
};
diff --git a/dll/win32/ole32/usrmarshal.c b/dll/win32/ole32/usrmarshal.c
index ed316201f69..2d238e6ccc3 100644
--- a/dll/win32/ole32/usrmarshal.c
+++ b/dll/win32/ole32/usrmarshal.c
@@ -2761,7 +2761,8 @@ void CALLBACK IAdviseSink_OnDataChange_Proxy(
FORMATETC *pFormatetc,
STGMEDIUM *pStgmed)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
+ IAdviseSink_RemoteOnDataChange_Proxy(This, pFormatetc, pStgmed);
}
HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub(
@@ -2769,8 +2770,9 @@ HRESULT __RPC_STUB IAdviseSink_OnDataChange_Stub(
FORMATETC *pFormatetc,
ASYNC_STGMEDIUM *pStgmed)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%p, %p)\n", This, pFormatetc, pStgmed);
+ IAdviseSink_OnDataChange(This, pFormatetc, pStgmed);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnViewChange_Proxy(
@@ -2778,7 +2780,8 @@ void CALLBACK IAdviseSink_OnViewChange_Proxy(
DWORD dwAspect,
LONG lindex)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
+ IAdviseSink_RemoteOnViewChange_Proxy(This, dwAspect, lindex);
}
HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub(
@@ -2786,64 +2789,73 @@ HRESULT __RPC_STUB IAdviseSink_OnViewChange_Stub(
DWORD dwAspect,
LONG lindex)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%d, %d)\n", This, dwAspect, lindex);
+ IAdviseSink_OnViewChange(This, dwAspect, lindex);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnRename_Proxy(
IAdviseSink* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink_RemoteOnRename_Proxy(This, pmk);
}
HRESULT __RPC_STUB IAdviseSink_OnRename_Stub(
IAdviseSink* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink_OnRename(This, pmk);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnSave_Proxy(
IAdviseSink* This)
{
- FIXME(":stub\n");
+ TRACE("(%p)\n", This);
+ IAdviseSink_RemoteOnSave_Proxy(This);
}
HRESULT __RPC_STUB IAdviseSink_OnSave_Stub(
IAdviseSink* This)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)\n", This);
+ IAdviseSink_OnSave(This);
+ return S_OK;
}
void CALLBACK IAdviseSink_OnClose_Proxy(
IAdviseSink* This)
{
- FIXME(":stub\n");
+ TRACE("(%p)\n", This);
+ IAdviseSink_RemoteOnClose_Proxy(This);
}
HRESULT __RPC_STUB IAdviseSink_OnClose_Stub(
IAdviseSink* This)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)\n", This);
+ IAdviseSink_OnClose(This);
+ return S_OK;
}
void CALLBACK IAdviseSink2_OnLinkSrcChange_Proxy(
IAdviseSink2* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink2_RemoteOnLinkSrcChange_Proxy(This, pmk);
}
HRESULT __RPC_STUB IAdviseSink2_OnLinkSrcChange_Stub(
IAdviseSink2* This,
IMoniker *pmk)
{
- FIXME(":stub\n");
- return E_NOTIMPL;
+ TRACE("(%p)->(%p)\n", This, pmk);
+ IAdviseSink2_OnLinkSrcChange(This, pmk);
+ return S_OK;
}
HRESULT CALLBACK IDataObject_GetData_Proxy(
diff --git a/dll/win32/riched20/riched20.rbuild b/dll/win32/riched20/riched20.rbuild
index 0191c64390a..b176049bb8a 100644
--- a/dll/win32/riched20/riched20.rbuild
+++ b/dll/win32/riched20/riched20.rbuild
@@ -1,7 +1,7 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/rpcrt4/unix_func.h b/dll/win32/rpcrt4/unix_func.h
index c56427d2df1..4a100b7fbf6 100644
--- a/dll/win32/rpcrt4/unix_func.h
+++ b/dll/win32/rpcrt4/unix_func.h
@@ -1,19 +1,4 @@
-#define POLLIN 001
-#define POLLPRI 002
-#define POLLOUT 004
-#define POLLNORM POLLIN
-#define POLLERR 010
-#define POLLHUP 020
-#define POLLNVAL 040
-
-struct pollfd
-{
- int fd; /* file descriptor */
- short events; /* requested events */
- short revents; /* returned events */
-};
-
#define F_SETFL 4 /* set file->f_flags */
#ifndef O_NONBLOCK
@@ -24,5 +9,4 @@ struct pollfd
int poll(struct pollfd *fds, unsigned long nfds, int timo);
int socketpair (int af, int type, int protocol, SOCKET socket[2]);
-const char * inet_ntop (int af, const void *src, char *dst, size_t cnt);
int fcntl(int fd, int cmd, long arg);
diff --git a/dll/win32/rsaenh/implglue.c b/dll/win32/rsaenh/implglue.c
index 7ecfc289ecf..c217007221c 100644
--- a/dll/win32/rsaenh/implglue.c
+++ b/dll/win32/rsaenh/implglue.c
@@ -342,6 +342,7 @@ BOOL encrypt_block_impl(ALG_ID aiAlgid, DWORD dwKeySpec, KEY_CONTEXT *pKeyContex
case CALG_RSA_KEYX:
case CALG_RSA_SIGN:
+ case CALG_SSL3_SHAMD5:
outlen = inlen = (mp_count_bits(&pKeyContext->rsa.N)+7)/8;
if (enc) {
if (rsa_exptmod(in, inlen, out, &outlen, dwKeySpec, &pKeyContext->rsa) != CRYPT_OK) {
diff --git a/dll/win32/rsaenh/rsaenh.c b/dll/win32/rsaenh/rsaenh.c
index 8a5be9935c3..d7d63b13676 100644
--- a/dll/win32/rsaenh/rsaenh.c
+++ b/dll/win32/rsaenh/rsaenh.c
@@ -1167,16 +1167,6 @@ static void store_key_container_keys(KEYCONTAINER *pKeyContainer)
static void store_key_container_permissions(KEYCONTAINER *pKeyContainer)
{
HKEY hKey;
- DWORD dwFlags;
-
- /* On WinXP, persistent keys are stored in a file located at:
- * $AppData$\\Microsoft\\Crypto\\RSA\\$SID$\\some_hex_string
- */
-
- if (pKeyContainer->dwFlags & CRYPT_MACHINE_KEYSET)
- dwFlags = CRYPTPROTECT_LOCAL_MACHINE;
- else
- dwFlags = 0;
if (create_container_key(pKeyContainer, KEY_WRITE, &hKey))
{
@@ -1426,7 +1416,7 @@ static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid,
ALG_ID aiAlgid;
DWORD dwLen;
CONST BYTE abOID[19];
- } aOIDDescriptor[8] = {
+ } aOIDDescriptor[] = {
{ CALG_MD2, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
0x86, 0xf7, 0x0d, 0x02, 0x02, 0x05, 0x00, 0x04, 0x10 } },
{ CALG_MD4, 18, { 0x30, 0x20, 0x30, 0x0c, 0x06, 0x08, 0x2a, 0x86, 0x48,
@@ -1444,6 +1434,7 @@ static BOOL build_hash_signature(BYTE *pbSignature, DWORD dwLen, ALG_ID aiAlgid,
{ CALG_SHA_384, 19, { 0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01,
0x05, 0x00, 0x04, 0x40 } },
+ { CALG_SSL3_SHAMD5, 0, { 0 } },
{ 0, 0, { 0 } }
};
DWORD dwIdxOID, i, j;
diff --git a/dll/win32/shdocvw/iexplore.c b/dll/win32/shdocvw/iexplore.c
index d65810f58f9..9c14cfc1631 100644
--- a/dll/win32/shdocvw/iexplore.c
+++ b/dll/win32/shdocvw/iexplore.c
@@ -37,6 +37,8 @@
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
+#define IDI_APPICON 101
+
static const WCHAR szIEWinFrame[] = { 'I','E','F','r','a','m','e',0 };
static LRESULT iewnd_OnCreate(HWND hwnd, LPCREATESTRUCTW lpcs)
@@ -85,7 +87,7 @@ ie_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
void register_iewindow_class(void)
{
- WNDCLASSW wc;
+ WNDCLASSEXW wc;
memset(&wc, 0, sizeof wc);
wc.style = 0;
@@ -93,13 +95,15 @@ void register_iewindow_class(void)
wc.cbClsExtra = 0;
wc.cbWndExtra = sizeof(InternetExplorer*);
wc.hInstance = shdocvw_hinstance;
- wc.hIcon = 0;
- wc.hCursor = LoadCursorW(0, MAKEINTRESOURCEW(IDI_APPLICATION));
+ wc.hIcon = LoadIconW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_APPICON));
+ wc.hIconSm = LoadImageW(GetModuleHandleW(0), MAKEINTRESOURCEW(IDI_APPICON), IMAGE_ICON,
+ GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_SHARED);
+ wc.hCursor = LoadCursorW(0, MAKEINTRESOURCEW(IDC_ARROW));
wc.hbrBackground = 0;
wc.lpszClassName = szIEWinFrame;
wc.lpszMenuName = NULL;
- RegisterClassW(&wc);
+ RegisterClassExW(&wc);
}
void unregister_iewindow_class(void)
diff --git a/dll/win32/shdocvw/intshcut.c b/dll/win32/shdocvw/intshcut.c
index b389ec3727a..32dab6dd519 100644
--- a/dll/win32/shdocvw/intshcut.c
+++ b/dll/win32/shdocvw/intshcut.c
@@ -74,6 +74,7 @@ static BOOL run_winemenubuilder( const WCHAR *args )
PROCESS_INFORMATION pi;
BOOL ret;
WCHAR app[MAX_PATH];
+ void *redir;
GetSystemDirectoryW( app, MAX_PATH - sizeof(menubuilder)/sizeof(WCHAR) );
strcatW( app, menubuilder );
@@ -91,7 +92,9 @@ static BOOL run_winemenubuilder( const WCHAR *args )
memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
+ Wow64DisableWow64FsRedirection( &redir );
ret = CreateProcessW( app, buffer, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );
+ Wow64RevertWow64FsRedirection( redir );
heap_free( buffer );
diff --git a/dll/win32/shdocvw/navigate.c b/dll/win32/shdocvw/navigate.c
index 8ba5f692740..99980c7c31b 100644
--- a/dll/win32/shdocvw/navigate.c
+++ b/dll/win32/shdocvw/navigate.c
@@ -642,7 +642,7 @@ static HRESULT async_doc_navigate(DocHost *This, LPCWSTR url, LPCWSTR headers, P
return free_doc_navigate_task(task, TRUE);
}
- if(task->post_data) {
+ if(post_data) {
task->post_data = SafeArrayCreateVector(VT_UI1, 0, post_data_size);
if(!task->post_data)
return free_doc_navigate_task(task, TRUE);
@@ -950,7 +950,132 @@ static const IHlinkFrameVtbl HlinkFrameVtbl = {
HlinkFrame_UpdateHlink
};
+#define TARGETFRAME2_THIS(iface) DEFINE_THIS(WebBrowser, ITargetFrame2, iface)
+
+static HRESULT WINAPI TargetFrame2_QueryInterface(ITargetFrame2 *iface, REFIID riid, void **ppv)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ return IWebBrowser2_QueryInterface(WEBBROWSER2(This), riid, ppv);
+}
+
+static ULONG WINAPI TargetFrame2_AddRef(ITargetFrame2 *iface)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ return IWebBrowser2_AddRef(WEBBROWSER2(This));
+}
+
+static ULONG WINAPI TargetFrame2_Release(ITargetFrame2 *iface)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ return IWebBrowser2_Release(WEBBROWSER2(This));
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameName(ITargetFrame2 *iface, LPCWSTR pszFrameName)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pszFrameName));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameName(ITargetFrame2 *iface, LPWSTR *ppszFrameName)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppszFrameName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetParentFrame(ITargetFrame2 *iface, IUnknown **ppunkParent)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppunkParent);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameSrc(ITargetFrame2 *iface, LPCWSTR pszFrameSrc)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pszFrameSrc));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameSrc(ITargetFrame2 *iface, LPWSTR *ppszFrameSrc)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFramesContainer(ITargetFrame2 *iface, IOleContainer **ppContainer)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, ppContainer);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameOptions(ITargetFrame2 *iface, DWORD dwFlags)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%x)\n", This, dwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameOptions(ITargetFrame2 *iface, DWORD *pdwFlags)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p)\n", This, pdwFlags);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_SetFrameMargins(ITargetFrame2 *iface, DWORD dwWidth, DWORD dwHeight)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%d %d)\n", This, dwWidth, dwHeight);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetFrameMargins(ITargetFrame2 *iface, DWORD *pdwWidth, DWORD *pdwHeight)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%p %p)\n", This, pdwWidth, pdwHeight);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_FindFrame(ITargetFrame2 *iface, LPCWSTR pszTargetName, DWORD dwFlags, IUnknown **ppunkTargetFrame)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(pszTargetName), dwFlags, ppunkTargetFrame);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TargetFrame2_GetTargetAlias(ITargetFrame2 *iface, LPCWSTR pszTargetName, LPWSTR *ppszTargetAlias)
+{
+ WebBrowser *This = TARGETFRAME2_THIS(iface);
+ FIXME("(%p)->(%s %p)\n", This, debugstr_w(pszTargetName), ppszTargetAlias);
+ return E_NOTIMPL;
+}
+
+#undef TARGETFRAME2_THIS
+
+static const ITargetFrame2Vtbl TargetFrame2Vtbl = {
+ TargetFrame2_QueryInterface,
+ TargetFrame2_AddRef,
+ TargetFrame2_Release,
+ TargetFrame2_SetFrameName,
+ TargetFrame2_GetFrameName,
+ TargetFrame2_GetParentFrame,
+ TargetFrame2_SetFrameSrc,
+ TargetFrame2_GetFrameSrc,
+ TargetFrame2_GetFramesContainer,
+ TargetFrame2_SetFrameOptions,
+ TargetFrame2_GetFrameOptions,
+ TargetFrame2_SetFrameMargins,
+ TargetFrame2_GetFrameMargins,
+ TargetFrame2_FindFrame,
+ TargetFrame2_GetTargetAlias
+};
+
void WebBrowser_HlinkFrame_Init(WebBrowser *This)
{
This->lpHlinkFrameVtbl = &HlinkFrameVtbl;
+ This->lpITargetFrame2Vtbl = &TargetFrame2Vtbl;
}
diff --git a/dll/win32/shdocvw/shdocvw.h b/dll/win32/shdocvw/shdocvw.h
index 1184298dca9..1af0365d25d 100644
--- a/dll/win32/shdocvw/shdocvw.h
+++ b/dll/win32/shdocvw/shdocvw.h
@@ -37,6 +37,7 @@
#include "exdisp.h"
#include "mshtmhst.h"
#include "hlink.h"
+#include "htiframe.h"
#include "wine/unicode.h"
@@ -126,7 +127,9 @@ struct WebBrowser {
const IOleInPlaceActiveObjectVtbl *lpOleInPlaceActiveObjectVtbl;
const IOleCommandTargetVtbl *lpOleCommandTargetVtbl;
const IHlinkFrameVtbl *lpHlinkFrameVtbl;
+ const ITargetFrame2Vtbl *lpITargetFrame2Vtbl;
const IServiceProviderVtbl *lpServiceProviderVtbl;
+ const IDataObjectVtbl *lpDataObjectVtbl;
LONG ref;
@@ -184,6 +187,8 @@ struct InternetExplorer {
#define ACTIVEOBJ(x) ((IOleInPlaceActiveObject*) &(x)->lpOleInPlaceActiveObjectVtbl)
#define OLECMD(x) ((IOleCommandTarget*) &(x)->lpOleCommandTargetVtbl)
#define HLINKFRAME(x) ((IHlinkFrame*) &(x)->lpHlinkFrameVtbl)
+#define DATAOBJECT(x) ((IDataObject*) &(x)->lpDataObjectVtbl)
+#define TARGETFRAME2(x) ((ITargetFrame2*) &(x)->lpITargetFrame2Vtbl)
#define CLIENTSITE(x) ((IOleClientSite*) &(x)->lpOleClientSiteVtbl)
#define INPLACESITE(x) ((IOleInPlaceSite*) &(x)->lpOleInPlaceSiteVtbl)
@@ -198,6 +203,7 @@ struct InternetExplorer {
void WebBrowser_OleObject_Init(WebBrowser*);
void WebBrowser_ViewObject_Init(WebBrowser*);
+void WebBrowser_DataObject_Init(WebBrowser*);
void WebBrowser_Persist_Init(WebBrowser*);
void WebBrowser_ClassInfo_Init(WebBrowser*);
void WebBrowser_HlinkFrame_Init(WebBrowser*);
diff --git a/dll/win32/shdocvw/shdocvw.inf b/dll/win32/shdocvw/shdocvw.inf
index 932c9beaf25..f08759c5a93 100644
--- a/dll/win32/shdocvw/shdocvw.inf
+++ b/dll/win32/shdocvw/shdocvw.inf
@@ -149,9 +149,9 @@ HKLM,"Software\Microsoft\Windows\CurrentVersion\App Paths\iexplore.exe","Path",,
[IE.Reg]
-HKLM,"Software\Microsoft\Internet Explorer","Build",,"62900.2180"
-HKLM,"Software\Microsoft\Internet Explorer","IVer",,"103"
-HKLM,"Software\Microsoft\Internet Explorer","Version",,"6.0.2900.2180"
+HKLM,"Software\Microsoft\Internet Explorer","Build",,"86001"
+HKLM,"Software\Microsoft\Internet Explorer","Version",,"8.0.6001.18702"
+HKLM,"Software\Microsoft\Internet Explorer","W2kVersion",,"8.0.6001.18702"
[Strings]
diff --git a/dll/win32/shdocvw/shdocvw.spec b/dll/win32/shdocvw/shdocvw.spec
index aa5ef512b3c..4a0dd2c678a 100644
--- a/dll/win32/shdocvw/shdocvw.spec
+++ b/dll/win32/shdocvw/shdocvw.spec
@@ -40,7 +40,7 @@
151 stdcall -noname URLSubRegQueryA(str str long ptr long long)
152 stub -noname CShellUIHelper_CreateInstance2
153 stub -noname IsURLChild
-158 stub -noname SHRestricted2A
+158 stdcall -noname SHRestricted2A(long str long)
159 stdcall -noname SHRestricted2W(long wstr long)
160 stub -noname SHIsRestricted2W
161 stub @ # CSearchAssistantOC::OnDraw
diff --git a/dll/win32/shdocvw/shdocvw_main.c b/dll/win32/shdocvw/shdocvw_main.c
index 746753f0ab2..5dfd2b99ddf 100644
--- a/dll/win32/shdocvw/shdocvw_main.c
+++ b/dll/win32/shdocvw/shdocvw_main.c
@@ -440,3 +440,24 @@ DWORD WINAPI SHRestricted2W(DWORD res, LPCWSTR url, DWORD reserved)
FIXME("(%d %s %d) stub\n", res, debugstr_w(url), reserved);
return 0;
}
+
+/******************************************************************
+ * SHRestricted2A (SHDOCVW.158)
+ *
+ * See SHRestricted2W
+ */
+DWORD WINAPI SHRestricted2A(DWORD restriction, LPCSTR url, DWORD reserved)
+{
+ LPWSTR urlW = NULL;
+ DWORD res;
+
+ TRACE("(%d, %s, %d)\n", restriction, debugstr_a(url), reserved);
+ if (url) {
+ DWORD len = MultiByteToWideChar(CP_ACP, 0, url, -1, NULL, 0);
+ urlW = heap_alloc(len * sizeof(WCHAR));
+ MultiByteToWideChar(CP_ACP, 0, url, -1, urlW, len);
+ }
+ res = SHRestricted2W(restriction, urlW, reserved);
+ heap_free(urlW);
+ return res;
+}
diff --git a/dll/win32/shdocvw/view.c b/dll/win32/shdocvw/view.c
index d2e58579cb6..9ee7c067333 100644
--- a/dll/win32/shdocvw/view.c
+++ b/dll/win32/shdocvw/view.c
@@ -1,5 +1,6 @@
/*
* Copyright 2005 Jacek Caban
+ * Copyright 2010 Ilya Shpigor
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,6 +22,10 @@
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
+/**********************************************************************
+ * Implement the IViewObject interface
+ */
+
#define VIEWOBJ_THIS(iface) DEFINE_THIS(WebBrowser, ViewObject, iface)
static HRESULT WINAPI ViewObject_QueryInterface(IViewObject2 *iface, REFIID riid, void **ppv)
@@ -122,3 +127,112 @@ void WebBrowser_ViewObject_Init(WebBrowser *This)
{
This->lpViewObjectVtbl = &ViewObjectVtbl;
}
+
+/**********************************************************************
+ * Implement the IDataObject interface
+ */
+
+#define DATAOBJ_THIS(iface) DEFINE_THIS(WebBrowser, DataObject, iface)
+
+static HRESULT WINAPI DataObject_QueryInterface(LPDATAOBJECT iface, REFIID riid, LPVOID * ppvObj)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ return IWebBrowser2_QueryInterface(WEBBROWSER(This), riid, ppvObj);
+}
+
+static ULONG WINAPI DataObject_AddRef(LPDATAOBJECT iface)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ return IWebBrowser2_AddRef(WEBBROWSER(This));
+}
+
+static ULONG WINAPI DataObject_Release(LPDATAOBJECT iface)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ return IWebBrowser2_Release(WEBBROWSER(This));
+}
+
+static HRESULT WINAPI DataObject_GetData(LPDATAOBJECT iface, LPFORMATETC pformatetcIn, STGMEDIUM *pmedium)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_GetDataHere(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_QueryGetData(LPDATAOBJECT iface, LPFORMATETC pformatetc)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_GetCanonicalFormatEtc(LPDATAOBJECT iface, LPFORMATETC pformatectIn, LPFORMATETC pformatetcOut)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_SetData(LPDATAOBJECT iface, LPFORMATETC pformatetc, STGMEDIUM *pmedium, BOOL fRelease)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_EnumFormatEtc(LPDATAOBJECT iface, DWORD dwDirection, IEnumFORMATETC **ppenumFormatEtc)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_DAdvise(LPDATAOBJECT iface, FORMATETC *pformatetc, DWORD advf, IAdviseSink *pAdvSink, DWORD *pdwConnection)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_DUnadvise(LPDATAOBJECT iface, DWORD dwConnection)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI DataObject_EnumDAdvise(LPDATAOBJECT iface, IEnumSTATDATA **ppenumAdvise)
+{
+ WebBrowser *This = DATAOBJ_THIS(iface);
+ FIXME("(%p)->()\n", This);
+ return E_NOTIMPL;
+}
+
+static const IDataObjectVtbl DataObjectVtbl = {
+ DataObject_QueryInterface,
+ DataObject_AddRef,
+ DataObject_Release,
+ DataObject_GetData,
+ DataObject_GetDataHere,
+ DataObject_QueryGetData,
+ DataObject_GetCanonicalFormatEtc,
+ DataObject_SetData,
+ DataObject_EnumFormatEtc,
+ DataObject_DAdvise,
+ DataObject_DUnadvise,
+ DataObject_EnumDAdvise
+};
+
+#undef DATAOBJ_THIS
+
+void WebBrowser_DataObject_Init(WebBrowser *This)
+{
+ This->lpDataObjectVtbl = &DataObjectVtbl;
+}
diff --git a/dll/win32/shdocvw/webbrowser.c b/dll/win32/shdocvw/webbrowser.c
index 2ac9b9985d5..0c26a83b55e 100644
--- a/dll/win32/shdocvw/webbrowser.c
+++ b/dll/win32/shdocvw/webbrowser.c
@@ -102,9 +102,15 @@ static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid
}else if(IsEqualGUID(&IID_IHlinkFrame, riid)) {
TRACE("(%p)->(IID_IHlinkFrame %p)\n", This, ppv);
*ppv = HLINKFRAME(This);
+ }else if(IsEqualGUID(&IID_ITargetFrame2, riid)) {
+ TRACE("(%p)->(IID_ITargetFrame2 %p)\n", This, ppv);
+ *ppv = TARGETFRAME2(This);
}else if(IsEqualGUID(&IID_IServiceProvider, riid)) {
*ppv = SERVPROV(This);
TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv);
+ }else if(IsEqualGUID(&IID_IDataObject, riid)) {
+ *ppv = DATAOBJECT(This);
+ TRACE("(%p)->(IID_IDataObject %p)\n", This, ppv);
}else if(IsEqualGUID(&IID_IQuickActivate, riid)) {
TRACE("(%p)->(IID_IQuickActivate %p) returning NULL\n", This, ppv);
return E_NOINTERFACE;
@@ -1132,6 +1138,7 @@ static HRESULT WebBrowser_Create(INT version, IUnknown *pOuter, REFIID riid, voi
WebBrowser_OleObject_Init(ret);
WebBrowser_ViewObject_Init(ret);
+ WebBrowser_DataObject_Init(ret);
WebBrowser_Persist_Init(ret);
WebBrowser_ClassInfo_Init(ret);
WebBrowser_HlinkFrame_Init(ret);
diff --git a/dll/win32/shlwapi/ordinal.c b/dll/win32/shlwapi/ordinal.c
index 332bdb67f79..22851d92010 100644
--- a/dll/win32/shlwapi/ordinal.c
+++ b/dll/win32/shlwapi/ordinal.c
@@ -484,7 +484,6 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
DWORD mystrlen, mytype;
DWORD len;
HKEY mykey;
- HRESULT retval;
LCID mylcid;
WCHAR *mystr;
LONG lres;
@@ -512,7 +511,7 @@ HRESULT WINAPI GetAcceptLanguagesW( LPWSTR langbuf, LPDWORD buflen)
/* Did not find a value in the registry or the user buffer is too small */
mylcid = GetUserDefaultLCID();
- retval = LcidToRfc1766W(mylcid, mystr, mystrlen);
+ LcidToRfc1766W(mylcid, mystr, mystrlen);
len = lstrlenW(mystr);
memcpy( langbuf, mystr, min(*buflen, len+1)*sizeof(WCHAR) );
diff --git a/dll/win32/shlwapi/reg.c b/dll/win32/shlwapi/reg.c
index d641955ba05..09fce55cb3f 100644
--- a/dll/win32/shlwapi/reg.c
+++ b/dll/win32/shlwapi/reg.c
@@ -331,8 +331,25 @@ LONG WINAPI SHRegEnumUSValueA(HUSKEY hUSKey, DWORD dwIndex, LPSTR pszValueName,
LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData,
LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags)
{
- FIXME("(%p, 0x%08x, %s, %p, %p, %p, %p, 0x%08x) stub\n", hUSKey, dwIndex,
- debugstr_a(pszValueName), pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+ HKEY dokey;
+
+ TRACE("(%p, 0x%08x, %p, %p, %p, %p, %p, 0x%08x)\n", hUSKey, dwIndex,
+ pszValueName, pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+
+ if (((enumRegFlags == SHREGENUM_HKCU) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
+ return RegEnumValueA(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+
+ if (((enumRegFlags == SHREGENUM_HKLM) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
+ return RegEnumValueA(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+ FIXME("no support for SHREGENUM_BOTH\n");
return ERROR_INVALID_FUNCTION;
}
@@ -345,8 +362,25 @@ LONG WINAPI SHRegEnumUSValueW(HUSKEY hUSKey, DWORD dwIndex, LPWSTR pszValueName,
LPDWORD pcchValueNameLen, LPDWORD pdwType, LPVOID pvData,
LPDWORD pcbData, SHREGENUM_FLAGS enumRegFlags)
{
- FIXME("(%p, 0x%08x, %s, %p, %p, %p, %p, 0x%08x) stub\n", hUSKey, dwIndex,
- debugstr_w(pszValueName), pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+ HKEY dokey;
+
+ TRACE("(%p, 0x%08x, %p, %p, %p, %p, %p, 0x%08x)\n", hUSKey, dwIndex,
+ pszValueName, pcchValueNameLen, pdwType, pvData, pcbData, enumRegFlags);
+
+ if (((enumRegFlags == SHREGENUM_HKCU) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKCU))) {
+ return RegEnumValueW(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+
+ if (((enumRegFlags == SHREGENUM_HKLM) ||
+ (enumRegFlags == SHREGENUM_DEFAULT)) &&
+ (dokey = REG_GetHKEYFromHUSKEY(hUSKey,REG_HKLM))) {
+ return RegEnumValueW(dokey, dwIndex, pszValueName, pcchValueNameLen,
+ NULL, pdwType, pvData, pcbData);
+ }
+ FIXME("no support for SHREGENUM_BOTH\n");
return ERROR_INVALID_FUNCTION;
}
diff --git a/dll/win32/shlwapi/shlwapi.spec b/dll/win32/shlwapi/shlwapi.spec
index 367046b5ebc..268a2e20145 100644
--- a/dll/win32/shlwapi/shlwapi.spec
+++ b/dll/win32/shlwapi/shlwapi.spec
@@ -683,6 +683,7 @@
@ stdcall SHCreateStreamOnFileEx(wstr long long long ptr ptr)
@ stdcall SHCreateStreamOnFileW(wstr long ptr)
@ stdcall SHCreateStreamWrapper(ptr ptr long ptr)
+@ stdcall SHCreateThreadRef(ptr ptr)
@ stdcall SHDeleteEmptyKeyA(long ptr)
@ stdcall SHDeleteEmptyKeyW(long ptr)
@ stdcall SHDeleteKeyA(long str)
diff --git a/dll/win32/shlwapi/string.c b/dll/win32/shlwapi/string.c
index e00a92582e0..a0269b6cb37 100644
--- a/dll/win32/shlwapi/string.c
+++ b/dll/win32/shlwapi/string.c
@@ -1415,7 +1415,7 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest,
break;
case STRRET_CSTR:
- if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ) && len)
+ if (!MultiByteToWideChar( CP_ACP, 0, src->u.cStr, -1, dest, len ))
dest[len-1] = 0;
break;
@@ -1423,7 +1423,7 @@ HRESULT WINAPI StrRetToBufW (LPSTRRET src, const ITEMIDLIST *pidl, LPWSTR dest,
if (pidl)
{
if (!MultiByteToWideChar( CP_ACP, 0, ((LPCSTR)&pidl->mkid)+src->u.uOffset, -1,
- dest, len ) && len)
+ dest, len ))
dest[len-1] = 0;
}
break;
diff --git a/dll/win32/shlwapi/thread.c b/dll/win32/shlwapi/thread.c
index cfe6615cd69..00d26f78eb7 100644
--- a/dll/win32/shlwapi/thread.c
+++ b/dll/win32/shlwapi/thread.c
@@ -120,6 +120,93 @@ typedef struct tagSHLWAPI_THREAD_INFO
IUnknown *refIE; /* Reference to the IE process */
} SHLWAPI_THREAD_INFO, *LPSHLWAPI_THREAD_INFO;
+typedef struct
+{
+ const IUnknownVtbl* lpVtbl;
+ LONG *ref;
+} threadref;
+
+static HRESULT WINAPI threadref_QueryInterface(IUnknown *iface, REFIID riid, LPVOID *ppvObj)
+{
+ threadref * This = (threadref *)iface;
+
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppvObj);
+
+ if (ppvObj == NULL)
+ return E_POINTER;
+
+ if (IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppvObj);
+ *ppvObj = This;
+ IUnknown_AddRef((IUnknown*)*ppvObj);
+ return S_OK;
+ }
+
+ *ppvObj = NULL;
+ FIXME("(%p, %s, %p) interface not supported\n", This, debugstr_guid(riid), ppvObj);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI threadref_AddRef(IUnknown *iface)
+{
+ threadref * This = (threadref *)iface;
+
+ TRACE("(%p)\n", This);
+ return InterlockedIncrement(This->ref);
+}
+
+static ULONG WINAPI threadref_Release(IUnknown *iface)
+{
+ LONG refcount;
+ threadref * This = (threadref *)iface;
+
+ TRACE("(%p)\n", This);
+
+ refcount = InterlockedDecrement(This->ref);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return refcount;
+}
+
+/* VTable */
+static const IUnknownVtbl threadref_vt =
+{
+ threadref_QueryInterface,
+ threadref_AddRef,
+ threadref_Release,
+};
+
+/*************************************************************************
+ * SHCreateThreadRef [SHLWAPI.@]
+ *
+ * Create a per-thread IUnknown object
+ *
+ * PARAMS
+ * lprefcount [I] Pointer to a LONG to be used as refcount
+ * lppUnknown [O] Destination to receive the created object reference
+ *
+ * RETURNS
+ * Success: S_OK. lppUnknown is set to the object reference.
+ * Failure: E_INVALIDARG, if a parameter is NULL
+ */
+HRESULT WINAPI SHCreateThreadRef(LONG *lprefcount, IUnknown **lppUnknown)
+{
+ threadref * This;
+ TRACE("(%p, %p)\n", lprefcount, lppUnknown);
+
+ if (!lprefcount || !lppUnknown)
+ return E_INVALIDARG;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(threadref));
+ This->lpVtbl = &threadref_vt;
+ This->ref = lprefcount;
+
+ *lprefcount = 1;
+ *lppUnknown = (IUnknown *) This;
+ TRACE("=> returning S_OK with %p\n", This);
+ return S_OK;
+}
/*************************************************************************
* SHGetThreadRef [SHLWAPI.@]
@@ -131,13 +218,13 @@ typedef struct tagSHLWAPI_THREAD_INFO
*
* RETURNS
* Success: S_OK. lppUnknown is set to the object reference.
- * Failure: E_NOINTERFACE, if an error occurs or lppUnknown is NULL.
+ * Failure: E_NOINTERFACE, if an error occurs or no object is set
*/
HRESULT WINAPI SHGetThreadRef(IUnknown **lppUnknown)
{
TRACE("(%p)\n", lppUnknown);
- if (!lppUnknown || SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
+ if (SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
return E_NOINTERFACE;
*lppUnknown = TlsGetValue(SHLWAPI_ThreadRef_index);
@@ -159,13 +246,13 @@ HRESULT WINAPI SHGetThreadRef(IUnknown **lppUnknown)
*
* RETURNS
* Success: S_OK. lpUnknown is stored and can be retrieved by SHGetThreadRef()
- * Failure: E_NOINTERFACE, if an error occurs or lpUnknown is NULL.
+ * Failure: E_NOINTERFACE, if an error occurs
*/
HRESULT WINAPI SHSetThreadRef(IUnknown *lpUnknown)
{
TRACE("(%p)\n", lpUnknown);
- if (!lpUnknown || SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
+ if (SHLWAPI_ThreadRef_index == TLS_OUT_OF_INDEXES)
return E_NOINTERFACE;
TlsSetValue(SHLWAPI_ThreadRef_index, lpUnknown);
diff --git a/dll/win32/shlwapi/url.c b/dll/win32/shlwapi/url.c
index cd83b457178..ad7d989a4bb 100644
--- a/dll/win32/shlwapi/url.c
+++ b/dll/win32/shlwapi/url.c
@@ -232,40 +232,34 @@ HRESULT WINAPI ParseURLW(LPCWSTR x, PARSEDURLW *y)
HRESULT WINAPI UrlCanonicalizeA(LPCSTR pszUrl, LPSTR pszCanonicalized,
LPDWORD pcchCanonicalized, DWORD dwFlags)
{
- LPWSTR base, canonical;
+ LPWSTR url, canonical;
HRESULT ret;
- DWORD len, len2;
+ DWORD len;
TRACE("(%s, %p, %p, 0x%08x) *pcchCanonicalized: %d\n", debugstr_a(pszUrl), pszCanonicalized,
pcchCanonicalized, dwFlags, pcchCanonicalized ? *pcchCanonicalized : -1);
- if(!pszUrl || !pszCanonicalized || !pcchCanonicalized)
+ if(!pszUrl || !pszCanonicalized || !pcchCanonicalized || !*pcchCanonicalized)
return E_INVALIDARG;
- base = HeapAlloc(GetProcessHeap(), 0,
- (2*INTERNET_MAX_URL_LENGTH) * sizeof(WCHAR));
- canonical = base + INTERNET_MAX_URL_LENGTH;
-
- MultiByteToWideChar(0, 0, pszUrl, -1, base, INTERNET_MAX_URL_LENGTH);
- len = INTERNET_MAX_URL_LENGTH;
-
- ret = UrlCanonicalizeW(base, canonical, &len, dwFlags);
- if (ret != S_OK) {
- *pcchCanonicalized = len * 2;
- HeapFree(GetProcessHeap(), 0, base);
- return ret;
+ len = strlen(pszUrl)+1;
+ url = HeapAlloc(GetProcessHeap(), 0, len*sizeof(WCHAR));
+ canonical = HeapAlloc(GetProcessHeap(), 0, *pcchCanonicalized*sizeof(WCHAR));
+ if(!url || !canonical) {
+ HeapFree(GetProcessHeap(), 0, url);
+ HeapFree(GetProcessHeap(), 0, canonical);
+ return E_OUTOFMEMORY;
}
- len2 = WideCharToMultiByte(0, 0, canonical, -1, 0, 0, 0, 0);
- if (len2 > *pcchCanonicalized) {
- *pcchCanonicalized = len2;
- HeapFree(GetProcessHeap(), 0, base);
- return E_POINTER;
- }
- WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized, *pcchCanonicalized, 0, 0);
- *pcchCanonicalized = len;
- HeapFree(GetProcessHeap(), 0, base);
- return S_OK;
+ MultiByteToWideChar(0, 0, pszUrl, -1, url, len);
+
+ ret = UrlCanonicalizeW(url, canonical, pcchCanonicalized, dwFlags);
+ if(ret == S_OK)
+ WideCharToMultiByte(0, 0, canonical, -1, pszCanonicalized,
+ *pcchCanonicalized+1, 0, 0);
+
+ HeapFree(GetProcessHeap(), 0, canonical);
+ return ret;
}
/*************************************************************************
@@ -287,11 +281,12 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
static const WCHAR wszFile[] = {'f','i','l','e',':'};
static const WCHAR wszRes[] = {'r','e','s',':'};
static const WCHAR wszLocalhost[] = {'l','o','c','a','l','h','o','s','t'};
+ static const WCHAR wszFilePrefix[] = {'f','i','l','e',':','/','/','/'};
TRACE("(%s, %p, %p, 0x%08x) *pcchCanonicalized: %d\n", debugstr_w(pszUrl), pszCanonicalized,
pcchCanonicalized, dwFlags, pcchCanonicalized ? *pcchCanonicalized : -1);
- if(!pszUrl || !pszCanonicalized || !pcchCanonicalized)
+ if(!pszUrl || !pszCanonicalized || !pcchCanonicalized || !*pcchCanonicalized)
return E_INVALIDARG;
if(!*pszUrl) {
@@ -300,8 +295,9 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
}
nByteLen = (strlenW(pszUrl) + 1) * sizeof(WCHAR); /* length in bytes */
+ /* Allocate memory for simplified URL (before escaping) */
lpszUrlCpy = HeapAlloc(GetProcessHeap(), 0,
- INTERNET_MAX_URL_LENGTH * sizeof(WCHAR));
+ nByteLen+sizeof(wszFilePrefix)+sizeof(WCHAR));
if((dwFlags & URL_FILE_USE_PATHURL) && nByteLen >= sizeof(wszFile)
&& !memcmp(wszFile, pszUrl, sizeof(wszFile)))
@@ -328,8 +324,6 @@ HRESULT WINAPI UrlCanonicalizeW(LPCWSTR pszUrl, LPWSTR pszCanonicalized,
state = 0;
if(pszUrl[1] == ':') { /* Assume path */
- static const WCHAR wszFilePrefix[] = {'f','i','l','e',':','/','/','/'};
-
memcpy(wk2, wszFilePrefix, sizeof(wszFilePrefix));
wk2 += sizeof(wszFilePrefix)/sizeof(WCHAR);
if (dwFlags & URL_FILE_USE_PATHURL)
@@ -833,6 +827,8 @@ HRESULT WINAPI UrlCombineW(LPCWSTR pszBase, LPCWSTR pszRelative,
if (ret == S_OK) {
/* Reuse mrelative as temp storage as its already allocated and not needed anymore */
+ if(*pcchCombined == 0)
+ *pcchCombined = 1;
ret = UrlCanonicalizeW(preliminary, mrelative, pcchCombined, (dwFlags & ~URL_FILE_USE_PATHURL));
if(SUCCEEDED(ret) && pszCombined) {
lstrcpyW(pszCombined, mrelative);
diff --git a/dll/win32/urlmon/binding.c b/dll/win32/urlmon/binding.c
index dcf0207278c..e0f3624ff6b 100644
--- a/dll/win32/urlmon/binding.c
+++ b/dll/win32/urlmon/binding.c
@@ -47,6 +47,7 @@ typedef struct {
BYTE buf[1024*8];
DWORD size;
BOOL init;
+ HANDLE file;
HRESULT hres;
LPWSTR cache_file;
@@ -57,7 +58,7 @@ typedef struct _stgmed_obj_t stgmed_obj_t;
typedef struct {
void (*release)(stgmed_obj_t*);
HRESULT (*fill_stgmed)(stgmed_obj_t*,STGMEDIUM*);
- void *(*get_result)(stgmed_obj_t*);
+ HRESULT (*get_result)(stgmed_obj_t*,DWORD,void**);
} stgmed_obj_vtbl;
struct _stgmed_obj_t {
@@ -101,6 +102,7 @@ struct Binding {
LPWSTR redirect_url;
IID iid;
BOOL report_mime;
+ BOOL use_cache_file;
DWORD state;
HRESULT hres;
download_state_t download_state;
@@ -134,6 +136,20 @@ static void fill_stgmed_buffer(stgmed_buf_t *buf)
buf->init = TRUE;
}
+static void read_protocol_data(stgmed_buf_t *stgmed_buf)
+{
+ BYTE buf[8192];
+ DWORD read;
+ HRESULT hres;
+
+ fill_stgmed_buffer(stgmed_buf);
+ if(stgmed_buf->size < sizeof(stgmed_buf->buf))
+ return;
+
+ do hres = IInternetProtocol_Read(stgmed_buf->protocol, buf, sizeof(buf), &read);
+ while(hres == S_OK);
+}
+
static void dump_BINDINFO(BINDINFO *bi)
{
static const char * const BINDINFOF_str[] = {
@@ -339,6 +355,19 @@ static void create_object(Binding *binding)
IInternetProtocol_Terminate(binding->protocol, 0);
}
+static void cache_file_available(Binding *This, const WCHAR *file_name)
+{
+ heap_free(This->stgmed_buf->cache_file);
+ This->stgmed_buf->cache_file = heap_strdupW(file_name);
+
+ if(This->use_cache_file) {
+ This->stgmed_buf->file = CreateFileW(file_name, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ if(This->stgmed_buf->file == INVALID_HANDLE_VALUE)
+ WARN("CreateFile failed: %u\n", GetLastError());
+ }
+}
+
#define STGMEDUNK_THIS(iface) DEFINE_THIS(stgmed_buf_t, Unknown, iface)
static HRESULT WINAPI StgMedUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
@@ -377,6 +406,8 @@ static ULONG WINAPI StgMedUnk_Release(IUnknown *iface)
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
+ if(This->file != INVALID_HANDLE_VALUE)
+ CloseHandle(This->file);
IInternetProtocol_Release(This->protocol);
heap_free(This->cache_file);
heap_free(This);
@@ -403,6 +434,7 @@ static stgmed_buf_t *create_stgmed_buf(IInternetProtocol *protocol)
ret->ref = 1;
ret->size = 0;
ret->init = FALSE;
+ ret->file = INVALID_HANDLE_VALUE;
ret->hres = S_OK;
ret->cache_file = NULL;
@@ -488,6 +520,15 @@ static HRESULT WINAPI ProtocolStream_Read(IStream *iface, void *pv,
TRACE("(%p)->(%p %d %p)\n", This, pv, cb, pcbRead);
+ if(This->buf->file != INVALID_HANDLE_VALUE) {
+ if (!ReadFile(This->buf->file, pv, cb, &read, NULL))
+ return INET_E_DOWNLOAD_FAILURE;
+
+ if(pcbRead)
+ *pcbRead = read;
+ return read ? S_OK : S_FALSE;
+ }
+
if(This->buf->size) {
read = cb;
@@ -637,12 +678,13 @@ static HRESULT stgmed_stream_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
return S_OK;
}
-static void *stgmed_stream_get_result(stgmed_obj_t *obj)
+static HRESULT stgmed_stream_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
{
ProtocolStream *stream = (ProtocolStream*)obj;
IStream_AddRef(STREAM(stream));
- return STREAM(stream);
+ *result = STREAM(stream);
+ return S_OK;
}
static const stgmed_obj_vtbl stgmed_stream_vtbl = {
@@ -689,16 +731,7 @@ static HRESULT stgmed_file_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
return INET_E_DATA_NOT_AVAILABLE;
}
- fill_stgmed_buffer(file_obj->buf);
- if(file_obj->buf->size == sizeof(file_obj->buf->buf)) {
- BYTE buf[1024];
- DWORD read;
- HRESULT hres;
-
- do {
- hres = IInternetProtocol_Read(file_obj->buf->protocol, buf, sizeof(buf), &read);
- }while(hres == S_OK);
- }
+ read_protocol_data(file_obj->buf);
stgmed->tymed = TYMED_FILE;
stgmed->u.lpszFileName = file_obj->buf->cache_file;
@@ -707,9 +740,9 @@ static HRESULT stgmed_file_fill_stgmed(stgmed_obj_t *obj, STGMEDIUM *stgmed)
return S_OK;
}
-static void *stgmed_file_get_result(stgmed_obj_t *obj)
+static HRESULT stgmed_file_get_result(stgmed_obj_t *obj, DWORD bindf, void **result)
{
- return NULL;
+ return bindf & BINDF_ASYNCHRONOUS ? MK_S_ASYNCHRONOUS : S_OK;
}
static const stgmed_obj_vtbl stgmed_file_vtbl = {
@@ -987,8 +1020,7 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink
mime_available(This, szStatusText);
break;
case BINDSTATUS_CACHEFILENAMEAVAILABLE:
- heap_free(This->stgmed_buf->cache_file);
- This->stgmed_buf->cache_file = heap_strdupW(szStatusText);
+ cache_file_available(This, szStatusText);
break;
case BINDSTATUS_DECODING:
IBindStatusCallback_OnProgress(This->callback, 0, 0, BINDSTATUS_DECODING, szStatusText);
@@ -1019,9 +1051,12 @@ static void report_data(Binding *This, DWORD bscf, ULONG progress, ULONG progres
if(This->download_state == END_DOWNLOAD || (This->state & BINDING_STOPPED))
return;
- if(This->download_state == BEFORE_DOWNLOAD) {
+ if(This->stgmed_buf->file != INVALID_HANDLE_VALUE)
+ read_protocol_data(This->stgmed_buf);
+ else if(This->download_state == BEFORE_DOWNLOAD)
fill_stgmed_buffer(This->stgmed_buf);
+ if(This->download_state == BEFORE_DOWNLOAD) {
This->download_state = DOWNLOADING;
sent_begindownloaddata = TRUE;
IBindStatusCallback_OnProgress(This->callback, progress, progress_max,
@@ -1430,8 +1465,12 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url,
if(to_obj)
ret->bindinfo.dwOptions |= 0x100000;
- if(!is_urlmon_protocol(url))
+ if(!(ret->bindf & BINDF_ASYNCHRONOUS)) {
ret->bindf |= BINDF_NEEDFILE;
+ ret->use_cache_file = TRUE;
+ }else if(!is_urlmon_protocol(url)) {
+ ret->bindf |= BINDF_NEEDFILE;
+ }
ret->url = heap_strdupW(url);
@@ -1530,12 +1569,14 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
if((binding->state & BINDING_STOPPED) && (binding->state & BINDING_LOCKED))
IInternetProtocol_UnlockRequest(binding->protocol);
- *ppv = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj);
+ hres = binding->stgmed_obj->vtbl->get_result(binding->stgmed_obj, binding->bindf, ppv);
+ }else {
+ hres = MK_S_ASYNCHRONOUS;
}
IBinding_Release(BINDING(binding));
- return *ppv ? S_OK : MK_S_ASYNCHRONOUS;
+ return hres;
}
HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
diff --git a/dll/win32/urlmon/file.c b/dll/win32/urlmon/file.c
index ed4802b8a3b..a517d949222 100644
--- a/dll/win32/urlmon/file.c
+++ b/dll/win32/urlmon/file.c
@@ -141,7 +141,10 @@ static HRESULT WINAPI FileProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl
IInternetProtocolSink_ReportProgress(pOIProtSink, BINDSTATUS_SENDINGREQUEST, &null_char);
file_name = url+sizeof(wszFile)/sizeof(WCHAR);
- if(file_name[0] == '/' && file_name[1] == '/')
+
+ /* Strip both forward and back slashes */
+ if( (file_name[0] == '/' && file_name[1] == '/') ||
+ (file_name[0] == '\\' && file_name[1] == '\\'))
file_name += 2;
if(*file_name == '/')
file_name++;
diff --git a/dll/win32/urlmon/umon.c b/dll/win32/urlmon/umon.c
index 5e6a8f6c21f..7ce22cc6de8 100644
--- a/dll/win32/urlmon/umon.c
+++ b/dll/win32/urlmon/umon.c
@@ -513,6 +513,12 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker
TRACE("(%p, %s, %p, %08x)\n", pmkContext, debugstr_w(szURL), ppmk, dwFlags);
+ if (ppmk)
+ *ppmk = NULL;
+
+ if (!szURL || !ppmk)
+ return E_INVALIDARG;
+
if (dwFlags & URL_MK_UNIFORM) FIXME("ignoring flag URL_MK_UNIFORM\n");
if(!(obj = alloc_moniker()))
@@ -619,6 +625,9 @@ HRESULT WINAPI MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG
{
TRACE("(%p %s %p %p)\n", pbc, debugstr_w(szDisplayName), pchEaten, ppmk);
+ if (!pbc || !szDisplayName || !*szDisplayName || !pchEaten || !ppmk)
+ return E_INVALIDARG;
+
if(is_registered_protocol(szDisplayName)) {
HRESULT hres;
diff --git a/dll/win32/urlmon/uri.c b/dll/win32/urlmon/uri.c
index 668aa9b7109..27b0863c2cb 100644
--- a/dll/win32/urlmon/uri.c
+++ b/dll/win32/urlmon/uri.c
@@ -1,5 +1,6 @@
/*
* Copyright 2010 Jacek Caban for CodeWeavers
+ * Copyright 2010 Thomas Mullaly
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -97,6 +98,20 @@ static HRESULT WINAPI Uri_GetPropertyDWORD(IUri *iface, Uri_PROPERTY uriProp, DW
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%d %p %x)\n", This, uriProp, pcchProperty, dwFlags);
+
+ if(!pcchProperty)
+ return E_INVALIDARG;
+
+ /* Microsoft's implementation for the ZONE property of a URI seems to be lacking...
+ * From what I can tell, instead of checking which URLZONE the URI belongs to it
+ * simply assigns URLZONE_INVALID and returns E_NOTIMPL. This also applies to the GetZone
+ * function.
+ */
+ if(uriProp == Uri_PROPERTY_ZONE) {
+ *pcchProperty = URLZONE_INVALID;
+ return E_NOTIMPL;
+ }
+
return E_NOTIMPL;
}
@@ -111,6 +126,10 @@ static HRESULT WINAPI Uri_GetAbsoluteUri(IUri *iface, BSTR *pstrAbsoluteUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrAbsoluteUri);
+
+ if(!pstrAbsoluteUri)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -118,6 +137,10 @@ static HRESULT WINAPI Uri_GetAuthority(IUri *iface, BSTR *pstrAuthority)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrAuthority);
+
+ if(!pstrAuthority)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -125,6 +148,10 @@ static HRESULT WINAPI Uri_GetDisplayUri(IUri *iface, BSTR *pstrDisplayUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrDisplayUri);
+
+ if(!pstrDisplayUri)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -132,6 +159,10 @@ static HRESULT WINAPI Uri_GetDomain(IUri *iface, BSTR *pstrDomain)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrDomain);
+
+ if(!pstrDomain)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -139,6 +170,10 @@ static HRESULT WINAPI Uri_GetExtension(IUri *iface, BSTR *pstrExtension)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrExtension);
+
+ if(!pstrExtension)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -146,6 +181,10 @@ static HRESULT WINAPI Uri_GetFragment(IUri *iface, BSTR *pstrFragment)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrFragment);
+
+ if(!pstrFragment)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -160,6 +199,10 @@ static HRESULT WINAPI Uri_GetPassword(IUri *iface, BSTR *pstrPassword)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPassword);
+
+ if(!pstrPassword)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -167,6 +210,10 @@ static HRESULT WINAPI Uri_GetPath(IUri *iface, BSTR *pstrPath)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPath);
+
+ if(!pstrPath)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -174,6 +221,10 @@ static HRESULT WINAPI Uri_GetPathAndQuery(IUri *iface, BSTR *pstrPathAndQuery)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrPathAndQuery);
+
+ if(!pstrPathAndQuery)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -181,6 +232,10 @@ static HRESULT WINAPI Uri_GetQuery(IUri *iface, BSTR *pstrQuery)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrQuery);
+
+ if(!pstrQuery)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -188,6 +243,10 @@ static HRESULT WINAPI Uri_GetRawUri(IUri *iface, BSTR *pstrRawUri)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrRawUri);
+
+ if(!pstrRawUri)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -195,6 +254,10 @@ static HRESULT WINAPI Uri_GetSchemeName(IUri *iface, BSTR *pstrSchemeName)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrSchemeName);
+
+ if(!pstrSchemeName)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -202,6 +265,10 @@ static HRESULT WINAPI Uri_GetUserInfo(IUri *iface, BSTR *pstrUserInfo)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrUserInfo);
+
+ if(!pstrUserInfo)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -209,6 +276,10 @@ static HRESULT WINAPI Uri_GetUserName(IUri *iface, BSTR *pstrUserName)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pstrUserName);
+
+ if(!pstrUserName)
+ return E_POINTER;
+
return E_NOTIMPL;
}
@@ -216,6 +287,10 @@ static HRESULT WINAPI Uri_GetHostType(IUri *iface, DWORD *pdwHostType)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwHostType);
+
+ if(!pdwHostType)
+ return E_INVALIDARG;
+
return E_NOTIMPL;
}
@@ -223,6 +298,10 @@ static HRESULT WINAPI Uri_GetPort(IUri *iface, DWORD *pdwPort)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwPort);
+
+ if(!pdwPort)
+ return E_INVALIDARG;
+
return E_NOTIMPL;
}
@@ -230,6 +309,10 @@ static HRESULT WINAPI Uri_GetScheme(IUri *iface, DWORD *pdwScheme)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwScheme);
+
+ if(!pdwScheme)
+ return E_INVALIDARG;
+
return E_NOTIMPL;
}
@@ -237,6 +320,14 @@ static HRESULT WINAPI Uri_GetZone(IUri *iface, DWORD *pdwZone)
{
Uri *This = URI_THIS(iface);
FIXME("(%p)->(%p)\n", This, pdwZone);
+
+ if(!pdwZone)
+ return E_INVALIDARG;
+
+ /* Microsoft doesn't seem to have this implemented yet... See
+ * the comment in Uri_GetPropertyDWORD for more about this.
+ */
+ *pdwZone = URLZONE_INVALID;
return E_NOTIMPL;
}
@@ -296,6 +387,14 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU
TRACE("(%s %x %x %p)\n", debugstr_w(pwzURI), dwFlags, (DWORD)dwReserved, ppURI);
+ if(!ppURI)
+ return E_INVALIDARG;
+
+ if(!pwzURI) {
+ *ppURI = NULL;
+ return E_INVALIDARG;
+ }
+
ret = heap_alloc(sizeof(Uri));
if(!ret)
return E_OUTOFMEMORY;
diff --git a/dll/win32/user32/include/user32p.h b/dll/win32/user32/include/user32p.h
index 31f38a1a7db..1ab637eeea0 100644
--- a/dll/win32/user32/include/user32p.h
+++ b/dll/win32/user32/include/user32p.h
@@ -33,9 +33,6 @@
#define NtUserMsqClearWakeMask() \
NtUserCallNoParam(NOPARAM_ROUTINE_MSQCLEARWAKEMASK)
-#define NtUserAnyPopup() \
- (BOOL)NtUserCallNoParam(NOPARAM_ROUTINE_ANYPOPUP)
-
#define NtUserValidateRgn(hWnd, hRgn) \
(BOOL)NtUserCallTwoParam((DWORD_PTR)hWnd, (DWORD_PTR)hRgn, TWOPARAM_ROUTINE_VALIDATERGN)
diff --git a/dll/win32/user32/misc/misc.c b/dll/win32/user32/misc/misc.c
index 4d786c51e52..32438366a5e 100644
--- a/dll/win32/user32/misc/misc.c
+++ b/dll/win32/user32/misc/misc.c
@@ -45,13 +45,6 @@ PrivateCsrssManualGuiCheck(LONG Check)
NtUserCallOneParam(Check, ONEPARAM_ROUTINE_CSRSS_GUICHECK);
}
-VOID
-WINAPI
-PrivateCsrssInitialized(VOID)
-{
- NtUserCallNoParam(NOPARAM_ROUTINE_CSRSS_INITIALIZED);
-}
-
/*
* @implemented
diff --git a/dll/win32/user32/user32.pspec b/dll/win32/user32/user32.pspec
index 45eb26b2b64..d58fb951d1b 100644
--- a/dll/win32/user32/user32.pspec
+++ b/dll/win32/user32/user32.pspec
@@ -750,7 +750,6 @@
; ROS specific exports
@ stdcall PrivateCsrssManualGuiCheck(long)
-@ stdcall PrivateCsrssInitialized()
; Functions exported by Win Vista
@ stdcall SetProcessDPIAware()
diff --git a/dll/win32/user32/windows/class.c b/dll/win32/user32/windows/class.c
index e483a516776..9919874f0a5 100644
--- a/dll/win32/user32/windows/class.c
+++ b/dll/win32/user32/windows/class.c
@@ -423,22 +423,15 @@ GetClassLongA(HWND hWnd, int nIndex)
}
else
{
- /* This is a race condition! Call win32k to make sure we're getting
- the correct result */
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
-
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
+ Ret = 0;
}
_SEH2_END;
- if (Wnd == NULL)
- Ret = NtUserGetClassLong(hWnd, nIndex, TRUE);
-
return Ret;
}
@@ -534,22 +527,14 @@ GetClassLongW ( HWND hWnd, int nIndex )
}
else
{
- /* This is a race condition! Call win32k to make sure we're getting
- the correct result */
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
-
WARN("Invalid class for hwnd 0x%p!\n", hWnd);
}
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- Wnd = NULL; /* Make sure we call NtUserGetClassLong */
}
_SEH2_END;
- if (Wnd == NULL)
- Ret = NtUserGetClassLong(hWnd, nIndex, FALSE);
-
return Ret;
}
@@ -617,18 +602,28 @@ GetClassNameW(
WORD
WINAPI
GetClassWord(
- HWND hWnd,
- int nIndex)
-/*
- * NOTE: Obsoleted in 32-bit windows
- */
+ HWND hwnd,
+ int offset)
{
- TRACE("%p %x\n", hWnd, nIndex);
+ PWND Wnd;
+ PCLS class;
+ WORD retvalue = 0;
- if ((nIndex < 0) && (nIndex != GCW_ATOM))
+ if (offset < 0) return GetClassLongA( hwnd, offset );
+
+ Wnd = ValidateHwnd(hwnd);
+ if (!Wnd)
return 0;
- return (WORD) NtUserGetClassLong ( hWnd, nIndex, TRUE );
+ class = DesktopPtrToUser(Wnd->pcls);
+ if (class == NULL) return 0;
+
+ if (offset <= class->cbclsExtra - sizeof(WORD))
+ memcpy( &retvalue, (char *)(class + 1) + offset, sizeof(retvalue) );
+ else
+ SetLastError( ERROR_INVALID_INDEX );
+
+ return retvalue;
}
diff --git a/dll/win32/user32/windows/menu.c b/dll/win32/user32/windows/menu.c
index d5723bb3271..eed233f4947 100644
--- a/dll/win32/user32/windows/menu.c
+++ b/dll/win32/user32/windows/menu.c
@@ -1605,25 +1605,25 @@ static BOOL FASTCALL MenuShowPopup(HWND hwndOwner, HMENU hmenu, UINT id, UINT fl
if( flags & TPM_BOTTOMALIGN ) y -= height;
if( flags & TPM_VCENTERALIGN ) y -= height / 2;
- if( x + width > info.rcWork.right)
+ if( x + width > info.rcMonitor.right)
{
if( xanchor && x >= width - xanchor )
x -= width - xanchor;
- if( x + width > info.rcWork.right)
- x = info.rcWork.right - width;
+ if( x + width > info.rcMonitor.right)
+ x = info.rcMonitor.right - width;
}
- if( x < info.rcWork.left ) x = info.rcWork.left;
+ if( x < info.rcMonitor.left ) x = info.rcMonitor.left;
- if( y + height > info.rcWork.bottom)
+ if( y + height > info.rcMonitor.bottom)
{
if( yanchor && y >= height + yanchor )
y -= height + yanchor;
- if( y + height > info.rcWork.bottom)
- y = info.rcWork.bottom - height;
+ if( y + height > info.rcMonitor.bottom)
+ y = info.rcMonitor.bottom - height;
}
- if( y < info.rcWork.top ) y = info.rcWork.top;
+ if( y < info.rcMonitor.top ) y = info.rcMonitor.top;
/* NOTE: In Windows, top menu popup is not owned. */
MenuInfo.Wnd = CreateWindowExW( 0, POPUPMENU_CLASS_ATOMW, NULL,
diff --git a/dll/win32/user32/windows/message.c b/dll/win32/user32/windows/message.c
index 5631469c03c..6c849042b7a 100644
--- a/dll/win32/user32/windows/message.c
+++ b/dll/win32/user32/windows/message.c
@@ -60,6 +60,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(user32);
* content). When a ACK message is generated, the list of pair is searched for a
* matching pair, so that the client memory handle can be returned.
*/
+
typedef struct tagDDEPAIR
{
HGLOBAL ClientMem;
@@ -2214,11 +2215,16 @@ SendMessageCallbackA(
SENDASYNCPROC lpCallBack,
ULONG_PTR dwData)
{
+ CALL_BACK_INFO CallBackInfo;
+
+ CallBackInfo.CallBack = lpCallBack;
+ CallBackInfo.Context = dwData;
+
return NtUserMessageCall(hWnd,
Msg,
wParam,
lParam,
- (ULONG_PTR)&lpCallBack,
+ (ULONG_PTR)&CallBackInfo,
FNID_SENDMESSAGECALLBACK,
TRUE);
}
@@ -2236,11 +2242,17 @@ SendMessageCallbackW(
SENDASYNCPROC lpCallBack,
ULONG_PTR dwData)
{
+
+ CALL_BACK_INFO CallBackInfo;
+
+ CallBackInfo.CallBack = lpCallBack;
+ CallBackInfo.Context = dwData;
+
return NtUserMessageCall(hWnd,
Msg,
wParam,
lParam,
- (ULONG_PTR)&lpCallBack,
+ (ULONG_PTR)&CallBackInfo,
FNID_SENDMESSAGECALLBACK,
FALSE);
}
diff --git a/dll/win32/user32/windows/window.c b/dll/win32/user32/windows/window.c
index 2427cd76ee0..04533ff0aa1 100644
--- a/dll/win32/user32/windows/window.c
+++ b/dll/win32/user32/windows/window.c
@@ -29,9 +29,10 @@ User32CallSendAsyncProcForKernel(PVOID Arguments, ULONG ArgumentLength)
PSENDASYNCPROC_CALLBACK_ARGUMENTS CallbackArgs;
TRACE("User32CallSendAsyncProcKernel()\n");
+
CallbackArgs = (PSENDASYNCPROC_CALLBACK_ARGUMENTS)Arguments;
- if (ArgumentLength != sizeof(WINDOWPROC_CALLBACK_ARGUMENTS))
+ if (ArgumentLength != sizeof(SENDASYNCPROC_CALLBACK_ARGUMENTS))
{
return(STATUS_INFO_LENGTH_MISMATCH);
}
@@ -1029,16 +1030,16 @@ GetParent(HWND hWnd)
_SEH2_TRY
{
WndParent = NULL;
- if (Wnd->style & WS_CHILD)
- {
- if (Wnd->spwndParent != NULL)
- WndParent = DesktopPtrToUser(Wnd->spwndParent);
- }
- else if (Wnd->style & WS_POPUP)
+ if (Wnd->style & WS_POPUP)
{
if (Wnd->spwndOwner != NULL)
WndParent = DesktopPtrToUser(Wnd->spwndOwner);
}
+ else if (Wnd->style & WS_CHILD)
+ {
+ if (Wnd->spwndParent != NULL)
+ WndParent = DesktopPtrToUser(Wnd->spwndParent);
+ }
if (WndParent != NULL)
Ret = UserHMGetHandle(WndParent);
@@ -1463,7 +1464,7 @@ BOOL WINAPI
IsChild(HWND hWndParent,
HWND hWnd)
{
- PWND WndParent, Wnd;
+ PWND WndParent, DesktopWnd, Wnd;
BOOL Ret = FALSE;
WndParent = ValidateHwnd(hWndParent);
@@ -1473,6 +1474,10 @@ IsChild(HWND hWndParent,
if (!Wnd)
return FALSE;
+ DesktopWnd = GetThreadDesktopWnd();
+ if (!DesktopWnd)
+ return FALSE;
+
_SEH2_TRY
{
while (Wnd != NULL)
@@ -1480,6 +1485,10 @@ IsChild(HWND hWndParent,
if (Wnd->spwndParent != NULL)
{
Wnd = DesktopPtrToUser(Wnd->spwndParent);
+
+ if(Wnd == DesktopWnd)
+ Wnd = NULL;
+
if (Wnd == WndParent)
{
Ret = TRUE;
@@ -2061,7 +2070,18 @@ ScrollWindowEx(HWND hWnd,
BOOL WINAPI
AnyPopup(VOID)
{
- return NtUserAnyPopup();
+ int i;
+ BOOL retvalue;
+ HWND *list = WIN_ListChildren( GetDesktopWindow() );
+
+ if (!list) return FALSE;
+ for (i = 0; list[i]; i++)
+ {
+ if (IsWindowVisible( list[i] ) && GetWindow( list[i], GW_OWNER )) break;
+ }
+ retvalue = (list[i] != 0);
+ HeapFree( GetProcessHeap(), 0, list );
+ return retvalue;
}
/*
diff --git a/dll/win32/version/resource.c b/dll/win32/version/resource.c
index 16d9eacf83e..e793d0a2d99 100644
--- a/dll/win32/version/resource.c
+++ b/dll/win32/version/resource.c
@@ -67,9 +67,9 @@ static const IMAGE_RESOURCE_DIRECTORY *find_entry_by_id( const IMAGE_RESOURCE_DI
while (min <= max)
{
pos = (min + max) / 2;
- if (entry[pos].u1.s2.Id == id)
- return (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry[pos].u2.s3.OffsetToDirectory);
- if (entry[pos].u1.s2.Id > id) max = pos - 1;
+ if (entry[pos].u.Id == id)
+ return (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry[pos].u2.s.OffsetToDirectory);
+ if (entry[pos].u.Id > id) max = pos - 1;
else min = pos + 1;
}
return NULL;
@@ -88,7 +88,7 @@ static const IMAGE_RESOURCE_DIRECTORY *find_entry_default( const IMAGE_RESOURCE_
const IMAGE_RESOURCE_DIRECTORY_ENTRY *entry;
entry = (const IMAGE_RESOURCE_DIRECTORY_ENTRY *)(dir + 1);
- return (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry->u2.s3.OffsetToDirectory);
+ return (const IMAGE_RESOURCE_DIRECTORY *)((const char *)root + entry->u2.s.OffsetToDirectory);
}
diff --git a/dll/win32/winemp3.acm/winemp3.acm.rbuild b/dll/win32/winemp3.acm/winemp3.acm.rbuild
index fec518725e0..be4a53bc8eb 100644
--- a/dll/win32/winemp3.acm/winemp3.acm.rbuild
+++ b/dll/win32/winemp3.acm/winemp3.acm.rbuild
@@ -1,4 +1,4 @@
-
+
.
include/reactos/wine
diff --git a/dll/win32/wininet/ftp.c b/dll/win32/wininet/ftp.c
index 1f031996811..80cc6f0e60a 100644
--- a/dll/win32/wininet/ftp.c
+++ b/dll/win32/wininet/ftp.c
@@ -1176,7 +1176,7 @@ static DWORD FTPFILE_QueryOption(object_header_t *hdr, DWORD option, void *buffe
}
}
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD FTPFILE_ReadFile(object_header_t *hdr, void *buffer, DWORD size, DWORD *read)
@@ -2395,7 +2395,7 @@ static DWORD FTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *bu
return ERROR_SUCCESS;
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static const object_vtbl_t FTPSESSIONVtbl = {
@@ -3476,7 +3476,7 @@ static DWORD FTPFINDNEXT_QueryOption(object_header_t *hdr, DWORD option, void *b
return ERROR_SUCCESS;
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD FTPFINDNEXT_FindNextFileW(object_header_t *hdr, void *data)
diff --git a/dll/win32/wininet/http.c b/dll/win32/wininet/http.c
index 57b73729a10..d14a52281e7 100644
--- a/dll/win32/wininet/http.c
+++ b/dll/win32/wininet/http.c
@@ -1756,7 +1756,7 @@ static DWORD HTTPREQ_QueryOption(object_header_t *hdr, DWORD option, void *buffe
}
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD HTTPREQ_SetOption(object_header_t *hdr, DWORD option, void *buffer, DWORD size)
@@ -3464,6 +3464,10 @@ static DWORD HTTP_HttpSendRequestW(http_request_t *lpwhr, LPCWSTR lpszHeaders,
* for all the data */
HTTP_DrainContent(lpwhr);
lpwhr->dwContentRead = 0;
+ if(redirected) {
+ lpwhr->dwContentLength = ~0u;
+ lpwhr->dwBytesToWrite = 0;
+ }
if (TRACE_ON(wininet))
{
@@ -3670,7 +3674,7 @@ lend:
HTTP_ReceiveRequestData(lpwhr, TRUE);
else
{
- iar.dwResult = (DWORD_PTR)lpwhr->hdr.hInternet;
+ iar.dwResult = 0;
iar.dwError = res;
INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
@@ -4164,7 +4168,7 @@ static DWORD HTTPSESSION_QueryOption(object_header_t *hdr, DWORD option, void *b
return ERROR_SUCCESS;
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static DWORD HTTPSESSION_SetOption(object_header_t *hdr, DWORD option, void *buffer, DWORD size)
@@ -4261,11 +4265,8 @@ DWORD HTTP_Connect(appinfo_t *hIC, LPCWSTR lpszServerName,
if(hIC->lpszProxyBypass)
FIXME("Proxy bypass is ignored.\n");
}
- if (lpszServerName && lpszServerName[0])
- {
- lpwhs->lpszServerName = heap_strdupW(lpszServerName);
- lpwhs->lpszHostName = heap_strdupW(lpszServerName);
- }
+ lpwhs->lpszServerName = heap_strdupW(lpszServerName);
+ lpwhs->lpszHostName = heap_strdupW(lpszServerName);
if (lpszUserName && lpszUserName[0])
lpwhs->lpszUserName = heap_strdupW(lpszUserName);
if (lpszPassword && lpszPassword[0])
@@ -4362,6 +4363,10 @@ static DWORD HTTP_OpenConnection(http_request_t *lpwhr)
if(res != ERROR_SUCCESS)
goto lend;
+ INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
+ INTERNET_STATUS_CONNECTED_TO_SERVER,
+ szaddr, strlen(szaddr)+1);
+
if (lpwhr->hdr.dwFlags & INTERNET_FLAG_SECURE)
{
/* Note: we differ from Microsoft's WinINet here. they seem to have
@@ -4370,20 +4375,31 @@ static DWORD HTTP_OpenConnection(http_request_t *lpwhr)
* behaviour to be more correct and to not cause any incompatibilities
* because using a secure connection through a proxy server is a rare
* case that would be hard for anyone to depend on */
- if (hIC->lpszProxy && (res = HTTP_SecureProxyConnect(lpwhr)) != ERROR_SUCCESS)
+ if (hIC->lpszProxy && (res = HTTP_SecureProxyConnect(lpwhr)) != ERROR_SUCCESS) {
+ HTTPREQ_CloseConnection(&lpwhr->hdr);
goto lend;
+ }
res = NETCON_secure_connect(&lpwhr->netConnection, lpwhs->lpszHostName);
if(res != ERROR_SUCCESS)
{
WARN("Couldn't connect securely to host\n");
+
+ if((lpwhr->hdr.ErrorMask&INTERNET_ERROR_MASK_COMBINED_SEC_CERT) && (
+ res == ERROR_INTERNET_SEC_CERT_DATE_INVALID
+ || res == ERROR_INTERNET_INVALID_CA
+ || res == ERROR_INTERNET_SEC_CERT_NO_REV
+ || res == ERROR_INTERNET_SEC_CERT_REV_FAILED
+ || res == ERROR_INTERNET_SEC_CERT_REVOKED
+ || res == ERROR_INTERNET_SEC_INVALID_CERT
+ || res == ERROR_INTERNET_SEC_CERT_CN_INVALID))
+ res = ERROR_INTERNET_SEC_CERT_ERRORS;
+
+ HTTPREQ_CloseConnection(&lpwhr->hdr);
goto lend;
}
}
- INTERNET_SendCallback(&lpwhr->hdr, lpwhr->hdr.dwContext,
- INTERNET_STATUS_CONNECTED_TO_SERVER,
- szaddr, strlen(szaddr)+1);
lend:
lpwhr->read_pos = lpwhr->read_size = 0;
diff --git a/dll/win32/wininet/internet.c b/dll/win32/wininet/internet.c
index 6fc8a212c89..001736001a4 100644
--- a/dll/win32/wininet/internet.c
+++ b/dll/win32/wininet/internet.c
@@ -812,7 +812,7 @@ static DWORD APPINFO_QueryOption(object_header_t *hdr, DWORD option, void *buffe
}
}
- return INET_QueryOption(option, buffer, size, unicode);
+ return INET_QueryOption(hdr, option, buffer, size, unicode);
}
static const object_vtbl_t APPINFOVtbl = {
@@ -1447,7 +1447,7 @@ BOOL WINAPI InternetCrackUrlA(LPCSTR lpszUrl, DWORD dwUrlLength, DWORD dwFlags,
lpUrlComponents->nScheme = UCW.nScheme;
lpUrlComponents->nPort = UCW.nPort;
- TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", lpszUrl,
+ TRACE("%s: scheme(%s) host(%s) path(%s) extra(%s)\n", debugstr_a(lpszUrl),
debugstr_an(lpUrlComponents->lpszScheme, lpUrlComponents->dwSchemeLength),
debugstr_an(lpUrlComponents->lpszHostName, lpUrlComponents->dwHostNameLength),
debugstr_an(lpUrlComponents->lpszUrlPath, lpUrlComponents->dwUrlPathLength),
@@ -1860,7 +1860,7 @@ BOOL WINAPI InternetCanonicalizeUrlA(LPCSTR lpszUrl, LPSTR lpszBuffer,
DWORD dwURLFlags = URL_WININET_COMPATIBILITY | URL_ESCAPE_UNSAFE;
TRACE("(%s, %p, %p, 0x%08x) bufferlength: %d\n", debugstr_a(lpszUrl), lpszBuffer,
- lpdwBufferLength, lpdwBufferLength ? *lpdwBufferLength : -1, dwFlags);
+ lpdwBufferLength, dwFlags, lpdwBufferLength ? *lpdwBufferLength : -1);
if(dwFlags & ICU_DECODE)
{
@@ -2194,7 +2194,7 @@ BOOL WINAPI InternetReadFileExW(HINTERNET hFile, LPINTERNET_BUFFERSW lpBuffer,
return res == ERROR_SUCCESS;
}
-DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
+DWORD INET_QueryOption(object_header_t *hdr, DWORD option, void *buffer, DWORD *size, BOOL unicode)
{
static BOOL warn = TRUE;
@@ -2357,6 +2357,25 @@ DWORD INET_QueryOption(DWORD option, void *buffer, DWORD *size, BOOL unicode)
return ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
case INTERNET_OPTION_POLICY:
return ERROR_INVALID_PARAMETER;
+ case INTERNET_OPTION_CONTEXT_VALUE:
+ {
+ if (!hdr)
+ return ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
+ if (!size)
+ return ERROR_INVALID_PARAMETER;
+
+ if (*size < sizeof(DWORD_PTR))
+ {
+ *size = sizeof(DWORD_PTR);
+ return ERROR_INSUFFICIENT_BUFFER;
+ }
+ if (!buffer)
+ return ERROR_INVALID_PARAMETER;
+
+ *(DWORD_PTR *)buffer = hdr->dwContext;
+ *size = sizeof(DWORD_PTR);
+ return ERROR_SUCCESS;
+ }
}
FIXME("Stub for %d\n", option);
@@ -2388,7 +2407,7 @@ BOOL WINAPI InternetQueryOptionW(HINTERNET hInternet, DWORD dwOption,
WININET_Release(hdr);
}
}else {
- res = INET_QueryOption(dwOption, lpBuffer, lpdwBufferLength, TRUE);
+ res = INET_QueryOption(NULL, dwOption, lpBuffer, lpdwBufferLength, TRUE);
}
if(res != ERROR_SUCCESS)
@@ -2421,7 +2440,7 @@ BOOL WINAPI InternetQueryOptionA(HINTERNET hInternet, DWORD dwOption,
WININET_Release(hdr);
}
}else {
- res = INET_QueryOption(dwOption, lpBuffer, lpdwBufferLength, FALSE);
+ res = INET_QueryOption(NULL, dwOption, lpBuffer, lpdwBufferLength, FALSE);
}
if(res != ERROR_SUCCESS)
@@ -2484,8 +2503,19 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
break;
case INTERNET_OPTION_ERROR_MASK:
{
- ULONG flags = *(ULONG *)lpBuffer;
- FIXME("Option INTERNET_OPTION_ERROR_MASK(%d): STUB\n", flags);
+ if(!lpwhh) {
+ SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+ return FALSE;
+ } else if(*(ULONG*)lpBuffer & (~(INTERNET_ERROR_MASK_INSERT_CDROM|
+ INTERNET_ERROR_MASK_COMBINED_SEC_CERT|
+ INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY))) {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ ret = FALSE;
+ } else if(dwBufferLength != sizeof(ULONG)) {
+ SetLastError(ERROR_INTERNET_BAD_OPTION_LENGTH);
+ ret = FALSE;
+ } else
+ lpwhh->ErrorMask = *(ULONG*)lpBuffer;
}
break;
case INTERNET_OPTION_CODEPAGE:
@@ -2550,8 +2580,21 @@ BOOL WINAPI InternetSetOptionW(HINTERNET hInternet, DWORD dwOption,
break;
}
case INTERNET_OPTION_CONTEXT_VALUE:
- FIXME("Option INTERNET_OPTION_CONTEXT_VALUE; STUB\n");
- break;
+ {
+ if (!lpwhh)
+ {
+ SetLastError(ERROR_INTERNET_INCORRECT_HANDLE_TYPE);
+ return FALSE;
+ }
+ if (!lpBuffer || dwBufferLength != sizeof(DWORD_PTR))
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ ret = FALSE;
+ }
+ else
+ lpwhh->dwContext = *(DWORD_PTR *)lpBuffer;
+ break;
+ }
case INTERNET_OPTION_SECURITY_FLAGS:
FIXME("Option INTERNET_OPTION_SECURITY_FLAGS; STUB\n");
break;
diff --git a/dll/win32/wininet/internet.h b/dll/win32/wininet/internet.h
index 8fcc0cf3565..a531ccd752f 100644
--- a/dll/win32/wininet/internet.h
+++ b/dll/win32/wininet/internet.h
@@ -160,6 +160,7 @@ struct _object_header_t
DWORD dwFlags;
DWORD_PTR dwContext;
DWORD dwError;
+ ULONG ErrorMask;
DWORD dwInternalFlags;
LONG refs;
INTERNET_STATUS_CALLBACK lpfnStatusCB;
@@ -392,7 +393,7 @@ object_header_t *WININET_AddRef( object_header_t *info );
BOOL WININET_Release( object_header_t *info );
BOOL WININET_FreeHandle( HINTERNET hinternet );
-DWORD INET_QueryOption(DWORD,void*,DWORD*,BOOL);
+DWORD INET_QueryOption( object_header_t *, DWORD, void *, DWORD *, BOOL );
time_t ConvertTimeString(LPCWSTR asctime);
diff --git a/dll/win32/wininet/netconnection.c b/dll/win32/wininet/netconnection.c
index c2560b5da37..5aa647a7a49 100644
--- a/dll/win32/wininet/netconnection.c
+++ b/dll/win32/wininet/netconnection.c
@@ -134,6 +134,7 @@ MAKE_FUNCPTR(SSL_shutdown);
MAKE_FUNCPTR(SSL_write);
MAKE_FUNCPTR(SSL_read);
MAKE_FUNCPTR(SSL_pending);
+MAKE_FUNCPTR(SSL_get_error);
MAKE_FUNCPTR(SSL_get_ex_new_index);
MAKE_FUNCPTR(SSL_get_ex_data);
MAKE_FUNCPTR(SSL_set_ex_data);
@@ -330,7 +331,9 @@ static int netconn_secure_verify(int preverify_ok, X509_STORE_CTX *ctx)
CertFreeCertificateContext(endCert);
CertCloseStore(store, 0);
}
- }
+ } else
+ pSSL_set_ex_data(ssl, error_idx, (void *)ERROR_INTERNET_SEC_CERT_ERRORS);
+
return ret;
}
@@ -392,6 +395,7 @@ DWORD NETCON_init(WININET_NETCONNECTION *connection, BOOL useSSL)
DYNSSL(SSL_write);
DYNSSL(SSL_read);
DYNSSL(SSL_pending);
+ DYNSSL(SSL_get_error);
DYNSSL(SSL_get_ex_new_index);
DYNSSL(SSL_get_ex_data);
DYNSSL(SSL_set_ex_data);
@@ -772,6 +776,12 @@ DWORD NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int
{
#ifdef SONAME_LIBSSL
*recvd = pSSL_read(connection->ssl_s, buf, len);
+
+ /* Check if EOF was received */
+ if(!*recvd && (pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_ZERO_RETURN
+ || pSSL_get_error(connection->ssl_s, *recvd)==SSL_ERROR_SYSCALL))
+ return ERROR_SUCCESS;
+
return *recvd > 0 ? ERROR_SUCCESS : ERROR_INTERNET_CONNECTION_ABORTED;
#else
return ERROR_NOT_SUPPORTED;
diff --git a/dll/win32/wininet/urlcache.c b/dll/win32/wininet/urlcache.c
index 6a39c691475..c617a93299f 100644
--- a/dll/win32/wininet/urlcache.c
+++ b/dll/win32/wininet/urlcache.c
@@ -2435,7 +2435,6 @@ static BOOL CommitUrlCacheEntryInternal(
DWORD dwFileSizeLow = 0;
DWORD dwFileSizeHigh = 0;
BYTE cDirectory = 0;
- int len;
char achFile[MAX_PATH];
LPSTR lpszUrlNameA = NULL;
LPSTR lpszFileExtensionA = NULL;
@@ -2556,7 +2555,6 @@ static BOOL CommitUrlCacheEntryInternal(
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(lpszUrlNameA) + 1);
if (lpszLocalFileName)
{
- len = WideCharToMultiByte(CP_ACP, 0, lpszUrlName, -1, NULL, 0, NULL, NULL);
dwOffsetLocalFileName = dwBytesNeeded;
dwBytesNeeded = DWORD_ALIGN(dwBytesNeeded + strlen(pchLocalFileName) + 1);
}
diff --git a/dll/win32/wininet/utility.c b/dll/win32/wininet/utility.c
index 66fbecdd653..0639f40385e 100644
--- a/dll/win32/wininet/utility.c
+++ b/dll/win32/wininet/utility.c
@@ -307,6 +307,7 @@ VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext,
case INTERNET_STATUS_CONNECTING_TO_SERVER:
case INTERNET_STATUS_CONNECTED_TO_SERVER:
lpvNewInfo = heap_strdupAtoW(lpvStatusInfo);
+ dwStatusInfoLength *= sizeof(WCHAR);
break;
case INTERNET_STATUS_RESOLVING_NAME:
case INTERNET_STATUS_REDIRECT:
@@ -325,6 +326,7 @@ VOID INTERNET_SendCallback(object_header_t *hdr, DWORD_PTR dwContext,
case INTERNET_STATUS_RESOLVING_NAME:
case INTERNET_STATUS_REDIRECT:
lpvNewInfo = heap_strdupWtoA(lpvStatusInfo);
+ dwStatusInfoLength /= sizeof(WCHAR);
break;
}
}
diff --git a/dll/win32/wininet/wininet.rbuild b/dll/win32/wininet/wininet.rbuild
index 45b87b18665..ac2c43f7945 100644
--- a/dll/win32/wininet/wininet.rbuild
+++ b/dll/win32/wininet/wininet.rbuild
@@ -6,6 +6,7 @@
.
include/reactos/wine
+ .
@@ -22,6 +23,7 @@
secur32
crypt32
ws2_32
+ zlib
pseh
cookie.c
dialogs.c
diff --git a/dll/win32/wininet/wininet_Si.rc b/dll/win32/wininet/wininet_Si.rc
index b5bf2914328..488104ec9dc 100644
--- a/dll/win32/wininet/wininet_Si.rc
+++ b/dll/win32/wininet/wininet_Si.rc
@@ -27,11 +27,11 @@ STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Vnos omreĹľnega gesla"
FONT 8, "MS Shell Dlg"
{
- LTEXT "Vnesite uporabniško ime in geslo:", -1, 40, 6, 150, 15
- LTEXT "Proksi", -1, 40, 26, 50, 10
- LTEXT "Kraljestvo", -1, 40, 46, 50, 10
- LTEXT "Uporabniško ime", -1, 40, 66, 50, 10
- LTEXT "Geslo", -1, 40, 86, 50, 10
+ LTEXT "Vnesite uporabniško ime in geslo:", -1, 20, 6, 150, 15
+ LTEXT "Proksi", -1, 20, 26, 50, 10
+ LTEXT "PodroÄŤje", -1, 20, 46, 50, 10
+ LTEXT "Uporabniško ime", -1, 20, 66, 55, 10
+ LTEXT "Geslo", -1, 20, 86, 50, 10
LTEXT "" IDC_PROXY, 80, 26, 150, 14, 0
LTEXT "" IDC_REALM, 80, 46, 150, 14, 0
EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
@@ -42,6 +42,26 @@ FONT 8, "MS Shell Dlg"
PUSHBUTTON "PrekliÄŤi", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP
}
+IDD_AUTHDLG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 250, 154
+STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "Authentication Required"
+FONT 8, "MS Shell Dlg"
+{
+ LTEXT "Vnesite uporabniško ime in geslo:", -1, 20, 6, 150, 15
+ LTEXT "Server", -1, 20, 26, 50, 10
+ LTEXT "PodroÄŤje", -1, 20, 46, 50, 10
+ LTEXT "Uporabniško ime", -1, 20, 66, 55, 10
+ LTEXT "Geslo", -1, 20, 86, 50, 10
+ LTEXT "" IDC_SERVER, 80, 26, 150, 14, 0
+ LTEXT "" IDC_REALM, 80, 46, 150, 14, 0
+ EDITTEXT IDC_USERNAME, 80, 66, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
+ EDITTEXT IDC_PASSWORD, 80, 86, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP | ES_PASSWORD
+ CHECKBOX "&Shrani geslo (nezaščiteno)", IDC_SAVEPASSWORD,
+ 80, 106, 150, 12, BS_AUTOCHECKBOX | WS_GROUP | WS_TABSTOP
+ PUSHBUTTON "V redu", IDOK, 98, 126, 56, 14, WS_GROUP | WS_TABSTOP | BS_DEFPUSHBUTTON
+ PUSHBUTTON "PrekliÄŤi", IDCANCEL, 158, 126, 56, 14, WS_GROUP | WS_TABSTOP
+}
+
STRINGTABLE DISCARDABLE
{
IDS_LANCONNECTION "LAN povezava"
diff --git a/dll/win32/wintrust/wintrust.rbuild b/dll/win32/wintrust/wintrust.rbuild
index 910d2278f8e..bcb1c2b8304 100644
--- a/dll/win32/wintrust/wintrust.rbuild
+++ b/dll/win32/wintrust/wintrust.rbuild
@@ -1,4 +1,4 @@
-
+
.
diff --git a/dll/win32/ws2_32/misc/async.c b/dll/win32/ws2_32/misc/async.c
index a130e7a4847..d8d3701790d 100644
--- a/dll/win32/ws2_32/misc/async.c
+++ b/dll/win32/ws2_32/misc/async.c
@@ -34,7 +34,6 @@
*/
#include
-#include
#define WS_FD_SETSIZE FD_SETSIZE
#define HAVE_GETPROTOBYNAME
diff --git a/dll/win32/ws2_32/misc/ns.c b/dll/win32/ws2_32/misc/ns.c
index fee4f032868..04e5b4bc5e2 100644
--- a/dll/win32/ws2_32/misc/ns.c
+++ b/dll/win32/ws2_32/misc/ns.c
@@ -32,10 +32,44 @@ WSAAddressToStringA(IN LPSOCKADDR lpsaAddress,
OUT LPSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength)
{
- UNIMPLEMENTED
+ DWORD size;
+ CHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+ CHAR *p;
- WSASetLastError(WSASYSCALLFAILURE);
- return SOCKET_ERROR;
+ if (!lpsaAddress) return SOCKET_ERROR;
+ if (!lpszAddressString || !lpdwAddressStringLength) return SOCKET_ERROR;
+
+ switch(lpsaAddress->sa_family)
+ {
+ case AF_INET:
+ if (dwAddressLength < sizeof(SOCKADDR_IN)) return SOCKET_ERROR;
+ sprintf( buffer, "%u.%u.%u.%u:%u",
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 24 & 0xff),
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 16 & 0xff),
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) >> 8 & 0xff),
+ (unsigned int)(ntohl( ((SOCKADDR_IN *)lpsaAddress)->sin_addr.s_addr ) & 0xff),
+ ntohs( ((SOCKADDR_IN *)lpsaAddress)->sin_port ) );
+
+ p = strchr( buffer, ':' );
+ if (!((SOCKADDR_IN *)lpsaAddress)->sin_port) *p = 0;
+ break;
+ default:
+ WSASetLastError(WSAEINVAL);
+ return SOCKET_ERROR;
+ }
+
+ size = strlen( buffer ) + 1;
+
+ if (*lpdwAddressStringLength < size)
+ {
+ *lpdwAddressStringLength = size;
+ WSASetLastError(WSAEFAULT);
+ return SOCKET_ERROR;
+ }
+
+ *lpdwAddressStringLength = size;
+ strcpy( lpszAddressString, buffer );
+ return 0;
}
@@ -50,10 +84,28 @@ WSAAddressToStringW(IN LPSOCKADDR lpsaAddress,
OUT LPWSTR lpszAddressString,
IN OUT LPDWORD lpdwAddressStringLength)
{
- UNIMPLEMENTED
+ INT ret;
+ DWORD size;
+ WCHAR buffer[54]; /* 32 digits + 7':' + '[' + '%" + 5 digits + ']:' + 5 digits + '\0' */
+ CHAR bufAddr[54];
- WSASetLastError(WSASYSCALLFAILURE);
- return SOCKET_ERROR;
+ size = *lpdwAddressStringLength;
+ ret = WSAAddressToStringA(lpsaAddress, dwAddressLength, NULL, bufAddr, &size);
+
+ if (ret) return ret;
+
+ MultiByteToWideChar( CP_ACP, 0, bufAddr, size, buffer, sizeof( buffer )/sizeof(WCHAR));
+
+ if (*lpdwAddressStringLength < size)
+ {
+ *lpdwAddressStringLength = size;
+ WSASetLastError(WSAEFAULT);
+ return SOCKET_ERROR;
+ }
+
+ *lpdwAddressStringLength = size;
+ lstrcpyW( lpszAddressString, buffer );
+ return 0;
}
diff --git a/dll/win32/ws2_32/misc/sndrcv.c b/dll/win32/ws2_32/misc/sndrcv.c
index f1b68feb158..8fb4186933e 100644
--- a/dll/win32/ws2_32/misc/sndrcv.c
+++ b/dll/win32/ws2_32/misc/sndrcv.c
@@ -410,6 +410,8 @@ WSASendTo(IN SOCKET s,
if (Code == SOCKET_ERROR)
WSASetLastError(Errno);
+ else
+ WSASetLastError(0);
return Code;
}
diff --git a/dll/win32/ws2_32/ws2_32.rbuild b/dll/win32/ws2_32/ws2_32.rbuild
index f23493b027e..912b339566f 100644
--- a/dll/win32/ws2_32/ws2_32.rbuild
+++ b/dll/win32/ws2_32/ws2_32.rbuild
@@ -3,6 +3,7 @@
include
include/reactos/wine
+ DECLSPEC_EXPORT
wine
ntdll
user32
diff --git a/dll/win32/ws2_32_new/src/addrinfo.c b/dll/win32/ws2_32_new/src/addrinfo.c
index cfdb4f130dd..7bc55caf522 100644
--- a/dll/win32/ws2_32_new/src/addrinfo.c
+++ b/dll/win32/ws2_32_new/src/addrinfo.c
@@ -91,7 +91,7 @@ ParseV4Address(IN PCWSTR AddressString,
LPWSTR Ip = 0;
/* Do the conversion, don't accept wildcard */
- RtlIpv4StringToAddressW((LPWSTR)AddressString, 0, Ip, (IN_ADDR *)&Address);
+ RtlIpv4StringToAddressW((LPWSTR)AddressString, 0, &Ip, (IN_ADDR *)&Address);
/* Return the address and success */
*pAddress = Address;
diff --git a/drivers/base/bootvid/i386/bootvid.c b/drivers/base/bootvid/i386/bootvid.c
index 3d0ae503167..08d0dc10b8e 100644
--- a/drivers/base/bootvid/i386/bootvid.c
+++ b/drivers/base/bootvid/i386/bootvid.c
@@ -155,7 +155,7 @@ VgaInterpretCmdStream(IN PUSHORT CmdStream)
if (!ShortValue) continue;
/* Loop the cmd array */
- for (; Count; Count--, CmdStream++, Value++)
+ for (; Count; Count--, CmdStream++)
{
/* Get the byte we're writing */
ShortValue += (*CmdStream) << 8;
diff --git a/drivers/base/bootvid/i386/vga.c b/drivers/base/bootvid/i386/vga.c
index eeb06fe8df5..1c80994c0e7 100644
--- a/drivers/base/bootvid/i386/vga.c
+++ b/drivers/base/bootvid/i386/vga.c
@@ -402,33 +402,20 @@ BitBlt(IN ULONG Left,
IN ULONG BitsPerPixel,
IN ULONG Delta)
{
- ULONG LeftAnd, LeftShifted, LeftPlusOne, LeftPos;
- ULONG lMask, rMask;
- UCHAR NotlMask;
- ULONG Distance;
- ULONG DistanceMinusLeftBpp;
- ULONG SomeYesNoFlag, SomeYesNoFlag2;
- PUCHAR PixelPosition, m;
- PUCHAR i, k;
- ULONG j;
- ULONG x;
- ULONG Plane;
- UCHAR LeftArray[84];
- PUCHAR CurrentLeft;
- PUCHAR l;
- ULONG LoopCount;
- UCHAR pMask, PlaneShift;
- BOOLEAN Odd;
- UCHAR Value;
+ ULONG sx, dx, dy;
+ UCHAR color;
+ ULONG offset = 0;
+ const ULONG Bottom = Top + Height;
+ const ULONG Right = Left + Width;
/* Check if the buffer isn't 4bpp */
if (BitsPerPixel != 4)
{
/* FIXME: TODO */
DbgPrint("Unhandled BitBlt\n"
- "%lxx%lx @ (%lx,%lx)\n"
- "Bits Per Pixel %lx\n"
- "Buffer: %p. Delta: %lx\n",
+ "%lux%lu @ (%lu|%lu)\n"
+ "Bits Per Pixel %lu\n"
+ "Buffer: %p. Delta: %lu\n",
Width,
Height,
Left,
@@ -439,181 +426,28 @@ BitBlt(IN ULONG Left,
return;
}
- /* Get the masks and other values */
- LeftAnd = Left & 0x7;
- lMask = lMaskTable[LeftAnd];
- Distance = Width + Left;
- rMask = rMaskTable[(Distance - 1) & 0x7];
- Left >>= 3;
-
- /* Set some values */
- SomeYesNoFlag = FALSE;
- SomeYesNoFlag2 = FALSE;
- Distance = (Distance - 1) >> 3;
- DistanceMinusLeftBpp = Distance - Left;
-
- /* Check if the distance is equal to the left position and add the masks */
- if (Left == Distance) lMask += rMask;
-
- /* Check if there's no distance offset */
- if (DistanceMinusLeftBpp)
- {
- /* Set the first flag on */
- SomeYesNoFlag = TRUE;
-
- /* Decrease offset and check if we still have one */
- if (--DistanceMinusLeftBpp)
- {
- /* Still have a distance offset */
- SomeYesNoFlag2 = TRUE;
- }
- }
-
- /* Calculate initial pixel position */
- PixelPosition = (PUCHAR)VgaBase + (Top * 80) + Left;
-
- /* Set loop buffer variable */
- i = Buffer;
-
- /* Switch to mode 0 */
- ReadWriteMode(0);
-
- /* Leave now if the height is 0 */
- if (Height <= 0) return;
-
- /* Set more weird values */
- CurrentLeft = &LeftArray[Left];
- NotlMask = ~(UCHAR)lMask;
- LeftPlusOne = Left + 1;
- LeftShifted = (lMask << 8) | 8;
- j = Height;
-
- /* Start the height loop */
+ /* 4bpp blitting */
+ dy = Top;
do
{
- /* Start the plane loop */
- Plane = 0;
+ sx = 0;
do
{
- /* Clear the current value */
- *CurrentLeft = 0;
- LoopCount = 0;
+ /* Extract color */
+ color = Buffer[offset + sx];
- /* Set the buffer loop variable for this loop */
- k = i;
+ /* Calc destination x */
+ dx = Left + (sx << 1);
- /* Calculate plane shift and pixel mask */
- PlaneShift = 1 << Plane;
- pMask = PixelMask[LeftAnd];
+ /* Set two pixels */
+ SetPixel(dx, dy, color >> 4);
+ SetPixel(dx + 1, dy, color & 0x0F);
- /* Check if we have a width */
- if (Width > 0)
- {
- /* Loop it */
- l = CurrentLeft;
- x = Width;
- do
- {
- /* Check if we're odd and increase the loop count */
- Odd = LoopCount & 1 ? TRUE : FALSE;
- LoopCount++;
- if (Odd)
- {
- /* Check for the plane shift */
- if (*k & PlaneShift)
- {
- /* Write the pixel mask */
- *l |= pMask;
- }
-
- /* Increase buffer position */
- k++;
- }
- else
- {
- /* Check for plane shift */
- if ((*k >> 4) & PlaneShift)
- {
- /* Write the pixel mask */
- *l |= pMask;
- }
- }
-
- /* Shift the pixel mask */
- pMask >>= 1;
- if (!pMask)
- {
- /* Move to the next current left position and clear it */
- l++;
- *l = 0;
-
- /* Set the pixel mask to 0x80 */
- pMask = 0x80;
- }
- } while (--x);
- }
-
- /* Set the plane value */
- __outpw(0x3C4, (1 << (Plane + 8) | 2));
-
- /* Select the bitmask register and write the mask */
- __outpw(0x3CE, (USHORT)LeftShifted);
-
- /* Read the current Pixel value */
- Value = READ_REGISTER_UCHAR(PixelPosition);
-
- /* Add our mask */
- Value = (Value & NotlMask) | *CurrentLeft;
-
- /* Set current left for the loop, and write new pixel value */
- LeftPos = LeftPlusOne;
- WRITE_REGISTER_UCHAR(PixelPosition, Value);
-
- /* Set loop pixel position and check if we should loop */
- m = PixelPosition + 1;
- if (SomeYesNoFlag2)
- {
- /* Set the bitmask to 0xFF for all 4 planes */
- __outpw(0x3CE, 0xFF08);
-
- /* Check if we have any distance left */
- if (DistanceMinusLeftBpp > 0)
- {
- /* Start looping it */
- x = DistanceMinusLeftBpp;
- do
- {
- /* Write the value */
- WRITE_REGISTER_UCHAR(m, LeftArray[LeftPos]);
-
- /* Go to the next position */
- m++;
- LeftPos++;
- } while (--x);
- }
- }
-
- /* Check if the first flag is on */
- if (SomeYesNoFlag)
- {
- /* Set the mask value */
- __outpw(0x3CE, (rMask << 8) | 8);
-
- /* Read the current Pixel value */
- Value = READ_REGISTER_UCHAR(m);
-
- /* Add our mask */
- Value = (Value & ~(UCHAR)rMask) | LeftArray[LeftPos];
-
- /* Set current left for the loop, and write new pixel value */
- WRITE_REGISTER_UCHAR(m, Value);
- }
- } while (++Plane < 4);
-
- /* Update pixel position, buffer and height */
- PixelPosition += 80;
- i += Delta;
- } while (--j);
+ sx++;
+ } while (dx < Right);
+ offset += Delta;
+ dy++;
+ } while (dy < Bottom);
}
VOID
diff --git a/drivers/base/kdcom/arm/kdbg.c b/drivers/base/kdcom/arm/kdbg.c
index c61e18e9629..1768d03683a 100644
--- a/drivers/base/kdcom/arm/kdbg.c
+++ b/drivers/base/kdcom/arm/kdbg.c
@@ -9,7 +9,7 @@
/* INCLUDES *******************************************************************/
#define NOEXTAPI
-#include
+#include
#define NDEBUG
#include
#include
diff --git a/drivers/base/kdcom/i386/kdbg.c b/drivers/base/kdcom/i386/kdbg.c
index c8fad2f2afb..5f91cf083b2 100644
--- a/drivers/base/kdcom/i386/kdbg.c
+++ b/drivers/base/kdcom/i386/kdbg.c
@@ -10,7 +10,6 @@
/* INCLUDES *****************************************************************/
#define NOEXTAPI
-#include
#include
#define NDEBUG
#include
diff --git a/drivers/battery/battc/battc.h b/drivers/battery/battc/battc.h
index 0839cea845e..24e864a8534 100644
--- a/drivers/battery/battc/battc.h
+++ b/drivers/battery/battc/battc.h
@@ -9,7 +9,7 @@
#pragma once
#include
-#include
+#include
#include
#include
diff --git a/drivers/battery/battc/battc.rbuild b/drivers/battery/battc/battc.rbuild
index c0261344994..5847dd401b0 100644
--- a/drivers/battery/battc/battc.rbuild
+++ b/drivers/battery/battc/battc.rbuild
@@ -5,6 +5,7 @@
hal
.
+
battc.c
battc.rc
diff --git a/drivers/bus/acpi/acpica/include/platform/acwin64.h b/drivers/bus/acpi/acpica/include/platform/acwin64.h
index faec855e22d..59a8adda807 100644
--- a/drivers/bus/acpi/acpica/include/platform/acwin64.h
+++ b/drivers/bus/acpi/acpica/include/platform/acwin64.h
@@ -118,10 +118,14 @@
/*! [Begin] no source code translation (Keep the include) */
-#include "acintel.h"
+//#include "acintel.h"
+// HACK
+#define INT32 _ACPI_INT32
+#define UINT32 _ACPI_UINT32
+
/*! [End] no source code translation !*/
-#define ACPI_MACHINE_WIDTH 64
+#define ACPI_MACHINE_WIDTH 64
#define ACPI_USE_STANDARD_HEADERS
diff --git a/drivers/bus/acpi/busmgr/bus.c b/drivers/bus/acpi/busmgr/bus.c
index ae04c2cb31b..9860055873a 100644
--- a/drivers/bus/acpi/busmgr/bus.c
+++ b/drivers/bus/acpi/busmgr/bus.c
@@ -457,6 +457,7 @@ acpi_bus_get_perf_flags (
-------------------------------------------------------------------------- */
void
+NTAPI
acpi_bus_generate_event_dpc(PKDPC Dpc,
PVOID DeferredContext,
PVOID SystemArgument1,
diff --git a/drivers/bus/acpi/buspdo.c b/drivers/bus/acpi/buspdo.c
index 84bd1d8fe11..d5129ffa5f5 100644
--- a/drivers/bus/acpi/buspdo.c
+++ b/drivers/bus/acpi/buspdo.c
@@ -644,6 +644,37 @@ Bus_PDO_QueryResources(
ACPI_RESOURCE* resource;
ULONG ResourceListSize;
ULONG i;
+ ULONGLONG BusNumber;
+
+ /* A bus number resource is not included in the list of current resources
+ * for the root PCI bus so we manually query one here and if we find it
+ * we create a resource list and add a bus number descriptor to it */
+ AcpiStatus = acpi_evaluate_integer(DeviceData->AcpiHandle, "_BBN", NULL, &BusNumber);
+ if (AcpiStatus == AE_OK)
+ {
+ DPRINT1("Found PCI root hub: %d\n", BusNumber);
+
+ ResourceListSize = sizeof(CM_RESOURCE_LIST);
+ ResourceList = (PCM_RESOURCE_LIST)ExAllocatePool(PagedPool, ResourceListSize);
+ if (!ResourceList)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ ResourceList->Count = 1;
+ ResourceList->List[0].InterfaceType = Internal;
+ ResourceList->List[0].BusNumber = 0;
+ ResourceList->List[0].PartialResourceList.Version = 1;
+ ResourceList->List[0].PartialResourceList.Revision = 1;
+ ResourceList->List[0].PartialResourceList.Count = 1;
+ ResourceDescriptor = ResourceList->List[0].PartialResourceList.PartialDescriptors;
+
+ ResourceDescriptor->Type = CmResourceTypeBusNumber;
+ ResourceDescriptor->ShareDisposition = CmResourceShareDeviceExclusive;
+ ResourceDescriptor->u.BusNumber.Start = BusNumber;
+ ResourceDescriptor->u.BusNumber.Length = 1;
+
+ Irp->IoStatus.Information = (ULONG_PTR)ResourceList;
+ return STATUS_SUCCESS;
+ }
/* Get current resources */
Buffer.Length = 0;
@@ -744,8 +775,8 @@ Bus_PDO_QueryResources(
(irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
ResourceDescriptor->Flags =
(irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
- ResourceDescriptor->u.Interrupt.Level = irq_data->Interrupts[i];
- ResourceDescriptor->u.Interrupt.Vector = 0;
+ ResourceDescriptor->u.Interrupt.Level =
+ ResourceDescriptor->u.Interrupt.Vector = irq_data->Interrupts[i];
ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
ResourceDescriptor++;
@@ -763,8 +794,8 @@ Bus_PDO_QueryResources(
(irq_data->Sharable == ACPI_SHARED ? CmResourceShareShared : CmResourceShareDeviceExclusive);
ResourceDescriptor->Flags =
(irq_data->Triggering == ACPI_LEVEL_SENSITIVE ? CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE : CM_RESOURCE_INTERRUPT_LATCHED);
- ResourceDescriptor->u.Interrupt.Level = irq_data->Interrupts[i];
- ResourceDescriptor->u.Interrupt.Vector = 0;
+ ResourceDescriptor->u.Interrupt.Level =
+ ResourceDescriptor->u.Interrupt.Vector = irq_data->Interrupts[i];
ResourceDescriptor->u.Interrupt.Affinity = (KAFFINITY)(-1);
ResourceDescriptor++;
diff --git a/drivers/bus/acpi/compbatt/compbatt.c b/drivers/bus/acpi/compbatt/compbatt.c
index a0b17f83e45..094cb4e6b6e 100644
--- a/drivers/bus/acpi/compbatt/compbatt.c
+++ b/drivers/bus/acpi/compbatt/compbatt.c
@@ -214,15 +214,6 @@ CompBattSetStatusNotify(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
return STATUS_NOT_IMPLEMENTED;
}
-NTSTATUS
-NTAPI
-CompBattGetBatteryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
- IN ULONG Tag)
-{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
-}
-
NTSTATUS
NTAPI
CompBattQueryStatus(IN PCOMPBATT_DEVICE_EXTENSION DeviceExtension,
diff --git a/drivers/bus/acpi/include/acpisys.h b/drivers/bus/acpi/include/acpisys.h
index adf2a0c592a..eb171f15546 100644
--- a/drivers/bus/acpi/include/acpisys.h
+++ b/drivers/bus/acpi/include/acpisys.h
@@ -130,6 +130,7 @@ Bus_PnP (
);
NTSTATUS
+NTAPI
Bus_CompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
diff --git a/drivers/bus/acpi/interface.c b/drivers/bus/acpi/interface.c
index 59717056484..4e54115c0b4 100644
--- a/drivers/bus/acpi/interface.c
+++ b/drivers/bus/acpi/interface.c
@@ -25,13 +25,14 @@ AcpiInterfaceDereference(PVOID Context)
}
NTSTATUS
+NTAPI
AcpiInterfaceConnectVector(PDEVICE_OBJECT Context,
ULONG GpeNumber,
KINTERRUPT_MODE Mode,
BOOLEAN Shareable,
PGPE_SERVICE_ROUTINE ServiceRoutine,
PVOID ServiceContext,
- PVOID *ObjectContext)
+ PVOID ObjectContext)
{
UNIMPLEMENTED
@@ -39,8 +40,8 @@ AcpiInterfaceConnectVector(PDEVICE_OBJECT Context,
}
NTSTATUS
-AcpiInterfaceDisconnectVector(PDEVICE_OBJECT Context,
- PVOID ObjectContext)
+NTAPI
+AcpiInterfaceDisconnectVector(PVOID ObjectContext)
{
UNIMPLEMENTED
@@ -48,6 +49,7 @@ AcpiInterfaceDisconnectVector(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceEnableEvent(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
@@ -57,6 +59,7 @@ AcpiInterfaceEnableEvent(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceDisableEvent(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
@@ -66,6 +69,7 @@ AcpiInterfaceDisableEvent(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceClearStatus(PDEVICE_OBJECT Context,
PVOID ObjectContext)
{
@@ -75,6 +79,7 @@ AcpiInterfaceClearStatus(PDEVICE_OBJECT Context,
}
NTSTATUS
+NTAPI
AcpiInterfaceNotificationsRegister(PDEVICE_OBJECT Context,
PDEVICE_NOTIFY_CALLBACK NotificationHandler,
PVOID NotificationContext)
@@ -85,6 +90,7 @@ AcpiInterfaceNotificationsRegister(PDEVICE_OBJECT Context,
}
VOID
+NTAPI
AcpiInterfaceNotificationsUnregister(PDEVICE_OBJECT Context,
PDEVICE_NOTIFY_CALLBACK NotificationHandler)
{
diff --git a/drivers/bus/acpi/pnp.c b/drivers/bus/acpi/pnp.c
index c82a3905023..9259fb9d2a5 100644
--- a/drivers/bus/acpi/pnp.c
+++ b/drivers/bus/acpi/pnp.c
@@ -363,6 +363,7 @@ Bus_SendIrpSynchronously (
}
NTSTATUS
+NTAPI
Bus_CompletionRoutine(
PDEVICE_OBJECT DeviceObject,
PIRP Irp,
diff --git a/drivers/bus/pci/fdo.c b/drivers/bus/pci/fdo.c
index b6753e10a5e..8a81d7b66cf 100644
--- a/drivers/bus/pci/fdo.c
+++ b/drivers/bus/pci/fdo.c
@@ -551,10 +551,6 @@ FdoPnpControl(
case IRP_MN_QUERY_STOP_DEVICE:
Status = STATUS_NOT_IMPLEMENTED;
break;
-
- case IRP_MN_REMOVE_DEVICE:
- Status = STATUS_NOT_IMPLEMENTED;
- break;
#endif
case IRP_MN_START_DEVICE:
DPRINT("IRP_MN_START_DEVICE received\n");
@@ -579,7 +575,14 @@ FdoPnpControl(
case IRP_MN_FILTER_RESOURCE_REQUIREMENTS:
break;
case IRP_MN_REMOVE_DEVICE:
- DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n");
+ /* Detach the device object from the device stack */
+ IoDetachDevice(DeviceExtension->Ldo);
+
+ /* Delete the device object */
+ IoDeleteDevice(DeviceObject);
+
+ /* Return success */
+ Status = STATUS_SUCCESS;
break;
default:
DPRINT1("Unknown IOCTL 0x%lx\n", IrpSp->MinorFunction);
diff --git a/drivers/filesystems/npfs/create.c b/drivers/filesystems/npfs/create.c
index 5236e2035ee..bef462fb8d7 100644
--- a/drivers/filesystems/npfs/create.c
+++ b/drivers/filesystems/npfs/create.c
@@ -205,8 +205,8 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
ClientCcb->MaxDataLength = Fcb->OutboundQuota;
ExInitializeFastMutex(&ClientCcb->DataListLock);
KeInitializeEvent(&ClientCcb->ConnectEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&ClientCcb->ReadEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&ClientCcb->WriteEvent, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&ClientCcb->ReadEvent, NotificationEvent, FALSE);
+ KeInitializeEvent(&ClientCcb->WriteEvent, NotificationEvent, FALSE);
/*
@@ -255,8 +255,9 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
if (ClientCcb->Data)
{
ExFreePool(ClientCcb->Data);
- ClientCcb->Data = NULL;
}
+
+ ExFreePool(ClientCcb);
KeUnlockMutex(&Fcb->CcbListLock);
Irp->IoStatus.Status = STATUS_OBJECT_PATH_NOT_FOUND;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -273,6 +274,14 @@ NpfsCreate(PDEVICE_OBJECT DeviceObject,
else if (IsListEmpty(&Fcb->ServerCcbListHead))
{
DPRINT("No server fcb found!\n");
+
+ if (ClientCcb->Data)
+ {
+ ExFreePool(ClientCcb->Data);
+ }
+
+ ExFreePool(ClientCcb);
+
KeUnlockMutex(&Fcb->CcbListLock);
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
@@ -540,8 +549,8 @@ NpfsCreateNamedPipe(PDEVICE_OBJECT DeviceObject,
DPRINT("CCB: %p\n", Ccb);
KeInitializeEvent(&Ccb->ConnectEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&Ccb->ReadEvent, SynchronizationEvent, FALSE);
- KeInitializeEvent(&Ccb->WriteEvent, SynchronizationEvent, FALSE);
+ KeInitializeEvent(&Ccb->ReadEvent, NotificationEvent, FALSE);
+ KeInitializeEvent(&Ccb->WriteEvent, NotificationEvent, FALSE);
KeLockMutex(&Fcb->CcbListLock);
InsertTailList(&Fcb->ServerCcbListHead, &Ccb->CcbListEntry);
@@ -619,7 +628,6 @@ NpfsCleanup(PDEVICE_OBJECT DeviceObject,
ExAcquireFastMutex(&OtherSide->DataListLock);
ExAcquireFastMutex(&Ccb->DataListLock);
}
- //OtherSide->PipeState = FILE_PIPE_DISCONNECTED_STATE;
OtherSide->OtherSide = NULL;
/*
* Signaling the write event. If is possible that an other
@@ -743,8 +751,11 @@ NpfsClose(PDEVICE_OBJECT DeviceObject,
}
/* Disconnect the pipes */
- if (Ccb->OtherSide) Ccb->OtherSide->OtherSide = NULL;
- if (Ccb) Ccb->OtherSide = NULL;
+ if (Ccb->OtherSide)
+ {
+ Ccb->OtherSide->OtherSide = NULL;
+ Ccb->OtherSide = NULL;
+ }
ASSERT(Ccb->PipeState == FILE_PIPE_CLOSING_STATE);
diff --git a/drivers/filesystems/npfs/finfo.c b/drivers/filesystems/npfs/finfo.c
index 18c53414d64..fbb1d6090de 100644
--- a/drivers/filesystems/npfs/finfo.c
+++ b/drivers/filesystems/npfs/finfo.c
@@ -26,6 +26,13 @@ NpfsSetPipeInformation(PDEVICE_OBJECT DeviceObject,
PFILE_PIPE_INFORMATION Request;
DPRINT("NpfsSetPipeInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
+ {
+ /* Buffer too small */
+ return STATUS_INFO_LENGTH_MISMATCH;
+ }
+
+
/* Get the Pipe and data */
Fcb = Ccb->Fcb;
Request = (PFILE_PIPE_INFORMATION)Info;
@@ -63,6 +70,12 @@ NpfsSetPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
PFILE_PIPE_REMOTE_INFORMATION Request;
DPRINT("NpfsSetPipeRemoteInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+ {
+ /* Buffer too small */
+ return STATUS_INFO_LENGTH_MISMATCH;
+ }
+
/* Get the Pipe and data */
Fcb = Ccb->Fcb;
Request = (PFILE_PIPE_REMOTE_INFORMATION)Info;
@@ -86,6 +99,13 @@ NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
ULONG ConnectionSideReadMode;
DPRINT("NpfsQueryPipeInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_INFORMATION))
+ {
+ /* Buffer too small */
+ *BufferLength = sizeof(FILE_PIPE_INFORMATION);
+ return STATUS_BUFFER_OVERFLOW;
+ }
+
/* Get the Pipe */
Fcb = Ccb->Fcb;
@@ -100,7 +120,7 @@ NpfsQueryPipeInformation(PDEVICE_OBJECT DeviceObject,
Info->ReadMode = ConnectionSideReadMode;
/* Return success */
- *BufferLength -= sizeof(FILE_PIPE_INFORMATION);
+ *BufferLength = sizeof(FILE_PIPE_INFORMATION);
return STATUS_SUCCESS;
}
@@ -114,6 +134,13 @@ NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
PNPFS_FCB Fcb;
DPRINT("NpfsQueryPipeRemoteInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+ {
+ /* Buffer too small */
+ *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
+ return STATUS_BUFFER_OVERFLOW;
+ }
+
/* Get the Pipe */
Fcb = Ccb->Fcb;
@@ -125,7 +152,7 @@ NpfsQueryPipeRemoteInformation(PDEVICE_OBJECT DeviceObject,
Info->CollectDataTime = Fcb->TimeOut;
/* Return success */
- *BufferLength -= sizeof(FILE_PIPE_REMOTE_INFORMATION);
+ *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
return STATUS_SUCCESS;
}
@@ -140,11 +167,21 @@ NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
DPRINT("NpfsQueryLocalPipeInformation()\n");
+ if (*BufferLength < sizeof(FILE_PIPE_REMOTE_INFORMATION))
+ {
+ /* Buffer too small */
+ *BufferLength = sizeof(FILE_PIPE_REMOTE_INFORMATION);
+ return STATUS_BUFFER_OVERFLOW;
+ }
+
+ /* Get the Pipe */
Fcb = Ccb->Fcb;
+ /* Clear Info */
RtlZeroMemory(Info,
sizeof(FILE_PIPE_LOCAL_INFORMATION));
+ /* Return Info */
Info->NamedPipeType = Fcb->PipeType;
Info->NamedPipeConfiguration = Fcb->PipeConfiguration;
Info->MaximumInstances = Fcb->MaximumInstances;
@@ -165,7 +202,7 @@ NpfsQueryLocalPipeInformation(PDEVICE_OBJECT DeviceObject,
Info->WriteQuotaAvailable = Ccb->OtherSide->WriteQuotaAvailable;
}
- *BufferLength -= sizeof(FILE_PIPE_LOCAL_INFORMATION);
+ *BufferLength = sizeof(FILE_PIPE_LOCAL_INFORMATION);
return STATUS_SUCCESS;
}
@@ -226,14 +263,12 @@ NpfsQueryInformation(PDEVICE_OBJECT DeviceObject,
default:
Status = STATUS_NOT_SUPPORTED;
+ BufferLength = 0;
}
Irp->IoStatus.Status = Status;
- if (NT_SUCCESS(Status))
- Irp->IoStatus.Information =
- IoStack->Parameters.QueryFile.Length - BufferLength;
- else
- Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Information = BufferLength;
+
IoCompleteRequest (Irp, IO_NO_INCREMENT);
return Status;
diff --git a/drivers/filesystems/npfs/npfs.c b/drivers/filesystems/npfs/npfs.c
index ed6d6005221..147f4107b52 100644
--- a/drivers/filesystems/npfs/npfs.c
+++ b/drivers/filesystems/npfs/npfs.c
@@ -70,6 +70,7 @@ DriverEntry(PDRIVER_OBJECT DriverObject,
/* initialize the device object */
DeviceObject->Flags |= DO_DIRECT_IO;
+ DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
/* initialize the device extension */
DeviceExtension = DeviceObject->DeviceExtension;
diff --git a/drivers/filesystems/npfs/rw.c b/drivers/filesystems/npfs/rw.c
index 7b14449b308..e5ef963b9ad 100644
--- a/drivers/filesystems/npfs/rw.c
+++ b/drivers/filesystems/npfs/rw.c
@@ -51,7 +51,9 @@ NpfsReadWriteCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
PNPFS_DEVICE_EXTENSION DeviceExt;
PIO_STACK_LOCATION IoStack;
PNPFS_CCB Ccb;
- BOOLEAN Complete = FALSE;
+ PLIST_ENTRY ListEntry;
+ PNPFS_THREAD_CONTEXT ThreadContext;
+ ULONG i;
DPRINT("NpfsReadWriteCancelRoutine(DeviceObject %p, Irp %p)\n", DeviceObject, Irp);
@@ -67,28 +69,50 @@ NpfsReadWriteCancelRoutine(IN PDEVICE_OBJECT DeviceObject,
switch(IoStack->MajorFunction)
{
case IRP_MJ_READ:
- if (Ccb->ReadRequestListHead.Flink != &Context->ListEntry)
+ ListEntry = DeviceExt->ThreadListHead.Flink;
+ while (ListEntry != &DeviceExt->ThreadListHead)
{
- /* we are not the first in the list, remove an complete us */
- RemoveEntryList(&Context->ListEntry);
- Complete = TRUE;
- }
- else
- {
- KeSetEvent(&Ccb->ReadEvent, IO_NO_INCREMENT, FALSE);
+ ThreadContext = CONTAINING_RECORD(ListEntry, NPFS_THREAD_CONTEXT, ListEntry);
+ /* Real events start at index 1 */
+ for (i = 1; i < ThreadContext->Count; i++)
+ {
+ if (ThreadContext->WaitIrpArray[i] == Irp)
+ {
+ ASSERT(ThreadContext->WaitObjectArray[i] == Context->WaitEvent);
+
+ ThreadContext->WaitIrpArray[i] = NULL;
+
+ RemoveEntryList(&Context->ListEntry);
+
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ KeSetEvent(&ThreadContext->Event, IO_NO_INCREMENT, FALSE);
+
+ ExReleaseFastMutex(&Ccb->DataListLock);
+ KeUnlockMutex(&DeviceExt->PipeListLock);
+
+ return;
+ }
+ }
+ ListEntry = ListEntry->Flink;
}
+
+ RemoveEntryList(&Context->ListEntry);
+
+ ExReleaseFastMutex(&Ccb->DataListLock);
+ KeUnlockMutex(&DeviceExt->PipeListLock);
+
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
default:
ASSERT(FALSE);
}
- ExReleaseFastMutex(&Ccb->DataListLock);
- KeUnlockMutex(&DeviceExt->PipeListLock);
- if (Complete)
- {
- Irp->IoStatus.Status = STATUS_CANCELLED;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
}
static VOID NTAPI
@@ -96,16 +120,11 @@ NpfsWaiterThread(PVOID InitContext)
{
PNPFS_THREAD_CONTEXT ThreadContext = (PNPFS_THREAD_CONTEXT) InitContext;
ULONG CurrentCount;
- ULONG Count = 0;
+ ULONG Count = 0, i;
PIRP Irp = NULL;
- PIRP NextIrp;
NTSTATUS Status;
- BOOLEAN Terminate = FALSE;
- BOOLEAN Cancel = FALSE;
PIO_STACK_LOCATION IoStack = NULL;
- PNPFS_CONTEXT Context;
- PNPFS_CONTEXT NextContext;
- PNPFS_CCB Ccb;
+ KIRQL OldIrql;
KeLockMutex(&ThreadContext->DeviceExt->PipeListLock);
@@ -113,29 +132,23 @@ NpfsWaiterThread(PVOID InitContext)
{
CurrentCount = ThreadContext->Count;
KeUnlockMutex(&ThreadContext->DeviceExt->PipeListLock);
- if (Irp)
+ IoAcquireCancelSpinLock(&OldIrql);
+ if (Irp && IoSetCancelRoutine(Irp, NULL) != NULL)
{
- if (Cancel)
+ IoReleaseCancelSpinLock(OldIrql);
+ IoStack = IoGetCurrentIrpStackLocation(Irp);
+ switch (IoStack->MajorFunction)
{
- Irp->IoStatus.Status = STATUS_CANCELLED;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
- else
- {
- switch (IoStack->MajorFunction)
- {
case IRP_MJ_READ:
NpfsRead(IoStack->DeviceObject, Irp);
break;
default:
ASSERT(FALSE);
- }
}
}
- if (Terminate)
+ else
{
- break;
+ IoReleaseCancelSpinLock(OldIrql);
}
Status = KeWaitForMultipleObjects(CurrentCount,
ThreadContext->WaitObjectArray,
@@ -150,7 +163,7 @@ NpfsWaiterThread(PVOID InitContext)
ASSERT(FALSE);
}
KeLockMutex(&ThreadContext->DeviceExt->PipeListLock);
- Count = Status - STATUS_SUCCESS;
+ Count = Status - STATUS_WAIT_0;
ASSERT (Count < CurrentCount);
if (Count > 0)
{
@@ -159,47 +172,31 @@ NpfsWaiterThread(PVOID InitContext)
ThreadContext->DeviceExt->EmptyWaiterCount++;
ThreadContext->WaitObjectArray[Count] = ThreadContext->WaitObjectArray[ThreadContext->Count];
ThreadContext->WaitIrpArray[Count] = ThreadContext->WaitIrpArray[ThreadContext->Count];
-
- Cancel = (NULL == IoSetCancelRoutine(Irp, NULL));
- Context = (PNPFS_CONTEXT)&Irp->Tail.Overlay.DriverContext;
- IoStack = IoGetCurrentIrpStackLocation(Irp);
-
- if (Cancel)
- {
- Ccb = IoStack->FileObject->FsContext2;
- ExAcquireFastMutex(&Ccb->DataListLock);
- RemoveEntryList(&Context->ListEntry);
- switch (IoStack->MajorFunction)
- {
- case IRP_MJ_READ:
- if (!IsListEmpty(&Ccb->ReadRequestListHead))
- {
- /* put the next request on the wait list */
- NextContext = CONTAINING_RECORD(Ccb->ReadRequestListHead.Flink, NPFS_CONTEXT, ListEntry);
- ThreadContext->WaitObjectArray[ThreadContext->Count] = NextContext->WaitEvent;
- NextIrp = CONTAINING_RECORD(NextContext, IRP, Tail.Overlay.DriverContext);
- ThreadContext->WaitIrpArray[ThreadContext->Count] = NextIrp;
- ThreadContext->Count++;
- ThreadContext->DeviceExt->EmptyWaiterCount--;
- }
- break;
- default:
- ASSERT(FALSE);
- }
- ExReleaseFastMutex(&Ccb->DataListLock);
- }
}
else
{
- /* someone has add a new wait request */
+ /* someone has add a new wait request or cancelled an old one */
Irp = NULL;
+
+ /* Look for cancelled requests */
+ for (i = 1; i < ThreadContext->Count; i++)
+ {
+ if (ThreadContext->WaitIrpArray[i] == NULL)
+ {
+ ThreadContext->Count--;
+ ThreadContext->DeviceExt->EmptyWaiterCount++;
+ ThreadContext->WaitObjectArray[i] = ThreadContext->WaitObjectArray[ThreadContext->Count];
+ ThreadContext->WaitIrpArray[i] = ThreadContext->WaitIrpArray[ThreadContext->Count];
+ }
+ }
}
if (ThreadContext->Count == 1 && ThreadContext->DeviceExt->EmptyWaiterCount >= MAXIMUM_WAIT_OBJECTS)
{
/* it exist an other thread with empty wait slots, we can remove our thread from the list */
RemoveEntryList(&ThreadContext->ListEntry);
ThreadContext->DeviceExt->EmptyWaiterCount -= MAXIMUM_WAIT_OBJECTS - 1;
- Terminate = TRUE;
+ KeUnlockMutex(&ThreadContext->DeviceExt->PipeListLock);
+ break;
}
}
ExFreePool(ThreadContext);
@@ -332,10 +329,7 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
if ((Ccb->OtherSide == NULL) && (Ccb->ReadDataAvailable == 0))
{
if (Ccb->PipeState == FILE_PIPE_CONNECTED_STATE)
- {
- DPRINT("File pipe broken\n");
Status = STATUS_PIPE_BROKEN;
- }
else if (Ccb->PipeState == FILE_PIPE_LISTENING_STATE)
Status = STATUS_PIPE_LISTENING;
else if (Ccb->PipeState == FILE_PIPE_DISCONNECTED_STATE)
@@ -443,7 +437,7 @@ NpfsRead(IN PDEVICE_OBJECT DeviceObject,
{
break;
}
- if ((Ccb->PipeState != FILE_PIPE_CONNECTED_STATE) && (Ccb->ReadDataAvailable == 0))
+ if (((Ccb->PipeState != FILE_PIPE_CONNECTED_STATE) || (!Ccb->OtherSide)) && (Ccb->ReadDataAvailable == 0))
{
DPRINT("PipeState: %x\n", Ccb->PipeState);
Status = STATUS_PIPE_BROKEN;
@@ -787,7 +781,16 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
}
Status = STATUS_SUCCESS;
- Buffer = MmGetSystemAddressForMdl (Irp->MdlAddress);
+ Buffer = MmGetSystemAddressForMdlSafe (Irp->MdlAddress, NormalPagePriority);
+
+ if (!Buffer)
+ {
+ DPRINT("MmGetSystemAddressForMdlSafe failed\n");
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ Length = 0;
+ goto done;
+
+ }
ExAcquireFastMutex(&ReaderCcb->DataListLock);
@@ -800,13 +803,13 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
{
if ((ReaderCcb->WriteQuotaAvailable == 0))
{
- KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
- if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
+ if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE || !Ccb->OtherSide)
{
Status = STATUS_PIPE_BROKEN;
ExReleaseFastMutex(&ReaderCcb->DataListLock);
goto done;
}
+ KeSetEvent(&ReaderCcb->ReadEvent, IO_NO_INCREMENT, FALSE);
ExReleaseFastMutex(&ReaderCcb->DataListLock);
DPRINT("Write Waiting for buffer space (%S)\n", Fcb->PipeName.Buffer);
@@ -830,20 +833,15 @@ NpfsWrite(PDEVICE_OBJECT DeviceObject,
* It's possible that the event was signaled because the
* other side of pipe was closed.
*/
- if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE)
+ if (Ccb->PipeState != FILE_PIPE_CONNECTED_STATE || !Ccb->OtherSide)
{
DPRINT("PipeState: %x\n", Ccb->PipeState);
Status = STATUS_PIPE_BROKEN;
goto done;
}
/* Check that the pipe has not been closed */
- if (ReaderCcb->PipeState != FILE_PIPE_CONNECTED_STATE)
+ if (ReaderCcb->PipeState != FILE_PIPE_CONNECTED_STATE || !ReaderCcb->OtherSide)
{
- /* If the other side is valid, fire event */
- if (Ccb)
- {
- KeResetEvent(&Ccb->WriteEvent);
- }
Status = STATUS_PIPE_BROKEN;
goto done;
}
diff --git a/drivers/filesystems/npfs/volume.c b/drivers/filesystems/npfs/volume.c
index 4241c88ec3d..63eb0773b91 100644
--- a/drivers/filesystems/npfs/volume.c
+++ b/drivers/filesystems/npfs/volume.c
@@ -23,12 +23,15 @@ NpfsQueryFsDeviceInformation(PFILE_FS_DEVICE_INFORMATION FsDeviceInfo,
DPRINT("FsDeviceInfo = %p\n", FsDeviceInfo);
if (*BufferLength < sizeof(FILE_FS_DEVICE_INFORMATION))
+ {
+ *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION);
return STATUS_BUFFER_OVERFLOW;
+ }
FsDeviceInfo->DeviceType = FILE_DEVICE_NAMED_PIPE;
FsDeviceInfo->Characteristics = 0;
- *BufferLength -= sizeof(FILE_FS_DEVICE_INFORMATION);
+ *BufferLength = sizeof(FILE_FS_DEVICE_INFORMATION);
DPRINT("NpfsQueryFsDeviceInformation() finished.\n");
@@ -44,7 +47,10 @@ NpfsQueryFsAttributeInformation(PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo,
DPRINT("FsAttributeInfo = %p\n", FsAttributeInfo);
if (*BufferLength < sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8)
+ {
+ *BufferLength = (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
return STATUS_BUFFER_OVERFLOW;
+ }
FsAttributeInfo->FileSystemAttributes = FILE_CASE_PRESERVED_NAMES;
FsAttributeInfo->MaximumComponentNameLength = 255;
@@ -53,7 +59,7 @@ NpfsQueryFsAttributeInformation(PFILE_FS_ATTRIBUTE_INFORMATION FsAttributeInfo,
L"NPFS");
DPRINT("NpfsQueryFsAttributeInformation() finished.\n");
- *BufferLength -= (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
+ *BufferLength = (sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 8);
return STATUS_SUCCESS;
}
@@ -102,10 +108,8 @@ NpfsQueryVolumeInformation(PDEVICE_OBJECT DeviceObject,
}
Irp->IoStatus.Status = Status;
- if (NT_SUCCESS(Status))
- Irp->IoStatus.Information = Stack->Parameters.QueryVolume.Length - BufferLength;
- else
- Irp->IoStatus.Information = 0;
+ Irp->IoStatus.Information = BufferLength;
+
IoCompleteRequest(Irp,
IO_NO_INCREMENT);
diff --git a/drivers/ksfilter/ks/api.c b/drivers/ksfilter/ks/api.c
index 2067de57648..64c341c20b3 100644
--- a/drivers/ksfilter/ks/api.c
+++ b/drivers/ksfilter/ks/api.c
@@ -530,7 +530,7 @@ KsAllocateDeviceHeader(
return STATUS_INVALID_PARAMETER;
/* allocate a device header */
- Header = ExAllocatePoolWithTag(PagedPool, sizeof(KSIDEVICE_HEADER), TAG_DEVICE_HEADER);
+ Header = AllocateItem(PagedPool, sizeof(KSIDEVICE_HEADER));
/* check for success */
if (!Header)
@@ -597,7 +597,7 @@ KsFreeDeviceHeader(
return;
KspFreeCreateItems(&Header->ItemList);
- ExFreePoolWithTag(Header, TAG_DEVICE_HEADER);
+ FreeItem(Header);
}
/*
@@ -641,7 +641,7 @@ KsAllocateObjectHeader(
/* check for an file object */
/* allocate the object header */
- ObjectHeader = ExAllocatePoolWithTag(NonPagedPool, sizeof(KSIOBJECT_HEADER), TAG_DEVICE_HEADER);
+ ObjectHeader = AllocateItem(NonPagedPool, sizeof(KSIOBJECT_HEADER));
if (!ObjectHeader)
return STATUS_INSUFFICIENT_RESOURCES;
@@ -659,10 +659,10 @@ KsAllocateObjectHeader(
{
/* copy object class */
ObjectHeader->ObjectClass.MaximumLength = IoStack->FileObject->FileName.MaximumLength;
- ObjectHeader->ObjectClass.Buffer = ExAllocatePoolWithTag(NonPagedPool, ObjectHeader->ObjectClass.MaximumLength, TAG_DEVICE_HEADER);
+ ObjectHeader->ObjectClass.Buffer = AllocateItem(NonPagedPool, ObjectHeader->ObjectClass.MaximumLength);
if (!ObjectHeader->ObjectClass.Buffer)
{
- ExFreePoolWithTag(ObjectHeader, TAG_DEVICE_HEADER);
+ FreeItem(ObjectHeader);
return STATUS_INSUFFICIENT_RESOURCES;
}
RtlCopyUnicodeString(&ObjectHeader->ObjectClass, &IoStack->FileObject->FileName);
@@ -726,7 +726,7 @@ KsFreeObjectHeader(
if (ObjectHeader->ObjectClass.Buffer)
{
/* release object class buffer */
- ExFreePoolWithTag(ObjectHeader->ObjectClass.Buffer, TAG_DEVICE_HEADER);
+ FreeItem(ObjectHeader->ObjectClass.Buffer);
}
if (ObjectHeader->Unknown)
@@ -739,7 +739,7 @@ KsFreeObjectHeader(
KspFreeCreateItems(&ObjectHeader->ItemList);
/* free object header */
- ExFreePoolWithTag(ObjectHeader, TAG_DEVICE_HEADER);
+ FreeItem(ObjectHeader);
}
@@ -914,11 +914,11 @@ KsAllocateObjectCreateItem(
if (AllocateEntry)
{
/* allocate create item */
- Item = ExAllocatePool(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
+ Item = AllocateItem(NonPagedPool, sizeof(KSOBJECT_CREATE_ITEM));
if (!Item)
{
/* no memory */
- ExFreePool(CreateEntry);
+ FreeItem(CreateEntry);
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -931,7 +931,7 @@ KsAllocateObjectCreateItem(
Item->ObjectClass.MaximumLength = CreateItem->ObjectClass.MaximumLength;
/* copy object class */
- Item->ObjectClass.Buffer = ExAllocatePool(NonPagedPool, Item->ObjectClass.MaximumLength);
+ Item->ObjectClass.Buffer = AllocateItem(NonPagedPool, Item->ObjectClass.MaximumLength);
if (!Item->ObjectClass.Buffer)
{
/* release resources */
@@ -1747,7 +1747,7 @@ KsCreateBusEnumObject(
Length = wcslen(BusIdentifier) * sizeof(WCHAR);
Length += sizeof(BUS_ENUM_DEVICE_EXTENSION);
- BusDeviceExtension = ExAllocatePool(NonPagedPool, Length);
+ BusDeviceExtension = AllocateItem(NonPagedPool, Length);
if (!BusDeviceExtension)
{
/* not enough memory */
@@ -1772,12 +1772,12 @@ KsCreateBusEnumObject(
BusDeviceExtension->ServicePath.Length = 0;
BusDeviceExtension->ServicePath.MaximumLength = Length;
- BusDeviceExtension->ServicePath.Buffer = ExAllocatePool(NonPagedPool, Length);
+ BusDeviceExtension->ServicePath.Buffer = AllocateItem(NonPagedPool, Length);
if (!BusDeviceExtension->ServicePath.Buffer)
{
/* not enough memory */
- ExFreePool(BusDeviceExtension);
+ FreeItem(BusDeviceExtension);
return STATUS_INSUFFICIENT_RESOURCES;
}
@@ -1798,8 +1798,8 @@ KsCreateBusEnumObject(
/* check for success */
if (!NT_SUCCESS(Status))
{
- ExFreePool(BusDeviceExtension->ServicePath.Buffer);
- ExFreePool(BusDeviceExtension);
+ FreeItem(BusDeviceExtension->ServicePath.Buffer);
+ FreeItem(BusDeviceExtension);
return Status;
}
@@ -1808,8 +1808,8 @@ KsCreateBusEnumObject(
if (!NT_SUCCESS(Status))
{
- ExFreePool(BusDeviceExtension->ServicePath.Buffer);
- ExFreePool(BusDeviceExtension);
+ FreeItem(BusDeviceExtension->ServicePath.Buffer);
+ FreeItem(BusDeviceExtension);
return Status;
}
@@ -1836,8 +1836,8 @@ KsCreateBusEnumObject(
}
/* free device extension */
- ExFreePool(BusDeviceExtension->ServicePath.Buffer);
- ExFreePool(BusDeviceExtension);
+ FreeItem(BusDeviceExtension->ServicePath.Buffer);
+ FreeItem(BusDeviceExtension);
return STATUS_DEVICE_REMOVED;
}
@@ -2795,7 +2795,7 @@ KsRegisterFilterWithNoKSPins(
}
/* free the symbolic link list */
- ExFreePool(SymbolicLinkList);
+ FreeItem(SymbolicLinkList);
}
return Status;
diff --git a/drivers/ksfilter/ks/connectivity.c b/drivers/ksfilter/ks/connectivity.c
index bcc55cc6f1f..4993849c15a 100644
--- a/drivers/ksfilter/ks/connectivity.c
+++ b/drivers/ksfilter/ks/connectivity.c
@@ -239,7 +239,7 @@ KspReadMediaCategory(
/* allocate buffer for the registry key */
Path.Length = 0;
Path.MaximumLength = MediaPath.MaximumLength + GuidString.MaximumLength;
- Path.Buffer = ExAllocatePool(NonPagedPool, Path.MaximumLength);
+ Path.Buffer = AllocateItem(NonPagedPool, Path.MaximumLength);
if (!Path.Buffer)
{
/* not enough memory */
@@ -262,7 +262,7 @@ KspReadMediaCategory(
DPRINT("ZwOpenKey() status 0x%08lx %S\n", Status, Path.Buffer);
/* free path buffer */
- ExFreePool(Path.Buffer);
+ FreeItem(Path.Buffer);
/* check for success */
if (!NT_SUCCESS(Status))
@@ -281,7 +281,7 @@ KspReadMediaCategory(
}
/* allocate buffer to read key info */
- KeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePool(NonPagedPool, Size);
+ KeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION) AllocateItem(NonPagedPool, Size);
if (!KeyInfo)
{
/* not enough memory */
@@ -298,7 +298,7 @@ KspReadMediaCategory(
if (!NT_SUCCESS(Status))
{
/* failed to read key */
- ExFreePool(KeyInfo);
+ FreeItem(KeyInfo);
return Status;
}
@@ -545,13 +545,13 @@ KspPinPropertyHandler(
if (KeyInfo->DataLength + sizeof(WCHAR) > IoStack->Parameters.DeviceIoControl.OutputBufferLength)
{
Status = STATUS_BUFFER_OVERFLOW;
- ExFreePool(KeyInfo);
+ FreeItem(KeyInfo);
break;
}
RtlMoveMemory(Irp->UserBuffer, &KeyInfo->Data, KeyInfo->DataLength);
((LPWSTR)Irp->UserBuffer)[KeyInfo->DataLength / sizeof(WCHAR)] = L'\0';
- ExFreePool(KeyInfo);
+ FreeItem(KeyInfo);
break;
case KSPROPERTY_PIN_PROPOSEDATAFORMAT:
Size = sizeof(KSDATAFORMAT);
diff --git a/drivers/ksfilter/ks/event.c b/drivers/ksfilter/ks/event.c
index 5ec2e85e8e5..aa3b5ef4e9a 100644
--- a/drivers/ksfilter/ks/event.c
+++ b/drivers/ksfilter/ks/event.c
@@ -292,7 +292,7 @@ KspEnableEvent(
else
{
/* allocate it from nonpaged pool */
- EventEntry = ExAllocatePool(NonPagedPool, Size);
+ EventEntry = AllocateItem(NonPagedPool, Size);
}
if (!EventEntry)
@@ -529,7 +529,7 @@ KsDiscardEvent(
}
/* free event entry */
- ExFreePool(EventEntry);
+ FreeItem(EventEntry);
}
diff --git a/drivers/ksfilter/ks/image.c b/drivers/ksfilter/ks/image.c
index f6c6bc11ffe..dbdeca02501 100644
--- a/drivers/ksfilter/ks/image.c
+++ b/drivers/ksfilter/ks/image.c
@@ -45,7 +45,7 @@ KsLoadResource(
if (NT_SUCCESS(Status))
{
/* allocate resource buffer */
- Result = ExAllocatePool(PoolType, Size);
+ Result = AllocateItem(PoolType, Size);
if (Result)
{
/* copy resource */
@@ -75,7 +75,7 @@ KsLoadResource(
if (Result)
{
/* free resource buffer in case of a failure */
- ExFreePool(Result);
+ FreeItem(Result);
}
}
/* done */
@@ -127,7 +127,7 @@ KsGetImageNameAndResourceId(
/* allocate image name buffer */
ImageName->MaximumLength = sizeof(ImagePath) + ImageLength;
- ImageName->Buffer = ExAllocatePool(PagedPool, ImageName->MaximumLength);
+ ImageName->Buffer = AllocateItem(PagedPool, ImageName->MaximumLength);
/* check for success */
if (!ImageName->Buffer)
@@ -145,7 +145,7 @@ KsGetImageNameAndResourceId(
if (!NT_SUCCESS(Status))
{
/* unexpected error */
- ExFreePool(ImageName->Buffer);
+ FreeItem(ImageName->Buffer);
return Status;
}
@@ -154,13 +154,13 @@ KsGetImageNameAndResourceId(
Status = KspQueryRegValue(RegKey, L"ResourceId", NULL, &ImageLength, ValueType);
/* allocate resource id buffer*/
- *ResourceId = (ULONG_PTR)ExAllocatePool(PagedPool, ImageLength);
+ *ResourceId = (ULONG_PTR)AllocateItem(PagedPool, ImageLength);
/* check for success */
if (!*ResourceId)
{
/* insufficient memory */
- ExFreePool(ImageName->Buffer);
+ FreeItem(ImageName->Buffer);
return STATUS_INSUFFICIENT_RESOURCES;
}
/* now query for resource id */
@@ -169,8 +169,8 @@ KsGetImageNameAndResourceId(
if (!NT_SUCCESS(Status))
{
/* unexpected error */
- ExFreePool(ImageName->Buffer);
- ExFreePool((PVOID)*ResourceId);
+ FreeItem(ImageName->Buffer);
+ FreeItem((PVOID)*ResourceId);
}
/* return result */
@@ -209,7 +209,7 @@ KsMapModuleName(
/* initialize subkey buffer */
SubKeyName.Length = 0;
SubKeyName.MaximumLength = Modules.MaximumLength + ModuleName->MaximumLength;
- SubKeyName.Buffer = ExAllocatePool(PagedPool, SubKeyName.MaximumLength);
+ SubKeyName.Buffer = AllocateItem(PagedPool, SubKeyName.MaximumLength);
/* check for success */
if (!SubKeyName.Buffer)
@@ -240,7 +240,7 @@ KsMapModuleName(
}
/* free subkey string */
- ExFreePool(SubKeyName.Buffer);
+ FreeItem(SubKeyName.Buffer);
/* close device key */
ZwClose(hKey);
diff --git a/drivers/ksfilter/ks/irp.c b/drivers/ksfilter/ks/irp.c
index 0c6036e2059..32ba84d9fd1 100644
--- a/drivers/ksfilter/ks/irp.c
+++ b/drivers/ksfilter/ks/irp.c
@@ -101,7 +101,7 @@ KsDispatchSetSecurity(
if (NT_SUCCESS(Status))
{
/* free old descriptor */
- ExFreePool(Descriptor);
+ FreeItem(Descriptor);
/* mark create item as changed */
CreateItem->Flags |= KSCREATE_ITEM_SECURITYCHANGED;
@@ -896,7 +896,7 @@ ProbeMdl:
if (Length && ( (!HeaderSize) || (Length % HeaderSize == 0) || ((ProbeFlags & KSPROBE_ALLOWFORMATCHANGE) && (Length == sizeof(KSSTREAM_HEADER))) ) )
{
/* allocate stream header buffer */
- Irp->AssociatedIrp.SystemBuffer = ExAllocatePool(NonPagedPool, Length);
+ Irp->AssociatedIrp.SystemBuffer = AllocateItem(NonPagedPool, Length);
if (!Irp->AssociatedIrp.SystemBuffer)
{
diff --git a/drivers/ksfilter/ks/misc.c b/drivers/ksfilter/ks/misc.c
index dc814eae01e..d6b1e26078a 100644
--- a/drivers/ksfilter/ks/misc.c
+++ b/drivers/ksfilter/ks/misc.c
@@ -26,7 +26,6 @@ VOID
FreeItem(
IN PVOID Item)
{
-
ExFreePool(Item);
}
diff --git a/drivers/ksfilter/ks/pin.c b/drivers/ksfilter/ks/pin.c
index 019e5ce6023..a6caeb30de0 100644
--- a/drivers/ksfilter/ks/pin.c
+++ b/drivers/ksfilter/ks/pin.c
@@ -1332,7 +1332,9 @@ IKsPin_PrepareStreamHeader(
else
StreamPointer->StreamPointer.Offset = &StreamPointer->StreamPointer.OffsetOut;
+#ifndef _WIN64
StreamPointer->StreamPointer.Offset->Alignment = 0;
+#endif
StreamPointer->StreamPointer.Offset->Count = 0;
StreamPointer->StreamPointer.Offset->Data = NULL;
StreamPointer->StreamPointer.Offset->Remaining = 0;
@@ -1352,7 +1354,9 @@ IKsPin_PrepareStreamHeader(
/* FIXME */
ASSERT(Length);
+#ifndef _WIN64
StreamPointer->StreamPointer.Offset->Alignment = 0;
+#endif
StreamPointer->StreamPointer.Context = NULL;
StreamPointer->StreamPointer.Pin = &This->Pin;
StreamPointer->StreamPointer.Offset->Count = Length;
@@ -1543,7 +1547,7 @@ KsStreamPointerClone(
IKsPinImpl * This;
PKSISTREAM_POINTER CurFrame;
PKSISTREAM_POINTER NewFrame;
- ULONG RefCount;
+ ULONG_PTR RefCount;
NTSTATUS Status;
ULONG Size;
@@ -1556,13 +1560,13 @@ KsStreamPointerClone(
Size = sizeof(KSISTREAM_POINTER) + ContextSize;
/* allocate new stream pointer */
- NewFrame = (PKSISTREAM_POINTER)ExAllocatePool(NonPagedPool, Size);
+ NewFrame = (PKSISTREAM_POINTER)AllocateItem(NonPagedPool, Size);
if (!NewFrame)
return STATUS_INSUFFICIENT_RESOURCES;
/* get current irp stack location */
- RefCount = (ULONG)CurFrame->Irp->Tail.Overlay.DriverContext[0];
+ RefCount = (ULONG_PTR)CurFrame->Irp->Tail.Overlay.DriverContext[0];
/* increment reference count */
RefCount++;
diff --git a/drivers/ksfilter/ks/topology.c b/drivers/ksfilter/ks/topology.c
index cc4a88880e7..e507eb77fab 100644
--- a/drivers/ksfilter/ks/topology.c
+++ b/drivers/ksfilter/ks/topology.c
@@ -30,7 +30,7 @@ KspCreateObjectType(
Name.MaximumLength = wcslen(ObjectType) * sizeof(WCHAR) + CreateParametersSize + 2 * sizeof(WCHAR);
Name.MaximumLength += sizeof(WCHAR);
/* acquire request buffer */
- Name.Buffer = ExAllocatePool(NonPagedPool, Name.MaximumLength);
+ Name.Buffer = AllocateItem(NonPagedPool, Name.MaximumLength);
/* check for success */
if (!Name.Buffer)
{
@@ -68,7 +68,7 @@ KspCreateObjectType(
IO_NO_PARAMETER_CHECKING | IO_FORCE_ACCESS_CHECK);
/* free request buffer */
- ExFreePool(Name.Buffer);
+ FreeItem(Name.Buffer);
return Status;
}
@@ -200,29 +200,32 @@ KsTopologyPropertyHandler(
KeyName.Length = 0;
KeyName.MaximumLength = LocalMachine.Length + GuidString.Length + sizeof(WCHAR);
- KeyName.Buffer = ExAllocatePool(PagedPool, KeyName.MaximumLength);
+ KeyName.Buffer = AllocateItem(PagedPool, KeyName.MaximumLength);
if (!KeyName.Buffer)
{
Irp->IoStatus.Information = 0;
Status = STATUS_INSUFFICIENT_RESOURCES;
+ RtlFreeUnicodeString(&GuidString);
break;
}
RtlAppendUnicodeStringToString(&KeyName, &LocalMachine);
RtlAppendUnicodeStringToString(&KeyName, &GuidString);
+ RtlFreeUnicodeString(&GuidString);
InitializeObjectAttributes(&ObjectAttributes, &KeyName, OBJ_CASE_INSENSITIVE, NULL, NULL);
Status = ZwOpenKey(&hKey, GENERIC_READ, &ObjectAttributes);
+ FreeItem(KeyName.Buffer);
+
if (!NT_SUCCESS(Status))
{
DPRINT1("ZwOpenKey() failed with status 0x%08lx\n", Status);
- ExFreePool(KeyName.Buffer);
Irp->IoStatus.Information = 0;
break;
}
- ExFreePool(KeyName.Buffer);
+
Status = ZwQueryValueKey(hKey, &Name, KeyValuePartialInformation, NULL, 0, &Size);
if (!NT_SUCCESS(Status) && Status != STATUS_BUFFER_TOO_SMALL)
{
@@ -231,7 +234,8 @@ KsTopologyPropertyHandler(
break;
}
- KeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION) ExAllocatePool(NonPagedPool, Size);
+ ASSERT(Size);
+ KeyInfo = (PKEY_VALUE_PARTIAL_INFORMATION) AllocateItem(NonPagedPool, Size);
if (!KeyInfo)
{
Status = STATUS_NO_MEMORY;
@@ -241,7 +245,7 @@ KsTopologyPropertyHandler(
Status = ZwQueryValueKey(hKey, &Name, KeyValuePartialInformation, (PVOID)KeyInfo, Size, &Size);
if (!NT_SUCCESS(Status))
{
- ExFreePool(KeyInfo);
+ FreeItem(KeyInfo);
ZwClose(hKey);
Irp->IoStatus.Information = 0;
break;
@@ -252,14 +256,14 @@ KsTopologyPropertyHandler(
{
Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR);
Status = STATUS_MORE_ENTRIES;
- ExFreePool(KeyInfo);
+ FreeItem(KeyInfo);
break;
}
RtlMoveMemory(Irp->UserBuffer, &KeyInfo->Data, KeyInfo->DataLength);
((LPWSTR)Irp->UserBuffer)[KeyInfo->DataLength / sizeof(WCHAR)] = L'\0';
Irp->IoStatus.Information = KeyInfo->DataLength + sizeof(WCHAR);
- ExFreePool(KeyInfo);
+ FreeItem(KeyInfo);
break;
default:
Irp->IoStatus.Information = 0;
diff --git a/drivers/network/afd/afd/connect.c b/drivers/network/afd/afd/connect.c
index 3f47a05941a..28fcfada857 100644
--- a/drivers/network/afd/afd/connect.c
+++ b/drivers/network/afd/afd/connect.c
@@ -247,6 +247,8 @@ NTSTATUS MakeSocketIntoConnection( PAFD_FCB FCB ) {
if( Status == STATUS_PENDING ) Status = STATUS_SUCCESS;
FCB->PollState |= AFD_EVENT_CONNECT | AFD_EVENT_SEND;
+ FCB->PollStatus[FD_CONNECT_BIT] = STATUS_SUCCESS;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
return Status;
@@ -291,6 +293,7 @@ static NTSTATUS NTAPI StreamSocketConnectComplete
if( !NT_SUCCESS(Irp->IoStatus.Status) ) {
FCB->PollState |= AFD_EVENT_CONNECT_FAIL;
+ FCB->PollStatus[FD_CONNECT_BIT] = Irp->IoStatus.Status;
AFD_DbgPrint(MID_TRACE,("Going to bound state\n"));
FCB->State = SOCKET_STATE_BOUND;
PollReeval( FCB->DeviceExt, FCB->FileObject );
diff --git a/drivers/network/afd/afd/listen.c b/drivers/network/afd/afd/listen.c
index 5a1b8f55bbb..f6eb1104210 100644
--- a/drivers/network/afd/afd/listen.c
+++ b/drivers/network/afd/afd/listen.c
@@ -193,11 +193,10 @@ static NTSTATUS NTAPI ListenComplete
/* Trigger a select return if appropriate */
if( !IsListEmpty( &FCB->PendingConnections ) ) {
FCB->PollState |= AFD_EVENT_ACCEPT;
- } else {
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
- }
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
SocketStateUnlock( FCB );
@@ -293,12 +292,13 @@ NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Completed a wait for accept\n"));
- if ( IsListEmpty( &FCB->PendingConnections ) )
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
- else
+ if ( !IsListEmpty( &FCB->PendingConnections ) )
+ {
FCB->PollState |= AFD_EVENT_ACCEPT;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
SocketStateUnlock( FCB );
return Status;
@@ -402,13 +402,12 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
ExFreePool( PendingConnObj );
- if( IsListEmpty( &FCB->PendingConnections ) ) {
- FCB->PollState &= ~AFD_EVENT_ACCEPT;
- } else {
+ if( !IsListEmpty( &FCB->PendingConnections ) ) {
FCB->PollState |= AFD_EVENT_ACCEPT;
- }
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_ACCEPT_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_ACCEPT;
SocketStateUnlock( FCB );
return Status;
diff --git a/drivers/network/afd/afd/main.c b/drivers/network/afd/afd/main.c
index bcbb2f56603..95da3c054bf 100644
--- a/drivers/network/afd/afd/main.c
+++ b/drivers/network/afd/afd/main.c
@@ -314,6 +314,7 @@ AfdCreateSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
/* A datagram socket is always sendable */
FCB->PollState |= AFD_EVENT_SEND;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
@@ -377,6 +378,7 @@ AfdCloseSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
FCB->State = SOCKET_STATE_CLOSED;
FCB->PollState = AFD_EVENT_CLOSE;
+ FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS; //I think we can return success here
PollReeval( FCB->DeviceExt, FCB->FileObject );
InFlightRequest[0] = &FCB->ListenIrp;
@@ -542,6 +544,7 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
ExFreePool( ConnectionReturnInfo );
FCB->PollState |= AFD_EVENT_DISCONNECT;
+ FCB->PollStatus[FD_CLOSE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
Status = STATUS_INVALID_PARAMETER;
diff --git a/drivers/network/afd/afd/read.c b/drivers/network/afd/afd/read.c
index dccfa559ba8..f98fd17b3aa 100644
--- a/drivers/network/afd/afd/read.c
+++ b/drivers/network/afd/afd/read.c
@@ -46,6 +46,7 @@ static NTSTATUS RefillSocketBuffer( PAFD_FCB FCB ) {
{
/* The socket has been closed */
FCB->PollState |= AFD_EVENT_DISCONNECT;
+ FCB->PollStatus[FD_CLOSE_BIT] = Status;
FCB->Overread = TRUE;
Status = STATUS_FILE_CLOSED;
}
@@ -53,6 +54,7 @@ static NTSTATUS RefillSocketBuffer( PAFD_FCB FCB ) {
{
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
FCB->PollState |= AFD_EVENT_RECEIVE;
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
}
PollReeval( FCB->DeviceExt, FCB->FileObject );
}
@@ -189,10 +191,10 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
if( FCB->Recv.Content ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
AFD_DbgPrint(MID_TRACE,("RetStatus for irp %x is %x\n", Irp, RetStatus));
@@ -538,10 +540,10 @@ PacketSocketRecvComplete(
if( !IsListEmpty( &FCB->DatagramList ) ) {
AFD_DbgPrint(MID_TRACE,("Signalling\n"));
FCB->PollState |= AFD_EVENT_RECEIVE;
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
} else
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
/* Now relaunch the datagram request */
@@ -608,12 +610,12 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
Status = Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
Irp->IoStatus.Information = DatagramRecv->Len;
- if( IsListEmpty( &FCB->DatagramList ) )
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
- else
+ if( !IsListEmpty( &FCB->DatagramList ) ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
@@ -624,12 +626,12 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
( FCB, Irp, DatagramRecv,
(PUINT)&Irp->IoStatus.Information );
- if( IsListEmpty( &FCB->DatagramList ) )
- FCB->PollState &= ~AFD_EVENT_RECEIVE;
- else
+ if( !IsListEmpty( &FCB->DatagramList ) ) {
FCB->PollState |= AFD_EVENT_RECEIVE;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
+ FCB->PollStatus[FD_READ_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
+ } else
+ FCB->PollState &= ~AFD_EVENT_RECEIVE;
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
@@ -640,12 +642,10 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
Status = STATUS_CANT_WAIT;
FCB->PollState &= ~AFD_EVENT_RECEIVE;
- PollReeval( FCB->DeviceExt, FCB->FileObject );
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
return UnlockAndMaybeComplete( FCB, Status, Irp, 0 );
} else {
FCB->PollState &= ~AFD_EVENT_RECEIVE;
- PollReeval( FCB->DeviceExt, FCB->FileObject );
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
}
}
diff --git a/drivers/network/afd/afd/select.c b/drivers/network/afd/afd/select.c
index 4cdbcdffb4a..dd334d343a8 100644
--- a/drivers/network/afd/afd/select.c
+++ b/drivers/network/afd/afd/select.c
@@ -296,8 +296,11 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
FCB->EventSelect = NULL;
else
FCB->EventSelectTriggers = EventSelectInfo->Events;
- } else
- Status = STATUS_INVALID_PARAMETER;
+ } else {
+ FCB->EventSelect = NULL;
+ FCB->EventSelectTriggers = 0;
+ Status = STATUS_SUCCESS;
+ }
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
@@ -325,7 +328,9 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
}
EnumReq->PollEvents = FCB->PollState;
- RtlZeroMemory( EnumReq->EventStatus, sizeof(EnumReq->EventStatus) );
+ RtlCopyMemory( EnumReq->EventStatus,
+ FCB->PollStatus,
+ sizeof(EnumReq->EventStatus) );
return UnlockAndMaybeComplete( FCB, STATUS_SUCCESS, Irp,
0 );
diff --git a/drivers/network/afd/afd/write.c b/drivers/network/afd/afd/write.c
index aa1c9e371a5..7506489be8e 100644
--- a/drivers/network/afd/afd/write.c
+++ b/drivers/network/afd/afd/write.c
@@ -142,10 +142,10 @@ static NTSTATUS NTAPI SendComplete
FCB );
} else {
FCB->PollState |= AFD_EVENT_SEND;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
+ PollReeval( FCB->DeviceExt, FCB->FileObject );
}
- PollReeval( FCB->DeviceExt, FCB->FileObject );
-
if( TotalBytesCopied > 0 ) {
UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE );
@@ -186,6 +186,7 @@ static NTSTATUS NTAPI PacketSocketSendComplete
/* Request is not in flight any longer */
FCB->PollState |= AFD_EVENT_SEND;
+ FCB->PollStatus[FD_WRITE_BIT] = STATUS_SUCCESS;
PollReeval( FCB->DeviceExt, FCB->FileObject );
if( FCB->State == SOCKET_STATE_CLOSED ) {
@@ -391,10 +392,6 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
- FCB->PollState &= ~AFD_EVENT_SEND;
-
- PollReeval( FCB->DeviceExt, FCB->FileObject );
-
/* Check that the socket is bound */
if( FCB->State != SOCKET_STATE_BOUND )
return UnlockAndMaybeComplete
@@ -425,6 +422,8 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
/* Check the size of the Address given ... */
if( NT_SUCCESS(Status) ) {
+ FCB->PollState &= ~AFD_EVENT_SEND;
+
Status = TdiSendDatagram
( &FCB->SendIrp.InFlightRequest,
FCB->AddressFile.Object,
diff --git a/drivers/network/afd/include/afd.h b/drivers/network/afd/include/afd.h
index 6b5e875ec9b..ac3a286cd6c 100644
--- a/drivers/network/afd/include/afd.h
+++ b/drivers/network/afd/include/afd.h
@@ -192,6 +192,7 @@ typedef struct _AFD_FCB {
UNICODE_STRING TdiDeviceName;
PVOID Context;
DWORD PollState;
+ NTSTATUS PollStatus[FD_MAX_EVENTS];
UINT ContextSize;
PVOID ConnectData;
UINT FilledConnectData;
diff --git a/drivers/network/ndis/ndis/buffer.c b/drivers/network/ndis/ndis/buffer.c
index 3d338a41abd..2aa821e23df 100644
--- a/drivers/network/ndis/ndis/buffer.c
+++ b/drivers/network/ndis/ndis/buffer.c
@@ -908,6 +908,7 @@ NdisGetFirstBufferFromPacket(
}
}
+#undef NdisGetFirstBufferFromPacketSafe
/*
* @implemented
*/
diff --git a/drivers/network/ndis/ndis/memory.c b/drivers/network/ndis/ndis/memory.c
index 7696389e876..3d96170ea4c 100644
--- a/drivers/network/ndis/ndis/memory.c
+++ b/drivers/network/ndis/ndis/memory.c
@@ -171,6 +171,15 @@ NdisMAllocateSharedMemory(
NDIS_DbgPrint(MAX_TRACE,("Called.\n"));
+ if (KeGetCurrentIrql() != PASSIVE_LEVEL)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)MiniportAdapterHandle,
+ Length,
+ 0,
+ 1);
+ }
+
*VirtualAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->AllocateCommonBuffer(
Adapter->NdisMiniportBlock.SystemAdapterObject, Length, PhysicalAddress, Cached);
}
diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c
index daaf7cac1b1..4492caffe32 100644
--- a/drivers/network/ndis/ndis/miniport.c
+++ b/drivers/network/ndis/ndis/miniport.c
@@ -365,6 +365,15 @@ MiniResetComplete(
KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
+ if (Adapter->NdisMiniportBlock.ResetStatus != NDIS_STATUS_PENDING)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)MiniportAdapterHandle,
+ (ULONG_PTR)Status,
+ (ULONG_PTR)AddressingReset,
+ 0);
+ }
+
Adapter->NdisMiniportBlock.ResetStatus = Status;
CurrentEntry = Adapter->ProtocolListHead.Flink;
@@ -1959,6 +1968,22 @@ NdisIPnPStartDevice(
{
NDIS_DbgPrint(MIN_TRACE, ("MiniportInitialize() failed for an adapter.\n"));
ExInterlockedRemoveEntryList( &Adapter->ListEntry, &AdapterListLock );
+ if (Adapter->NdisMiniportBlock.Interrupt)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)Adapter,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.Interrupt,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.TimerQueue,
+ 1);
+ }
+ if (Adapter->NdisMiniportBlock.TimerQueue)
+ {
+ KeBugCheckEx(BUGCODE_ID_DRIVER,
+ (ULONG_PTR)Adapter,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.Interrupt,
+ (ULONG_PTR)Adapter->NdisMiniportBlock.TimerQueue,
+ 1);
+ }
return NdisStatus;
}
diff --git a/drivers/network/ndis/ndis/time.c b/drivers/network/ndis/ndis/time.c
index 75a65f3b24f..0e8cdd46473 100644
--- a/drivers/network/ndis/ndis/time.c
+++ b/drivers/network/ndis/ndis/time.c
@@ -95,6 +95,38 @@ NdisInitializeTimer(
KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext);
}
+BOOLEAN DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer)
+{
+ PNDIS_MINIPORT_TIMER CurrentTimer;
+
+ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
+
+ if (!Timer->Miniport->TimerQueue)
+ return FALSE;
+
+ if (Timer->Miniport->TimerQueue == Timer)
+ {
+ Timer->Miniport->TimerQueue = Timer->NextDeferredTimer;
+ Timer->NextDeferredTimer = NULL;
+ return TRUE;
+ }
+ else
+ {
+ CurrentTimer = Timer->Miniport->TimerQueue;
+ while (CurrentTimer->NextDeferredTimer)
+ {
+ if (CurrentTimer->NextDeferredTimer == Timer)
+ {
+ CurrentTimer->NextDeferredTimer = Timer->NextDeferredTimer;
+ Timer->NextDeferredTimer = NULL;
+ return TRUE;
+ }
+ CurrentTimer = CurrentTimer->NextDeferredTimer;
+ }
+ return FALSE;
+ }
+}
+
/*
* @implemented
@@ -113,11 +145,44 @@ NdisMCancelTimer(
* - call at IRQL <= DISPATCH_LEVEL
*/
{
+ KIRQL OldIrql;
+
ASSERT_IRQL(DISPATCH_LEVEL);
ASSERT(TimerCancelled);
ASSERT(Timer);
*TimerCancelled = KeCancelTimer (&Timer->Timer);
+
+ if (*TimerCancelled)
+ {
+ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql);
+ /* If it's somebody already dequeued it, something is wrong (maybe a double-cancel?) */
+ if (!DequeueMiniportTimer(Timer)) ASSERT(FALSE);
+ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql);
+ }
+}
+
+VOID NTAPI
+MiniTimerDpcFunction(PKDPC Dpc,
+ PVOID DeferredContext,
+ PVOID SystemArgument1,
+ PVOID SystemArgument2)
+{
+ PNDIS_MINIPORT_TIMER Timer = DeferredContext;
+
+ Timer->MiniportTimerFunction(Dpc,
+ Timer->MiniportTimerContext,
+ SystemArgument1,
+ SystemArgument2);
+
+ /* Only dequeue if the timer has a period of 0 */
+ if (!Timer->Timer.Period)
+ {
+ KeAcquireSpinLockAtDpcLevel(&Timer->Miniport->Lock);
+ /* If someone already dequeued it, something is wrong (borked timer implementation?) */
+ if (!DequeueMiniportTimer(Timer)) ASSERT(FALSE);
+ KeReleaseSpinLockFromDpcLevel(&Timer->Miniport->Lock);
+ }
}
@@ -145,9 +210,14 @@ NdisMInitializeTimer(
{
PAGED_CODE();
ASSERT(Timer);
- KeInitializeTimer (&Timer->Timer);
- KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext);
+ KeInitializeTimer (&Timer->Timer);
+ KeInitializeDpc (&Timer->Dpc, MiniTimerDpcFunction, Timer);
+
+ Timer->MiniportTimerFunction = TimerFunction;
+ Timer->MiniportTimerContext = FunctionContext;
+ Timer->Miniport = &((PLOGICAL_ADAPTER)MiniportAdapterHandle)->NdisMiniportBlock;
+ Timer->NextDeferredTimer = NULL;
}
@@ -170,6 +240,7 @@ NdisMSetPeriodicTimer(
*/
{
LARGE_INTEGER Timeout;
+ KIRQL OldIrql;
ASSERT_IRQL(DISPATCH_LEVEL);
ASSERT(Timer);
@@ -177,7 +248,15 @@ NdisMSetPeriodicTimer(
/* relative delays are negative, absolute are positive; resolution is 100ns */
Timeout.QuadPart = Int32x32To64(MillisecondsPeriod, -10000);
- KeSetTimerEx (&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc);
+ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql);
+ /* If KeSetTimer(Ex) returns FALSE then the timer is not in the system's queue (and not in ours either) */
+ if (!KeSetTimerEx(&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc))
+ {
+ /* Add the timer at the head of the timer queue */
+ Timer->NextDeferredTimer = Timer->Miniport->TimerQueue;
+ Timer->Miniport->TimerQueue = Timer;
+ }
+ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql);
}
@@ -201,6 +280,7 @@ NdisMSetTimer(
*/
{
LARGE_INTEGER Timeout;
+ KIRQL OldIrql;
ASSERT_IRQL(DISPATCH_LEVEL);
ASSERT(Timer);
@@ -208,7 +288,15 @@ NdisMSetTimer(
/* relative delays are negative, absolute are positive; resolution is 100ns */
Timeout.QuadPart = Int32x32To64(MillisecondsToDelay, -10000);
- KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc);
+ KeAcquireSpinLock(&Timer->Miniport->Lock, &OldIrql);
+ /* If KeSetTimer(Ex) returns FALSE then the timer is not in the system's queue (and not in ours either) */
+ if (!KeSetTimer(&Timer->Timer, Timeout, &Timer->Dpc))
+ {
+ /* Add the timer at the head of the timer queue */
+ Timer->NextDeferredTimer = Timer->Miniport->TimerQueue;
+ Timer->Miniport->TimerQueue = Timer;
+ }
+ KeReleaseSpinLock(&Timer->Miniport->Lock, OldIrql);
}
diff --git a/drivers/network/tcpip/tcpip/fileobjs.c b/drivers/network/tcpip/tcpip/fileobjs.c
index bd7968e5ede..70357fced9a 100644
--- a/drivers/network/tcpip/tcpip/fileobjs.c
+++ b/drivers/network/tcpip/tcpip/fileobjs.c
@@ -265,7 +265,7 @@ NTSTATUS FileOpenAddress(
!AddrLocateInterface(&AddrFile->Address)) {
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", A2S(&AddrFile->Address)));
- return STATUS_INVALID_PARAMETER;
+ return STATUS_INVALID_ADDRESS;
}
TI_DbgPrint(MID_TRACE, ("Opening address %s for communication (P=%d U=%d).\n",
@@ -282,7 +282,7 @@ NTSTATUS FileOpenAddress(
AddrFile->Port == 0xffff)
{
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
- return STATUS_INVALID_PARAMETER;
+ return STATUS_ADDRESS_ALREADY_EXISTS;
}
AddEntity(CO_TL_ENTITY, AddrFile, CO_TL_TCP);
@@ -300,7 +300,7 @@ NTSTATUS FileOpenAddress(
AddrFile->Port == 0xffff)
{
ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
- return STATUS_INVALID_PARAMETER;
+ return STATUS_ADDRESS_ALREADY_EXISTS;
}
TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
diff --git a/drivers/video/miniport/vbe/vbemp.c b/drivers/video/miniport/vbe/vbemp.c
index 2107e5ff70e..b8ee6e18eac 100644
--- a/drivers/video/miniport/vbe/vbemp.c
+++ b/drivers/video/miniport/vbe/vbemp.c
@@ -36,7 +36,7 @@
/* PUBLIC AND PRIVATE FUNCTIONS ***********************************************/
-VP_STATUS NTAPI
+ULONG NTAPI
DriverEntry(IN PVOID Context1, IN PVOID Context2)
{
VIDEO_HW_INITIALIZATION_DATA InitData;
diff --git a/drivers/video/miniport/vga/vgamp.c b/drivers/video/miniport/vga/vgamp.c
index 928d7e8b4d5..173525879f8 100644
--- a/drivers/video/miniport/vga/vgamp.c
+++ b/drivers/video/miniport/vga/vgamp.c
@@ -21,9 +21,9 @@
// IN PVOID Context1 Context parameter to pass to VidPortInitialize
// IN PVOID Context2 Context parameter to pass to VidPortInitialize
// RETURNS:
-// VP_STATUS
+// ULONG
-VP_STATUS NTAPI
+ULONG NTAPI
DriverEntry(IN PVOID Context1,
IN PVOID Context2)
{
diff --git a/drivers/video/miniport/vmx_svga/vmx_svga.c b/drivers/video/miniport/vmx_svga/vmx_svga.c
index 3c981c59be1..9ed88c9a8ff 100644
--- a/drivers/video/miniport/vmx_svga/vmx_svga.c
+++ b/drivers/video/miniport/vmx_svga/vmx_svga.c
@@ -241,7 +241,7 @@ VmxGetVideoChildDescriptor(IN PVOID HwDeviceExtension,
return NO_ERROR;
}
-VP_STATUS
+ULONG
NTAPI
DriverEntry(IN PVOID Context1,
IN PVOID Context2)
diff --git a/drivers/video/miniport/xboxvmp/xboxvmp.c b/drivers/video/miniport/xboxvmp/xboxvmp.c
index 7763ccb3a07..6841930d84f 100644
--- a/drivers/video/miniport/xboxvmp/xboxvmp.c
+++ b/drivers/video/miniport/xboxvmp/xboxvmp.c
@@ -35,7 +35,7 @@
/* PUBLIC AND PRIVATE FUNCTIONS ***********************************************/
-VP_STATUS NTAPI
+ULONG NTAPI
DriverEntry(IN PVOID Context1, IN PVOID Context2)
{
VIDEO_HW_INITIALIZATION_DATA InitData;
diff --git a/drivers/video/videoprt/videoprt.c b/drivers/video/videoprt/videoprt.c
index ad22d6a36fb..4c339b67677 100644
--- a/drivers/video/videoprt/videoprt.c
+++ b/drivers/video/videoprt/videoprt.c
@@ -31,10 +31,10 @@ ULONG VideoPortDeviceNumber = 0;
/* PRIVATE FUNCTIONS **********************************************************/
-NTSTATUS NTAPI
+ULONG NTAPI
DriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath)
+ IN PVOID Context1,
+ IN PVOID Context2)
{
return STATUS_SUCCESS;
}
@@ -1357,7 +1357,7 @@ VP_STATUS NTAPI
VideoPortRegisterBugcheckCallback(
IN PVOID HwDeviceExtension,
IN ULONG BugcheckCode,
- IN PVOID Callback,
+ IN PVIDEO_BUGCHECK_CALLBACK Callback,
IN ULONG BugcheckDataSize)
{
UNIMPLEMENTED;
diff --git a/drivers/wdm/audio/backpln/portcls/irp.cpp b/drivers/wdm/audio/backpln/portcls/irp.cpp
index f30f9de21a9..35bc6b15bb3 100644
--- a/drivers/wdm/audio/backpln/portcls/irp.cpp
+++ b/drivers/wdm/audio/backpln/portcls/irp.cpp
@@ -118,11 +118,22 @@ PortClsPnp(
// Clean up
DPRINT("IRP_MN_REMOVE_DEVICE\n");
- DeviceExt->resources->Release();
- IoDeleteDevice(DeviceObject);
+ // sanity check
+ PC_ASSERT(DeviceExt);
+
+ // FIXME more cleanup */
+ if (DeviceExt->resources)
+ {
+ // free resource list */
+ DeviceExt->resources->Release();
+
+ // set to null
+ DeviceExt->resources = NULL;
+ }
// Forward request
Status = PcForwardIrpSynchronous(DeviceObject, Irp);
+
return PcCompleteIrp(DeviceObject, Irp, Status);
case IRP_MN_QUERY_INTERFACE:
diff --git a/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp b/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp
index edf88bf746e..a3d884dc912 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/adapter.cpp
@@ -29,7 +29,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include
#include "adapter.hpp"
-//#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+//#pragma code_seg("PAGE") // GCC ignores pragma code_seg
+#endif
const GUID KSNODETYPE_DAC = {0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
const GUID KSNODETYPE_ADC = {0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}};
@@ -267,7 +269,9 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
PUNKNOWN unknownTopology = NULL;
// install the topology miniport.
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Topology", CLSID_PortTopology, CLSID_PortTopology, CreateMiniportTopologyCMI, pCMIAdapter, NULL, GUID_NULL, &unknownTopology);
+ ntStatus = InstallSubdevice( DeviceObject, Irp, (PWCHAR) L"Topology",
+ CLSID_PortTopology, CLSID_PortTopology, CreateMiniportTopologyCMI,
+ pCMIAdapter, NULL, GUID_NULL, &unknownTopology );
if (!NT_SUCCESS (ntStatus)) {
DBGPRINT(("Topology miniport installation failed"));
return ntStatus;
@@ -277,7 +281,7 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
// install the UART miniport - execution order important
ntStatus = STATUS_UNSUCCESSFUL;
MPUBase = 0;
- for (int i=0;iNumberOfPorts();i++) {
+ for ( UINT i=0; i < ResourceList->NumberOfPorts(); i++ ) {
if (ResourceList->FindTranslatedPort(i)->u.Port.Length == 2) {
MPUBase = (UInt32*)ResourceList->FindTranslatedPort(i)->u.Port.Start.QuadPart;
}
@@ -285,7 +289,10 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
if (MPUBase != 0) {
ntStatus = pCMIAdapter->activateMPU(MPUBase);
if (NT_SUCCESS(ntStatus)) {
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Uart", CLSID_PortDMus, CLSID_MiniportDriverDMusUART, NULL, pCMIAdapter->getInterruptSync(), UartResourceList, IID_IPortDMus, NULL);
+ ntStatus = InstallSubdevice( DeviceObject, Irp, (PWCHAR) L"Uart",
+ CLSID_PortDMus, CLSID_MiniportDriverDMusUART, NULL,
+ pCMIAdapter->getInterruptSync(), UartResourceList,
+ IID_IPortDMus, NULL );
}
}
if (!NT_SUCCESS(ntStatus)) {
@@ -300,9 +307,13 @@ NTSTATUS StartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp, PRESOURCELIST Resour
// install the wave miniport - the order matters here
#ifdef WAVERT
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveRT, CLSID_PortWaveRT, CreateMiniportWaveCMI, pCMIAdapter, ResourceList, IID_IPortWaveRT, &unknownWave);
+ ntStatus = InstallSubdevice(DeviceObject, Irp, (PWCHAR) L"Wave",
+ CLSID_PortWaveRT, CLSID_PortWaveRT, CreateMiniportWaveCMI,
+ pCMIAdapter, ResourceList, IID_IPortWaveRT, &unknownWave );
#else
- ntStatus = InstallSubdevice(DeviceObject, Irp, L"Wave", CLSID_PortWaveCyclic, CLSID_PortWaveCyclic, CreateMiniportWaveCMI, pCMIAdapter, ResourceList, IID_IPortWaveCyclic, &unknownWave);
+ ntStatus = InstallSubdevice(DeviceObject, Irp, (PWCHAR) L"Wave",
+ CLSID_PortWaveCyclic, CLSID_PortWaveCyclic, CreateMiniportWaveCMI,
+ pCMIAdapter, ResourceList, IID_IPortWaveCyclic, &unknownWave );
#endif
if (!NT_SUCCESS(ntStatus)) {
DBGPRINT(("Wave miniport installation failed"));
@@ -449,8 +460,10 @@ AdapterDispatchPnp(
resourceList->List[0].Count = 0;
// copy the resources which have already been assigned
- for (int i=0;iList[0].Count;i++) {
- if (CopyResourceDescriptor(&list->List[0].Descriptors[i], &resourceList->List[0].Descriptors[resourceList->List[0].Count])) {
+ for ( UINT i=0; i < list->List[0].Count; i++ ) {
+ if (CopyResourceDescriptor( &list->List[0].Descriptors[i],
+ &resourceList->List[0].Descriptors[resourceList->List[0].Count] ))
+ {
resourceList->List[0].Count++;
}
}
diff --git a/drivers/wdm/audio/drivers/CMIDriver/common.cpp b/drivers/wdm/audio/drivers/CMIDriver/common.cpp
index 260f51d62e2..dc2b62ac55e 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/common.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/common.cpp
@@ -27,7 +27,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "common.hpp"
-#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+#pragma code_seg("PAGE") /* warning - ignored by GCC compiler */
+#endif
NTSTATUS
NewCMIAdapter(
@@ -63,7 +65,7 @@ STDMETHODIMP_(NTSTATUS) CCMIAdapter::init(PRESOURCELIST ResourceList, PDEVICE_OB
DeviceObject = aDeviceObject;
cm.IOBase = 0;
- for (int i=0;iNumberOfPorts();i++) {
+ for ( UINT i=0; i < ResourceList->NumberOfPorts(); i++ ) {
if (ResourceList->FindTranslatedPort(i)->u.Port.Length == 0x100) {
cm.IOBase = (UInt32*)ResourceList->FindTranslatedPort(i)->u.Port.Start.QuadPart;
}
@@ -357,7 +359,7 @@ STDMETHODIMP_(NTSTATUS) CCMIAdapter::loadSBMixerFromMemory()
//PAGED_CODE();
DBGPRINT(("CCMIAdapter[%p]::loadSBMixerFromMemory()", this));
#endif
- for (int i = 0; i<(sizeof(sbIndex)/sizeof(sbIndex[0]));i++) {
+ for ( UINT i = 0; i < (sizeof(sbIndex)/sizeof(sbIndex[0])); i++ ) {
writeUInt8(REG_SBINDEX, sbIndex[i]);
writeUInt8(REG_SBDATA, mixerCache[i]);
}
@@ -368,7 +370,9 @@ STDMETHODIMP_(NTSTATUS) CCMIAdapter::loadSBMixerFromMemory()
/*
** non-paged code below
*/
-#pragma code_seg()
+#ifdef _MSC_VER
+#pragma code_seg() /* warning - ignored by GCC compiler */
+#endif
STDMETHODIMP_(UInt8) CCMIAdapter::readUInt8(UInt8 reg)
{
diff --git a/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp b/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
index 23584dd1dcd..283dc2b071f 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/mintopo.cpp
@@ -31,7 +31,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define NTSTRSAFE_LIB //for Windows 2000 compatibility
#include "ntstrsafe.h"
-#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+#pragma code_seg("PAGE") /* warning - ignored by GCC compiler */
+#endif
const GUID KSPROPSETID_CMI = {0x2B81CDBB, 0xEE6C, 0x4ECC, {0x8A, 0xA5, 0x9A, 0x18, 0x8B, 0x02, 0x3D, 0xFF}};
@@ -173,7 +175,7 @@ STDMETHODIMP CCMITopology::loadMixerSettingsFromRegistry()
PropertyRequest.ValueSize = sizeof(DWORD);
PropertyRequest.PropertyItem = &PropertyItem;
- for (int i=0;i < SIZEOF_ARRAY(TopologyNodes); i++) {
+ for ( UINT i=0; i < SIZEOF_ARRAY(TopologyNodes); i++ ) {
PropertyRequest.Node = i;
Channel = CHAN_LEFT;
@@ -310,7 +312,7 @@ STDMETHODIMP CCMITopology::storeMixerSettingsToRegistry()
PropertyRequest.ValueSize = sizeof(DWORD);
PropertyRequest.PropertyItem = &PropertyItem;
- for (int i=0;i < SIZEOF_ARRAY(TopologyNodes); i++) {
+ for ( UINT i=0; i < SIZEOF_ARRAY(TopologyNodes); i++ ) {
PropertyRequest.Node = i;
if (IsEqualGUIDAligned(*(TopologyNodes[i].Type), KSNODETYPE_VOLUME)) {
PropertyRequest.Node = i;
@@ -473,7 +475,8 @@ NTSTATUS NTAPI PropertyHandler_OnOff(PPCPROPERTY_REQUEST PropertyRequest)
CCMITopology *that = (CCMITopology *) ((PMINIPORTTOPOLOGY) PropertyRequest->MajorTarget);
NTSTATUS ntStatus = STATUS_INVALID_PARAMETER;
- UInt8 data, mask, reg;
+ //UInt8 data, mask, reg;
+ UInt8 mask, reg;
LONG channel;
if (PropertyRequest->Node == ULONG(-1)) {
@@ -1042,7 +1045,7 @@ static NTSTATUS BasicSupportHandler(PPCPROPERTY_REQUEST PropertyRequest)
PKSPROPERTY_STEPPING_LONG Range = PKSPROPERTY_STEPPING_LONG(Members + 1);
- for (int i=0;iNode) {
Range->Bounds.SignedMaximum = (VolTable[i].max << 16);
Range->Bounds.SignedMinimum = (VolTable[i].min << 16);
@@ -1110,7 +1113,7 @@ NTSTATUS NTAPI PropertyHandler_Level(PPCPROPERTY_REQUEST PropertyRequest)
PLONG Level = (PLONG)PropertyRequest->Value;
- for (int i=0;iNode) {
if (PropertyRequest->Verb & KSPROPERTY_TYPE_GET) {
diff --git a/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp b/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp
index dce93b1cf44..182b4e6d97f 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/mintopotables.hpp
@@ -35,7 +35,8 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF\
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
-#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
+#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED( KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF )
+/* Warning - Recursive #define for KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF */
#endif
#endif
@@ -47,15 +48,17 @@ NTSTATUS NTAPI PropertyHandler_Private(PPCPROPERTY_REQUEST PropertyRequest);
static KSDATARANGE PinDataRangesBridge[] =
{
- {
- sizeof(KSDATARANGE),
- 0,
- 0,
- 0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
- }
+ {
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }
+ }
};
static PKSDATARANGE PinDataRangePointersBridge[] =
@@ -65,14 +68,16 @@ static PKSDATARANGE PinDataRangePointersBridge[] =
static KSDATARANGE WavePinDataRangesAC3Bridge[] =
{
- {
- sizeof(KSDATARANGE),
- 0,
- 0,
- 0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
+ {
+ {
+ sizeof(KSDATARANGE),
+ 0,
+ 0,
+ 0,
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }
}
};
@@ -98,7 +103,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSCATEGORY_AUDIO, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -117,7 +122,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPDIF_INTERFACE, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -136,7 +141,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_MICROPHONE, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -155,7 +160,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_CD_PLAYER, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -174,7 +179,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_LINE_CONNECTOR, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -193,7 +198,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_ANALOG_CONNECTOR, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -212,7 +217,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_ANALOG_CONNECTOR, // Category
&CMINAME_DAC, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -231,7 +236,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSNODETYPE_SPEAKER, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -250,7 +255,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSCATEGORY_AUDIO, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -269,7 +274,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
&KSCATEGORY_AUDIO, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
},
@@ -288,7 +293,7 @@ static PCPIN_DESCRIPTOR MiniportPins[] =
KSPIN_COMMUNICATION_NONE, // Communication
NULL, // Category
NULL, // Name
- 0 // Reserved
+ { 0 } // Reserved
}
}
};
diff --git a/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp b/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp
index 4a0477133d5..5152d863e57 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/minwave.cpp
@@ -29,7 +29,9 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "minwavetables.hpp"
#include "ntddk.h"
-#pragma code_seg("PAGE")
+#ifdef _MSC_VER
+#pragma code_seg("PAGE") /* warning - ignored by GCC compiler */
+#endif
HRESULT NTAPI CreateMiniportWaveCMI(PUNKNOWN *Unknown, REFCLSID, PUNKNOWN UnknownOuter, POOL_TYPE PoolType)
{
@@ -233,7 +235,8 @@ NTSTATUS CMiniportWaveCMI::loadChannelConfigFromRegistry()
PREGISTRYKEY DriverKey;
PREGISTRYKEY SettingsKey;
UNICODE_STRING KeyName;
- DWORD Value, ResultLength;
+ //DWORD Value, ResultLength;
+ DWORD ResultLength;
PVOID KeyInfo;
DBGPRINT(("CMiniportWaveCMI::loadChannelConfigFromRegistry()"));
@@ -418,12 +421,12 @@ NTSTATUS CMiniportWaveCMI::validateFormat(PKSDATAFORMAT format, ULONG PinID, BOO
DBGPRINT(("---channels: %d, resolution: %d, sample rate: %d, pin: %d, formatMask: %x", waveFormat->nChannels, waveFormat->wBitsPerSample, waveFormat->nSamplesPerSec, PinID, cm->formatMask));
//WaveFormatEx
- if ( ( format->FormatSize >= sizeof(KSDATAFORMAT_WAVEFORMATEX))
+ if ( ( (size_t) format->FormatSize >= sizeof(KSDATAFORMAT_WAVEFORMATEX))
&& IsEqualGUIDAligned(format->MajorFormat,KSDATAFORMAT_TYPE_AUDIO)
&& IsEqualGUIDAligned(format->Specifier,KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) ) {
switch (EXTRACT_WAVEFORMATEX_ID(&format->SubFormat)) {
case WAVE_FORMAT_PCM:
- if ((PinID != PIN_WAVE_RENDER_SINK) && (PinID != PIN_WAVE_CAPTURE_SOURCE) && (PinID != -1)) {
+ if ((PinID != PIN_WAVE_RENDER_SINK) && (PinID != PIN_WAVE_CAPTURE_SOURCE) && ((int)PinID != -1)) {
if ((PinID == PIN_WAVE_AC3_RENDER_SINK) && !IoIsWdmVersionAvailable(6,0)) {
return STATUS_INVALID_PARAMETER;
}
@@ -438,10 +441,10 @@ NTSTATUS CMiniportWaveCMI::validateFormat(PKSDATAFORMAT format, ULONG PinID, BOO
return isFormatAllowed(waveFormat->nSamplesPerSec, FALSE, FALSE);
}
if ( (waveFormat->wBitsPerSample == 16)
- && ((waveFormat->nChannels >= 4) && (waveFormat->nChannels <= cm->maxChannels))
+ && ((waveFormat->nChannels >= 4) && (waveFormat->nChannels <= (WORD) cm->maxChannels))
&& ((waveFormat->nSamplesPerSec == 44100) || (waveFormat->nSamplesPerSec == 48000)) ) {
#if OUT_CHANNEL == 1
- if ((PinID == PIN_WAVE_RENDER_SINK) || (PinID == -1)) {
+ if ((PinID == PIN_WAVE_RENDER_SINK) || ((int)PinID == -1)) {
return isFormatAllowed(waveFormat->nSamplesPerSec, TRUE, FALSE);
}
#else
@@ -450,7 +453,7 @@ NTSTATUS CMiniportWaveCMI::validateFormat(PKSDATAFORMAT format, ULONG PinID, BOO
}
break;
case WAVE_FORMAT_DOLBY_AC3_SPDIF:
- if ((PinID != PIN_WAVE_AC3_RENDER_SINK) && (PinID != -1)) {
+ if ((PinID != PIN_WAVE_AC3_RENDER_SINK) && ((int)PinID != -1)) {
return STATUS_INVALID_PARAMETER;
}
if ( ((waveFormat->wBitsPerSample >= MIN_BITS_PER_SAMPLE_AC3) && (waveFormat->wBitsPerSample <= MAX_BITS_PER_SAMPLE_AC3))
@@ -907,7 +910,7 @@ NTSTATUS CMiniportWaveStreamCMI::prepareStream()
DBGPRINT(("---streamIndex: %d, channelNumber: %d", streamIndex, channelNumber));
NTSTATUS ntStatus;
- UInt8 reg;
+ //UInt8 reg;
UInt32 val;
if (state == KSSTATE_RUN) {
@@ -990,7 +993,7 @@ NTSTATUS CMiniportWaveStreamCMI::setDACChannels()
NTSTATUS ntStatus = STATUS_SUCCESS;
if (currentChannelCount > 2) {
- if (Miniport->cm->maxChannels < currentChannelCount) {
+ if ((WORD) Miniport->cm->maxChannels < currentChannelCount ) {
return STATUS_INVALID_DEVICE_REQUEST;
}
if ((currentResolution != 16) || (currentChannelCount < 2)) {
@@ -1052,7 +1055,7 @@ NTSTATUS CMiniportWaveStreamCMI::setupSPDIFPlayback(bool enableSPDIF)
//PAGED_CODE();
DBGPRINT(("CMiniportWaveStreamCMI[%p]::setupSPDIFPlayback(%d)", this, enableSPDIF));
- NTSTATUS ntStatus;
+ //NTSTATUS ntStatus;
KeWaitForSingleObject(&Miniport->mutex, Executive, KernelMode, false, NULL);
@@ -1434,7 +1437,9 @@ STDMETHODIMP_(NTSTATUS) CMiniportWaveStreamCMI::GetClockRegister(PKSRTAUDIO_HWRE
/*
** non-paged code below
*/
-#pragma code_seg()
+#ifdef _MSC_VER
+#pragma code_seg() /* warning - ignored by GCC compiler */
+#endif
STDMETHODIMP CMiniportWaveStreamCMI::SetState(KSSTATE NewState)
{
@@ -1461,7 +1466,9 @@ STDMETHODIMP CMiniportWaveStreamCMI::SetState(KSSTATE NewState)
// STOP -> ACQUIRE -> PAUSE -> PLAY -> PAUSE -> ACQUIRE -> STOP
if (state != NewState) {
- switch (NewState) {
+ switch ((UINT) NewState) {
+ // LN: The cast on NewState is to satisfy the compiler about
+ // KSSTATE_STOP_AC3, which is not in the original enum KSSTATE.
case KSSTATE_ACQUIRE:
DBGPRINT(("---KSSTATE_ACQUIRE: previous state: %d", state));
if (state == KSSTATE_PAUSE) {
diff --git a/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp b/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp
index 0c0326ca21c..8f44c5a977d 100644
--- a/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp
+++ b/drivers/wdm/audio/drivers/CMIDriver/minwavetables.hpp
@@ -31,23 +31,23 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF\
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
-#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
+#define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
+/* Warning - Recursive #define for KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF */
NTSTATUS NTAPI PropertyHandler_ChannelConfig(PPCPROPERTY_REQUEST PropertyRequest);
-
static KSDATARANGE_AUDIO WavePinDataRangesPCMStream[] =
{
{
- {
+ {{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
- },
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) }
+ }},
MAX_CHANNELS_PCM,
MIN_BITS_PER_SAMPLE_PCM,
MAX_BITS_PER_SAMPLE_PCM,
@@ -59,15 +59,15 @@ static KSDATARANGE_AUDIO WavePinDataRangesPCMStream[] =
static KSDATARANGE_AUDIO WavePinDataRangesAC3Stream[] =
{
{
- {
+ {{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
- },
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX) }
+ }},
MAX_CHANNELS_AC3,
MIN_BITS_PER_SAMPLE_AC3,
MAX_BITS_PER_SAMPLE_AC3,
@@ -75,15 +75,15 @@ static KSDATARANGE_AUDIO WavePinDataRangesAC3Stream[] =
MAX_SAMPLE_RATE_AC3
},
{
- {
+ {{
sizeof(KSDATARANGE_AUDIO),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND)
- },
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND) }
+ }},
MAX_CHANNELS_AC3,
MIN_BITS_PER_SAMPLE_AC3,
MAX_BITS_PER_SAMPLE_AC3,
@@ -107,28 +107,28 @@ static PKSDATARANGE WavePinDataRangePointersAC3Stream[] =
static KSDATARANGE WavePinDataRangesPCMBridge[] =
{
- {
+ {{
sizeof(KSDATARANGE),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
- }
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }}
};
static KSDATARANGE WavePinDataRangesAC3Bridge[] =
{
- {
+ {{
sizeof(KSDATARANGE),
0,
0,
0,
- STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO),
- STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
- }
+ { STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO) },
+ { STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE) }
+ }}
};
static PKSDATARANGE WavePinDataRangePointersPCMBridge[] =
@@ -160,7 +160,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_SINK,
&KSCATEGORY_AUDIO,
&KSAUDFNAME_RECORDING_CONTROL,
- 0
+ { 0 }
}
},
@@ -181,7 +181,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_NONE,
&KSCATEGORY_AUDIO,
NULL,
- 0
+ { 0 }
}
},
@@ -202,7 +202,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_SINK,
&KSCATEGORY_AUDIO,
&KSAUDFNAME_VOLUME_CONTROL,
- 0
+ { 0 }
}
},
@@ -223,7 +223,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_NONE,
&KSNODETYPE_SPEAKER,
NULL,
- 0
+ { 0 }
}
},
@@ -244,7 +244,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_SINK,
&KSCATEGORY_AUDIO,
NULL,
- 0
+ { 0 }
}
},
@@ -266,7 +266,7 @@ static PCPIN_DESCRIPTOR WaveMiniportPins[] =
KSPIN_COMMUNICATION_NONE,
&KSNODETYPE_SPDIF_INTERFACE,
NULL,
- 0
+ { 0 }
}
}
};
diff --git a/drivers/wdm/audio/legacy/wdmaud/control.c b/drivers/wdm/audio/legacy/wdmaud/control.c
index 07e9ef846d2..4fc1d673c1c 100644
--- a/drivers/wdm/audio/legacy/wdmaud/control.c
+++ b/drivers/wdm/audio/legacy/wdmaud/control.c
@@ -457,15 +457,16 @@ WdmAudReadWrite(
Status = KsProbeStreamIrp(Irp, KSPROBE_STREAMREAD | KSPROBE_ALLOCATEMDL | KSPROBE_PROBEANDLOCK, Length);
}
- /* now free the mdl */
- IoFreeMdl(Mdl);
-
if (!NT_SUCCESS(Status))
{
DPRINT1("KsProbeStreamIrp failed with Status %x Cancel %u\n", Status, Irp->Cancel);
+ Irp->MdlAddress = Mdl;
return SetIrpIoStatus(Irp, Status, 0);
}
+ /* now free the mdl */
+ IoFreeMdl(Mdl);
+
/* get device info */
DeviceInfo = (PWDMAUD_DEVICE_INFO)Irp->AssociatedIrp.SystemBuffer;
ASSERT(DeviceInfo);
diff --git a/drivers/wmi/wmilib.c b/drivers/wmi/wmilib.c
index 0fd0fa6bc32..c6cec4aad73 100644
--- a/drivers/wmi/wmilib.c
+++ b/drivers/wmi/wmilib.c
@@ -11,7 +11,7 @@
#include
#include
-#include
+#include
#define NDEBUG
#include
@@ -34,7 +34,7 @@ WmiCompleteRequest(IN PDEVICE_OBJECT DeviceObject,
NTSTATUS
NTAPI
WmiFireEvent(IN PDEVICE_OBJECT DeviceObject,
- IN LPGUID Guid,
+ IN LPCGUID Guid,
IN ULONG InstanceIndex,
IN ULONG EventDataSize,
IN PVOID EventData)
diff --git a/hal/hal.pspec b/hal/hal.pspec
index 0e6a7c74c14..3edf88ca595 100644
--- a/hal/hal.pspec
+++ b/hal/hal.pspec
@@ -8,7 +8,8 @@
@ fastcall -arch=i386 ExAcquireFastMutex(ptr) ExiAcquireFastMutex
@ fastcall -arch=i386 ExReleaseFastMutex(ptr) ExiReleaseFastMutex
#endif
-@ fastcall -arch=i386,arm ExTryToAcquireFastMutex(ptr) ExiTryToAcquireFastMutex
+@ fastcall -arch=i386 ExTryToAcquireFastMutex(ptr) ntoskrnl.ExiTryToAcquireFastMutex
+@ fastcall -arch=arm ExTryToAcquireFastMutex(ptr)
@ fastcall HalClearSoftwareInterrupt(long)
@ fastcall HalRequestSoftwareInterrupt(long)
@ fastcall HalSystemVectorDispatchEntry(long long long)
diff --git a/hal/halx86/amd64/halinit.c b/hal/halx86/amd64/halinit.c
new file mode 100644
index 00000000000..b9b305126d3
--- /dev/null
+++ b/hal/halx86/amd64/halinit.c
@@ -0,0 +1,31 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/amd64/halinit.c
+ * PURPOSE: HAL Entrypoint and Initialization
+ * PROGRAMMERS:
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS *******************************************************************/
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalInitSystem(IN ULONG BootPhase,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
diff --git a/hal/halx86/mp/amd64/mps.S b/hal/halx86/amd64/mps.S
similarity index 100%
rename from hal/halx86/mp/amd64/mps.S
rename to hal/halx86/amd64/mps.S
diff --git a/hal/halx86/amd64/processor.c b/hal/halx86/amd64/processor.c
new file mode 100644
index 00000000000..255f50b8bf0
--- /dev/null
+++ b/hal/halx86/amd64/processor.c
@@ -0,0 +1,97 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/amd64/processor.c
+ * PURPOSE: HAL Processor Routines
+ * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+KAFFINITY HalpActiveProcessors;
+KAFFINITY HalpDefaultInterruptAffinity;
+
+/* PRIVATE FUNCTIONS *********************************************************/
+
+VOID
+NTAPI
+HaliHaltSystem(VOID)
+{
+ /* Disable interrupts and halt the CPU */
+ _disable();
+ __halt();
+}
+
+/* FUNCTIONS *****************************************************************/
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalInitializeProcessor(IN ULONG ProcessorNumber,
+ IN PLOADER_PARAMETER_BLOCK LoaderBlock)
+{
+ /* Set default stall count */
+ KeGetPcr()->StallScaleFactor = INITIAL_STALL_COUNT;
+
+ /* Update the interrupt affinity and processor mask */
+ InterlockedBitTestAndSet((PLONG)&HalpActiveProcessors, ProcessorNumber);
+ InterlockedBitTestAndSet((PLONG)&HalpDefaultInterruptAffinity,
+ ProcessorNumber);
+
+ /* Register routines for KDCOM */
+ //HalpRegisterKdSupportFunctions();
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalAllProcessorsStarted(VOID)
+{
+ /* Do nothing */
+ return TRUE;
+}
+
+/*
+ * @implemented
+ */
+BOOLEAN
+NTAPI
+HalStartNextProcessor(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
+ IN PKPROCESSOR_STATE ProcessorState)
+{
+ /* Ready to start */
+ return FALSE;
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalProcessorIdle(VOID)
+{
+ /* Enable interrupts and halt the processor */
+ _enable();
+ __halt();
+}
+
+/*
+ * @implemented
+ */
+VOID
+NTAPI
+HalRequestIpi(KAFFINITY TargetProcessors)
+{
+ UNIMPLEMENTED;
+ __debugbreak();
+}
+
+/* EOF */
diff --git a/hal/halx86/amd64/stubs.c b/hal/halx86/amd64/stubs.c
new file mode 100644
index 00000000000..ee295d17944
--- /dev/null
+++ b/hal/halx86/amd64/stubs.c
@@ -0,0 +1,97 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING.ARM in the top level directory
+ * FILE: hal/halx86/amd64/stubs.c
+ * PURPOSE: HAL stubs
+ * PROGRAMMERS:
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+LARGE_INTEGER HalpPerformanceFrequency;
+
+
+/* FUNCTIONS ******************************************************************/
+
+VOID
+FASTCALL
+HalClearSoftwareInterrupt(
+ IN KIRQL Irql)
+{
+ UNIMPLEMENTED;
+}
+
+VOID
+FASTCALL
+HalRequestSoftwareInterrupt(
+ IN KIRQL Irql)
+{
+ UNIMPLEMENTED;
+}
+
+BOOLEAN
+NTAPI
+HalBeginSystemInterrupt(
+ IN KIRQL Irql,
+ IN UCHAR Vector,
+ OUT PKIRQL OldIrql)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
+
+BOOLEAN
+NTAPI
+HalEnableSystemInterrupt(
+ IN UCHAR Vector,
+ IN KIRQL Irql,
+ IN KINTERRUPT_MODE InterruptMode)
+{
+ UNIMPLEMENTED;
+ return FALSE;
+}
+
+VOID
+NTAPI
+HalDisableSystemInterrupt(
+ IN UCHAR Vector,
+ IN KIRQL Irql)
+{
+ UNIMPLEMENTED;
+}
+
+VOID
+NTAPI
+HalEndSystemInterrupt(
+ IN KIRQL OldIrql,
+ IN PKTRAP_FRAME TrapFrame)
+{
+ UNIMPLEMENTED;
+}
+
+LARGE_INTEGER
+NTAPI
+KeQueryPerformanceCounter(
+ OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL)
+{
+ LARGE_INTEGER Result;
+
+// ASSERT(HalpPerformanceFrequency.QuadPart != 0);
+
+ /* Does the caller want the frequency? */
+ if (PerformanceFrequency)
+ {
+ /* Return value */
+ *PerformanceFrequency = HalpPerformanceFrequency;
+ }
+
+ Result.QuadPart = __rdtsc();
+ return Result;
+}
+
diff --git a/hal/halx86/generic/amd64/systimer.S b/hal/halx86/amd64/systimer.S
similarity index 100%
rename from hal/halx86/generic/amd64/systimer.S
rename to hal/halx86/amd64/systimer.S
diff --git a/hal/halx86/generic/amd64/x86bios.c b/hal/halx86/amd64/x86bios.c
similarity index 99%
rename from hal/halx86/generic/amd64/x86bios.c
rename to hal/halx86/amd64/x86bios.c
index 3b43bf1d95f..a814873cbe0 100644
--- a/hal/halx86/generic/amd64/x86bios.c
+++ b/hal/halx86/amd64/x86bios.c
@@ -12,7 +12,7 @@
//#define NDEBUG
#include
-#include "x86emu.h"
+//#include "x86emu.h"
/* This page serves as fallback for pages used by Mm */
#define DEFAULT_PAGE 0x21
@@ -216,6 +216,7 @@ x86BiosWriteMemory(
return STATUS_SUCCESS;
}
+#if 0
BOOLEAN
NTAPI
x86BiosCall(
@@ -261,11 +262,13 @@ x86BiosCall(
return TRUE;
}
+#endif
BOOLEAN
NTAPI
HalpBiosDisplayReset(VOID)
{
+#if 0
X86_BIOS_REGISTERS Registers;
ULONG OldEflags;
@@ -283,7 +286,7 @@ HalpBiosDisplayReset(VOID)
/* Restore previous flags */
__writeeflags(OldEflags);
-
+#endif
return TRUE;
}
diff --git a/hal/halx86/generic/acpi/halacpi.c b/hal/halx86/generic/acpi/halacpi.c
index 1efee7996a4..22d3c9b6a72 100644
--- a/hal/halx86/generic/acpi/halacpi.c
+++ b/hal/halx86/generic/acpi/halacpi.c
@@ -879,6 +879,24 @@ HalpInitializePciBus(VOID)
HalpGetNMICrashFlag();
}
+VOID
+NTAPI
+HalpInitNonBusHandler(VOID)
+{
+ /* These should be written by the PCI driver later, but we give defaults */
+ HalPciTranslateBusAddress = HalpTranslateBusAddress;
+ HalPciAssignSlotResources = HalpAssignSlotResources;
+ HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
+}
+
+VOID
+NTAPI
+HalpInitBusHandlers(VOID)
+{
+ /* On ACPI, we only have a fake PCI bus to worry about */
+ HalpInitNonBusHandler();
+}
+
VOID
NTAPI
HalpBuildAddressMap(VOID)
diff --git a/hal/halx86/generic/bus/bushndlr.c b/hal/halx86/generic/bus/bushndlr.c
deleted file mode 100644
index 18121360a62..00000000000
--- a/hal/halx86/generic/bus/bushndlr.c
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/bushndlr.c
- * PURPOSE: Generic HAL Bus Handler Support
- * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
- */
-
-/* INCLUDES *******************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* GLOBALS ********************************************************************/
-
-KSPIN_LOCK HalpBusDatabaseSpinLock;
-KEVENT HalpBusDatabaseEvent;
-LIST_ENTRY HalpAllBusHandlers;
-PARRAY HalpBusTable;
-PARRAY HalpConfigTable;
-
-/* PRIVATE FUNCTIONS **********************************************************/
-
-PARRAY
-NTAPI
-HalpAllocateArray(IN ULONG ArraySize)
-{
- PARRAY Array;
- ULONG Size;
-
- /* Compute array size */
- if (ArraySize == MAXULONG) ArraySize = 0;
- Size = ArraySize * sizeof(PARRAY) + sizeof(ARRAY);
-
- /* Allocate the array */
- Array = ExAllocatePoolWithTag(NonPagedPool,
- Size,
- 'BusH');
- if (!Array) KeBugCheckEx(HAL_MEMORY_ALLOCATION, Size, 0, (ULONG_PTR)__FILE__, __LINE__);
-
- /* Initialize it */
- Array->ArraySize = ArraySize;
- RtlZeroMemory(Array->Element, sizeof(PVOID) * (ArraySize + 1));
- return Array;
-}
-
-VOID
-NTAPI
-HalpGrowArray(IN PARRAY *CurrentArray,
- IN PARRAY *NewArray)
-{
- PVOID Tmp;
-
- /* Check if the current array doesn't exist yet, or if it's smaller than the new one */
- if (!(*CurrentArray) || ((*NewArray)->ArraySize > (*CurrentArray)->ArraySize))
- {
- /* Does it exist (and can it fit?) */
- if (*CurrentArray)
- {
- /* Copy the current array into the new one */
- RtlCopyMemory(&(*NewArray)->Element,
- &(*CurrentArray)->Element,
- sizeof(PVOID) * ((*CurrentArray)->ArraySize + 1));
- }
-
- /* Swap the pointers (XOR swap would be more l33t) */
- Tmp = *CurrentArray;
- *CurrentArray = *NewArray;
- *NewArray = Tmp;
- }
-}
-
-PBUS_HANDLER
-FASTCALL
-HalpLookupHandler(IN PARRAY Array,
- IN ULONG Type,
- IN ULONG Number,
- IN BOOLEAN AddReference)
-{
- PHAL_BUS_HANDLER Bus;
- PBUS_HANDLER Handler = NULL;
-
- /* Make sure the entry exists */
- if (Array->ArraySize >= Type)
- {
- /* Retrieve it */
- Array = Array->Element[Type];
-
- /* Make sure the entry array exists */
- if ((Array) && (Array->ArraySize >= Number))
- {
- /* Retrieve the bus and its handler */
- Bus = Array->Element[Number];
- Handler = &Bus->Handler;
-
- /* Reference the handler if needed */
- if (AddReference) Bus->ReferenceCount++;
- }
- }
-
- /* Return the handler */
- return Handler;
-}
-
-VOID
-FASTCALL
-HaliReferenceBusHandler(IN PBUS_HANDLER Handler)
-{
- PHAL_BUS_HANDLER Bus;
-
- /* Find and reference the bus handler */
- Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
- Bus->ReferenceCount++;
-}
-
-VOID
-FASTCALL
-HaliDereferenceBusHandler(IN PBUS_HANDLER Handler)
-{
- PHAL_BUS_HANDLER Bus;
-
- /* Find and dereference the bus handler */
- Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
- Bus->ReferenceCount--;
- ASSERT(Bus->ReferenceCount != 0);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliHandlerForBus(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber)
-{
- /* Lookup the interface in the bus table */
- return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, FALSE);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
- IN ULONG BusNumber)
-{
- /* Lookup the configuration in the configuration table */
- return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, FALSE);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliReferenceHandlerForBus(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber)
-{
- /* Lookup the interface in the bus table, and reference the handler */
- return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, TRUE);
-}
-
-PBUS_HANDLER
-FASTCALL
-HaliReferenceHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
- IN ULONG BusNumber)
-{
- /* Lookup the configuration in the configuration table and add a reference */
- return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, TRUE);
-}
-
-VOID
-NTAPI
-HalpInitBusHandler(VOID)
-{
- /* Setup the bus lock */
- KeInitializeSpinLock(&HalpBusDatabaseSpinLock);
-
- /* Setup the bus event */
- KeInitializeEvent(&HalpBusDatabaseEvent, SynchronizationEvent, TRUE);
-
- /* Setup the bus configuration and bus table */
- HalpBusTable = HalpAllocateArray(0);
- HalpConfigTable = HalpAllocateArray(0);
-
- /* Setup the bus list */
- InitializeListHead(&HalpAllBusHandlers);
-
- /* These should be written by the PCI driver later, but we give defaults */
- HalPciTranslateBusAddress = HalpTranslateBusAddress;
- HalPciAssignSlotResources = HalpAssignSlotResources;
- HalFindBusAddressTranslation = HalpFindBusAddressTranslation;
-}
diff --git a/hal/halx86/generic/bus/halbus.c b/hal/halx86/generic/bus/halbus.c
deleted file mode 100644
index d8e478f450f..00000000000
--- a/hal/halx86/generic/bus/halbus.c
+++ /dev/null
@@ -1,348 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/halbus.c
- * PURPOSE: Bus Support Routines
- * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
- */
-
-/* INCLUDES ******************************************************************/
-
-#include
-#define NDEBUG
-#include
-
-/* GLOBALS *******************************************************************/
-
-ULONG HalpBusType;
-
-/* PRIVATE FUNCTIONS *********************************************************/
-
-VOID
-NTAPI
-HalpRegisterKdSupportFunctions(VOID)
-{
- /* Register PCI Device Functions */
- KdSetupPciDeviceForDebugging = HalpSetupPciDeviceForDebugging;
- KdReleasePciDeviceforDebugging = HalpReleasePciDeviceForDebugging;
-
- /* Register memory functions */
-#ifndef _MINIHAL_
- KdMapPhysicalMemory64 = HalpMapPhysicalMemory64;
- KdUnmapVirtualAddress = HalpUnmapVirtualAddress;
-#endif
-
- /* Register ACPI stub */
- KdCheckPowerButton = HalpCheckPowerButton;
-}
-
-NTSTATUS
-NTAPI
-HalpAssignSlotResources(IN PUNICODE_STRING RegistryPath,
- IN PUNICODE_STRING DriverClassName,
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN INTERFACE_TYPE BusType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN OUT PCM_RESOURCE_LIST *AllocatedResources)
-{
- BUS_HANDLER BusHandler;
- PAGED_CODE();
-
- /* Only PCI is supported */
- if (BusType != PCIBus) return STATUS_NOT_IMPLEMENTED;
-
- /* Setup fake PCI Bus handler */
- RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
- BusHandler.BusNumber = BusNumber;
-
- /* Call the PCI function */
- return HalpAssignPCISlotResources(&BusHandler,
- &BusHandler,
- RegistryPath,
- DriverClassName,
- DriverObject,
- DeviceObject,
- SlotNumber,
- AllocatedResources);
-}
-
-BOOLEAN
-NTAPI
-HalpTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress)
-{
- /* Translation is easy */
- TranslatedAddress->QuadPart = BusAddress.QuadPart;
- return TRUE;
-}
-
-ULONG
-NTAPI
-HalpGetSystemInterruptVector(IN ULONG BusNumber,
- IN ULONG BusInterruptLevel,
- IN ULONG BusInterruptVector,
- OUT PKIRQL Irql,
- OUT PKAFFINITY Affinity)
-{
- ULONG Vector = IRQ2VECTOR(BusInterruptLevel);
- *Irql = (KIRQL)VECTOR2IRQL(Vector);
- *Affinity = 0xFFFFFFFF;
- return Vector;
-}
-
-BOOLEAN
-NTAPI
-HalpFindBusAddressTranslation(IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress,
- IN OUT PULONG_PTR Context,
- IN BOOLEAN NextBus)
-{
- /* Make sure we have a context */
- if (!Context) return FALSE;
-
- /* If we have data in the context, then this shouldn't be a new lookup */
- if ((*Context) && (NextBus == TRUE)) return FALSE;
-
- /* Return bus data */
- TranslatedAddress->QuadPart = BusAddress.QuadPart;
-
- /* Set context value and return success */
- *Context = 1;
- return TRUE;
-}
-
-/* PUBLIC FUNCTIONS **********************************************************/
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-HalAdjustResourceList(IN PCM_RESOURCE_LIST Resources)
-{
- /* Deprecated, return success */
- return STATUS_SUCCESS;
-}
-
-/*
- * @implemented
- */
-NTSTATUS
-NTAPI
-HalAssignSlotResources(IN PUNICODE_STRING RegistryPath,
- IN PUNICODE_STRING DriverClassName,
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN INTERFACE_TYPE BusType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN OUT PCM_RESOURCE_LIST *AllocatedResources)
-{
- /* Check the bus type */
- if (BusType != PCIBus)
- {
- /* Call our internal handler */
- return HalpAssignSlotResources(RegistryPath,
- DriverClassName,
- DriverObject,
- DeviceObject,
- BusType,
- BusNumber,
- SlotNumber,
- AllocatedResources);
- }
- else
- {
- /* Call the PCI registered function */
- return HalPciAssignSlotResources(RegistryPath,
- DriverClassName,
- DriverObject,
- DeviceObject,
- PCIBus,
- BusNumber,
- SlotNumber,
- AllocatedResources);
- }
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalGetBusData(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length)
-{
- /* Call the extended function */
- return HalGetBusDataByOffset(BusDataType,
- BusNumber,
- SlotNumber,
- Buffer,
- 0,
- Length);
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalGetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length)
-{
- BUS_HANDLER BusHandler;
-
- /* Look as the bus type */
- if (BusDataType == Cmos)
- {
- /* Call CMOS Function */
- return HalpGetCmosData(0, SlotNumber, Buffer, Length);
- }
- else if (BusDataType == EisaConfiguration)
- {
- /* FIXME: TODO */
- ASSERT(FALSE);
- }
- else if ((BusDataType == PCIConfiguration) &&
- (HalpPCIConfigInitialized) &&
- ((BusNumber >= HalpMinPciBus) && (BusNumber <= HalpMaxPciBus)))
- {
- /* Setup fake PCI Bus handler */
- RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
- BusHandler.BusNumber = BusNumber;
-
- /* Call PCI function */
- return HalpGetPCIData(&BusHandler,
- &BusHandler,
- *(PPCI_SLOT_NUMBER)&SlotNumber,
- Buffer,
- Offset,
- Length);
- }
-
- /* Invalid bus */
- return 0;
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalGetInterruptVector(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN ULONG BusInterruptLevel,
- IN ULONG BusInterruptVector,
- OUT PKIRQL Irql,
- OUT PKAFFINITY Affinity)
-{
- /* Call the system bus translator */
- return HalpGetSystemInterruptVector(BusNumber,
- BusInterruptLevel,
- BusInterruptVector,
- Irql,
- Affinity);
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalSetBusData(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length)
-{
- /* Call the extended function */
- return HalSetBusDataByOffset(BusDataType,
- BusNumber,
- SlotNumber,
- Buffer,
- 0,
- Length);
-}
-
-/*
- * @implemented
- */
-ULONG
-NTAPI
-HalSetBusDataByOffset(IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length)
-{
- BUS_HANDLER BusHandler;
-
- /* Look as the bus type */
- if (BusDataType == Cmos)
- {
- /* Call CMOS Function */
- return HalpSetCmosData(0, SlotNumber, Buffer, Length);
- }
- else if ((BusDataType == PCIConfiguration) && (HalpPCIConfigInitialized))
- {
- /* Setup fake PCI Bus handler */
- RtlCopyMemory(&BusHandler, &HalpFakePciBusHandler, sizeof(BUS_HANDLER));
- BusHandler.BusNumber = BusNumber;
-
- /* Call PCI function */
- return HalpSetPCIData(&BusHandler,
- &BusHandler,
- *(PPCI_SLOT_NUMBER)&SlotNumber,
- Buffer,
- Offset,
- Length);
- }
-
- /* Invalid bus */
- return 0;
-}
-
-/*
- * @implemented
- */
-BOOLEAN
-NTAPI
-HalTranslateBusAddress(IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress)
-{
- /* Look as the bus type */
- if (InterfaceType == PCIBus)
- {
- /* Call the PCI registered function */
- return HalPciTranslateBusAddress(PCIBus,
- BusNumber,
- BusAddress,
- AddressSpace,
- TranslatedAddress);
- }
- else
- {
- /* Translation is easy */
- TranslatedAddress->QuadPart = BusAddress.QuadPart;
- return TRUE;
- }
-}
-
-/* EOF */
diff --git a/hal/halx86/generic/bus/isabus.c b/hal/halx86/generic/bus/isabus.c
deleted file mode 100644
index 7e9631f6536..00000000000
--- a/hal/halx86/generic/bus/isabus.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/isabus.c
- * PURPOSE:
- * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
- */
diff --git a/hal/halx86/generic/bus/sysbus.c b/hal/halx86/generic/bus/sysbus.c
deleted file mode 100644
index d011cb568c5..00000000000
--- a/hal/halx86/generic/bus/sysbus.c
+++ /dev/null
@@ -1,7 +0,0 @@
-/*
- * PROJECT: ReactOS HAL
- * LICENSE: GPL - See COPYING in the top level directory
- * FILE: hal/halx86/generic/bus/sysbus.c
- * PURPOSE:
- * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
- */
diff --git a/hal/halx86/generic/halinit.c b/hal/halx86/generic/halinit.c
index db54eb59d63..f0ebd33d4ca 100644
--- a/hal/halx86/generic/halinit.c
+++ b/hal/halx86/generic/halinit.c
@@ -14,223 +14,10 @@
/* GLOBALS *******************************************************************/
-/* Share with Mm headers? */
-#define MM_HAL_VA_START (PVOID)0xFFC00000
-#define MM_HAL_HEAP_START (PVOID)((ULONG_PTR)MM_HAL_VA_START + (1024 * 1024))
-
BOOLEAN HalpPciLockSettings;
-ULONG HalpUsedAllocDescriptors;
-MEMORY_ALLOCATION_DESCRIPTOR HalpAllocationDescriptorArray[64];
-PVOID HalpHeapStart = MM_HAL_HEAP_START;
/* PRIVATE FUNCTIONS *********************************************************/
-ULONG
-NTAPI
-HalpAllocPhysicalMemory(IN PLOADER_PARAMETER_BLOCK LoaderBlock,
- IN ULONG MaxAddress,
- IN ULONG PageCount,
- IN BOOLEAN Aligned)
-{
- ULONG UsedDescriptors, Alignment, PhysicalAddress;
- PFN_NUMBER MaxPage, BasePage;
- PLIST_ENTRY NextEntry;
- PMEMORY_ALLOCATION_DESCRIPTOR MdBlock, NewBlock, FreeBlock;
-
- /* Highest page we'll go */
- MaxPage = MaxAddress >> PAGE_SHIFT;
-
- /* We need at least two blocks */
- if ((HalpUsedAllocDescriptors + 2) > 64) return 0;
-
- /* Remember how many we have now */
- UsedDescriptors = HalpUsedAllocDescriptors;
-
- /* Loop the loader block memory descriptors */
- NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink;
- while (NextEntry != &LoaderBlock->MemoryDescriptorListHead)
- {
- /* Get the block */
- MdBlock = CONTAINING_RECORD(NextEntry,
- MEMORY_ALLOCATION_DESCRIPTOR,
- ListEntry);
-
- /* No alignment by default */
- Alignment = 0;
-
- /* Unless requested, in which case we use a 64KB block alignment */
- if (Aligned) Alignment = ((MdBlock->BasePage + 0x0F) & ~0x0F) - MdBlock->BasePage;
-
- /* Search for free memory */
- if ((MdBlock->MemoryType == LoaderFree) ||
- (MdBlock->MemoryType == MemoryFirmwareTemporary))
- {
- /* Make sure the page is within bounds, including alignment */
- BasePage = MdBlock->BasePage;
- if ((BasePage) &&
- (MdBlock->PageCount >= PageCount + Alignment) &&
- (BasePage + PageCount + Alignment < MaxPage))
- {
-
- /* We found an address */
- PhysicalAddress = (BasePage + Alignment) << PAGE_SHIFT;
- break;
- }
- }
-
- /* Keep trying */
- NextEntry = NextEntry->Flink;
- }
-
- /* If we didn't find anything, get out of here */
- if (NextEntry == &LoaderBlock->MemoryDescriptorListHead) return 0;
-
- /* Okay, now get a descriptor */
- NewBlock = &HalpAllocationDescriptorArray[HalpUsedAllocDescriptors];
- NewBlock->PageCount = PageCount;
- NewBlock->BasePage = MdBlock->BasePage + Alignment;
- NewBlock->MemoryType = LoaderHALCachedMemory;
-
- /* Update count */
- UsedDescriptors++;
- HalpUsedAllocDescriptors = UsedDescriptors;
-
- /* Check if we had any alignment */
- if (Alignment)
- {
- /* Check if we had leftovers */
- if ((MdBlock->PageCount - Alignment) != PageCount)
- {
- /* Get the next descriptor */
- FreeBlock = &HalpAllocationDescriptorArray[UsedDescriptors];
- FreeBlock->PageCount = MdBlock->PageCount - Alignment - PageCount;
- FreeBlock->BasePage = MdBlock->BasePage + Alignment + PageCount;
-
- /* One more */
- HalpUsedAllocDescriptors++;
-
- /* Insert it into the list */
- InsertHeadList(&MdBlock->ListEntry, &FreeBlock->ListEntry);
- }
-
- /* Use this descriptor */
- NewBlock->PageCount = Alignment;
- InsertHeadList(&MdBlock->ListEntry, &NewBlock->ListEntry);
- }
- else
- {
- /* Consume memory from this block */
- MdBlock->BasePage += PageCount;
- MdBlock->PageCount -= PageCount;
-
- /* Insert the descriptor */
- InsertTailList(&MdBlock->ListEntry, &NewBlock->ListEntry);
-
- /* Remove the entry if the whole block was allocated */
- if (!MdBlock->PageCount == 0) RemoveEntryList(&MdBlock->ListEntry);
- }
-
- /* Return the address */
- return PhysicalAddress;
-}
-
-PVOID
-NTAPI
-HalpMapPhysicalMemory64(IN PHYSICAL_ADDRESS PhysicalAddress,
- IN ULONG PageCount)
-{
- PHARDWARE_PTE PointerPte;
- ULONG UsedPages = 0;
- PVOID VirtualAddress, BaseAddress;
-
- /* Start at the current HAL heap base */
- BaseAddress = HalpHeapStart;
- VirtualAddress = BaseAddress;
-
- /* Loop until we have all the pages required */
- while (UsedPages < PageCount)
- {
- /* If this overflows past the HAL heap, it means there's no space */
- if (VirtualAddress == NULL) return NULL;
-
- /* Get the PTE for this address */
- PointerPte = HalAddressToPte(VirtualAddress);
-
- /* Go to the next page */
- VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress + PAGE_SIZE);
-
- /* Check if the page is available */
- if (PointerPte->Valid)
- {
- /* PTE has data, skip it and start with a new base address */
- BaseAddress = VirtualAddress;
- UsedPages = 0;
- continue;
- }
-
- /* PTE is available, keep going on this run */
- UsedPages++;
- }
-
- /* Take the base address of the page plus the actual offset in the address */
- VirtualAddress = (PVOID)((ULONG_PTR)BaseAddress +
- BYTE_OFFSET(PhysicalAddress.LowPart));
-
- /* If we are starting at the heap, move the heap */
- if (BaseAddress == HalpHeapStart)
- {
- /* Past this allocation */
- HalpHeapStart = (PVOID)((ULONG_PTR)BaseAddress + (PageCount * PAGE_SIZE));
- }
-
- /* Loop pages that can be mapped */
- while (UsedPages--)
- {
- /* Fill out the PTE */
- PointerPte = HalAddressToPte(BaseAddress);
- PointerPte->PageFrameNumber = PhysicalAddress.QuadPart >> PAGE_SHIFT;
- PointerPte->Valid = 1;
- PointerPte->Write = 1;
-
- /* Move to the next address */
- PhysicalAddress.QuadPart += PAGE_SIZE;
- BaseAddress = (PVOID)((ULONG_PTR)BaseAddress + PAGE_SIZE);
- }
-
- /* Flush the TLB and return the address */
- HalpFlushTLB();
- return VirtualAddress;
-}
-
-VOID
-NTAPI
-HalpUnmapVirtualAddress(IN PVOID VirtualAddress,
- IN ULONG PageCount)
-{
- PHARDWARE_PTE PointerPte;
- ULONG i;
-
- /* Only accept valid addresses */
- if (VirtualAddress < MM_HAL_VA_START) return;
-
- /* Align it down to page size */
- VirtualAddress = (PVOID)((ULONG_PTR)VirtualAddress & ~(PAGE_SIZE - 1));
-
- /* Loop PTEs */
- PointerPte = HalAddressToPte(VirtualAddress);
- for (i = 0; i < PageCount; i++)
- {
- *(PULONG)PointerPte = 0;
- PointerPte++;
- }
-
- /* Flush the TLB */
- HalpFlushTLB();
-
- /* Put the heap back */
- if (HalpHeapStart > VirtualAddress) HalpHeapStart = VirtualAddress;
-}
-
VOID
NTAPI
HalpGetParameters(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
@@ -368,7 +155,7 @@ HalInitSystem(IN ULONG BootPhase,
else if (BootPhase == 1)
{
/* Initialize bus handlers */
- HalpInitBusHandler();
+ HalpInitBusHandlers();
#ifndef _MINIHAL_
/* Enable IRQ 0 */
diff --git a/hal/halx86/generic/legacy/bus/bushndlr.c b/hal/halx86/generic/legacy/bus/bushndlr.c
new file mode 100644
index 00000000000..2ab551c610e
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/bushndlr.c
@@ -0,0 +1,449 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/bushndlr.c
+ * PURPOSE: Generic HAL Bus Handler Support
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+KSPIN_LOCK HalpBusDatabaseSpinLock;
+KEVENT HalpBusDatabaseEvent;
+LIST_ENTRY HalpAllBusHandlers;
+PARRAY HalpBusTable;
+PARRAY HalpConfigTable;
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+PARRAY
+NTAPI
+HalpAllocateArray(IN ULONG ArraySize)
+{
+ PARRAY Array;
+ ULONG Size;
+
+ /* Compute array size */
+ if (ArraySize == MAXULONG) ArraySize = 0;
+ Size = ArraySize * sizeof(PARRAY) + sizeof(ARRAY);
+
+ /* Allocate the array */
+ Array = ExAllocatePoolWithTag(NonPagedPool,
+ Size,
+ 'BusH');
+ if (!Array) KeBugCheckEx(HAL_MEMORY_ALLOCATION, Size, 0, (ULONG_PTR)__FILE__, __LINE__);
+
+ /* Initialize it */
+ Array->ArraySize = ArraySize;
+ RtlZeroMemory(Array->Element, sizeof(PVOID) * (ArraySize + 1));
+ return Array;
+}
+
+VOID
+NTAPI
+HalpGrowArray(IN PARRAY *CurrentArray,
+ IN PARRAY *NewArray)
+{
+ PVOID Tmp;
+
+ /* Check if the current array doesn't exist yet, or if it's smaller than the new one */
+ if (!(*CurrentArray) || ((*NewArray)->ArraySize > (*CurrentArray)->ArraySize))
+ {
+ /* Does it exist (and can it fit?) */
+ if (*CurrentArray)
+ {
+ /* Copy the current array into the new one */
+ RtlCopyMemory(&(*NewArray)->Element,
+ &(*CurrentArray)->Element,
+ sizeof(PVOID) * ((*CurrentArray)->ArraySize + 1));
+ }
+
+ /* Swap the pointers (XOR swap would be more l33t) */
+ Tmp = *CurrentArray;
+ *CurrentArray = *NewArray;
+ *NewArray = Tmp;
+ }
+}
+
+PBUS_HANDLER
+FASTCALL
+HalpLookupHandler(IN PARRAY Array,
+ IN ULONG Type,
+ IN ULONG Number,
+ IN BOOLEAN AddReference)
+{
+ PHAL_BUS_HANDLER Bus;
+ PBUS_HANDLER Handler = NULL;
+
+ /* Make sure the entry exists */
+ if (Array->ArraySize >= Type)
+ {
+ /* Retrieve it */
+ Array = Array->Element[Type];
+
+ /* Make sure the entry array exists */
+ if ((Array) && (Array->ArraySize >= Number))
+ {
+ /* Retrieve the bus and its handler */
+ Bus = Array->Element[Number];
+ Handler = &Bus->Handler;
+
+ /* Reference the handler if needed */
+ if (AddReference) Bus->ReferenceCount++;
+ }
+ }
+
+ /* Return the handler */
+ return Handler;
+}
+
+ULONG
+NTAPI
+HalpNoBusData(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ /* Not implemented */
+ DPRINT1("STUB GetSetBusData\n");
+ return 0;
+}
+
+NTSTATUS
+NTAPI
+HalpNoAdjustResourceList(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList)
+{
+ DPRINT1("STUB Adjustment\n");
+ return STATUS_UNSUCCESSFUL;
+}
+
+NTSTATUS
+NTAPI
+HalpNoAssignSlotResources(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ IN ULONG SlotNumber,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources)
+{
+ DPRINT1("STUB Assignment\n");
+ return STATUS_NOT_SUPPORTED;
+}
+
+VOID
+FASTCALL
+HaliReferenceBusHandler(IN PBUS_HANDLER Handler)
+{
+ PHAL_BUS_HANDLER Bus;
+
+ /* Find and reference the bus handler */
+ Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
+ Bus->ReferenceCount++;
+}
+
+VOID
+FASTCALL
+HaliDereferenceBusHandler(IN PBUS_HANDLER Handler)
+{
+ PHAL_BUS_HANDLER Bus;
+
+ /* Find and dereference the bus handler */
+ Bus = CONTAINING_RECORD(Handler, HAL_BUS_HANDLER, Handler);
+ Bus->ReferenceCount--;
+ ASSERT(Bus->ReferenceCount != 0);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliHandlerForBus(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the interface in the bus table */
+ return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, FALSE);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the configuration in the configuration table */
+ return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, FALSE);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliReferenceHandlerForBus(IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the interface in the bus table, and reference the handler */
+ return HalpLookupHandler(HalpBusTable, InterfaceType, BusNumber, TRUE);
+}
+
+PBUS_HANDLER
+FASTCALL
+HaliReferenceHandlerForConfigSpace(IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber)
+{
+ /* Lookup the configuration in the configuration table and add a reference */
+ return HalpLookupHandler(HalpConfigTable, ConfigType, BusNumber, TRUE);
+}
+
+PBUS_HANDLER
+NTAPI
+HalpContextToBusHandler(IN ULONG_PTR ContextValue)
+{
+ PLIST_ENTRY NextEntry;
+ PHAL_BUS_HANDLER BusHandler, ThisHandler;
+
+ /* Start lookup */
+ NextEntry = HalpAllBusHandlers.Flink;
+ ThisHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+ if (ContextValue)
+ {
+ /* If the list is empty, quit */
+ if (IsListEmpty(&HalpAllBusHandlers)) return NULL;
+
+ /* Otherwise, scan the list */
+ BusHandler = CONTAINING_RECORD(ContextValue, HAL_BUS_HANDLER, Handler);
+ do
+ {
+ /* Check if we've reached the right one */
+ ThisHandler = CONTAINING_RECORD(NextEntry, HAL_BUS_HANDLER, AllHandlers);
+ if (ThisHandler == BusHandler) break;
+
+ /* Try the next one */
+ NextEntry = NextEntry->Flink;
+ } while (NextEntry != &HalpAllBusHandlers);
+ }
+
+ /* If we looped back to the end, we didn't find anything */
+ if (NextEntry == &HalpAllBusHandlers) return NULL;
+
+ /* Otherwise return the handler */
+ return &ThisHandler->Handler;
+}
+
+#ifndef _MINIHAL_
+NTSTATUS
+NTAPI
+HaliRegisterBusHandler(IN INTERFACE_TYPE InterfaceType,
+ IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber,
+ IN INTERFACE_TYPE ParentBusType,
+ IN ULONG ParentBusNumber,
+ IN ULONG ExtraData,
+ IN PINSTALL_BUS_HANDLER InstallCallback,
+ OUT PBUS_HANDLER *ReturnedBusHandler)
+{
+ PHAL_BUS_HANDLER Bus, OldHandler = NULL;
+ PHAL_BUS_HANDLER* BusEntry;
+ //PVOID CodeHandle;
+ PARRAY InterfaceArray, InterfaceBusNumberArray, ConfigArray, ConfigBusNumberArray;
+ PBUS_HANDLER ParentHandler;
+ KIRQL OldIrql;
+ NTSTATUS Status;
+
+ /* Make sure we have a valid handler */
+ ASSERT((InterfaceType != InterfaceTypeUndefined) ||
+ (ConfigType != ConfigurationSpaceUndefined));
+
+ /* Allocate the bus handler */
+ Bus = ExAllocatePoolWithTag(NonPagedPool,
+ sizeof(HAL_BUS_HANDLER) + ExtraData,
+ 'HsuB');
+ if (!Bus) return STATUS_INSUFFICIENT_RESOURCES;
+
+ /* Return the handler */
+ *ReturnedBusHandler = &Bus->Handler;
+
+ /* FIXME: Fix the kernel first. Don't page us out */
+ //CodeHandle = MmLockPagableDataSection(&HaliRegisterBusHandler);
+
+ /* Synchronize with anyone else */
+ KeWaitForSingleObject(&HalpBusDatabaseEvent,
+ WrExecutive,
+ KernelMode,
+ FALSE,
+ NULL);
+
+ /* Check for unknown/root bus */
+ if (BusNumber == -1)
+ {
+ /* We must have an interface */
+ ASSERT(InterfaceType != InterfaceTypeUndefined);
+
+ /* Find the right bus */
+ BusNumber = 0;
+ while (HaliHandlerForBus(InterfaceType, BusNumber)) BusNumber++;
+ }
+
+ /* Allocate arrays for the handler */
+ InterfaceArray = HalpAllocateArray(InterfaceType);
+ InterfaceBusNumberArray = HalpAllocateArray(BusNumber);
+ ConfigArray = HalpAllocateArray(ConfigType);
+ ConfigBusNumberArray = HalpAllocateArray(BusNumber);
+
+ /* Only proceed if all allocations succeeded */
+ if ((InterfaceArray) && (InterfaceBusNumberArray) && (ConfigArray) && (ConfigBusNumberArray))
+ {
+ /* Find the parent handler if any */
+ ParentHandler = HaliReferenceHandlerForBus(ParentBusType, ParentBusNumber);
+
+ /* Initialize the handler */
+ RtlZeroMemory(Bus, sizeof(HAL_BUS_HANDLER) + ExtraData);
+ Bus->ReferenceCount = 1;
+
+ /* Fill out bus data */
+ Bus->Handler.BusNumber = BusNumber;
+ Bus->Handler.InterfaceType = InterfaceType;
+ Bus->Handler.ConfigurationType = ConfigType;
+ Bus->Handler.ParentHandler = ParentHandler;
+
+ /* Fill out dummy handlers */
+ Bus->Handler.GetBusData = HalpNoBusData;
+ Bus->Handler.SetBusData = HalpNoBusData;
+ Bus->Handler.AdjustResourceList = HalpNoAdjustResourceList;
+ Bus->Handler.AssignSlotResources = HalpNoAssignSlotResources;
+
+ /* Make space for extra data */
+ if (ExtraData) Bus->Handler.BusData = Bus + 1;
+
+ /* Check for a parent handler */
+ if (ParentHandler)
+ {
+ /* Inherit the parent routines */
+ Bus->Handler.GetBusData = ParentHandler->GetBusData;
+ Bus->Handler.SetBusData = ParentHandler->SetBusData;
+ Bus->Handler.AdjustResourceList = ParentHandler->AdjustResourceList;
+ Bus->Handler.AssignSlotResources = ParentHandler->AssignSlotResources;
+ Bus->Handler.TranslateBusAddress = ParentHandler->TranslateBusAddress;
+ Bus->Handler.GetInterruptVector = ParentHandler->GetInterruptVector;
+ }
+
+ /* We don't support this yet */
+ ASSERT(!InstallCallback);
+
+ /* Lock the buses */
+ KeAcquireSpinLock(&HalpBusDatabaseSpinLock, &OldIrql);
+
+ /* Make space for the interface */
+ HalpGrowArray(&HalpBusTable, &InterfaceArray);
+
+ /* Check if we really have an interface */
+ if (InterfaceType != InterfaceTypeUndefined)
+ {
+ /* Make space for the association */
+ HalpGrowArray((PARRAY*)&HalpBusTable->Element[InterfaceType],
+ &InterfaceBusNumberArray);
+
+ /* Get the bus handler pointer */
+ BusEntry = (PHAL_BUS_HANDLER*)&((PARRAY)HalpBusTable->Element[InterfaceType])->Element[BusNumber];
+
+ /* Check if there was already a handler there, and set the new one */
+ if (*BusEntry) OldHandler = *BusEntry;
+ *BusEntry = Bus;
+ }
+
+ /* Now add a space for the configuration space */
+ HalpGrowArray(&HalpConfigTable, &ConfigArray);
+
+ /* Check if we really have one */
+ if (ConfigType != ConfigurationSpaceUndefined)
+ {
+ /* Make space for this association */
+ HalpGrowArray((PARRAY*)&HalpConfigTable->Element[ConfigType],
+ &ConfigBusNumberArray);
+
+ /* Get the bus handler pointer */
+ BusEntry = (PHAL_BUS_HANDLER*)&((PARRAY)HalpConfigTable->Element[ConfigType])->Element[BusNumber];
+ if (*BusEntry)
+ {
+ /* Get the old entry, but make sure it's the same we had before */
+ ASSERT((OldHandler == NULL) || (OldHandler == *BusEntry));
+ OldHandler = *BusEntry;
+ }
+
+ /* Set the new entry */
+ *BusEntry = Bus;
+ }
+
+ /* Link the adapter */
+ InsertTailList(&HalpAllBusHandlers, &Bus->AllHandlers);
+
+ /* Remove the old linkage */
+ Bus = OldHandler;
+ if (Bus) RemoveEntryList(&Bus->AllHandlers);
+
+ /* Release the lock */
+ KeReleaseSpinLock(&HalpBusDatabaseSpinLock, OldIrql);
+ Status = STATUS_SUCCESS;
+ }
+ else
+ {
+ /* Fail */
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ }
+
+ /* Signal the event */
+ KeSetEvent(&HalpBusDatabaseEvent, 0, FALSE);
+
+ /* FIXME: Fix the kernel first. Re-page the function */
+ //MmUnlockPagableImageSection(CodeHandle);
+
+ /* Free all allocations */
+ if (Bus) ExFreePool(Bus);
+ if (InterfaceArray) ExFreePool(InterfaceArray);
+ if (InterfaceBusNumberArray) ExFreePool(InterfaceBusNumberArray);
+ if (ConfigArray) ExFreePool(ConfigArray);
+ if (ConfigBusNumberArray) ExFreePool(ConfigBusNumberArray);
+
+ /* And we're done */
+ return Status;
+}
+#endif
+
+VOID
+NTAPI
+HalpInitBusHandler(VOID)
+{
+ /* Setup the bus lock */
+ KeInitializeSpinLock(&HalpBusDatabaseSpinLock);
+
+ /* Setup the bus event */
+ KeInitializeEvent(&HalpBusDatabaseEvent, SynchronizationEvent, TRUE);
+
+ /* Setup the bus configuration and bus table */
+ HalpBusTable = HalpAllocateArray(0);
+ HalpConfigTable = HalpAllocateArray(0);
+
+ /* Setup the bus list */
+ InitializeListHead(&HalpAllBusHandlers);
+
+ /* Setup the HAL Dispatch routines */
+#ifndef _MINIHAL_
+ HalRegisterBusHandler = HaliRegisterBusHandler;
+ HalHandlerForBus = HaliHandlerForBus;
+ HalHandlerForConfigSpace = HaliHandlerForConfigSpace;
+ HalReferenceHandlerForBus = HaliReferenceHandlerForBus;
+ HalReferenceBusHandler = HaliReferenceBusHandler;
+ HalDereferenceBusHandler = HaliDereferenceBusHandler;
+#endif
+ HalPciAssignSlotResources = HalpAssignSlotResources;
+ HalPciTranslateBusAddress = HaliTranslateBusAddress; /* PCI Driver can override */
+ if (!HalFindBusAddressTranslation) HalFindBusAddressTranslation = HaliFindBusAddressTranslation;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/bus/cmosbus.c b/hal/halx86/generic/legacy/bus/cmosbus.c
new file mode 100644
index 00000000000..279aebf9e20
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/cmosbus.c
@@ -0,0 +1,47 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/sysbus.c
+ * PURPOSE:
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+ULONG
+NTAPI
+HalpcGetCmosData(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ DPRINT1("CMOS GetData\n");
+ while (TRUE);
+ return 0;
+}
+
+ULONG
+NTAPI
+HalpcSetCmosData(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length)
+{
+ DPRINT1("CMOS SetData\n");
+ while (TRUE);
+ return 0;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/bus/isabus.c b/hal/halx86/generic/legacy/bus/isabus.c
new file mode 100644
index 00000000000..4d716a1060c
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/isabus.c
@@ -0,0 +1,51 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/isabus.c
+ * PURPOSE:
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+BOOLEAN
+NTAPI
+HalpTranslateIsaBusAddress(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+ BOOLEAN Status;
+
+ /* Use system translation */
+ Status = HalpTranslateSystemBusAddress(BusHandler,
+ RootHandler,
+ BusAddress,
+ AddressSpace,
+ TranslatedAddress);
+
+ /* If it didn't work and it was memory address space... */
+ if (!(Status) && (*AddressSpace == 0))
+ {
+ /* Try EISA translation instead */
+ Status = HalTranslateBusAddress(Eisa,
+ BusHandler->BusNumber,
+ BusAddress,
+ AddressSpace,
+ TranslatedAddress);
+ }
+
+ /* Return the result */
+ return Status;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/bus/pcibus.c b/hal/halx86/generic/legacy/bus/pcibus.c
similarity index 94%
rename from hal/halx86/generic/bus/pcibus.c
rename to hal/halx86/generic/legacy/bus/pcibus.c
index 3c46e805122..6cdbfb168ec 100644
--- a/hal/halx86/generic/bus/pcibus.c
+++ b/hal/halx86/generic/legacy/bus/pcibus.c
@@ -14,6 +14,8 @@
/* GLOBALS *******************************************************************/
+ULONG HalpBusType;
+
PCI_TYPE1_CFG_CYCLE_BITS HalpPciDebuggingDevice[2] = {{{{0}}}};
BOOLEAN HalpPCIConfigInitialized;
@@ -391,7 +393,6 @@ HalpGetPCIData(IN PBUS_HANDLER BusHandler,
if (PciConfig->VendorID == PCI_INVALID_VENDORID)
{
/* It's invalid, but we want to return this much */
- PciConfig->VendorID = PCI_INVALID_VENDORID;
Len = sizeof(USHORT);
}
@@ -506,6 +507,62 @@ HalpSetPCIData(IN PBUS_HANDLER BusHandler,
return Len;
}
+ULONG
+NTAPI
+HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ /* Validate the level first */
+ if (BusInterruptLevel < 1) return 0;
+
+ /* PCI has its IRQs on top of ISA IRQs, so pass it on to the ISA handler */
+ return HalGetInterruptVector(Isa,
+ 0,
+ BusInterruptLevel,
+ 0,
+ Irql,
+ Affinity);
+}
+
+VOID
+NTAPI
+HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciData)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+}
+
+VOID
+NTAPI
+HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciNewData,
+ IN PPCI_COMMON_CONFIG PciOldData)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+}
+
+NTSTATUS
+NTAPI
+HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER PciSlot,
+ OUT PSUPPORTED_RANGE *Range)
+{
+ UNIMPLEMENTED;
+ while (TRUE);
+ return STATUS_SUCCESS;
+}
+
NTSTATUS
NTAPI
HalpSetupPciDeviceForDebugging(IN PVOID LoaderBlock,
@@ -559,6 +616,18 @@ PciSize(ULONG Base, ULONG Mask)
return Size;
}
+NTSTATUS
+NTAPI
+HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList)
+{
+ /* Not yet supported */
+ DbgPrint("HAL: PCI Resource List Adjustment not implemented!");
+ while (TRUE);
+ return STATUS_UNSUCCESSFUL;
+}
+
NTSTATUS
NTAPI
HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler,
@@ -579,6 +648,7 @@ HalpAssignPCISlotResources(IN PBUS_HANDLER BusHandler,
PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor;
PCI_SLOT_NUMBER SlotNumber;
ULONG WriteBuffer;
+ DPRINT1("WARNING: PCI Slot Resource Assignment is FOOBAR\n");
/* FIXME: Should handle 64-bit addresses */
@@ -1062,3 +1132,5 @@ HalpInitializePciStubs(VOID)
HalpPCIConfigInitialized = TRUE;
}
+/* EOF */
+
diff --git a/hal/halx86/generic/bus/pcidata.c b/hal/halx86/generic/legacy/bus/pcidata.c
similarity index 100%
rename from hal/halx86/generic/bus/pcidata.c
rename to hal/halx86/generic/legacy/bus/pcidata.c
diff --git a/hal/halx86/generic/legacy/bus/sysbus.c b/hal/halx86/generic/legacy/bus/sysbus.c
new file mode 100644
index 00000000000..f8778f4df30
--- /dev/null
+++ b/hal/halx86/generic/legacy/bus/sysbus.c
@@ -0,0 +1,164 @@
+/*
+ * PROJECT: ReactOS HAL
+ * LICENSE: GPL - See COPYING in the top level directory
+ * FILE: hal/halx86/generic/bus/sysbus.c
+ * PURPOSE:
+ * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include
+#define NDEBUG
+#include
+
+/* GLOBALS ********************************************************************/
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+BOOLEAN
+NTAPI
+HalpTranslateSystemBusAddress(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress)
+{
+ PSUPPORTED_RANGE Range = NULL;
+
+ /* Check what kind of address space this is */
+ switch (*AddressSpace)
+ {
+ /* Memory address */
+ case 0:
+
+ /* Loop all prefetech memory */
+ for (Range = &BusHandler->BusAddresses->PrefetchMemory;
+ Range;
+ Range = Range->Next)
+ {
+ /* Check if it's in a valid range */
+ if ((BusAddress.QuadPart >= Range->Base) &&
+ (BusAddress.QuadPart <= Range->Limit))
+ {
+ /* Get out */
+ break;
+ }
+ }
+
+ /* Check if we haven't found anything yet */
+ if (!Range)
+ {
+ /* Loop all bus memory */
+ for (Range = &BusHandler->BusAddresses->Memory;
+ Range;
+ Range = Range->Next)
+ {
+ /* Check if it's in a valid range */
+ if ((BusAddress.QuadPart >= Range->Base) &&
+ (BusAddress.QuadPart <= Range->Limit))
+ {
+ /* Get out */
+ break;
+ }
+ }
+ }
+
+ /* Done */
+ break;
+
+ /* I/O Space */
+ case 1:
+
+ /* Loop all bus I/O memory */
+ for (Range = &BusHandler->BusAddresses->IO;
+ Range;
+ Range = Range->Next)
+ {
+ /* Check if it's in a valid range */
+ if ((BusAddress.QuadPart >= Range->Base) &&
+ (BusAddress.QuadPart <= Range->Limit))
+ {
+ /* Get out */
+ break;
+ }
+ }
+
+ /* Done */
+ break;
+ }
+
+ /* Check if we found a range */
+ if (Range)
+ {
+ /* Do the translation and return the kind of address space this is */
+ TranslatedAddress->QuadPart = BusAddress.QuadPart + Range->SystemBase;
+ if ((TranslatedAddress->QuadPart != BusAddress.QuadPart) ||
+ (*AddressSpace != Range->SystemAddressSpace))
+ {
+ /* Different than what the old HAL would do */
+ DPRINT1("Translation of %I64x is %I64x %s\n",
+ BusAddress.QuadPart, TranslatedAddress->QuadPart,
+ Range->SystemAddressSpace ? "In I/O Space" : "In RAM");
+ }
+ *AddressSpace = Range->SystemAddressSpace;
+ return TRUE;
+ }
+
+ /* Nothing found */
+ DPRINT1("Translation of %I64x failed!\n", BusAddress.QuadPart);
+ return FALSE;
+}
+
+ULONG
+NTAPI
+HalpGetRootInterruptVector(IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ ULONG SystemVector;
+
+ /* Get the system vector */
+ SystemVector = PRIMARY_VECTOR_BASE + BusInterruptLevel;
+
+ /* Validate it */
+ if ((SystemVector < PRIMARY_VECTOR_BASE) || (SystemVector > PRIMARY_VECTOR_BASE + 27))
+ {
+ /* Invalid vector */
+ DPRINT1("Vector %lx is too low or too high!\n", SystemVector);
+ return 0;
+ }
+
+ /* Return the IRQL and affinity */
+ *Irql = (PRIMARY_VECTOR_BASE + 27) - SystemVector;
+ *Affinity = HalpDefaultInterruptAffinity;
+ ASSERT(HalpDefaultInterruptAffinity);
+
+ /* Return the vector */
+ return SystemVector;
+}
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity)
+{
+ ULONG Vector;
+
+ /* Get the root vector */
+ Vector = HalpGetRootInterruptVector(BusInterruptLevel,
+ BusInterruptVector,
+ Irql,
+ Affinity);
+
+ /* Check if the vector is owned by the HAL and fail if it is */
+ if (HalpIDTUsageFlags[Vector].Flags & IDT_REGISTERED) DPRINT1("Vector %lx is ALREADY IN USE!\n", Vector);
+ return (HalpIDTUsageFlags[Vector].Flags & IDT_REGISTERED) ? 0 : Vector;
+}
+
+/* EOF */
diff --git a/hal/halx86/generic/legacy/halpcat.c b/hal/halx86/generic/legacy/halpcat.c
index ea16403676e..0b85acd54ae 100644
--- a/hal/halx86/generic/legacy/halpcat.c
+++ b/hal/halx86/generic/legacy/halpcat.c
@@ -1,7 +1,7 @@
/*
* PROJECT: ReactOS HAL
* LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: hal/halx86/generic/acpi/halpcat.c
+ * FILE: hal/halx86/generic/legacy/halpcat.c
* PURPOSE: HAL Legacy Support Code
* PROGRAMMERS: ReactOS Portable Systems Group
*/
@@ -29,19 +29,6 @@ HalpSetupAcpiPhase0(IN PLOADER_PARAMETER_BLOCK LoaderBlock)
return STATUS_NO_SUCH_DEVICE;
}
-VOID
-NTAPI
-HalpInitializePciBus(VOID)
-{
- /* FIXME: Should do legacy PCI bus detection */
-
- /* FIXME: Should detect chipset hacks */
-
- /* FIXME: Should detect broken PCI hardware and apply hacks */
-
- /* FIXME: Should build resource ranges */
-}
-
VOID
NTAPI
HalpBuildAddressMap(VOID)
diff --git a/hal/halx86/generic/timer.c b/hal/halx86/generic/timer.c
index 6d90dada9b8..524b6cecb34 100644
--- a/hal/halx86/generic/timer.c
+++ b/hal/halx86/generic/timer.c
@@ -109,6 +109,7 @@ HalpInitializeClock(VOID)
HalpCurrentRollOver = RollOver;
}
+#ifdef _M_IX86
#ifndef _MINIHAL_
VOID
FASTCALL
@@ -163,6 +164,7 @@ HalpProfileInterruptHandler(IN PKTRAP_FRAME TrapFrame)
}
#endif
+#endif
/* PUBLIC FUNCTIONS ***********************************************************/
diff --git a/hal/halx86/generic/usage.c b/hal/halx86/generic/usage.c
index 02c86e2a046..c35df96c3e5 100644
--- a/hal/halx86/generic/usage.c
+++ b/hal/halx86/generic/usage.c
@@ -509,17 +509,11 @@ HalpEnableInterruptHandler(IN UCHAR Flags,
IN PVOID Handler,
IN KINTERRUPT_MODE Mode)
{
- UCHAR Entry;
-
- /* Convert the vector into the IDT entry */
- Entry = HalVectorToIDTEntry(SystemVector);
-
/* Register the vector */
HalpRegisterVector(Flags, BusVector, SystemVector, Irql);
/* Connect the interrupt */
- ((PKIPCR)KeGetPcr())->IDT[Entry].ExtendedOffset = (USHORT)(((ULONG_PTR)Handler >> 16) & 0xFFFF);
- ((PKIPCR)KeGetPcr())->IDT[Entry].Offset = (USHORT)((ULONG_PTR)Handler);
+ KeRegisterInterruptHandler(SystemVector, Handler);
/* Enable the interrupt */
HalEnableSystemInterrupt(SystemVector, Irql, Mode);
diff --git a/hal/halx86/hal_generic.rbuild b/hal/halx86/hal_generic.rbuild
index 3532d001d18..0cd4e5aac43 100644
--- a/hal/halx86/hal_generic.rbuild
+++ b/hal/halx86/hal_generic.rbuild
@@ -7,20 +7,12 @@
-
- bushndlr.c
- isabus.c
- halbus.c
- pcibus.c
- pcidata.c
- sysbus.c
-
beep.c
cmos.c
display.c
dma.c
drive.c
- halinit.c
+ memory.c
misc.c
profil.c
reboot.c
@@ -29,25 +21,13 @@
usage.c
bios.c
+ halinit.c
portio.c
systimer.S
trap.S
-
-
-
-
- x86bios.c
-
-
-
-
- systimer.S
-
-
-
hal.h
diff --git a/hal/halx86/hal_generic_acpi.rbuild b/hal/halx86/hal_generic_acpi.rbuild
index 3784394b642..97501cb1823 100644
--- a/hal/halx86/hal_generic_acpi.rbuild
+++ b/hal/halx86/hal_generic_acpi.rbuild
@@ -10,7 +10,13 @@
halacpi.c
halpnpdd.c
+ busemul.c
+
+
+ pcibus.c
+
+
diff --git a/hal/halx86/hal_generic_pcat.rbuild b/hal/halx86/hal_generic_pcat.rbuild
index e00ed5bdb4e..51f46eefc71 100644
--- a/hal/halx86/hal_generic_pcat.rbuild
+++ b/hal/halx86/hal_generic_pcat.rbuild
@@ -8,6 +8,15 @@
+
+ bushndlr.c
+ cmosbus.c
+ isabus.c
+ pcibus.c
+ pcidata.c
+ sysbus.c
+
+ bussupp.c
halpcat.c
diff --git a/hal/halx86/hal_mini.rbuild b/hal/halx86/hal_mini.rbuild
index a7baed44639..b2c8b718735 100644
--- a/hal/halx86/hal_mini.rbuild
+++ b/hal/halx86/hal_mini.rbuild
@@ -9,13 +9,16 @@
-
- bushndlr.c
- isabus.c
- halbus.c
- pcibus.c
- pcidata.c
- sysbus.c
+
+
+ bushndlr.c
+ cmosbus.c
+ isabus.c
+ pcibus.c
+ pcidata.c
+ sysbus.c
+
+ bussupp.c
beep.c
bios.c
diff --git a/hal/halx86/halamd64.rbuild b/hal/halx86/halamd64.rbuild
index 92c4f29983d..02f633c9fd0 100644
--- a/hal/halx86/halamd64.rbuild
+++ b/hal/halx86/halamd64.rbuild
@@ -8,6 +8,7 @@
include
+
hal_generic
@@ -19,18 +20,14 @@
spinlock.c
-
+
+ x86bios.c
+ halinit.c
+ stubs.c
+ systimer.S
processor.c
-
diff --git a/hal/halx86/include/bus.h b/hal/halx86/include/bus.h
index 03840227411..3f6e1d6d546 100644
--- a/hal/halx86/include/bus.h
+++ b/hal/halx86/include/bus.h
@@ -205,6 +205,18 @@ typedef struct _HAL_BUS_HANDLER
/* FUNCTIONS *****************************************************************/
+/* SHARED (Fake PCI-BUS HANDLER) */
+
+extern PCI_CONFIG_HANDLER PCIConfigHandler;
+extern PCI_CONFIG_HANDLER PCIConfigHandlerType1;
+extern PCI_CONFIG_HANDLER PCIConfigHandlerType2;
+
+PPCI_REGISTRY_INFO_INTERNAL
+NTAPI
+HalpQueryPciRegistryInfo(
+ VOID
+);
+
VOID
NTAPI
HalpPCISynchronizeType1(
@@ -277,34 +289,6 @@ HalpWritePCIConfig(
IN ULONG Length
);
-ULONG
-NTAPI
-HalpGetSystemInterruptVector(
- ULONG BusNumber,
- ULONG BusInterruptLevel,
- ULONG BusInterruptVector,
- PKIRQL Irql,
- PKAFFINITY Affinity
-);
-
-ULONG
-NTAPI
-HalpGetCmosData(
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length
-);
-
-ULONG
-NTAPI
-HalpSetCmosData(
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length
-);
-
ULONG
NTAPI
HalpGetPCIData(
@@ -340,6 +324,36 @@ HalpAssignPCISlotResources(
IN OUT PCM_RESOURCE_LIST *pAllocatedResources
);
+/* NON-LEGACY */
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector_Acpi(
+ ULONG BusNumber,
+ ULONG BusInterruptLevel,
+ ULONG BusInterruptVector,
+ PKIRQL Irql,
+ PKAFFINITY Affinity
+);
+
+ULONG
+NTAPI
+HalpGetCmosData(
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length
+);
+
+ULONG
+NTAPI
+HalpSetCmosData(
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length
+);
+
VOID
NTAPI
HalpInitializePciBus(
@@ -352,12 +366,6 @@ HalpInitializePciStubs(
VOID
);
-VOID
-NTAPI
-HalpInitBusHandler(
- VOID
-);
-
BOOLEAN
NTAPI
HalpTranslateBusAddress(
@@ -397,9 +405,151 @@ HalpRegisterPciDebuggingDeviceInfo(
VOID
);
+/* LEGACY */
+
+BOOLEAN
+NTAPI
+HaliTranslateBusAddress(
+ IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+);
+
+BOOLEAN
+NTAPI
+HaliFindBusAddressTranslation(
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress,
+ IN OUT PULONG_PTR Context,
+ IN BOOLEAN NextBus
+);
+
+NTSTATUS
+NTAPI
+HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList);
+
+ULONG
+NTAPI
+HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity);
+VOID
+NTAPI
+HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciData);
+
+VOID
+NTAPI
+HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciNewData,
+ IN PPCI_COMMON_CONFIG PciOldData);
+
+NTSTATUS
+NTAPI
+HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PCI_SLOT_NUMBER PciSlot,
+ OUT PSUPPORTED_RANGE *Range);
+
+VOID
+NTAPI
+HalpInitBusHandler(
+ VOID
+);
+
+PBUS_HANDLER
+NTAPI
+HalpContextToBusHandler(
+ IN ULONG_PTR ContextValue
+);
+
+PBUS_HANDLER
+FASTCALL
+HaliReferenceHandlerForConfigSpace(
+ IN BUS_DATA_TYPE ConfigType,
+ IN ULONG BusNumber
+);
+
+ULONG
+NTAPI
+HalpNoBusData(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+ULONG
+NTAPI
+HalpcGetCmosData(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+ULONG
+NTAPI
+HalpcSetCmosData(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length
+);
+
+BOOLEAN
+NTAPI
+HalpTranslateSystemBusAddress(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+);
+
+BOOLEAN
+NTAPI
+HalpTranslateIsaBusAddress(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress
+);
+
+ULONG
+NTAPI
+HalpGetSystemInterruptVector(
+ IN PBUS_HANDLER BusHandler,
+ IN PBUS_HANDLER RootHandler,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity
+);
+
extern ULONG HalpBusType;
extern BOOLEAN HalpPCIConfigInitialized;
extern BUS_HANDLER HalpFakePciBusHandler;
extern ULONG HalpMinPciBus, HalpMaxPciBus;
+extern LIST_ENTRY HalpAllBusHandlers;
/* EOF */
diff --git a/hal/halx86/include/hal.h b/hal/halx86/include/hal.h
index 97e8f4a810e..0c3654f5ff8 100644
--- a/hal/halx86/include/hal.h
+++ b/hal/halx86/include/hal.h
@@ -32,11 +32,13 @@
/* Internal kernel headers */
#include "internal/pci.h"
#define KeGetCurrentThread _KeGetCurrentThread
-#include
-#include
#ifdef _M_AMD64
+#include
+#include
#include "internal/amd64/intrin_i.h"
#else
+#include
+#include
#include "internal/i386/intrin_i.h"
#endif
diff --git a/hal/halx86/include/halp.h b/hal/halx86/include/halp.h
index 6edb85570d7..c74ae1b0aa6 100644
--- a/hal/halx86/include/halp.h
+++ b/hal/halx86/include/halp.h
@@ -485,6 +485,25 @@ HalpHardwareInterruptLevel(
VOID
);
+//
+// Hack Flags
+//
+#define HALP_REVISION_FROM_HACK_FLAGS(x) ((x) >> 24)
+#define HALP_REVISION_HACK_FLAGS(x) ((x) >> 12)
+#define HALP_HACK_FLAGS(x) ((x) & 0xFFF)
+
+//
+// Feature flags
+//
+#define HALP_CARD_FEATURE_FULL_DECODE 0x0001
+
+//
+// Match Flags
+//
+#define HALP_CHECK_CARD_REVISION_ID 0x10000
+#define HALP_CHECK_CARD_SUBVENDOR_ID 0x20000
+#define HALP_CHECK_CARD_SUBSYSTEM_ID 0x40000
+
//
// Mm PTE/PDE to Hal PTE/PDE
//
@@ -765,6 +784,12 @@ KeUpdateSystemTime(
IN KIRQL OldIrql
);
+VOID
+NTAPI
+HalpInitBusHandlers(
+ VOID
+);
+
#ifdef _M_AMD64
#define KfLowerIrql KeLowerIrql
#ifndef CONFIG_SMP
@@ -791,3 +816,8 @@ extern KAFFINITY HalpActiveProcessors;
extern BOOLEAN HalDisableFirmwareMapper;
extern PWCHAR HalHardwareIdString;
extern PWCHAR HalName;
+
+extern KAFFINITY HalpDefaultInterruptAffinity;
+
+extern IDTUsageFlags HalpIDTUsageFlags[MAXIMUM_IDTVECTOR];
+
diff --git a/hal/halx86/mp/processor_mp.c b/hal/halx86/mp/processor_mp.c
index 069a96bb269..0627e90041e 100644
--- a/hal/halx86/mp/processor_mp.c
+++ b/hal/halx86/mp/processor_mp.c
@@ -18,7 +18,7 @@
#define NDEBUG
#include
-KAFFINITY HalpActiveProcessors;
+KAFFINITY HalpActiveProcessors, HalpDefaultInterruptAffinity;
/* PRIVATE FUNCTIONS *********************************************************/
diff --git a/hal/halx86/up/pic.c b/hal/halx86/up/pic.c
index a710d862567..91b902b1a35 100644
--- a/hal/halx86/up/pic.c
+++ b/hal/halx86/up/pic.c
@@ -94,8 +94,8 @@ PHAL_DISMISS_INTERRUPT HalpSpecialDismissLevelTable[16] =
/* This table contains the static x86 PIC mapping between IRQLs and IRQs */
ULONG KiI8259MaskTable[32] =
{
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 404
+#if defined(__GNUC__) && \
+ (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)
/*
* It Device IRQLs only start at 4 or higher, so these are just software
* IRQLs that don't really change anything on the hardware
@@ -206,14 +206,13 @@ ULONG KiI8259MaskTable[32] =
0xFFFFFFFB, /* IRQL 30 */
0xFFFFFFFB /* IRQL 31 */
#endif
-#endif
};
/* This table indicates which IRQs, if pending, can preempt a given IRQL level */
ULONG FindHigherIrqlMask[32] =
{
-#ifdef __GNUC__
-#if __GNUC__ * 100 + __GNUC_MINOR__ >= 404
+#if defined(__GNUC__) && \
+ (__GNUC__ * 100 + __GNUC_MINOR__ >= 404)
/*
* Software IRQLs, at these levels all hardware interrupts can preempt.
* Each higher IRQL simply enables which software IRQL can preempt the
@@ -313,7 +312,6 @@ ULONG FindHigherIrqlMask[32] =
0, /* IRQL 30 */
0 /* IRQL 31 */
#endif
-#endif
};
/* Denotes minimum required IRQL before we can process pending SW interrupts */
@@ -329,6 +327,8 @@ KIRQL SWInterruptLookUpTable[8] =
DISPATCH_LEVEL /* IRR 7 */
};
+#if defined(__GNUC__)
+
#define HalpDelayedHardwareInterrupt(x) \
VOID HalpHardwareInterrupt##x(VOID); \
VOID \
@@ -337,6 +337,23 @@ KIRQL SWInterruptLookUpTable[8] =
asm volatile ("int $%c0\n"::"i"(PRIMARY_VECTOR_BASE + x)); \
}
+#elif defined(_MSC_VER)
+
+#define HalpDelayedHardwareInterrupt(x) \
+ VOID HalpHardwareInterrupt##x(VOID); \
+ VOID \
+ HalpHardwareInterrupt##x(VOID) \
+ { \
+ __asm \
+ { \
+ int PRIMARY_VECTOR_BASE + x \
+ } \
+ }
+
+#else
+#error Unsupported compiler
+#endif
+
/* Pending/delayed hardware interrupt handlers */
HalpDelayedHardwareInterrupt(0);
HalpDelayedHardwareInterrupt(1);
@@ -522,7 +539,7 @@ KeRaiseIrqlToDpcLevel(VOID)
CurrentIrql = Pcr->Irql;
Pcr->Irql = DISPATCH_LEVEL;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct raise */
if (CurrentIrql > DISPATCH_LEVEL) KeBugCheck(IRQL_NOT_GREATER_OR_EQUAL);
#endif
@@ -545,7 +562,7 @@ KeRaiseIrqlToSynchLevel(VOID)
CurrentIrql = Pcr->Irql;
Pcr->Irql = SYNCH_LEVEL;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct raise */
if (CurrentIrql > SYNCH_LEVEL)
{
@@ -575,7 +592,7 @@ KfRaiseIrql(IN KIRQL NewIrql)
/* Read current IRQL */
CurrentIrql = Pcr->Irql;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct raise */
if (CurrentIrql > NewIrql)
{
@@ -605,7 +622,7 @@ KfLowerIrql(IN KIRQL OldIrql)
PKPCR Pcr = KeGetPcr();
PIC_MASK Mask;
-#ifdef IRQL_DEBUG
+#if DBG
/* Validate correct lower */
if (OldIrql > Pcr->Irql)
{
diff --git a/include/crt/_mingw.h b/include/crt/_mingw.h
index d4e53ff435a..cff811248d8 100644
--- a/include/crt/_mingw.h
+++ b/include/crt/_mingw.h
@@ -157,10 +157,12 @@ allow GCC to optimize away some EH unwind code, at least in DW2 case. */
//#endif
#ifdef __GNUC__
+#ifndef __clang__
#define __int8 char
#define __int16 short
#define __int32 int
#define __int64 long long
+#endif
#ifdef _WIN64
typedef int __int128 __attribute__ ((mode (TI)));
# endif
diff --git a/include/crt/assert.h b/include/crt/assert.h
index 252fd54a269..9107ee5a272 100644
--- a/include/crt/assert.h
+++ b/include/crt/assert.h
@@ -28,8 +28,7 @@ extern "C" {
#endif
#ifndef assert
-//#define assert(_Expression) (void)((!!(_Expression)) || (_assert(#_Expression,__FILE__,__LINE__),0))
-#define assert(_Expression) (void)((!!(_Expression)))// || (_wassert(_CRT_WIDE(#_Expression),_CRT_WIDE(__FILE__),__LINE__),0))
+#define assert(_Expression) (void)((!!(_Expression)) || (_assert(#_Expression,__FILE__,__LINE__),0))
#endif
#ifndef wassert
diff --git a/include/crt/math.h b/include/crt/math.h
index 9b645c15a51..fe4b4bc65b8 100644
--- a/include/crt/math.h
+++ b/include/crt/math.h
@@ -435,8 +435,6 @@ __CRT_INLINE int isinf (double d) {
return res;
}
- extern long double __cdecl modfl (long double, long double*);
-
/* 7.12.6.13 */
extern double __cdecl scalbn (double, int);
extern float __cdecl scalbnf (float, int);
@@ -458,7 +456,6 @@ __CRT_INLINE int isinf (double d) {
extern long double __cdecl expl(long double);
extern long double expm1l(long double);
extern long double __cdecl coshl(long double);
- extern long double __cdecl fabsl (long double);
extern long double __cdecl acosl(long double);
extern long double __cdecl asinl(long double);
extern long double __cdecl atanl(long double);
diff --git a/include/crt/mingw32/intrin_arm.h b/include/crt/mingw32/intrin_arm.h
index 00803a4eb1b..12ced3ebb4b 100644
--- a/include/crt/mingw32/intrin_arm.h
+++ b/include/crt/mingw32/intrin_arm.h
@@ -35,6 +35,10 @@
#define _ReturnAddress() (__builtin_return_address(0))
#define _ReadWriteBarrier() __sync_synchronize()
+__INTRIN_INLINE void __yield(void) { __asm__ __volatile__("yield"); }
+
+__INTRIN_INLINE void __break(unsigned int value) { __asm__ __volatile__("bkpt %0": : "M" (value)); }
+
__INTRIN_INLINE unsigned short _byteswap_ushort(unsigned short value)
{
return (value >> 8) || (value << 8);
diff --git a/include/crt/mingw32/intrin_x86.h b/include/crt/mingw32/intrin_x86.h
index 9e83ed81838..5b6f32d18a3 100644
--- a/include/crt/mingw32/intrin_x86.h
+++ b/include/crt/mingw32/intrin_x86.h
@@ -114,7 +114,7 @@ __INTRIN_INLINE long _InterlockedCompareExchange(volatile long * const Destinati
__INTRIN_INLINE void * _InterlockedCompareExchangePointer(void * volatile * const Destination, void * const Exchange, void * const Comperand)
{
- return __sync_val_compare_and_swap(Destination, Comperand, Exchange);
+ return (void *)__sync_val_compare_and_swap(Destination, Comperand, Exchange);
}
__INTRIN_INLINE long _InterlockedExchange(volatile long * const Target, const long Value)
@@ -137,7 +137,7 @@ __INTRIN_INLINE void * _InterlockedExchangePointer(void * volatile * const Targe
{
/* NOTE: ditto */
__sync_synchronize();
- return __sync_lock_test_and_set(Target, Value);
+ return (void *)__sync_lock_test_and_set(Target, Value);
}
__INTRIN_INLINE long _InterlockedExchangeAdd16(volatile short * const Addend, const short Value)
diff --git a/include/crt/sec_api/wchar_s.h b/include/crt/sec_api/wchar_s.h
index 94251aa8b64..8a3ea3739d5 100644
--- a/include/crt/sec_api/wchar_s.h
+++ b/include/crt/sec_api/wchar_s.h
@@ -96,16 +96,6 @@ extern "C" {
_CRTIMP errno_t __cdecl _wcsupr_s_l(wchar_t *_Str,size_t _Size,_locale_t _Locale);
#endif
-#ifndef _WTIME_S_DEFINED
-#define _WTIME_S_DEFINED
- _CRTIMP errno_t __cdecl _wasctime_s(wchar_t *_Buf,size_t _SizeInWords,const struct tm *_Tm);
- _CRTIMP errno_t __cdecl _wctime32_s(wchar_t *_Buf,size_t _SizeInWords,const __time32_t *_Time);
- _CRTIMP errno_t __cdecl _wstrdate_s(wchar_t *_Buf,size_t _SizeInWords);
- _CRTIMP errno_t __cdecl _wstrtime_s(wchar_t *_Buf,size_t _SizeInWords);
-#if _INTEGRAL_MAX_BITS >= 64
- _CRTIMP errno_t __cdecl _wctime64_s(wchar_t *_Buf,size_t _SizeInWords,const __time64_t *_Time);
-#endif
-
#if !defined (RC_INVOKED) && !defined (_INC_WTIME_S_INL)
#define _INC_WTIME_S_INL
#ifdef _USE_32BIT_TIME_T
diff --git a/include/crt/stdlib.h b/include/crt/stdlib.h
index d4846fa2c71..0efd5cc4321 100644
--- a/include/crt/stdlib.h
+++ b/include/crt/stdlib.h
@@ -345,11 +345,15 @@ extern "C" {
void *__cdecl bsearch(const void *_Key,const void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));
void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElements,int (__cdecl *_PtFuncCompare)(const void *,const void *));
#endif
+
+#if !defined(__GNUC__) && !defined(__clang)
unsigned short __cdecl _byteswap_ushort(unsigned short _Short);
- /*unsigned long __cdecl _byteswap_ulong (unsigned long _Long); */
+ unsigned long __cdecl _byteswap_ulong (unsigned long _Long);
#if _INTEGRAL_MAX_BITS >= 64
__MINGW_EXTENSION unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64 _Int64);
#endif
+#endif
+
div_t __cdecl div(int _Numerator,int _Denominator);
char *__cdecl getenv(const char *_VarName);
_CRTIMP char *__cdecl _itoa(int _Value,char *_Dest,int _Radix);
@@ -478,6 +482,7 @@ extern "C" {
void __cdecl perror(const char *_ErrMsg);
#endif
_CRTIMP int __cdecl _putenv(const char *_EnvString);
+#if !defined(__GNUC__) && !defined(__clang)
unsigned int __cdecl _rotl(unsigned int _Val,int _Shift);
#if _INTEGRAL_MAX_BITS >= 64
__MINGW_EXTENSION unsigned __int64 __cdecl _rotl64(unsigned __int64 _Val,int _Shift);
@@ -485,6 +490,7 @@ extern "C" {
unsigned int __cdecl _rotr(unsigned int _Val,int _Shift);
#if _INTEGRAL_MAX_BITS >= 64
__MINGW_EXTENSION unsigned __int64 __cdecl _rotr64(unsigned __int64 _Val,int _Shift);
+#endif
#endif
_CRTIMP void __cdecl _searchenv(const char *_Filename,const char *_EnvVar,char *_ResultPath);
_CRTIMP void __cdecl _splitpath(const char *_FullPath,char *_Drive,char *_Dir,char *_Filename,char *_Ext);
diff --git a/include/crt/time.h b/include/crt/time.h
index 75da425e3a1..5cf88adf7c9 100644
--- a/include/crt/time.h
+++ b/include/crt/time.h
@@ -114,6 +114,7 @@ extern "C" {
_CRT_OBSOLETE(GetLocalTime) unsigned __cdecl _getsystime(struct tm *_Tm);
_CRT_OBSOLETE(GetLocalTime) unsigned __cdecl _setsystime(struct tm *_Tm,unsigned _MilliSec);
+ _CRTIMP errno_t __cdecl asctime_s(char *_Buf,size_t _SizeInWords,const struct tm *_Tm);
_CRTIMP errno_t __cdecl _ctime32_s(char *_Buf,size_t _SizeInBytes,const __time32_t *_Time);
_CRTIMP errno_t __cdecl _gmtime32_s(struct tm *_Tm,const __time32_t *_Time);
_CRTIMP errno_t __cdecl _localtime32_s(struct tm *_Tm,const __time32_t *_Time);
@@ -184,6 +185,7 @@ __CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2) { return _diff
__CRT_INLINE char *__cdecl ctime(const time_t *_Time) { return _ctime32(_Time); }
__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime32(_Time); }
__CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time) { return _localtime32(_Time); }
+__CRT_INLINE errno_t __cdecl localtime_s(struct tm *_Tm,const time_t *_Time) { return _localtime32_s(_Tm,_Time); }
__CRT_INLINE time_t __cdecl mktime(struct tm *_Tm) { return _mktime32(_Tm); }
__CRT_INLINE time_t __cdecl _mkgmtime(struct tm *_Tm) { return _mkgmtime32(_Tm); }
__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time32(_Time); }
@@ -193,6 +195,7 @@ __CRT_INLINE double __cdecl difftime(time_t _Time1,time_t _Time2) { return _diff
__CRT_INLINE char *__cdecl ctime(const time_t *_Time) { return _ctime64(_Time); }
__CRT_INLINE struct tm *__cdecl gmtime(const time_t *_Time) { return _gmtime64(_Time); }
__CRT_INLINE struct tm *__cdecl localtime(const time_t *_Time) { return _localtime64(_Time); }
+__CRT_INLINE errno_t __cdecl localtime_s(struct tm *_Tm,const time_t *_Time) { return _localtime64_s(_Tm,_Time); }
__CRT_INLINE time_t __cdecl mktime(struct tm *_Tm) { return _mktime64(_Tm); }
__CRT_INLINE time_t __cdecl _mkgmtime(struct tm *_Tm) { return _mkgmtime64(_Tm); }
__CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }
@@ -214,7 +217,5 @@ __CRT_INLINE time_t __cdecl time(time_t *_Time) { return _time64(_Time); }
#pragma pack(pop)
-#include
-
#endif /* End _TIME_H_ */
diff --git a/include/crt/wchar.h b/include/crt/wchar.h
index f70dfbbc6a2..364b1697534 100644
--- a/include/crt/wchar.h
+++ b/include/crt/wchar.h
@@ -751,19 +751,27 @@ _CRTIMP int __cdecl iswblank(wint_t _C);
_CRTIMP size_t __cdecl _wcsftime_l(wchar_t *_Buf,size_t _SizeInWords,const wchar_t *_Format,const struct tm *_Tm,_locale_t _Locale);
_CRTIMP wchar_t *__cdecl _wstrdate(wchar_t *_Buffer);
_CRTIMP wchar_t *__cdecl _wstrtime(wchar_t *_Buffer);
+
+ _CRTIMP errno_t __cdecl _wasctime_s(wchar_t *_Buf,size_t _SizeInWords,const struct tm *_Tm);
+ _CRTIMP errno_t __cdecl _wctime32_s(wchar_t *_Buf,size_t _SizeInWords,const __time32_t *_Time);
+ _CRTIMP errno_t __cdecl _wstrdate_s(wchar_t *_Buf,size_t _SizeInWords);
+ _CRTIMP errno_t __cdecl _wstrtime_s(wchar_t *_Buf,size_t _SizeInWords);
+
#if _INTEGRAL_MAX_BITS >= 64
_CRTIMP wchar_t *__cdecl _wctime64(const __time64_t *_Time);
+ _CRTIMP errno_t __cdecl _wctime64_s(wchar_t *_Buf,size_t _SizeInWords,const __time64_t *_Time);
#endif
#if !defined (RC_INVOKED) && !defined (_INC_WTIME_INL)
#define _INC_WTIME_INL
#ifdef _USE_32BIT_TIME_T
__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime32(_Time); }
-#else
+#else /* !_USE_32BIT_TIME_T */
__CRT_INLINE wchar_t *__cdecl _wctime(const time_t *_Time) { return _wctime64(_Time); }
-#endif
-#endif
-#endif
+#endif /* !_USE_32BIT_TIME_T */
+#endif /* !defined (RC_INVOKED) && !defined (_INC_WTIME_INL) */
+
+#endif /* _WTIME_DEFINED */
typedef int mbstate_t;
typedef wchar_t _Wint_t;
diff --git a/include/ddk/atm.h b/include/ddk/atm.h
index 0ff43c38647..d23f278b944 100644
--- a/include/ddk/atm.h
+++ b/include/ddk/atm.h
@@ -20,250 +20,249 @@
*
*/
-#ifndef _ATM_H
-#define _ATM_H
+#pragma once
#ifdef __cplusplus
extern "C" {
#endif
-typedef ULONG ATM_ADDRESSTYPE;
+typedef ULONG ATM_ADDRESSTYPE;
-#define SAP_TYPE_NSAP 1
-#define SAP_TYPE_E164 2
+#define SAP_TYPE_NSAP 1
+#define SAP_TYPE_E164 2
-#define ATM_MEDIA_SPECIFIC 1
+#define ATM_MEDIA_SPECIFIC 1
-#define CALLMGR_SPECIFIC_Q2931 1
+#define CALLMGR_SPECIFIC_Q2931 1
-#define ATM_NSAP 0
-#define ATM_E164 1
+#define ATM_NSAP 0
+#define ATM_E164 1
-#define ATM_MAC_ADDRESS_LENGTH 6
-#define ATM_ADDRESS_LENGTH 20
+#define ATM_MAC_ADDRESS_LENGTH 6
+#define ATM_ADDRESS_LENGTH 20
-typedef ULONG ATM_AAL_TYPE, *PATM_AAL_TYPE;
+typedef ULONG ATM_AAL_TYPE, *PATM_AAL_TYPE;
-#define AAL_TYPE_AAL0 1
-#define AAL_TYPE_AAL1 2
-#define AAL_TYPE_AAL34 4
-#define AAL_TYPE_AAL5 8
+#define AAL_TYPE_AAL0 1
+#define AAL_TYPE_AAL1 2
+#define AAL_TYPE_AAL34 4
+#define AAL_TYPE_AAL5 8
-#define ATM_ADDR_BLANK_CHAR L' '
-#define ATM_ADDR_E164_START_CHAR L'+'
-#define ATM_ADDR_PUNCTUATION_CHAR L'.'
+#define ATM_ADDR_BLANK_CHAR L' '
+#define ATM_ADDR_E164_START_CHAR L'+'
+#define ATM_ADDR_PUNCTUATION_CHAR L'.'
-typedef enum {
- IE_AALParameters,
- IE_TrafficDescriptor,
- IE_BroadbandBearerCapability,
- IE_BHLI,
- IE_BLLI,
- IE_CalledPartyNumber,
- IE_CalledPartySubaddress,
- IE_CallingPartyNumber,
- IE_CallingPartySubaddress,
- IE_Cause,
- IE_QOSClass,
- IE_TransitNetworkSelection,
- IE_BroadbandSendingComplete,
- IE_LIJCallId,
- IE_Raw
+typedef enum _Q2931_IE_TYPE {
+ IE_AALParameters,
+ IE_TrafficDescriptor,
+ IE_BroadbandBearerCapability,
+ IE_BHLI,
+ IE_BLLI,
+ IE_CalledPartyNumber,
+ IE_CalledPartySubaddress,
+ IE_CallingPartyNumber,
+ IE_CallingPartySubaddress,
+ IE_Cause,
+ IE_QOSClass,
+ IE_TransitNetworkSelection,
+ IE_BroadbandSendingComplete,
+ IE_LIJCallId,
+ IE_Raw
} Q2931_IE_TYPE;
typedef struct _Q2931_IE {
- Q2931_IE_TYPE IEType;
- ULONG IELength;
- UCHAR IE[1];
+ Q2931_IE_TYPE IEType;
+ ULONG IELength;
+ UCHAR IE[1];
} Q2931_IE, *PQ2931_IE;
typedef struct _AAL1_PARAMETERS {
- UCHAR Subtype;
- UCHAR CBRRate;
- USHORT Multiplier;
- UCHAR SourceClockRecoveryMethod;
- UCHAR ErrorCorrectionMethod;
- USHORT StructuredDataTransferBlocksize;
- UCHAR PartiallyFilledCellsMethod;
+ UCHAR Subtype;
+ UCHAR CBRRate;
+ USHORT Multiplier;
+ UCHAR SourceClockRecoveryMethod;
+ UCHAR ErrorCorrectionMethod;
+ USHORT StructuredDataTransferBlocksize;
+ UCHAR PartiallyFilledCellsMethod;
} AAL1_PARAMETERS, *PAAL1_PARAMETERS;
typedef struct _AAL34_PARAMETERS {
- USHORT ForwardMaxCPCSSDUSize;
- USHORT BackwardMaxCPCSSDUSize;
- USHORT LowestMID;
- USHORT HighestMID;
- UCHAR SSCSType;
+ USHORT ForwardMaxCPCSSDUSize;
+ USHORT BackwardMaxCPCSSDUSize;
+ USHORT LowestMID;
+ USHORT HighestMID;
+ UCHAR SSCSType;
} AAL34_PARAMETERS, *PAAL34_PARAMETERS;
/* AAL5_PARAMETERS.Mode constants */
-#define AAL5_MODE_MESSAGE 0x01
-#define AAL5_MODE_STREAMING 0x02
+#define AAL5_MODE_MESSAGE 0x01
+#define AAL5_MODE_STREAMING 0x02
/* AAL5_PARAMETERS.SSCSType constants */
-#define AAL5_SSCS_NULL 0x00
-#define AAL5_SSCS_SSCOP_ASSURED 0x01
-#define AAL5_SSCS_SSCOP_NON_ASSURED 0x02
-#define AAL5_SSCS_FRAME_RELAY 0x04
+#define AAL5_SSCS_NULL 0x00
+#define AAL5_SSCS_SSCOP_ASSURED 0x01
+#define AAL5_SSCS_SSCOP_NON_ASSURED 0x02
+#define AAL5_SSCS_FRAME_RELAY 0x04
typedef struct _AAL5_PARAMETERS {
- ULONG ForwardMaxCPCSSDUSize;
- ULONG BackwardMaxCPCSSDUSize;
- UCHAR Mode;
- UCHAR SSCSType;
+ ULONG ForwardMaxCPCSSDUSize;
+ ULONG BackwardMaxCPCSSDUSize;
+ UCHAR Mode;
+ UCHAR SSCSType;
} AAL5_PARAMETERS, *PAAL5_PARAMETERS;
typedef struct _AALUSER_PARAMETERS {
- ULONG UserDefined;
+ ULONG UserDefined;
} AALUSER_PARAMETERS, *PAALUSER_PARAMETERS;
typedef struct _AAL_PARAMETERS_IE {
- ATM_AAL_TYPE AALType;
+ ATM_AAL_TYPE AALType;
union {
- AAL1_PARAMETERS AAL1Parameters;
- AAL34_PARAMETERS AAL34Parameters;
- AAL5_PARAMETERS AAL5Parameters;
- AALUSER_PARAMETERS AALUserParameters;
+ AAL1_PARAMETERS AAL1Parameters;
+ AAL34_PARAMETERS AAL34Parameters;
+ AAL5_PARAMETERS AAL5Parameters;
+ AALUSER_PARAMETERS AALUserParameters;
} AALSpecificParameters;
} AAL_PARAMETERS_IE, *PAAL_PARAMETERS_IE;
struct _ATM_AAL5_INFO {
- BOOLEAN CellLossPriority;
- UCHAR UserToUserIndication;
- UCHAR CommonPartIndicator;
+ BOOLEAN CellLossPriority;
+ UCHAR UserToUserIndication;
+ UCHAR CommonPartIndicator;
};
struct _ATM_AAL0_INFO {
- BOOLEAN CellLossPriority;
- UCHAR PayLoadTypeIdentifier;
+ BOOLEAN CellLossPriority;
+ UCHAR PayLoadTypeIdentifier;
};
-/* FIXME: Should the union be anonymous in C++ too? */
-typedef struct _ATM_AAL_OOB_INFO
-{
- ATM_AAL_TYPE AalType;
-#ifndef __cplusplus
- _ANONYMOUS_UNION
-#endif
- union {
- struct _ATM_AAL5_INFO ATM_AAL5_INFO;
- struct _ATM_AAL0_INFO ATM_AAL0_INFO;
-#ifndef __cplusplus
- } DUMMYUNIONNAME;
-#else
- } u;
-#endif
+typedef struct _ATM_AAL_OOB_INFO {
+ ATM_AAL_TYPE AalType;
+ union {
+ struct _ATM_AAL5_INFO ATM_AAL5_INFO;
+ struct _ATM_AAL0_INFO ATM_AAL0_INFO;
+ };
} ATM_AAL_OOB_INFO, *PATM_AAL_OOB_INFO;
-typedef struct _ATM_ADDRESS {
- ATM_ADDRESSTYPE AddressType;
- ULONG NumberOfDigits;
- UCHAR Address[ATM_ADDRESS_LENGTH];
+typedef struct _ATM_ADDRESS {
+ ATM_ADDRESSTYPE AddressType;
+ ULONG NumberOfDigits;
+ UCHAR Address[ATM_ADDRESS_LENGTH];
} ATM_ADDRESS, *PATM_ADDRESS;
+#define ATM_PHYS_RATE_SONET_STS3C 155520000
+#define ATM_PHYS_RATE_IBM_25 25600000
+
+#define ATM_CELL_TRANSFER_CAPACITY_SONET_STS3C 149760000
+#define ATM_CELL_TRANSFER_CAPACITY_IBM_25 25125926
+
+#define ATM_USER_DATA_RATE_SONET_155 1356317
+#define ATM_USER_DATA_RATE_IBM_25 227556
+
/* ATM_BHLI_IE.HighLayerInfoType constants */
-#define BHLI_ISO 0x00
-#define BHLI_UserSpecific 0x01
-#define BHLI_HighLayerProfile 0x02
-#define BHLI_VendorSpecificAppId 0x03
+#define BHLI_ISO 0x00
+#define BHLI_UserSpecific 0x01
+#define BHLI_HighLayerProfile 0x02
+#define BHLI_VendorSpecificAppId 0x03
typedef struct _ATM_BHLI_IE {
- ULONG HighLayerInfoType;
- ULONG HighLayerInfoLength;
- UCHAR HighLayerInfo[8];
+ ULONG HighLayerInfoType;
+ ULONG HighLayerInfoLength;
+ UCHAR HighLayerInfo[8];
} ATM_BHLI_IE, *PATM_BHLI_IE;
/* ATM_BLLI_IE.Layer2Protocol constants */
-#define BLLI_L2_ISO_1745 0x01
-#define BLLI_L2_Q921 0x02
-#define BLLI_L2_X25L 0x06
-#define BLLI_L2_X25M 0x07
-#define BLLI_L2_ELAPB 0x08
-#define BLLI_L2_HDLC_ARM 0x09
-#define BLLI_L2_HDLC_NRM 0x0A
-#define BLLI_L2_HDLC_ABM 0x0B
-#define BLLI_L2_LLC 0x0C
-#define BLLI_L2_X75 0x0D
-#define BLLI_L2_Q922 0x0E
-#define BLLI_L2_USER_SPECIFIED 0x10
-#define BLLI_L2_ISO_7776 0x11
+#define BLLI_L2_ISO_1745 0x01
+#define BLLI_L2_Q921 0x02
+#define BLLI_L2_X25L 0x06
+#define BLLI_L2_X25M 0x07
+#define BLLI_L2_ELAPB 0x08
+#define BLLI_L2_HDLC_ARM 0x09
+#define BLLI_L2_HDLC_NRM 0x0A
+#define BLLI_L2_HDLC_ABM 0x0B
+#define BLLI_L2_LLC 0x0C
+#define BLLI_L2_X75 0x0D
+#define BLLI_L2_Q922 0x0E
+#define BLLI_L2_USER_SPECIFIED 0x10
+#define BLLI_L2_ISO_7776 0x11
/* ATM_BLLI_IE.Layer3Protocol constants */
-#define BLLI_L3_X25 0x06
-#define BLLI_L3_ISO_8208 0x07
-#define BLLI_L3_X223 0x08
-#define BLLI_L3_SIO_8473 0x09
-#define BLLI_L3_T70 0x0A
-#define BLLI_L3_ISO_TR9577 0x0B
-#define BLLI_L3_USER_SPECIFIED 0x10
+#define BLLI_L3_X25 0x06
+#define BLLI_L3_ISO_8208 0x07
+#define BLLI_L3_X223 0x08
+#define BLLI_L3_SIO_8473 0x09
+#define BLLI_L3_T70 0x0A
+#define BLLI_L3_ISO_TR9577 0x0B
+#define BLLI_L3_USER_SPECIFIED 0x10
/* ATM_BLLI_IE.Layer3IPI constants */
-#define BLLI_L3_IPI_SNAP 0x80
-#define BLLI_L3_IPI_IP 0xCC
+#define BLLI_L3_IPI_SNAP 0x80
+#define BLLI_L3_IPI_IP 0xCC
typedef struct _ATM_BLLI_IE {
- ULONG Layer2Protocol;
- UCHAR Layer2Mode;
- UCHAR Layer2WindowSize;
- ULONG Layer2UserSpecifiedProtocol;
- ULONG Layer3Protocol;
- UCHAR Layer3Mode;
- UCHAR Layer3DefaultPacketSize;
- UCHAR Layer3PacketWindowSize;
- ULONG Layer3UserSpecifiedProtocol;
- ULONG Layer3IPI;
- UCHAR SnapId[5];
+ ULONG Layer2Protocol;
+ UCHAR Layer2Mode;
+ UCHAR Layer2WindowSize;
+ ULONG Layer2UserSpecifiedProtocol;
+ ULONG Layer3Protocol;
+ UCHAR Layer3Mode;
+ UCHAR Layer3DefaultPacketSize;
+ UCHAR Layer3PacketWindowSize;
+ ULONG Layer3UserSpecifiedProtocol;
+ ULONG Layer3IPI;
+ UCHAR SnapId[5];
} ATM_BLLI_IE, *PATM_BLLI_IE;
/* ATM_BROADBAND_BEARER_CAPABILITY_IE.BearerClass constants */
-#define BCOB_A 0x00
-#define BCOB_C 0x01
-#define BCOB_X 0x02
+#define BCOB_A 0x00
+#define BCOB_C 0x01
+#define BCOB_X 0x02
/* ATM_BROADBAND_BEARER_CAPABILITY_IE.TrafficType constants */
-#define TT_NOIND 0x00
-#define TT_CBR 0x04
-#define TT_VBR 0x08
+#define TT_NOIND 0x00
+#define TT_CBR 0x04
+#define TT_VBR 0x08
/* ATM_BROADBAND_BEARER_CAPABILITY_IE.TimingRequirements constants */
-#define TR_NOIND 0x00
-#define TR_END_TO_END 0x01
-#define TR_NO_END_TO_END 0x02
+#define TR_NOIND 0x00
+#define TR_END_TO_END 0x01
+#define TR_NO_END_TO_END 0x02
/* ATM_BROADBAND_BEARER_CAPABILITY_IE.ClippingSusceptability constants */
-#define CLIP_NOT 0x00
-#define CLIP_SUS 0x20
+#define CLIP_NOT 0x00
+#define CLIP_SUS 0x20
/* ATM_BROADBAND_BEARER_CAPABILITY_IE.UserPlaneConnectionConfig constants */
-#define UP_P2P 0x00
-#define UP_P2MP 0x01
+#define UP_P2P 0x00
+#define UP_P2MP 0x01
typedef struct _ATM_BROADBAND_BEARER_CAPABILITY_IE {
- UCHAR BearerClass;
- UCHAR TrafficType;
- UCHAR TimingRequirements;
- UCHAR ClippingSusceptability;
- UCHAR UserPlaneConnectionConfig;
+ UCHAR BearerClass;
+ UCHAR TrafficType;
+ UCHAR TimingRequirements;
+ UCHAR ClippingSusceptability;
+ UCHAR UserPlaneConnectionConfig;
} ATM_BROADBAND_BEARER_CAPABILITY_IE, *PATM_BROADBAND_BEARER_CAPABILITY_IE;
typedef struct _ATM_BROADBAND_SENDING_COMPLETE_IE {
- UCHAR SendingComplete;
+ UCHAR SendingComplete;
} ATM_BROADBAND_SENDING_COMPLETE_IE, *PATM_BROADBAND_SENDING_COMPLETE_IE;
typedef struct _ATM_CALLING_PARTY_NUMBER_IE {
- ATM_ADDRESS Number;
- UCHAR PresentationIndication;
- UCHAR ScreeningIndicator;
+ ATM_ADDRESS Number;
+ UCHAR PresentationIndication;
+ UCHAR ScreeningIndicator;
} ATM_CALLING_PARTY_NUMBER_IE, *PATM_CALLING_PARTY_NUMBER_IE;
/* ATM_CAUSE_IE.Location constants */
-#define ATM_CAUSE_LOC_USER 0x00
-#define ATM_CAUSE_LOC_PRIVATE_LOCAL 0x01
-#define ATM_CAUSE_LOC_PUBLIC_LOCAL 0x02
-#define ATM_CAUSE_LOC_TRANSIT_NETWORK 0x03
-#define ATM_CAUSE_LOC_PUBLIC_REMOTE 0x04
-#define ATM_CAUSE_LOC_PRIVATE_REMOTE 0x05
-#define ATM_CAUSE_LOC_INTERNATIONAL_NETWORK 0x07
-#define ATM_CAUSE_LOC_BEYOND_INTERWORKING 0x0A
+#define ATM_CAUSE_LOC_USER 0x00
+#define ATM_CAUSE_LOC_PRIVATE_LOCAL 0x01
+#define ATM_CAUSE_LOC_PUBLIC_LOCAL 0x02
+#define ATM_CAUSE_LOC_TRANSIT_NETWORK 0x03
+#define ATM_CAUSE_LOC_PUBLIC_REMOTE 0x04
+#define ATM_CAUSE_LOC_PRIVATE_REMOTE 0x05
+#define ATM_CAUSE_LOC_INTERNATIONAL_NETWORK 0x07
+#define ATM_CAUSE_LOC_BEYOND_INTERWORKING 0x0A
/* ATM_CAUSE_IE.Cause constants */
#define ATM_CAUSE_UNALLOCATED_NUMBER 0x01
@@ -322,182 +321,197 @@ typedef struct _ATM_CALLING_PARTY_NUMBER_IE {
#define ATM_CAUSE_NA_ABNORMAL 0x04
typedef struct _ATM_CAUSE_IE {
- UCHAR Location;
- UCHAR Cause;
- UCHAR DiagnosticsLength;
- UCHAR Diagnostics[4];
+ UCHAR Location;
+ UCHAR Cause;
+ UCHAR DiagnosticsLength;
+ UCHAR Diagnostics[4];
} ATM_CAUSE_IE, *PATM_CAUSE_IE;
-typedef ULONG ATM_SERVICE_CATEGORY, *PATM_SERVICE_CATEGORY;
+typedef ULONG ATM_SERVICE_CATEGORY, *PATM_SERVICE_CATEGORY;
/* ATM_FLOW_PARAMETERS.ServiceCategory constants */
-#define ATM_SERVICE_CATEGORY_CBR 1
-#define ATM_SERVICE_CATEGORY_VBR 2
-#define ATM_SERVICE_CATEGORY_UBR 4
-#define ATM_SERVICE_CATEGORY_ABR 8
+#define ATM_SERVICE_CATEGORY_CBR 1
+#define ATM_SERVICE_CATEGORY_VBR 2
+#define ATM_SERVICE_CATEGORY_UBR 4
+#define ATM_SERVICE_CATEGORY_ABR 8
/* ATM_FLOW_PARAMETERS.Reserved1 constants */
-#define ATM_FLOW_PARAMS_RSVD1_MPP 0x01
+#define ATM_FLOW_PARAMS_RSVD1_MPP 0x01
+
+#ifndef SAP_FIELD_ABSENT
+#define SAP_FIELD_ABSENT ((ULONG)0xfffffffe)
+#endif
+
+#ifndef SAP_FIELD_ANY
+#define SAP_FIELD_ANY ((ULONG)0xffffffff)
+#endif
+
+#define SAP_FIELD_ANY_AESA_SEL ((ULONG)0xfffffffa)
+#define SAP_FIELD_ANY_AESA_REST ((ULONG)0xfffffffb)
typedef struct _ATM_FLOW_PARAMETERS {
- ATM_SERVICE_CATEGORY ServiceCategory;
- ULONG AverageCellRate;
- ULONG PeakCellRate;
- ULONG MinimumCellRate;
- ULONG InitialCellRate;
- ULONG BurstLengthCells;
- ULONG MaxSduSize;
- ULONG TransientBufferExposure;
- ULONG CumulativeRMFixedRTT;
- UCHAR RateIncreaseFactor;
- UCHAR RateDecreaseFactor;
- USHORT ACRDecreaseTimeFactor;
- UCHAR MaximumCellsPerForwardRMCell;
- UCHAR MaximumForwardRMCellInterval;
- UCHAR CutoffDecreaseFactor;
- UCHAR Reserved1;
- ULONG MissingRMCellCount;
- ULONG Reserved2;
- ULONG Reserved3;
+ ATM_SERVICE_CATEGORY ServiceCategory;
+ ULONG AverageCellRate;
+ ULONG PeakCellRate;
+ ULONG MinimumCellRate;
+ ULONG InitialCellRate;
+ ULONG BurstLengthCells;
+ ULONG MaxSduSize;
+ ULONG TransientBufferExposure;
+ ULONG CumulativeRMFixedRTT;
+ UCHAR RateIncreaseFactor;
+ UCHAR RateDecreaseFactor;
+ USHORT ACRDecreaseTimeFactor;
+ UCHAR MaximumCellsPerForwardRMCell;
+ UCHAR MaximumForwardRMCellInterval;
+ UCHAR CutoffDecreaseFactor;
+ UCHAR Reserved1;
+ ULONG MissingRMCellCount;
+ ULONG Reserved2;
+ ULONG Reserved3;
} ATM_FLOW_PARAMETERS, *PATM_FLOW_PARAMETERS;
typedef struct _ATM_VPIVCI {
- ULONG Vpi;
- ULONG Vci;
+ ULONG Vpi;
+ ULONG Vci;
} ATM_VPIVCI, *PATM_VPIVCI;
typedef struct _ATM_MEDIA_PARAMETERS {
- ATM_VPIVCI ConnectionId;
- ATM_AAL_TYPE AALType;
- ULONG CellDelayVariationCLP0;
- ULONG CellDelayVariationCLP1;
- ULONG CellLossRatioCLP0;
- ULONG CellLossRatioCLP1;
- ULONG CellTransferDelayCLP0;
- ULONG CellTransferDelayCLP1;
- ULONG DefaultCLP;
- ATM_FLOW_PARAMETERS Transmit;
- ATM_FLOW_PARAMETERS Receive;
+ ATM_VPIVCI ConnectionId;
+ ATM_AAL_TYPE AALType;
+ ULONG CellDelayVariationCLP0;
+ ULONG CellDelayVariationCLP1;
+ ULONG CellLossRatioCLP0;
+ ULONG CellLossRatioCLP1;
+ ULONG CellTransferDelayCLP0;
+ ULONG CellTransferDelayCLP1;
+ ULONG DefaultCLP;
+ ATM_FLOW_PARAMETERS Transmit;
+ ATM_FLOW_PARAMETERS Receive;
} ATM_MEDIA_PARAMETERS, *PATM_MEDIA_PARAMETERS;
typedef struct _ATM_PVC_SAP {
- ATM_BLLI_IE Blli;
- ATM_BHLI_IE Bhli;
+ ATM_BLLI_IE Blli;
+ ATM_BHLI_IE Bhli;
} ATM_PVC_SAP, *PATM_PVC_SAP;
/* ATM_QOS_CLASS_IE constants */
-#define QOS_CLASS0 0x00
-#define QOS_CLASS1 0x01
-#define QOS_CLASS2 0x02
-#define QOS_CLASS3 0x03
-#define QOS_CLASS4 0x04
+#define QOS_CLASS0 0x00
+#define QOS_CLASS1 0x01
+#define QOS_CLASS2 0x02
+#define QOS_CLASS3 0x03
+#define QOS_CLASS4 0x04
typedef struct _ATM_QOS_CLASS_IE {
- UCHAR QOSClassForward;
- UCHAR QOSClassBackward;
+ UCHAR QOSClassForward;
+ UCHAR QOSClassBackward;
} ATM_QOS_CLASS_IE, *PATM_QOS_CLASS_IE;
typedef struct _ATM_RAW_IE {
- ULONG RawIELength;
- ULONG RawIEType;
- UCHAR RawIEValue[1];
+ ULONG RawIELength;
+ ULONG RawIEType;
+ UCHAR RawIEValue[1];
} ATM_RAW_IE, *PATM_RAW_IE;
typedef struct _ATM_SAP {
- ATM_BLLI_IE Blli;
- ATM_BHLI_IE Bhli;
- ULONG NumberOfAddresses;
- UCHAR Addresses[1];
+ ATM_BLLI_IE Blli;
+ ATM_BHLI_IE Bhli;
+ ULONG NumberOfAddresses;
+ UCHAR Addresses[1];
} ATM_SAP, *PATM_SAP;
typedef struct _ATM_TRAFFIC_DESCRIPTOR {
- ULONG PeakCellRateCLP0;
- ULONG PeakCellRateCLP01;
- ULONG SustainableCellRateCLP0;
- ULONG SustainableCellRateCLP01;
- ULONG MaximumBurstSizeCLP0;
- ULONG MaximumBurstSizeCLP01;
- BOOLEAN BestEffort;
- BOOLEAN Tagging;
+ ULONG PeakCellRateCLP0;
+ ULONG PeakCellRateCLP01;
+ ULONG SustainableCellRateCLP0;
+ ULONG SustainableCellRateCLP01;
+ ULONG MaximumBurstSizeCLP0;
+ ULONG MaximumBurstSizeCLP01;
+ BOOLEAN Tagging;
} ATM_TRAFFIC_DESCRIPTOR, *PATM_TRAFFIC_DESCRIPTOR;
typedef struct _ATM_TRAFFIC_DESCRIPTOR_IE {
- ATM_TRAFFIC_DESCRIPTOR ForwardTD;
- ATM_TRAFFIC_DESCRIPTOR BackwardTD;
- BOOLEAN BestEffort;
+ ATM_TRAFFIC_DESCRIPTOR ForwardTD;
+ ATM_TRAFFIC_DESCRIPTOR BackwardTD;
+ BOOLEAN BestEffort;
} ATM_TRAFFIC_DESCRIPTOR_IE, *PATM_TRAFFIC_DESCRIPTOR_IE;
/* ATM_TRANSIT_NETWORK_SELECTION_IE.TypeOfNetworkId constants */
-#define TNS_TYPE_NATIONAL 0x40
+#define TNS_TYPE_NATIONAL 0x40
/* ATM_TRANSIT_NETWORK_SELECTION_IE.NetworkIdPlan constants */
-#define TNS_PLAN_CARRIER_ID_CODE 0x01
+#define TNS_PLAN_CARRIER_ID_CODE 0x01
typedef struct _ATM_TRANSIT_NETWORK_SELECTION_IE {
- UCHAR TypeOfNetworkId;
- UCHAR NetworkIdPlan;
- UCHAR NetworkIdLength;
- UCHAR NetworkId[1];
+ UCHAR TypeOfNetworkId;
+ UCHAR NetworkIdPlan;
+ UCHAR NetworkIdLength;
+ UCHAR NetworkId[1];
} ATM_TRANSIT_NETWORK_SELECTION_IE, *PATM_TRANSIT_NETWORK_SELECTION_IE;
typedef struct _ATM_LIJ_CALLID_IE {
- ULONG Identifier;
+ ULONG Identifier;
} ATM_LIJ_CALLID_IE, *PATM_LIJ_CALLID_IE;
/* Q2931_ADD_PVC.Flags constants */
-#define CO_FLAG_SIGNALING_VC 0x00000001
-#define CO_FLAG_NO_DEST_SAP 0x00000002
+#define CO_FLAG_SIGNALING_VC 0x00000001
+#define CO_FLAG_NO_DEST_SAP 0x00000002
+#define CO_FLAG_NO_LOCAL_SAP 0x00000004
typedef struct _Q2931_ADD_PVC {
- ATM_ADDRESS CalledParty;
- ATM_ADDRESS CallingParty;
- ATM_VPIVCI ConnectionId;
- ATM_AAL_TYPE AALType;
- ATM_FLOW_PARAMETERS ForwardFP;
- ATM_FLOW_PARAMETERS BackwardFP;
- ULONG Flags;
- ATM_PVC_SAP LocalSap;
- ATM_PVC_SAP DestinationSap;
- BOOLEAN LIJIdPresent;
- ATM_LIJ_CALLID_IE LIJId;
+ ATM_ADDRESS CalledParty;
+ ATM_ADDRESS CallingParty;
+ ATM_VPIVCI ConnectionId;
+ ATM_AAL_TYPE AALType;
+ ATM_FLOW_PARAMETERS ForwardFP;
+ ATM_FLOW_PARAMETERS BackwardFP;
+ ULONG Flags;
+ ATM_PVC_SAP LocalSap;
+ ATM_PVC_SAP DestinationSap;
+ BOOLEAN LIJIdPresent;
+ ATM_LIJ_CALLID_IE LIJId;
} Q2931_ADD_PVC, *PQ2931_ADD_PVC;
typedef struct _Q2931_DELETE_PVC {
- ATM_VPIVCI ConnectionId;
+ ATM_VPIVCI ConnectionId;
} Q2931_DELETE_PVC, *PQ2931_DELETE_PVC;
-typedef ATM_ADDRESS ATM_CALLED_PARTY_NUMBER_IE;
-typedef ATM_ADDRESS ATM_CALLED_PARTY_SUBADDRESS_IE;
-typedef ATM_ADDRESS ATM_CALLING_PARTY_SUBADDRESS_IE;
+typedef struct _CO_GET_CALL_INFORMATION {
+ ULONG CallInfoType;
+ ULONG CallInfoLength;
+ PVOID CallInfoBuffer;
+} CO_GET_CALL_INFORMATION, *PCO_GET_CALL_INFORMATION;
+
+typedef ATM_ADDRESS ATM_CALLED_PARTY_NUMBER_IE;
+typedef ATM_ADDRESS ATM_CALLED_PARTY_SUBADDRESS_IE;
+typedef ATM_ADDRESS ATM_CALLING_PARTY_SUBADDRESS_IE;
typedef struct _Q2931_CALLMGR_PARAMETERS {
- ATM_ADDRESS CalledParty;
- ATM_ADDRESS CallingParty;
- ULONG InfoElementCount;
- UCHAR InfoElements[1];
+ ATM_ADDRESS CalledParty;
+ ATM_ADDRESS CallingParty;
+ ULONG InfoElementCount;
+ UCHAR InfoElements[1];
} Q2931_CALLMGR_PARAMETERS, *PQ2931_CALLMGR_PARAMETERS;
typedef struct _ATM_VC_RATES_SUPPORTED {
- ULONG MinCellRate;
- ULONG MaxCellRate;
+ ULONG MinCellRate;
+ ULONG MaxCellRate;
} ATM_VC_RATES_SUPPORTED, *PATM_VC_RATES_SUPPORTED;
typedef ULONG ATM_SERVICE_REGISTRY_TYPE;
/* ATM_SERVICE_ADDRESS_LIST.ServiceRegistryType constants */
-#define ATM_SERVICE_REGISTRY_LECS 1
-#define ATM_SERVICE_REGISTRY_ANS 2
+#define ATM_SERVICE_REGISTRY_LECS 1
+#define ATM_SERVICE_REGISTRY_ANS 2
typedef struct _ATM_SERVICE_ADDRESS_LIST {
- ATM_SERVICE_REGISTRY_TYPE ServiceRegistryType;
- ULONG NumberOfAddressesAvailable;
- ULONG NumberOfAddressesReturned;
- ATM_ADDRESS Address[1];
+ ATM_SERVICE_REGISTRY_TYPE ServiceRegistryType;
+ ULONG NumberOfAddressesAvailable;
+ ULONG NumberOfAddressesReturned;
+ ATM_ADDRESS Address[1];
} ATM_SERVICE_ADDRESS_LIST, *PATM_SERVICE_ADDRESS_LIST;
#ifdef __cplusplus
}
#endif
-
-#endif /* _ATM_H */
diff --git a/include/ddk/compstui.h b/include/ddk/compstui.h
deleted file mode 100644
index 63612f43b35..00000000000
--- a/include/ddk/compstui.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Definitions for Common Property Sheet User Interface
- *
- * Copyright 2006 Detlef Riekenberg
- *
- * 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
- *
- */
-
-#ifndef _COMPSTUI_
-#define _COMPSTUI_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DEFINES */
-
-#define PROPSHEETUI_INFO_VERSION 0x0100
-
-#define PSUIINFO_UNICODE 1
-
-/* return-values for CommonPropertySheetUI on success */
-#define CPSUI_CANCEL 0
-#define CPSUI_OK 1
-#define CPSUI_RESTARTWINDOWS 2
-#define CPSUI_REBOOTSYSTEM 3
-
-
-/* TYPES */
-typedef DWORD (CALLBACK *PFNCOMPROPSHEET)(HANDLE, UINT, LPARAM, LPARAM);
-
-typedef struct _PROPSHEETUI_INFO {
- WORD cbSize;
- WORD Version;
- WORD Flags; /* set PSUIINFO_UNICODE for UNICODE */
- WORD Reason;
- HANDLE hComPropSheet;
- PFNCOMPROPSHEET pfnComPropSheet;
- LPARAM lParamInit;
- DWORD UserData;
- DWORD Result;
- } PROPSHEETUI_INFO, *PPROPSHEETUI_INFO;
-
-typedef LONG (CALLBACK *PFNPROPSHEETUI)(PROPSHEETUI_INFO, LPARAM);
-
-/* FUNCTIONS */
-LONG WINAPI CommonPropertySheetUIA(HWND, PFNPROPSHEETUI, LPARAM, LPDWORD);
-LONG WINAPI CommonPropertySheetUIW(HWND, PFNPROPSHEETUI, LPARAM, LPDWORD);
-#define CommonPropertySheetUI WINELIB_NAME_AW(CommonPropertySheetUI)
-
-ULONG_PTR WINAPI GetPSTUIUserData(HWND);
-BOOL WINAPI SetPSTUIUserData(HWND, ULONG_PTR);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* _COMPSTUI_ */
diff --git a/include/ddk/csq.h b/include/ddk/csq.h
index cf7b2c14ce3..83bfa347f5e 100644
--- a/include/ddk/csq.h
+++ b/include/ddk/csq.h
@@ -52,8 +52,13 @@
* source if you're curious about the inner workings of these routines.
*/
-#ifndef _REACTOS_CSQ_H
-#define _REACTOS_CSQ_H
+#pragma once
+
+#define _CSQ_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
/*
* Prevent including the CSQ definitions twice. They're present in NTDDK
@@ -61,8 +66,26 @@
*/
#ifndef IO_TYPE_CSQ_IRP_CONTEXT
-struct _IO_CSQ;
+typedef struct _IO_CSQ IO_CSQ, *PIO_CSQ;
+/*
+ * STRUCTURES
+ *
+ * NOTE: Please do not use these directly. You will make incompatible code
+ * if you do. Always only use the documented IoCsqXxx() interfaces and you
+ * will amass much Good Karma.
+ */
+#define IO_TYPE_CSQ_IRP_CONTEXT 1
+#define IO_TYPE_CSQ 2
+
+/*
+ * IO_CSQ_IRP_CONTEXT - Context used to track an IRP in the CSQ
+ */
+typedef struct _IO_CSQ_IRP_CONTEXT {
+ ULONG Type;
+ PIRP Irp;
+ PIO_CSQ Csq;
+} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
/*
* CSQ Callbacks
@@ -80,54 +103,62 @@ struct _IO_CSQ;
*
* Sample implementation:
*
- VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, PIRP Irp)
- {
- KdPrint(("Inserting IRP 0x%x into CSQ\n", Irp));
- InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry);
- }
+ VOID NTAPI CsqInsertIrp(PIO_CSQ Csq, PIRP Irp)
+ {
+ KdPrint(("Inserting IRP 0x%x into CSQ\n", Irp));
+ InsertTailList(&IrpQueue, &Irp->Tail.Overlay.ListEntry);
+ }
*
*/
-typedef VOID (NTAPI *PIO_CSQ_INSERT_IRP) (struct _IO_CSQ *Csq,
- PIRP Irp);
-
+typedef VOID
+(NTAPI IO_CSQ_INSERT_IRP)(
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp);
+typedef IO_CSQ_INSERT_IRP *PIO_CSQ_INSERT_IRP;
/*
* Function to remove an IRP from the queue.
*
* Sample:
*
- VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp)
- {
- KdPrint(("Removing IRP 0x%x from CSQ\n", Irp));
- RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
- }
+ VOID NTAPI CsqRemoveIrp(PIO_CSQ Csq, PIRP Irp)
+ {
+ KdPrint(("Removing IRP 0x%x from CSQ\n", Irp));
+ RemoveEntryList(&Irp->Tail.Overlay.ListEntry);
+ }
*
*/
-typedef VOID (NTAPI *PIO_CSQ_REMOVE_IRP) (struct _IO_CSQ *Csq,
- PIRP Irp);
+typedef VOID
+(NTAPI IO_CSQ_REMOVE_IRP)(
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp);
+typedef IO_CSQ_REMOVE_IRP *PIO_CSQ_REMOVE_IRP;
/*
* Function to look for an IRP in the queue
*
* Sample:
*
- PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext)
- {
- KdPrint(("Peeking for next IRP\n"));
+ PIRP NTAPI CsqPeekNextIrp(PIO_CSQ Csq, PIRP Irp, PVOID PeekContext)
+ {
+ KdPrint(("Peeking for next IRP\n"));
- if(Irp)
- return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry);
+ if(Irp)
+ return CONTAINING_RECORD(&Irp->Tail.Overlay.ListEntry.Flink, IRP, Tail.Overlay.ListEntry);
- if(IsListEmpty(&IrpQueue))
- return NULL;
+ if(IsListEmpty(&IrpQueue))
+ return NULL;
- return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry);
- }
+ return CONTAINING_RECORD(IrpQueue.Flink, IRP, Tail.Overlay.ListEntry);
+ }
*
*/
-typedef PIRP (NTAPI *PIO_CSQ_PEEK_NEXT_IRP) (struct _IO_CSQ *Csq,
- PIRP Irp,
- PVOID PeekContext);
+typedef PIRP
+(NTAPI IO_CSQ_PEEK_NEXT_IRP)(
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp,
+ IN PVOID PeekContext);
+typedef IO_CSQ_PEEK_NEXT_IRP *PIO_CSQ_PEEK_NEXT_IRP;
/*
* Lock the queue. This can be a spinlock, a mutex, or whatever
@@ -135,28 +166,34 @@ typedef PIRP (NTAPI *PIO_CSQ_PEEK_NEXT_IRP) (struct _IO_CSQ *Csq,
*
* Sample:
*
- VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql)
- {
- KdPrint(("Acquiring spin lock\n"));
- KeAcquireSpinLock(&IrpQueueLock, Irql);
- }
+ VOID NTAPI CsqAcquireLock(PIO_CSQ Csq, PKIRQL Irql)
+ {
+ KdPrint(("Acquiring spin lock\n"));
+ KeAcquireSpinLock(&IrpQueueLock, Irql);
+ }
*
*/
-typedef VOID (NTAPI *PIO_CSQ_ACQUIRE_LOCK) (struct _IO_CSQ *Csq,
- PKIRQL Irql);
+typedef VOID
+(NTAPI IO_CSQ_ACQUIRE_LOCK)(
+ IN struct _IO_CSQ *Csq,
+ OUT PKIRQL Irql);
+typedef IO_CSQ_ACQUIRE_LOCK *PIO_CSQ_ACQUIRE_LOCK;
/*
* Unlock the queue:
*
- VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql)
- {
- KdPrint(("Releasing spin lock\n"));
- KeReleaseSpinLock(&IrpQueueLock, Irql);
- }
+ VOID NTAPI CsqReleaseLock(PIO_CSQ Csq, KIRQL Irql)
+ {
+ KdPrint(("Releasing spin lock\n"));
+ KeReleaseSpinLock(&IrpQueueLock, Irql);
+ }
*
*/
-typedef VOID (NTAPI *PIO_CSQ_RELEASE_LOCK) (struct _IO_CSQ *Csq,
- KIRQL Irql);
+typedef VOID
+(NTAPI IO_CSQ_RELEASE_LOCK)(
+ IN struct _IO_CSQ *Csq,
+ IN KIRQL Irql);
+typedef IO_CSQ_RELEASE_LOCK *PIO_CSQ_RELEASE_LOCK;
/*
* Finally, this is called by the queue library when it wants to complete
@@ -164,54 +201,39 @@ typedef VOID (NTAPI *PIO_CSQ_RELEASE_LOCK) (struct _IO_CSQ *Csq,
*
* Sample:
*
- VOID NTAPI CsqCompleteCancelledIrp(PIO_CSQ Csq, PIRP Irp)
- {
- KdPrint(("cancelling irp 0x%x\n", Irp));
- Irp->IoStatus.Status = STATUS_CANCELLED;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- }
+ VOID NTAPI CsqCompleteCancelledIrp(PIO_CSQ Csq, PIRP Irp)
+ {
+ KdPrint(("cancelling irp 0x%x\n", Irp));
+ Irp->IoStatus.Status = STATUS_CANCELLED;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ }
*
*/
-typedef VOID (NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP) (struct _IO_CSQ *Csq,
- PIRP Irp);
-
-
-/*
- * STRUCTURES
- *
- * NOTE: Please do not use these directly. You will make incompatible code
- * if you do. Always only use the documented IoCsqXxx() interfaces and you
- * will amass much Good Karma.
- */
-#define IO_TYPE_CSQ_IRP_CONTEXT 1
-#define IO_TYPE_CSQ 2
+typedef VOID
+(NTAPI IO_CSQ_COMPLETE_CANCELED_IRP)(
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp);
+typedef IO_CSQ_COMPLETE_CANCELED_IRP *PIO_CSQ_COMPLETE_CANCELED_IRP;
/*
* IO_CSQ - Queue control structure
*/
typedef struct _IO_CSQ {
- ULONG Type;
- PIO_CSQ_INSERT_IRP CsqInsertIrp;
- PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
- PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
- PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
- PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
- PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
- PVOID ReservePointer; /* must be NULL */
+ ULONG Type;
+ PIO_CSQ_INSERT_IRP CsqInsertIrp;
+ PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
+ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
+ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
+ PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
+ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
+ PVOID ReservePointer; /* must be NULL */
} IO_CSQ, *PIO_CSQ;
-/*
- * IO_CSQ_IRP_CONTEXT - Context used to track an IRP in the CSQ
- */
-typedef struct _IO_CSQ_IRP_CONTEXT {
- ULONG Type;
- PIRP Irp;
- PIO_CSQ Csq;
-} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
-
#endif /* IO_TYPE_CSQ_IRP_CONTEXT */
+#ifndef IO_TYPE_CSQ_EX
+
/* See IO_TYPE_CSQ_* above */
#define IO_TYPE_CSQ_EX 3
@@ -222,18 +244,21 @@ typedef struct _IO_CSQ_IRP_CONTEXT {
*
* Same deal as above; sample implementation:
*
- NTSTATUS NTAPI CsqInsertIrpEx(PIO_CSQ Csq, PIRP Irp, PVOID InsertContext)
- {
- CsqInsertIrp(Csq, Irp);
- return STATUS_PENDING;
- }
+ NTSTATUS NTAPI CsqInsertIrpEx(PIO_CSQ Csq, PIRP Irp, PVOID InsertContext)
+ {
+ CsqInsertIrp(Csq, Irp);
+ return STATUS_PENDING;
+ }
*
*/
-#ifndef IO_TYPE_CSQ_EX
-typedef NTSTATUS (NTAPI *PIO_CSQ_INSERT_IRP_EX) (struct _IO_CSQ *Csq,
- PIRP Irp,
- PVOID InsertContext);
-#endif
+typedef NTSTATUS
+(NTAPI IO_CSQ_INSERT_IRP_EX)(
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp,
+ IN PVOID InsertContext);
+typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
+
+#endif /* IO_TYPE_CSQ_EX */
/*
* CANCEL-SAFE QUEUE DDIs
@@ -304,4 +329,6 @@ NTKERNELAPI
PIRP NTAPI IoCsqRemoveNextIrp(PIO_CSQ Csq,
PVOID PeekContext);
-#endif /* _REACTOS_CSQ_H */
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/ddk/d4drvif.h b/include/ddk/d4drvif.h
index ee6a18523ce..17e14852cc5 100644
--- a/include/ddk/d4drvif.h
+++ b/include/ddk/d4drvif.h
@@ -20,17 +20,36 @@
*
*/
-#ifndef __D4DRVIF_H
-#define __D4DRVIF_H
+#pragma once
-#include "d4iface.h"
+#define _DOT4DRVIF_H
#ifdef __cplusplus
extern "C" {
#endif
-#define FILE_DEVICE_DOT4 0x3a
-#define IOCTL_DOT4_USER_BASE 2049
+#define MAX_SERVICE_LENGTH 40
+
+#ifndef CTL_CODE
+
+#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
+ ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method) \
+)
+
+#define METHOD_BUFFERED 0
+#define METHOD_IN_DIRECT 1
+#define METHOD_OUT_DIRECT 2
+#define METHOD_NEITHER 3
+
+#define FILE_ANY_ACCESS 0
+#define FILE_READ_ACCESS 0x0001
+#define FILE_WRITE_ACCESS 0x0002
+
+#endif /* CTL_CODE */
+
+#define FILE_DEVICE_DOT4 0x3a
+#define IOCTL_DOT4_USER_BASE 2049
+#define IOCTL_DOT4_LAST IOCTL_DOT4_USER_BASE + 9
#define IOCTL_DOT4_ADD_ACTIVITY_BROADCAST \
CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -63,37 +82,33 @@ extern "C" {
CTL_CODE(FILE_DEVICE_DOT4, IOCTL_DOT4_USER_BASE + 3, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
-#define MAX_SERVICE_LENGTH 40
-
typedef struct _DOT4_DC_CREATE_DATA {
- unsigned char bPsid;
- CHAR pServiceName[MAX_SERVICE_LENGTH + 1];
- unsigned char bType;
- ULONG ulBufferSize;
- USHORT usMaxHtoPPacketSize;
- USHORT usMaxPtoHPacketSize;
+ unsigned char bPsid;
+ CHAR pServiceName[MAX_SERVICE_LENGTH + 1];
+ unsigned char bType;
+ ULONG ulBufferSize;
+ USHORT usMaxHtoPPacketSize;
+ USHORT usMaxPtoHPacketSize;
unsigned char bHsid;
} DOT4_DC_CREATE_DATA, *PDOT4_DC_CREATE_DATA;
typedef struct _DOT4_DC_DESTROY_DATA {
- unsigned char bHsid;
+ unsigned char bHsid;
} DOT4_DC_DESTROY_DATA, *PDOT4_DC_DESTROY_DATA;
typedef struct _DOT4_DC_OPEN_DATA {
- unsigned char bHsid;
- unsigned char fAddActivity;
- CHANNEL_HANDLE hChannelHandle;
+ unsigned char bHsid;
+ unsigned char fAddActivity;
+ CHANNEL_HANDLE hChannelHandle;
} DOT4_DC_OPEN_DATA, *PDOT4_DC_OPEN_DATA;
typedef struct _DOT4_DRIVER_CMD {
- CHANNEL_HANDLE hChannelHandle;
- ULONG ulSize;
- ULONG ulOffset;
- ULONG ulTimeout;
+ CHANNEL_HANDLE hChannelHandle;
+ ULONG ulSize;
+ ULONG ulOffset;
+ ULONG ulTimeout;
} DOT4_DRIVER_CMD, *PDOT4_DRIVER_CMD;
#ifdef __cplusplus
}
#endif
-
-#endif /* __D4DRVIF_H */
diff --git a/include/ddk/d4iface.h b/include/ddk/d4iface.h
index c9b54f8e9bf..71e02e2246c 100644
--- a/include/ddk/d4iface.h
+++ b/include/ddk/d4iface.h
@@ -1,20 +1,11 @@
-#ifndef _DOT4_IFACE_H
+#pragma once
+
#define _DOT4_IFACE_H
#ifdef __cplusplus
extern "C" {
#endif
-typedef unsigned long CHANNEL_HANDLE;
-typedef CHANNEL_HANDLE *PCHANNEL_HANDLE;
-
-typedef struct _DOT4_ACTIVITY
-{
- ULONG ulMessage;
- ULONG ulByteCount;
- CHANNEL_HANDLE hChannel;
-} DOT4_ACTIVITY, *PDOT4_ACTIVITY;
-
#define DOT4_MAX_CHANNELS 128
#define NO_TIMEOUT 0
#define STREAM_TYPE_CHANNEL 1
@@ -40,8 +31,14 @@ typedef struct _DOT4_ACTIVITY
#define CONFIG_UPLOAD 14
#define CONFIG_DOWNLOAD 15
+typedef unsigned long CHANNEL_HANDLE, *PCHANNEL_HANDLE;
+
+typedef struct _DOT4_ACTIVITY {
+ ULONG ulMessage;
+ ULONG ulByteCount;
+ CHANNEL_HANDLE hChannel;
+} DOT4_ACTIVITY, *PDOT4_ACTIVITY;
+
#ifdef __cplusplus
}
#endif
-#endif
-
diff --git a/include/ddk/dciddi.h b/include/ddk/dciddi.h
index 311c7691095..16514bdc798 100644
--- a/include/ddk/dciddi.h
+++ b/include/ddk/dciddi.h
@@ -1,59 +1,165 @@
-/*
- * DCI driver interface
- *
- * Copyright (C) 2001 Ove Kaaven
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
-
-#ifndef __WINE_DCIDDI_H
-#define __WINE_DCIDDI_H
+#ifndef _INC_DCIDDI
+#define _INC_DCIDDI
#ifdef __cplusplus
extern "C" {
#endif
-/* DCI Command Escape */
-#define DCICOMMAND 3075
-#define DCI_VERSION 0x0100
+#define DCICOMMAND 3075
+#define DCI_VERSION 0x0100
-#define DCICREATEPRIMARYSURFACE 1
-#define DCICREATEOFFSCREENSURFACE 2
-#define DCICREATEOVERLAYSURFACE 3
-#define DCIENUMSURFACE 4
-#define DCIESCAPE 5
+#define DCICREATEPRIMARYSURFACE 1
+#define DCICREATEOFFSCREENSURFACE 2
+#define DCICREATEOVERLAYSURFACE 3
+#define DCIENUMSURFACE 4
+#define DCIESCAPE 5
-/* DCI Errors */
-#define DCI_OK 0
+#define DCI_OK 0
+#define DCI_FAIL_GENERIC -1
+#define DCI_FAIL_UNSUPPORTEDVERSION -2
+#define DCI_FAIL_INVALIDSURFACE -3
+#define DCI_FAIL_UNSUPPORTED -4
+#define DCI_ERR_CURRENTLYNOTAVAIL -5
+#define DCI_ERR_INVALIDRECT -6
+#define DCI_ERR_UNSUPPORTEDFORMAT -7
+#define DCI_ERR_UNSUPPORTEDMASK -8
+#define DCI_ERR_TOOBIGHEIGHT -9
+#define DCI_ERR_TOOBIGWIDTH -10
+#define DCI_ERR_TOOBIGSIZE -11
+#define DCI_ERR_OUTOFMEMORY -12
+#define DCI_ERR_INVALIDPOSITION -13
+#define DCI_ERR_INVALIDSTRETCH -14
+#define DCI_ERR_INVALIDCLIPLIST -15
+#define DCI_ERR_SURFACEISOBSCURED -16
+#define DCI_ERR_XALIGN -17
+#define DCI_ERR_YALIGN -18
+#define DCI_ERR_XYALIGN -19
+#define DCI_ERR_WIDTHALIGN -20
+#define DCI_ERR_HEIGHTALIGN -21
-typedef int DCIRVAL; /* DCI callback return type */
+#define DCI_STATUS_POINTERCHANGED 1
+#define DCI_STATUS_STRIDECHANGED 2
+#define DCI_STATUS_FORMATCHANGED 4
+#define DCI_STATUS_SURFACEINFOCHANGED 8
+#define DCI_STATUS_CHROMAKEYCHANGED 16
+#define DCI_STATUS_WASSTILLDRAWING 32
-/*****************************************************************************
- * Escape command structures
- */
-typedef struct _DCICMD {
+#define DCI_SUCCESS(error) (((DCIRVAL)error) >= 0)
+
+#define DCI_SURFACE_TYPE 0x0000000F
+#define DCI_PRIMARY 0x00000000
+#define DCI_OFFSCREEN 0x00000001
+#define DCI_OVERLAY 0x00000002
+#define DCI_VISIBLE 0x00000010
+#define DCI_CHROMAKEY 0x00000020
+#define DCI_1632_ACCESS 0x00000040
+#define DCI_DWORDSIZE 0x00000080
+#define DCI_DWORDALIGN 0x00000100
+#define DCI_WRITEONLY 0x00000200
+#define DCI_ASYNC 0x00000400
+
+#define DCI_CAN_STRETCHX 0x00001000
+#define DCI_CAN_STRETCHY 0x00002000
+#define DCI_CAN_STRETCHXY (DCI_CAN_STRETCHX | DCI_CAN_STRETCHY)
+
+#define DCI_CAN_STRETCHXN 0x00004000
+#define DCI_CAN_STRETCHYN 0x00008000
+#define DCI_CAN_STRETCHXYN (DCI_CAN_STRETCHXN | DCI_CAN_STRETCHYN)
+
+#define DCI_CANOVERLAY 0x00010000
+
+ typedef int DCIRVAL;
+
+ typedef struct _DCICMD {
DWORD dwCommand;
DWORD dwParam1;
DWORD dwParam2;
DWORD dwVersion;
DWORD dwReserved;
-} DCICMD,*LPDCICMD;
+ } DCICMD;
-#ifdef __cplusplus
-} /* extern "C" */
+ typedef struct _DCICREATEINPUT {
+ DCICMD cmd;
+ DWORD dwCompression;
+ DWORD dwMask[3];
+ DWORD dwWidth;
+ DWORD dwHeight;
+ DWORD dwDCICaps;
+ DWORD dwBitCount;
+ LPVOID lpSurface;
+ } DCICREATEINPUT,*LPDCICREATEINPUT;
+
+ typedef struct _DCISURFACEINFO {
+ DWORD dwSize;
+ DWORD dwDCICaps;
+ DWORD dwCompression;
+ DWORD dwMask[3];
+ DWORD dwWidth;
+ DWORD dwHeight;
+ LONG lStride;
+ DWORD dwBitCount;
+ ULONG_PTR dwOffSurface;
+ WORD wSelSurface;
+ WORD wReserved;
+ DWORD dwReserved1;
+ DWORD dwReserved2;
+ DWORD dwReserved3;
+ DCIRVAL (CALLBACK *BeginAccess) (LPVOID,LPRECT);
+ void (CALLBACK *EndAccess) (LPVOID);
+ void (CALLBACK *DestroySurface) (LPVOID);
+ } DCISURFACEINFO,*LPDCISURFACEINFO;
+
+ typedef void (*ENUM_CALLBACK)(LPDCISURFACEINFO lpSurfaceInfo,LPVOID lpContext);
+
+ typedef struct _DCIENUMINPUT {
+ DCICMD cmd;
+ RECT rSrc;
+ RECT rDst;
+ void (CALLBACK *EnumCallback)(LPDCISURFACEINFO,LPVOID);
+ LPVOID lpContext;
+ } DCIENUMINPUT,*LPDCIENUMINPUT;
+
+ typedef DCISURFACEINFO DCIPRIMARY,*LPDCIPRIMARY;
+
+ typedef struct _DCIOFFSCREEN {
+ DCISURFACEINFO dciInfo;
+ DCIRVAL (CALLBACK *Draw) (LPVOID);
+ DCIRVAL (CALLBACK *SetClipList) (LPVOID,LPRGNDATA);
+ DCIRVAL (CALLBACK *SetDestination) (LPVOID,LPRECT,LPRECT);
+ } DCIOFFSCREEN,*LPDCIOFFSCREEN;
+
+ typedef struct _DCIOVERLAY {
+ DCISURFACEINFO dciInfo;
+ DWORD dwChromakeyValue;
+ DWORD dwChromakeyMask;
+ } DCIOVERLAY,*LPDCIOVERLAY;
+
+#ifndef YVU9
+#define YVU9 mmioFOURCC('Y','V','U','9')
+#endif
+#ifndef Y411
+#define Y411 mmioFOURCC('Y','4','1','1')
+#endif
+#ifndef YUY2
+#define YUY2 mmioFOURCC('Y','U','Y','2')
+#endif
+#ifndef YVYU
+#define YVYU mmioFOURCC('Y','V','Y','U')
+#endif
+#ifndef UYVY
+#define UYVY mmioFOURCC('U','Y','V','Y')
+#endif
+#ifndef Y211
+#define Y211 mmioFOURCC('Y','2','1','1')
#endif
-#endif /* __WINE_DCIDDI_H */
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/include/ddk/dderror.h b/include/ddk/dderror.h
index 188d2d7cbe8..9ee76cfa9bc 100644
--- a/include/ddk/dderror.h
+++ b/include/ddk/dderror.h
@@ -1,20 +1,18 @@
+#pragma once
-#ifndef _DDERROR_
-#define _DDERROR_
#define _WINERROR_
-#define NO_ERROR 0
-#define ERROR_INVALID_FUNCTION 1
-#define ERROR_NOT_ENOUGH_MEMORY 8
-#define ERROR_DEV_NOT_EXIST 55
-#define ERROR_INVALID_PARAMETER 87
-#define ERROR_INSUFFICIENT_BUFFER 122
-#define ERROR_INVALID_NAME 123
-#define ERROR_BUSY 170
-#define ERROR_MORE_DATA 234
-#define WAIT_TIMEOUT 258
-#define ERROR_IO_PENDING 997
-#define ERROR_DEVICE_REINITIALIZATION_NEEDED 1164
-#define ERROR_CONTINUE 1246
-#define ERROR_NO_MORE_DEVICES 1248
-#endif
+#define NO_ERROR 0
+#define ERROR_INVALID_FUNCTION 1
+#define ERROR_NOT_ENOUGH_MEMORY 8
+#define ERROR_DEV_NOT_EXIST 55
+#define ERROR_INVALID_PARAMETER 87
+#define ERROR_INSUFFICIENT_BUFFER 122
+#define ERROR_INVALID_NAME 123
+#define ERROR_BUSY 170
+#define ERROR_MORE_DATA 234
+#define WAIT_TIMEOUT 258
+#define ERROR_IO_PENDING 997
+#define ERROR_DEVICE_REINITIALIZATION_NEEDED 1164
+#define ERROR_CONTINUE 1246
+#define ERROR_NO_MORE_DEVICES 1248
diff --git a/include/ddk/dxapi.h b/include/ddk/dxapi.h
index 4933b4b170c..58c29ac2dc5 100644
--- a/include/ddk/dxapi.h
+++ b/include/ddk/dxapi.h
@@ -1,4 +1,10 @@
+ULONG
+DxApiGetVersion();
-ULONG DxApiGetVersion();
-ULONG DxApi( IN ULONG dwFunctionNum,IN PVOID lpvInBuffer, IN ULONG cbInBuffer,
- IN PVOID lpvOutBuffer, IN ULONG cbOutBuffer);
+ULONG
+DxApi(
+ IN ULONG dwFunctionNum,
+ IN PVOID lpvInBuffer,
+ IN ULONG cbInBuffer,
+ IN PVOID lpvOutBuffer,
+ IN ULONG cbOutBuffer);
diff --git a/include/ddk/fltsafe.h b/include/ddk/fltsafe.h
index 19dfc00ab57..4fc1784a2b9 100644
--- a/include/ddk/fltsafe.h
+++ b/include/ddk/fltsafe.h
@@ -1,19 +1,14 @@
-
-struct FLOATSAFE
-{
- KFLOATING_SAVE FloatSave;
- NTSTATUS ntStatus;
-
- FLOATSAFE::FLOATSAFE(void)
- {
- ntStatus = KeSaveFloatingPointState(&FloatSave);
- }
-
- FLOATSAFE::~FLOATSAFE(void)
- {
- if (NT_SUCCESS(ntStatus))
- {
- KeRestoreFloatingPointState(&FloatSave);
- }
- }
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+struct FLOATSAFE {
+ KFLOATING_SAVE FloatSave;
+ NTSTATUS ntStatus;
+ FLOATSAFE::FLOATSAFE(void) {
+ ntStatus = KeSaveFloatingPointState(&FloatSave);
+ }
+ FLOATSAFE::~FLOATSAFE(void) {
+ if (NT_SUCCESS(ntStatus)) {
+ KeRestoreFloatingPointState(&FloatSave);
+ }
+ }
};
+#endif
diff --git a/include/ddk/kbdmou.h b/include/ddk/kbdmou.h
index 3010a282644..9febdc52775 100644
--- a/include/ddk/kbdmou.h
+++ b/include/ddk/kbdmou.h
@@ -20,8 +20,9 @@
*
*/
-#ifndef __KBDMOU_H
-#define __KBDMOU_H
+#pragma once
+
+#define _KBDMOU_
#include
#include
@@ -77,15 +78,15 @@
CTL_CODE(FILE_DEVICE_MOUSE, 0x0400, METHOD_NEITHER, FILE_ANY_ACCESS)
typedef struct _CONNECT_DATA {
- PDEVICE_OBJECT ClassDeviceObject;
- PVOID ClassService;
+ PDEVICE_OBJECT ClassDeviceObject;
+ PVOID ClassService;
} CONNECT_DATA, *PCONNECT_DATA;
typedef VOID
(STDAPICALLTYPE *PSERVICE_CALLBACK_ROUTINE)(
- IN PVOID NormalContext,
- IN PVOID SystemArgument1,
- IN PVOID SystemArgument2,
- IN OUT PVOID SystemArgument3);
+ IN PVOID NormalContext,
+ IN PVOID SystemArgument1,
+ IN PVOID SystemArgument2,
+ IN OUT PVOID SystemArgument3);
-#endif /* __KBDMOU_H */
+#include
diff --git a/include/ddk/ksdebug.h b/include/ddk/ksdebug.h
deleted file mode 100644
index 00c129c318a..00000000000
--- a/include/ddk/ksdebug.h
+++ /dev/null
@@ -1,116 +0,0 @@
-
-#if !defined(_KSDEBUG_)
-#define _KSDEBUG_
-
-#if !defined(REMIND)
-#define QUOTE(x) #x
-#define QQUOTE(y) QUOTE(y)
-#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") : " str
-#endif
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-#if defined(_NTDDK_)
-
-#define DEBUGLVL_ERROR 0
-#define DEBUGLVL_TERSE 1
-#define DEBUGLVL_VERBOSE 2
-#define DEBUGLVL_BLAB 3
-
-
-
-#if (DBG)
-
-#if defined(IRPMJFUNCDESC)
-static const PCHAR IrpMjFuncDesc[] =
-{
- "IRP_MJ_CREATE",
- "IRP_MJ_CREATE_NAMED_PIPE",
- "IRP_MJ_CLOSE",
- "IRP_MJ_READ",
- "IRP_MJ_WRITE",
- "IRP_MJ_QUERY_INFORMATION",
- "IRP_MJ_SET_INFORMATION",
- "IRP_MJ_QUERY_EA",
- "IRP_MJ_SET_EA",
- "IRP_MJ_FLUSH_BUFFERS",
- "IRP_MJ_QUERY_VOLUME_INFORMATION",
- "IRP_MJ_SET_VOLUME_INFORMATION",
- "IRP_MJ_DIRECTORY_CONTROL",
- "IRP_MJ_FILE_SYSTEM_CONTROL",
- "IRP_MJ_DEVICE_CONTROL",
- "IRP_MJ_INTERNAL_DEVICE_CONTROL",
- "IRP_MJ_SHUTDOWN",
- "IRP_MJ_LOCK_CONTROL",
- "IRP_MJ_CLEANUP",
- "IRP_MJ_CREATE_MAILSLOT",
- "IRP_MJ_QUERY_SECURITY",
- "IRP_MJ_SET_SECURITY",
- "IRP_MJ_SET_POWER",
- "IRP_MJ_QUERY_POWER"
-};
-#endif
-#endif
-
-#if (DBG)
- #if !defined( DEBUG_LEVEL )
- #if defined( DEBUG_VARIABLE )
- #if defined( KSDEBUG_INIT )
- ULONG DEBUG_VARIABLE = DEBUGLVL_TERSE;
- #else
- extern ULONG DEBUG_VARIABLE;
- #endif
- #else
- #define DEBUG_VARIABLE DEBUGLVL_TERSE
- #endif
- #else
- #if defined( DEBUG_VARIABLE )
- #if defined( KSDEBUG_INIT )
- ULONG DEBUG_VARIABLE = DEBUG_LEVEL;
- #else
- extern ULONG DEBUG_VARIABLE;
- #endif
- #else
- #define DEBUG_VARIABLE DEBUG_LEVEL
- #endif
- #endif
-
- #define _DbgPrintFEx(component, lvl, strings) \
- { \
- if ((lvl) <= DEBUG_VARIABLE)\
- {\
- DbgPrintEx(component, lvl, STR_MODULENAME);\
- DbgPrintEx(component, lvl, strings);\
- DbgPrintEx(component, lvl, "\n");\
- if ((lvl) == DEBUGLVL_ERROR)\
- {\
- DbgBreakPoint();\
- } \
- } \
- }
-
- #define _DbgPrintF(lvl, strings)\
- { \
- if (((lvl)==DEBUG_VARIABLE) || (lvl < DEBUG_VARIABLE))\
- {\
- DbgPrint(STR_MODULENAME);\
- DbgPrint##strings;\
- DbgPrint("\n");\
- if ((lvl) == DEBUGLVL_ERROR)\
- {\
- DbgBreakPoint();\
- } \
- } \
- }
-#else
- #define _DbgPrintF(lvl, strings)
- #define _DbgPrintFEx(component, lvl, strings)
-#endif
-#endif
-
-
-#if defined(__cplusplus)
-}
-#endif
-#endif
diff --git a/include/ddk/ksuuids.h b/include/ddk/ksuuids.h
deleted file mode 100644
index bbc8eadf369..00000000000
--- a/include/ddk/ksuuids.h
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
-OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PACK, 0x36523B13, 0x8EE5, 0x11D1, 0x8C, 0xA3, 0x00, 0x60, 0xB0, 0x57, 0x66, 0x4A)
-OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PES, 0xE06D8020, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY( MEDIATYPE_MPEG2_SECTIONS, 0x455F176C, 0x4B06, 0x47CE, 0x9A, 0xEF, 0x8c, 0xAE, 0xF7, 0x3D, 0xF7, 0xB5)
-OUR_GUID_ENTRY(MEDIASUBTYPE_ATSC_SI, 0xB3C7397C, 0xD303, 0x414D, 0xB3, 0x3C, 0x4E, 0xD2, 0xC9, 0xD2, 0x97, 0x33)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DVB_SI, 0xE9dD31A3, 0x221D, 0x4ADB, 0x85, 0x32, 0x9A, 0xF3, 0x9, 0xC1, 0xA4, 0x8)
-OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2DATA, 0xC892E55B, 0x252D, 0x42B5, 0xA3, 0x16, 0xD9, 0x97, 0xE7, 0xA5, 0xD9, 0x95)
-OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_VIDEO, 0xE06D8026, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(FORMAT_MPEG2_VIDEO, 0xE06D80E3, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(FORMAT_VIDEOINFO2, 0xF72A76A0, 0xEB0A, 0x11D0, 0xAC, 0xE4, 0x0, 0x0, 0xC0, 0xcc, 0x16, 0xBA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_PROGRAM, 0xE06D8022, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT, 0xE06D8023, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE, 0x138AA9A4, 0x1EE2, 0x4C5B, 0x98, 0x8E, 0x19, 0xAB, 0xFD, 0xBC, 0x8A, 0x11)
-OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_AUDIO, 0xE06D802B, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DOLBY_AC3, 0xE06D802C, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_SUBPICTURE, 0xE06D802D, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_LPCM_AUDIO, 0xE06D8032, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DTS, 0xE06D8033, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_SDDS, 0xE06D8034, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIATYPE_DVD_ENCRYPTED_PACK, 0xED0B916A, 0x044D, 0x11D1, 0xAA, 0x78, 0x00, 0xc0, 0x04F, 0xC3, 0x1D, 0x60)
-OUR_GUID_ENTRY(MEDIATYPE_DVD_NAVIGATION, 0xE06D802E, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PCI, 0xE06D802F, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_DSI, 0xE06D8030, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER, 0xE06D8031, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(FORMAT_MPEG2Video, 0xE06D80E3, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(FORMAT_DolbyAC3, 0xE06D80E4, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(FORMAT_MPEG2Audio, 0xE06D80E5, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(FORMAT_DVD_LPCMAudio, 0xE06D80E6, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
-OUR_GUID_ENTRY(AM_KSPROPSETID_AC3, 0xBFABE720, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00)
-OUR_GUID_ENTRY(AM_KSPROPSETID_DvdSubPic, 0xAC390460, 0x43AF, 0x11D0, 0xBD, 0x6A, 0x00, 0x35, 0x05, 0xC1, 0x03, 0xA9)
-OUR_GUID_ENTRY(AM_KSPROPSETID_CopyProt, 0x0E8A0A40, 0x6AEF, 0x11D0, 0x9E, 0xD0, 0x00, 0xA0, 0x24, 0xCA, 0x19, 0xB3)
-OUR_GUID_ENTRY(AM_KSPROPSETID_TSRateChange, 0xA503C5C0, 0x1D1D, 0x11D1, 0xAD, 0x80, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0)
-OUR_GUID_ENTRY(AM_KSPROPSETID_DVD_RateChange, 0x3577EB09, 0x9582, 0x477F, 0xB2, 0x9C, 0xB0, 0xC4, 0x52, 0xA4, 0xFF, 0x9A)
-OUR_GUID_ENTRY(AM_KSPROPSETID_DvdKaraoke, 0xAE4720AE, 0xAA71, 0x42D8, 0xB8, 0x2A, 0xFF, 0xFD, 0xF5, 0x8B, 0x76, 0xFD)
-OUR_GUID_ENTRY(AM_KSPROPSETID_FrameStep, 0xC830ACBD, 0xAB07, 0x492F, 0x88, 0x52, 0x45, 0xB6, 0x98, 0x7C, 0x29, 0x79)
-OUR_GUID_ENTRY(AM_KSCATEGORY_CAPTURE, 0x65E8773D, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(AM_KSCATEGORY_RENDER, 0x65E8773E, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(AM_KSCATEGORY_DATACOMPRESSOR, 0x1E84C900, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
-OUR_GUID_ENTRY(AM_KSCATEGORY_AUDIO, 0x6994AD04, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(AM_KSCATEGORY_VIDEO, 0x6994AD05, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(AM_KSCATEGORY_TVTUNER, 0xA799A800, 0xA46D, 0x11D0, 0xA1, 0x8C, 0x00, 0xa0, 0x24, 0x01, 0xDC, 0xD4)
-OUR_GUID_ENTRY(AM_KSCATEGORY_CROSSBAR, 0xA799A801, 0xA46D, 0x11D0, 0xA1, 0x8C, 0x00, 0xa0, 0x24, 0x01, 0xDC, 0xD4)
-OUR_GUID_ENTRY(AM_KSCATEGORY_TVAUDIO, 0xA799A802, 0xA46D, 0x11D0, 0xA1, 0x8C, 0x00, 0xa0, 0x24, 0x01, 0xDC, 0xD4)
-OUR_GUID_ENTRY(AM_KSCATEGORY_VBICODEC, 0x07DAD660, 0x22F1, 0x11D1, 0xa9, 0xF4, 0x00, 0xc0, 0x4F, 0xBB, 0xDE, 0x8F)
-OUR_GUID_ENTRY(AM_KSCATEGORY_SPLITTER, 0x0A4252A0, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
-OUR_GUID_ENTRY(IID_IKsInterfACeHandler, 0xD3ABC7E0, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(IID_IKsDataTypeHandler, 0x5FFBAA02, 0x49A3, 0x11D0, 0x9F, 0x36, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1)
-OUR_GUID_ENTRY(IID_IKsPin, 0xB61178D1, 0xA2D9, 0x11CF, 0x9E, 0x53, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xa1)
-OUR_GUID_ENTRY(IID_IKsControl, 0x28F54685, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(IID_IKsPinFACtory, 0xCD5EBE6B, 0x8B6E, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
-OUR_GUID_ENTRY(AM_INTERFACESETID_Standard, 0x1A8766A0, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
-
diff --git a/include/ddk/miniport.h b/include/ddk/miniport.h
index 0191e605a2b..f3f90a7bfae 100644
--- a/include/ddk/miniport.h
+++ b/include/ddk/miniport.h
@@ -46,18 +46,6 @@ typedef struct _EMULATOR_ACCESS_ENTRY {
PVOID Routine;
} EMULATOR_ACCESS_ENTRY, *PEMULATOR_ACCESS_ENTRY;
-#ifndef VIDEO_ACCESS_RANGE_DEFINED /* also in video.h */
-#define VIDEO_ACCESS_RANGE_DEFINED
-typedef struct _VIDEO_ACCESS_RANGE {
- PHYSICAL_ADDRESS RangeStart;
- ULONG RangeLength;
- UCHAR RangeInIoSpace;
- UCHAR RangeVisible;
- UCHAR RangeShareable;
- UCHAR RangePassive;
-} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
-#endif
-
typedef VOID
(NTAPI *PBANKED_SECTION_ROUTINE)(
IN ULONG ReadBank,
diff --git a/include/ddk/mountdev.h b/include/ddk/mountdev.h
index b251f6df289..845e18bc60c 100644
--- a/include/ddk/mountdev.h
+++ b/include/ddk/mountdev.h
@@ -1,42 +1,47 @@
-
-
#ifndef _MOUNTDEV_
#define _MOUNTDEV_
#include
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
#define IOCTL_MOUNTDEV_QUERY_UNIQUE_ID CTL_CODE(MOUNTDEVCONTROLTYPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define IOCTL_MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY CTL_CODE(MOUNTDEVCONTROLTYPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME CTL_CODE(MOUNTDEVCONTROLTYPE, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTDEV_LINK_CREATED CTL_CODE(MOUNTDEVCONTROLTYPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTDEV_LINK_DELETED CTL_CODE(MOUNTDEVCONTROLTYPE, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define IOCTL_MOUNTDEV_QUERY_STABLE_GUID CTL_CODE(MOUNTDEVCONTROLTYPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
-typedef struct _MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT
-{
- ULONG Size;
- USHORT OldUniqueIdOffset;
- USHORT OldUniqueIdLength;
- USHORT NewUniqueIdOffset;
- USHORT NewUniqueIdLength;
-} MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT, *PMOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT;
-
-typedef struct _MOUNTDEV_SUGGESTED_LINK_NAME
-{
- BOOLEAN UseOnlyIfThereAreNoOtherLinks;
- USHORT NameLength;
- WCHAR Name[1];
-} MOUNTDEV_SUGGESTED_LINK_NAME, *PMOUNTDEV_SUGGESTED_LINK_NAME;
-
-typedef struct _MOUNTDEV_UNIQUE_ID
-{
- USHORT UniqueIdLength;
- UCHAR UniqueId[1];
+typedef struct _MOUNTDEV_UNIQUE_ID {
+ USHORT UniqueIdLength;
+ UCHAR UniqueId[1];
} MOUNTDEV_UNIQUE_ID, *PMOUNTDEV_UNIQUE_ID;
-typedef struct _MOUNTDEV_STABLE_GUID
-{
- GUID StableGuid;
+typedef struct _MOUNTDEV_SUGGESTED_LINK_NAME {
+ BOOLEAN UseOnlyIfThereAreNoOtherLinks;
+ USHORT NameLength;
+ WCHAR Name[1];
+} MOUNTDEV_SUGGESTED_LINK_NAME, *PMOUNTDEV_SUGGESTED_LINK_NAME;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+#define IOCTL_MOUNTDEV_QUERY_STABLE_GUID CTL_CODE(MOUNTDEVCONTROLTYPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _MOUNTDEV_STABLE_GUID {
+ GUID StableGuid;
} MOUNTDEV_STABLE_GUID, *PMOUNTDEV_STABLE_GUID;
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+/* FIXME : These definitions don't exist in the official header : */
+#define IOCTL_MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY CTL_CODE(MOUNTDEVCONTROLTYPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+typedef struct _MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT {
+ ULONG Size;
+ USHORT OldUniqueIdOffset;
+ USHORT OldUniqueIdLength;
+ USHORT NewUniqueIdOffset;
+ USHORT NewUniqueIdLength;
+} MOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT, *PMOUNTDEV_UNIQUE_ID_CHANGE_NOTIFY_OUTPUT;
+
+
+#endif /* _MOUNTDEV_ */
diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h
index 0bdcf57ccb4..7c6739000da 100644
--- a/include/ddk/mountmgr.h
+++ b/include/ddk/mountmgr.h
@@ -1,111 +1,43 @@
-
#ifndef _MOUNTMGR_
#define _MOUNTMGR_
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if defined(DEFINE_GUID)
DEFINE_GUID(MOUNTDEV_MOUNTED_DEVICE_GUID, 0x53F5630D, 0xB6BF, 0x11D0, 0x94, 0xF2, 0x00, 0xA0, 0xC9, 0x1E, 0xFB, 0x8B);
+#endif
#define MOUNTMGR_DEVICE_NAME L"\\Device\\MountPointManager"
#define MOUNTMGR_DOS_DEVICE_NAME L"\\\\.\\MountPointManager"
#define MOUNTMGRCONTROLTYPE ((ULONG) 'm')
#define MOUNTDEVCONTROLTYPE ((ULONG) 'M')
-#define IOCTL_MOUNTMGR_CREATE_POINT \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_MOUNTMGR_CREATE_POINT \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_DELETE_POINTS \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 1, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_QUERY_POINTS \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_MOUNTMGR_DELETE_POINTS_DBONLY \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 3, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 4, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 5, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_CREATED \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 6, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_VOLUME_MOUNT_POINT_DELETED \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 7, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_CHANGE_NOTIFY \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 8, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MOUNTMGR_KEEP_LINKS_WHEN_OFFLINE \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 9, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
#define IOCTL_MOUNTMGR_CHECK_UNPROCESSED_VOLUMES \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 10, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)
-#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS \
- CTL_CODE(MOUNTMGRCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 11, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME \
- CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-typedef struct _MOUNTDEV_NAME
-{
- USHORT NameLength;
- WCHAR Name[1];
-} MOUNTDEV_NAME, *PMOUNTDEV_NAME;
-
-typedef struct _MOUNTMGR_MOUNT_POINT
-{
- ULONG SymbolicLinkNameOffset;
- USHORT SymbolicLinkNameLength;
- ULONG UniqueIdOffset;
- USHORT UniqueIdLength;
- ULONG DeviceNameOffset;
- USHORT DeviceNameLength;
-} MOUNTMGR_MOUNT_POINT, *PMOUNTMGR_MOUNT_POINT;
-
-typedef struct _MOUNTMGR_CREATE_POINT_INPUT
-{
- USHORT SymbolicLinkNameOffset;
- USHORT SymbolicLinkNameLength;
- USHORT DeviceNameOffset;
- USHORT DeviceNameLength;
-} MOUNTMGR_CREATE_POINT_INPUT, *PMOUNTMGR_CREATE_POINT_INPUT;
-
-typedef struct _MOUNTMGR_MOUNT_POINTS
-{
- ULONG Size;
- ULONG NumberOfMountPoints;
- MOUNTMGR_MOUNT_POINT MountPoints[1];
-} MOUNTMGR_MOUNT_POINTS, *PMOUNTMGR_MOUNT_POINTS;
-
-typedef struct _MOUNTMGR_DRIVE_LETTER_INFORMATION
-{
- BOOLEAN DriveLetterWasAssigned;
- UCHAR CurrentDriveLetter;
-} MOUNTMGR_DRIVE_LETTER_INFORMATION, *PMOUNTMGR_DRIVE_LETTER_INFORMATION;
-
-typedef struct _MOUNTMGR_DRIVE_LETTER_TARGET
-{
- USHORT DeviceNameLength;
- WCHAR DeviceName[1];
-} MOUNTMGR_DRIVE_LETTER_TARGET, *PMOUNTMGR_DRIVE_LETTER_TARGET;
-
-typedef struct _MOUNTMGR_CHANGE_NOTIFY_INFO {
- ULONG EpicNumber;
-} MOUNTMGR_CHANGE_NOTIFY_INFO, *PMOUNTMGR_CHANGE_NOTIFY_INFO;
-
-typedef struct _MOUNTMGR_VOLUME_MOUNT_POINT
-{
- USHORT SourceVolumeNameOffset;
- USHORT SourceVolumeNameLength;
- USHORT TargetVolumeNameOffset;
- USHORT TargetVolumeNameLength;
-} MOUNTMGR_VOLUME_MOUNT_POINT, *PMOUNTMGR_VOLUME_MOUNT_POINT;
-
-typedef struct _MOUNTMGR_TARGET_NAME
-{
- USHORT DeviceNameLength;
- WCHAR DeviceName[1];
-} MOUNTMGR_TARGET_NAME, *PMOUNTMGR_TARGET_NAME;
-
-typedef struct _MOUNTMGR_VOLUME_PATHS
-{
- ULONG MultiSzLength;
- WCHAR MultiSz[1];
-} MOUNTMGR_VOLUME_PATHS, *PMOUNTMGR_VOLUME_PATHS;
+ CTL_CODE(MOUNTDEVCONTROLTYPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define MOUNTMGR_IS_DRIVE_LETTER(s) ((s)->Length == 28 && (s)->Buffer[0] == '\\' && (s)->Buffer[1] == 'D' && \
(s)->Buffer[2] == 'o' && (s)->Buffer[3] == 's' && (s)->Buffer[4] == 'D' && \
@@ -122,9 +54,112 @@ typedef struct _MOUNTMGR_VOLUME_PATHS
(s)->Buffer[19] == '-' && (s)->Buffer[24] == '-' && (s)->Buffer[29] == '-' && \
(s)->Buffer[34] == '-' && (s)->Buffer[47] == '}')
+typedef struct _MOUNTMGR_CREATE_POINT_INPUT {
+ USHORT SymbolicLinkNameOffset;
+ USHORT SymbolicLinkNameLength;
+ USHORT DeviceNameOffset;
+ USHORT DeviceNameLength;
+} MOUNTMGR_CREATE_POINT_INPUT, *PMOUNTMGR_CREATE_POINT_INPUT;
+
+typedef struct _MOUNTMGR_MOUNT_POINT {
+ ULONG SymbolicLinkNameOffset;
+ USHORT SymbolicLinkNameLength;
+ ULONG UniqueIdOffset;
+ USHORT UniqueIdLength;
+ ULONG DeviceNameOffset;
+ USHORT DeviceNameLength;
+} MOUNTMGR_MOUNT_POINT, *PMOUNTMGR_MOUNT_POINT;
+
+typedef struct _MOUNTMGR_MOUNT_POINTS {
+ ULONG Size;
+ ULONG NumberOfMountPoints;
+ MOUNTMGR_MOUNT_POINT MountPoints[1];
+} MOUNTMGR_MOUNT_POINTS, *PMOUNTMGR_MOUNT_POINTS;
+
+typedef struct _MOUNTMGR_DRIVE_LETTER_TARGET {
+ USHORT DeviceNameLength;
+ WCHAR DeviceName[1];
+} MOUNTMGR_DRIVE_LETTER_TARGET, *PMOUNTMGR_DRIVE_LETTER_TARGET;
+
+typedef struct _MOUNTMGR_DRIVE_LETTER_INFORMATION {
+ BOOLEAN DriveLetterWasAssigned;
+ UCHAR CurrentDriveLetter;
+} MOUNTMGR_DRIVE_LETTER_INFORMATION, *PMOUNTMGR_DRIVE_LETTER_INFORMATION;
+
+typedef struct _MOUNTMGR_VOLUME_MOUNT_POINT {
+ USHORT SourceVolumeNameOffset;
+ USHORT SourceVolumeNameLength;
+ USHORT TargetVolumeNameOffset;
+ USHORT TargetVolumeNameLength;
+} MOUNTMGR_VOLUME_MOUNT_POINT, *PMOUNTMGR_VOLUME_MOUNT_POINT;
+
+typedef struct _MOUNTMGR_CHANGE_NOTIFY_INFO {
+ ULONG EpicNumber;
+} MOUNTMGR_CHANGE_NOTIFY_INFO, *PMOUNTMGR_CHANGE_NOTIFY_INFO;
+
+typedef struct _MOUNTMGR_TARGET_NAME {
+ USHORT DeviceNameLength;
+ WCHAR DeviceName[1];
+} MOUNTMGR_TARGET_NAME, *PMOUNTMGR_TARGET_NAME;
+
+typedef struct _MOUNTDEV_NAME {
+ USHORT NameLength;
+ WCHAR Name[1];
+} MOUNTDEV_NAME, *PMOUNTDEV_NAME;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATH \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_MOUNTMGR_QUERY_DOS_VOLUME_PATHS \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
#define MOUNTMGR_IS_DOS_VOLUME_NAME(s) (MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 96 && (s)->Buffer[1] == '\\')
#define MOUNTMGR_IS_DOS_VOLUME_NAME_WB(s) (MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 98 && (s)->Buffer[1] == '\\')
#define MOUNTMGR_IS_NT_VOLUME_NAME(s) ( MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 96 && (s)->Buffer[1] == '?')
#define MOUNTMGR_IS_NT_VOLUME_NAME_WB(s) (MOUNTMGR_IS_VOLUME_NAME(s) && (s)->Length == 98 && (s)->Buffer[1] == '?')
+
+typedef struct _MOUNTMGR_VOLUME_PATHS {
+ ULONG MultiSzLength;
+ WCHAR MultiSz[1];
+} MOUNTMGR_VOLUME_PATHS, *PMOUNTMGR_VOLUME_PATHS;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+#define IOCTL_MOUNTMGR_SCRUB_REGISTRY \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 14, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_MOUNTMGR_QUERY_AUTO_MOUNT \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_MOUNTMGR_SET_AUTO_MOUNT \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 16, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+typedef enum _MOUNTMGR_AUTO_MOUNT_STATE {
+ Disabled = 0,
+ Enabled
+} MOUNTMGR_AUTO_MOUNT_STATE;
+
+typedef struct _MOUNTMGR_QUERY_AUTO_MOUNT {
+ MOUNTMGR_AUTO_MOUNT_STATE CurrentState;
+} MOUNTMGR_QUERY_AUTO_MOUNT, *PMOUNTMGR_QUERY_AUTO_MOUNT;
+
+typedef struct _MOUNTMGR_SET_AUTO_MOUNT {
+ MOUNTMGR_AUTO_MOUNT_STATE NewState;
+} MOUNTMGR_SET_AUTO_MOUNT, *PMOUNTMGR_SET_AUTO_MOUNT;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+#define IOCTL_MOUNTMGR_BOOT_DL_ASSIGNMENT \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 17, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+#define IOCTL_MOUNTMGR_TRACELOG_CACHE \
+ CTL_CODE(MOUNTMGRCONTROLTYPE, 18, METHOD_BUFFERED, FILE_READ_ACCESS)
+
#endif
+#endif /* _MOUNTMGR_ */
+
diff --git a/include/ddk/ndis.h b/include/ddk/ndis.h
index da301b11042..ede016e317a 100644
--- a/include/ddk/ndis.h
+++ b/include/ddk/ndis.h
@@ -388,22 +388,22 @@ typedef struct _NDIS_PACKET_PRIVATE {
} NDIS_PACKET_PRIVATE, * PNDIS_PACKET_PRIVATE;
typedef struct _NDIS_PACKET {
- NDIS_PACKET_PRIVATE Private;
- __GNU_EXTENSION union {
- __GNU_EXTENSION struct {
- UCHAR MiniportReserved[2 * sizeof(PVOID)];
- UCHAR WrapperReserved[2 * sizeof(PVOID)];
- };
- __GNU_EXTENSION struct {
- UCHAR MiniportReservedEx[3 * sizeof(PVOID)];
- UCHAR WrapperReservedEx[sizeof(PVOID)];
- };
- __GNU_EXTENSION struct {
- UCHAR MacReserved[4 * sizeof(PVOID)];
- };
- };
- ULONG_PTR Reserved[2];
- UCHAR ProtocolReserved[1];
+ NDIS_PACKET_PRIVATE Private;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ UCHAR MiniportReserved[2 * sizeof(PVOID)];
+ UCHAR WrapperReserved[2 * sizeof(PVOID)];
+ } DUMMYSTRUCTNAME;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR MiniportReservedEx[3 * sizeof(PVOID)];
+ UCHAR WrapperReservedEx[sizeof(PVOID)];
+ } DUMMYSTRUCTNAME;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR MacReserved[4 * sizeof(PVOID)];
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ ULONG_PTR Reserved[2];
+ UCHAR ProtocolReserved[1];
} NDIS_PACKET, *PNDIS_PACKET, **PPNDIS_PACKET;
typedef enum _NDIS_CLASS_ID {
@@ -936,18 +936,6 @@ typedef struct _NDIS_TASK_IPSEC {
} V4ESP;
} NDIS_TASK_IPSEC, *PNDIS_TASK_IPSEC;
-typedef struct _NDIS_TASK_OFFLOAD {
- ULONG Version;
- ULONG Size;
- NDIS_TASK Task;
- ULONG OffsetNextTask;
- ULONG TaskBufferLength;
- UCHAR TaskBuffer[1];
-} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
-
-/* NDIS_TASK_OFFLOAD_HEADER.Version constants */
-#define NDIS_TASK_OFFLOAD_VERSION 1
-
typedef enum _NDIS_ENCAPSULATION {
UNSPECIFIED_Encapsulation,
NULL_Encapsulation,
@@ -966,15 +954,26 @@ typedef struct _NDIS_ENCAPSULATION_FORMAT {
ULONG EncapsulationHeaderSize;
} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
-typedef struct _NDIS_TASK_OFFLOAD_HEADER
-{
- ULONG Version;
- ULONG Size;
- ULONG Reserved;
- ULONG OffsetFirstTask;
- NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
+typedef struct _NDIS_TASK_OFFLOAD_HEADER {
+ ULONG Version;
+ ULONG Size;
+ ULONG Reserved;
+ ULONG OffsetFirstTask;
+ NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
+typedef struct _NDIS_TASK_OFFLOAD {
+ ULONG Version;
+ ULONG Size;
+ NDIS_TASK Task;
+ ULONG OffsetNextTask;
+ ULONG TaskBufferLength;
+ UCHAR TaskBuffer[1];
+} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
+
+/* NDIS_TASK_OFFLOAD_HEADER.Version constants */
+#define NDIS_TASK_OFFLOAD_VERSION 1
+
typedef struct _NDIS_TASK_TCP_IP_CHECKSUM {
struct {
ULONG IpOptionsSupported:1;
@@ -1572,6 +1571,8 @@ NdisAllocatePacketPool(
IN UINT NumberOfDescriptors,
IN UINT ProtocolReservedLength);
+#define PROTOCOL_RESERVED_SIZE_IN_PACKET (4 * sizeof(PVOID))
+
NDISAPI
VOID
NTAPI
@@ -1739,6 +1740,46 @@ NdisGetFirstBufferFromPacket(
OUT PUINT _FirstBufferLength,
OUT PUINT _TotalBufferLength);
+/*
+ * VOID
+ * NdisGetFirstBufferFromPacketSafe(
+ * IN PNDIS_PACKET _Packet,
+ * OUT PNDIS_BUFFER * _FirstBuffer,
+ * OUT PVOID * _FirstBufferVA,
+ * OUT PUINT _FirstBufferLength,
+ * OUT PUINT _TotalBufferLength),
+ * IN MM_PAGE_PRIORITY _Priority)
+ */
+#define NdisGetFirstBufferFromPacketSafe(_Packet, \
+ _FirstBuffer, \
+ _FirstBufferVA, \
+ _FirstBufferLength, \
+ _TotalBufferLength, \
+ _Priority) \
+{ \
+ PNDIS_BUFFER _Buffer; \
+ \
+ _Buffer = (_Packet)->Private.Head; \
+ *(_FirstBuffer) = _Buffer; \
+ if (_Buffer != NULL) \
+ { \
+ *(_FirstBufferVA) = MmGetSystemAddressForMdlSafe(_Buffer, _Priority); \
+ *(_FirstBufferLength) = MmGetMdlByteCount(_Buffer); \
+ _Buffer = _Buffer->Next; \
+ *(_TotalBufferLength) = *(_FirstBufferLength); \
+ while (_Buffer != NULL) { \
+ *(_TotalBufferLength) += MmGetMdlByteCount(_Buffer); \
+ _Buffer = _Buffer->Next; \
+ } \
+ } \
+ else \
+ { \
+ *(_FirstBufferVA) = 0; \
+ *(_FirstBufferLength) = 0; \
+ *(_TotalBufferLength) = 0; \
+ } \
+}
+
NDISAPI
VOID
NTAPI
@@ -2973,6 +3014,13 @@ NdisAllocatePacketPoolEx(
IN UINT NumberOfOverflowDescriptors,
IN UINT ProtocolReservedLength);
+NDISAPI
+VOID
+NTAPI
+NdisSetPacketPoolProtocolId(
+ IN NDIS_HANDLE PacketPoolHandle,
+ IN UINT ProtocolId);
+
NDISAPI
VOID
NTAPI
@@ -4781,15 +4829,15 @@ NDISAPI
VOID
NTAPI
NdisMSetPeriodicTimer(
- IN PNDIS_MINIPORT_TIMER Timer,
- IN UINT MillisecondPeriod);
+ IN PNDIS_MINIPORT_TIMER Timer,
+ IN UINT MillisecondPeriod);
NDISAPI
VOID
NTAPI
NdisMCancelTimer(
- IN PNDIS_MINIPORT_TIMER Timer,
- OUT PBOOLEAN TimerCancelled);
+ IN PNDIS_MINIPORT_TIMER Timer,
+ OUT PBOOLEAN TimerCancelled);
#if !defined(NDIS_WRAPPER)
diff --git a/include/ddk/ndisguid.h b/include/ddk/ndisguid.h
index aa0771d6e45..5ef76440bfd 100644
--- a/include/ddk/ndisguid.h
+++ b/include/ddk/ndisguid.h
@@ -20,421 +20,195 @@
*
*/
-#ifndef __NDISGUID_H
-#define __NDISGUID_H
+#pragma once
#include
-
#ifdef __cplusplus
extern "C" {
#endif
-DEFINE_GUID(GUID_DEVINTERFACE_NET,
- 0xcac88484, 0x7515, 0x4c03, 0x82, 0xe6, 0x71, 0xa8, 0x7a, 0xba, 0xc3, 0x61);
-
-DEFINE_GUID(GUID_NDIS_LAN_CLASS,
- 0xad498944, 0x762f, 0x11d0, 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ENUMERATE_ADAPTER,
- 0x981f2d7f, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ENUMERATE_VC,
- 0x981f2d82, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_NOTIFY_ADAPTER_ARRIVAL,
- 0x981f2d81, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_NOTIFY_ADAPTER_REMOVAL,
- 0x981f2d80, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_NOTIFY_VC_ARRIVAL,
- 0x182f9e0c, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_NOTIFY_VC_REMOVAL,
- 0x981f2d79, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_NOTIFY_BIND,
- 0x5413531c, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_NOTIFY_UNBIND,
- 0x6e3ce1ec, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_WAKE_ON_MAGIC_PACKET_ONLY,
- 0xa14f1c97, 0x8839, 0x4f8a, 0x99, 0x96, 0xa2, 0x89, 0x96, 0xeb, 0xbf, 0x1d);
-
-
-DEFINE_GUID(GUID_NDIS_802_3_CURRENT_ADDRESS,
- 0x44795700, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_MAC_OPTIONS,
- 0x44795703, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_MAXIMUM_LIST_SIZE,
- 0x44795702, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_MULTICAST_LIST,
- 0x44795701, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_PERMANENT_ADDRESS,
- 0x447956ff, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_RCV_ERROR_ALIGNMENT,
- 0x44795704, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_XMIT_MORE_COLLISIONS,
- 0x44795706, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_3_XMIT_ONE_COLLISION,
- 0x44795705, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_CURRENT_ADDRESS,
- 0x44795708, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_CURRENT_FUNCTIONAL,
- 0x44795709, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_CURRENT_GROUP,
- 0x4479570a, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_CURRENT_RING_STATE,
- 0xacf14032, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_CURRENT_RING_STATUS,
- 0x890a36ec, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_LAST_OPEN_STATUS,
- 0x4479570b, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_PERMANENT_ADDRESS,
- 0x44795707, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_LINE_ERRORS,
- 0xacf14033, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_802_5_LOST_FRAMES,
- 0xacf14034, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_802_11_ADD_WEP,
- 0x4307bff0, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_AUTHENTICATION_MODE,
- 0x43920a24, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_BSSID,
- 0x2504b6c2, 0x1fa5, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_BSSID_LIST,
- 0x69526f9a, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_BASIC_RATES,
- 0x4a198516, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_CONFIGURATION,
- 0x4a4df982, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_DESIRED_RATES,
- 0x452ee08e, 0x2536, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_DISASSOCIATE,
- 0x43671f40, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_FRAGMENTATION_THRESHOLD,
- 0x69aaa7c4, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_INFRASTRUCTURE_MODE,
- 0x697d5a7e, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_NETWORK_TYPES_SUPPORTED,
- 0x8531d6e6, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_NETWORK_TYPE_IN_USE,
- 0x857e2326, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_NUMBER_OF_ANTENNAS,
- 0x01779336, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_POWER_MODE,
- 0x85be837c, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_RATES_SUPPORTED,
- 0x49db8722, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_REMOVE_WEP,
- 0x433c345c, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_PRIVACY_FILTER,
- 0x6733c4e9, 0x4792, 0x11d4, 0x97, 0xf1, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_RSSI,
- 0x1507db16, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_RSSI_TRIGGER,
- 0x155689b8, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_RTS_THRESHOLD,
- 0x0134d07e, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_RX_ANTENNA_SELECTED,
- 0x01ac07a2, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_SSID,
- 0x7d2a90ea, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_STATISTICS,
- 0x42bb73b0, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_TX_POWER_LEVEL,
- 0x11e6ba76, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-DEFINE_GUID(GUID_NDIS_802_11_TX_ANTENNA_SELECTED,
- 0x01dbb74a, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
-
-
-DEFINE_GUID(GUID_NDIS_ATM_HW_CURRENT_ADDRESS,
- 0x791ad1a1, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL0_PACKET_SIZE,
- 0x791ad1a5, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL1_PACKET_SIZE,
- 0x791ad1a6, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL34_PACKET_SIZE,
- 0x791ad1a7, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_AAL5_PACKET_SIZE,
- 0x791ad191, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_ACTIVE_VCI_BITS,
- 0x791ad1a3, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_ACTIVE_VCS,
- 0x791ad1a2, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_MAX_ACTIVE_VPI_BITS,
- 0x791ad1a4, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_SUPPORTED_AAL_TYPES,
- 0x791ad1a0, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_SUPPORTED_SERVICE_CATEGORY,
- 0x791ad19f, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_SUPPORTED_VC_RATES,
- 0x791ad19e, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_ATM_RCV_CELLS_DROPPED,
- 0x0a21480c, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_RCV_CELLS_OK,
- 0x0a21480a, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_ATM_XMIT_CELLS_OK,
- 0x0a21480b, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_FDDI_LONG_CURRENT_ADDR,
- 0xacf14036, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_LONG_MAX_LIST_SIZE,
- 0xacf14038, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_LONG_MULTICAST_LIST,
- 0xacf14037, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_LONG_PERMANENT_ADDR,
- 0xacf14035, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_SHORT_CURRENT_ADDR,
- 0xacf1403a, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_SHORT_MAX_LIST_SIZE,
- 0xacf1403c, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_SHORT_MULTICAST_LIST,
- 0xacf1403b, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_SHORT_PERMANENT_ADDR,
- 0xacf14039, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_FDDI_ATTACHMENT_TYPE,
- 0xacf1403d, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_DOWNSTREAM_NODE_LONG,
- 0xacf1403f, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_FRAME_ERRORS,
- 0xacf14040, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_FRAMES_LOST,
- 0xacf14041, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_LCT_FAILURES,
- 0xacf14043, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_LCONNECTION_STATE,
- 0xacf14045, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_LEM_REJECTS,
- 0xacf14044, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_RING_MGT_STATE,
- 0xacf14042, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_FDDI_UPSTREAM_NODE_LONG,
- 0xacf1403e, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_GEN_CURRENT_LOOKAHEAD,
- 0x5ec10361, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CURRENT_PACKET_FILTER,
- 0x5ec10360, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_DRIVER_VERSION,
- 0x5ec10362, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_HARDWARE_STATUS,
- 0x5ec10354, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MEDIA_IN_USE,
- 0x5ec10356, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MEDIA_SUPPORTED,
- 0x5ec10355, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_LINK_SPEED,
- 0x5ec10359, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MAC_OPTIONS,
- 0x5ec10365, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_LOOKAHEAD,
- 0x5ec10357, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_FRAME_SIZE,
- 0x5ec10358, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_SEND_PACKETS,
- 0x5ec10367, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_TOTAL_SIZE,
- 0x5ec10363, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_MEDIA_CONNECT_STATUS,
- 0x5ec10366, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_RECEIVE_BLOCK_SIZE,
- 0x5ec1035d, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_RECEIVE_BUFFER_SPACE,
- 0x5ec1035b, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_TRANSMIT_BUFFER_SPACE,
- 0x5ec1035a, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_TRANSMIT_BLOCK_SIZE,
- 0x5ec1035c, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_VENDOR_DESCRIPTION,
- 0x5ec1035f, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_VENDOR_DRIVER_VERSION,
- 0x447956f9, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_VENDOR_ID,
- 0x5ec1035e, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_GEN_RCV_ERROR,
- 0x447956fd, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_RCV_NO_BUFFER,
- 0x447956fe, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_RCV_OK,
- 0x447956fb, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_XMIT_ERROR,
- 0x447956fc, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_XMIT_OK,
- 0x447956fa, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_DRIVER_VERSION,
- 0x791ad198, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_HARDWARE_STATUS,
- 0x791ad192, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_LINK_SPEED,
- 0x791ad195, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_MAC_OPTIONS,
- 0x791ad19a, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_SUPPORTED,
- 0x791ad193, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_IN_USE,
- 0x791ad194, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_CONNECT_STATUS,
- 0x791ad19b, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_MINIMUM_LINK_SPEED,
- 0x791ad19d, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_DESCRIPTION,
- 0x791ad197, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_DRIVER_VERSION,
- 0x791ad19c, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_ID,
- 0x791ad196, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_ERROR,
- 0x0a214808, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_OK,
- 0x0a214806, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_NO_BUFFER,
- 0x0a214809, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_XMIT_PDUS_ERROR,
- 0x0a214807, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_GEN_CO_XMIT_PDUS_OK,
- 0x0a214805, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-
-DEFINE_GUID(GUID_NDIS_STATUS_LINK_SPEED_CHANGE,
- 0x981f2d85, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_CONNECT,
- 0x981f2d7d, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_DISCONNECT,
- 0x981f2d7e, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_SPECIFIC_INDICATION,
- 0x981f2d84, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_STATUS_RESET_END,
- 0x981f2d77, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
-
-DEFINE_GUID(GUID_NDIS_STATUS_RESET_START,
- 0x981f2d76, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_DEVINTERFACE_NET, 0xcac88484, 0x7515, 0x4c03, 0x82, 0xe6, 0x71, 0xa8, 0x7a, 0xba, 0xc3, 0x61);
+DEFINE_GUID(GUID_NDIS_802_11_ADD_KEY, 0xab8b5a62, 0x1d51, 0x49d8, 0xba, 0x5c, 0xfa, 0x98, 0x0b, 0xe0, 0x3a, 0x1d);
+DEFINE_GUID(GUID_NDIS_802_11_ADD_WEP, 0x4307bff0, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_ASSOCIATION_INFORMATION, 0xa08d4dd0, 0x960e, 0x40bd, 0x8c, 0xf6, 0xc5, 0x38, 0xaf, 0x98, 0xf2, 0xe3);
+DEFINE_GUID(GUID_NDIS_802_11_AUTHENTICATION_MODE, 0x43920a24, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_BSSID, 0x2504b6c2, 0x1fa5, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_BSSID_LIST, 0x69526f9a, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_BSSID_LIST_SCAN, 0x0d9e01e1, 0xba70, 0x11d4, 0xb6, 0x75, 0x00, 0x20, 0x48, 0x57, 0x03, 0x37);
+DEFINE_GUID(GUID_NDIS_802_11_CONFIGURATION, 0x4a4df982, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_DESIRED_RATES, 0x452ee08e, 0x2536, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_DISASSOCIATE, 0x43671f40, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_FRAGMENTATION_THRESHOLD, 0x69aaa7c4, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_INFRASTRUCTURE_MODE, 0x697d5a7e, 0x2062, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_MEDIA_STREAM_MODE, 0x0a56af66, 0xd84b, 0x49eb, 0xa2, 0x8d, 0x52, 0x82, 0xcb, 0xb6, 0xd0, 0xcd);
+DEFINE_GUID(GUID_NDIS_802_11_NETWORK_TYPES_SUPPORTED, 0x8531d6e6, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_NETWORK_TYPE_IN_USE, 0x857e2326, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_NUMBER_OF_ANTENNAS, 0x01779336, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_POWER_MODE, 0x85be837c, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_PRIVACY_FILTER, 0x6733c4e9, 0x4792, 0x11d4, 0x97, 0xf1, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_RELOAD_DEFAULTS, 0x748b14e8, 0x32ee, 0x4425, 0xb9, 0x1b, 0xc9, 0x84, 0x8c, 0x58, 0xb5, 0x5a);
+DEFINE_GUID(GUID_NDIS_802_11_REMOVE_KEY, 0x73cb28e9, 0x3188, 0x42d5, 0xb5, 0x53, 0xb2, 0x12, 0x37, 0xe6, 0x08, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_11_REMOVE_WEP, 0x433c345c, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_RSSI, 0x1507db16, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_RSSI_TRIGGER, 0x155689b8, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_RTS_THRESHOLD, 0x0134d07e, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_RX_ANTENNA_SELECTED, 0x01ac07a2, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_SSID, 0x7d2a90ea, 0x2041, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_STATISTICS, 0x42bb73b0, 0x2129, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_SUPPORTED_RATES, 0x49db8722, 0x2068, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_TEST, 0x4b9ca16a, 0x6a60, 0x4e9d, 0x92, 0x0c, 0x63, 0x35, 0x95, 0x3f, 0xa0, 0xb5);
+DEFINE_GUID(GUID_NDIS_802_11_TX_ANTENNA_SELECTED, 0x01dbb74a, 0x2064, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_TX_POWER_LEVEL, 0x11e6ba76, 0x2053, 0x11d4, 0x97, 0xeb, 0x00, 0xc0, 0x4f, 0x79, 0xc4, 0x03);
+DEFINE_GUID(GUID_NDIS_802_11_WEP_STATUS, 0xb027a21f, 0x3cfa, 0x4125, 0x80, 0x0b, 0x3f, 0x7a, 0x18, 0xfd, 0xdc, 0xdc);
+DEFINE_GUID(GUID_NDIS_802_3_CURRENT_ADDRESS, 0x44795700, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_MAC_OPTIONS, 0x44795703, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_MAXIMUM_LIST_SIZE, 0x44795702, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_MULTICAST_LIST, 0x44795701, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_PERMANENT_ADDRESS, 0x447956ff, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_RCV_ERROR_ALIGNMENT, 0x44795704, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_XMIT_MORE_COLLISIONS, 0x44795706, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_3_XMIT_ONE_COLLISION, 0x44795705, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_CURRENT_ADDRESS, 0x44795708, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_CURRENT_FUNCTIONAL, 0x44795709, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_CURRENT_GROUP, 0x4479570a, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_CURRENT_RING_STATE, 0xacf14032, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_CURRENT_RING_STATUS, 0x890a36ec, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_LAST_OPEN_STATUS, 0x4479570b, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_LINE_ERRORS, 0xacf14033, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_LOST_FRAMES, 0xacf14034, 0xa61c, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_802_5_PERMANENT_ADDRESS, 0x44795707, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_ENUMERATE_ADAPTER, 0x981f2d7f, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_ENUMERATE_ADAPTERS_EX, 0x16716917, 0x4306, 0x4be4, 0x9b, 0x5a, 0x38, 0x09, 0xae, 0x44, 0xb1, 0x25);
+DEFINE_GUID(GUID_NDIS_ENUMERATE_VC, 0x981f2d82, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_DRIVER_VERSION, 0x791ad198, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_HARDWARE_STATUS, 0x791ad192, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_LINK_SPEED, 0x791ad195, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_MAC_OPTIONS, 0x791ad19a, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_CONNECT_STATUS, 0x791ad19b, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_IN_USE, 0x791ad194, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_MEDIA_SUPPORTED, 0x791ad193, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_MINIMUM_LINK_SPEED, 0x791ad19d, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_ERROR, 0x0a214808, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_NO_BUFFER, 0x0a214809, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_RCV_PDUS_OK, 0x0a214806, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_DESCRIPTION, 0x791ad197, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_DRIVER_VERSION, 0x791ad19c, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_VENDOR_ID, 0x791ad196, 0xe35c, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_XMIT_PDUS_ERROR, 0x0a214807, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CO_XMIT_PDUS_OK, 0x0a214805, 0xe35f, 0x11d0, 0x96, 0x92, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CURRENT_LOOKAHEAD, 0x5ec10361, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_CURRENT_PACKET_FILTER, 0x5ec10360, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_DRIVER_VERSION, 0x5ec10362, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_ENUMERATE_PORTS, 0xf1d6abe8, 0x15e4, 0x4407, 0x81, 0xb7, 0x6b, 0x83, 0x0c, 0x77, 0x7c, 0xd9);
+DEFINE_GUID(GUID_NDIS_GEN_HARDWARE_STATUS, 0x5ec10354, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_INTERRUPT_MODERATION, 0xd9c8eea5, 0xf16e, 0x467c, 0x84, 0xd5, 0x63, 0x45, 0xa2, 0x2c, 0xe2, 0x13);
+DEFINE_GUID(GUID_NDIS_GEN_INTERRUPT_MODERATION_PARAMETERS, 0xd789adfa, 0x9c56, 0x433b, 0xad, 0x01, 0x75, 0x74, 0xf3, 0xce, 0xdb, 0xe9);
+DEFINE_GUID(GUID_NDIS_GEN_LINK_PARAMETERS, 0x8c7d3579, 0x252b, 0x4614, 0x82, 0xc5, 0xa6, 0x50, 0xda, 0xa1, 0x50, 0x49);
+DEFINE_GUID(GUID_NDIS_GEN_LINK_SPEED, 0x5ec10359, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_LINK_STATE, 0xba1f4c14, 0xa945, 0x4762, 0xb9, 0x16, 0x0b, 0x55, 0x15, 0xb6, 0xf4, 0x3a);
+DEFINE_GUID(GUID_NDIS_GEN_MAC_OPTIONS, 0x5ec10365, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_FRAME_SIZE, 0x5ec10358, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_LOOKAHEAD, 0x5ec10357, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_SEND_PACKETS, 0x5ec10367, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MAXIMUM_TOTAL_SIZE, 0x5ec10363, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MEDIA_CONNECT_STATUS, 0x5ec10366, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MEDIA_IN_USE, 0x5ec10356, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_MEDIA_SUPPORTED, 0x5ec10355, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_PCI_DEVICE_CUSTOM_PROPERTIES, 0xaa39f5ab, 0xe260,0x4d01, 0x82, 0xb0, 0xb7, 0x37, 0xc8, 0x80, 0xea, 0x05);
+DEFINE_GUID(GUID_NDIS_GEN_PHYSICAL_MEDIUM, 0x418ca16d, 0x3937, 0x4208, 0x94, 0x0a, 0xec, 0x61, 0x96, 0x27, 0x80, 0x85);
+DEFINE_GUID(GUID_NDIS_GEN_PHYSICAL_MEDIUM_EX, 0x899e7782, 0x035b,0x43f9, 0x8b, 0xb6, 0x2b, 0x58, 0x97, 0x16, 0x12, 0xe5);
+DEFINE_GUID(GUID_NDIS_GEN_PORT_AUTHENTICATION_PARAMETERS, 0xaab6ac31, 0x86fb, 0x48fb, 0x8b, 0x48, 0x63, 0xdb, 0x23, 0x5a, 0xce, 0x16);
+DEFINE_GUID(GUID_NDIS_GEN_PORT_STATE, 0x6fbf2a5f, 0x8b8f, 0x4920, 0x81, 0x43, 0xe6, 0xc4, 0x60, 0xf5, 0x25, 0x24);
+DEFINE_GUID(GUID_NDIS_GEN_RCV_ERROR, 0x447956fd, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_RCV_NO_BUFFER, 0x447956fe, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_RCV_OK, 0x447956fb, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_RECEIVE_BLOCK_SIZE, 0x5ec1035d, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_RECEIVE_BUFFER_SPACE, 0x5ec1035b, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_STATISTICS, 0x368c45b5, 0xc129, 0x43c1, 0x93, 0x9e, 0x7e, 0xdc, 0x2d, 0x7f, 0xe6, 0x21);
+DEFINE_GUID(GUID_NDIS_GEN_TRANSMIT_BLOCK_SIZE, 0x5ec1035c, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_TRANSMIT_BUFFER_SPACE, 0x5ec1035a, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_VENDOR_DESCRIPTION, 0x5ec1035f, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_VENDOR_DRIVER_VERSION, 0x447956f9, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_VENDOR_ID, 0x5ec1035e, 0xa61a, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_VLAN_ID, 0x765dc702, 0xc5e8, 0x4b67, 0x84, 0x3b, 0x3f, 0x5a, 0x4f, 0xf2, 0x64, 0x8b);
+DEFINE_GUID(GUID_NDIS_GEN_XMIT_ERROR, 0x447956fc, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_GEN_XMIT_OK, 0x447956fa, 0xa61b, 0x11d0, 0x8d, 0xd4, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_HD_SPLIT_CURRENT_CONFIG, 0x81d1303c, 0xab00, 0x4e49, 0x80, 0xb1, 0x5e, 0x6e, 0x0b, 0xf9, 0xbe, 0x53);
+DEFINE_GUID(GUID_NDIS_HD_SPLIT_PARAMETERS, 0x8c048bea, 0x2913, 0x4458, 0xb6, 0x8e, 0x17, 0xf6, 0xc1, 0xe5, 0xc6, 0x0e);
+DEFINE_GUID(GUID_NDIS_LAN_CLASS, 0xad498944, 0x762f, 0x11d0, 0x8d, 0xcb, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_ADAPTER_ARRIVAL, 0x981f2d81, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_ADAPTER_REMOVAL, 0x981f2d80, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_BIND, 0x5413531c, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_DEVICE_POWER_OFF, 0x81bc8189, 0xb026, 0x46ab, 0xb9, 0x64, 0xf1, 0x82, 0xe3, 0x42, 0x93, 0x4e);
+DEFINE_GUID(GUID_NDIS_NOTIFY_DEVICE_POWER_OFF_EX, 0x4159353c, 0x5cd7, 0x42ce, 0x8f, 0xe4, 0xa4, 0x5a, 0x23, 0x80, 0xcc, 0x4f);
+DEFINE_GUID(GUID_NDIS_NOTIFY_DEVICE_POWER_ON, 0x5f81cfd0, 0xf046, 0x4342, 0xaf, 0x61, 0x89, 0x5a, 0xce, 0xda, 0xef, 0xd9);
+DEFINE_GUID(GUID_NDIS_NOTIFY_DEVICE_POWER_ON_EX, 0x2b440188, 0x92ac, 0x4f60, 0x9b, 0x2d, 0x20, 0xa3, 0x0c, 0xbb, 0x6b, 0xbe);
+DEFINE_GUID(GUID_NDIS_NOTIFY_FILTER_ARRIVAL, 0x0b6d3c89, 0x5917, 0x43ca, 0xb5, 0x78, 0xd0, 0x1a, 0x79, 0x67, 0xc4, 0x1c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_FILTER_REMOVAL, 0x1f177cd9, 0x5955, 0x4721, 0x9f, 0x6a, 0x78, 0xeb, 0xdf, 0xae, 0xf8, 0x89);
+DEFINE_GUID(GUID_NDIS_NOTIFY_UNBIND, 0x6e3ce1ec, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_VC_ARRIVAL, 0x182f9e0c, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_NOTIFY_VC_REMOVAL, 0x981f2d79, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_PM_ACTIVE_CAPABILITIES, 0xb2cf76e3, 0xb3ae, 0x4394, 0xa0, 0x1f, 0x33, 0x8c, 0x98, 0x70, 0xe9, 0x39);
+DEFINE_GUID(GUID_NDIS_PM_ADMIN_CONFIG, 0x1528d111, 0x708a, 0x4ca4, 0x92, 0x15, 0xc0, 0x57, 0x71, 0x16, 0x1c, 0xda);
+DEFINE_GUID(GUID_NDIS_RECEIVE_FILTER_ENUM_FILTERS, 0x3f2c141d, 0x83bc, 0x11dd, 0x94, 0xb8, 0x00, 0x1d, 0x09, 0x16, 0x2b, 0xc3);
+DEFINE_GUID(GUID_NDIS_RECEIVE_FILTER_ENUM_QUEUES, 0x3f2c141b, 0x83bc, 0x11dd, 0x94, 0xb8, 0x00, 0x1d, 0x09, 0x16, 0x2b, 0xc3);
+DEFINE_GUID(GUID_NDIS_RECEIVE_FILTER_GLOBAL_PARAMETERS, 0x3f2c141a, 0x83bc, 0x11dd, 0x94, 0xb8, 0x00, 0x1d, 0x09, 0x16, 0x2b, 0xc3);
+DEFINE_GUID(GUID_NDIS_RECEIVE_FILTER_HARDWARE_CAPABILITIES, 0x3f2c1419, 0x83bc, 0x11dd, 0x94, 0xb8, 0x00, 0x1d, 0x09, 0x16, 0x2b, 0xc3);
+DEFINE_GUID(GUID_NDIS_RECEIVE_FILTER_PARAMETERS, 0x3f2c141e, 0x83bc, 0x11dd, 0x94, 0xb8, 0x00, 0x1d, 0x09, 0x16, 0x2b, 0xc3);
+DEFINE_GUID(GUID_NDIS_RECEIVE_FILTER_QUEUE_PARAMETERS, 0x3f2c141c, 0x83bc, 0x11dd, 0x94, 0xb8, 0x00, 0x1d, 0x09, 0x16, 0x2b, 0xc3);
+DEFINE_GUID(GUID_NDIS_RECEIVE_SCALE_CAPABILITIES, 0x26c28774, 0x4252, 0x48fe, 0xa6, 0x10, 0xa5, 0x8a, 0x39, 0x8c, 0x0e, 0xb1);
+DEFINE_GUID(GUID_NDIS_RSS_ENABLED, 0x9565cd55, 0x3402, 0x4e32, 0xa5, 0xb6, 0x2f, 0x14, 0x3f, 0x2f, 0x2c, 0x30);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_ASSOCIATION_COMPLETION, 0x458bbea7, 0x45a4, 0x4ae2, 0xb1, 0x76, 0xe5, 0x1f, 0x96, 0xfc, 0x05, 0x68);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_ASSOCIATION_START, 0x3927843b, 0x6980, 0x4b48, 0xb1, 0x5b, 0x4d, 0xe5, 0x09, 0x77, 0xac, 0x40);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_CONNECTION_COMPLETION, 0x96efd9c9, 0x7f1b, 0x4a89, 0xbc, 0x04, 0x3e, 0x9e, 0x27, 0x17, 0x65, 0xf1);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_CONNECTION_START, 0x7b74299d, 0x998f, 0x4454, 0xad, 0x08, 0xc5, 0xaf, 0x28, 0x57, 0x6d, 0x1b);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_DISASSOCIATION, 0x3fbeb6fc, 0x0fe2, 0x43fd, 0xb2, 0xad, 0xbd, 0x99, 0xb5, 0xf9, 0x3e, 0x13);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_LINK_QUALITY, 0xa3285184, 0xea99, 0x48ed, 0x82, 0x5e, 0xa4, 0x26, 0xb1, 0x1c, 0x27, 0x54);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_MPDU_MAX_LENGTH_CHANGED, 0x1d6560ec, 0x8e48, 0x4a3e, 0x9f, 0xd5, 0xa0, 0x1b, 0x69, 0x8d, 0xb6, 0xc5);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_PHY_STATE_CHANGED, 0xdeb45316, 0x71b5, 0x4736, 0xbd, 0xef, 0x0a, 0x9e, 0x9f, 0x4e, 0x62, 0xdc);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_PMKID_CANDIDATE_LIST, 0x26d8b8f6, 0xdb82, 0x49eb, 0x8b, 0xf3, 0x4c, 0x13, 0x0e, 0xf0, 0x69, 0x50);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_ROAMING_COMPLETION, 0xdd9d47d1, 0x282b, 0x41e4, 0xb9, 0x24, 0x66, 0x36, 0x88, 0x17, 0xfc, 0xd3);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_ROAMING_START, 0xb2412d0d, 0x26c8, 0x4f4e, 0x93, 0xdf, 0xf7, 0xb7, 0x05, 0xa0, 0xb4, 0x33);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_SCAN_CONFIRM, 0x8500591e, 0xa0c7, 0x4efb, 0x93, 0x42, 0xb6, 0x74, 0xb0, 0x02, 0xcb, 0xe6);
+DEFINE_GUID(GUID_NDIS_STATUS_DOT11_TKIPMIC_FAILURE, 0x442c2ae4, 0x9bc5, 0x4b90, 0xa8, 0x89, 0x45, 0x5e, 0xf2, 0x20, 0xf4, 0xee);
+DEFINE_GUID(GUID_NDIS_STATUS_HD_SPLIT_CURRENT_CONFIG, 0x6c744b0e, 0xee9c, 0x4205, 0x90, 0xa2, 0x01, 0x5f, 0x6d, 0x65, 0xf4, 0x03);
+DEFINE_GUID(GUID_NDIS_STATUS_LINK_SPEED_CHANGE, 0x981f2d85, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_STATUS_LINK_STATE, 0x64c6f797, 0x878c, 0x4311, 0x92, 0x46, 0x65, 0xdb, 0xa8, 0x9c, 0x3a, 0x61);
+DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_CONNECT, 0x981f2d7d, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_DISCONNECT, 0x981f2d7e, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_STATUS_MEDIA_SPECIFIC_INDICATION, 0x981f2d84, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_STATUS_NETWORK_CHANGE, 0xca8a56f9, 0xce81, 0x40e6, 0xa7, 0x0f, 0xa0, 0x67,0xa4,0x76, 0xe9, 0xe9);
+DEFINE_GUID(GUID_NDIS_STATUS_OPER_STATUS, 0xf917b663, 0x845e, 0x4d3d, 0xb6, 0xd4, 0x15, 0xeb, 0x27, 0xaf, 0x81, 0xc5);
+DEFINE_GUID(GUID_NDIS_STATUS_PACKET_FILTER, 0xd47c5407, 0x2e75, 0x46dd, 0x81, 0x46, 0x1d, 0x7e, 0xd2, 0xd6, 0xab, 0x1d);
+DEFINE_GUID(GUID_NDIS_STATUS_PORT_STATE, 0x1dac0dfe, 0x43e5, 0x44b7, 0xb7, 0x59, 0x7b, 0xf4, 0x6d, 0xe3, 0x2e, 0x81);
+DEFINE_GUID(GUID_NDIS_STATUS_RESET_END, 0x981f2d77, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_STATUS_RESET_START, 0x981f2d76, 0xb1f3, 0x11d0, 0x8d, 0xd7, 0x00, 0xc0, 0x4f, 0xc3, 0x35, 0x8c);
+DEFINE_GUID(GUID_NDIS_STATUS_TASK_OFFLOAD_CURRENT_CONFIG, 0x45049fc6, 0x54d8, 0x40c8, 0x9c, 0x3d, 0xb0, 0x11, 0xc4, 0xe7, 0x15, 0xbc);
+DEFINE_GUID(GUID_NDIS_STATUS_TASK_OFFLOAD_HARDWARE_CAPABILITIES, 0xb6b8158b, 0x217c, 0x4b2a, 0xbe, 0x86, 0x6a, 0x04, 0xbe, 0xea, 0x65, 0xb8);
+DEFINE_GUID(GUID_NDIS_STATUS_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG, 0xf8edaeff, 0x24e4, 0x4ae6, 0xa4, 0x13, 0x0b, 0x27, 0xf7, 0x6b, 0x24, 0x3d);
+DEFINE_GUID(GUID_NDIS_STATUS_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES, 0x391969b6, 0x402c, 0x43bf, 0x89, 0x22, 0x39, 0xea, 0xe0, 0xda, 0x1b, 0xb5);
+DEFINE_GUID(GUID_NDIS_TCP_CONNECTION_OFFLOAD_CURRENT_CONFIG, 0x2ee6aef1, 0x0851, 0x458b, 0xbf, 0x0d, 0x79, 0x23, 0x43, 0xd1, 0xcd, 0xe1);
+DEFINE_GUID(GUID_NDIS_TCP_CONNECTION_OFFLOAD_HARDWARE_CAPABILITIES, 0x8ce71f2c, 0xd63a, 0x4390, 0xa4, 0x87, 0x18, 0xfa, 0x47, 0x26, 0x2c, 0xeb);
+DEFINE_GUID(GUID_NDIS_TCP_OFFLOAD_CURRENT_CONFIG, 0x68542fed, 0x5c74, 0x461e, 0x89, 0x34, 0x91, 0xc6, 0xf9, 0xc6, 0x09, 0x60);
+DEFINE_GUID(GUID_NDIS_TCP_OFFLOAD_HARDWARE_CAPABILITIES, 0xcd5f1102, 0x590f, 0x4ada, 0xab, 0x65, 0x5b, 0x31, 0xb1, 0xdc, 0x01, 0x72);
+DEFINE_GUID(GUID_NDIS_TCP_OFFLOAD_PARAMETERS, 0x8ead9a22, 0x7f69, 0x4bc6, 0x94, 0x9a, 0xc8, 0x18, 0x7b, 0x07, 0x4e, 0x61);
+DEFINE_GUID(GUID_NDIS_WAKE_ON_MAGIC_PACKET_ONLY, 0xa14f1c97, 0x8839, 0x4f8a, 0x99, 0x96, 0xa2, 0x89, 0x96, 0xeb, 0xbf, 0x1d);
+DEFINE_GUID(GUID_NIC_SWITCH_CURRENT_CAPABILITIES, 0xe76fdaf3, 0x0be7, 0x4d95, 0x87, 0xe9, 0x5a, 0xea, 0xd4, 0xb5, 0x90, 0xe9);
+DEFINE_GUID(GUID_NIC_SWITCH_HARDWARE_CAPABILITIES, 0x37cab40c, 0xd1e8, 0x4301, 0x8c, 0x1d, 0x58, 0x46, 0x5e, 0x0c, 0x4c, 0x0f);
+DEFINE_GUID(GUID_PM_ADD_PROTOCOL_OFFLOAD, 0x0c06c112, 0x0d93, 0x439b, 0x9e, 0x6d, 0x26, 0xbe, 0x13, 0x0c, 0x97, 0x84);
+DEFINE_GUID(GUID_PM_ADD_WOL_PATTERN, 0x6fc83ba7, 0x52bc, 0x4faa, 0xac, 0x51, 0x7d, 0x2f, 0xfe, 0x63, 0xba, 0x90);
+DEFINE_GUID(GUID_PM_CURRENT_CAPABILITIES, 0x3abdbd14, 0xd44a, 0x4a3f, 0x9a, 0x63, 0xa0, 0xa4, 0x2a, 0x51, 0xb1, 0x31);
+DEFINE_GUID(GUID_PM_GET_PROTOCOL_OFFLOAD, 0xa6435cd9, 0x149f, 0x498e, 0x95, 0x1b, 0x2d, 0x94, 0xbe, 0xa3, 0xe3, 0xa3);
+DEFINE_GUID(GUID_PM_HARDWARE_CAPABILITIES, 0xece5360d, 0x3291, 0x4a6e, 0x80, 0x44, 0x00, 0x51, 0x1f, 0xed, 0x27, 0xee);
+DEFINE_GUID(GUID_PM_PARAMETERS, 0x560245d2, 0xe251, 0x409c, 0xa2, 0x80, 0x31, 0x19, 0x35, 0xbe, 0x3b, 0x28);
+DEFINE_GUID(GUID_PM_PROTOCOL_OFFLOAD_LIST, 0x736ec5ab, 0xca8f, 0x4043, 0xbb, 0x58, 0xda, 0x40, 0x2a, 0x48, 0xd9, 0xcc);
+DEFINE_GUID(GUID_PM_REMOVE_PROTOCOL_OFFLOAD, 0xdecd7be2, 0xa6b0, 0x43ca, 0xae, 0x45, 0xd0, 0x00, 0xd2, 0x0e, 0x52, 0x65);
+DEFINE_GUID(GUID_PM_REMOVE_WOL_PATTERN, 0xa037a915, 0xc6ca, 0x4322, 0xb3, 0xe3, 0xef, 0x75, 0x4e, 0xc4, 0x98, 0xdc);
+DEFINE_GUID(GUID_PM_WOL_PATTERN_LIST, 0x4022be37, 0x7ee2, 0x47be, 0xa5, 0xa5, 0x05, 0x0f, 0xc7, 0x9a, 0xfc, 0x75);
+DEFINE_GUID(GUID_RECEIVE_FILTER_CURRENT_CAPABILITIES, 0x4054e80f, 0x2bc1, 0x4ccc, 0xb0, 0x33, 0x4a, 0xbc, 0x0c, 0x4a, 0x1e, 0x8c);
+DEFINE_GUID(GUID_STATUS_MEDIA_SPECIFIC_INDICATION_EX, 0xaaacfca7, 0x954a, 0x4632, 0xa1, 0x6e, 0xa8, 0xa6, 0x37, 0x93, 0xa9, 0xe5);
+DEFINE_GUID(UNSPECIFIED_NETWORK_GUID, 0x12ba5bde, 0x143e, 0x4c0d, 0xb6, 0x6d, 0x23, 0x79, 0xbb, 0x14, 0x19, 0x13);
#ifdef __cplusplus
}
#endif
-
-#endif /* __NDISGUID_H */
diff --git a/include/ddk/ndiswan.h b/include/ddk/ndiswan.h
index df411e21993..924c49f0386 100644
--- a/include/ddk/ndiswan.h
+++ b/include/ddk/ndiswan.h
@@ -20,18 +20,15 @@
*
*/
-#ifndef __NDISWAN_H
-#define __NDISWAN_H
-
-#include "ndis.h"
+#pragma once
#ifdef __cplusplus
extern "C" {
#endif
-#define NDIS_USE_WAN_WRAPPER 0x00000001
+#define NDIS_USE_WAN_WRAPPER 0x00000001
-#define NDIS_STATUS_TAPI_INDICATION ((NDIS_STATUS)0x40010080L)
+#define NDIS_STATUS_TAPI_INDICATION ((NDIS_STATUS)0x40010080L)
/* NDIS_WAN_INFO.FramingBits constants */
#define RAS_FRAMING 0x00000001
@@ -71,177 +68,287 @@ extern "C" {
#define TAPI_PROVIDER 0x80000000
+#define BRIDGING_FLAG_LANFCS 0x00000001
+#define BRIDGING_FLAG_LANID 0x00000002
+#define BRIDGING_FLAG_PADDING 0x00000004
+
+#define BRIDGING_TINYGRAM 0x00000001
+#define BRIDGING_LANID 0x00000002
+#define BRIDGING_NO_SPANNING_TREE 0x00000004
+#define BRIDGING_8021D_SPANNING_TREE 0x00000008
+#define BRIDGING_8021G_SPANNING_TREE 0x00000010
+#define BRIDGING_SOURCE_ROUTING 0x00000020
+#define BRIDGING_DEC_LANBRIDGE 0x00000040
+
+#define BRIDGING_TYPE_RESERVED 0x00000001
+#define BRIDGING_TYPE_8023_CANON 0x00000002
+#define BRIDGING_TYPE_8024_NO_CANON 0x00000004
+#define BRIDGING_TYPE_8025_NO_CANON 0x00000008
+#define BRIDGING_TYPE_FDDI_NO_CANON 0x00000010
+#define BRIDGING_TYPE_8024_CANON 0x00000400
+#define BRIDGING_TYPE_8025_CANON 0x00000800
+#define BRIDGING_TYPE_FDDI_CANON 0x00001000
+
+/* NDIS_WAN_COMPRESS_INFO.MSCompType constants */
+#define NDISWAN_COMPRESSION 0x00000001
+#define NDISWAN_ENCRYPTION 0x00000010
+#define NDISWAN_40_ENCRYPTION 0x00000020
+#define NDISWAN_128_ENCRYPTION 0x00000040
+#define NDISWAN_56_ENCRYPTION 0x00000080
+#define NDISWAN_HISTORY_LESS 0x01000000
+
+/* NDIS_WAN_COMPRESS_INFO.CompType constants */
+#define COMPTYPE_OUI 0
+#define COMPTYPE_NT31RAS 254
+#define COMPTYPE_NONE 255
+
+#define WAN_ERROR_CRC ((ULONG)0x00000001)
+#define WAN_ERROR_FRAMING ((ULONG)0x00000002)
+#define WAN_ERROR_HARDWAREOVERRUN ((ULONG)0x00000004)
+#define WAN_ERROR_BUFFEROVERRUN ((ULONG)0x00000008)
+#define WAN_ERROR_TIMEOUT ((ULONG)0x00000010)
+#define WAN_ERROR_ALIGNMENT ((ULONG)0x00000020)
+
+#define NdisMWanInitializeWrapper(NdisWrapperHandle, \
+ SystemSpecific1, \
+ SystemSpecific2, \
+ SystemSpecific3) \
+{ \
+ NdisMInitializeWrapper(NdisWrapperHandle, \
+ SystemSpecific1, \
+ SystemSpecific2, \
+ SystemSpecific3); \
+}
+
typedef struct _NDIS_WAN_INFO {
- OUT ULONG MaxFrameSize;
- OUT ULONG MaxTransmit;
- OUT ULONG HeaderPadding;
- OUT ULONG TailPadding;
- OUT ULONG Endpoints;
- OUT UINT MemoryFlags;
- OUT NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
- OUT ULONG FramingBits;
- OUT ULONG DesiredACCM;
+ OUT ULONG MaxFrameSize;
+ OUT ULONG MaxTransmit;
+ OUT ULONG HeaderPadding;
+ OUT ULONG TailPadding;
+ OUT ULONG Endpoints;
+ OUT UINT MemoryFlags;
+ OUT NDIS_PHYSICAL_ADDRESS HighestAcceptableAddress;
+ OUT ULONG FramingBits;
+ OUT ULONG DesiredACCM;
} NDIS_WAN_INFO, *PNDIS_WAN_INFO;
typedef struct _NDIS_WAN_GET_LINK_INFO {
- IN NDIS_HANDLE NdisLinkHandle;
- OUT ULONG MaxSendFrameSize;
- OUT ULONG MaxRecvFrameSize;
- OUT ULONG HeaderPadding;
- OUT ULONG TailPadding;
- OUT ULONG SendFramingBits;
- OUT ULONG RecvFramingBits;
- OUT ULONG SendCompressionBits;
- OUT ULONG RecvCompressionBits;
- OUT ULONG SendACCM;
- OUT ULONG RecvACCM;
+ IN NDIS_HANDLE NdisLinkHandle;
+ IN ULONG MaxSendFrameSize;
+ OUT ULONG MaxRecvFrameSize;
+ OUT ULONG HeaderPadding;
+ OUT ULONG TailPadding;
+ OUT ULONG SendFramingBits;
+ OUT ULONG RecvFramingBits;
+ OUT ULONG SendCompressionBits;
+ OUT ULONG RecvCompressionBits;
+ OUT ULONG SendACCM;
+ OUT ULONG RecvACCM;
} NDIS_WAN_GET_LINK_INFO, *PNDIS_WAN_GET_LINK_INFO;
typedef struct _NDIS_WAN_SET_LINK_INFO {
- IN NDIS_HANDLE NdisLinkHandle;
- IN ULONG MaxSendFrameSize;
- IN ULONG MaxRecvFrameSize;
- IN ULONG HeaderPadding;
- IN ULONG TailPadding;
- IN ULONG SendFramingBits;
- IN ULONG RecvFramingBits;
- IN ULONG SendCompressionBits;
- IN ULONG RecvCompressionBits;
- IN ULONG SendACCM;
- IN ULONG RecvACCM;
+ IN NDIS_HANDLE NdisLinkHandle;
+ IN ULONG MaxSendFrameSize;
+ IN ULONG MaxRecvFrameSize;
+ IN ULONG HeaderPadding;
+ IN ULONG TailPadding;
+ IN ULONG SendFramingBits;
+ IN ULONG RecvFramingBits;
+ IN ULONG SendCompressionBits;
+ IN ULONG RecvCompressionBits;
+ IN ULONG SendACCM;
+ IN ULONG RecvACCM;
} NDIS_WAN_SET_LINK_INFO, *PNDIS_WAN_SET_LINK_INFO;
-/* NDIS_WAN_COMPRESS_INFO.MSCompType constants */
-#define NDISWAN_COMPRESSION 0x00000001
-#define NDISWAN_ENCRYPTION 0x00000010
-#define NDISWAN_40_ENCRYPTION 0x00000020
-#define NDISWAN_128_ENCRYPTION 0x00000040
-#define NDISWAN_56_ENCRYPTION 0x00000080
-#define NDISWAN_HISTORY_LESS 0x01000000
+typedef struct _NDIS_WAN_GET_BRIDGE_INFO {
+ IN NDIS_HANDLE NdisLinkHandle;
+ OUT USHORT LanSegmentNumber;
+ OUT UCHAR BridgeNumber;
+ OUT UCHAR BridgingOptions;
+ OUT ULONG BridgingCapabilities;
+ OUT UCHAR BridgingType;
+ OUT UCHAR MacBytes[6];
+} NDIS_WAN_GET_BRIDGE_INFO, *PNDIS_WAN_GET_BRIDGE_INFO;
-/* NDIS_WAN_COMPRESS_INFO.CompType constants */
-#define COMPTYPE_OUI 0
-#define COMPTYPE_NT31RAS 254
-#define COMPTYPE_NONE 255
+typedef struct _NDIS_WAN_SET_BRIDGE_INFO {
+ IN NDIS_HANDLE NdisLinkHandle;
+ IN USHORT LanSegmentNumber;
+ IN UCHAR BridgeNumber;
+ IN UCHAR BridgingOptions;
+ IN ULONG BridgingCapabilities;
+ IN UCHAR BridgingType;
+ IN UCHAR MacBytes[6];
+} NDIS_WAN_SET_BRIDGE_INFO, *PNDIS_WAN_SET_BRIDGE_INFO;
typedef struct _NDIS_WAN_COMPRESS_INFO {
- UCHAR SessionKey[8];
- ULONG MSCompType;
- UCHAR CompType;
- USHORT CompLength;
- _ANONYMOUS_UNION union {
- struct {
- UCHAR CompOUI[3];
- UCHAR CompSubType;
- UCHAR CompValues[32];
- } Proprietary;
- struct {
- UCHAR CompValues[32];
- } Public;
- } DUMMYUNIONNAME;
-} NDIS_WAN_COMPRESS_INFO;
-
-typedef NDIS_WAN_COMPRESS_INFO *PNDIS_WAN_COMPRESS_INFO;
+ UCHAR SessionKey[8];
+ ULONG MSCompType;
+ UCHAR CompType;
+ USHORT CompLength;
+ _ANONYMOUS_UNION union {
+ struct {
+ UCHAR CompOUI[3];
+ UCHAR CompSubType;
+ UCHAR CompValues[32];
+ } Proprietary;
+ struct {
+ UCHAR CompValues[32];
+ } Public;
+ } DUMMYUNIONNAME;
+} NDIS_WAN_COMPRESS_INFO, *PNDIS_WAN_COMPRESS_INFO;
typedef struct _NDIS_WAN_GET_COMP_INFO {
- IN NDIS_HANDLE NdisLinkHandle;
- OUT NDIS_WAN_COMPRESS_INFO SendCapabilities;
- OUT NDIS_WAN_COMPRESS_INFO RecvCapabilities;
+ IN NDIS_HANDLE NdisLinkHandle;
+ OUT NDIS_WAN_COMPRESS_INFO SendCapabilities;
+ OUT NDIS_WAN_COMPRESS_INFO RecvCapabilities;
} NDIS_WAN_GET_COMP_INFO, *PNDIS_WAN_GET_COMP_INFO;
typedef struct _NDIS_WAN_SET_COMP_INFO {
- IN NDIS_HANDLE NdisLinkHandle;
- IN NDIS_WAN_COMPRESS_INFO SendCapabilities;
- IN NDIS_WAN_COMPRESS_INFO RecvCapabilities;
+ IN NDIS_HANDLE NdisLinkHandle;
+ IN NDIS_WAN_COMPRESS_INFO SendCapabilities;
+ IN NDIS_WAN_COMPRESS_INFO RecvCapabilities;
} NDIS_WAN_SET_COMP_INFO, *PNDIS_WAN_SET_COMP_INFO;
typedef struct _NDIS_WAN_GET_STATS_INFO {
- IN NDIS_HANDLE NdisLinkHandle;
- OUT ULONG BytesSent;
- OUT ULONG BytesRcvd;
- OUT ULONG FramesSent;
- OUT ULONG FramesRcvd;
- OUT ULONG CRCErrors;
- OUT ULONG TimeoutErrors;
- OUT ULONG AlignmentErrors;
- OUT ULONG SerialOverrunErrors;
- OUT ULONG FramingErrors;
- OUT ULONG BufferOverrunErrors;
- OUT ULONG BytesTransmittedUncompressed;
- OUT ULONG BytesReceivedUncompressed;
- OUT ULONG BytesTransmittedCompressed;
- OUT ULONG BytesReceivedCompressed;
+ IN NDIS_HANDLE NdisLinkHandle;
+ OUT ULONG BytesSent;
+ OUT ULONG BytesRcvd;
+ OUT ULONG FramesSent;
+ OUT ULONG FramesRcvd;
+ OUT ULONG CRCErrors;
+ OUT ULONG TimeoutErrors;
+ OUT ULONG AlignmentErrors;
+ OUT ULONG SerialOverrunErrors;
+ OUT ULONG FramingErrors;
+ OUT ULONG BufferOverrunErrors;
+ OUT ULONG BytesTransmittedUncompressed;
+ OUT ULONG BytesReceivedUncompressed;
+ OUT ULONG BytesTransmittedCompressed;
+ OUT ULONG BytesReceivedCompressed;
+ OUT ULONG TunnelPacketsRecieved;
+ OUT ULONG TunnelRecievePacketsPending;
+ OUT ULONG TunnelPacketsIndicatedUp;
+ OUT ULONG TunnelRecievePacketsRejected;
+ OUT ULONG TunnelPacketsSent;
+ OUT ULONG TunnelPacketsSentComplete;
+ OUT ULONG TunnelTransmitPacketsPending;
+ OUT ULONG TunnelPacketsTransmitError;
+ OUT ULONG TunnelPacketsSentError;
+ OUT ULONG TunnelTransmitPacketsRejected;
+ OUT ULONG TunnelAcksSent;
+ OUT ULONG TunnelAcksSentComplete;
+ OUT ULONG TunnelGeneric1;
+ OUT ULONG TunnelGeneric2;
+ OUT ULONG TunnelGeneric3;
} NDIS_WAN_GET_STATS_INFO, *PNDIS_WAN_GET_STATS_INFO;
-#define NdisMWanInitializeWrapper(NdisWrapperHandle, \
- SystemSpecific1, \
- SystemSpecific2, \
- SystemSpecific3) \
-{ \
- NdisMInitializeWrapper(NdisWrapperHandle, \
- SystemSpecific1, \
- SystemSpecific2, \
- SystemSpecific3); \
-}
+typedef struct _NDIS_MAC_LINE_UP {
+ IN ULONG LinkSpeed;
+ IN NDIS_WAN_QUALITY Quality;
+ IN USHORT SendWindow;
+ IN NDIS_HANDLE ConnectionWrapperID;
+ IN NDIS_HANDLE NdisLinkHandle;
+ OUT NDIS_HANDLE NdisLinkContext;
+} NDIS_MAC_LINE_UP, *PNDIS_MAC_LINE_UP;
+
+typedef struct _NDIS_MAC_LINE_DOWN {
+ IN NDIS_HANDLE NdisLinkContext;
+} NDIS_MAC_LINE_DOWN, *PNDIS_MAC_LINE_DOWN;
+
+typedef struct _NDIS_MAC_FRAGMENT {
+ IN NDIS_HANDLE NdisLinkContext;
+ IN ULONG Errors;
+} NDIS_MAC_FRAGMENT, *PNDIS_MAC_FRAGMENT;
typedef struct _NDIS_WAN_CO_INFO {
- OUT ULONG MaxFrameSize;
- OUT ULONG MaxSendWindow;
- OUT ULONG FramingBits;
- OUT ULONG DesiredACCM;
+ OUT ULONG MaxFrameSize;
+ OUT ULONG MaxSendWindow;
+ OUT ULONG FramingBits;
+ OUT ULONG DesiredACCM;
} NDIS_WAN_CO_INFO, *PNDIS_WAN_CO_INFO;
typedef struct _NDIS_WAN_CO_GET_LINK_INFO {
- OUT ULONG MaxSendFrameSize;
- OUT ULONG MaxRecvFrameSize;
- OUT ULONG SendFramingBits;
- OUT ULONG RecvFramingBits;
- OUT ULONG SendCompressionBits;
- OUT ULONG RecvCompressionBits;
- OUT ULONG SendACCM;
- OUT ULONG RecvACCM;
+ OUT ULONG MaxSendFrameSize;
+ OUT ULONG MaxRecvFrameSize;
+ OUT ULONG SendFramingBits;
+ OUT ULONG RecvFramingBits;
+ OUT ULONG SendCompressionBits;
+ OUT ULONG RecvCompressionBits;
+ OUT ULONG SendACCM;
+ OUT ULONG RecvACCM;
} NDIS_WAN_CO_GET_LINK_INFO, *PNDIS_WAN_CO_GET_LINK_INFO;
typedef struct _NDIS_WAN_CO_SET_LINK_INFO {
- IN ULONG MaxSendFrameSize;
- IN ULONG MaxRecvFrameSize;
- IN ULONG SendFramingBits;
- IN ULONG RecvFramingBits;
- IN ULONG SendCompressionBits;
- IN ULONG RecvCompressionBits;
- IN ULONG SendACCM;
- IN ULONG RecvACCM;
+ IN ULONG MaxSendFrameSize;
+ IN ULONG MaxRecvFrameSize;
+ IN ULONG SendFramingBits;
+ IN ULONG RecvFramingBits;
+ IN ULONG SendCompressionBits;
+ IN ULONG RecvCompressionBits;
+ IN ULONG SendACCM;
+ IN ULONG RecvACCM;
} NDIS_WAN_CO_SET_LINK_INFO, *PNDIS_WAN_CO_SET_LINK_INFO;
typedef struct _NDIS_WAN_CO_GET_COMP_INFO {
- OUT NDIS_WAN_COMPRESS_INFO SendCapabilities;
- OUT NDIS_WAN_COMPRESS_INFO RecvCapabilities;
+ OUT NDIS_WAN_COMPRESS_INFO SendCapabilities;
+ OUT NDIS_WAN_COMPRESS_INFO RecvCapabilities;
} NDIS_WAN_CO_GET_COMP_INFO, *PNDIS_WAN_CO_GET_COMP_INFO;
typedef struct _NDIS_WAN_CO_SET_COMP_INFO {
- IN NDIS_WAN_COMPRESS_INFO SendCapabilities;
- IN NDIS_WAN_COMPRESS_INFO RecvCapabilities;
+ IN NDIS_WAN_COMPRESS_INFO SendCapabilities;
+ IN NDIS_WAN_COMPRESS_INFO RecvCapabilities;
} NDIS_WAN_CO_SET_COMP_INFO, *PNDIS_WAN_CO_SET_COMP_INFO;
typedef struct _NDIS_WAN_CO_GET_STATS_INFO {
- OUT ULONG BytesSent;
- OUT ULONG BytesRcvd;
- OUT ULONG FramesSent;
- OUT ULONG FramesRcvd;
- OUT ULONG CRCErrors;
- OUT ULONG TimeoutErrors;
- OUT ULONG AlignmentErrors;
- OUT ULONG SerialOverrunErrors;
- OUT ULONG FramingErrors;
- OUT ULONG BufferOverrunErrors;
- OUT ULONG BytesTransmittedUncompressed;
- OUT ULONG BytesReceivedUncompressed;
- OUT ULONG BytesTransmittedCompressed;
- OUT ULONG BytesReceivedCompressed;
+ OUT ULONG BytesSent;
+ OUT ULONG BytesRcvd;
+ OUT ULONG FramesSent;
+ OUT ULONG FramesRcvd;
+ OUT ULONG CRCErrors;
+ OUT ULONG TimeoutErrors;
+ OUT ULONG AlignmentErrors;
+ OUT ULONG SerialOverrunErrors;
+ OUT ULONG FramingErrors;
+ OUT ULONG BufferOverrunErrors;
+ OUT ULONG BytesTransmittedUncompressed;
+ OUT ULONG BytesReceivedUncompressed;
+ OUT ULONG BytesTransmittedCompressed;
+ OUT ULONG BytesReceivedCompressed;
+ OUT ULONG TunnelPacketsRecieved;
+ OUT ULONG TunnelRecievePacketsPending;
+ OUT ULONG TunnelPacketsIndicatedUp;
+ OUT ULONG TunnelRecievePacketsRejected;
+ OUT ULONG TunnelPacketsSent;
+ OUT ULONG TunnelPacketsSentComplete;
+ OUT ULONG TunnelTransmitPacketsPending;
+ OUT ULONG TunnelPacketsTransmitError;
+ OUT ULONG TunnelPacketsSentError;
+ OUT ULONG TunnelTransmitPacketsRejected;
+ OUT ULONG TunnelAcksSent;
+ OUT ULONG TunnelAcksSentComplete;
+ OUT ULONG TunnelGeneric1;
+ OUT ULONG TunnelGeneric2;
+ OUT ULONG TunnelGeneric3;
} NDIS_WAN_CO_GET_STATS_INFO, *PNDIS_WAN_CO_GET_STATS_INFO;
+typedef struct _NDIS_WAN_CO_FRAGMENT {
+ IN ULONG Errors;
+} NDIS_WAN_CO_FRAGMENT, *PNDIS_WAN_CO_FRAGMENT;
+
+typedef struct _WAN_CO_LINKPARAMS {
+ ULONG TransmitSpeed;
+ ULONG ReceiveSpeed;
+ ULONG SendWindow;
+} WAN_CO_LINKPARAMS, *PWAN_CO_LINKPARAMS;
+
+typedef struct _WAN_CO_MTULINKPARAMS {
+ ULONG Version;
+ ULONG TransmitSpeed;
+ ULONG ReceiveSpeed;
+ ULONG SendWindow;
+ ULONG MTU;
+} WAN_CO_MTULINKPARAMS, *PWAN_CO_MTULINKPARAMS;
+
#ifdef __cplusplus
}
#endif
-
-#endif /* __NDISWAN_H */
diff --git a/include/ddk/netpnp.h b/include/ddk/netpnp.h
index 539cf497972..a7fb0ef483d 100644
--- a/include/ddk/netpnp.h
+++ b/include/ddk/netpnp.h
@@ -1,46 +1,46 @@
-#ifndef __NET_PNP__
+#pragma once
+
#define __NET_PNP__
-typedef enum _NET_DEVICE_POWER_STATE
-{
- NetDeviceStateUnspecified = 0,
- NetDeviceStateD0,
- NetDeviceStateD1,
- NetDeviceStateD2,
- NetDeviceStateD3,
- NetDeviceStateMaximum
+typedef enum _NET_DEVICE_POWER_STATE {
+ NetDeviceStateUnspecified = 0,
+ NetDeviceStateD0,
+ NetDeviceStateD1,
+ NetDeviceStateD2,
+ NetDeviceStateD3,
+ NetDeviceStateMaximum
} NET_DEVICE_POWER_STATE, *PNET_DEVICE_POWER_STATE;
-typedef enum _NET_PNP_EVENT_CODE
-{
- NetEventSetPower,
- NetEventQueryPower,
- NetEventQueryRemoveDevice,
- NetEventCancelRemoveDevice,
- NetEventReconfigure,
- NetEventBindList,
- NetEventBindsComplete,
- NetEventPnPCapabilities,
- NetEventMaximum
+typedef enum _NET_PNP_EVENT_CODE {
+ NetEventSetPower,
+ NetEventQueryPower,
+ NetEventQueryRemoveDevice,
+ NetEventCancelRemoveDevice,
+ NetEventReconfigure,
+ NetEventBindList,
+ NetEventBindsComplete,
+ NetEventPnPCapabilities,
+ NetEventPause,
+ NetEventRestart,
+ NetEventPortActivation,
+ NetEventPortDeactivation,
+ NetEventIMReEnableDevice,
+ NetEventMaximum
} NET_PNP_EVENT_CODE, *PNET_PNP_EVENT_CODE;
-typedef struct _NET_PNP_EVENT
-{
- NET_PNP_EVENT_CODE NetEvent;
- PVOID Buffer;
- ULONG BufferLength;
- ULONG_PTR NdisReserved[4];
- ULONG_PTR TransportReserved[4];
- ULONG_PTR TdiReserved[4];
- ULONG_PTR TdiClientReserved[4];
+typedef struct _NET_PNP_EVENT {
+ NET_PNP_EVENT_CODE NetEvent;
+ PVOID Buffer;
+ ULONG BufferLength;
+ ULONG_PTR NdisReserved[4];
+ ULONG_PTR TransportReserved[4];
+ ULONG_PTR TdiReserved[4];
+ ULONG_PTR TdiClientReserved[4];
} NET_PNP_EVENT, *PNET_PNP_EVENT;
-typedef enum _NDIS_DEVICE_PNP_EVENT
-{
- NdisDevicePnPEventSurpriseRemoved,
- NdisDevicePnPEventPowerProfileChanged,
- NdisDevicePnPEventMaximum
+/* FIXME : This belongs to ndis.h */
+typedef enum _NDIS_DEVICE_PNP_EVENT {
+ NdisDevicePnPEventSurpriseRemoved,
+ NdisDevicePnPEventPowerProfileChanged,
+ NdisDevicePnPEventMaximum
} NDIS_DEVICE_PNP_EVENT, *PNDIS_DEVICE_PNP_EVENT;
-
-#endif
-
diff --git a/include/ddk/newdev.h b/include/ddk/newdev.h
deleted file mode 100644
index 1c633ae582d..00000000000
--- a/include/ddk/newdev.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * newdev.h
- *
- * Driver installation DLL interface
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- * Created by Casper S. Hornstrup
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef __NEWDEV_H
-#define __NEWDEV_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* UpdateDriverForPlugAndPlayDevices.InstallFlags constants */
-#define INSTALLFLAG_FORCE 0x00000001
-#define INSTALLFLAG_READONLY 0x00000002
-#define INSTALLFLAG_NONINTERACTIVE 0x00000004
-#define INSTALLFLAG_BITS 0x00000007
-
-BOOL WINAPI
-UpdateDriverForPlugAndPlayDevicesA(
- HWND hwndParent,
- LPCSTR HardwareId,
- LPCSTR FullInfPath,
- DWORD InstallFlags,
- PBOOL bRebootRequired OPTIONAL);
-
-BOOL WINAPI
-UpdateDriverForPlugAndPlayDevicesW(
- HWND hwndParent,
- LPCWSTR HardwareId,
- LPCWSTR FullInfPath,
- DWORD InstallFlags,
- PBOOL bRebootRequired OPTIONAL);
-
-#ifdef UNICODE
-#define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesW
-#else
-#define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesA
-#endif /* UNICODE */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __NEWDEV_H */
diff --git a/include/ddk/ntagp.h b/include/ddk/ntagp.h
index 6622d81c90b..0cc5b8c32d5 100644
--- a/include/ddk/ntagp.h
+++ b/include/ddk/ntagp.h
@@ -20,86 +20,189 @@
*
*/
-#ifndef __NTAGP_H
-#define __NTAGP_H
-
-#include "video.h"
+#pragma once
#ifdef __cplusplus
extern "C" {
#endif
-#define AGP_BUS_INTERFACE_V1 1L
-#define AGP_BUS_INTERFACE_V2 2L
+DEFINE_GUID(GUID_AGP_BUS_INTERFACE_STANDARD, 0x2ef74803, 0xd8d3, 0x11d1, 0x9c, 0xaa, 0x00, 0xc0, 0xf0, 0x16, 0x56, 0x36);
+
+#define AGP_BUS_INTERFACE_V1 1
+#define AGP_BUS_INTERFACE_V2 2
+#define AGP_BUS_INTERFACE_V3 3
+#define AGP_BUS_INTERFACE_V4 4
+#define AGP_BUS_INTERFACE_V5 5
/* Indicates wether the GART supports mapping of physical memory for the CPU */
-#define AGP_CAPABILITIES_MAP_PHYSICAL 0x00000001L
+#define AGP_CAPABILITIES_MAP_PHYSICAL 0x00000001
+#define AGP_CAPABILITIES_CACHE_COHERENT 0x00000002
+#define AGP_CAPABILITIES_REQUIRES_GPU_FLUSH 0x00000004
-typedef NTSTATUS
-(NTAPI *PAGP_BUS_COMMIT_MEMORY)(
- IN PVOID AgpContext,
- IN PVOID MapHandle,
- IN ULONG NumberOfPages,
- IN ULONG OffsetInPages,
- IN OUT PMDL Mdl OPTIONAL,
- OUT PHYSICAL_ADDRESS *MemoryBase);
+#define AGP_SET_RATE_DISABLE_SBA 0x00010000
+#define AGP_SET_RATE_DISABLE_FW 0x00020000
-typedef NTSTATUS
-(NTAPI *PAGP_BUS_FREE_MEMORY)(
- IN PVOID AgpContext,
- IN PVOID MapHandle,
- IN ULONG NumberOfPages,
- IN ULONG OffsetInPages);
+#define AGP_GUARD_PAGE_CHECK_FIRST_ULONG 0x00000001
+#define AGP_GUARD_PAGE_CHECK_USE_SAME_OFFSET 0x00000002
+#define AGP_GUARD_PAGE_CHECK_DO_NOT_BUGCHECK 0x00000004
-typedef NTSTATUS
-(NTAPI *PAGP_BUS_RELEASE_MEMORY)(
- IN PVOID AgpContext,
- IN PVOID MapHandle);
-
-typedef NTSTATUS
-(NTAPI *PAGP_BUS_RESERVE_MEMORY)(
- IN PVOID AgpContext,
- IN ULONG NumberOfPages,
- IN MEMORY_CACHING_TYPE MemoryType,
- OUT PVOID *MapHandle,
- OUT PHYSICAL_ADDRESS *PhysicalAddress OPTIONAL);
+#define AGP_BUS_INTERFACE_V1_SIZE (FIELD_OFFSET(AGP_BUS_INTERFACE_STANDARD,SetRate))
+#define AGP_BUS_INTERFACE_V2_SIZE (FIELD_OFFSET(AGP_BUS_INTERFACE_STANDARD, AgpSize))
+#define AGP_BUS_INTERFACE_V3_SIZE (FIELD_OFFSET(AGP_BUS_INTERFACE_STANDARD, FlushChipsetCaches))
+#define AGP_BUS_INTERFACE_V4_SIZE (FIELD_OFFSET(AGP_BUS_INTERFACE_STANDARD, MapMemoryEx))
typedef NTSTATUS
(NTAPI *PAGP_BUS_SET_RATE)(
- IN PVOID AgpContext,
- IN ULONG AgpRate);
+ IN PVOID AgpContext,
+ IN ULONG AgpRate);
+
+typedef NTSTATUS
+(NTAPI *PAGP_BUS_RESERVE_MEMORY)(
+ IN PVOID AgpContext,
+ IN ULONG NumberOfPages,
+ IN MEMORY_CACHING_TYPE MemoryType,
+ OUT PVOID *MapHandle,
+ OUT PHYSICAL_ADDRESS *PhysicalAddress OPTIONAL);
+
+typedef NTSTATUS
+(NTAPI *PAGP_BUS_RELEASE_MEMORY)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle);
+
+typedef NTSTATUS
+(NTAPI *PAGP_BUS_COMMIT_MEMORY)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages,
+ IN OUT PMDL Mdl OPTIONAL,
+ OUT PHYSICAL_ADDRESS *MemoryBase);
+
+typedef NTSTATUS
+(NTAPI *PAGP_BUS_FREE_MEMORY)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages);
typedef NTSTATUS
(NTAPI *PAGP_GET_MAPPED_PAGES)(
- IN PVOID AgpContext,
- IN PVOID MapHandle,
- IN ULONG NumberOfPages,
- IN ULONG OffsetInPages,
- OUT PMDL Mdl);
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages,
+ OUT PMDL Mdl);
+
+typedef NTSTATUS
+(NTAPI *PAGP_MAP_MEMORY)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages,
+ IN PMDL Mdl,
+ OUT PHYSICAL_ADDRESS *MemoryBase);
+
+typedef NTSTATUS
+(NTAPI *PAGP_UNMAP_MEMORY)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages,
+ IN PMDL Mdl);
+
+typedef NTSTATUS
+(NTAPI *PAGP_FLUSH_CHIPSET_CACHES)(
+ IN PVOID AgpContext);
+
+typedef NTSTATUS
+(NTAPI *PAGP_CHECK_INTEGRITY)(
+ IN PVOID AgpContext);
+
+typedef NTSTATUS
+(NTAPI *PAGP_MAP_MEMORY_EX)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages,
+ IN PMDL Mdl,
+ IN MEMORY_CACHING_TYPE *CacheTypeOverride OPTIONAL,
+ OUT PHYSICAL_ADDRESS *MemoryBase);
+
+typedef NTSTATUS
+(NTAPI *PAGP_UNMAP_MEMORY_EX)(
+ IN PVOID AgpContext,
+ IN PVOID MapHandle,
+ IN ULONG NumberOfPages,
+ IN ULONG OffsetInPages,
+ IN PMDL Mdl);
+
+typedef NTSTATUS
+(NTAPI *PAGP_FLUSH_GART_TLB)(
+ IN PVOID AgpContext);
+
+typedef NTSTATUS
+(NTAPI *PAGP_CHECK_GUARD_PAGE)(
+ IN PVOID AgpContext,
+ IN ULONG Flags,
+ IN ULONG ULongsToCheck);
+
+typedef struct _AGP_INFO_COMMON {
+ PCI_AGP_CAPABILITY MasterCap;
+ PCI_AGP_CAPABILITY TargetCap;
+ USHORT DeviceId;
+ USHORT VendorId;
+ USHORT SubVendorId;
+ USHORT SubSystemId;
+ UCHAR HwRevisionId;
+ ULONG VerifierFlags;
+ BOOLEAN GuardPageCorruption;
+} AGP_INFO_COMMON, *PAGP_INFO_COMMON;
+
+typedef struct _AGP_INFO_DRIVER {
+ ULONG AGPReg1;
+ ULONG AGPReg2;
+ PHYSICAL_ADDRESS ApertureStart;
+ PHYSICAL_ADDRESS GartTranslationTable;
+ ULONG ApertureLength;
+} AGP_INFO_DRIVER, *PAGP_INFO_DRIVER;
+
+typedef struct _AGP_INFO {
+ AGP_INFO_COMMON CommonInfo;
+ AGP_INFO_DRIVER DriverInfo;
+} AGP_INFO, *PAGP_INFO;
+
+typedef VOID
+(NTAPI *PAGP_GET_INFO)(
+ IN PVOID AgpContext,
+ OUT PAGP_INFO AgpInfo);
typedef struct _AGP_BUS_INTERFACE_STANDARD {
- USHORT Size;
- USHORT Version;
- PVOID AgpContext;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
-
- ULONG Capabilities;
- PAGP_BUS_RESERVE_MEMORY ReserveMemory;
- PAGP_BUS_RELEASE_MEMORY ReleaseMemory;
- PAGP_BUS_COMMIT_MEMORY CommitMemory;
- PAGP_BUS_FREE_MEMORY FreeMemory;
- PAGP_GET_MAPPED_PAGES GetMappedPages;
- PAGP_BUS_SET_RATE SetRate;
+ USHORT Size;
+ USHORT Version;
+ PVOID AgpContext;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ ULONG Capabilities;
+ PAGP_BUS_RESERVE_MEMORY ReserveMemory;
+ PAGP_BUS_RELEASE_MEMORY ReleaseMemory;
+ PAGP_BUS_COMMIT_MEMORY CommitMemory;
+ PAGP_BUS_FREE_MEMORY FreeMemory;
+ PAGP_GET_MAPPED_PAGES GetMappedPages;
+ PAGP_BUS_SET_RATE SetRate;
+ SIZE_T AgpSize;
+ PHYSICAL_ADDRESS AgpBase;
+ PHYSICAL_ADDRESS MaxPhysicalAddress;
+ PAGP_MAP_MEMORY MapMemory;
+ PAGP_UNMAP_MEMORY UnMapMemory;
+ PAGP_FLUSH_CHIPSET_CACHES FlushChipsetCaches;
+ PAGP_CHECK_INTEGRITY CheckIntegrity;
+ PAGP_MAP_MEMORY_EX MapMemoryEx;
+ PAGP_UNMAP_MEMORY_EX UnMapMemoryEx;
+ PAGP_FLUSH_GART_TLB FlushGartTLB;
+ PAGP_CHECK_GUARD_PAGE CheckGuardPage;
+ PAGP_GET_INFO GetAgpInfo;
} AGP_BUS_INTERFACE_STANDARD, *PAGP_BUS_INTERFACE_STANDARD;
-#define AGP_BUS_INTERFACE_V2_SIZE sizeof(AGP_BUS_INTERFACE_STANDARD)
-#define AGP_BUS_INTERFACE_V1_SIZE \
- (AGP_BUS_INTERFACE_V2_SIZE - sizeof(PAGP_BUS_SET_RATE))
-
#ifdef __cplusplus
}
#endif
-
-#endif /* __NTAGP_H */
-
diff --git a/include/ddk/ntddk.h b/include/ddk/ntddk.h
index 55569692a96..42abb01b941 100644
--- a/include/ddk/ntddk.h
+++ b/include/ddk/ntddk.h
@@ -1,12 +1,13 @@
/*
* ntddk.h
*
- * Windows Device Driver Kit
+ * Windows NT Device Driver Kit
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS DDK package.
*
* Contributors:
- * Created by Casper S. Hornstrup
+ * Amine Khaldi
+ * Timo Kreuzer (timo.kreuzer@reactos.org)
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
@@ -18,13 +19,10 @@
* DISCLAIMED. This includes but is not limited to warranties of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
- * DEFINES:
- * DBG - Debugging enabled/disabled (0/1)
- * POOL_TAGGING - Enable pool tagging
- * _X86_ - X86 environment
*/
-#ifndef _NTDDK_
+#pragma once
+
#define _NTDDK_
#if !defined(_NTHAL_) && !defined(_NTIFS_)
@@ -41,11 +39,9 @@
#include
#include
#include
-
-/* FIXME
+#include
#include
#include
-*/
#include // FIXME
#include // FIXME
@@ -55,21 +51,30 @@
extern "C" {
#endif
+/* GUID and UUID */
+#ifndef _NTLSA_IFS_
+#ifndef _NTLSA_AUDIT_
+#define _NTLSA_AUDIT_
+
+#ifndef GUID_DEFINED
+#include
+#endif
+
+#endif /* _NTLSA_AUDIT_ */
+#endif /* _NTLSA_IFS_ */
+
+typedef GUID UUID;
+
struct _LOADER_PARAMETER_BLOCK;
struct _CREATE_DISK;
struct _DRIVE_LAYOUT_INFORMATION_EX;
struct _SET_PARTITION_INFORMATION_EX;
-//
-// GUID and UUID
-//
-#ifndef GUID_DEFINED
-#include
-#endif
-typedef GUID UUID;
-
typedef struct _BUS_HANDLER *PBUS_HANDLER;
-
+typedef struct _DEVICE_HANDLER_OBJECT *PDEVICE_HANDLER_OBJECT;
+#if defined(_NTHAL_INCLUDED_)
+typedef struct _KAFFINITY_EX *PKAFFINITY_EX;
+#endif
typedef struct _PEB *PPEB;
#ifndef _NTIMAGE_
@@ -85,24 +90,87 @@ typedef PIMAGE_NT_HEADERS32 PIMAGE_NT_HEADERS;
#endif /* _NTIMAGE_ */
-#define EXCEPTION_READ_FAULT 0
-#define EXCEPTION_WRITE_FAULT 1
-#define EXCEPTION_EXECUTE_FAULT 8
+/******************************************************************************
+ * Executive Types *
+ ******************************************************************************/
+typedef struct _ZONE_SEGMENT_HEADER {
+ SINGLE_LIST_ENTRY SegmentList;
+ PVOID Reserved;
+} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-extern NTSYSAPI volatile CCHAR KeNumberProcessors;
-#elif (NTDDI_VERSION >= NTDDI_WINXP)
-extern NTSYSAPI CCHAR KeNumberProcessors;
-#else
-extern PCCHAR KeNumberProcessors;
-#endif
+typedef struct _ZONE_HEADER {
+ SINGLE_LIST_ENTRY FreeList;
+ SINGLE_LIST_ENTRY SegmentList;
+ ULONG BlockSize;
+ ULONG TotalSegmentSize;
+} ZONE_HEADER, *PZONE_HEADER;
-#define MAX_WOW64_SHARED_ENTRIES 16
+#define PROTECTED_POOL 0x80000000
-#define NX_SUPPORT_POLICY_ALWAYSOFF 0
-#define NX_SUPPORT_POLICY_ALWAYSON 1
-#define NX_SUPPORT_POLICY_OPTIN 2
-#define NX_SUPPORT_POLICY_OPTOUT 3
+/******************************************************************************
+ * I/O Manager Types *
+ ******************************************************************************/
+
+/* DEVICE_OBJECT.Flags */
+#define DO_DEVICE_HAS_NAME 0x00000040
+#define DO_SYSTEM_BOOT_PARTITION 0x00000100
+#define DO_LONG_TERM_REQUESTS 0x00000200
+#define DO_NEVER_LAST_DEVICE 0x00000400
+#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
+#define DO_SUPPORTS_TRANSACTIONS 0x00040000
+#define DO_FORCE_NEITHER_IO 0x00080000
+#define DO_VOLUME_DEVICE_OBJECT 0x00100000
+#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
+#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
+#define DO_DISALLOW_EXECUTE 0x00800000
+
+#ifndef _ARC_DDK_
+#define _ARC_DDK_
+typedef enum _CONFIGURATION_TYPE {
+ ArcSystem,
+ CentralProcessor,
+ FloatingPointProcessor,
+ PrimaryIcache,
+ PrimaryDcache,
+ SecondaryIcache,
+ SecondaryDcache,
+ SecondaryCache,
+ EisaAdapter,
+ TcAdapter,
+ ScsiAdapter,
+ DtiAdapter,
+ MultiFunctionAdapter,
+ DiskController,
+ TapeController,
+ CdromController,
+ WormController,
+ SerialController,
+ NetworkController,
+ DisplayController,
+ ParallelController,
+ PointerController,
+ KeyboardController,
+ AudioController,
+ OtherController,
+ DiskPeripheral,
+ FloppyDiskPeripheral,
+ TapePeripheral,
+ ModemPeripheral,
+ MonitorPeripheral,
+ PrinterPeripheral,
+ PointerPeripheral,
+ KeyboardPeripheral,
+ TerminalPeripheral,
+ OtherPeripheral,
+ LinePeripheral,
+ NetworkPeripheral,
+ SystemMemory,
+ DockingInformation,
+ RealModeIrqRoutingTable,
+ RealModePCIEnumeration,
+ MaximumType
+} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
+#endif /* !_ARC_DDK_ */
/*
** IRP function codes
@@ -137,102 +205,117 @@ extern PCCHAR KeNumberProcessors;
#define IRP_MN_QUERY_LEGACY_BUS_INFORMATION 0x18
-typedef struct _IO_COUNTERS {
- ULONGLONG ReadOperationCount;
- ULONGLONG WriteOperationCount;
- ULONGLONG OtherOperationCount;
- ULONGLONG ReadTransferCount;
- ULONGLONG WriteTransferCount;
- ULONGLONG OtherTransferCount;
-} IO_COUNTERS, *PIO_COUNTERS;
+#define IO_CHECK_CREATE_PARAMETERS 0x0200
+#define IO_ATTACH_DEVICE 0x0400
+#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
-typedef struct _VM_COUNTERS {
- SIZE_T PeakVirtualSize;
- SIZE_T VirtualSize;
- ULONG PageFaultCount;
- SIZE_T PeakWorkingSetSize;
- SIZE_T WorkingSetSize;
- SIZE_T QuotaPeakPagedPoolUsage;
- SIZE_T QuotaPagedPoolUsage;
- SIZE_T QuotaPeakNonPagedPoolUsage;
- SIZE_T QuotaNonPagedPoolUsage;
- SIZE_T PagefileUsage;
- SIZE_T PeakPagefileUsage;
-} VM_COUNTERS, *PVM_COUNTERS;
+typedef NTSTATUS
+(NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
+ IN PVOID Context,
+ IN PUNICODE_STRING PathName,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG BusNumber,
+ IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
+ IN CONFIGURATION_TYPE ControllerType,
+ IN ULONG ControllerNumber,
+ IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
+ IN CONFIGURATION_TYPE PeripheralType,
+ IN ULONG PeripheralNumber,
+ IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
-typedef struct _VM_COUNTERS_EX
-{
- SIZE_T PeakVirtualSize;
- SIZE_T VirtualSize;
- ULONG PageFaultCount;
- SIZE_T PeakWorkingSetSize;
- SIZE_T WorkingSetSize;
- SIZE_T QuotaPeakPagedPoolUsage;
- SIZE_T QuotaPagedPoolUsage;
- SIZE_T QuotaPeakNonPagedPoolUsage;
- SIZE_T QuotaNonPagedPoolUsage;
- SIZE_T PagefileUsage;
- SIZE_T PeakPagefileUsage;
- SIZE_T PrivateUsage;
-} VM_COUNTERS_EX, *PVM_COUNTERS_EX;
+typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
+ IoQueryDeviceIdentifier = 0,
+ IoQueryDeviceConfigurationData,
+ IoQueryDeviceComponentInformation,
+ IoQueryDeviceMaxData
+} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
-typedef struct _POOLED_USAGE_AND_LIMITS
-{
- SIZE_T PeakPagedPoolUsage;
- SIZE_T PagedPoolUsage;
- SIZE_T PagedPoolLimit;
- SIZE_T PeakNonPagedPoolUsage;
- SIZE_T NonPagedPoolUsage;
- SIZE_T NonPagedPoolLimit;
- SIZE_T PeakPagefileUsage;
- SIZE_T PagefileUsage;
- SIZE_T PagefileLimit;
-} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
+typedef VOID
+(NTAPI *PDRIVER_REINITIALIZE)(
+ IN struct _DRIVER_OBJECT *DriverObject,
+ IN PVOID Context OPTIONAL,
+ IN ULONG Count);
-/* DEVICE_OBJECT.Flags */
-
-#define DO_VERIFY_VOLUME 0x00000002
-#define DO_BUFFERED_IO 0x00000004
-#define DO_EXCLUSIVE 0x00000008
-#define DO_DIRECT_IO 0x00000010
-#define DO_MAP_IO_BUFFER 0x00000020
-#define DO_DEVICE_HAS_NAME 0x00000040
-#define DO_DEVICE_INITIALIZING 0x00000080
-#define DO_SYSTEM_BOOT_PARTITION 0x00000100
-#define DO_LONG_TERM_REQUESTS 0x00000200
-#define DO_NEVER_LAST_DEVICE 0x00000400
-#define DO_SHUTDOWN_REGISTERED 0x00000800
-#define DO_BUS_ENUMERATED_DEVICE 0x00001000
-#define DO_POWER_PAGABLE 0x00002000
-#define DO_POWER_INRUSH 0x00004000
-#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
-#define DO_SUPPORTS_TRANSACTIONS 0x00040000
-#define DO_FORCE_NEITHER_IO 0x00080000
-#define DO_VOLUME_DEVICE_OBJECT 0x00100000
-#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
-#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
-#define DO_DISALLOW_EXECUTE 0x00800000
+typedef struct _CONTROLLER_OBJECT {
+ CSHORT Type;
+ CSHORT Size;
+ PVOID ControllerExtension;
+ KDEVICE_QUEUE DeviceWaitQueue;
+ ULONG Spare1;
+ LARGE_INTEGER Spare2;
+} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
#define DRVO_REINIT_REGISTERED 0x00000008
#define DRVO_INITIALIZED 0x00000010
#define DRVO_BOOTREINIT_REGISTERED 0x00000020
#define DRVO_LEGACY_RESOURCES 0x00000040
-typedef enum _ARBITER_REQUEST_SOURCE {
- ArbiterRequestUndefined = -1,
- ArbiterRequestLegacyReported,
- ArbiterRequestHalReported,
- ArbiterRequestLegacyAssigned,
- ArbiterRequestPnpDetected,
- ArbiterRequestPnpEnumerated
-} ARBITER_REQUEST_SOURCE;
+typedef struct _CONFIGURATION_INFORMATION {
+ ULONG DiskCount;
+ ULONG FloppyCount;
+ ULONG CdRomCount;
+ ULONG TapeCount;
+ ULONG ScsiPortCount;
+ ULONG SerialCount;
+ ULONG ParallelCount;
+ BOOLEAN AtDiskPrimaryAddressClaimed;
+ BOOLEAN AtDiskSecondaryAddressClaimed;
+ ULONG Version;
+ ULONG MediumChangerCount;
+} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
-typedef enum _ARBITER_RESULT {
- ArbiterResultUndefined = -1,
- ArbiterResultSuccess,
- ArbiterResultExternalConflict,
- ArbiterResultNullRequest
-} ARBITER_RESULT;
+typedef struct _DISK_SIGNATURE {
+ ULONG PartitionStyle;
+ _ANONYMOUS_UNION union {
+ struct {
+ ULONG Signature;
+ ULONG CheckSum;
+ } Mbr;
+ struct {
+ GUID DiskId;
+ } Gpt;
+ } DUMMYUNIONNAME;
+} DISK_SIGNATURE, *PDISK_SIGNATURE;
+
+typedef struct _TXN_PARAMETER_BLOCK {
+ USHORT Length;
+ USHORT TxFsContext;
+ PVOID TransactionObject;
+} TXN_PARAMETER_BLOCK, *PTXN_PARAMETER_BLOCK;
+
+#define TXF_MINIVERSION_DEFAULT_VIEW (0xFFFE)
+
+typedef struct _IO_DRIVER_CREATE_CONTEXT {
+ CSHORT Size;
+ struct _ECP_LIST *ExtraCreateParameter;
+ PVOID DeviceObjectHint;
+ PTXN_PARAMETER_BLOCK TxnParameters;
+} IO_DRIVER_CREATE_CONTEXT, *PIO_DRIVER_CREATE_CONTEXT;
+
+typedef struct _AGP_TARGET_BUS_INTERFACE_STANDARD {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PGET_SET_DEVICE_DATA SetBusData;
+ PGET_SET_DEVICE_DATA GetBusData;
+ UCHAR CapabilityID;
+} AGP_TARGET_BUS_INTERFACE_STANDARD, *PAGP_TARGET_BUS_INTERFACE_STANDARD;
+
+typedef NTSTATUS
+(NTAPI *PGET_LOCATION_STRING)(
+ IN OUT PVOID Context OPTIONAL,
+ OUT PWCHAR *LocationStrings);
+
+typedef struct _PNP_LOCATION_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PGET_LOCATION_STRING GetLocationString;
+} PNP_LOCATION_INTERFACE, *PPNP_LOCATION_INTERFACE;
typedef enum _ARBITER_ACTION {
ArbiterActionTestAllocation,
@@ -253,39 +336,69 @@ typedef struct _ARBITER_CONFLICT_INFO {
ULONGLONG End;
} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
+typedef struct _ARBITER_TEST_ALLOCATION_PARAMETERS {
+ IN OUT PLIST_ENTRY ArbitrationList;
+ IN ULONG AllocateFromCount;
+ IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
+} ARBITER_TEST_ALLOCATION_PARAMETERS, *PARBITER_TEST_ALLOCATION_PARAMETERS;
+
+typedef struct _ARBITER_RETEST_ALLOCATION_PARAMETERS {
+ IN OUT PLIST_ENTRY ArbitrationList;
+ IN ULONG AllocateFromCount;
+ IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
+} ARBITER_RETEST_ALLOCATION_PARAMETERS, *PARBITER_RETEST_ALLOCATION_PARAMETERS;
+
+typedef struct _ARBITER_BOOT_ALLOCATION_PARAMETERS {
+ IN OUT PLIST_ENTRY ArbitrationList;
+} ARBITER_BOOT_ALLOCATION_PARAMETERS, *PARBITER_BOOT_ALLOCATION_PARAMETERS;
+
+typedef struct _ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS {
+ OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
+} ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS, *PARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS;
+
+typedef struct _ARBITER_QUERY_CONFLICT_PARAMETERS {
+ IN PDEVICE_OBJECT PhysicalDeviceObject;
+ IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
+ OUT PULONG ConflictCount;
+ OUT PARBITER_CONFLICT_INFO *Conflicts;
+} ARBITER_QUERY_CONFLICT_PARAMETERS, *PARBITER_QUERY_CONFLICT_PARAMETERS;
+
+typedef struct _ARBITER_QUERY_ARBITRATE_PARAMETERS {
+ IN PLIST_ENTRY ArbitrationList;
+} ARBITER_QUERY_ARBITRATE_PARAMETERS, *PARBITER_QUERY_ARBITRATE_PARAMETERS;
+
+typedef struct _ARBITER_ADD_RESERVED_PARAMETERS {
+ IN PDEVICE_OBJECT ReserveDevice;
+} ARBITER_ADD_RESERVED_PARAMETERS, *PARBITER_ADD_RESERVED_PARAMETERS;
+
typedef struct _ARBITER_PARAMETERS {
union {
- struct {
- IN OUT PLIST_ENTRY ArbitrationList;
- IN ULONG AllocateFromCount;
- IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
- } TestAllocation;
- struct {
- IN OUT PLIST_ENTRY ArbitrationList;
- IN ULONG AllocateFromCount;
- IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
- } RetestAllocation;
- struct {
- IN OUT PLIST_ENTRY ArbitrationList;
- } BootAllocation;
- struct {
- OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
- } QueryAllocatedResources;
- struct {
- IN PDEVICE_OBJECT PhysicalDeviceObject;
- IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
- OUT PULONG ConflictCount;
- OUT PARBITER_CONFLICT_INFO *Conflicts;
- } QueryConflict;
- struct {
- IN PLIST_ENTRY ArbitrationList;
- } QueryArbitrate;
- struct {
- IN PDEVICE_OBJECT ReserveDevice;
- } AddReserved;
+ ARBITER_TEST_ALLOCATION_PARAMETERS TestAllocation;
+ ARBITER_RETEST_ALLOCATION_PARAMETERS RetestAllocation;
+ ARBITER_BOOT_ALLOCATION_PARAMETERS BootAllocation;
+ ARBITER_QUERY_ALLOCATED_RESOURCES_PARAMETERS QueryAllocatedResources;
+ ARBITER_QUERY_CONFLICT_PARAMETERS QueryConflict;
+ ARBITER_QUERY_ARBITRATE_PARAMETERS QueryArbitrate;
+ ARBITER_ADD_RESERVED_PARAMETERS AddReserved;
} Parameters;
} ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
+typedef enum _ARBITER_REQUEST_SOURCE {
+ ArbiterRequestUndefined = -1,
+ ArbiterRequestLegacyReported,
+ ArbiterRequestHalReported,
+ ArbiterRequestLegacyAssigned,
+ ArbiterRequestPnpDetected,
+ ArbiterRequestPnpEnumerated
+} ARBITER_REQUEST_SOURCE;
+
+typedef enum _ARBITER_RESULT {
+ ArbiterResultUndefined = -1,
+ ArbiterResultSuccess,
+ ArbiterResultExternalConflict,
+ ArbiterResultNullRequest
+} ARBITER_RESULT;
+
#define ARBITER_FLAG_BOOT_CONFIG 0x00000001
typedef struct _ARBITER_LIST_ENTRY {
@@ -322,6 +435,936 @@ typedef struct _ARBITER_INTERFACE {
ULONG Flags;
} ARBITER_INTERFACE, *PARBITER_INTERFACE;
+typedef enum _RESOURCE_TRANSLATION_DIRECTION {
+ TranslateChildToParent,
+ TranslateParentToChild
+} RESOURCE_TRANSLATION_DIRECTION;
+
+typedef NTSTATUS
+(NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
+ IN OUT PVOID Context OPTIONAL,
+ IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
+ IN RESOURCE_TRANSLATION_DIRECTION Direction,
+ IN ULONG AlternativesCount OPTIONAL,
+ IN IO_RESOURCE_DESCRIPTOR Alternatives[],
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
+
+typedef NTSTATUS
+(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
+ IN OUT PVOID Context OPTIONAL,
+ IN PIO_RESOURCE_DESCRIPTOR Source,
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ OUT PULONG TargetCount,
+ OUT PIO_RESOURCE_DESCRIPTOR *Target);
+
+typedef struct _TRANSLATOR_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PTRANSLATE_RESOURCE_HANDLER TranslateResources;
+ PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
+} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
+
+typedef struct _PCI_AGP_CAPABILITY {
+ PCI_CAPABILITIES_HEADER Header;
+ USHORT Minor:4;
+ USHORT Major:4;
+ USHORT Rsvd1:8;
+ struct _PCI_AGP_STATUS {
+ ULONG Rate:3;
+ ULONG Agp3Mode:1;
+ ULONG FastWrite:1;
+ ULONG FourGB:1;
+ ULONG HostTransDisable:1;
+ ULONG Gart64:1;
+ ULONG ITA_Coherent:1;
+ ULONG SideBandAddressing:1;
+ ULONG CalibrationCycle:3;
+ ULONG AsyncRequestSize:3;
+ ULONG Rsvd1:1;
+ ULONG Isoch:1;
+ ULONG Rsvd2:6;
+ ULONG RequestQueueDepthMaximum:8;
+ } AGPStatus;
+ struct _PCI_AGP_COMMAND {
+ ULONG Rate:3;
+ ULONG Rsvd1:1;
+ ULONG FastWriteEnable:1;
+ ULONG FourGBEnable:1;
+ ULONG Rsvd2:1;
+ ULONG Gart64:1;
+ ULONG AGPEnable:1;
+ ULONG SBAEnable:1;
+ ULONG CalibrationCycle:3;
+ ULONG AsyncReqSize:3;
+ ULONG Rsvd3:8;
+ ULONG RequestQueueDepth:8;
+ } AGPCommand;
+} PCI_AGP_CAPABILITY, *PPCI_AGP_CAPABILITY;
+
+typedef enum _EXTENDED_AGP_REGISTER {
+ IsochStatus,
+ AgpControl,
+ ApertureSize,
+ AperturePageSize,
+ GartLow,
+ GartHigh,
+ IsochCommand
+} EXTENDED_AGP_REGISTER, *PEXTENDED_AGP_REGISTER;
+
+typedef struct _PCI_AGP_ISOCH_STATUS {
+ ULONG ErrorCode:2;
+ ULONG Rsvd1:1;
+ ULONG Isoch_L:3;
+ ULONG Isoch_Y:2;
+ ULONG Isoch_N:8;
+ ULONG Rsvd2:16;
+} PCI_AGP_ISOCH_STATUS, *PPCI_AGP_ISOCH_STATUS;
+
+typedef struct _PCI_AGP_CONTROL {
+ ULONG Rsvd1:7;
+ ULONG GTLB_Enable:1;
+ ULONG AP_Enable:1;
+ ULONG CAL_Disable:1;
+ ULONG Rsvd2:22;
+} PCI_AGP_CONTROL, *PPCI_AGP_CONTROL;
+
+typedef struct _PCI_AGP_APERTURE_PAGE_SIZE {
+ USHORT PageSizeMask:11;
+ USHORT Rsvd1:1;
+ USHORT PageSizeSelect:4;
+} PCI_AGP_APERTURE_PAGE_SIZE, *PPCI_AGP_APERTURE_PAGE_SIZE;
+
+typedef struct _PCI_AGP_ISOCH_COMMAND {
+ USHORT Rsvd1:6;
+ USHORT Isoch_Y:2;
+ USHORT Isoch_N:8;
+} PCI_AGP_ISOCH_COMMAND, *PPCI_AGP_ISOCH_COMMAND;
+
+typedef struct PCI_AGP_EXTENDED_CAPABILITY {
+ PCI_AGP_ISOCH_STATUS IsochStatus;
+ PCI_AGP_CONTROL AgpControl;
+ USHORT ApertureSize;
+ PCI_AGP_APERTURE_PAGE_SIZE AperturePageSize;
+ ULONG GartLow;
+ ULONG GartHigh;
+ PCI_AGP_ISOCH_COMMAND IsochCommand;
+} PCI_AGP_EXTENDED_CAPABILITY, *PPCI_AGP_EXTENDED_CAPABILITY;
+
+#define PCI_AGP_RATE_1X 0x1
+#define PCI_AGP_RATE_2X 0x2
+#define PCI_AGP_RATE_4X 0x4
+
+#define PCIX_MODE_CONVENTIONAL_PCI 0x0
+#define PCIX_MODE1_66MHZ 0x1
+#define PCIX_MODE1_100MHZ 0x2
+#define PCIX_MODE1_133MHZ 0x3
+#define PCIX_MODE2_266_66MHZ 0x9
+#define PCIX_MODE2_266_100MHZ 0xA
+#define PCIX_MODE2_266_133MHZ 0xB
+#define PCIX_MODE2_533_66MHZ 0xD
+#define PCIX_MODE2_533_100MHZ 0xE
+#define PCIX_MODE2_533_133MHZ 0xF
+
+#define PCIX_VERSION_MODE1_ONLY 0x0
+#define PCIX_VERSION_MODE2_ECC 0x1
+#define PCIX_VERSION_DUAL_MODE_ECC 0x2
+
+typedef struct _PCIX_BRIDGE_CAPABILITY {
+ PCI_CAPABILITIES_HEADER Header;
+ union {
+ _ANONYMOUS_STRUCT struct {
+ USHORT Bus64Bit:1;
+ USHORT Bus133MHzCapable:1;
+ USHORT SplitCompletionDiscarded:1;
+ USHORT UnexpectedSplitCompletion:1;
+ USHORT SplitCompletionOverrun:1;
+ USHORT SplitRequestDelayed:1;
+ USHORT BusModeFrequency:4;
+ USHORT Rsvd:2;
+ USHORT Version:2;
+ USHORT Bus266MHzCapable:1;
+ USHORT Bus533MHzCapable:1;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+ } SecondaryStatus;
+ union {
+ _ANONYMOUS_STRUCT struct {
+ ULONG FunctionNumber:3;
+ ULONG DeviceNumber:5;
+ ULONG BusNumber:8;
+ ULONG Device64Bit:1;
+ ULONG Device133MHzCapable:1;
+ ULONG SplitCompletionDiscarded:1;
+ ULONG UnexpectedSplitCompletion:1;
+ ULONG SplitCompletionOverrun:1;
+ ULONG SplitRequestDelayed:1;
+ ULONG Rsvd:7;
+ ULONG DIMCapable:1;
+ ULONG Device266MHzCapable:1;
+ ULONG Device533MHzCapable:1;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+ } BridgeStatus;
+ USHORT UpstreamSplitTransactionCapacity;
+ USHORT UpstreamSplitTransactionLimit;
+ USHORT DownstreamSplitTransactionCapacity;
+ USHORT DownstreamSplitTransactionLimit;
+ union {
+ _ANONYMOUS_STRUCT struct {
+ ULONG SelectSecondaryRegisters:1;
+ ULONG ErrorPresentInOtherBank:1;
+ ULONG AdditionalCorrectableError:1;
+ ULONG AdditionalUncorrectableError:1;
+ ULONG ErrorPhase:3;
+ ULONG ErrorCorrected:1;
+ ULONG Syndrome:8;
+ ULONG ErrorFirstCommand:4;
+ ULONG ErrorSecondCommand:4;
+ ULONG ErrorUpperAttributes:4;
+ ULONG ControlUpdateEnable:1;
+ ULONG Rsvd:1;
+ ULONG DisableSingleBitCorrection:1;
+ ULONG EccMode:1;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+ } EccControlStatus;
+ ULONG EccFirstAddress;
+ ULONG EccSecondAddress;
+ ULONG EccAttribute;
+} PCIX_BRIDGE_CAPABILITY, *PPCIX_BRIDGE_CAPABILITY;
+
+typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
+ PCI_CAPABILITIES_HEADER Header;
+ USHORT Reserved;
+ USHORT SubVendorID;
+ USHORT SubSystemID;
+} PCI_SUBSYSTEM_IDS_CAPABILITY, *PPCI_SUBSYSTEM_IDS_CAPABILITY;
+
+#define OSC_FIRMWARE_FAILURE 0x02
+#define OSC_UNRECOGNIZED_UUID 0x04
+#define OSC_UNRECOGNIZED_REVISION 0x08
+#define OSC_CAPABILITIES_MASKED 0x10
+
+#define PCI_ROOT_BUS_OSC_METHOD_CAPABILITY_REVISION 0x01
+
+typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
+ union {
+ _ANONYMOUS_STRUCT struct {
+ ULONG ExtendedConfigOpRegions:1;
+ ULONG ActiveStatePowerManagement:1;
+ ULONG ClockPowerManagement:1;
+ ULONG SegmentGroups:1;
+ ULONG MessageSignaledInterrupts:1;
+ ULONG WindowsHardwareErrorArchitecture:1;
+ ULONG Reserved:26;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+ } u;
+} PCI_ROOT_BUS_OSC_SUPPORT_FIELD, *PPCI_ROOT_BUS_OSC_SUPPORT_FIELD;
+
+typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
+ union {
+ _ANONYMOUS_STRUCT struct {
+ ULONG ExpressNativeHotPlug:1;
+ ULONG ShpcNativeHotPlug:1;
+ ULONG ExpressNativePME:1;
+ ULONG ExpressAdvancedErrorReporting:1;
+ ULONG ExpressCapabilityStructure:1;
+ ULONG Reserved:27;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+ } u;
+} PCI_ROOT_BUS_OSC_CONTROL_FIELD, *PPCI_ROOT_BUS_OSC_CONTROL_FIELD;
+
+typedef enum _PCI_HARDWARE_INTERFACE {
+ PciConventional,
+ PciXMode1,
+ PciXMode2,
+ PciExpress
+} PCI_HARDWARE_INTERFACE, *PPCI_HARDWARE_INTERFACE;
+
+typedef enum {
+ BusWidth32Bits,
+ BusWidth64Bits
+} PCI_BUS_WIDTH;
+
+typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
+ PCI_HARDWARE_INTERFACE SecondaryInterface;
+ _ANONYMOUS_STRUCT struct {
+ BOOLEAN BusCapabilitiesFound;
+ ULONG CurrentSpeedAndMode;
+ ULONG SupportedSpeedsAndModes;
+ BOOLEAN DeviceIDMessagingCapable;
+ PCI_BUS_WIDTH SecondaryBusWidth;
+ } DUMMYSTRUCTNAME;
+ PCI_ROOT_BUS_OSC_SUPPORT_FIELD OscFeatureSupport;
+ PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlRequest;
+ PCI_ROOT_BUS_OSC_CONTROL_FIELD OscControlGranted;
+} PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
+
+typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT CapabilityVersion:4;
+ USHORT DeviceType:4;
+ USHORT SlotImplemented:1;
+ USHORT InterruptMessageNumber:5;
+ USHORT Rsvd:2;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
+
+typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ ULONG MaxPayloadSizeSupported:3;
+ ULONG PhantomFunctionsSupported:2;
+ ULONG ExtendedTagSupported:1;
+ ULONG L0sAcceptableLatency:3;
+ ULONG L1AcceptableLatency:3;
+ ULONG Undefined:3;
+ ULONG RoleBasedErrorReporting:1;
+ ULONG Rsvd1:2;
+ ULONG CapturedSlotPowerLimit:8;
+ ULONG CapturedSlotPowerLimitScale:2;
+ ULONG Rsvd2:4;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+} PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER, *PPCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER;
+
+#define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
+
+typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT CorrectableErrorEnable:1;
+ USHORT NonFatalErrorEnable:1;
+ USHORT FatalErrorEnable:1;
+ USHORT UnsupportedRequestErrorEnable:1;
+ USHORT EnableRelaxedOrder:1;
+ USHORT MaxPayloadSize:3;
+ USHORT ExtendedTagEnable:1;
+ USHORT PhantomFunctionsEnable:1;
+ USHORT AuxPowerEnable:1;
+ USHORT NoSnoopEnable:1;
+ USHORT MaxReadRequestSize:3;
+ USHORT BridgeConfigRetryEnable:1;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_DEVICE_CONTROL_REGISTER, *PPCI_EXPRESS_DEVICE_CONTROL_REGISTER;
+
+#define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
+
+typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT CorrectableErrorDetected:1;
+ USHORT NonFatalErrorDetected:1;
+ USHORT FatalErrorDetected:1;
+ USHORT UnsupportedRequestDetected:1;
+ USHORT AuxPowerDetected:1;
+ USHORT TransactionsPending:1;
+ USHORT Rsvd:10;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
+
+typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ ULONG MaximumLinkSpeed:4;
+ ULONG MaximumLinkWidth:6;
+ ULONG ActiveStatePMSupport:2;
+ ULONG L0sExitLatency:3;
+ ULONG L1ExitLatency:3;
+ ULONG ClockPowerManagement:1;
+ ULONG SurpriseDownErrorReportingCapable:1;
+ ULONG DataLinkLayerActiveReportingCapable:1;
+ ULONG Rsvd:3;
+ ULONG PortNumber:8;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+} PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
+
+typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT ActiveStatePMControl:2;
+ USHORT Rsvd1:1;
+ USHORT ReadCompletionBoundary:1;
+ USHORT LinkDisable:1;
+ USHORT RetrainLink:1;
+ USHORT CommonClockConfig:1;
+ USHORT ExtendedSynch:1;
+ USHORT EnableClockPowerManagement:1;
+ USHORT Rsvd2:7;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
+
+typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT LinkSpeed:4;
+ USHORT LinkWidth:6;
+ USHORT Undefined:1;
+ USHORT LinkTraining:1;
+ USHORT SlotClockConfig:1;
+ USHORT DataLinkLayerActive:1;
+ USHORT Rsvd:2;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
+
+typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ ULONG AttentionButtonPresent:1;
+ ULONG PowerControllerPresent:1;
+ ULONG MRLSensorPresent:1;
+ ULONG AttentionIndicatorPresent:1;
+ ULONG PowerIndicatorPresent:1;
+ ULONG HotPlugSurprise:1;
+ ULONG HotPlugCapable:1;
+ ULONG SlotPowerLimit:8;
+ ULONG SlotPowerLimitScale:2;
+ ULONG ElectromechanicalLockPresent:1;
+ ULONG NoCommandCompletedSupport:1;
+ ULONG PhysicalSlotNumber:13;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+} PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
+
+typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT AttentionButtonEnable:1;
+ USHORT PowerFaultDetectEnable:1;
+ USHORT MRLSensorEnable:1;
+ USHORT PresenceDetectEnable:1;
+ USHORT CommandCompletedEnable:1;
+ USHORT HotPlugInterruptEnable:1;
+ USHORT AttentionIndicatorControl:2;
+ USHORT PowerIndicatorControl:2;
+ USHORT PowerControllerControl:1;
+ USHORT ElectromechanicalLockControl:1;
+ USHORT DataLinkStateChangeEnable:1;
+ USHORT Rsvd:3;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
+
+typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT AttentionButtonPressed:1;
+ USHORT PowerFaultDetected:1;
+ USHORT MRLSensorChanged:1;
+ USHORT PresenceDetectChanged:1;
+ USHORT CommandCompleted:1;
+ USHORT MRLSensorState:1;
+ USHORT PresenceDetectState:1;
+ USHORT ElectromechanicalLockEngaged:1;
+ USHORT DataLinkStateChanged:1;
+ USHORT Rsvd:7;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
+
+typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT CorrectableSerrEnable:1;
+ USHORT NonFatalSerrEnable:1;
+ USHORT FatalSerrEnable:1;
+ USHORT PMEInterruptEnable:1;
+ USHORT CRSSoftwareVisibilityEnable:1;
+ USHORT Rsvd:11;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
+
+typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ USHORT CRSSoftwareVisibility:1;
+ USHORT Rsvd:15;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
+
+typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
+ _ANONYMOUS_STRUCT struct {
+ ULONG PMERequestorId:16;
+ ULONG PMEStatus:1;
+ ULONG PMEPending:1;
+ ULONG Rsvd:14;
+ } DUMMYSTRUCTNAME;
+ ULONG AsULONG;
+} PCI_EXPRESS_ROOT_STATUS_REGISTER, *PPCI_EXPRESS_ROOT_STATUS_REGISTER;
+
+typedef struct _PCI_EXPRESS_CAPABILITY {
+ PCI_CAPABILITIES_HEADER Header;
+ PCI_EXPRESS_CAPABILITIES_REGISTER ExpressCapabilities;
+ PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER DeviceCapabilities;
+ PCI_EXPRESS_DEVICE_CONTROL_REGISTER DeviceControl;
+ PCI_EXPRESS_DEVICE_STATUS_REGISTER DeviceStatus;
+ PCI_EXPRESS_LINK_CAPABILITIES_REGISTER LinkCapabilities;
+ PCI_EXPRESS_LINK_CONTROL_REGISTER LinkControl;
+ PCI_EXPRESS_LINK_STATUS_REGISTER LinkStatus;
+ PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER SlotCapabilities;
+ PCI_EXPRESS_SLOT_CONTROL_REGISTER SlotControl;
+ PCI_EXPRESS_SLOT_STATUS_REGISTER SlotStatus;
+ PCI_EXPRESS_ROOT_CONTROL_REGISTER RootControl;
+ PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER RootCapabilities;
+ PCI_EXPRESS_ROOT_STATUS_REGISTER RootStatus;
+} PCI_EXPRESS_CAPABILITY, *PPCI_EXPRESS_CAPABILITY;
+
+typedef enum {
+ MRLClosed = 0,
+ MRLOpen
+} PCI_EXPRESS_MRL_STATE;
+
+typedef enum {
+ SlotEmpty = 0,
+ CardPresent
+} PCI_EXPRESS_CARD_PRESENCE;
+
+typedef enum {
+ IndicatorOn = 1,
+ IndicatorBlink,
+ IndicatorOff
+} PCI_EXPRESS_INDICATOR_STATE;
+
+typedef enum {
+ PowerOn = 0,
+ PowerOff
+} PCI_EXPRESS_POWER_STATE;
+
+typedef enum {
+ L0sEntrySupport = 1,
+ L0sAndL1EntrySupport = 3
+} PCI_EXPRESS_ASPM_SUPPORT;
+
+typedef enum {
+ L0sAndL1EntryDisabled,
+ L0sEntryEnabled,
+ L1EntryEnabled,
+ L0sAndL1EntryEnabled
+} PCI_EXPRESS_ASPM_CONTROL;
+
+typedef enum {
+ L0s_Below64ns = 0,
+ L0s_64ns_128ns,
+ L0s_128ns_256ns,
+ L0s_256ns_512ns,
+ L0s_512ns_1us,
+ L0s_1us_2us,
+ L0s_2us_4us,
+ L0s_Above4us
+} PCI_EXPRESS_L0s_EXIT_LATENCY;
+
+typedef enum {
+ L1_Below1us = 0,
+ L1_1us_2us,
+ L1_2us_4us,
+ L1_4us_8us,
+ L1_8us_16us,
+ L1_16us_32us,
+ L1_32us_64us,
+ L1_Above64us
+} PCI_EXPRESS_L1_EXIT_LATENCY;
+
+typedef enum {
+ PciExpressEndpoint = 0,
+ PciExpressLegacyEndpoint,
+ PciExpressRootPort = 4,
+ PciExpressUpstreamSwitchPort,
+ PciExpressDownstreamSwitchPort,
+ PciExpressToPciXBridge,
+ PciXToExpressBridge,
+ PciExpressRootComplexIntegratedEndpoint,
+ PciExpressRootComplexEventCollector
+} PCI_EXPRESS_DEVICE_TYPE;
+
+typedef enum {
+ MaxPayload128Bytes = 0,
+ MaxPayload256Bytes,
+ MaxPayload512Bytes,
+ MaxPayload1024Bytes,
+ MaxPayload2048Bytes,
+ MaxPayload4096Bytes
+} PCI_EXPRESS_MAX_PAYLOAD_SIZE;
+
+typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
+ _ANONYMOUS_STRUCT struct {
+ USHORT FunctionNumber:3;
+ USHORT DeviceNumber:5;
+ USHORT BusNumber:8;
+ } DUMMYSTRUCTNAME;
+ USHORT AsUSHORT;
+} PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
+
+typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
+ ResourceTypeSingle = 0,
+ ResourceTypeRange,
+ ResourceTypeExtendedCounterConfiguration,
+ ResourceTypeOverflow,
+ ResourceTypeMax
+} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE;
+
+typedef struct _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR {
+ PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE Type;
+ ULONG Flags;
+ union {
+ ULONG CounterIndex;
+ ULONG ExtendedRegisterAddress;
+ struct {
+ ULONG Begin;
+ ULONG End;
+ } Range;
+ } u;
+} PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR, *PPHYSICAL_COUNTER_RESOURCE_DESCRIPTOR;
+
+typedef struct _PHYSICAL_COUNTER_RESOURCE_LIST {
+ ULONG Count;
+ PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR Descriptors[ANYSIZE_ARRAY];
+} PHYSICAL_COUNTER_RESOURCE_LIST, *PPHYSICAL_COUNTER_RESOURCE_LIST;
+
+typedef VOID
+(NTAPI *PciPin2Line)(
+ IN struct _BUS_HANDLER *BusHandler,
+ IN struct _BUS_HANDLER *RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciData);
+
+typedef VOID
+(NTAPI *PciLine2Pin)(
+ IN struct _BUS_HANDLER *BusHandler,
+ IN struct _BUS_HANDLER *RootHandler,
+ IN PCI_SLOT_NUMBER SlotNumber,
+ IN PPCI_COMMON_CONFIG PciNewData,
+ IN PPCI_COMMON_CONFIG PciOldData);
+
+typedef VOID
+(NTAPI *PciReadWriteConfig)(
+ IN struct _BUS_HANDLER *BusHandler,
+ IN PCI_SLOT_NUMBER Slot,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+
+#define PCI_DATA_TAG ' ICP'
+#define PCI_DATA_VERSION 1
+
+typedef struct _PCIBUSDATA {
+ ULONG Tag;
+ ULONG Version;
+ PciReadWriteConfig ReadConfig;
+ PciReadWriteConfig WriteConfig;
+ PciPin2Line Pin2Line;
+ PciLine2Pin Line2Pin;
+ PCI_SLOT_NUMBER ParentSlot;
+ PVOID Reserved[4];
+} PCIBUSDATA, *PPCIBUSDATA;
+
+#ifndef _PCIINTRF_X_
+#define _PCIINTRF_X_
+
+typedef ULONG
+(NTAPI *PCI_READ_WRITE_CONFIG)(
+ IN PVOID Context,
+ IN ULONG BusOffset,
+ IN ULONG Slot,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+
+typedef VOID
+(NTAPI *PCI_PIN_TO_LINE)(
+ IN PVOID Context,
+ IN PPCI_COMMON_CONFIG PciData);
+
+typedef VOID
+(NTAPI *PCI_LINE_TO_PIN)(
+ IN PVOID Context,
+ IN PPCI_COMMON_CONFIG PciNewData,
+ IN PPCI_COMMON_CONFIG PciOldData);
+
+typedef VOID
+(NTAPI *PCI_ROOT_BUS_CAPABILITY)(
+ IN PVOID Context,
+ OUT PPCI_ROOT_BUS_HARDWARE_CAPABILITY HardwareCapability);
+
+typedef VOID
+(NTAPI *PCI_EXPRESS_WAKE_CONTROL)(
+ IN PVOID Context,
+ IN BOOLEAN EnableWake);
+
+typedef struct _PCI_BUS_INTERFACE_STANDARD {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PCI_READ_WRITE_CONFIG ReadConfig;
+ PCI_READ_WRITE_CONFIG WriteConfig;
+ PCI_PIN_TO_LINE PinToLine;
+ PCI_LINE_TO_PIN LineToPin;
+ PCI_ROOT_BUS_CAPABILITY RootBusCapability;
+ PCI_EXPRESS_WAKE_CONTROL ExpressWakeControl;
+} PCI_BUS_INTERFACE_STANDARD, *PPCI_BUS_INTERFACE_STANDARD;
+
+#define PCI_BUS_INTERFACE_STANDARD_VERSION 1
+
+#endif /* _PCIINTRF_X_ */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000
+#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000
+#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
+ (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
+ FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
+
+#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
+#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
+#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_DEPRECATED 0x00000300
+
+#else
+
+#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL 0x00000200
+#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL 0x00000300
+#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK 0x00000300
+
+#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL
+#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL
+#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#define FILE_CHARACTERISTICS_PROPAGATED (FILE_REMOVABLE_MEDIA | \
+ FILE_READ_ONLY_DEVICE | \
+ FILE_FLOPPY_DISKETTE | \
+ FILE_WRITE_ONCE_MEDIA | \
+ FILE_DEVICE_SECURE_OPEN)
+
+typedef struct _FILE_ALIGNMENT_INFORMATION {
+ ULONG AlignmentRequirement;
+} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
+
+typedef struct _FILE_NAME_INFORMATION {
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
+
+
+typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
+ ULONG FileAttributes;
+ ULONG ReparseTag;
+} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
+
+typedef struct _FILE_DISPOSITION_INFORMATION {
+ BOOLEAN DeleteFile;
+} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
+
+typedef struct _FILE_END_OF_FILE_INFORMATION {
+ LARGE_INTEGER EndOfFile;
+} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
+
+typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
+ LARGE_INTEGER ValidDataLength;
+} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
+
+typedef struct _FILE_FS_LABEL_INFORMATION {
+ ULONG VolumeLabelLength;
+ WCHAR VolumeLabel[1];
+} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
+
+typedef struct _FILE_FS_VOLUME_INFORMATION {
+ LARGE_INTEGER VolumeCreationTime;
+ ULONG VolumeSerialNumber;
+ ULONG VolumeLabelLength;
+ BOOLEAN SupportsObjects;
+ WCHAR VolumeLabel[1];
+} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
+
+typedef struct _FILE_FS_SIZE_INFORMATION {
+ LARGE_INTEGER TotalAllocationUnits;
+ LARGE_INTEGER AvailableAllocationUnits;
+ ULONG SectorsPerAllocationUnit;
+ ULONG BytesPerSector;
+} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
+ LARGE_INTEGER TotalAllocationUnits;
+ LARGE_INTEGER CallerAvailableAllocationUnits;
+ LARGE_INTEGER ActualAvailableAllocationUnits;
+ ULONG SectorsPerAllocationUnit;
+ ULONG BytesPerSector;
+} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
+
+typedef struct _FILE_FS_OBJECTID_INFORMATION {
+ UCHAR ObjectId[16];
+ UCHAR ExtendedInfo[48];
+} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
+
+typedef union _FILE_SEGMENT_ELEMENT {
+ PVOID64 Buffer;
+ ULONGLONG Alignment;
+}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
+
+#define IOCTL_AVIO_ALLOCATE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 1, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define IOCTL_AVIO_FREE_STREAM CTL_CODE(FILE_DEVICE_AVIO, 2, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define IOCTL_AVIO_MODIFY_STREAM CTL_CODE(FILE_DEVICE_AVIO, 3, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+
+typedef enum _BUS_DATA_TYPE {
+ ConfigurationSpaceUndefined = -1,
+ Cmos,
+ EisaConfiguration,
+ Pos,
+ CbusConfiguration,
+ PCIConfiguration,
+ VMEConfiguration,
+ NuBusConfiguration,
+ PCMCIAConfiguration,
+ MPIConfiguration,
+ MPSAConfiguration,
+ PNPISAConfiguration,
+ SgiInternalConfiguration,
+ MaximumBusDataType
+} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+
+/* Some Server 2003 DDK definitions */
+#define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
+
+typedef NTSTATUS
+(NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
+ IN PVOID Context,
+ IN INTERFACE_TYPE LegacyBusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ OUT PDEVICE_OBJECT *PhysicalDeviceObject);
+
+typedef struct _ROUTING_TOKEN {
+ PVOID LinkNode;
+ ULONG StaticVector;
+ UCHAR Flags;
+} ROUTING_TOKEN, *PROUTING_TOKEN;
+
+typedef NTSTATUS
+(NTAPI *PGET_INTERRUPT_ROUTING)(
+ IN PDEVICE_OBJECT Pdo,
+ OUT ULONG *Bus,
+ OUT ULONG *PciSlot,
+ OUT UCHAR *InterruptLine,
+ OUT UCHAR *InterruptPin,
+ OUT UCHAR *ClassCode,
+ OUT UCHAR *SubClassCode,
+ OUT PDEVICE_OBJECT *ParentPdo,
+ OUT ROUTING_TOKEN *RoutingToken,
+ OUT UCHAR *Flags);
+
+typedef NTSTATUS
+(NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
+ IN PDEVICE_OBJECT Pdo,
+ IN PROUTING_TOKEN RoutingToken);
+
+typedef VOID
+(NTAPI *PUPDATE_INTERRUPT_LINE)(
+ IN PDEVICE_OBJECT Pdo,
+ IN UCHAR LineRegister);
+
+typedef struct _INT_ROUTE_INTERFACE_STANDARD {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PGET_INTERRUPT_ROUTING GetInterruptRouting;
+ PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
+ PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
+} INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
+
+typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
+} LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
+
+/* FIXME : These definitions don't exist in public headers */
+
+#define PCI_CB_INTRF_VERSION 1
+#define PCI_PME_INTRF_STANDARD_VER 1
+#define PNP_LOCATION_INTERFACE_VERSION 1
+
+DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
+DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
+
+typedef NTSTATUS
+(NTAPI *PCARDBUSADD)(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PVOID *DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCARDBUSDELETE)(
+ IN PVOID DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCARDBUSPCIDISPATCH)(
+ IN PVOID DeviceContext,
+ IN PIRP Irp);
+
+typedef VOID
+(NTAPI *PPME_SET_PME_ENABLE)(
+ IN PDEVICE_OBJECT Pdo,
+ IN BOOLEAN PmeEnable);
+
+typedef VOID
+(NTAPI *PPME_CLEAR_PME_STATUS)(
+ IN PDEVICE_OBJECT Pdo);
+
+typedef VOID
+(NTAPI *PPME_GET_INFORMATION)(
+ IN PDEVICE_OBJECT Pdo,
+ OUT PBOOLEAN PmeCapable,
+ OUT PBOOLEAN PmeStatus,
+ OUT PBOOLEAN PmeEnable);
+
+typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PDRIVER_OBJECT DriverObject;
+ PCARDBUSADD AddCardBus;
+ PCARDBUSDELETE DeleteCardBus;
+ PCARDBUSPCIDISPATCH DispatchPnp;
+} PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
+
+typedef struct _PCI_PME_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PPME_GET_INFORMATION GetPmeInformation;
+ PPME_CLEAR_PME_STATUS ClearPmeStatus;
+ PPME_SET_PME_ENABLE UpdateEnable;
+} PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
+
+/* Hardware Abstraction Layer Types */
+
+typedef BOOLEAN
+(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
+ IN ULONG Columns,
+ IN ULONG Rows);
+
+typedef PBUS_HANDLER
+(FASTCALL *pHalHandlerForBus)(
+ IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber);
+
+typedef VOID
+(FASTCALL *pHalReferenceBusHandler)(
+ IN PBUS_HANDLER BusHandler);
+
typedef enum _HAL_QUERY_INFORMATION_CLASS {
HalInstalledBusInformation,
HalProfileSourceInformation,
@@ -368,92 +1411,18 @@ typedef enum _HAL_SET_INFORMATION_CLASS {
HalProfileDpgoSourceInterruptHandler
} HAL_SET_INFORMATION_CLASS, *PHAL_SET_INFORMATION_CLASS;
-typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
- KPROFILE_SOURCE Source;
- ULONG_PTR Interval;
-} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
-
-typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
- KPROFILE_SOURCE Source;
- BOOLEAN Supported;
- ULONG Interval;
-} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
-
-typedef struct _MAP_REGISTER_ENTRY {
- PVOID MapRegister;
- BOOLEAN WriteToDevice;
-} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
-
-typedef struct _DEBUG_DEVICE_ADDRESS {
- UCHAR Type;
- BOOLEAN Valid;
- UCHAR Reserved[2];
- PUCHAR TranslatedAddress;
- ULONG Length;
-} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
-
-typedef struct _DEBUG_MEMORY_REQUIREMENTS {
- PHYSICAL_ADDRESS Start;
- PHYSICAL_ADDRESS MaxEnd;
- PVOID VirtualAddress;
- ULONG Length;
- BOOLEAN Cached;
- BOOLEAN Aligned;
-} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
-
-typedef struct _DEBUG_DEVICE_DESCRIPTOR {
- ULONG Bus;
- ULONG Slot;
- USHORT Segment;
- USHORT VendorID;
- USHORT DeviceID;
- UCHAR BaseClass;
- UCHAR SubClass;
- UCHAR ProgIf;
- BOOLEAN Initialized;
- BOOLEAN Configured;
- DEBUG_DEVICE_ADDRESS BaseAddress[6];
- DEBUG_MEMORY_REQUIREMENTS Memory;
-} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
-
-typedef struct _PM_DISPATCH_TABLE {
- ULONG Signature;
- ULONG Version;
- PVOID Function[1];
-} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
-
-typedef enum _RESOURCE_TRANSLATION_DIRECTION {
- TranslateChildToParent,
- TranslateParentToChild
-} RESOURCE_TRANSLATION_DIRECTION;
+typedef NTSTATUS
+(NTAPI *pHalQuerySystemInformation)(
+ IN HAL_QUERY_INFORMATION_CLASS InformationClass,
+ IN ULONG BufferSize,
+ IN OUT PVOID Buffer,
+ OUT PULONG ReturnedLength);
typedef NTSTATUS
-(NTAPI *PTRANSLATE_RESOURCE_HANDLER)(
- IN OUT PVOID Context,
- IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
- IN RESOURCE_TRANSLATION_DIRECTION Direction,
- IN ULONG AlternativesCount OPTIONAL,
- IN IO_RESOURCE_DESCRIPTOR Alternatives[],
- IN PDEVICE_OBJECT PhysicalDeviceObject,
- OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target);
-
-typedef NTSTATUS
-(NTAPI *PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
- IN PVOID Context OPTIONAL,
- IN PIO_RESOURCE_DESCRIPTOR Source,
- IN PDEVICE_OBJECT PhysicalDeviceObject,
- OUT PULONG TargetCount,
- OUT PIO_RESOURCE_DESCRIPTOR *Target);
-
-typedef struct _TRANSLATOR_INTERFACE {
- USHORT Size;
- USHORT Version;
- PVOID Context;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
- PTRANSLATE_RESOURCE_HANDLER TranslateResources;
- PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
-} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
+(NTAPI *pHalSetSystemInformation)(
+ IN HAL_SET_INFORMATION_CLASS InformationClass,
+ IN ULONG BufferSize,
+ IN PVOID Buffer);
typedef VOID
(FASTCALL *pHalExamineMBR)(
@@ -484,28 +1453,6 @@ typedef NTSTATUS
IN ULONG NumberOfHeads,
IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
-typedef PBUS_HANDLER
-(FASTCALL *pHalHandlerForBus)(
- IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber);
-
-typedef VOID
-(FASTCALL *pHalReferenceBusHandler)(
- IN PBUS_HANDLER BusHandler);
-
-typedef NTSTATUS
-(NTAPI *pHalQuerySystemInformation)(
- IN HAL_QUERY_INFORMATION_CLASS InformationClass,
- IN ULONG BufferSize,
- IN OUT PVOID Buffer,
- OUT PULONG ReturnedLength);
-
-typedef NTSTATUS
-(NTAPI *pHalSetSystemInformation)(
- IN HAL_SET_INFORMATION_CLASS InformationClass,
- IN ULONG BufferSize,
- IN PVOID Buffer);
-
typedef NTSTATUS
(NTAPI *pHalQueryBusSlots)(
IN PBUS_HANDLER BusHandler,
@@ -517,6 +1464,12 @@ typedef NTSTATUS
(NTAPI *pHalInitPnpDriver)(
VOID);
+typedef struct _PM_DISPATCH_TABLE {
+ ULONG Signature;
+ ULONG Version;
+ PVOID Function[1];
+} PM_DISPATCH_TABLE, *PPM_DISPATCH_TABLE;
+
typedef NTSTATUS
(NTAPI *pHalInitPowerManagement)(
IN PPM_DISPATCH_TABLE PmDriverDispatchTable,
@@ -556,12 +1509,7 @@ typedef NTSTATUS
IN PHYSICAL_ADDRESS PhysicalAddress,
IN LARGE_INTEGER NumberOfBytes);
-typedef VOID
-(NTAPI *pHalEndOfBoot)(
- VOID);
-
-typedef
-BOOLEAN
+typedef BOOLEAN
(NTAPI *pHalTranslateBusAddress)(
IN INTERFACE_TYPE InterfaceType,
IN ULONG BusNumber,
@@ -569,8 +1517,7 @@ BOOLEAN
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
-typedef
-NTSTATUS
+typedef NTSTATUS
(NTAPI *pHalAssignSlotResources)(
IN PUNICODE_STRING RegistryPath,
IN PUNICODE_STRING DriverClassName OPTIONAL,
@@ -581,23 +1528,24 @@ NTSTATUS
IN ULONG SlotNumber,
IN OUT PCM_RESOURCE_LIST *AllocatedResources);
-typedef
-VOID
+typedef VOID
(NTAPI *pHalHaltSystem)(
VOID);
-typedef
-BOOLEAN
+typedef BOOLEAN
(NTAPI *pHalResetDisplay)(
VOID);
-typedef
-UCHAR
+typedef struct _MAP_REGISTER_ENTRY {
+ PVOID MapRegister;
+ BOOLEAN WriteToDevice;
+} MAP_REGISTER_ENTRY, *PMAP_REGISTER_ENTRY;
+
+typedef UCHAR
(NTAPI *pHalVectorToIDTEntry)(
ULONG Vector);
-typedef
-BOOLEAN
+typedef BOOLEAN
(NTAPI *pHalFindBusAddressTranslation)(
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
@@ -605,94 +1553,33 @@ BOOLEAN
IN OUT PULONG_PTR Context,
IN BOOLEAN NextBus);
-typedef
-NTSTATUS
-(NTAPI *pKdSetupPciDeviceForDebugging)(
- IN PVOID LoaderBlock OPTIONAL,
- IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
+typedef VOID
+(NTAPI *pHalEndOfBoot)(
+ VOID);
-typedef
-NTSTATUS
-(NTAPI *pKdReleasePciDeviceForDebugging)(
- IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
-
-typedef
-PVOID
-(NTAPI *pKdGetAcpiTablePhase0)(
- IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
- IN ULONG Signature);
-
-typedef
-PVOID
+typedef PVOID
(NTAPI *pHalGetAcpiTable)(
IN ULONG Signature,
IN PCSTR OemId OPTIONAL,
IN PCSTR OemTableId OPTIONAL);
-
-typedef
-VOID
-(NTAPI *pKdCheckPowerButton)(
- VOID);
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-typedef
-PVOID
-(NTAPI *pKdMapPhysicalMemory64)(
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN ULONG NumberPages,
- IN BOOLEAN FlushCurrentTLB);
+#if defined(_IA64_)
+typedef NTSTATUS
+(*pHalGetErrorCapList)(
+ IN OUT PULONG CapsListLength,
+ IN OUT PUCHAR ErrorCapList);
-typedef
-VOID
-(NTAPI *pKdUnmapVirtualAddress)(
- IN PVOID VirtualAddress,
- IN ULONG NumberPages,
- IN BOOLEAN FlushCurrentTLB);
-#else
-typedef
-PVOID
-(NTAPI *pKdMapPhysicalMemory64)(
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN ULONG NumberPages);
-
-typedef
-VOID
-(NTAPI *pKdUnmapVirtualAddress)(
- IN PVOID VirtualAddress,
- IN ULONG NumberPages);
+typedef NTSTATUS
+(*pHalInjectError)(
+ IN ULONG BufferLength,
+ IN PUCHAR Buffer);
#endif
-
-typedef
-ULONG
-(NTAPI *pKdGetPciDataByOffset)(
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- OUT PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-typedef
-ULONG
-(NTAPI *pKdSetPciDataByOffset)(
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-typedef BOOLEAN
-(NTAPI *PHAL_RESET_DISPLAY_PARAMETERS)(
- IN ULONG Columns,
- IN ULONG Rows);
-
-typedef
-VOID
+typedef VOID
(NTAPI *PCI_ERROR_HANDLER_CALLBACK)(
VOID);
-typedef
-VOID
+typedef VOID
(NTAPI *pHalSetPciErrorHandlerCallback)(
IN PCI_ERROR_HANDLER_CALLBACK Callback);
@@ -766,78 +1653,706 @@ extern NTKERNELAPI HAL_DISPATCH HalDispatchTable;
#define HalMirrorPhysicalMemory HALDISPATCH->HalMirrorPhysicalMemory
#define HalEndOfBoot HALDISPATCH->HalEndOfBoot
#define HalMirrorVerify HALDISPATCH->HalMirrorVerify
-
-typedef struct _FILE_ALIGNMENT_INFORMATION {
- ULONG AlignmentRequirement;
-} FILE_ALIGNMENT_INFORMATION, *PFILE_ALIGNMENT_INFORMATION;
-
-typedef struct _FILE_NAME_INFORMATION {
- ULONG FileNameLength;
- WCHAR FileName[1];
-} FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;
-
-
-typedef struct _FILE_ATTRIBUTE_TAG_INFORMATION {
- ULONG FileAttributes;
- ULONG ReparseTag;
-} FILE_ATTRIBUTE_TAG_INFORMATION, *PFILE_ATTRIBUTE_TAG_INFORMATION;
-
-typedef struct _FILE_DISPOSITION_INFORMATION {
- BOOLEAN DeleteFile;
-} FILE_DISPOSITION_INFORMATION, *PFILE_DISPOSITION_INFORMATION;
-
-typedef struct _FILE_END_OF_FILE_INFORMATION {
- LARGE_INTEGER EndOfFile;
-} FILE_END_OF_FILE_INFORMATION, *PFILE_END_OF_FILE_INFORMATION;
-
-typedef struct _FILE_VALID_DATA_LENGTH_INFORMATION {
- LARGE_INTEGER ValidDataLength;
-} FILE_VALID_DATA_LENGTH_INFORMATION, *PFILE_VALID_DATA_LENGTH_INFORMATION;
-
-typedef union _FILE_SEGMENT_ELEMENT {
- PVOID64 Buffer;
- ULONGLONG Alignment;
-}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
-
-#define SE_UNSOLICITED_INPUT_PRIVILEGE 6
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTSYSAPI
-ULONGLONG
-NTAPI
-VerSetConditionMask(
- IN ULONGLONG ConditionMask,
- IN ULONG TypeMask,
- IN UCHAR Condition);
+#define HalGetCachedAcpiTable HALDISPATCH->HalGetCachedAcpiTable
+#define HalSetPciErrorHandlerCallback HALDISPATCH->HalSetPciErrorHandlerCallback
+#if defined(_IA64_)
+#define HalGetErrorCapList HALDISPATCH->HalGetErrorCapList
+#define HalInjectError HALDISPATCH->HalInjectError
#endif
-#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
- ((ConditionMask) = VerSetConditionMask((ConditionMask), \
- (TypeBitMask), (ComparisonType)))
+typedef struct _HAL_BUS_INFORMATION {
+ INTERFACE_TYPE BusType;
+ BUS_DATA_TYPE ConfigurationType;
+ ULONG BusNumber;
+ ULONG Reserved;
+} HAL_BUS_INFORMATION, *PHAL_BUS_INFORMATION;
-/* RtlVerifyVersionInfo() TypeMask */
+typedef struct _HAL_PROFILE_SOURCE_INFORMATION {
+ KPROFILE_SOURCE Source;
+ BOOLEAN Supported;
+ ULONG Interval;
+} HAL_PROFILE_SOURCE_INFORMATION, *PHAL_PROFILE_SOURCE_INFORMATION;
-#define VER_MINORVERSION 0x0000001
-#define VER_MAJORVERSION 0x0000002
-#define VER_BUILDNUMBER 0x0000004
-#define VER_PLATFORMID 0x0000008
-#define VER_SERVICEPACKMINOR 0x0000010
-#define VER_SERVICEPACKMAJOR 0x0000020
-#define VER_SUITENAME 0x0000040
-#define VER_PRODUCT_TYPE 0x0000080
+typedef struct _HAL_PROFILE_SOURCE_INFORMATION_EX {
+ KPROFILE_SOURCE Source;
+ BOOLEAN Supported;
+ ULONG_PTR Interval;
+ ULONG_PTR DefInterval;
+ ULONG_PTR MaxInterval;
+ ULONG_PTR MinInterval;
+} HAL_PROFILE_SOURCE_INFORMATION_EX, *PHAL_PROFILE_SOURCE_INFORMATION_EX;
-/* RtlVerifyVersionInfo() ComparisonType */
+typedef struct _HAL_PROFILE_SOURCE_INTERVAL {
+ KPROFILE_SOURCE Source;
+ ULONG_PTR Interval;
+} HAL_PROFILE_SOURCE_INTERVAL, *PHAL_PROFILE_SOURCE_INTERVAL;
-#define VER_EQUAL 1
-#define VER_GREATER 2
-#define VER_GREATER_EQUAL 3
-#define VER_LESS 4
-#define VER_LESS_EQUAL 5
-#define VER_AND 6
-#define VER_OR 7
+typedef struct _HAL_PROFILE_SOURCE_LIST {
+ KPROFILE_SOURCE Source;
+ PWSTR Description;
+} HAL_PROFILE_SOURCE_LIST, *PHAL_PROFILE_SOURCE_LIST;
-#define VER_CONDITION_MASK 7
-#define VER_NUM_BITS_PER_CONDITION_MASK 3
+typedef enum _HAL_DISPLAY_BIOS_INFORMATION {
+ HalDisplayInt10Bios,
+ HalDisplayEmulatedBios,
+ HalDisplayNoBios
+} HAL_DISPLAY_BIOS_INFORMATION, *PHAL_DISPLAY_BIOS_INFORMATION;
+
+typedef struct _HAL_POWER_INFORMATION {
+ ULONG TBD;
+} HAL_POWER_INFORMATION, *PHAL_POWER_INFORMATION;
+
+typedef struct _HAL_PROCESSOR_SPEED_INFO {
+ ULONG ProcessorSpeed;
+} HAL_PROCESSOR_SPEED_INFORMATION, *PHAL_PROCESSOR_SPEED_INFORMATION;
+
+typedef struct _HAL_CALLBACKS {
+ PCALLBACK_OBJECT SetSystemInformation;
+ PCALLBACK_OBJECT BusCheck;
+} HAL_CALLBACKS, *PHAL_CALLBACKS;
+
+typedef struct _HAL_PROCESSOR_FEATURE {
+ ULONG UsableFeatureBits;
+} HAL_PROCESSOR_FEATURE;
+
+typedef NTSTATUS
+(NTAPI *PHALIOREADWRITEHANDLER)(
+ IN BOOLEAN fRead,
+ IN ULONG dwAddr,
+ IN ULONG dwSize,
+ IN OUT PULONG pdwData);
+
+typedef struct _HAL_AMLI_BAD_IO_ADDRESS_LIST {
+ ULONG BadAddrBegin;
+ ULONG BadAddrSize;
+ ULONG OSVersionTrigger;
+ PHALIOREADWRITEHANDLER IOHandler;
+} HAL_AMLI_BAD_IO_ADDRESS_LIST, *PHAL_AMLI_BAD_IO_ADDRESS_LIST;
+
+#if defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
+
+typedef VOID
+(NTAPI *PHALMCAINTERFACELOCK)(
+ VOID);
+
+typedef VOID
+(NTAPI *PHALMCAINTERFACEUNLOCK)(
+ VOID);
+
+typedef NTSTATUS
+(NTAPI *PHALMCAINTERFACEREADREGISTER)(
+ IN UCHAR BankNumber,
+ IN OUT PVOID Exception);
+
+typedef struct _HAL_MCA_INTERFACE {
+ PHALMCAINTERFACELOCK Lock;
+ PHALMCAINTERFACEUNLOCK Unlock;
+ PHALMCAINTERFACEREADREGISTER ReadRegister;
+} HAL_MCA_INTERFACE;
+
+typedef enum {
+ ApicDestinationModePhysical = 1,
+ ApicDestinationModeLogicalFlat,
+ ApicDestinationModeLogicalClustered,
+ ApicDestinationModeUnknown
+} HAL_APIC_DESTINATION_MODE, *PHAL_APIC_DESTINATION_MODE;
+
+#if defined(_AMD64_)
+
+struct _KTRAP_FRAME;
+struct _KEXCEPTION_FRAME;
+
+typedef ERROR_SEVERITY
+(NTAPI *PDRIVER_EXCPTN_CALLBACK)(
+ IN PVOID Context,
+ IN struct _KTRAP_FRAME *TrapFrame,
+ IN struct _KEXCEPTION_FRAME *ExceptionFrame,
+ IN PMCA_EXCEPTION Exception);
+
+#endif
+
+#if defined(_X86_) || defined(_IA64_)
+typedef
+#if defined(_IA64_)
+ERROR_SEVERITY
+#else
+VOID
+#endif
+(NTAPI *PDRIVER_EXCPTN_CALLBACK)(
+ IN PVOID Context,
+ IN PMCA_EXCEPTION BankLog);
+#endif
+
+typedef PDRIVER_EXCPTN_CALLBACK PDRIVER_MCA_EXCEPTION_CALLBACK;
+
+typedef struct _MCA_DRIVER_INFO {
+ PDRIVER_MCA_EXCEPTION_CALLBACK ExceptionCallback;
+ PKDEFERRED_ROUTINE DpcCallback;
+ PVOID DeviceContext;
+} MCA_DRIVER_INFO, *PMCA_DRIVER_INFO;
+
+typedef struct _HAL_ERROR_INFO {
+ ULONG Version;
+ ULONG InitMaxSize;
+ ULONG McaMaxSize;
+ ULONG McaPreviousEventsCount;
+ ULONG McaCorrectedEventsCount;
+ ULONG McaKernelDeliveryFails;
+ ULONG McaDriverDpcQueueFails;
+ ULONG McaReserved;
+ ULONG CmcMaxSize;
+ ULONG CmcPollingInterval;
+ ULONG CmcInterruptsCount;
+ ULONG CmcKernelDeliveryFails;
+ ULONG CmcDriverDpcQueueFails;
+ ULONG CmcGetStateFails;
+ ULONG CmcClearStateFails;
+ ULONG CmcReserved;
+ ULONGLONG CmcLogId;
+ ULONG CpeMaxSize;
+ ULONG CpePollingInterval;
+ ULONG CpeInterruptsCount;
+ ULONG CpeKernelDeliveryFails;
+ ULONG CpeDriverDpcQueueFails;
+ ULONG CpeGetStateFails;
+ ULONG CpeClearStateFails;
+ ULONG CpeInterruptSources;
+ ULONGLONG CpeLogId;
+ ULONGLONG KernelReserved[4];
+} HAL_ERROR_INFO, *PHAL_ERROR_INFO;
+
+#define HAL_MCE_INTERRUPTS_BASED ((ULONG)-1)
+#define HAL_MCE_DISABLED ((ULONG)0)
+
+#define HAL_CMC_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
+#define HAL_CMC_DISABLED HAL_MCE_DISABLED
+
+#define HAL_CPE_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
+#define HAL_CPE_DISABLED HAL_MCE_DISABLED
+
+#define HAL_MCA_INTERRUPTS_BASED HAL_MCE_INTERRUPTS_BASED
+#define HAL_MCA_DISABLED HAL_MCE_DISABLED
+
+typedef VOID
+(NTAPI *PDRIVER_CMC_EXCEPTION_CALLBACK)(
+ IN PVOID Context,
+ IN PCMC_EXCEPTION CmcLog);
+
+typedef VOID
+(NTAPI *PDRIVER_CPE_EXCEPTION_CALLBACK)(
+ IN PVOID Context,
+ IN PCPE_EXCEPTION CmcLog);
+
+typedef struct _CMC_DRIVER_INFO {
+ PDRIVER_CMC_EXCEPTION_CALLBACK ExceptionCallback;
+ PKDEFERRED_ROUTINE DpcCallback;
+ PVOID DeviceContext;
+} CMC_DRIVER_INFO, *PCMC_DRIVER_INFO;
+
+typedef struct _CPE_DRIVER_INFO {
+ PDRIVER_CPE_EXCEPTION_CALLBACK ExceptionCallback;
+ PKDEFERRED_ROUTINE DpcCallback;
+ PVOID DeviceContext;
+} CPE_DRIVER_INFO, *PCPE_DRIVER_INFO;
+
+#endif // defined(_X86_) || defined(_IA64_) || defined(_AMD64_)
+
+#if defined(_IA64_)
+
+typedef NTSTATUS
+(*HALSENDCROSSPARTITIONIPI)(
+ IN USHORT ProcessorID,
+ IN UCHAR HardwareVector);
+
+typedef NTSTATUS
+(*HALRESERVECROSSPARTITIONINTERRUPTVECTOR)(
+ OUT PULONG Vector,
+ OUT PKIRQL Irql,
+ IN OUT PGROUP_AFFINITY Affinity,
+ OUT PUCHAR HardwareVector);
+
+typedef VOID
+(*HALFREECROSSPARTITIONINTERRUPTVECTOR)(
+ IN ULONG Vector,
+ IN PGROUP_AFFINITY Affinity);
+
+typedef struct _HAL_CROSS_PARTITION_IPI_INTERFACE {
+ HALSENDCROSSPARTITIONIPI HalSendCrossPartitionIpi;
+ HALRESERVECROSSPARTITIONINTERRUPTVECTOR HalReserveCrossPartitionInterruptVector;
+ HALFREECROSSPARTITIONINTERRUPTVECTOR HalFreeCrossPartitionInterruptVector;
+} HAL_CROSS_PARTITION_IPI_INTERFACE;
+
+#define HAL_CROSS_PARTITION_IPI_INTERFACE_MINIMUM_SIZE \
+ FIELD_OFFSET(HAL_CROSS_PARTITION_IPI_INTERFACE, \
+ HalFreeCrossPartitionInterruptVector)
+
+#endif /* defined(_IA64_) */
+
+typedef struct _HAL_PLATFORM_INFORMATION {
+ ULONG PlatformFlags;
+} HAL_PLATFORM_INFORMATION, *PHAL_PLATFORM_INFORMATION;
+
+#define HAL_PLATFORM_DISABLE_WRITE_COMBINING 0x01L
+#define HAL_PLATFORM_DISABLE_PTCG 0x04L
+#define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L
+#define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L
+#define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L
+
+/******************************************************************************
+ * Kernel Types *
+ ******************************************************************************/
+
+#define NX_SUPPORT_POLICY_ALWAYSOFF 0
+#define NX_SUPPORT_POLICY_ALWAYSON 1
+#define NX_SUPPORT_POLICY_OPTIN 2
+#define NX_SUPPORT_POLICY_OPTOUT 3
+
+typedef VOID
+(NTAPI *PEXPAND_STACK_CALLOUT)(
+ IN PVOID Parameter OPTIONAL);
+
+typedef VOID
+(NTAPI *PTIMER_APC_ROUTINE)(
+ IN PVOID TimerContext,
+ IN ULONG TimerLowValue,
+ IN LONG TimerHighValue);
+
+typedef enum _TIMER_SET_INFORMATION_CLASS {
+ TimerSetCoalescableTimer,
+ MaxTimerInfoClass
+} TIMER_SET_INFORMATION_CLASS;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+typedef struct _TIMER_SET_COALESCABLE_TIMER_INFO {
+ IN LARGE_INTEGER DueTime;
+ IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL;
+ IN PVOID TimerContext OPTIONAL;
+ IN struct _COUNTED_REASON_CONTEXT *WakeContext OPTIONAL;
+ IN ULONG Period OPTIONAL;
+ IN ULONG TolerableDelay;
+ OUT PBOOLEAN PreviousState OPTIONAL;
+} TIMER_SET_COALESCABLE_TIMER_INFO, *PTIMER_SET_COALESCABLE_TIMER_INFO;
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#define XSTATE_LEGACY_FLOATING_POINT 0
+#define XSTATE_LEGACY_SSE 1
+#define XSTATE_GSSE 2
+
+#define XSTATE_MASK_LEGACY_FLOATING_POINT (1i64 << (XSTATE_LEGACY_FLOATING_POINT))
+#define XSTATE_MASK_LEGACY_SSE (1i64 << (XSTATE_LEGACY_SSE))
+#define XSTATE_MASK_LEGACY (XSTATE_MASK_LEGACY_FLOATING_POINT | XSTATE_MASK_LEGACY_SSE)
+#define XSTATE_MASK_GSSE (1i64 << (XSTATE_GSSE))
+
+#define MAXIMUM_XSTATE_FEATURES 64
+
+typedef struct _XSTATE_FEATURE {
+ ULONG Offset;
+ ULONG Size;
+} XSTATE_FEATURE, *PXSTATE_FEATURE;
+
+typedef struct _XSTATE_CONFIGURATION {
+ ULONG64 EnabledFeatures;
+ ULONG Size;
+ ULONG OptimizedSave:1;
+ XSTATE_FEATURE Features[MAXIMUM_XSTATE_FEATURES];
+} XSTATE_CONFIGURATION, *PXSTATE_CONFIGURATION;
+
+#define MAX_WOW64_SHARED_ENTRIES 16
+
+typedef struct _KUSER_SHARED_DATA {
+ ULONG TickCountLowDeprecated;
+ ULONG TickCountMultiplier;
+ volatile KSYSTEM_TIME InterruptTime;
+ volatile KSYSTEM_TIME SystemTime;
+ volatile KSYSTEM_TIME TimeZoneBias;
+ USHORT ImageNumberLow;
+ USHORT ImageNumberHigh;
+ WCHAR NtSystemRoot[260];
+ ULONG MaxStackTraceDepth;
+ ULONG CryptoExponent;
+ ULONG TimeZoneId;
+ ULONG LargePageMinimum;
+ ULONG Reserved2[7];
+ NT_PRODUCT_TYPE NtProductType;
+ BOOLEAN ProductTypeIsValid;
+ ULONG NtMajorVersion;
+ ULONG NtMinorVersion;
+ BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
+ ULONG Reserved1;
+ ULONG Reserved3;
+ volatile ULONG TimeSlip;
+ ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
+ ULONG AltArchitecturePad[1];
+ LARGE_INTEGER SystemExpirationDate;
+ ULONG SuiteMask;
+ BOOLEAN KdDebuggerEnabled;
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+ UCHAR NXSupportPolicy;
+#endif
+ volatile ULONG ActiveConsoleId;
+ volatile ULONG DismountCount;
+ ULONG ComPlusPackage;
+ ULONG LastSystemRITEventTickCount;
+ ULONG NumberOfPhysicalPages;
+ BOOLEAN SafeBootMode;
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+ _ANONYMOUS_UNION union {
+ UCHAR TscQpcData;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR TscQpcEnabled:1;
+ UCHAR TscQpcSpareFlag:1;
+ UCHAR TscQpcShift:6;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR TscQpcPad[2];
+#endif
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+ _ANONYMOUS_UNION union {
+ ULONG SharedDataFlags;
+ _ANONYMOUS_STRUCT struct {
+ ULONG DbgErrorPortPresent:1;
+ ULONG DbgElevationEnabled:1;
+ ULONG DbgVirtEnabled:1;
+ ULONG DbgInstallerDetectEnabled:1;
+ ULONG DbgSystemDllRelocated:1;
+ ULONG DbgDynProcessorEnabled:1;
+ ULONG DbgSEHValidationEnabled:1;
+ ULONG SpareBits:25;
+ } DUMMYSTRUCTNAME2;
+ } DUMMYUNIONNAME2;
+#else
+ ULONG TraceLogging;
+#endif
+ ULONG DataFlagsPad[1];
+ ULONGLONG TestRetInstruction;
+ ULONG SystemCall;
+ ULONG SystemCallReturn;
+ ULONGLONG SystemCallPad[3];
+ _ANONYMOUS_UNION union {
+ volatile KSYSTEM_TIME TickCount;
+ volatile ULONG64 TickCountQuad;
+ _ANONYMOUS_STRUCT struct {
+ ULONG ReservedTickCountOverlay[3];
+ ULONG TickCountPad[1];
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME3;
+ ULONG Cookie;
+ ULONG CookiePad[1];
+#if (NTDDI_VERSION >= NTDDI_WS03)
+ LONGLONG ConsoleSessionForegroundProcessId;
+ ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
+#endif
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+ USHORT UserModeGlobalLogger[16];
+#else
+ USHORT UserModeGlobalLogger[8];
+ ULONG HeapTracingPid[2];
+ ULONG CritSecTracingPid[2];
+#endif
+ ULONG ImageFileExecutionOptions;
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+ ULONG LangGenerationCount;
+#else
+ /* 4 bytes padding */
+#endif
+ ULONGLONG Reserved5;
+ volatile ULONG64 InterruptTimeBias;
+#endif
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+ volatile ULONG64 TscQpcBias;
+ volatile ULONG ActiveProcessorCount;
+ volatile USHORT ActiveGroupCount;
+ USHORT Reserved4;
+ volatile ULONG AitSamplingValue;
+ volatile ULONG AppCompatFlag;
+ ULONGLONG SystemDllNativeRelocation;
+ ULONG SystemDllWowRelocation;
+ ULONG XStatePad[1];
+ XSTATE_CONFIGURATION XState;
+#endif
+} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+extern NTSYSAPI volatile CCHAR KeNumberProcessors;
+#elif (NTDDI_VERSION >= NTDDI_WINXP)
+extern NTSYSAPI CCHAR KeNumberProcessors;
+#else
+extern PCCHAR KeNumberProcessors;
+#endif
+
+
+/******************************************************************************
+ * Kernel Debugger Types *
+ ******************************************************************************/
+typedef struct _DEBUG_DEVICE_ADDRESS {
+ UCHAR Type;
+ BOOLEAN Valid;
+ UCHAR Reserved[2];
+ PUCHAR TranslatedAddress;
+ ULONG Length;
+} DEBUG_DEVICE_ADDRESS, *PDEBUG_DEVICE_ADDRESS;
+
+typedef struct _DEBUG_MEMORY_REQUIREMENTS {
+ PHYSICAL_ADDRESS Start;
+ PHYSICAL_ADDRESS MaxEnd;
+ PVOID VirtualAddress;
+ ULONG Length;
+ BOOLEAN Cached;
+ BOOLEAN Aligned;
+} DEBUG_MEMORY_REQUIREMENTS, *PDEBUG_MEMORY_REQUIREMENTS;
+
+typedef struct _DEBUG_DEVICE_DESCRIPTOR {
+ ULONG Bus;
+ ULONG Slot;
+ USHORT Segment;
+ USHORT VendorID;
+ USHORT DeviceID;
+ UCHAR BaseClass;
+ UCHAR SubClass;
+ UCHAR ProgIf;
+ BOOLEAN Initialized;
+ BOOLEAN Configured;
+ DEBUG_DEVICE_ADDRESS BaseAddress[6];
+ DEBUG_MEMORY_REQUIREMENTS Memory;
+} DEBUG_DEVICE_DESCRIPTOR, *PDEBUG_DEVICE_DESCRIPTOR;
+
+typedef NTSTATUS
+(NTAPI *pKdSetupPciDeviceForDebugging)(
+ IN PVOID LoaderBlock OPTIONAL,
+ IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
+
+typedef NTSTATUS
+(NTAPI *pKdReleasePciDeviceForDebugging)(
+ IN OUT PDEBUG_DEVICE_DESCRIPTOR PciDevice);
+
+typedef PVOID
+(NTAPI *pKdGetAcpiTablePhase0)(
+ IN struct _LOADER_PARAMETER_BLOCK *LoaderBlock,
+ IN ULONG Signature);
+
+typedef VOID
+(NTAPI *pKdCheckPowerButton)(
+ VOID);
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+typedef PVOID
+(NTAPI *pKdMapPhysicalMemory64)(
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN ULONG NumberPages,
+ IN BOOLEAN FlushCurrentTLB);
+
+typedef VOID
+(NTAPI *pKdUnmapVirtualAddress)(
+ IN PVOID VirtualAddress,
+ IN ULONG NumberPages,
+ IN BOOLEAN FlushCurrentTLB);
+#else
+typedef PVOID
+(NTAPI *pKdMapPhysicalMemory64)(
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN ULONG NumberPages);
+
+typedef VOID
+(NTAPI *pKdUnmapVirtualAddress)(
+ IN PVOID VirtualAddress,
+ IN ULONG NumberPages);
+#endif
+
+typedef ULONG
+(NTAPI *pKdGetPciDataByOffset)(
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ OUT PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+
+typedef ULONG
+(NTAPI *pKdSetPciDataByOffset)(
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+/******************************************************************************
+ * Memory manager Types *
+ ******************************************************************************/
+
+typedef struct _PHYSICAL_MEMORY_RANGE {
+ PHYSICAL_ADDRESS BaseAddress;
+ LARGE_INTEGER NumberOfBytes;
+} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
+
+typedef NTSTATUS
+(NTAPI *PMM_ROTATE_COPY_CALLBACK_FUNCTION)(
+ IN PMDL DestinationMdl,
+ IN PMDL SourceMdl,
+ IN PVOID Context);
+
+typedef enum _MM_ROTATE_DIRECTION {
+ MmToFrameBuffer,
+ MmToFrameBufferNoCopy,
+ MmToRegularMemory,
+ MmToRegularMemoryNoCopy,
+ MmMaximumRotateDirection
+} MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION;
+
+
+/******************************************************************************
+ * Process Manager Types *
+ ******************************************************************************/
+
+#define QUOTA_LIMITS_HARDWS_MIN_ENABLE 0x00000001
+#define QUOTA_LIMITS_HARDWS_MIN_DISABLE 0x00000002
+#define QUOTA_LIMITS_HARDWS_MAX_ENABLE 0x00000004
+#define QUOTA_LIMITS_HARDWS_MAX_DISABLE 0x00000008
+#define QUOTA_LIMITS_USE_DEFAULT_LIMITS 0x00000010
+
+typedef struct _QUOTA_LIMITS {
+ SIZE_T PagedPoolLimit;
+ SIZE_T NonPagedPoolLimit;
+ SIZE_T MinimumWorkingSetSize;
+ SIZE_T MaximumWorkingSetSize;
+ SIZE_T PagefileLimit;
+ LARGE_INTEGER TimeLimit;
+} QUOTA_LIMITS, *PQUOTA_LIMITS;
+
+typedef union _RATE_QUOTA_LIMIT {
+ ULONG RateData;
+ _ANONYMOUS_STRUCT struct {
+ ULONG RatePercent:7;
+ ULONG Reserved0:25;
+ } DUMMYSTRUCTNAME;
+} RATE_QUOTA_LIMIT, *PRATE_QUOTA_LIMIT;
+
+typedef struct _QUOTA_LIMITS_EX {
+ SIZE_T PagedPoolLimit;
+ SIZE_T NonPagedPoolLimit;
+ SIZE_T MinimumWorkingSetSize;
+ SIZE_T MaximumWorkingSetSize;
+ SIZE_T PagefileLimit;
+ LARGE_INTEGER TimeLimit;
+ SIZE_T WorkingSetLimit;
+ SIZE_T Reserved2;
+ SIZE_T Reserved3;
+ SIZE_T Reserved4;
+ ULONG Flags;
+ RATE_QUOTA_LIMIT CpuRateLimit;
+} QUOTA_LIMITS_EX, *PQUOTA_LIMITS_EX;
+
+typedef struct _IO_COUNTERS {
+ ULONGLONG ReadOperationCount;
+ ULONGLONG WriteOperationCount;
+ ULONGLONG OtherOperationCount;
+ ULONGLONG ReadTransferCount;
+ ULONGLONG WriteTransferCount;
+ ULONGLONG OtherTransferCount;
+} IO_COUNTERS, *PIO_COUNTERS;
+
+typedef struct _VM_COUNTERS {
+ SIZE_T PeakVirtualSize;
+ SIZE_T VirtualSize;
+ ULONG PageFaultCount;
+ SIZE_T PeakWorkingSetSize;
+ SIZE_T WorkingSetSize;
+ SIZE_T QuotaPeakPagedPoolUsage;
+ SIZE_T QuotaPagedPoolUsage;
+ SIZE_T QuotaPeakNonPagedPoolUsage;
+ SIZE_T QuotaNonPagedPoolUsage;
+ SIZE_T PagefileUsage;
+ SIZE_T PeakPagefileUsage;
+} VM_COUNTERS, *PVM_COUNTERS;
+
+typedef struct _VM_COUNTERS_EX {
+ SIZE_T PeakVirtualSize;
+ SIZE_T VirtualSize;
+ ULONG PageFaultCount;
+ SIZE_T PeakWorkingSetSize;
+ SIZE_T WorkingSetSize;
+ SIZE_T QuotaPeakPagedPoolUsage;
+ SIZE_T QuotaPagedPoolUsage;
+ SIZE_T QuotaPeakNonPagedPoolUsage;
+ SIZE_T QuotaNonPagedPoolUsage;
+ SIZE_T PagefileUsage;
+ SIZE_T PeakPagefileUsage;
+ SIZE_T PrivateUsage;
+} VM_COUNTERS_EX, *PVM_COUNTERS_EX;
+
+#define MAX_HW_COUNTERS 16
+#define THREAD_PROFILING_FLAG_DISPATCH 0x00000001
+
+typedef enum _HARDWARE_COUNTER_TYPE {
+ PMCCounter,
+ MaxHardwareCounterType
+} HARDWARE_COUNTER_TYPE, *PHARDWARE_COUNTER_TYPE;
+
+typedef struct _HARDWARE_COUNTER {
+ HARDWARE_COUNTER_TYPE Type;
+ ULONG Reserved;
+ ULONG64 Index;
+} HARDWARE_COUNTER, *PHARDWARE_COUNTER;
+
+typedef struct _POOLED_USAGE_AND_LIMITS {
+ SIZE_T PeakPagedPoolUsage;
+ SIZE_T PagedPoolUsage;
+ SIZE_T PagedPoolLimit;
+ SIZE_T PeakNonPagedPoolUsage;
+ SIZE_T NonPagedPoolUsage;
+ SIZE_T NonPagedPoolLimit;
+ SIZE_T PeakPagefileUsage;
+ SIZE_T PagefileUsage;
+ SIZE_T PagefileLimit;
+} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
+
+typedef struct _PROCESS_ACCESS_TOKEN {
+ HANDLE Token;
+ HANDLE Thread;
+} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
+
+#define PROCESS_EXCEPTION_PORT_ALL_STATE_BITS 0x00000003UL
+#define PROCESS_EXCEPTION_PORT_ALL_STATE_FLAGS ((ULONG_PTR)((1UL << PROCESS_EXCEPTION_PORT_ALL_STATE_BITS) - 1))
+
+typedef struct _PROCESS_EXCEPTION_PORT {
+ IN HANDLE ExceptionPortHandle;
+ IN OUT ULONG StateFlags;
+} PROCESS_EXCEPTION_PORT, *PPROCESS_EXCEPTION_PORT;
+
+typedef VOID
+(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
+ IN HANDLE ParentId,
+ IN HANDLE ProcessId,
+ IN BOOLEAN Create);
+
+typedef struct _PS_CREATE_NOTIFY_INFO {
+ IN SIZE_T Size;
+ _ANONYMOUS_UNION union {
+ IN ULONG Flags;
+ _ANONYMOUS_STRUCT struct {
+ IN ULONG FileOpenNameAvailable:1;
+ IN ULONG Reserved:31;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ IN HANDLE ParentProcessId;
+ IN CLIENT_ID CreatingThreadId;
+ IN OUT struct _FILE_OBJECT *FileObject;
+ IN PCUNICODE_STRING ImageFileName;
+ IN PCUNICODE_STRING CommandLine OPTIONAL;
+ IN OUT NTSTATUS CreationStatus;
+} PS_CREATE_NOTIFY_INFO, *PPS_CREATE_NOTIFY_INFO;
+
+typedef VOID
+(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE_EX)(
+ IN OUT PEPROCESS Process,
+ IN HANDLE ProcessId,
+ IN PPS_CREATE_NOTIFY_INFO CreateInfo OPTIONAL);
+
+typedef VOID
+(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
+ IN HANDLE ProcessId,
+ IN HANDLE ThreadId,
+ IN BOOLEAN Create);
+
+#define IMAGE_ADDRESSING_MODE_32BIT 3
typedef struct _IMAGE_INFO {
_ANONYMOUS_UNION union {
@@ -847,7 +2362,7 @@ typedef struct _IMAGE_INFO {
ULONG SystemModeImage:1;
ULONG ImageMappedToAllPids:1;
ULONG ExtendedInfoPresent:1;
- ULONG Reserved:22;
+ ULONG Reserved:21;
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
PVOID ImageBase;
@@ -856,24 +2371,24 @@ typedef struct _IMAGE_INFO {
ULONG ImageSectionNumber;
} IMAGE_INFO, *PIMAGE_INFO;
-#define IMAGE_ADDRESSING_MODE_32BIT 3
+typedef struct _IMAGE_INFO_EX {
+ SIZE_T Size;
+ IMAGE_INFO ImageInfo;
+ struct _FILE_OBJECT *FileObject;
+} IMAGE_INFO_EX, *PIMAGE_INFO_EX;
-typedef enum _BUS_DATA_TYPE {
- ConfigurationSpaceUndefined = -1,
- Cmos,
- EisaConfiguration,
- Pos,
- CbusConfiguration,
- PCIConfiguration,
- VMEConfiguration,
- NuBusConfiguration,
- PCMCIAConfiguration,
- MPIConfiguration,
- MPSAConfiguration,
- PNPISAConfiguration,
- SgiInternalConfiguration,
- MaximumBusDataType
-} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
+typedef VOID
+(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
+ IN PUNICODE_STRING FullImageName,
+ IN HANDLE ProcessId,
+ IN PIMAGE_INFO ImageInfo);
+
+#define THREAD_CSWITCH_PMU_DISABLE FALSE
+#define THREAD_CSWITCH_PMU_ENABLE TRUE
+
+#define PROCESS_LUID_DOSDEVICES_ONLY 0x00000001
+
+#define PROCESS_HANDLE_TRACING_MAX_STACKS 16
typedef struct _NT_TIB {
struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
@@ -893,10 +2408,10 @@ typedef struct _NT_TIB32 {
ULONG StackBase;
ULONG StackLimit;
ULONG SubSystemTib;
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
ULONG FiberData;
ULONG Version;
- };
+ } DUMMYUNIONNAME;
ULONG ArbitraryUserPointer;
ULONG Self;
} NT_TIB32,*PNT_TIB32;
@@ -906,10 +2421,10 @@ typedef struct _NT_TIB64 {
ULONG64 StackBase;
ULONG64 StackLimit;
ULONG64 SubSystemTib;
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
ULONG64 FiberData;
ULONG Version;
- };
+ } DUMMYUNIONNAME;
ULONG64 ArbitraryUserPointer;
ULONG64 Self;
} NT_TIB64,*PNT_TIB64;
@@ -1007,6 +2522,15 @@ typedef enum _THREADINFOCLASS {
MaxThreadInfoClass
} THREADINFOCLASS;
+typedef struct _PAGE_PRIORITY_INFORMATION {
+ ULONG PagePriority;
+} PAGE_PRIORITY_INFORMATION, *PPAGE_PRIORITY_INFORMATION;
+
+typedef struct _PROCESS_WS_WATCH_INFORMATION {
+ PVOID FaultingPc;
+ PVOID FaultingVa;
+} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
+
typedef struct _PROCESS_BASIC_INFORMATION {
NTSTATUS ExitStatus;
struct _PEB *PebBaseAddress;
@@ -1016,13 +2540,23 @@ typedef struct _PROCESS_BASIC_INFORMATION {
ULONG_PTR InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION,*PPROCESS_BASIC_INFORMATION;
-typedef struct _PROCESS_WS_WATCH_INFORMATION {
- PVOID FaultingPc;
- PVOID FaultingVa;
-} PROCESS_WS_WATCH_INFORMATION, *PPROCESS_WS_WATCH_INFORMATION;
+typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
+ SIZE_T Size;
+ PROCESS_BASIC_INFORMATION BasicInfo;
+ _ANONYMOUS_UNION union {
+ ULONG Flags;
+ _ANONYMOUS_STRUCT struct {
+ ULONG IsProtectedProcess:1;
+ ULONG IsWow64Process:1;
+ ULONG IsProcessDeleting:1;
+ ULONG IsCrossSessionCreate:1;
+ ULONG SpareBits:28;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;
typedef struct _PROCESS_DEVICEMAP_INFORMATION {
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
struct {
HANDLE DirectoryHandle;
} Set;
@@ -1030,1957 +2564,114 @@ typedef struct _PROCESS_DEVICEMAP_INFORMATION {
ULONG DriveMap;
UCHAR DriveType[32];
} Query;
- };
+ } DUMMYUNIONNAME;
} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
-typedef struct _KERNEL_USER_TIMES {
- LARGE_INTEGER CreateTime;
- LARGE_INTEGER ExitTime;
- LARGE_INTEGER KernelTime;
- LARGE_INTEGER UserTime;
-} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
-
-typedef struct _PROCESS_ACCESS_TOKEN {
- HANDLE Token;
- HANDLE Thread;
-} PROCESS_ACCESS_TOKEN, *PPROCESS_ACCESS_TOKEN;
+typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
+ _ANONYMOUS_UNION union {
+ struct {
+ HANDLE DirectoryHandle;
+ } Set;
+ struct {
+ ULONG DriveMap;
+ UCHAR DriveType[32];
+ } Query;
+ } DUMMYUNIONNAME;
+ ULONG Flags;
+} PROCESS_DEVICEMAP_INFORMATION_EX, *PPROCESS_DEVICEMAP_INFORMATION_EX;
typedef struct _PROCESS_SESSION_INFORMATION {
ULONG SessionId;
} PROCESS_SESSION_INFORMATION, *PPROCESS_SESSION_INFORMATION;
-typedef enum _IO_QUERY_DEVICE_DATA_FORMAT {
- IoQueryDeviceIdentifier = 0,
- IoQueryDeviceConfigurationData,
- IoQueryDeviceComponentInformation,
- IoQueryDeviceMaxData
-} IO_QUERY_DEVICE_DATA_FORMAT, *PIO_QUERY_DEVICE_DATA_FORMAT;
-
-typedef struct _DISK_SIGNATURE {
- ULONG PartitionStyle;
- _ANONYMOUS_UNION union {
- struct {
- ULONG Signature;
- ULONG CheckSum;
- } Mbr;
- struct {
- GUID DiskId;
- } Gpt;
- } DUMMYUNIONNAME;
-} DISK_SIGNATURE, *PDISK_SIGNATURE;
-
-typedef ULONG_PTR
-(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
- IN PVOID Context);
-
-typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
- PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
- PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
-} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
-
-#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
-#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
-#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
-#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
-#define DRIVER_VERIFIER_IO_CHECKING 0x0010
-
-typedef VOID
-(NTAPI *PTIMER_APC_ROUTINE)(
- IN PVOID TimerContext,
- IN ULONG TimerLowValue,
- IN LONG TimerHighValue);
-
-typedef struct _KUSER_SHARED_DATA
-{
- ULONG TickCountLowDeprecated;
- ULONG TickCountMultiplier;
- volatile KSYSTEM_TIME InterruptTime;
- volatile KSYSTEM_TIME SystemTime;
- volatile KSYSTEM_TIME TimeZoneBias;
- USHORT ImageNumberLow;
- USHORT ImageNumberHigh;
- WCHAR NtSystemRoot[260];
- ULONG MaxStackTraceDepth;
- ULONG CryptoExponent;
- ULONG TimeZoneId;
- ULONG LargePageMinimum;
- ULONG Reserved2[7];
- NT_PRODUCT_TYPE NtProductType;
- BOOLEAN ProductTypeIsValid;
- ULONG NtMajorVersion;
- ULONG NtMinorVersion;
- BOOLEAN ProcessorFeatures[PROCESSOR_FEATURE_MAX];
- ULONG Reserved1;
- ULONG Reserved3;
- volatile ULONG TimeSlip;
- ALTERNATIVE_ARCHITECTURE_TYPE AlternativeArchitecture;
- ULONG AltArchitecturePad[1];
- LARGE_INTEGER SystemExpirationDate;
- ULONG SuiteMask;
- BOOLEAN KdDebuggerEnabled;
-#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
- UCHAR NXSupportPolicy;
-#endif
- volatile ULONG ActiveConsoleId;
- volatile ULONG DismountCount;
- ULONG ComPlusPackage;
- ULONG LastSystemRITEventTickCount;
- ULONG NumberOfPhysicalPages;
- BOOLEAN SafeBootMode;
-#if (NTDDI_VERSION >= NTDDI_WIN7)
- union {
- UCHAR TscQpcData;
- struct {
- UCHAR TscQpcEnabled:1;
- UCHAR TscQpcSpareFlag:1;
- UCHAR TscQpcShift:6;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- UCHAR TscQpcPad[2];
-#endif
-#if (NTDDI_VERSION >= NTDDI_VISTA)
- union {
- ULONG SharedDataFlags;
- struct {
- ULONG DbgErrorPortPresent:1;
- ULONG DbgElevationEnabled:1;
- ULONG DbgVirtEnabled:1;
- ULONG DbgInstallerDetectEnabled:1;
- ULONG DbgSystemDllRelocated:1;
- ULONG DbgDynProcessorEnabled:1;
- ULONG DbgSEHValidationEnabled:1;
- ULONG SpareBits:25;
- } DUMMYSTRUCTNAME2;
- } DUMMYUNIONNAME2;
-#else
- ULONG TraceLogging;
-#endif
- ULONG DataFlagsPad[1];
- ULONGLONG TestRetInstruction;
- ULONG SystemCall;
- ULONG SystemCallReturn;
- ULONGLONG SystemCallPad[3];
- _ANONYMOUS_UNION union {
- volatile KSYSTEM_TIME TickCount;
- volatile ULONG64 TickCountQuad;
- _ANONYMOUS_STRUCT struct {
- ULONG ReservedTickCountOverlay[3];
- ULONG TickCountPad[1];
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME3;
- ULONG Cookie;
- ULONG CookiePad[1];
-#if (NTDDI_VERSION >= NTDDI_WS03)
- LONGLONG ConsoleSessionForegroundProcessId;
- ULONG Wow64SharedInformation[MAX_WOW64_SHARED_ENTRIES];
-#endif
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-#if (NTDDI_VERSION >= NTDDI_WIN7)
- USHORT UserModeGlobalLogger[16];
-#else
- USHORT UserModeGlobalLogger[8];
- ULONG HeapTracingPid[2];
- ULONG CritSecTracingPid[2];
-#endif
- ULONG ImageFileExecutionOptions;
-#if (NTDDI_VERSION >= NTDDI_VISTASP1)
- ULONG LangGenerationCount;
-#else
- /* 4 bytes padding */
-#endif
- ULONGLONG Reserved5;
- volatile ULONG64 InterruptTimeBias;
-#endif
-#if (NTDDI_VERSION >= NTDDI_WIN7)
- volatile ULONG64 TscQpcBias;
- volatile ULONG ActiveProcessorCount;
- volatile USHORT ActiveGroupCount;
- USHORT Reserved4;
- volatile ULONG AitSamplingValue;
- volatile ULONG AppCompatFlag;
- ULONGLONG SystemDllNativeRelocation;
- ULONG SystemDllWowRelocation;
- ULONG XStatePad[1];
- XSTATE_CONFIGURATION XState;
-#endif
-} KUSER_SHARED_DATA, *PKUSER_SHARED_DATA;
-
-extern NTKERNELAPI PVOID MmHighestUserAddress;
-extern NTKERNELAPI PVOID MmSystemRangeStart;
-extern NTKERNELAPI ULONG MmUserProbeAddress;
-
-
-#ifdef _X86_
-
-#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
-#define MM_SYSTEM_RANGE_START MmSystemRangeStart
-#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
-#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
-extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
-#else
-#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
-#endif
-#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
-#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
-#define MM_SYSTEM_SPACE_END 0xFFFFFFFF
-#if !defined (_X86PAE_)
-#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
-#else
-#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
-#endif
-
-#define KeGetPcr() PCR
-
-#define KERNEL_STACK_SIZE 12288
-#define KERNEL_LARGE_STACK_SIZE 61440
-#define KERNEL_LARGE_STACK_COMMIT 12288
-
-#define SIZE_OF_80387_REGISTERS 80
-
-#define PCR_MINOR_VERSION 1
-#define PCR_MAJOR_VERSION 1
-
-#if !defined(RC_INVOKED)
-
-#define CONTEXT_i386 0x10000
-#define CONTEXT_i486 0x10000
-#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
-#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
-#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
-#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
-#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
-
-#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
-
-#endif /* !defined(RC_INVOKED) */
-
-typedef struct _KPCR {
- union {
- NT_TIB NtTib;
- struct {
- struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
- PVOID Used_StackBase;
- PVOID Spare2;
- PVOID TssCopy;
- ULONG ContextSwitches;
- KAFFINITY SetMemberCopy;
- PVOID Used_Self;
- };
- };
- struct _KPCR *SelfPcr;
- struct _KPRCB *Prcb;
- KIRQL Irql;
- ULONG IRR;
- ULONG IrrActive;
- ULONG IDR;
- PVOID KdVersionBlock;
- struct _KIDTENTRY *IDT;
- struct _KGDTENTRY *GDT;
- struct _KTSS *TSS;
- USHORT MajorVersion;
- USHORT MinorVersion;
- KAFFINITY SetMember;
- ULONG StallScaleFactor;
- UCHAR SpareUnused;
- UCHAR Number;
- UCHAR Spare0;
- UCHAR SecondLevelCacheAssociativity;
- ULONG VdmAlert;
- ULONG KernelReserved[14];
- ULONG SecondLevelCacheSize;
- ULONG HalReserved[16];
-} KPCR, *PKPCR;
-
-FORCEINLINE
-ULONG
-KeGetCurrentProcessorNumber(VOID)
-{
- return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
-}
-
-typedef struct _FLOATING_SAVE_AREA {
- ULONG ControlWord;
- ULONG StatusWord;
- ULONG TagWord;
- ULONG ErrorOffset;
- ULONG ErrorSelector;
- ULONG DataOffset;
- ULONG DataSelector;
- UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
- ULONG Cr0NpxState;
-} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
-
-#include "pshpack4.h"
-typedef struct _CONTEXT {
- ULONG ContextFlags;
- ULONG Dr0;
- ULONG Dr1;
- ULONG Dr2;
- ULONG Dr3;
- ULONG Dr6;
- ULONG Dr7;
- FLOATING_SAVE_AREA FloatSave;
- ULONG SegGs;
- ULONG SegFs;
- ULONG SegEs;
- ULONG SegDs;
- ULONG Edi;
- ULONG Esi;
- ULONG Ebx;
- ULONG Edx;
- ULONG Ecx;
- ULONG Eax;
- ULONG Ebp;
- ULONG Eip;
- ULONG SegCs;
- ULONG EFlags;
- ULONG Esp;
- ULONG SegSs;
- UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
-} CONTEXT;
-#include "poppack.h"
-
-#endif /* _X86_ */
-
-#ifdef _AMD64_
-
-#define PTI_SHIFT 12L
-#define PDI_SHIFT 21L
-#define PPI_SHIFT 30L
-#define PXI_SHIFT 39L
-#define PTE_PER_PAGE 512
-#define PDE_PER_PAGE 512
-#define PPE_PER_PAGE 512
-#define PXE_PER_PAGE 512
-#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
-#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
-#define PPI_MASK (PPE_PER_PAGE - 1)
-#define PXI_MASK (PXE_PER_PAGE - 1)
-
-#define PXE_BASE 0xFFFFF6FB7DBED000ULL
-#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
-#define PPE_BASE 0xFFFFF6FB7DA00000ULL
-#define PDE_BASE 0xFFFFF6FB40000000ULL
-#define PTE_BASE 0xFFFFF68000000000ULL
-#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
-#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
-#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
-#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
-
-#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)0xFFFF080000000000ULL
-#define KI_USER_SHARED_DATA 0xFFFFF78000000000ULL
-
-typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
- ULONG64 P1Home;
- ULONG64 P2Home;
- ULONG64 P3Home;
- ULONG64 P4Home;
- ULONG64 P5Home;
- ULONG64 P6Home;
-
- /* Control flags */
- ULONG ContextFlags;
- ULONG MxCsr;
-
- /* Segment */
- USHORT SegCs;
- USHORT SegDs;
- USHORT SegEs;
- USHORT SegFs;
- USHORT SegGs;
- USHORT SegSs;
- ULONG EFlags;
-
- /* Debug */
- ULONG64 Dr0;
- ULONG64 Dr1;
- ULONG64 Dr2;
- ULONG64 Dr3;
- ULONG64 Dr6;
- ULONG64 Dr7;
-
- /* Integer */
- ULONG64 Rax;
- ULONG64 Rcx;
- ULONG64 Rdx;
- ULONG64 Rbx;
- ULONG64 Rsp;
- ULONG64 Rbp;
- ULONG64 Rsi;
- ULONG64 Rdi;
- ULONG64 R8;
- ULONG64 R9;
- ULONG64 R10;
- ULONG64 R11;
- ULONG64 R12;
- ULONG64 R13;
- ULONG64 R14;
- ULONG64 R15;
-
- /* Counter */
- ULONG64 Rip;
-
- /* Floating point */
- union {
- XMM_SAVE_AREA32 FltSave;
- struct {
- M128A Header[2];
- M128A Legacy[8];
- M128A Xmm0;
- M128A Xmm1;
- M128A Xmm2;
- M128A Xmm3;
- M128A Xmm4;
- M128A Xmm5;
- M128A Xmm6;
- M128A Xmm7;
- M128A Xmm8;
- M128A Xmm9;
- M128A Xmm10;
- M128A Xmm11;
- M128A Xmm12;
- M128A Xmm13;
- M128A Xmm14;
- M128A Xmm15;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
-
- /* Vector */
- M128A VectorRegister[26];
- ULONG64 VectorControl;
-
- /* Debug control */
- ULONG64 DebugControl;
- ULONG64 LastBranchToRip;
- ULONG64 LastBranchFromRip;
- ULONG64 LastExceptionToRip;
- ULONG64 LastExceptionFromRip;
-} CONTEXT;
-
-typedef struct _KPCR
-{
- _ANONYMOUS_UNION union
- {
- NT_TIB NtTib;
- _ANONYMOUS_STRUCT struct
- {
- union _KGDTENTRY64 *GdtBase;
- struct _KTSS64 *TssBase;
- ULONG64 UserRsp;
- struct _KPCR *Self;
- struct _KPRCB *CurrentPrcb;
- PKSPIN_LOCK_QUEUE LockArray;
- PVOID Used_Self;
- };
- };
- union _KIDTENTRY64 *IdtBase;
- ULONG64 Unused[2];
- KIRQL Irql;
- UCHAR SecondLevelCacheAssociativity;
- UCHAR ObsoleteNumber;
- UCHAR Fill0;
- ULONG Unused0[3];
- USHORT MajorVersion;
- USHORT MinorVersion;
- ULONG StallScaleFactor;
- PVOID Unused1[3];
- ULONG KernelReserved[15];
- ULONG SecondLevelCacheSize;
- ULONG HalReserved[16];
- ULONG Unused2;
- PVOID KdVersionBlock;
- PVOID Unused3;
- ULONG PcrAlign1[24];
-} KPCR, *PKPCR;
-
-FORCEINLINE
-PKPCR
-KeGetPcr(VOID)
-{
- return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
-}
-
-FORCEINLINE
-ULONG
-KeGetCurrentProcessorNumber(VOID)
-{
- return (ULONG)__readgsword(0x184);
-}
-
-#if !defined(RC_INVOKED)
-
-#define CONTEXT_AMD64 0x100000
-
-#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
-#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
-#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
-#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
-#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
-
-#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
-#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
-
-#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
-
-#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
-#define CONTEXT_SERVICE_ACTIVE 0x10000000
-#define CONTEXT_EXCEPTION_REQUEST 0x40000000
-#define CONTEXT_EXCEPTION_REPORTING 0x80000000
-
-#endif /* RC_INVOKED */
-
-#endif /* _AMD64_ */
-
-typedef enum _INTERLOCKED_RESULT {
- ResultNegative = RESULT_NEGATIVE,
- ResultZero = RESULT_ZERO,
- ResultPositive = RESULT_POSITIVE
-} INTERLOCKED_RESULT;
-
-typedef struct _OSVERSIONINFOA {
- ULONG dwOSVersionInfoSize;
- ULONG dwMajorVersion;
- ULONG dwMinorVersion;
- ULONG dwBuildNumber;
- ULONG dwPlatformId;
- CHAR szCSDVersion[128];
-} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
-
-typedef struct _OSVERSIONINFOW {
- ULONG dwOSVersionInfoSize;
- ULONG dwMajorVersion;
- ULONG dwMinorVersion;
- ULONG dwBuildNumber;
- ULONG dwPlatformId;
- WCHAR szCSDVersion[128];
-} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
-
-typedef struct _OSVERSIONINFOEXA {
- ULONG dwOSVersionInfoSize;
- ULONG dwMajorVersion;
- ULONG dwMinorVersion;
- ULONG dwBuildNumber;
- ULONG dwPlatformId;
- CHAR szCSDVersion[128];
- USHORT wServicePackMajor;
- USHORT wServicePackMinor;
- USHORT wSuiteMask;
- UCHAR wProductType;
- UCHAR wReserved;
-} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
-
-typedef struct _OSVERSIONINFOEXW {
- ULONG dwOSVersionInfoSize;
- ULONG dwMajorVersion;
- ULONG dwMinorVersion;
- ULONG dwBuildNumber;
- ULONG dwPlatformId;
- WCHAR szCSDVersion[128];
- USHORT wServicePackMajor;
- USHORT wServicePackMinor;
- USHORT wSuiteMask;
- UCHAR wProductType;
- UCHAR wReserved;
-} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
-
-#ifdef UNICODE
-typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
-typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
-typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
-typedef OSVERSIONINFOW OSVERSIONINFO;
-typedef POSVERSIONINFOW POSVERSIONINFO;
-typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
-#else
-typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
-typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
-typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
-typedef OSVERSIONINFOA OSVERSIONINFO;
-typedef POSVERSIONINFOA POSVERSIONINFO;
-typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
-#endif /* UNICODE */
-
-/* Executive Types */
-
-#define PROTECTED_POOL 0x80000000
-
-typedef struct _ZONE_SEGMENT_HEADER {
- SINGLE_LIST_ENTRY SegmentList;
- PVOID Reserved;
-} ZONE_SEGMENT_HEADER, *PZONE_SEGMENT_HEADER;
-
-typedef struct _ZONE_HEADER {
- SINGLE_LIST_ENTRY FreeList;
- SINGLE_LIST_ENTRY SegmentList;
- ULONG BlockSize;
- ULONG TotalSegmentSize;
-} ZONE_HEADER, *PZONE_HEADER;
-
-/* Executive Functions */
-
-static __inline PVOID
-ExAllocateFromZone(
- IN PZONE_HEADER Zone)
-{
- if (Zone->FreeList.Next)
- Zone->FreeList.Next = Zone->FreeList.Next->Next;
- return (PVOID) Zone->FreeList.Next;
-}
-
-static __inline PVOID
-ExFreeToZone(
- IN PZONE_HEADER Zone,
- IN PVOID Block)
-{
- ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
- Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
- return ((PSINGLE_LIST_ENTRY) Block)->Next;
-}
-
-/*
- * PVOID
- * ExInterlockedAllocateFromZone(
- * IN PZONE_HEADER Zone,
- * IN PKSPIN_LOCK Lock)
- */
-#define ExInterlockedAllocateFromZone(Zone, Lock) \
- ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
-
-/* PVOID
- * ExInterlockedFreeToZone(
- * IN PZONE_HEADER Zone,
- * IN PVOID Block,
- * IN PKSPIN_LOCK Lock);
- */
-#define ExInterlockedFreeToZone(Zone, Block, Lock) \
- ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
-
-/*
- * BOOLEAN
- * ExIsFullZone(
- * IN PZONE_HEADER Zone)
- */
-#define ExIsFullZone(Zone) \
- ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
-
-/* BOOLEAN
- * ExIsObjectInFirstZoneSegment(
- * IN PZONE_HEADER Zone,
- * IN PVOID Object);
- */
-#define ExIsObjectInFirstZoneSegment(Zone,Object) \
- ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
- ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
- (Zone)->TotalSegmentSize)) )
-
-#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
-#define ExAcquireResourceShared ExAcquireResourceSharedLite
-#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
-#define ExDeleteResource ExDeleteResourceLite
-#define ExInitializeResource ExInitializeResourceLite
-#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
-#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
-#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
-#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExExtendZone(
- IN OUT PZONE_HEADER Zone,
- IN OUT PVOID Segment,
- IN ULONG SegmentSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExInitializeZone(
- OUT PZONE_HEADER Zone,
- IN ULONG BlockSize,
- IN OUT PVOID InitialSegment,
- IN ULONG InitialSegmentSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExInterlockedExtendZone(
- IN OUT PZONE_HEADER Zone,
- IN OUT PVOID Segment,
- IN ULONG SegmentSize,
- IN OUT PKSPIN_LOCK Lock);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExUuidCreate(
- OUT UUID *Uuid);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-ExRaiseAccessViolation(
- VOID);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-ExRaiseDatatypeMisalignment(
- VOID);
-
-#endif
-
-#ifdef _X86_
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-FASTCALL
-Exfi386InterlockedIncrementLong(
- IN OUT LONG volatile *Addend);
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-FASTCALL
-Exfi386InterlockedDecrementLong(
- IN PLONG Addend);
-
-NTKERNELAPI
-ULONG
-FASTCALL
-Exfi386InterlockedExchangeUlong(
- IN PULONG Target,
- IN ULONG Value);
-
-#endif /* _X86_ */
-
-#ifndef _ARC_DDK_
-#define _ARC_DDK_
-typedef enum _CONFIGURATION_TYPE {
- ArcSystem,
- CentralProcessor,
- FloatingPointProcessor,
- PrimaryIcache,
- PrimaryDcache,
- SecondaryIcache,
- SecondaryDcache,
- SecondaryCache,
- EisaAdapter,
- TcAdapter,
- ScsiAdapter,
- DtiAdapter,
- MultiFunctionAdapter,
- DiskController,
- TapeController,
- CdromController,
- WormController,
- SerialController,
- NetworkController,
- DisplayController,
- ParallelController,
- PointerController,
- KeyboardController,
- AudioController,
- OtherController,
- DiskPeripheral,
- FloppyDiskPeripheral,
- TapePeripheral,
- ModemPeripheral,
- MonitorPeripheral,
- PrinterPeripheral,
- PointerPeripheral,
- KeyboardPeripheral,
- TerminalPeripheral,
- OtherPeripheral,
- LinePeripheral,
- NetworkPeripheral,
- SystemMemory,
- DockingInformation,
- RealModeIrqRoutingTable,
- RealModePCIEnumeration,
- MaximumType
-} CONFIGURATION_TYPE, *PCONFIGURATION_TYPE;
-#endif /* !_ARC_DDK_ */
-
-typedef struct _CONTROLLER_OBJECT {
- CSHORT Type;
- CSHORT Size;
- PVOID ControllerExtension;
- KDEVICE_QUEUE DeviceWaitQueue;
- ULONG Spare1;
- LARGE_INTEGER Spare2;
-} CONTROLLER_OBJECT, *PCONTROLLER_OBJECT;
-
-typedef struct _CONFIGURATION_INFORMATION {
- ULONG DiskCount;
- ULONG FloppyCount;
- ULONG CdRomCount;
- ULONG TapeCount;
- ULONG ScsiPortCount;
- ULONG SerialCount;
- ULONG ParallelCount;
- BOOLEAN AtDiskPrimaryAddressClaimed;
- BOOLEAN AtDiskSecondaryAddressClaimed;
- ULONG Version;
- ULONG MediumChangerCount;
-} CONFIGURATION_INFORMATION, *PCONFIGURATION_INFORMATION;
-
-typedef
-NTSTATUS
-(NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
- IN PVOID Context,
- IN PUNICODE_STRING PathName,
- IN INTERFACE_TYPE BusType,
- IN ULONG BusNumber,
- IN PKEY_VALUE_FULL_INFORMATION *BusInformation,
- IN CONFIGURATION_TYPE ControllerType,
- IN ULONG ControllerNumber,
- IN PKEY_VALUE_FULL_INFORMATION *ControllerInformation,
- IN CONFIGURATION_TYPE PeripheralType,
- IN ULONG PeripheralNumber,
- IN PKEY_VALUE_FULL_INFORMATION *PeripheralInformation);
-
-typedef
-VOID
-(NTAPI DRIVER_REINITIALIZE)(
- IN struct _DRIVER_OBJECT *DriverObject,
- IN PVOID Context,
- IN ULONG Count);
-
-typedef DRIVER_REINITIALIZE *PDRIVER_REINITIALIZE;
-
-/** Filesystem runtime library routines **/
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTKERNELAPI
-BOOLEAN
-NTAPI
-FsRtlIsTotalDeviceFailure(
- IN NTSTATUS Status);
-#endif
-
-/* Hardware Abstraction Layer Types */
-
-typedef VOID
-(NTAPI *PciPin2Line)(
- IN struct _BUS_HANDLER *BusHandler,
- IN struct _BUS_HANDLER *RootHandler,
- IN PCI_SLOT_NUMBER SlotNumber,
- IN PPCI_COMMON_CONFIG PciData);
-
-typedef VOID
-(NTAPI *PciLine2Pin)(
- IN struct _BUS_HANDLER *BusHandler,
- IN struct _BUS_HANDLER *RootHandler,
- IN PCI_SLOT_NUMBER SlotNumber,
- IN PPCI_COMMON_CONFIG PciNewData,
- IN PPCI_COMMON_CONFIG PciOldData);
-
-typedef VOID
-(NTAPI *PciReadWriteConfig)(
- IN struct _BUS_HANDLER *BusHandler,
- IN PCI_SLOT_NUMBER Slot,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-#define PCI_DATA_TAG ' ICP'
-#define PCI_DATA_VERSION 1
-
-typedef struct _PCIBUSDATA {
- ULONG Tag;
- ULONG Version;
- PciReadWriteConfig ReadConfig;
- PciReadWriteConfig WriteConfig;
- PciPin2Line Pin2Line;
- PciLine2Pin Line2Pin;
- PCI_SLOT_NUMBER ParentSlot;
- PVOID Reserved[4];
-} PCIBUSDATA, *PPCIBUSDATA;
-
-/* Hardware Abstraction Layer Functions */
-
-#if !defined(NO_LEGACY_DRIVERS)
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTHALAPI
-NTSTATUS
-NTAPI
-HalAssignSlotResources(
- IN PUNICODE_STRING RegistryPath,
- IN PUNICODE_STRING DriverClassName,
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN INTERFACE_TYPE BusType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN OUT PCM_RESOURCE_LIST *AllocatedResources);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetInterruptVector(
- IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN ULONG BusInterruptLevel,
- IN ULONG BusInterruptVector,
- OUT PKIRQL Irql,
- OUT PKAFFINITY Affinity);
-
-NTHALAPI
-ULONG
-NTAPI
-HalSetBusData(
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length);
-
-#endif
-
-#endif /* !defined(NO_LEGACY_DRIVERS) */
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTHALAPI
-PADAPTER_OBJECT
-NTAPI
-HalGetAdapter(
- IN PDEVICE_DESCRIPTION DeviceDescription,
- IN OUT PULONG NumberOfMapRegisters);
-
-NTHALAPI
-BOOLEAN
-NTAPI
-HalMakeBeep(
- IN ULONG Frequency);
-
-VOID
-NTAPI
-HalPutDmaAdapter(
- IN PADAPTER_OBJECT DmaAdapter);
-
-NTHALAPI
-VOID
-NTAPI
-HalAcquireDisplayOwnership(
- IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetBusData(
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- OUT PVOID Buffer,
- IN ULONG Length);
-
-NTHALAPI
-ULONG
-NTAPI
-HalGetBusDataByOffset(
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- OUT PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-NTHALAPI
-ULONG
-NTAPI
-HalSetBusDataByOffset(
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-NTHALAPI
-BOOLEAN
-NTAPI
-HalTranslateBusAddress(
- IN INTERFACE_TYPE InterfaceType,
- IN ULONG BusNumber,
- IN PHYSICAL_ADDRESS BusAddress,
- IN OUT PULONG AddressSpace,
- OUT PPHYSICAL_ADDRESS TranslatedAddress);
-
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-NTKERNELAPI
-VOID
-FASTCALL
-HalExamineMBR(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG MBRTypeIdentifier,
- OUT PVOID *Buffer);
-#endif
-
-#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
-// nothing here
-#else
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-VOID
-NTAPI
-IoFreeAdapterChannel(
- IN PADAPTER_OBJECT AdapterObject);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-BOOLEAN
-NTAPI
-IoFlushAdapterBuffers(
- IN PADAPTER_OBJECT AdapterObject,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN ULONG Length,
- IN BOOLEAN WriteToDevice);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-VOID
-NTAPI
-IoFreeMapRegisters(
- IN PADAPTER_OBJECT AdapterObject,
- IN PVOID MapRegisterBase,
- IN ULONG NumberOfMapRegisters);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-PVOID
-NTAPI
-HalAllocateCommonBuffer(
- IN PADAPTER_OBJECT AdapterObject,
- IN ULONG Length,
- OUT PPHYSICAL_ADDRESS LogicalAddress,
- IN BOOLEAN CacheEnabled);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-VOID
-NTAPI
-HalFreeCommonBuffer(
- IN PADAPTER_OBJECT AdapterObject,
- IN ULONG Length,
- IN PHYSICAL_ADDRESS LogicalAddress,
- IN PVOID VirtualAddress,
- IN BOOLEAN CacheEnabled);
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-ULONG
-NTAPI
-HalReadDmaCounter(
- IN PADAPTER_OBJECT AdapterObject);
-
-NTHALAPI
-NTSTATUS
-NTAPI
-HalAllocateAdapterChannel(
- IN PADAPTER_OBJECT AdapterObject,
- IN PWAIT_CONTEXT_BLOCK Wcb,
- IN ULONG NumberOfMapRegisters,
- IN PDRIVER_CONTROL ExecutionRoutine);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
-#endif /* defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_) */
-
-/* I/O Manager Functions */
-
-/*
- * VOID IoAssignArcName(
- * IN PUNICODE_STRING ArcName,
- * IN PUNICODE_STRING DeviceName);
- */
-#define IoAssignArcName(_ArcName, _DeviceName) ( \
- IoCreateSymbolicLink((_ArcName), (_DeviceName)))
-
-/*
- * VOID
- * IoDeassignArcName(
- * IN PUNICODE_STRING ArcName)
- */
-#define IoDeassignArcName IoDeleteSymbolicLink
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-#if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAllocateAdapterChannel(
- IN PADAPTER_OBJECT AdapterObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG NumberOfMapRegisters,
- IN PDRIVER_CONTROL ExecutionRoutine,
- IN PVOID Context);
-#endif
-
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-PHYSICAL_ADDRESS
-NTAPI
-IoMapTransfer(
- IN PADAPTER_OBJECT AdapterObject,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN OUT PULONG Length,
- IN BOOLEAN WriteToDevice);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoAllocateController(
- IN PCONTROLLER_OBJECT ControllerObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN PDRIVER_CONTROL ExecutionRoutine,
- IN PVOID Context OPTIONAL);
-
-NTKERNELAPI
-PCONTROLLER_OBJECT
-NTAPI
-IoCreateController(
- IN ULONG Size);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoDeleteController(
- IN PCONTROLLER_OBJECT ControllerObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeController(
- IN PCONTROLLER_OBJECT ControllerObject);
-
-NTKERNELAPI
-PCONFIGURATION_INFORMATION
-NTAPI
-IoGetConfigurationInformation(
- VOID);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetDeviceToVerify(
- IN PETHREAD Thread);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoCancelFileOpen(
- IN PDEVICE_OBJECT DeviceObject,
- IN PFILE_OBJECT FileObject);
-
-NTKERNELAPI
-PGENERIC_MAPPING
-NTAPI
-IoGetFileObjectGenericMapping(
- VOID);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoMakeAssociatedIrp(
- IN PIRP Irp,
- IN CCHAR StackSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoQueryDeviceDescription(
- IN PINTERFACE_TYPE BusType OPTIONAL,
- IN PULONG BusNumber OPTIONAL,
- IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
- IN PULONG ControllerNumber OPTIONAL,
- IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
- IN PULONG PeripheralNumber OPTIONAL,
- IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
- IN OUT PVOID Context OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRaiseHardError(
- IN PIRP Irp,
- IN PVPB Vpb OPTIONAL,
- IN PDEVICE_OBJECT RealDeviceObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoRaiseInformationalHardError(
- IN NTSTATUS ErrorStatus,
- IN PUNICODE_STRING String OPTIONAL,
- IN PKTHREAD Thread OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterBootDriverReinitialization(
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
- IN PVOID Context OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterDriverReinitialization(
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
- IN PVOID Context OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAttachDeviceByPointer(
- IN PDEVICE_OBJECT SourceDevice,
- IN PDEVICE_OBJECT TargetDevice);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportDetectedDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN INTERFACE_TYPE LegacyBusType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
- IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
- IN BOOLEAN ResourceAssigned,
- IN OUT PDEVICE_OBJECT *DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportResourceForDetection(
- IN PDRIVER_OBJECT DriverObject,
- IN PCM_RESOURCE_LIST DriverList OPTIONAL,
- IN ULONG DriverListSize OPTIONAL,
- IN PDEVICE_OBJECT DeviceObject OPTIONAL,
- IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
- IN ULONG DeviceListSize OPTIONAL,
- OUT PBOOLEAN ConflictDetected);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportResourceUsage(
- IN PUNICODE_STRING DriverClassName OPTIONAL,
- IN PDRIVER_OBJECT DriverObject,
- IN PCM_RESOURCE_LIST DriverList OPTIONAL,
- IN ULONG DriverListSize OPTIONAL,
- IN PDEVICE_OBJECT DeviceObject,
- IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
- IN ULONG DeviceListSize OPTIONAL,
- IN BOOLEAN OverrideConflict,
- OUT PBOOLEAN ConflictDetected);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoSetHardErrorOrVerifyDevice(
- IN PIRP Irp,
- IN PDEVICE_OBJECT DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAssignResources(
- IN PUNICODE_STRING RegistryPath,
- IN PUNICODE_STRING DriverClassName OPTIONAL,
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT DeviceObject OPTIONAL,
- IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
- IN OUT PCM_RESOURCE_LIST *AllocatedResources);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateDisk(
- IN PDEVICE_OBJECT DeviceObject,
- IN struct _CREATE_DISK* Disk OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReadDiskSignature(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG BytesPerSector,
- OUT PDISK_SIGNATURE Signature);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoReadPartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN BOOLEAN ReturnRecognizedPartitions,
- OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReadPartitionTableEx(
- IN PDEVICE_OBJECT DeviceObject,
- IN struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoSetPartitionInformation(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG PartitionNumber,
- IN ULONG PartitionType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetPartitionInformationEx(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG PartitionNumber,
- IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetSystemPartition(
- IN PUNICODE_STRING VolumeNameString);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoSetThreadHardErrorMode(
- IN BOOLEAN EnableHardErrors);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoVerifyPartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN BOOLEAN FixErrors);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoVolumeDeviceToDosName(
- IN PVOID VolumeDeviceObject,
- OUT PUNICODE_STRING DosName);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoWritePartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG SectorsPerTrack,
- IN ULONG NumberOfHeads,
- IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWritePartitionTableEx(
- IN PDEVICE_OBJECT DeviceObject,
- IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAttachDeviceToDeviceStackSafe(
- IN PDEVICE_OBJECT SourceDevice,
- IN PDEVICE_OBJECT TargetDevice,
- OUT PDEVICE_OBJECT *AttachedToDeviceObject);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
-
-/** Kernel debugger routines **/
-
-NTSYSAPI
-ULONG
-NTAPI
-DbgPrompt(
- IN PCCH Prompt,
- OUT PCH Response,
- IN ULONG MaximumResponseLength);
-
-/* Kernel Functions */
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-KeBugCheck(
- IN ULONG BugCheckCode);
-
-NTKERNELAPI
-LONG
-NTAPI
-KePulseEvent(
- IN OUT PRKEVENT Event,
- IN KPRIORITY Increment,
- IN BOOLEAN Wait);
-
-NTKERNELAPI
-LONG
-NTAPI
-KeSetBasePriorityThread(
- IN OUT PRKTHREAD Thread,
- IN LONG Increment);
-
-#endif
-
-/* Memory Manager Types */
-
-typedef struct _PHYSICAL_MEMORY_RANGE {
- PHYSICAL_ADDRESS BaseAddress;
- LARGE_INTEGER NumberOfBytes;
-} PHYSICAL_MEMORY_RANGE, *PPHYSICAL_MEMORY_RANGE;
-
-/* Memory Manager Functions */
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTKERNELAPI
-PPHYSICAL_MEMORY_RANGE
-NTAPI
-MmGetPhysicalMemoryRanges(
- VOID);
-
-NTKERNELAPI
-PHYSICAL_ADDRESS
-NTAPI
-MmGetPhysicalAddress(
- IN PVOID BaseAddress);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsNonPagedSystemAddressValid(
- IN PVOID VirtualAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateNonCachedMemory(
- IN SIZE_T NumberOfBytes);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeNonCachedMemory(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmGetVirtualForPhysical(
- IN PHYSICAL_ADDRESS PhysicalAddress);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapUserAddressesToPage(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes,
- IN PVOID PageAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapVideoDisplay(
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapViewInSessionSpace(
- IN PVOID Section,
- OUT PVOID *MappedBase,
- IN OUT PSIZE_T ViewSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapViewInSystemSpace(
- IN PVOID Section,
- OUT PVOID *MappedBase,
- IN OUT PSIZE_T ViewSize);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsAddressValid(
- IN PVOID VirtualAddress);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsThisAnNtAsSystem(
- VOID);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmLockPagableSectionByHandle(
- IN PVOID ImageSectionHandle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmUnmapViewInSessionSpace(
- IN PVOID MappedBase);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmUnmapViewInSystemSpace(
- IN PVOID MappedBase);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnsecureVirtualMemory(
- IN HANDLE SecureHandle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmRemovePhysicalMemory(
- IN PPHYSICAL_ADDRESS StartAddress,
- IN OUT PLARGE_INTEGER NumberOfBytes);
-
-NTKERNELAPI
-HANDLE
-NTAPI
-MmSecureVirtualMemory(
- IN PVOID Address,
- IN SIZE_T Size,
- IN ULONG ProbeMode);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnmapVideoDisplay(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
-/* NtXxx Functions */
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtOpenProcess(
- OUT PHANDLE ProcessHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN PCLIENT_ID ClientId OPTIONAL);
-
-NTSYSCALLAPI
-NTSTATUS
-NTAPI
-NtQueryInformationProcess(
- IN HANDLE ProcessHandle,
- IN PROCESSINFOCLASS ProcessInformationClass,
- OUT PVOID ProcessInformation OPTIONAL,
- IN ULONG ProcessInformationLength,
- OUT PULONG ReturnLength OPTIONAL);
-
-/** Process manager types **/
-
-typedef VOID
-(NTAPI *PCREATE_PROCESS_NOTIFY_ROUTINE)(
- IN HANDLE ParentId,
- IN HANDLE ProcessId,
- IN BOOLEAN Create);
-
-typedef VOID
-(NTAPI *PCREATE_THREAD_NOTIFY_ROUTINE)(
- IN HANDLE ProcessId,
- IN HANDLE ThreadId,
- IN BOOLEAN Create);
-
-typedef VOID
-(NTAPI *PLOAD_IMAGE_NOTIFY_ROUTINE)(
- IN PUNICODE_STRING FullImageName,
- IN HANDLE ProcessId,
- IN PIMAGE_INFO ImageInfo);
-
-/** Process manager routines **/
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsSetLoadImageNotifyRoutine(
- IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsSetCreateThreadNotifyRoutine(
- IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsSetCreateProcessNotifyRoutine(
- IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
- IN BOOLEAN Remove);
-
-NTKERNELAPI
-HANDLE
-NTAPI
-PsGetCurrentProcessId(
- VOID);
-
-NTKERNELAPI
-HANDLE
-NTAPI
-PsGetCurrentThreadId(
- VOID);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-PsGetVersion(
- OUT PULONG MajorVersion OPTIONAL,
- OUT PULONG MinorVersion OPTIONAL,
- OUT PULONG BuildNumber OPTIONAL,
- OUT PUNICODE_STRING CSDVersion OPTIONAL);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-
-NTKERNELAPI
-HANDLE
-NTAPI
-PsGetProcessId(
- IN PEPROCESS Process);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsRemoveCreateThreadNotifyRoutine(
- IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsRemoveLoadImageNotifyRoutine(
- IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+typedef struct _PROCESS_HANDLE_TRACING_ENABLE {
+ ULONG Flags;
+} PROCESS_HANDLE_TRACING_ENABLE, *PPROCESS_HANDLE_TRACING_ENABLE;
+
+typedef struct _PROCESS_HANDLE_TRACING_ENABLE_EX {
+ ULONG Flags;
+ ULONG TotalSlots;
+} PROCESS_HANDLE_TRACING_ENABLE_EX, *PPROCESS_HANDLE_TRACING_ENABLE_EX;
+
+typedef struct _PROCESS_HANDLE_TRACING_ENTRY {
+ HANDLE Handle;
+ CLIENT_ID ClientId;
+ ULONG Type;
+ PVOID Stacks[PROCESS_HANDLE_TRACING_MAX_STACKS];
+} PROCESS_HANDLE_TRACING_ENTRY, *PPROCESS_HANDLE_TRACING_ENTRY;
+
+typedef struct _PROCESS_HANDLE_TRACING_QUERY {
+ HANDLE Handle;
+ ULONG TotalTraces;
+ PROCESS_HANDLE_TRACING_ENTRY HandleTrace[1];
+} PROCESS_HANDLE_TRACING_QUERY, *PPROCESS_HANDLE_TRACING_QUERY;
extern NTKERNELAPI PEPROCESS PsInitialSystemProcess;
-/* RTL Types */
-typedef struct _RTL_SPLAY_LINKS {
- struct _RTL_SPLAY_LINKS *Parent;
- struct _RTL_SPLAY_LINKS *LeftChild;
- struct _RTL_SPLAY_LINKS *RightChild;
-} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
+/******************************************************************************
+ * Runtime Library Types *
+ ******************************************************************************/
-/* RTL Functions */
-#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
+#ifndef _RTL_RUN_ONCE_DEF
+#define _RTL_RUN_ONCE_DEF
-#define RtlGetCallersAddress(CallersAddress, CallersCaller) \
- *CallersAddress = (PVOID)_ReturnAddress(); \
- *CallersCaller = NULL;
-#else
+#define RTL_RUN_ONCE_INIT {0}
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTSYSAPI
-VOID
-NTAPI
-RtlGetCallersAddress(
- OUT PVOID *CallersAddress,
- OUT PVOID *CallersCaller);
-#endif
+#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001UL
+#define RTL_RUN_ONCE_ASYNC 0x00000002UL
+#define RTL_RUN_ONCE_INIT_FAILED 0x00000004UL
-#endif
+#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
-#if !defined(MIDL_PASS)
+#define RTL_HASH_ALLOCATED_HEADER 0x00000001
-FORCEINLINE
-LUID
-NTAPI_INLINE
-RtlConvertLongToLuid(
- IN LONG Val)
-{
- LUID Luid;
- LARGE_INTEGER Temp;
+#define RTL_HASH_RESERVED_SIGNATURE 0
- Temp.QuadPart = Val;
- Luid.LowPart = Temp.u.LowPart;
- Luid.HighPart = Temp.u.HighPart;
- return Luid;
-}
+/* RtlVerifyVersionInfo() ComparisonType */
-FORCEINLINE
-LUID
-NTAPI_INLINE
-RtlConvertUlongToLuid(
- IN ULONG Val)
-{
- LUID Luid;
+#define VER_EQUAL 1
+#define VER_GREATER 2
+#define VER_GREATER_EQUAL 3
+#define VER_LESS 4
+#define VER_LESS_EQUAL 5
+#define VER_AND 6
+#define VER_OR 7
- Luid.LowPart = Val;
- Luid.HighPart = 0;
- return Luid;
-}
+#define VER_CONDITION_MASK 7
+#define VER_NUM_BITS_PER_CONDITION_MASK 3
-#endif
+/* RtlVerifyVersionInfo() TypeMask */
-#if defined(_AMD64_) || defined(_IA64_)
-//DECLSPEC_DEPRECATED_DDK_WINXP
-__inline
-LARGE_INTEGER
-NTAPI_INLINE
-RtlLargeIntegerDivide(
- IN LARGE_INTEGER Dividend,
- IN LARGE_INTEGER Divisor,
- OUT PLARGE_INTEGER Remainder OPTIONAL)
-{
- LARGE_INTEGER ret;
- ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
- if (Remainder)
- Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
- return ret;
-}
+#define VER_MINORVERSION 0x0000001
+#define VER_MAJORVERSION 0x0000002
+#define VER_BUILDNUMBER 0x0000004
+#define VER_PLATFORMID 0x0000008
+#define VER_SERVICEPACKMINOR 0x0000010
+#define VER_SERVICEPACKMAJOR 0x0000020
+#define VER_SUITENAME 0x0000040
+#define VER_PRODUCT_TYPE 0x0000080
-#else
+#define VER_NT_WORKSTATION 0x0000001
+#define VER_NT_DOMAIN_CONTROLLER 0x0000002
+#define VER_NT_SERVER 0x0000003
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTSYSAPI
-LARGE_INTEGER
-NTAPI
-RtlLargeIntegerDivide(
- IN LARGE_INTEGER Dividend,
- IN LARGE_INTEGER Divisor,
- OUT PLARGE_INTEGER Remainder OPTIONAL);
-#endif
+#define VER_PLATFORM_WIN32s 0
+#define VER_PLATFORM_WIN32_WINDOWS 1
+#define VER_PLATFORM_WIN32_NT 2
-#endif /* defined(_AMD64_) || defined(_IA64_) */
+typedef union _RTL_RUN_ONCE {
+ PVOID Ptr;
+} RTL_RUN_ONCE, *PRTL_RUN_ONCE;
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
+typedef ULONG /* LOGICAL */
+(NTAPI *PRTL_RUN_ONCE_INIT_FN) (
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN OUT PVOID Parameter OPTIONAL,
+ IN OUT PVOID *Context OPTIONAL);
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlPrefixUnicodeString(
- IN PCUNICODE_STRING String1,
- IN PCUNICODE_STRING String2,
- IN BOOLEAN CaseInSensitive);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlUpperString(
- IN OUT PSTRING DestinationString,
- IN const PSTRING SourceString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlMapGenericMask(
- IN OUT PACCESS_MASK AccessMask,
- IN PGENERIC_MAPPING GenericMapping);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVolumeDeviceToDosName(
- IN PVOID VolumeDeviceObject,
- OUT PUNICODE_STRING DosName);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetVersion(
- IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVerifyVersionInfo(
- IN PRTL_OSVERSIONINFOEXW VersionInfo,
- IN ULONG TypeMask,
- IN ULONGLONG ConditionMask);
-
-NTSYSAPI
-LONG
-NTAPI
-RtlCompareString(
- IN const PSTRING String1,
- IN const PSTRING String2,
- BOOLEAN CaseInSensitive);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyString(
- OUT PSTRING DestinationString,
- IN const PSTRING SourceString OPTIONAL);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlEqualString(
- IN const PSTRING String1,
- IN const PSTRING String2,
- IN BOOLEAN CaseInSensitive);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCharToInteger(
- IN PCSZ String,
- IN ULONG Base OPTIONAL,
- OUT PULONG Value);
-
-NTSYSAPI
-CHAR
-NTAPI
-RtlUpperChar(
- IN CHAR Character);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlWalkFrameChain(
- OUT PVOID *Callers,
- IN ULONG Count,
- IN ULONG Flags);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
-/* Security reference monitor routines */
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTKERNELAPI
-BOOLEAN
-NTAPI
-SeSinglePrivilegeCheck(
- IN LUID PrivilegeValue,
- IN KPROCESSOR_MODE PreviousMode);
-#endif
-
-/* ZwXxx Functions */
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTSTATUS
-NTAPI
-ZwCancelTimer(
- IN HANDLE TimerHandle,
- OUT PBOOLEAN CurrentState OPTIONAL);
-
-NTSTATUS
-NTAPI
-ZwCreateTimer(
- OUT PHANDLE TimerHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
- IN TIMER_TYPE TimerType);
-
-NTSTATUS
-NTAPI
-ZwOpenTimer(
- OUT PHANDLE TimerHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetInformationThread(
- IN HANDLE ThreadHandle,
- IN THREADINFOCLASS ThreadInformationClass,
- IN PVOID ThreadInformation,
- IN ULONG ThreadInformationLength);
-
-NTSTATUS
-NTAPI
-ZwSetTimer(
- IN HANDLE TimerHandle,
- IN PLARGE_INTEGER DueTime,
- IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
- IN PVOID TimerContext OPTIONAL,
- IN BOOLEAN ResumeTimer,
- IN LONG Period OPTIONAL,
- OUT PBOOLEAN PreviousState OPTIONAL);
-
-#endif
-
-typedef struct _QUOTA_LIMITS {
- SIZE_T PagedPoolLimit;
- SIZE_T NonPagedPoolLimit;
- SIZE_T MinimumWorkingSetSize;
- SIZE_T MaximumWorkingSetSize;
- SIZE_T PagefileLimit;
- LARGE_INTEGER TimeLimit;
-} QUOTA_LIMITS, *PQUOTA_LIMITS;
-
-struct _RTL_GENERIC_COMPARE_ROUTINE;
-struct _RTL_GENERIC_ALLOCATE_ROUTINE;
-struct _RTL_GENERIC_FREE_ROUTINE;
-
-typedef struct _RTL_GENERIC_TABLE {
- PRTL_SPLAY_LINKS TableRoot;
- LIST_ENTRY InsertOrderList;
- PLIST_ENTRY OrderedPointer;
- ULONG WhichOrderedElement;
- ULONG NumberGenericTableElements;
- struct _RTL_GENERIC_COMPARE_ROUTINE *CompareRoutine;
- struct _RTL_GENERIC_ALLOCATE_ROUTINE *AllocateRoutine;
- struct _RTL_GENERIC_FREE_ROUTINE *FreeRoutine;
- PVOID TableContext;
-} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
+#endif /* _RTL_RUN_ONCE_DEF */
typedef enum _TABLE_SEARCH_RESULT {
TableEmptyTree,
@@ -2989,43 +2680,6 @@ typedef enum _TABLE_SEARCH_RESULT {
TableInsertAsRight
} TABLE_SEARCH_RESULT;
-typedef struct _FILE_FS_SIZE_INFORMATION {
- LARGE_INTEGER TotalAllocationUnits;
- LARGE_INTEGER AvailableAllocationUnits;
- ULONG SectorsPerAllocationUnit;
- ULONG BytesPerSector;
-} FILE_FS_SIZE_INFORMATION, *PFILE_FS_SIZE_INFORMATION;
-
-#define IO_CHECK_CREATE_PARAMETERS 0x0200
-#define IO_ATTACH_DEVICE 0x0400
-#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
-
-typedef struct _FILE_FS_VOLUME_INFORMATION {
- LARGE_INTEGER VolumeCreationTime;
- ULONG VolumeSerialNumber;
- ULONG VolumeLabelLength;
- BOOLEAN SupportsObjects;
- WCHAR VolumeLabel[1];
-} FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION;
-
-typedef struct _FILE_FS_FULL_SIZE_INFORMATION {
- LARGE_INTEGER TotalAllocationUnits;
- LARGE_INTEGER CallerAvailableAllocationUnits;
- LARGE_INTEGER ActualAvailableAllocationUnits;
- ULONG SectorsPerAllocationUnit;
- ULONG BytesPerSector;
-} FILE_FS_FULL_SIZE_INFORMATION, *PFILE_FS_FULL_SIZE_INFORMATION;
-
-typedef struct _FILE_FS_OBJECTID_INFORMATION {
- UCHAR ObjectId[16];
- UCHAR ExtendedInfo[48];
-} FILE_FS_OBJECTID_INFORMATION, *PFILE_FS_OBJECTID_INFORMATION;
-
-typedef struct _FILE_FS_LABEL_INFORMATION {
- ULONG VolumeLabelLength;
- WCHAR VolumeLabel[1];
-} FILE_FS_LABEL_INFORMATION, *PFILE_FS_LABEL_INFORMATION;
-
typedef enum _RTL_GENERIC_COMPARE_RESULTS {
GenericLessThan,
GenericGreaterThan,
@@ -3099,8 +2753,2270 @@ typedef VOID
IN struct _RTL_GENERIC_TABLE *Table,
IN PVOID Buffer);
+typedef struct _RTL_SPLAY_LINKS {
+ struct _RTL_SPLAY_LINKS *Parent;
+ struct _RTL_SPLAY_LINKS *LeftChild;
+ struct _RTL_SPLAY_LINKS *RightChild;
+} RTL_SPLAY_LINKS, *PRTL_SPLAY_LINKS;
+
+typedef struct _RTL_GENERIC_TABLE {
+ PRTL_SPLAY_LINKS TableRoot;
+ LIST_ENTRY InsertOrderList;
+ PLIST_ENTRY OrderedPointer;
+ ULONG WhichOrderedElement;
+ ULONG NumberGenericTableElements;
+ PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine;
+ PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine;
+ PRTL_GENERIC_FREE_ROUTINE FreeRoutine;
+ PVOID TableContext;
+} RTL_GENERIC_TABLE, *PRTL_GENERIC_TABLE;
+
#endif /* !RTL_USE_AVL_TABLES */
+#ifdef RTL_USE_AVL_TABLES
+
+#undef PRTL_GENERIC_COMPARE_ROUTINE
+#undef RTL_GENERIC_COMPARE_ROUTINE
+#undef PRTL_GENERIC_ALLOCATE_ROUTINE
+#undef RTL_GENERIC_ALLOCATE_ROUTINE
+#undef PRTL_GENERIC_FREE_ROUTINE
+#undef RTL_GENERIC_FREE_ROUTINE
+#undef RTL_GENERIC_TABLE
+#undef PRTL_GENERIC_TABLE
+
+#define PRTL_GENERIC_COMPARE_ROUTINE PRTL_AVL_COMPARE_ROUTINE
+#define RTL_GENERIC_COMPARE_ROUTINE RTL_AVL_COMPARE_ROUTINE
+#define PRTL_GENERIC_ALLOCATE_ROUTINE PRTL_AVL_ALLOCATE_ROUTINE
+#define RTL_GENERIC_ALLOCATE_ROUTINE RTL_AVL_ALLOCATE_ROUTINE
+#define PRTL_GENERIC_FREE_ROUTINE PRTL_AVL_FREE_ROUTINE
+#define RTL_GENERIC_FREE_ROUTINE RTL_AVL_FREE_ROUTINE
+#define RTL_GENERIC_TABLE RTL_AVL_TABLE
+#define PRTL_GENERIC_TABLE PRTL_AVL_TABLE
+
+#endif /* RTL_USE_AVL_TABLES */
+
+typedef struct _RTL_DYNAMIC_HASH_TABLE_ENTRY {
+ LIST_ENTRY Linkage;
+ ULONG_PTR Signature;
+} RTL_DYNAMIC_HASH_TABLE_ENTRY, *PRTL_DYNAMIC_HASH_TABLE_ENTRY;
+
+typedef struct _RTL_DYNAMIC_HASH_TABLE_CONTEXT {
+ PLIST_ENTRY ChainHead;
+ PLIST_ENTRY PrevLinkage;
+ ULONG_PTR Signature;
+} RTL_DYNAMIC_HASH_TABLE_CONTEXT, *PRTL_DYNAMIC_HASH_TABLE_CONTEXT;
+
+typedef struct _RTL_DYNAMIC_HASH_TABLE_ENUMERATOR {
+ RTL_DYNAMIC_HASH_TABLE_ENTRY HashEntry;
+ PLIST_ENTRY ChainHead;
+ ULONG BucketIndex;
+} RTL_DYNAMIC_HASH_TABLE_ENUMERATOR, *PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR;
+
+typedef struct _RTL_DYNAMIC_HASH_TABLE {
+ ULONG Flags;
+ ULONG Shift;
+ ULONG TableSize;
+ ULONG Pivot;
+ ULONG DivisorMask;
+ ULONG NumEntries;
+ ULONG NonEmptyBuckets;
+ ULONG NumEnumerators;
+ PVOID Directory;
+} RTL_DYNAMIC_HASH_TABLE, *PRTL_DYNAMIC_HASH_TABLE;
+
+typedef struct _OSVERSIONINFOA {
+ ULONG dwOSVersionInfoSize;
+ ULONG dwMajorVersion;
+ ULONG dwMinorVersion;
+ ULONG dwBuildNumber;
+ ULONG dwPlatformId;
+ CHAR szCSDVersion[128];
+} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
+
+typedef struct _OSVERSIONINFOW {
+ ULONG dwOSVersionInfoSize;
+ ULONG dwMajorVersion;
+ ULONG dwMinorVersion;
+ ULONG dwBuildNumber;
+ ULONG dwPlatformId;
+ WCHAR szCSDVersion[128];
+} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
+
+typedef struct _OSVERSIONINFOEXA {
+ ULONG dwOSVersionInfoSize;
+ ULONG dwMajorVersion;
+ ULONG dwMinorVersion;
+ ULONG dwBuildNumber;
+ ULONG dwPlatformId;
+ CHAR szCSDVersion[128];
+ USHORT wServicePackMajor;
+ USHORT wServicePackMinor;
+ USHORT wSuiteMask;
+ UCHAR wProductType;
+ UCHAR wReserved;
+} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
+
+typedef struct _OSVERSIONINFOEXW {
+ ULONG dwOSVersionInfoSize;
+ ULONG dwMajorVersion;
+ ULONG dwMinorVersion;
+ ULONG dwBuildNumber;
+ ULONG dwPlatformId;
+ WCHAR szCSDVersion[128];
+ USHORT wServicePackMajor;
+ USHORT wServicePackMinor;
+ USHORT wSuiteMask;
+ UCHAR wProductType;
+ UCHAR wReserved;
+} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
+
+#ifdef UNICODE
+typedef OSVERSIONINFOEXW OSVERSIONINFOEX;
+typedef POSVERSIONINFOEXW POSVERSIONINFOEX;
+typedef LPOSVERSIONINFOEXW LPOSVERSIONINFOEX;
+typedef OSVERSIONINFOW OSVERSIONINFO;
+typedef POSVERSIONINFOW POSVERSIONINFO;
+typedef LPOSVERSIONINFOW LPOSVERSIONINFO;
+#else
+typedef OSVERSIONINFOEXA OSVERSIONINFOEX;
+typedef POSVERSIONINFOEXA POSVERSIONINFOEX;
+typedef LPOSVERSIONINFOEXA LPOSVERSIONINFOEX;
+typedef OSVERSIONINFOA OSVERSIONINFO;
+typedef POSVERSIONINFOA POSVERSIONINFO;
+typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
+#endif /* UNICODE */
+
+#define HASH_ENTRY_KEY(x) ((x)->Signature)
+
+/******************************************************************************
+ * Security Manager Types *
+ ******************************************************************************/
+#define SE_UNSOLICITED_INPUT_PRIVILEGE 6
+
+typedef enum _WELL_KNOWN_SID_TYPE {
+ WinNullSid = 0,
+ WinWorldSid = 1,
+ WinLocalSid = 2,
+ WinCreatorOwnerSid = 3,
+ WinCreatorGroupSid = 4,
+ WinCreatorOwnerServerSid = 5,
+ WinCreatorGroupServerSid = 6,
+ WinNtAuthoritySid = 7,
+ WinDialupSid = 8,
+ WinNetworkSid = 9,
+ WinBatchSid = 10,
+ WinInteractiveSid = 11,
+ WinServiceSid = 12,
+ WinAnonymousSid = 13,
+ WinProxySid = 14,
+ WinEnterpriseControllersSid = 15,
+ WinSelfSid = 16,
+ WinAuthenticatedUserSid = 17,
+ WinRestrictedCodeSid = 18,
+ WinTerminalServerSid = 19,
+ WinRemoteLogonIdSid = 20,
+ WinLogonIdsSid = 21,
+ WinLocalSystemSid = 22,
+ WinLocalServiceSid = 23,
+ WinNetworkServiceSid = 24,
+ WinBuiltinDomainSid = 25,
+ WinBuiltinAdministratorsSid = 26,
+ WinBuiltinUsersSid = 27,
+ WinBuiltinGuestsSid = 28,
+ WinBuiltinPowerUsersSid = 29,
+ WinBuiltinAccountOperatorsSid = 30,
+ WinBuiltinSystemOperatorsSid = 31,
+ WinBuiltinPrintOperatorsSid = 32,
+ WinBuiltinBackupOperatorsSid = 33,
+ WinBuiltinReplicatorSid = 34,
+ WinBuiltinPreWindows2000CompatibleAccessSid = 35,
+ WinBuiltinRemoteDesktopUsersSid = 36,
+ WinBuiltinNetworkConfigurationOperatorsSid = 37,
+ WinAccountAdministratorSid = 38,
+ WinAccountGuestSid = 39,
+ WinAccountKrbtgtSid = 40,
+ WinAccountDomainAdminsSid = 41,
+ WinAccountDomainUsersSid = 42,
+ WinAccountDomainGuestsSid = 43,
+ WinAccountComputersSid = 44,
+ WinAccountControllersSid = 45,
+ WinAccountCertAdminsSid = 46,
+ WinAccountSchemaAdminsSid = 47,
+ WinAccountEnterpriseAdminsSid = 48,
+ WinAccountPolicyAdminsSid = 49,
+ WinAccountRasAndIasServersSid = 50,
+ WinNTLMAuthenticationSid = 51,
+ WinDigestAuthenticationSid = 52,
+ WinSChannelAuthenticationSid = 53,
+ WinThisOrganizationSid = 54,
+ WinOtherOrganizationSid = 55,
+ WinBuiltinIncomingForestTrustBuildersSid = 56,
+ WinBuiltinPerfMonitoringUsersSid = 57,
+ WinBuiltinPerfLoggingUsersSid = 58,
+ WinBuiltinAuthorizationAccessSid = 59,
+ WinBuiltinTerminalServerLicenseServersSid = 60,
+ WinBuiltinDCOMUsersSid = 61,
+ WinBuiltinIUsersSid = 62,
+ WinIUserSid = 63,
+ WinBuiltinCryptoOperatorsSid = 64,
+ WinUntrustedLabelSid = 65,
+ WinLowLabelSid = 66,
+ WinMediumLabelSid = 67,
+ WinHighLabelSid = 68,
+ WinSystemLabelSid = 69,
+ WinWriteRestrictedCodeSid = 70,
+ WinCreatorOwnerRightsSid = 71,
+ WinCacheablePrincipalsGroupSid = 72,
+ WinNonCacheablePrincipalsGroupSid = 73,
+ WinEnterpriseReadonlyControllersSid = 74,
+ WinAccountReadonlyControllersSid = 75,
+ WinBuiltinEventLogReadersGroup = 76,
+ WinNewEnterpriseReadonlyControllersSid = 77,
+ WinBuiltinCertSvcDComAccessGroup = 78,
+ WinMediumPlusLabelSid = 79,
+ WinLocalLogonSid = 80,
+ WinConsoleLogonSid = 81,
+ WinThisOrganizationCertificateSid = 82,
+} WELL_KNOWN_SID_TYPE;
+
+#if defined(_M_IX86)
+
+#define PAUSE_PROCESSOR YieldProcessor();
+
+#define KERNEL_STACK_SIZE 12288
+#define KERNEL_LARGE_STACK_SIZE 61440
+#define KERNEL_LARGE_STACK_COMMIT 12288
+
+#define SIZE_OF_80387_REGISTERS 80
+
+#if !defined(RC_INVOKED)
+
+#define CONTEXT_i386 0x10000
+#define CONTEXT_i486 0x10000
+#define CONTEXT_CONTROL (CONTEXT_i386|0x00000001L)
+#define CONTEXT_INTEGER (CONTEXT_i386|0x00000002L)
+#define CONTEXT_SEGMENTS (CONTEXT_i386|0x00000004L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_i386|0x00000008L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_i386|0x00000010L)
+#define CONTEXT_EXTENDED_REGISTERS (CONTEXT_i386|0x00000020L)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL|CONTEXT_INTEGER|CONTEXT_SEGMENTS)
+#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | \
+ CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS | \
+ CONTEXT_EXTENDED_REGISTERS)
+
+#define CONTEXT_XSTATE (CONTEXT_i386 | 0x00000040L)
+
+#endif /* !defined(RC_INVOKED) */
+
+typedef struct _FLOATING_SAVE_AREA {
+ ULONG ControlWord;
+ ULONG StatusWord;
+ ULONG TagWord;
+ ULONG ErrorOffset;
+ ULONG ErrorSelector;
+ ULONG DataOffset;
+ ULONG DataSelector;
+ UCHAR RegisterArea[SIZE_OF_80387_REGISTERS];
+ ULONG Cr0NpxState;
+} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
+
+#include "pshpack4.h"
+typedef struct _CONTEXT {
+ ULONG ContextFlags;
+ ULONG Dr0;
+ ULONG Dr1;
+ ULONG Dr2;
+ ULONG Dr3;
+ ULONG Dr6;
+ ULONG Dr7;
+ FLOATING_SAVE_AREA FloatSave;
+ ULONG SegGs;
+ ULONG SegFs;
+ ULONG SegEs;
+ ULONG SegDs;
+ ULONG Edi;
+ ULONG Esi;
+ ULONG Ebx;
+ ULONG Edx;
+ ULONG Ecx;
+ ULONG Eax;
+ ULONG Ebp;
+ ULONG Eip;
+ ULONG SegCs;
+ ULONG EFlags;
+ ULONG Esp;
+ ULONG SegSs;
+ UCHAR ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
+} CONTEXT;
+#include "poppack.h"
+
+#define KeGetPcr() PCR
+
+#define PCR_MINOR_VERSION 1
+#define PCR_MAJOR_VERSION 1
+
+typedef struct _KPCR {
+ union {
+ NT_TIB NtTib;
+ struct {
+ struct _EXCEPTION_REGISTRATION_RECORD *Used_ExceptionList;
+ PVOID Used_StackBase;
+ PVOID Spare2;
+ PVOID TssCopy;
+ ULONG ContextSwitches;
+ KAFFINITY SetMemberCopy;
+ PVOID Used_Self;
+ };
+ };
+ struct _KPCR *SelfPcr;
+ struct _KPRCB *Prcb;
+ KIRQL Irql;
+ ULONG IRR;
+ ULONG IrrActive;
+ ULONG IDR;
+ PVOID KdVersionBlock;
+ struct _KIDTENTRY *IDT;
+ struct _KGDTENTRY *GDT;
+ struct _KTSS *TSS;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ KAFFINITY SetMember;
+ ULONG StallScaleFactor;
+ UCHAR SpareUnused;
+ UCHAR Number;
+ UCHAR Spare0;
+ UCHAR SecondLevelCacheAssociativity;
+ ULONG VdmAlert;
+ ULONG KernelReserved[14];
+ ULONG SecondLevelCacheSize;
+ ULONG HalReserved[16];
+} KPCR, *PKPCR;
+
+FORCEINLINE
+ULONG
+KeGetCurrentProcessorNumber(VOID)
+{
+ return (ULONG)__readfsbyte(FIELD_OFFSET(KPCR, Number));
+}
+
+
+
+
+
+
+extern NTKERNELAPI PVOID MmHighestUserAddress;
+extern NTKERNELAPI PVOID MmSystemRangeStart;
+extern NTKERNELAPI ULONG MmUserProbeAddress;
+
+#define MM_HIGHEST_USER_ADDRESS MmHighestUserAddress
+#define MM_SYSTEM_RANGE_START MmSystemRangeStart
+#if defined(_LOCAL_COPY_USER_PROBE_ADDRESS_)
+#define MM_USER_PROBE_ADDRESS _LOCAL_COPY_USER_PROBE_ADDRESS_
+extern ULONG _LOCAL_COPY_USER_PROBE_ADDRESS_;
+#else
+#define MM_USER_PROBE_ADDRESS MmUserProbeAddress
+#endif
+#define MM_LOWEST_USER_ADDRESS (PVOID)0x10000
+#define MM_KSEG0_BASE MM_SYSTEM_RANGE_START
+#define MM_SYSTEM_SPACE_END 0xFFFFFFFF
+#if !defined (_X86PAE_)
+#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0800000
+#else
+#define MM_LOWEST_SYSTEM_ADDRESS (PVOID)0xC0C00000
+#endif
+
+#elif defined(_M_AMD64)
+
+#define PAUSE_PROCESSOR YieldProcessor();
+
+#define KERNEL_STACK_SIZE 0x6000
+#define KERNEL_LARGE_STACK_SIZE 0x12000
+#define KERNEL_LARGE_STACK_COMMIT KERNEL_STACK_SIZE
+
+#define KERNEL_MCA_EXCEPTION_STACK_SIZE 0x2000
+
+#define EXCEPTION_READ_FAULT 0
+#define EXCEPTION_WRITE_FAULT 1
+#define EXCEPTION_EXECUTE_FAULT 8
+
+#if !defined(RC_INVOKED)
+
+#define CONTEXT_AMD64 0x100000
+
+#define CONTEXT_CONTROL (CONTEXT_AMD64 | 0x1L)
+#define CONTEXT_INTEGER (CONTEXT_AMD64 | 0x2L)
+#define CONTEXT_SEGMENTS (CONTEXT_AMD64 | 0x4L)
+#define CONTEXT_FLOATING_POINT (CONTEXT_AMD64 | 0x8L)
+#define CONTEXT_DEBUG_REGISTERS (CONTEXT_AMD64 | 0x10L)
+
+#define CONTEXT_FULL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_FLOATING_POINT)
+#define CONTEXT_ALL (CONTEXT_CONTROL | CONTEXT_INTEGER | CONTEXT_SEGMENTS | CONTEXT_FLOATING_POINT | CONTEXT_DEBUG_REGISTERS)
+
+#define CONTEXT_XSTATE (CONTEXT_AMD64 | 0x20L)
+
+#define CONTEXT_EXCEPTION_ACTIVE 0x8000000
+#define CONTEXT_SERVICE_ACTIVE 0x10000000
+#define CONTEXT_EXCEPTION_REQUEST 0x40000000
+#define CONTEXT_EXCEPTION_REPORTING 0x80000000
+
+#endif /* !defined(RC_INVOKED) */
+
+#define INITIAL_MXCSR 0x1f80
+#define INITIAL_FPCSR 0x027f
+
+typedef struct DECLSPEC_ALIGN(16) _CONTEXT {
+ ULONG64 P1Home;
+ ULONG64 P2Home;
+ ULONG64 P3Home;
+ ULONG64 P4Home;
+ ULONG64 P5Home;
+ ULONG64 P6Home;
+ ULONG ContextFlags;
+ ULONG MxCsr;
+ USHORT SegCs;
+ USHORT SegDs;
+ USHORT SegEs;
+ USHORT SegFs;
+ USHORT SegGs;
+ USHORT SegSs;
+ ULONG EFlags;
+ ULONG64 Dr0;
+ ULONG64 Dr1;
+ ULONG64 Dr2;
+ ULONG64 Dr3;
+ ULONG64 Dr6;
+ ULONG64 Dr7;
+ ULONG64 Rax;
+ ULONG64 Rcx;
+ ULONG64 Rdx;
+ ULONG64 Rbx;
+ ULONG64 Rsp;
+ ULONG64 Rbp;
+ ULONG64 Rsi;
+ ULONG64 Rdi;
+ ULONG64 R8;
+ ULONG64 R9;
+ ULONG64 R10;
+ ULONG64 R11;
+ ULONG64 R12;
+ ULONG64 R13;
+ ULONG64 R14;
+ ULONG64 R15;
+ ULONG64 Rip;
+ union {
+ XMM_SAVE_AREA32 FltSave;
+ struct {
+ M128A Header[2];
+ M128A Legacy[8];
+ M128A Xmm0;
+ M128A Xmm1;
+ M128A Xmm2;
+ M128A Xmm3;
+ M128A Xmm4;
+ M128A Xmm5;
+ M128A Xmm6;
+ M128A Xmm7;
+ M128A Xmm8;
+ M128A Xmm9;
+ M128A Xmm10;
+ M128A Xmm11;
+ M128A Xmm12;
+ M128A Xmm13;
+ M128A Xmm14;
+ M128A Xmm15;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ M128A VectorRegister[26];
+ ULONG64 VectorControl;
+ ULONG64 DebugControl;
+ ULONG64 LastBranchToRip;
+ ULONG64 LastBranchFromRip;
+ ULONG64 LastExceptionToRip;
+ ULONG64 LastExceptionFromRip;
+} CONTEXT;
+
+#define PCR_MINOR_VERSION 1
+#define PCR_MAJOR_VERSION 1
+
+typedef struct _KPCR
+{
+ _ANONYMOUS_UNION union
+ {
+ NT_TIB NtTib;
+ _ANONYMOUS_STRUCT struct
+ {
+ union _KGDTENTRY64 *GdtBase;
+ struct _KTSS64 *TssBase;
+ ULONG64 UserRsp;
+ struct _KPCR *Self;
+ struct _KPRCB *CurrentPrcb;
+ PKSPIN_LOCK_QUEUE LockArray;
+ PVOID Used_Self;
+ };
+ };
+ union _KIDTENTRY64 *IdtBase;
+ ULONG64 Unused[2];
+ KIRQL Irql;
+ UCHAR SecondLevelCacheAssociativity;
+ UCHAR ObsoleteNumber;
+ UCHAR Fill0;
+ ULONG Unused0[3];
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ ULONG StallScaleFactor;
+ PVOID Unused1[3];
+ ULONG KernelReserved[15];
+ ULONG SecondLevelCacheSize;
+ ULONG HalReserved[16];
+ ULONG Unused2;
+ PVOID KdVersionBlock;
+ PVOID Unused3;
+ ULONG PcrAlign1[24];
+} KPCR, *PKPCR;
+
+FORCEINLINE
+PKPCR
+KeGetPcr(VOID)
+{
+ return (PKPCR)__readgsqword(FIELD_OFFSET(KPCR, Self));
+}
+
+FORCEINLINE
+ULONG
+KeGetCurrentProcessorNumber(VOID)
+{
+ return (ULONG)__readgsword(0x184);
+}
+
+
+#define PTI_SHIFT 12L
+#define PDI_SHIFT 21L
+#define PPI_SHIFT 30L
+#define PXI_SHIFT 39L
+#define PTE_PER_PAGE 512
+#define PDE_PER_PAGE 512
+#define PPE_PER_PAGE 512
+#define PXE_PER_PAGE 512
+#define PTI_MASK_AMD64 (PTE_PER_PAGE - 1)
+#define PDI_MASK_AMD64 (PDE_PER_PAGE - 1)
+#define PPI_MASK (PPE_PER_PAGE - 1)
+#define PXI_MASK (PXE_PER_PAGE - 1)
+
+#define PXE_BASE 0xFFFFF6FB7DBED000ULL
+#define PXE_SELFMAP 0xFFFFF6FB7DBEDF68ULL
+#define PPE_BASE 0xFFFFF6FB7DA00000ULL
+#define PDE_BASE 0xFFFFF6FB40000000ULL
+#define PTE_BASE 0xFFFFF68000000000ULL
+#define PXE_TOP 0xFFFFF6FB7DBEDFFFULL
+#define PPE_TOP 0xFFFFF6FB7DBFFFFFULL
+#define PDE_TOP 0xFFFFF6FB7FFFFFFFULL
+#define PTE_TOP 0xFFFFF6FFFFFFFFFFULL
+
+extern NTKERNELAPI PVOID MmHighestUserAddress;
+extern NTKERNELAPI PVOID MmSystemRangeStart;
+extern NTKERNELAPI ULONG64 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)0xFFFF080000000000ULL
+
+
+#elif defined(_M_IA64)
+
+#elif defined(_M_PPC)
+
+
+#elif defined(_M_MIPS)
+
+#elif defined(_M_ARM)
+#else
+#error Unknown Architecture
+#endif
+
+/******************************************************************************
+ * Executive Functions *
+ ******************************************************************************/
+
+static __inline PVOID
+ExAllocateFromZone(
+ IN PZONE_HEADER Zone)
+{
+ if (Zone->FreeList.Next)
+ Zone->FreeList.Next = Zone->FreeList.Next->Next;
+ return (PVOID) Zone->FreeList.Next;
+}
+
+static __inline PVOID
+ExFreeToZone(
+ IN PZONE_HEADER Zone,
+ IN PVOID Block)
+{
+ ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
+ Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
+ return ((PSINGLE_LIST_ENTRY) Block)->Next;
+}
+
+/*
+ * PVOID
+ * ExInterlockedAllocateFromZone(
+ * IN PZONE_HEADER Zone,
+ * IN PKSPIN_LOCK Lock)
+ */
+#define ExInterlockedAllocateFromZone(Zone, Lock) \
+ ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
+
+/* PVOID
+ * ExInterlockedFreeToZone(
+ * IN PZONE_HEADER Zone,
+ * IN PVOID Block,
+ * IN PKSPIN_LOCK Lock);
+ */
+#define ExInterlockedFreeToZone(Zone, Block, Lock) \
+ ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
+
+/*
+ * BOOLEAN
+ * ExIsFullZone(
+ * IN PZONE_HEADER Zone)
+ */
+#define ExIsFullZone(Zone) \
+ ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
+
+/* BOOLEAN
+ * ExIsObjectInFirstZoneSegment(
+ * IN PZONE_HEADER Zone,
+ * IN PVOID Object);
+ */
+#define ExIsObjectInFirstZoneSegment(Zone,Object) \
+ ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
+ ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
+ (Zone)->TotalSegmentSize)) )
+
+#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
+#define ExAcquireResourceShared ExAcquireResourceSharedLite
+#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
+#define ExDeleteResource ExDeleteResourceLite
+#define ExInitializeResource ExInitializeResourceLite
+#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
+#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
+#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
+#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
+
+#ifndef _M_IX86
+#define RESULT_ZERO 0
+#define RESULT_NEGATIVE 1
+#define RESULT_POSITIVE 2
+#endif
+
+#if defined(_X86_) || defined(_IA64_) || defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
+typedef enum _INTERLOCKED_RESULT {
+ ResultNegative = RESULT_NEGATIVE,
+ ResultZero = RESULT_ZERO,
+ ResultPositive = RESULT_POSITIVE
+} INTERLOCKED_RESULT;
+#endif
+
+#ifdef _X86_
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedIncrementLong(
+ IN OUT LONG volatile *Addend);
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedDecrementLong(
+ IN PLONG Addend);
+
+NTKERNELAPI
+ULONG
+FASTCALL
+Exfi386InterlockedExchangeUlong(
+ IN PULONG Target,
+ IN ULONG Value);
+
+#endif
+
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExExtendZone(
+ IN OUT PZONE_HEADER Zone,
+ IN OUT PVOID Segment,
+ IN ULONG SegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeZone(
+ OUT PZONE_HEADER Zone,
+ IN ULONG BlockSize,
+ IN OUT PVOID InitialSegment,
+ IN ULONG InitialSegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInterlockedExtendZone(
+ IN OUT PZONE_HEADER Zone,
+ IN OUT PVOID Segment,
+ IN ULONG SegmentSize,
+ IN OUT PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExUuidCreate(
+ OUT UUID *Uuid);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseAccessViolation(VOID);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseDatatypeMisalignment(VOID);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+
+/* Hardware Abstraction Layer Functions */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
+
+/* Nothing here */
+
+#else /* USE_DMA_MACROS ... */
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+VOID
+NTAPI
+IoFreeAdapterChannel(
+ IN PADAPTER_OBJECT AdapterObject);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+BOOLEAN
+NTAPI
+IoFlushAdapterBuffers(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ IN BOOLEAN WriteToDevice);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+VOID
+NTAPI
+IoFreeMapRegisters(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PVOID MapRegisterBase,
+ IN ULONG NumberOfMapRegisters);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+PVOID
+NTAPI
+HalAllocateCommonBuffer(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN ULONG Length,
+ OUT PPHYSICAL_ADDRESS LogicalAddress,
+ IN BOOLEAN CacheEnabled);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+VOID
+NTAPI
+HalFreeCommonBuffer(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN ULONG Length,
+ IN PHYSICAL_ADDRESS LogicalAddress,
+ IN PVOID VirtualAddress,
+ IN BOOLEAN CacheEnabled);
+
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+ULONG
+NTAPI
+HalReadDmaCounter(
+ IN PADAPTER_OBJECT AdapterObject);
+
+NTHALAPI
+NTSTATUS
+NTAPI
+HalAllocateAdapterChannel(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PWAIT_CONTEXT_BLOCK Wcb,
+ IN ULONG NumberOfMapRegisters,
+ IN PDRIVER_CONTROL ExecutionRoutine);
+
+#endif /* USE_DMA_MACROS ... */
+
+#if !defined(NO_LEGACY_DRIVERS)
+NTHALAPI
+NTSTATUS
+NTAPI
+HalAssignSlotResources(
+ IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources);
+
+NTHALAPI
+ULONG
+NTAPI
+HalGetInterruptVector(
+ IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN ULONG BusInterruptLevel,
+ IN ULONG BusInterruptVector,
+ OUT PKIRQL Irql,
+ OUT PKAFFINITY Affinity);
+
+NTHALAPI
+ULONG
+NTAPI
+HalSetBusData(
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length);
+
+NTHALAPI
+ULONG
+NTAPI
+HalGetBusData(
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ OUT PVOID Buffer,
+ IN ULONG Length);
+
+NTHALAPI
+BOOLEAN
+NTAPI
+HalMakeBeep(
+ IN ULONG Frequency);
+#endif /* !defined(NO_LEGACY_DRIVERS) */
+
+NTHALAPI
+PADAPTER_OBJECT
+NTAPI
+HalGetAdapter(
+ IN PDEVICE_DESCRIPTION DeviceDescription,
+ OUT PULONG NumberOfMapRegisters);
+
+VOID
+NTAPI
+HalPutDmaAdapter(
+ IN PADAPTER_OBJECT DmaAdapter);
+
+NTHALAPI
+VOID
+NTAPI
+HalAcquireDisplayOwnership(
+ IN PHAL_RESET_DISPLAY_PARAMETERS ResetDisplayParameters);
+
+NTHALAPI
+ULONG
+NTAPI
+HalGetBusDataByOffset(
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ OUT PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+
+NTHALAPI
+ULONG
+NTAPI
+HalSetBusDataByOffset(
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+
+NTHALAPI
+BOOLEAN
+NTAPI
+HalTranslateBusAddress(
+ IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress);
+
+NTHALAPI
+PVOID
+NTAPI
+HalAllocateCrashDumpRegisters(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN OUT PULONG NumberOfMapRegisters);
+
+NTSTATUS
+NTAPI
+HalGetScatterGatherList(
+ IN PADAPTER_OBJECT DmaAdapter,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PMDL Mdl,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ IN PDRIVER_LIST_CONTROL ExecutionRoutine,
+ IN PVOID Context,
+ IN BOOLEAN WriteToDevice);
+
+VOID
+NTAPI
+HalPutScatterGatherList(
+ IN PADAPTER_OBJECT DmaAdapter,
+ IN PSCATTER_GATHER_LIST ScatterGather,
+ IN BOOLEAN WriteToDevice);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+VOID
+FASTCALL
+HalExamineMBR(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG MBRTypeIdentifier,
+ OUT PVOID *Buffer);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTSTATUS
+NTAPI
+HalAllocateHardwareCounters(
+ IN PGROUP_AFFINITY GroupAffinty,
+ IN ULONG GroupCount,
+ IN PPHYSICAL_COUNTER_RESOURCE_LIST ResourceList,
+ OUT PHANDLE CounterSetHandle);
+
+NTSTATUS
+NTAPI
+HalFreeHardwareCounters(
+ IN HANDLE CounterSetHandle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#if defined(_IA64_)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTHALAPI
+ULONG
+NTAPI
+HalGetDmaAlignmentRequirement(VOID);
+#endif
+#endif /* defined(_IA64_) */
+
+#if defined(_M_IX86) || defined(_M_AMD64)
+#define HalGetDmaAlignmentRequirement() 1L
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+typedef struct _WHEA_ERROR_SOURCE_DESCRIPTOR *PWHEA_ERROR_SOURCE_DESCRIPTOR;
+typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
+
+NTHALAPI
+VOID
+NTAPI
+HalBugCheckSystem(
+ IN PWHEA_ERROR_SOURCE_DESCRIPTOR ErrorSource,
+ IN PWHEA_ERROR_RECORD ErrorRecord);
+
+#else
+
+typedef struct _WHEA_ERROR_RECORD *PWHEA_ERROR_RECORD;
+
+NTHALAPI
+VOID
+NTAPI
+HalBugCheckSystem(
+ IN PWHEA_ERROR_RECORD ErrorRecord);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+/******************************************************************************
+ * I/O Manager Functions *
+ ******************************************************************************/
+
+/*
+ * VOID IoAssignArcName(
+ * IN PUNICODE_STRING ArcName,
+ * IN PUNICODE_STRING DeviceName);
+ */
+#define IoAssignArcName(_ArcName, _DeviceName) ( \
+ IoCreateSymbolicLink((_ArcName), (_DeviceName)))
+
+/*
+ * VOID
+ * IoDeassignArcName(
+ * IN PUNICODE_STRING ArcName)
+ */
+#define IoDeassignArcName IoDeleteSymbolicLink
+
+VOID
+FORCEINLINE
+NTAPI
+IoInitializeDriverCreateContext(
+ PIO_DRIVER_CREATE_CONTEXT DriverContext)
+{
+ RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
+ DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
+}
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAllocateAdapterChannel(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG NumberOfMapRegisters,
+ IN PDRIVER_CONTROL ExecutionRoutine,
+ IN PVOID Context);
+#endif
+
+#if !defined(DMA_MACROS_DEFINED)
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+PHYSICAL_ADDRESS
+NTAPI
+IoMapTransfer(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN OUT PULONG Length,
+ IN BOOLEAN WriteToDevice);
+#endif
+
+NTKERNELAPI
+VOID
+NTAPI
+IoAllocateController(
+ IN PCONTROLLER_OBJECT ControllerObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PDRIVER_CONTROL ExecutionRoutine,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+PCONTROLLER_OBJECT
+NTAPI
+IoCreateController(
+ IN ULONG Size);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDeleteController(
+ IN PCONTROLLER_OBJECT ControllerObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeController(
+ IN PCONTROLLER_OBJECT ControllerObject);
+
+NTKERNELAPI
+PCONFIGURATION_INFORMATION
+NTAPI
+IoGetConfigurationInformation(VOID);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetDeviceToVerify(
+ IN PETHREAD Thread);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoCancelFileOpen(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+PGENERIC_MAPPING
+NTAPI
+IoGetFileObjectGenericMapping(VOID);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoMakeAssociatedIrp(
+ IN PIRP Irp,
+ IN CCHAR StackSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryDeviceDescription(
+ IN PINTERFACE_TYPE BusType OPTIONAL,
+ IN PULONG BusNumber OPTIONAL,
+ IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
+ IN PULONG ControllerNumber OPTIONAL,
+ IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
+ IN PULONG PeripheralNumber OPTIONAL,
+ IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
+ IN OUT PVOID Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRaiseHardError(
+ IN PIRP Irp,
+ IN PVPB Vpb OPTIONAL,
+ IN PDEVICE_OBJECT RealDeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoRaiseInformationalHardError(
+ IN NTSTATUS ErrorStatus,
+ IN PUNICODE_STRING String OPTIONAL,
+ IN PKTHREAD Thread OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterBootDriverReinitialization(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterDriverReinitialization(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDeviceByPointer(
+ IN PDEVICE_OBJECT SourceDevice,
+ IN PDEVICE_OBJECT TargetDevice);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportDetectedDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN INTERFACE_TYPE LegacyBusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
+ IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
+ IN BOOLEAN ResourceAssigned,
+ IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportResourceForDetection(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PCM_RESOURCE_LIST DriverList OPTIONAL,
+ IN ULONG DriverListSize OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
+ IN ULONG DeviceListSize OPTIONAL,
+ OUT PBOOLEAN ConflictDetected);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportResourceUsage(
+ IN PUNICODE_STRING DriverClassName OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PCM_RESOURCE_LIST DriverList OPTIONAL,
+ IN ULONG DriverListSize OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
+ IN ULONG DeviceListSize OPTIONAL,
+ IN BOOLEAN OverrideConflict,
+ OUT PBOOLEAN ConflictDetected);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetHardErrorOrVerifyDevice(
+ IN PIRP Irp,
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAssignResources(
+ IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoSetThreadHardErrorMode(
+ IN BOOLEAN EnableHardErrors);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoIsFileOriginRemote(
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetFileOrigin(
+ IN PFILE_OBJECT FileObject,
+ IN BOOLEAN Remote);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoReadPartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN BOOLEAN ReturnRecognizedPartitions,
+ OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoSetPartitionInformation(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG PartitionNumber,
+ IN ULONG PartitionType);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoWritePartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG SectorsPerTrack,
+ IN ULONG NumberOfHeads,
+ IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateDisk(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN struct _CREATE_DISK* Disk OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReadDiskSignature(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG BytesPerSector,
+ OUT PDISK_SIGNATURE Signature);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReadPartitionTableEx(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetPartitionInformationEx(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG PartitionNumber,
+ IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetSystemPartition(
+ IN PUNICODE_STRING VolumeNameString);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVerifyPartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN FixErrors);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVolumeDeviceToDosName(
+ IN PVOID VolumeDeviceObject,
+ OUT PUNICODE_STRING DosName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWritePartitionTableEx(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateFileSpecifyDeviceObjectHint(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG Disposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength,
+ IN CREATE_FILE_TYPE CreateFileType,
+ IN PVOID InternalParameters OPTIONAL,
+ IN ULONG Options,
+ IN PVOID DeviceObject OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDeviceToDeviceStackSafe(
+ IN PDEVICE_OBJECT SourceDevice,
+ IN PDEVICE_OBJECT TargetDevice,
+ OUT PDEVICE_OBJECT *AttachedToDeviceObject);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+NTKERNELAPI
+IO_PAGING_PRIORITY
+FASTCALL
+IoGetPagingIoPriority(
+ IN PIRP Irp);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+BOOLEAN
+NTAPI
+IoTranslateBusAddress(
+ IN INTERFACE_TYPE InterfaceType,
+ IN ULONG BusNumber,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN OUT PULONG AddressSpace,
+ OUT PPHYSICAL_ADDRESS TranslatedAddress);
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoUpdateDiskGeometry(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
+ IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
+
+PTXN_PARAMETER_BLOCK
+NTAPI
+IoGetTransactionParameterBlock(
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateFileEx(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG Disposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength,
+ IN CREATE_FILE_TYPE CreateFileType,
+ IN PVOID InternalParameters OPTIONAL,
+ IN ULONG Options,
+ IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
+
+NTSTATUS
+NTAPI
+IoSetIrpExtraCreateParameter(
+ IN OUT PIRP Irp,
+ IN struct _ECP_LIST *ExtraCreateParameter);
+
+VOID
+NTAPI
+IoClearIrpExtraCreateParameter(
+ IN OUT PIRP Irp);
+
+NTSTATUS
+NTAPI
+IoGetIrpExtraCreateParameter(
+ IN PIRP Irp,
+ OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
+
+BOOLEAN
+NTAPI
+IoIsFileObjectIgnoringSharing(
+ IN PFILE_OBJECT FileObject);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTSTATUS
+NTAPI
+IoSetFileObjectIgnoreSharing(
+ IN PFILE_OBJECT FileObject);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+/******************************************************************************
+ * Kernel Debugger Functions *
+ ******************************************************************************/
+NTSYSAPI
+ULONG
+NTAPI
+DbgPrompt(
+ IN PCCH Prompt,
+ OUT PCH Response,
+ IN ULONG MaximumResponseLength);
+
+/******************************************************************************
+ * Kernel Functions *
+ ******************************************************************************/
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeInvalidateRangeAllCaches(
+ IN PVOID BaseAddress,
+ IN ULONG Length);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetImportanceDpc(
+ IN OUT PRKDPC Dpc,
+ IN KDPC_IMPORTANCE Importance);
+
+NTKERNELAPI
+LONG
+NTAPI
+KePulseEvent(
+ IN OUT PRKEVENT Event,
+ IN KPRIORITY Increment,
+ IN BOOLEAN Wait);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeSetBasePriorityThread(
+ IN OUT PRKTHREAD Thread,
+ IN LONG Increment);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterCriticalRegion(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveCriticalRegion(VOID);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+KeBugCheck(
+ IN ULONG BugCheckCode);
+#if defined(SINGLE_GROUP_LEGACY_API)
+
+
+NTKERNELAPI
+VOID
+NTAPI
+KeSetTargetProcessorDpc(
+ IN OUT PRKDPC Dpc,
+ IN CCHAR Number);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryActiveProcessors(VOID);
+#endif /* defined(SINGLE_GROUP_LEGACY_API) */
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeAreApcsDisabled(VOID);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeInvalidateAllCaches(VOID);
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeExpandKernelStackAndCallout(
+ IN PEXPAND_STACK_CALLOUT Callout,
+ IN PVOID Parameter OPTIONAL,
+ IN SIZE_T Size);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterGuardedRegion(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveGuardedRegion(VOID);
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#if defined(SINGLE_GROUP_LEGACY_API)
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCount(
+ OUT PKAFFINITY ActiveProcessors OPTIONAL);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCount(VOID);
+#endif /* SINGLE_GROUP_LEGACY_API */
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCountEx(
+ IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCountEx(
+ IN USHORT GroupNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryActiveGroupCount(VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryMaximumGroupCount(VOID);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryGroupAffinity(
+ IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeGetCurrentProcessorNumberEx(
+ OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeQueryNodeActiveAffinity(
+ IN USHORT NodeNumber,
+ OUT PGROUP_AFFINITY Affinity OPTIONAL,
+ OUT PUSHORT Count OPTIONAL);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryNodeMaximumProcessorCount(
+ IN USHORT NodeNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryHighestNodeNumber(VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeGetCurrentNodeNumber(VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryLogicalProcessorRelationship(
+ IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
+ IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
+ OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
+ IN OUT PULONG Length);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSetHardwareCounterConfiguration(
+ IN PHARDWARE_COUNTER CounterArray,
+ IN ULONG Count);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryHardwareCounterConfiguration(
+ OUT PHARDWARE_COUNTER CounterArray,
+ IN ULONG MaximumCount,
+ OUT PULONG Count);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+/******************************************************************************
+ * Memory manager Functions *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+PPHYSICAL_MEMORY_RANGE
+NTAPI
+MmGetPhysicalMemoryRanges(VOID);
+
+NTKERNELAPI
+PHYSICAL_ADDRESS
+NTAPI
+MmGetPhysicalAddress(
+ IN PVOID BaseAddress);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsNonPagedSystemAddressValid(
+ IN PVOID VirtualAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateNonCachedMemory(
+ IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeNonCachedMemory(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmGetVirtualForPhysical(
+ IN PHYSICAL_ADDRESS PhysicalAddress);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapUserAddressesToPage(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes,
+ IN PVOID PageAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapVideoDisplay(
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN SIZE_T NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapViewInSessionSpace(
+ IN PVOID Section,
+ OUT PVOID *MappedBase,
+ IN OUT PSIZE_T ViewSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapViewInSystemSpace(
+ IN PVOID Section,
+ OUT PVOID *MappedBase,
+ IN OUT PSIZE_T ViewSize);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsAddressValid(
+ IN PVOID VirtualAddress);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsThisAnNtAsSystem(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmLockPagableSectionByHandle(
+ IN PVOID ImageSectionHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmUnmapViewInSessionSpace(
+ IN PVOID MappedBase);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmUnmapViewInSystemSpace(
+ IN PVOID MappedBase);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnsecureVirtualMemory(
+ IN HANDLE SecureHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmRemovePhysicalMemory(
+ IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+MmSecureVirtualMemory(
+ IN PVOID Address,
+ IN SIZE_T Size,
+ IN ULONG ProbeMode);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapVideoDisplay(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmAddPhysicalMemory(
+ IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemory(
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCache(
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+ IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+ IN MEMORY_CACHING_TYPE CacheType);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCacheNode(
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+ IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+ IN MEMORY_CACHING_TYPE CacheType,
+ IN NODE_REQUIREMENT PreferredNode);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemory(
+ IN PVOID BaseAddress);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemorySpecifyCache(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmCreateMirror(VOID);
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTSTATUS
+NTAPI
+MmRotatePhysicalView(
+ IN PVOID VirtualAddress,
+ IN OUT PSIZE_T NumberOfBytes,
+ IN PMDLX NewMdl OPTIONAL,
+ IN MM_ROTATE_DIRECTION Direction,
+ IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
+ IN PVOID Context OPTIONAL);
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+/******************************************************************************
+ * Process Manager Functions *
+ ******************************************************************************/
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenProcess(
+ OUT PHANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PCLIENT_ID ClientId OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryInformationProcess(
+ IN HANDLE ProcessHandle,
+ IN PROCESSINFOCLASS ProcessInformationClass,
+ OUT PVOID ProcessInformation OPTIONAL,
+ IN ULONG ProcessInformationLength,
+ OUT PULONG ReturnLength OPTIONAL);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetCreateProcessNotifyRoutine(
+ IN PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,
+ IN BOOLEAN Remove);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetCreateThreadNotifyRoutine(
+ IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetLoadImageNotifyRoutine(
+ IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetCurrentProcessId(VOID);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetCurrentThreadId(VOID);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsGetVersion(
+ OUT PULONG MajorVersion OPTIONAL,
+ OUT PULONG MinorVersion OPTIONAL,
+ OUT PULONG BuildNumber OPTIONAL,
+ OUT PUNICODE_STRING CSDVersion OPTIONAL);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetProcessId(
+ IN PEPROCESS Process);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetThreadId(
+ IN PETHREAD Thread);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsRemoveCreateThreadNotifyRoutine(
+ IN PCREATE_THREAD_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsRemoveLoadImageNotifyRoutine(
+ IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine);
+
+NTKERNELAPI
+LONGLONG
+NTAPI
+PsGetProcessCreateTimeQuadPart(
+ IN PEPROCESS Process);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+NTKERNELAPI
+HANDLE
+NTAPI
+PsGetThreadProcessId(
+ IN PETHREAD Thread);
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsSetCurrentThreadPrefetching(
+ IN BOOLEAN Prefetching);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsIsCurrentThreadPrefetching(VOID);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsSetCreateProcessNotifyRoutineEx(
+ IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
+ IN BOOLEAN Remove);
+#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
+/******************************************************************************
+ * Runtime Library Functions *
+ ******************************************************************************/
+
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+
+#ifndef RTL_USE_AVL_TABLES
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeGenericTable(
+ OUT PRTL_GENERIC_TABLE Table,
+ IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
+ IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
+ IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
+ IN PVOID TableContext OPTIONAL);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer,
+ IN CLONG BufferSize,
+ OUT PBOOLEAN NewElement OPTIONAL);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTableFull(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer,
+ IN CLONG BufferSize,
+ OUT PBOOLEAN NewElement OPTIONAL,
+ IN PVOID NodeOrParent,
+ IN TABLE_SEARCH_RESULT SearchResult);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDeleteElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTableFull(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer,
+ OUT PVOID *NodeOrParent,
+ OUT TABLE_SEARCH_RESULT *SearchResult);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN BOOLEAN Restart);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTableWithoutSplaying(
+ IN PRTL_GENERIC_TABLE Table,
+ IN OUT PVOID *RestartKey);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlGetElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN ULONG I);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberGenericTableElements(
+ IN PRTL_GENERIC_TABLE Table);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsGenericTableEmpty(
+ IN PRTL_GENERIC_TABLE Table);
+
+#endif /* !RTL_USE_AVL_TABLES */
+
+#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSplay(
+ IN OUT PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlDelete(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlDeleteNoSplay(
+ IN PRTL_SPLAY_LINKS Links,
+ IN OUT PRTL_SPLAY_LINKS *Root);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreeSuccessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreePredecessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlRealSuccessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlRealPredecessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlPrefixUnicodeString(
+ IN PCUNICODE_STRING String1,
+ IN PCUNICODE_STRING String2,
+ IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlUpperString(
+ IN OUT PSTRING DestinationString,
+ IN const PSTRING SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeString(
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlMapGenericMask(
+ IN OUT PACCESS_MASK AccessMask,
+ IN PGENERIC_MAPPING GenericMapping);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVolumeDeviceToDosName(
+ IN PVOID VolumeDeviceObject,
+ OUT PUNICODE_STRING DosName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetVersion(
+ IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVerifyVersionInfo(
+ IN PRTL_OSVERSIONINFOEXW VersionInfo,
+ IN ULONG TypeMask,
+ IN ULONGLONG ConditionMask);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareString(
+ IN const PSTRING String1,
+ IN const PSTRING String2,
+ IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyString(
+ OUT PSTRING DestinationString,
+ IN const PSTRING SourceString OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualString(
+ IN const PSTRING String1,
+ IN const PSTRING String2,
+ IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCharToInteger(
+ IN PCSZ String,
+ IN ULONG Base OPTIONAL,
+ OUT PULONG Value);
+
+NTSYSAPI
+CHAR
+NTAPI
+RtlUpperChar(
+ IN CHAR Character);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlWalkFrameChain(
+ OUT PVOID *Callers,
+ IN ULONG Count,
+ IN ULONG Flags);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+
+
NTSYSAPI
VOID
NTAPI
@@ -3111,9 +5027,754 @@ RtlInitializeGenericTableAvl(
IN PRTL_AVL_FREE_ROUTINE FreeRoutine,
IN PVOID TableContext OPTIONAL);
-#ifdef __cplusplus
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTableAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN PVOID Buffer,
+ IN CLONG BufferSize,
+ OUT PBOOLEAN NewElement OPTIONAL);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTableFullAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN PVOID Buffer,
+ IN CLONG BufferSize,
+ OUT PBOOLEAN NewElement OPTIONAL,
+ IN PVOID NodeOrParent,
+ IN TABLE_SEARCH_RESULT SearchResult);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDeleteElementGenericTableAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTableAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTableFullAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN PVOID Buffer,
+ OUT PVOID *NodeOrParent,
+ OUT TABLE_SEARCH_RESULT *SearchResult);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTableAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN BOOLEAN Restart);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTableWithoutSplayingAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN OUT PVOID *RestartKey);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupFirstMatchingElementGenericTableAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN PVOID Buffer,
+ OUT PVOID *RestartKey);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTableLikeADirectory(
+ IN PRTL_AVL_TABLE Table,
+ IN PRTL_AVL_MATCH_FUNCTION MatchFunction OPTIONAL,
+ IN PVOID MatchData OPTIONAL,
+ IN ULONG NextFlag,
+ IN OUT PVOID *RestartKey,
+ IN OUT PULONG DeleteCount,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlGetElementGenericTableAvl(
+ IN PRTL_AVL_TABLE Table,
+ IN ULONG I);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberGenericTableElementsAvl(
+ IN PRTL_AVL_TABLE Table);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsGenericTableEmptyAvl(
+ IN PRTL_AVL_TABLE Table);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+
+NTSYSAPI
+VOID
+NTAPI
+RtlRunOnceInitialize(
+ OUT PRTL_RUN_ONCE RunOnce);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlRunOnceExecuteOnce(
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN PRTL_RUN_ONCE_INIT_FN InitFn,
+ IN OUT PVOID Parameter OPTIONAL,
+ OUT PVOID *Context OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlRunOnceBeginInitialize(
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN ULONG Flags,
+ OUT PVOID *Context OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlRunOnceComplete(
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN ULONG Flags,
+ IN PVOID Context OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlGetProductInfo(
+ IN ULONG OSMajorVersion,
+ IN ULONG OSMinorVersion,
+ IN ULONG SpMajorVersion,
+ IN ULONG SpMinorVersion,
+ OUT PULONG ReturnedProductType);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlCreateHashTable(
+ IN OUT PRTL_DYNAMIC_HASH_TABLE *HashTable OPTIONAL,
+ IN ULONG Shift,
+ IN ULONG Flags);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlDeleteHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlInsertEntryHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
+ IN ULONG_PTR Signature,
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlRemoveEntryHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN PRTL_DYNAMIC_HASH_TABLE_ENTRY Entry,
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
+
+NTSYSAPI
+PRTL_DYNAMIC_HASH_TABLE_ENTRY
+NTAPI
+RtlLookupEntryHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN ULONG_PTR Signature,
+ OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context OPTIONAL);
+
+NTSYSAPI
+PRTL_DYNAMIC_HASH_TABLE_ENTRY
+NTAPI
+RtlGetNextEntryHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlInitEnumerationHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
+
+NTSYSAPI
+PRTL_DYNAMIC_HASH_TABLE_ENTRY
+NTAPI
+RtlEnumerateEntryHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlEndEnumerationHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlInitWeakEnumerationHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
+
+NTSYSAPI
+PRTL_DYNAMIC_HASH_TABLE_ENTRY
+NTAPI
+RtlWeaklyEnumerateEntryHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlEndWeakEnumerationHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable,
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlExpandHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlContractHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+
+#if defined(_AMD64_) || defined(_IA64_)
+
+
+
+//DECLSPEC_DEPRECATED_DDK_WINXP
+FORCEINLINE
+LARGE_INTEGER
+NTAPI_INLINE
+RtlLargeIntegerDivide(
+ IN LARGE_INTEGER Dividend,
+ IN LARGE_INTEGER Divisor,
+ OUT PLARGE_INTEGER Remainder OPTIONAL)
+{
+ LARGE_INTEGER ret;
+ ret.QuadPart = Dividend.QuadPart / Divisor.QuadPart;
+ if (Remainder)
+ Remainder->QuadPart = Dividend.QuadPart % Divisor.QuadPart;
+ return ret;
}
+
+#else
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+LARGE_INTEGER
+NTAPI
+RtlLargeIntegerDivide(
+ IN LARGE_INTEGER Dividend,
+ IN LARGE_INTEGER Divisor,
+ OUT PLARGE_INTEGER Remainder OPTIONAL);
#endif
-#endif /* _NTDDK_ */
+#endif /* defined(_AMD64_) || defined(_IA64_) */
+
+
+
+#ifdef RTL_USE_AVL_TABLES
+
+#define RtlInitializeGenericTable RtlInitializeGenericTableAvl
+#define RtlInsertElementGenericTable RtlInsertElementGenericTableAvl
+#define RtlInsertElementGenericTableFull RtlInsertElementGenericTableFullAvl
+#define RtlDeleteElementGenericTable RtlDeleteElementGenericTableAvl
+#define RtlLookupElementGenericTable RtlLookupElementGenericTableAvl
+#define RtlLookupElementGenericTableFull RtlLookupElementGenericTableFullAvl
+#define RtlEnumerateGenericTable RtlEnumerateGenericTableAvl
+#define RtlEnumerateGenericTableWithoutSplaying RtlEnumerateGenericTableWithoutSplayingAvl
+#define RtlGetElementGenericTable RtlGetElementGenericTableAvl
+#define RtlNumberGenericTableElements RtlNumberGenericTableElementsAvl
+#define RtlIsGenericTableEmpty RtlIsGenericTableEmptyAvl
+
+#endif /* RTL_USE_AVL_TABLES */
+
+#define RtlInitializeSplayLinks(Links) { \
+ PRTL_SPLAY_LINKS _SplayLinks; \
+ _SplayLinks = (PRTL_SPLAY_LINKS)(Links); \
+ _SplayLinks->Parent = _SplayLinks; \
+ _SplayLinks->LeftChild = NULL; \
+ _SplayLinks->RightChild = NULL; \
+}
+
+#define RtlIsLeftChild(Links) \
+ (RtlLeftChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlIsRightChild(Links) \
+ (RtlRightChild(RtlParent(Links)) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlRightChild(Links) \
+ ((PRTL_SPLAY_LINKS)(Links))->RightChild
+
+#define RtlIsRoot(Links) \
+ (RtlParent(Links) == (PRTL_SPLAY_LINKS)(Links))
+
+#define RtlLeftChild(Links) \
+ ((PRTL_SPLAY_LINKS)(Links))->LeftChild
+
+#define RtlParent(Links) \
+ ((PRTL_SPLAY_LINKS)(Links))->Parent
+
+#define RtlInsertAsLeftChild(ParentLinks,ChildLinks) \
+ { \
+ PRTL_SPLAY_LINKS _SplayParent; \
+ PRTL_SPLAY_LINKS _SplayChild; \
+ _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
+ _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
+ _SplayParent->LeftChild = _SplayChild; \
+ _SplayChild->Parent = _SplayParent; \
+ }
+
+#define RtlInsertAsRightChild(ParentLinks,ChildLinks) \
+ { \
+ PRTL_SPLAY_LINKS _SplayParent; \
+ PRTL_SPLAY_LINKS _SplayChild; \
+ _SplayParent = (PRTL_SPLAY_LINKS)(ParentLinks); \
+ _SplayChild = (PRTL_SPLAY_LINKS)(ChildLinks); \
+ _SplayParent->RightChild = _SplayChild; \
+ _SplayChild->Parent = _SplayParent; \
+ }
+
+#if !defined(MIDL_PASS)
+
+FORCEINLINE
+LUID
+NTAPI_INLINE
+RtlConvertLongToLuid(
+ IN LONG Val)
+{
+ LUID Luid;
+ LARGE_INTEGER Temp;
+
+ Temp.QuadPart = Val;
+ Luid.LowPart = Temp.u.LowPart;
+ Luid.HighPart = Temp.u.HighPart;
+ return Luid;
+}
+
+FORCEINLINE
+LUID
+NTAPI_INLINE
+RtlConvertUlongToLuid(
+ IN ULONG Val)
+{
+ LUID Luid;
+
+ Luid.LowPart = Val;
+ Luid.HighPart = 0;
+ return Luid;
+}
+
+#endif /* !defined(MIDL_PASS) */
+
+#if (defined(_M_AMD64) || defined(_M_IA64)) && !defined(_REALLY_GET_CALLERS_CALLER_)
+#define RtlGetCallersAddress(CallersAddress, CallersCaller) \
+ *CallersAddress = (PVOID)_ReturnAddress(); \
+ *CallersCaller = NULL;
+#else
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+VOID
+NTAPI
+RtlGetCallersAddress(
+ OUT PVOID *CallersAddress,
+ OUT PVOID *CallersCaller);
+#endif
+#endif
+
+#if !defined(MIDL_PASS) && !defined(SORTPP_PASS)
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+FORCEINLINE
+VOID
+NTAPI
+RtlInitHashTableContext(
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
+{
+ Context->ChainHead = NULL;
+ Context->PrevLinkage = NULL;
+}
+
+FORCEINLINE
+VOID
+NTAPI
+RtlInitHashTableContextFromEnumerator(
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context,
+ IN PRTL_DYNAMIC_HASH_TABLE_ENUMERATOR Enumerator)
+{
+ Context->ChainHead = Enumerator->ChainHead;
+ Context->PrevLinkage = Enumerator->HashEntry.Linkage.Blink;
+}
+
+FORCEINLINE
+VOID
+NTAPI
+RtlReleaseHashTableContext(
+ IN OUT PRTL_DYNAMIC_HASH_TABLE_CONTEXT Context)
+{
+ UNREFERENCED_PARAMETER(Context);
+ return;
+}
+
+FORCEINLINE
+ULONG
+NTAPI
+RtlTotalBucketsHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable)
+{
+ return HashTable->TableSize;
+}
+
+FORCEINLINE
+ULONG
+NTAPI
+RtlNonEmptyBucketsHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable)
+{
+ return HashTable->NonEmptyBuckets;
+}
+
+FORCEINLINE
+ULONG
+NTAPI
+RtlEmptyBucketsHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable)
+{
+ return HashTable->TableSize - HashTable->NonEmptyBuckets;
+}
+
+FORCEINLINE
+ULONG
+NTAPI
+RtlTotalEntriesHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable)
+{
+ return HashTable->NumEntries;
+}
+
+FORCEINLINE
+ULONG
+NTAPI
+RtlActiveEnumeratorsHashTable(
+ IN PRTL_DYNAMIC_HASH_TABLE HashTable)
+{
+ return HashTable->NumEnumerators;
+}
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
+
+/******************************************************************************
+ * Security Manager Functions *
+ ******************************************************************************/
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeSinglePrivilegeCheck(
+ IN LUID PrivilegeValue,
+ IN KPROCESSOR_MODE PreviousMode);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+
+/******************************************************************************
+ * ZwXxx Functions *
+ ******************************************************************************/
+
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwAllocateLocallyUniqueId(
+ OUT PLUID Luid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwTerminateProcess(
+ IN HANDLE ProcessHandle OPTIONAL,
+ IN NTSTATUS ExitStatus);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenProcess(
+ OUT PHANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PCLIENT_ID ClientId OPTIONAL);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSTATUS
+NTAPI
+ZwCancelTimer(
+ IN HANDLE TimerHandle,
+ OUT PBOOLEAN CurrentState OPTIONAL);
+
+NTSTATUS
+NTAPI
+ZwCreateTimer(
+ OUT PHANDLE TimerHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN TIMER_TYPE TimerType);
+
+NTSTATUS
+NTAPI
+ZwOpenTimer(
+ OUT PHANDLE TimerHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationThread(
+ IN HANDLE ThreadHandle,
+ IN THREADINFOCLASS ThreadInformationClass,
+ IN PVOID ThreadInformation,
+ IN ULONG ThreadInformationLength);
+
+NTSTATUS
+NTAPI
+ZwSetTimer(
+ IN HANDLE TimerHandle,
+ IN PLARGE_INTEGER DueTime,
+ IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
+ IN PVOID TimerContext OPTIONAL,
+ IN BOOLEAN ResumeTimer,
+ IN LONG Period OPTIONAL,
+ OUT PBOOLEAN PreviousState OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDisplayString(
+ IN PUNICODE_STRING String);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwPowerInformation(
+ IN POWER_INFORMATION_LEVEL PowerInformationLevel,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryVolumeInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FsInformation,
+ IN ULONG Length,
+ IN FS_INFORMATION_CLASS FsInformationClass);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDeviceIoControlFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG IoControlCode,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTSTATUS
+NTAPI
+ZwSetTimerEx(
+ IN HANDLE TimerHandle,
+ IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
+ IN OUT PVOID TimerSetInformation,
+ IN ULONG TimerSetInformationLength);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+
+
+/* UNSORTED */
+
+#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
+ ((ConditionMask) = VerSetConditionMask((ConditionMask), \
+ (TypeBitMask), (ComparisonType)))
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTSYSAPI
+ULONGLONG
+NTAPI
+VerSetConditionMask(
+ IN ULONGLONG ConditionMask,
+ IN ULONG TypeMask,
+ IN UCHAR Condition);
+#endif
+
+typedef struct _KERNEL_USER_TIMES {
+ LARGE_INTEGER CreateTime;
+ LARGE_INTEGER ExitTime;
+ LARGE_INTEGER KernelTime;
+ LARGE_INTEGER UserTime;
+} KERNEL_USER_TIMES, *PKERNEL_USER_TIMES;
+
+/* NtXxx Functions */
+
+typedef enum _SYSTEM_FIRMWARE_TABLE_ACTION {
+ SystemFirmwareTable_Enumerate,
+ SystemFirmwareTable_Get
+} SYSTEM_FIRMWARE_TABLE_ACTION;
+
+typedef struct _SYSTEM_FIRMWARE_TABLE_INFORMATION {
+ ULONG ProviderSignature;
+ SYSTEM_FIRMWARE_TABLE_ACTION Action;
+ ULONG TableID;
+ ULONG TableBufferLength;
+ UCHAR TableBuffer[ANYSIZE_ARRAY];
+} SYSTEM_FIRMWARE_TABLE_INFORMATION, *PSYSTEM_FIRMWARE_TABLE_INFORMATION;
+
+typedef NTSTATUS
+(__cdecl *PFNFTH)(
+ IN OUT PSYSTEM_FIRMWARE_TABLE_INFORMATION SystemFirmwareTableInfo);
+
+typedef struct _SYSTEM_FIRMWARE_TABLE_HANDLER {
+ ULONG ProviderSignature;
+ BOOLEAN Register;
+ PFNFTH FirmwareTableHandler;
+ PVOID DriverObject;
+} SYSTEM_FIRMWARE_TABLE_HANDLER, *PSYSTEM_FIRMWARE_TABLE_HANDLER;
+
+typedef ULONG_PTR
+(NTAPI *PDRIVER_VERIFIER_THUNK_ROUTINE)(
+ IN PVOID Context);
+
+typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
+ PDRIVER_VERIFIER_THUNK_ROUTINE PristineRoutine;
+ PDRIVER_VERIFIER_THUNK_ROUTINE NewRoutine;
+} DRIVER_VERIFIER_THUNK_PAIRS, *PDRIVER_VERIFIER_THUNK_PAIRS;
+
+#define DRIVER_VERIFIER_SPECIAL_POOLING 0x0001
+#define DRIVER_VERIFIER_FORCE_IRQL_CHECKING 0x0002
+#define DRIVER_VERIFIER_INJECT_ALLOCATION_FAILURES 0x0004
+#define DRIVER_VERIFIER_TRACK_POOL_ALLOCATIONS 0x0008
+#define DRIVER_VERIFIER_IO_CHECKING 0x0010
+
+#define SHARED_GLOBAL_FLAGS_ERROR_PORT_V 0x0
+#define SHARED_GLOBAL_FLAGS_ERROR_PORT (1UL << SHARED_GLOBAL_FLAGS_ERROR_PORT_V)
+
+#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V 0x1
+#define SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED (1UL << SHARED_GLOBAL_FLAGS_ELEVATION_ENABLED_V)
+
+#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V 0x2
+#define SHARED_GLOBAL_FLAGS_VIRT_ENABLED (1UL << SHARED_GLOBAL_FLAGS_VIRT_ENABLED_V)
+
+#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3
+#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \
+ (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
+
+#define SHARED_GLOBAL_FLAGS_SPARE_V 0x4
+#define SHARED_GLOBAL_FLAGS_SPARE \
+ (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
+
+#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5
+#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \
+ (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
+
+#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6
+#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \
+ (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
+
+#define EX_INIT_BITS(Flags, Bit) \
+ *((Flags)) |= (Bit) // Safe to use before concurrently accessible
+
+#define EX_TEST_SET_BIT(Flags, Bit) \
+ InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
+
+#define EX_TEST_CLEAR_BIT(Flags, Bit) \
+ InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
+
+#define PCCARD_MAP_ERROR 0x01
+#define PCCARD_DEVICE_PCI 0x10
+
+#define PCCARD_SCAN_DISABLED 0x01
+#define PCCARD_MAP_ZERO 0x02
+#define PCCARD_NO_TIMER 0x03
+#define PCCARD_NO_PIC 0x04
+#define PCCARD_NO_LEGACY_BASE 0x05
+#define PCCARD_DUP_LEGACY_BASE 0x06
+#define PCCARD_NO_CONTROLLERS 0x07
+
+#define MAXIMUM_EXPANSION_SIZE (KERNEL_LARGE_STACK_SIZE - (PAGE_SIZE / 2))
+
+/* Filesystem runtime library routines */
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsTotalDeviceFailure(
+ IN NTSTATUS Status);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/ddk/ntddstor.h b/include/ddk/ntddstor.h
deleted file mode 100644
index 870c8a2db6e..00000000000
--- a/include/ddk/ntddstor.h
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * ntddstor.h
- *
- * Storage class IOCTL interface.
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- * Created by Casper S. Hornstrup
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-
-#ifndef __NTDDSTOR_H
-#define __NTDDSTOR_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
-
-#define IOCTL_STORAGE_CHECK_VERIFY \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_CHECK_VERIFY2 \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_EJECT_MEDIA \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_EJECTION_CONTROL \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_FIND_NEW_DEVICES \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_GET_DEVICE_NUMBER \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_GET_MEDIA_TYPES \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_LOAD_MEDIA \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_LOAD_MEDIA2 \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_MCN_CONTROL \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_MEDIA_REMOVAL \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_PREDICT_FAILURE \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_QUERY_PROPERTY \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_RELEASE \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_RESERVE \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_STORAGE_GET_HOTPLUG_INFO \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)
-
-#define IOCTL_STORAGE_SET_HOTPLUG_INFO \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_STORAGE_RESET_BUS \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-#define IOCTL_STORAGE_RESET_DEVICE \
- CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
-
-
-DEFINE_GUID(GUID_DEVINTERFACE_DISK,
- 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_CDROM,
- 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,
- 0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_TAPE,
- 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,
- 0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,
- 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,
- 0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,
- 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,
- 0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,
- 0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
-
-DEFINE_GUID(GUID_DEVINTERFACE_HIDDEN_VOLUME,
- 0x7f108a28L, 0x9833, 0x4b3b, 0xb7, 0x80, 0x2c, 0x6b, 0x5f, 0xa5, 0xc0, 0x62);
-
-/* Aliases for storage guids */
-#define DiskClassGuid GUID_DEVINTERFACE_DISK
-#define CdRomClassGuid GUID_DEVINTERFACE_CDROM
-#define PartitionClassGuid GUID_DEVINTERFACE_PARTITION
-#define TapeClassGuid GUID_DEVINTERFACE_TAPE
-#define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK
-#define VolumeClassGuid GUID_DEVINTERFACE_VOLUME
-#define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER
-#define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY
-#define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER
-#define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT
-#define HiddenVolumeClassGuid GUID_DEVINTERFACE_HIDDEN_VOLUME
-
-typedef enum _STORAGE_MEDIA_TYPE {
- DDS_4mm = 0x20,
- MiniQic,
- Travan,
- QIC,
- MP_8mm,
- AME_8mm,
- AIT1_8mm,
- DLT,
- NCTP,
- IBM_3480,
- IBM_3490E,
- IBM_Magstar_3590,
- IBM_Magstar_MP,
- STK_DATA_D3,
- SONY_DTF,
- DV_6mm,
- DMI,
- SONY_D2,
- CLEANER_CARTRIDGE,
- CD_ROM,
- CD_R,
- CD_RW,
- DVD_ROM,
- DVD_R,
- DVD_RW,
- MO_3_RW,
- MO_5_WO,
- MO_5_RW,
- MO_5_LIMDOW,
- PC_5_WO,
- PC_5_RW,
- PD_5_RW,
- ABL_5_WO,
- PINNACLE_APEX_5_RW,
- SONY_12_WO,
- PHILIPS_12_WO,
- HITACHI_12_WO,
- CYGNET_12_WO,
- KODAK_14_WO,
- MO_NFR_525,
- NIKON_12_RW,
- IOMEGA_ZIP,
- IOMEGA_JAZ,
- SYQUEST_EZ135,
- SYQUEST_EZFLYER,
- SYQUEST_SYJET,
- AVATAR_F2,
- MP2_8mm,
- DST_S,
- DST_M,
- DST_L,
- VXATape_1,
- VXATape_2,
- STK_9840,
- LTO_Ultrium,
- LTO_Accelis,
- DVD_RAM,
- AIT_8mm,
- ADR_1,
- ADR_2
-} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
-
-typedef enum _STORAGE_BUS_TYPE {
- BusTypeUnknown = 0x00,
- BusTypeScsi,
- BusTypeAtapi,
- BusTypeAta,
- BusType1394,
- BusTypeSsa,
- BusTypeFibre,
- BusTypeUsb,
- BusTypeRAID,
- BusTypeMaxReserved = 0x7F
-} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
-
-/* DEVICE_MEDIA_INFO.DeviceSpecific.DiskInfo.MediaCharacteristics constants */
-#define MEDIA_ERASEABLE 0x00000001
-#define MEDIA_WRITE_ONCE 0x00000002
-#define MEDIA_READ_ONLY 0x00000004
-#define MEDIA_READ_WRITE 0x00000008
-#define MEDIA_WRITE_PROTECTED 0x00000100
-#define MEDIA_CURRENTLY_MOUNTED 0x80000000
-
-typedef struct _DEVICE_MEDIA_INFO {
- union {
- struct {
- LARGE_INTEGER Cylinders;
- STORAGE_MEDIA_TYPE MediaType;
- ULONG TracksPerCylinder;
- ULONG SectorsPerTrack;
- ULONG BytesPerSector;
- ULONG NumberMediaSides;
- ULONG MediaCharacteristics;
- } DiskInfo;
- struct {
- LARGE_INTEGER Cylinders;
- STORAGE_MEDIA_TYPE MediaType;
- ULONG TracksPerCylinder;
- ULONG SectorsPerTrack;
- ULONG BytesPerSector;
- ULONG NumberMediaSides;
- ULONG MediaCharacteristics;
- } RemovableDiskInfo;
- struct {
- STORAGE_MEDIA_TYPE MediaType;
- ULONG MediaCharacteristics;
- ULONG CurrentBlockSize;
- STORAGE_BUS_TYPE BusType;
- union {
- struct {
- UCHAR MediumType;
- UCHAR DensityCode;
- } ScsiInformation;
- } BusSpecificData;
- } TapeInfo;
- } DeviceSpecific;
-} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
-
-typedef struct _GET_MEDIA_TYPES {
- ULONG DeviceType;
- ULONG MediaInfoCount;
- DEVICE_MEDIA_INFO MediaInfo[1];
-} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
-
-typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
- ULONG Version;
- ULONG Size;
- ULONG MaximumTransferLength;
- ULONG MaximumPhysicalPages;
- ULONG AlignmentMask;
- BOOLEAN AdapterUsesPio;
- BOOLEAN AdapterScansDown;
- BOOLEAN CommandQueueing;
- BOOLEAN AcceleratedTransfer;
- STORAGE_BUS_TYPE BusType;
- USHORT BusMajorVersion;
- USHORT BusMinorVersion;
-} STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
-
-typedef struct _STORAGE_BUS_RESET_REQUEST {
- UCHAR PathId;
-} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
-
-typedef struct _STORAGE_DESCRIPTOR_HEADER {
- ULONG Version;
- ULONG Size;
-} STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
-
-typedef struct _STORAGE_DEVICE_DESCRIPTOR {
- ULONG Version;
- ULONG Size;
- UCHAR DeviceType;
- UCHAR DeviceTypeModifier;
- BOOLEAN RemovableMedia;
- BOOLEAN CommandQueueing;
- ULONG VendorIdOffset;
- ULONG ProductIdOffset;
- ULONG ProductRevisionOffset;
- ULONG SerialNumberOffset;
- STORAGE_BUS_TYPE BusType;
- ULONG RawPropertiesLength;
- UCHAR RawDeviceProperties[1];
-} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
-
-typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
- ULONG Version;
- ULONG Size;
- ULONG NumberOfIdentifiers;
- UCHAR Identifiers[1];
-} STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
-
-typedef struct _STORAGE_DEVICE_NUMBER {
- DEVICE_TYPE DeviceType;
- ULONG DeviceNumber;
- ULONG PartitionNumber;
-} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
-
-typedef struct _STORAGE_PREDICT_FAILURE {
- ULONG PredictFailure;
- UCHAR VendorSpecific[512];
-} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
-
-typedef enum _STORAGE_PROPERTY_ID {
- StorageDeviceProperty = 0,
- StorageAdapterProperty,
- StorageDeviceIdProperty,
- StorageDeviceUniqueIdProperty,
- StorageDeviceWriteCacheProperty,
- StorageMiniportProperty,
- StorageAccessAlignmentProperty
-} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
-
-typedef enum _STORAGE_QUERY_TYPE {
- PropertyStandardQuery = 0,
- PropertyExistsQuery,
- PropertyMaskQuery,
- PropertyQueryMaxDefined
-} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
-
-typedef struct _STORAGE_PROPERTY_QUERY {
- STORAGE_PROPERTY_ID PropertyId;
- STORAGE_QUERY_TYPE QueryType;
- UCHAR AdditionalParameters[1];
-} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
-
-typedef struct _PREVENT_MEDIA_REMOVAL {
- BOOLEAN PreventMediaRemoval;
-} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __NTDDSTOR_H */
diff --git a/include/ddk/ntifs.h b/include/ddk/ntifs.h
index 15bace86764..7c91023e6d6 100644
--- a/include/ddk/ntifs.h
+++ b/include/ddk/ntifs.h
@@ -3,10 +3,11 @@
*
* Windows NT Filesystem Driver Developer Kit
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS DDK package.
*
* Contributors:
- * Created by Bo Brantén
+ * Amine Khaldi
+ * Timo Kreuzer (timo.kreuzer@reactos.org)
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
@@ -36,7 +37,8 @@ extern "C" {
#include
#include
#include
-/* FIXME : #include */
+#include
+
#ifndef FlagOn
#define FlagOn(_F,_SF) ((_F) & (_SF))
@@ -58,6 +60,9 @@ typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
typedef STRING LSA_STRING, *PLSA_STRING;
typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES;
+/******************************************************************************
+ * Security Manager Types *
+ ******************************************************************************/
#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
#define SID_IDENTIFIER_AUTHORITY_DEFINED
typedef struct _SID_IDENTIFIER_AUTHORITY {
@@ -68,10 +73,10 @@ typedef struct _SID_IDENTIFIER_AUTHORITY {
#ifndef SID_DEFINED
#define SID_DEFINED
typedef struct _SID {
- UCHAR Revision;
- UCHAR SubAuthorityCount;
- SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
- ULONG SubAuthority[ANYSIZE_ARRAY];
+ UCHAR Revision;
+ UCHAR SubAuthorityCount;
+ SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+ ULONG SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;
#endif
@@ -80,16 +85,16 @@ typedef struct _SID {
#define SID_RECOMMENDED_SUB_AUTHORITIES 1
typedef enum _SID_NAME_USE {
- SidTypeUser = 1,
- SidTypeGroup,
- SidTypeDomain,
- SidTypeAlias,
- SidTypeWellKnownGroup,
- SidTypeDeletedAccount,
- SidTypeInvalid,
- SidTypeUnknown,
- SidTypeComputer,
- SidTypeLabel
+ SidTypeUser = 1,
+ SidTypeGroup,
+ SidTypeDomain,
+ SidTypeAlias,
+ SidTypeWellKnownGroup,
+ SidTypeDeletedAccount,
+ SidTypeInvalid,
+ SidTypeUnknown,
+ SidTypeComputer,
+ SidTypeLabel
} SID_NAME_USE, *PSID_NAME_USE;
typedef struct _SID_AND_ATTRIBUTES {
@@ -215,15 +220,15 @@ typedef struct _SID_AND_ATTRIBUTES_HASH {
/* Well-known groups */
-#define DOMAIN_GROUP_RID_ADMINS (0x00000200L)
-#define DOMAIN_GROUP_RID_USERS (0x00000201L)
-#define DOMAIN_GROUP_RID_GUESTS (0x00000202L)
-#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L)
-#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L)
-#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L)
-#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
-#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
-#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
+#define DOMAIN_GROUP_RID_ADMINS (0x00000200L)
+#define DOMAIN_GROUP_RID_USERS (0x00000201L)
+#define DOMAIN_GROUP_RID_GUESTS (0x00000202L)
+#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L)
+#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L)
+#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L)
+#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
+#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
+#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
/* Well-known aliases */
@@ -275,11 +280,11 @@ typedef struct _SID_AND_ATTRIBUTES_HASH {
/* Allocate the System Luid. The first 1000 LUIDs are reserved.
Use #999 here (0x3e7 = 999) */
-#define SYSTEM_LUID { 0x3e7, 0x0 }
-#define ANONYMOUS_LOGON_LUID { 0x3e6, 0x0 }
-#define LOCALSERVICE_LUID { 0x3e5, 0x0 }
-#define NETWORKSERVICE_LUID { 0x3e4, 0x0 }
-#define IUSER_LUID { 0x3e3, 0x0 }
+#define SYSTEM_LUID {0x3e7, 0x0}
+#define ANONYMOUS_LOGON_LUID {0x3e6, 0x0}
+#define LOCALSERVICE_LUID {0x3e5, 0x0}
+#define NETWORKSERVICE_LUID {0x3e4, 0x0}
+#define IUSER_LUID {0x3e3, 0x0}
typedef struct _ACE_HEADER {
UCHAR AceType;
@@ -325,8 +330,8 @@ typedef struct _ACE_HEADER {
#define INHERITED_ACE (0x10)
#define VALID_INHERIT_FLAGS (0x1F)
-#define SUCCESSFUL_ACCESS_ACE_FLAG (0x40)
-#define FAILED_ACCESS_ACE_FLAG (0x80)
+#define SUCCESSFUL_ACCESS_ACE_FLAG (0x40)
+#define FAILED_ACCESS_ACE_FLAG (0x80)
typedef struct _ACCESS_ALLOWED_ACE {
ACE_HEADER Header;
@@ -709,6 +714,1179 @@ typedef enum _MANDATORY_LEVEL {
MandatoryLevelCount
} MANDATORY_LEVEL, *PMANDATORY_LEVEL;
+#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x0001
+#define TOKEN_HAS_BACKUP_PRIVILEGE 0x0002
+#define TOKEN_HAS_RESTORE_PRIVILEGE 0x0004
+#define TOKEN_WRITE_RESTRICTED 0x0008
+#define TOKEN_IS_RESTRICTED 0x0010
+#define TOKEN_SESSION_NOT_REFERENCED 0x0020
+#define TOKEN_SANDBOX_INERT 0x0040
+#define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080
+#define SE_BACKUP_PRIVILEGES_CHECKED 0x0100
+#define TOKEN_VIRTUALIZE_ALLOWED 0x0200
+#define TOKEN_VIRTUALIZE_ENABLED 0x0400
+#define TOKEN_IS_FILTERED 0x0800
+#define TOKEN_UIACCESS 0x1000
+#define TOKEN_NOT_LOW 0x2000
+
+typedef struct _SE_EXPORTS {
+ LUID SeCreateTokenPrivilege;
+ LUID SeAssignPrimaryTokenPrivilege;
+ LUID SeLockMemoryPrivilege;
+ LUID SeIncreaseQuotaPrivilege;
+ LUID SeUnsolicitedInputPrivilege;
+ LUID SeTcbPrivilege;
+ LUID SeSecurityPrivilege;
+ LUID SeTakeOwnershipPrivilege;
+ LUID SeLoadDriverPrivilege;
+ LUID SeCreatePagefilePrivilege;
+ LUID SeIncreaseBasePriorityPrivilege;
+ LUID SeSystemProfilePrivilege;
+ LUID SeSystemtimePrivilege;
+ LUID SeProfileSingleProcessPrivilege;
+ LUID SeCreatePermanentPrivilege;
+ LUID SeBackupPrivilege;
+ LUID SeRestorePrivilege;
+ LUID SeShutdownPrivilege;
+ LUID SeDebugPrivilege;
+ LUID SeAuditPrivilege;
+ LUID SeSystemEnvironmentPrivilege;
+ LUID SeChangeNotifyPrivilege;
+ LUID SeRemoteShutdownPrivilege;
+ PSID SeNullSid;
+ PSID SeWorldSid;
+ PSID SeLocalSid;
+ PSID SeCreatorOwnerSid;
+ PSID SeCreatorGroupSid;
+ PSID SeNtAuthoritySid;
+ PSID SeDialupSid;
+ PSID SeNetworkSid;
+ PSID SeBatchSid;
+ PSID SeInteractiveSid;
+ PSID SeLocalSystemSid;
+ PSID SeAliasAdminsSid;
+ PSID SeAliasUsersSid;
+ PSID SeAliasGuestsSid;
+ PSID SeAliasPowerUsersSid;
+ PSID SeAliasAccountOpsSid;
+ PSID SeAliasSystemOpsSid;
+ PSID SeAliasPrintOpsSid;
+ PSID SeAliasBackupOpsSid;
+ PSID SeAuthenticatedUsersSid;
+ PSID SeRestrictedSid;
+ PSID SeAnonymousLogonSid;
+ LUID SeUndockPrivilege;
+ LUID SeSyncAgentPrivilege;
+ LUID SeEnableDelegationPrivilege;
+ PSID SeLocalServiceSid;
+ PSID SeNetworkServiceSid;
+ LUID SeManageVolumePrivilege;
+ LUID SeImpersonatePrivilege;
+ LUID SeCreateGlobalPrivilege;
+ LUID SeTrustedCredManAccessPrivilege;
+ LUID SeRelabelPrivilege;
+ LUID SeIncreaseWorkingSetPrivilege;
+ LUID SeTimeZonePrivilege;
+ LUID SeCreateSymbolicLinkPrivilege;
+ PSID SeIUserSid;
+ PSID SeUntrustedMandatorySid;
+ PSID SeLowMandatorySid;
+ PSID SeMediumMandatorySid;
+ PSID SeHighMandatorySid;
+ PSID SeSystemMandatorySid;
+ PSID SeOwnerRightsSid;
+} SE_EXPORTS, *PSE_EXPORTS;
+
+typedef NTSTATUS
+(NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)(
+ IN PLUID LogonId);
+/******************************************************************************
+ * Runtime Library Types *
+ ******************************************************************************/
+
+
+#define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information"
+
+typedef PVOID
+(NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
+ IN SIZE_T NumberOfBytes);
+
+#if _WIN32_WINNT >= 0x0600
+typedef PVOID
+(NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
+ IN SIZE_T NumberOfBytes,
+ IN PVOID Buffer);
+#endif
+
+typedef VOID
+(NTAPI *PRTL_FREE_STRING_ROUTINE)(
+ IN PVOID Buffer);
+
+extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
+extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
+
+#if _WIN32_WINNT >= 0x0600
+extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
+#endif
+
+typedef NTSTATUS
+(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
+ IN PVOID Base,
+ IN OUT PVOID *CommitAddress,
+ IN OUT PSIZE_T CommitSize);
+
+typedef struct _RTL_HEAP_PARAMETERS {
+ ULONG Length;
+ SIZE_T SegmentReserve;
+ SIZE_T SegmentCommit;
+ SIZE_T DeCommitFreeBlockThreshold;
+ SIZE_T DeCommitTotalFreeThreshold;
+ SIZE_T MaximumAllocationSize;
+ SIZE_T VirtualMemoryThreshold;
+ SIZE_T InitialCommit;
+ SIZE_T InitialReserve;
+ PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
+ SIZE_T Reserved[2];
+} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+typedef struct _GENERATE_NAME_CONTEXT {
+ USHORT Checksum;
+ BOOLEAN CheckSumInserted;
+ UCHAR NameLength;
+ WCHAR NameBuffer[8];
+ ULONG ExtensionLength;
+ WCHAR ExtensionBuffer[4];
+ ULONG LastIndexValue;
+} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
+
+typedef struct _PREFIX_TABLE_ENTRY {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ struct _PREFIX_TABLE_ENTRY *NextPrefixTree;
+ RTL_SPLAY_LINKS Links;
+ PSTRING Prefix;
+} PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;
+
+typedef struct _PREFIX_TABLE {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ PPREFIX_TABLE_ENTRY NextPrefixTree;
+} PREFIX_TABLE, *PPREFIX_TABLE;
+
+typedef struct _UNICODE_PREFIX_TABLE_ENTRY {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
+ struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
+ RTL_SPLAY_LINKS Links;
+ PUNICODE_STRING Prefix;
+} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
+
+typedef struct _UNICODE_PREFIX_TABLE {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
+ PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
+} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+typedef struct _COMPRESSED_DATA_INFO {
+ USHORT CompressionFormatAndEngine;
+ UCHAR CompressionUnitShift;
+ UCHAR ChunkShift;
+ UCHAR ClusterShift;
+ UCHAR Reserved;
+ USHORT NumberOfChunks;
+ ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
+} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
+#endif
+/******************************************************************************
+ * Runtime Library Functions *
+ ******************************************************************************/
+
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlAllocateHeap(
+ IN HANDLE HeapHandle,
+ IN ULONG Flags OPTIONAL,
+ IN SIZE_T Size);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlFreeHeap(
+ IN PVOID HeapHandle,
+ IN ULONG Flags OPTIONAL,
+ IN PVOID BaseAddress);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCaptureContext(
+ OUT PCONTEXT ContextRecord);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlRandom(
+ IN OUT PULONG Seed);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlCreateUnicodeString(
+ OUT PUNICODE_STRING DestinationString,
+ IN PCWSTR SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendStringToString(
+ IN OUT PSTRING Destination,
+ IN const STRING *Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemStringToUnicodeString(
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCOEM_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeStringToOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemStringToCountedUnicodeString(
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCOEM_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToCountedOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeStringToCountedOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDowncaseUnicodeString(
+ IN OUT PUNICODE_STRING UniDest,
+ IN PCUNICODE_STRING UniSource,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeOemString (
+ IN OUT POEM_STRING OemString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxUnicodeStringToOemSize(
+ IN PCUNICODE_STRING UnicodeString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxOemStringToUnicodeSize(
+ IN PCOEM_STRING OemString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultiByteToUnicodeN(
+ OUT PWCH UnicodeString,
+ IN ULONG MaxBytesInUnicodeString,
+ OUT PULONG BytesInUnicodeString OPTIONAL,
+ IN const CHAR *MultiByteString,
+ IN ULONG BytesInMultiByteString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultiByteToUnicodeSize(
+ OUT PULONG BytesInUnicodeString,
+ IN const CHAR *MultiByteString,
+ IN ULONG BytesInMultiByteString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToMultiByteSize(
+ OUT PULONG BytesInMultiByteString,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToMultiByteN(
+ OUT PCHAR MultiByteString,
+ IN ULONG MaxBytesInMultiByteString,
+ OUT PULONG BytesInMultiByteString OPTIONAL,
+ IN PWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToMultiByteN(
+ OUT PCHAR MultiByteString,
+ IN ULONG MaxBytesInMultiByteString,
+ OUT PULONG BytesInMultiByteString OPTIONAL,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemToUnicodeN(
+ OUT PWSTR UnicodeString,
+ IN ULONG MaxBytesInUnicodeString,
+ OUT PULONG BytesInUnicodeString OPTIONAL,
+ IN PCCH OemString,
+ IN ULONG BytesInOemString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToOemN(
+ OUT PCHAR OemString,
+ IN ULONG MaxBytesInOemString,
+ OUT PULONG BytesInOemString OPTIONAL,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToOemN(
+ OUT PCHAR OemString,
+ IN ULONG MaxBytesInOemString,
+ OUT PULONG BytesInOemString OPTIONAL,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGenerate8dot3Name(
+ IN PCUNICODE_STRING Name,
+ IN BOOLEAN AllowExtendedCharacters,
+ IN OUT PGENERATE_NAME_CONTEXT Context,
+ IN OUT PUNICODE_STRING Name8dot3);
+#else
+NTSYSAPI
+VOID
+NTAPI
+RtlGenerate8dot3Name(
+ IN PCUNICODE_STRING Name,
+ IN BOOLEAN AllowExtendedCharacters,
+ IN OUT PGENERATE_NAME_CONTEXT Context,
+ IN OUT PUNICODE_STRING Name8dot3);
+#endif
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsNameLegalDOS8Dot3(
+ IN PCUNICODE_STRING Name,
+ IN OUT POEM_STRING OemName OPTIONAL,
+ IN OUT PBOOLEAN NameContainsSpaces OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsValidOemCharacter(
+ IN OUT PWCHAR Char);
+
+NTSYSAPI
+VOID
+NTAPI
+PfxInitialize(
+ OUT PPREFIX_TABLE PrefixTable);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+PfxInsertPrefix(
+ IN PPREFIX_TABLE PrefixTable,
+ IN PSTRING Prefix,
+ OUT PPREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+VOID
+NTAPI
+PfxRemovePrefix(
+ IN PPREFIX_TABLE PrefixTable,
+ IN PPREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+PPREFIX_TABLE_ENTRY
+NTAPI
+PfxFindPrefix(
+ IN PPREFIX_TABLE PrefixTable,
+ IN PSTRING FullName);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeUnicodePrefix(
+ OUT PUNICODE_PREFIX_TABLE PrefixTable);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlInsertUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN PUNICODE_STRING Prefix,
+ OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlRemoveUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+PUNICODE_PREFIX_TABLE_ENTRY
+NTAPI
+RtlFindUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN PUNICODE_STRING FullName,
+ IN ULONG CaseInsensitiveIndex);
+
+NTSYSAPI
+PUNICODE_PREFIX_TABLE_ENTRY
+NTAPI
+RtlNextUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN BOOLEAN Restart);
+
+NTSYSAPI
+SIZE_T
+NTAPI
+RtlCompareMemoryUlong(
+ IN PVOID Source,
+ IN SIZE_T Length,
+ IN ULONG Pattern);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeToSecondsSince1980(
+ IN PLARGE_INTEGER Time,
+ OUT PULONG ElapsedSeconds);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSecondsSince1980ToTime(
+ IN ULONG ElapsedSeconds,
+ OUT PLARGE_INTEGER Time);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeToSecondsSince1970(
+ IN PLARGE_INTEGER Time,
+ OUT PULONG ElapsedSeconds);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSecondsSince1970ToTime(
+ IN ULONG ElapsedSeconds,
+ OUT PLARGE_INTEGER Time);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidSid(
+ IN PSID Sid);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualSid(
+ IN PSID Sid1,
+ IN PSID Sid2);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualPrefixSid(
+ IN PSID Sid1,
+ IN PSID Sid2);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthRequiredSid(
+ IN ULONG SubAuthorityCount);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlFreeSid(
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAllocateAndInitializeSid(
+ IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
+ IN UCHAR SubAuthorityCount,
+ IN ULONG SubAuthority0,
+ IN ULONG SubAuthority1,
+ IN ULONG SubAuthority2,
+ IN ULONG SubAuthority3,
+ IN ULONG SubAuthority4,
+ IN ULONG SubAuthority5,
+ IN ULONG SubAuthority6,
+ IN ULONG SubAuthority7,
+ OUT PSID *Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitializeSid(
+ OUT PSID Sid,
+ IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
+ IN UCHAR SubAuthorityCount);
+
+NTSYSAPI
+PULONG
+NTAPI
+RtlSubAuthoritySid(
+ IN PSID Sid,
+ IN ULONG SubAuthority);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthSid(
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCopySid(
+ IN ULONG Length,
+ IN PSID Destination,
+ IN PSID Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlConvertSidToUnicodeString(
+ IN OUT PUNICODE_STRING UnicodeString,
+ IN PSID Sid,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyLuid(
+ OUT PLUID DestinationLuid,
+ IN PLUID SourceLuid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateAcl(
+ OUT PACL Acl,
+ IN ULONG AclLength,
+ IN ULONG AclRevision);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAce(
+ IN OUT PACL Acl,
+ IN ULONG AceRevision,
+ IN ULONG StartingAceIndex,
+ IN PVOID AceList,
+ IN ULONG AceListLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDeleteAce(
+ IN OUT PACL Acl,
+ IN ULONG AceIndex);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetAce(
+ IN PACL Acl,
+ IN ULONG AceIndex,
+ OUT PVOID *Ace);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAccessAllowedAce(
+ IN OUT PACL Acl,
+ IN ULONG AceRevision,
+ IN ACCESS_MASK AccessMask,
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAccessAllowedAceEx(
+ IN OUT PACL Acl,
+ IN ULONG AceRevision,
+ IN ULONG AceFlags,
+ IN ACCESS_MASK AccessMask,
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSecurityDescriptorRelative(
+ OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
+ IN ULONG Revision);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetDaclSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PBOOLEAN DaclPresent,
+ OUT PACL *Dacl,
+ OUT PBOOLEAN DaclDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetOwnerSecurityDescriptor(
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID Owner OPTIONAL,
+ IN BOOLEAN OwnerDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetOwnerSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PSID *Owner,
+ OUT PBOOLEAN OwnerDefaulted);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNtStatusToDosError(
+ IN NTSTATUS Status);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCustomCPToUnicodeN(
+ IN PCPTABLEINFO CustomCP,
+ OUT PWCH UnicodeString,
+ IN ULONG MaxBytesInUnicodeString,
+ OUT PULONG BytesInUnicodeString OPTIONAL,
+ IN PCH CustomCPString,
+ IN ULONG BytesInCustomCPString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToCustomCPN(
+ IN PCPTABLEINFO CustomCP,
+ OUT PCH CustomCPString,
+ IN ULONG MaxBytesInCustomCPString,
+ OUT PULONG BytesInCustomCPString OPTIONAL,
+ IN PWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToCustomCPN(
+ IN PCPTABLEINFO CustomCP,
+ OUT PCH CustomCPString,
+ IN ULONG MaxBytesInCustomCPString,
+ OUT PULONG BytesInCustomCPString OPTIONAL,
+ IN PWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitCodePageTable(
+ IN PUSHORT TableBase,
+ IN OUT PCPTABLEINFO CodePageTable);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlCreateHeap(
+ IN ULONG Flags,
+ IN PVOID HeapBase OPTIONAL,
+ IN SIZE_T ReserveSize OPTIONAL,
+ IN SIZE_T CommitSize OPTIONAL,
+ IN PVOID Lock OPTIONAL,
+ IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlDestroyHeap(
+ IN PVOID HeapHandle);
+
+NTSYSAPI
+USHORT
+NTAPI
+RtlCaptureStackBackTrace(
+ IN ULONG FramesToSkip,
+ IN ULONG FramesToCapture,
+ OUT PVOID *BackTrace,
+ OUT PULONG BackTraceHash OPTIONAL);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlRandomEx(
+ IN OUT PULONG Seed);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitUnicodeStringEx(
+ OUT PUNICODE_STRING DestinationString,
+ IN PCWSTR SourceString OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlValidateUnicodeString(
+ IN ULONG Flags,
+ IN PCUNICODE_STRING String);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDuplicateUnicodeString(
+ IN ULONG Flags,
+ IN PCUNICODE_STRING SourceString,
+ OUT PUNICODE_STRING DestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetCompressionWorkSpaceSize(
+ IN USHORT CompressionFormatAndEngine,
+ OUT PULONG CompressBufferWorkSpaceSize,
+ OUT PULONG CompressFragmentWorkSpaceSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCompressBuffer(
+ IN USHORT CompressionFormatAndEngine,
+ IN PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ OUT PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN ULONG UncompressedChunkSize,
+ OUT PULONG FinalCompressedSize,
+ IN PVOID WorkSpace);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressBuffer(
+ IN USHORT CompressionFormat,
+ OUT PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ IN PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ OUT PULONG FinalUncompressedSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressFragment(
+ IN USHORT CompressionFormat,
+ OUT PUCHAR UncompressedFragment,
+ IN ULONG UncompressedFragmentSize,
+ IN PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN ULONG FragmentOffset,
+ OUT PULONG FinalUncompressedSize,
+ IN PVOID WorkSpace);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDescribeChunk(
+ IN USHORT CompressionFormat,
+ IN OUT PUCHAR *CompressedBuffer,
+ IN PUCHAR EndOfCompressedBufferPlus1,
+ OUT PUCHAR *ChunkBuffer,
+ OUT PULONG ChunkSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlReserveChunk(
+ IN USHORT CompressionFormat,
+ IN OUT PUCHAR *CompressedBuffer,
+ IN PUCHAR EndOfCompressedBufferPlus1,
+ OUT PUCHAR *ChunkBuffer,
+ IN ULONG ChunkSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressChunks(
+ OUT PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ IN PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN PUCHAR CompressedTail,
+ IN ULONG CompressedTailSize,
+ IN PCOMPRESSED_DATA_INFO CompressedDataInfo);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCompressChunks(
+ IN PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ OUT PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
+ IN ULONG CompressedDataInfoLength,
+ IN PVOID WorkSpace);
+
+NTSYSAPI
+PSID_IDENTIFIER_AUTHORITY
+NTAPI
+RtlIdentifierAuthoritySid(
+ IN PSID Sid);
+
+NTSYSAPI
+PUCHAR
+NTAPI
+RtlSubAuthorityCountSid(
+ IN PSID Sid);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNtStatusToDosErrorNoTeb(
+ IN NTSTATUS Status);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSystemVolumeInformationFolder(
+ IN PCUNICODE_STRING VolumeRootPath);
+
+#if defined(_M_AMD64)
+
+FORCEINLINE
+VOID
+RtlFillMemoryUlong (
+ OUT PVOID Destination,
+ IN SIZE_T Length,
+ IN ULONG Pattern)
+{
+ PULONG Address = (PULONG)Destination;
+ if ((Length /= 4) != 0) {
+ if (((ULONG64)Address & 4) != 0) {
+ *Address = Pattern;
+ if ((Length -= 1) == 0) {
+ return;
+ }
+ Address += 1;
+ }
+ __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
+ if ((Length & 1) != 0) Address[Length - 1] = Pattern;
+ }
+ return;
+}
+
+#define RtlFillMemoryUlonglong(Destination, Length, Pattern) \
+ __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
+
+#else
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlong(
+ OUT PVOID Destination,
+ IN SIZE_T Length,
+ IN ULONG Pattern);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlonglong(
+ OUT PVOID Destination,
+ IN SIZE_T Length,
+ IN ULONGLONG Pattern);
+
+#endif /* defined(_M_AMD64) */
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitAnsiStringEx(
+ OUT PANSI_STRING DestinationString,
+ IN PCSZ SourceString OPTIONAL);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetSaclSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PBOOLEAN SaclPresent,
+ OUT PACL *Sacl,
+ OUT PBOOLEAN SaclDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetGroupSecurityDescriptor(
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID Group OPTIONAL,
+ IN BOOLEAN GroupDefaulted OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetGroupSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PSID *Group,
+ OUT PBOOLEAN GroupDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAbsoluteToSelfRelativeSD(
+ IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
+ OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL,
+ IN OUT PULONG BufferLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSelfRelativeToAbsoluteSD(
+ IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
+ OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL,
+ IN OUT PULONG AbsoluteSecurityDescriptorSize,
+ OUT PACL Dacl OPTIONAL,
+ IN OUT PULONG DaclSize,
+ OUT PACL Sacl OPTIONAL,
+ IN OUT PULONG SaclSize,
+ OUT PSID Owner OPTIONAL,
+ IN OUT PULONG OwnerSize,
+ OUT PSID PrimaryGroup OPTIONAL,
+ IN OUT PULONG PrimaryGroupSize);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlNormalizeString(
+ IN ULONG NormForm,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIsNormalizedString(
+ IN ULONG NormForm,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PBOOLEAN Normalized);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToAscii(
+ IN ULONG Flags,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToUnicode(
+ IN ULONG Flags,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToNameprepUnicode(
+ IN ULONG Flags,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateServiceSid(
+ IN PUNICODE_STRING ServiceName,
+ OUT PSID ServiceSid,
+ IN OUT PULONG ServiceSidLength);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareAltitudes(
+ IN PCUNICODE_STRING Altitude1,
+ IN PCUNICODE_STRING Altitude2);
+
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToUTF8N(
+ OUT PCHAR UTF8StringDestination,
+ IN ULONG UTF8StringMaxByteCount,
+ OUT PULONG UTF8StringActualByteCount,
+ IN PCWCH UnicodeStringSource,
+ IN ULONG UnicodeStringByteCount);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUTF8ToUnicodeN(
+ OUT PWSTR UnicodeStringDestination,
+ IN ULONG UnicodeStringMaxByteCount,
+ OUT PULONG UnicodeStringActualByteCount,
+ IN PCCH UTF8StringSource,
+ IN ULONG UTF8StringByteCount);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlReplaceSidInSd(
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID OldSid,
+ IN PSID NewSid,
+ OUT ULONG *NumChanges);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateVirtualAccountSid(
+ IN PCUNICODE_STRING Name,
+ IN ULONG BaseSubAuthority,
+ OUT PSID Sid,
+ IN OUT PULONG SidLength);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+
+#if defined(_AMD64_) || defined(_IA64_)
+
+
+
+#endif /* defined(_AMD64_) || defined(_IA64_) */
+
+
+
+#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
+#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
+
+#define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ? \
+ RtlxUnicodeStringToOemSize(STRING) : \
+ ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
+
+#define RtlOemStringToUnicodeSize(STRING) ( \
+ NLS_MB_OEM_CODE_PAGE_TAG ? \
+ RtlxOemStringToUnicodeSize(STRING) : \
+ ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
+)
+
+#define RtlOemStringToCountedUnicodeSize(STRING) ( \
+ (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
+)
+
+#define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O))))
+#define RtlPointerToOffset(B,P) ((ULONG)(((PCHAR)(P)) - ((PCHAR)(B))))
+
typedef enum _OBJECT_INFORMATION_CLASS {
ObjectBasicInformation = 0,
ObjectNameInformation = 1, /* FIXME, not in WDK */
@@ -1245,1125 +2423,6 @@ NtCreateSection(
#endif
-typedef NTSTATUS
-(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
- IN PVOID Base,
- IN OUT PVOID *CommitAddress,
- IN OUT PSIZE_T CommitSize);
-
-typedef struct _RTL_HEAP_PARAMETERS {
- ULONG Length;
- SIZE_T SegmentReserve;
- SIZE_T SegmentCommit;
- SIZE_T DeCommitFreeBlockThreshold;
- SIZE_T DeCommitTotalFreeThreshold;
- SIZE_T MaximumAllocationSize;
- SIZE_T VirtualMemoryThreshold;
- SIZE_T InitialCommit;
- SIZE_T InitialReserve;
- PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
- SIZE_T Reserved[2];
-} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlAllocateHeap(
- IN HANDLE HeapHandle,
- IN ULONG Flags OPTIONAL,
- IN SIZE_T Size);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlFreeHeap(
- IN PVOID HeapHandle,
- IN ULONG Flags OPTIONAL,
- IN PVOID BaseAddress);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlCaptureContext(
- OUT PCONTEXT ContextRecord);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlRandom(
- IN OUT PULONG Seed);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlCreateUnicodeString(
- OUT PUNICODE_STRING DestinationString,
- IN PCWSTR SourceString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAppendStringToString(
- IN OUT PSTRING Destination,
- IN const STRING *Source);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlOemStringToUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
- IN PCOEM_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeStringToOemString(
- IN OUT POEM_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeStringToOemString(
- IN OUT POEM_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlOemStringToCountedUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
- IN PCOEM_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeStringToCountedOemString(
- IN OUT POEM_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeStringToCountedOemString(
- IN OUT POEM_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDowncaseUnicodeString(
- IN OUT PUNICODE_STRING UniDest,
- IN PCUNICODE_STRING UniSource,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlFreeOemString (
- IN OUT POEM_STRING OemString);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlxUnicodeStringToOemSize(
- IN PCUNICODE_STRING UnicodeString);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlxOemStringToUnicodeSize(
- IN PCOEM_STRING OemString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlMultiByteToUnicodeN(
- OUT PWCH UnicodeString,
- IN ULONG MaxBytesInUnicodeString,
- OUT PULONG BytesInUnicodeString OPTIONAL,
- IN const CHAR *MultiByteString,
- IN ULONG BytesInMultiByteString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlMultiByteToUnicodeSize(
- OUT PULONG BytesInUnicodeString,
- IN const CHAR *MultiByteString,
- IN ULONG BytesInMultiByteString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeToMultiByteSize(
- OUT PULONG BytesInMultiByteString,
- IN PCWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeToMultiByteN(
- OUT PCHAR MultiByteString,
- IN ULONG MaxBytesInMultiByteString,
- OUT PULONG BytesInMultiByteString OPTIONAL,
- IN PWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeToMultiByteN(
- OUT PCHAR MultiByteString,
- IN ULONG MaxBytesInMultiByteString,
- OUT PULONG BytesInMultiByteString OPTIONAL,
- IN PCWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlOemToUnicodeN(
- OUT PWSTR UnicodeString,
- IN ULONG MaxBytesInUnicodeString,
- OUT PULONG BytesInUnicodeString OPTIONAL,
- IN PCCH OemString,
- IN ULONG BytesInOemString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeToOemN(
- OUT PCHAR OemString,
- IN ULONG MaxBytesInOemString,
- OUT PULONG BytesInOemString OPTIONAL,
- IN PCWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeToOemN(
- OUT PCHAR OemString,
- IN ULONG MaxBytesInOemString,
- OUT PULONG BytesInOemString OPTIONAL,
- IN PCWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-typedef struct _GENERATE_NAME_CONTEXT {
- USHORT Checksum;
- BOOLEAN CheckSumInserted;
- UCHAR NameLength;
- WCHAR NameBuffer[8];
- ULONG ExtensionLength;
- WCHAR ExtensionBuffer[4];
- ULONG LastIndexValue;
-} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
-
-#if (NTDDI_VERSION >= NTDDI_VISTASP1)
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGenerate8dot3Name(
- IN PCUNICODE_STRING Name,
- IN BOOLEAN AllowExtendedCharacters,
- IN OUT PGENERATE_NAME_CONTEXT Context,
- IN OUT PUNICODE_STRING Name8dot3);
-#else
-NTSYSAPI
-VOID
-NTAPI
-RtlGenerate8dot3Name(
- IN PCUNICODE_STRING Name,
- IN BOOLEAN AllowExtendedCharacters,
- IN OUT PGENERATE_NAME_CONTEXT Context,
- IN OUT PUNICODE_STRING Name8dot3);
-#endif
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlIsNameLegalDOS8Dot3(
- IN PCUNICODE_STRING Name,
- IN OUT POEM_STRING OemName OPTIONAL,
- IN OUT PBOOLEAN NameContainsSpaces OPTIONAL);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlIsValidOemCharacter(
- IN OUT PWCHAR Char);
-
-typedef struct _PREFIX_TABLE_ENTRY {
- CSHORT NodeTypeCode;
- CSHORT NameLength;
- struct _PREFIX_TABLE_ENTRY *NextPrefixTree;
- RTL_SPLAY_LINKS Links;
- PSTRING Prefix;
-} PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;
-
-typedef struct _PREFIX_TABLE {
- CSHORT NodeTypeCode;
- CSHORT NameLength;
- PPREFIX_TABLE_ENTRY NextPrefixTree;
-} PREFIX_TABLE, *PPREFIX_TABLE;
-
-NTSYSAPI
-VOID
-NTAPI
-PfxInitialize(
- OUT PPREFIX_TABLE PrefixTable);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-PfxInsertPrefix(
- IN PPREFIX_TABLE PrefixTable,
- IN PSTRING Prefix,
- OUT PPREFIX_TABLE_ENTRY PrefixTableEntry);
-
-NTSYSAPI
-VOID
-NTAPI
-PfxRemovePrefix(
- IN PPREFIX_TABLE PrefixTable,
- IN PPREFIX_TABLE_ENTRY PrefixTableEntry);
-
-NTSYSAPI
-PPREFIX_TABLE_ENTRY
-NTAPI
-PfxFindPrefix(
- IN PPREFIX_TABLE PrefixTable,
- IN PSTRING FullName);
-
-typedef struct _UNICODE_PREFIX_TABLE_ENTRY {
- CSHORT NodeTypeCode;
- CSHORT NameLength;
- struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
- struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
- RTL_SPLAY_LINKS Links;
- PUNICODE_STRING Prefix;
-} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
-
-typedef struct _UNICODE_PREFIX_TABLE {
- CSHORT NodeTypeCode;
- CSHORT NameLength;
- PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
- PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
-} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
-
-NTSYSAPI
-VOID
-NTAPI
-RtlInitializeUnicodePrefix(
- OUT PUNICODE_PREFIX_TABLE PrefixTable);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlInsertUnicodePrefix(
- IN PUNICODE_PREFIX_TABLE PrefixTable,
- IN PUNICODE_STRING Prefix,
- OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlRemoveUnicodePrefix(
- IN PUNICODE_PREFIX_TABLE PrefixTable,
- IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
-
-NTSYSAPI
-PUNICODE_PREFIX_TABLE_ENTRY
-NTAPI
-RtlFindUnicodePrefix(
- IN PUNICODE_PREFIX_TABLE PrefixTable,
- IN PUNICODE_STRING FullName,
- IN ULONG CaseInsensitiveIndex);
-
-NTSYSAPI
-PUNICODE_PREFIX_TABLE_ENTRY
-NTAPI
-RtlNextUnicodePrefix(
- IN PUNICODE_PREFIX_TABLE PrefixTable,
- IN BOOLEAN Restart);
-
-NTSYSAPI
-SIZE_T
-NTAPI
-RtlCompareMemoryUlong(
- IN PVOID Source,
- IN SIZE_T Length,
- IN ULONG Pattern);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlTimeToSecondsSince1980(
- IN PLARGE_INTEGER Time,
- OUT PULONG ElapsedSeconds);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlSecondsSince1980ToTime(
- IN ULONG ElapsedSeconds,
- OUT PLARGE_INTEGER Time);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlTimeToSecondsSince1970(
- IN PLARGE_INTEGER Time,
- OUT PULONG ElapsedSeconds);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlSecondsSince1970ToTime(
- IN ULONG ElapsedSeconds,
- OUT PLARGE_INTEGER Time);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlValidSid(
- IN PSID Sid);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlEqualSid(
- IN PSID Sid1,
- IN PSID Sid2);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlEqualPrefixSid(
- IN PSID Sid1,
- IN PSID Sid2);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlLengthRequiredSid(
- IN ULONG SubAuthorityCount);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlFreeSid(
- IN PSID Sid);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAllocateAndInitializeSid(
- IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
- IN UCHAR SubAuthorityCount,
- IN ULONG SubAuthority0,
- IN ULONG SubAuthority1,
- IN ULONG SubAuthority2,
- IN ULONG SubAuthority3,
- IN ULONG SubAuthority4,
- IN ULONG SubAuthority5,
- IN ULONG SubAuthority6,
- IN ULONG SubAuthority7,
- OUT PSID *Sid);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlInitializeSid(
- OUT PSID Sid,
- IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
- IN UCHAR SubAuthorityCount);
-
-NTSYSAPI
-PULONG
-NTAPI
-RtlSubAuthoritySid(
- IN PSID Sid,
- IN ULONG SubAuthority);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlLengthSid(
- IN PSID Sid);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCopySid(
- IN ULONG Length,
- IN PSID Destination,
- IN PSID Source);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlConvertSidToUnicodeString(
- IN OUT PUNICODE_STRING UnicodeString,
- IN PSID Sid,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyLuid(
- OUT PLUID DestinationLuid,
- IN PLUID SourceLuid);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateAcl(
- OUT PACL Acl,
- IN ULONG AclLength,
- IN ULONG AclRevision);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAddAce(
- IN OUT PACL Acl,
- IN ULONG AceRevision,
- IN ULONG StartingAceIndex,
- IN PVOID AceList,
- IN ULONG AceListLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDeleteAce(
- IN OUT PACL Acl,
- IN ULONG AceIndex);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetAce(
- IN PACL Acl,
- IN ULONG AceIndex,
- OUT PVOID *Ace);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAddAccessAllowedAce(
- IN OUT PACL Acl,
- IN ULONG AceRevision,
- IN ACCESS_MASK AccessMask,
- IN PSID Sid);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAddAccessAllowedAceEx(
- IN OUT PACL Acl,
- IN ULONG AceRevision,
- IN ULONG AceFlags,
- IN ACCESS_MASK AccessMask,
- IN PSID Sid);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateSecurityDescriptorRelative(
- OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
- IN ULONG Revision);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetDaclSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor,
- OUT PBOOLEAN DaclPresent,
- OUT PACL *Dacl,
- OUT PBOOLEAN DaclDefaulted);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlSetOwnerSecurityDescriptor(
- IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
- IN PSID Owner OPTIONAL,
- IN BOOLEAN OwnerDefaulted);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetOwnerSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor,
- OUT PSID *Owner,
- OUT PBOOLEAN OwnerDefaulted);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlNtStatusToDosError(
- IN NTSTATUS Status);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCustomCPToUnicodeN(
- IN PCPTABLEINFO CustomCP,
- OUT PWCH UnicodeString,
- IN ULONG MaxBytesInUnicodeString,
- OUT PULONG BytesInUnicodeString OPTIONAL,
- IN PCH CustomCPString,
- IN ULONG BytesInCustomCPString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeToCustomCPN(
- IN PCPTABLEINFO CustomCP,
- OUT PCH CustomCPString,
- IN ULONG MaxBytesInCustomCPString,
- OUT PULONG BytesInCustomCPString OPTIONAL,
- IN PWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeToCustomCPN(
- IN PCPTABLEINFO CustomCP,
- OUT PCH CustomCPString,
- IN ULONG MaxBytesInCustomCPString,
- OUT PULONG BytesInCustomCPString OPTIONAL,
- IN PWCH UnicodeString,
- IN ULONG BytesInUnicodeString);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlInitCodePageTable(
- IN PUSHORT TableBase,
- IN OUT PCPTABLEINFO CodePageTable);
-
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlCreateHeap(
- IN ULONG Flags,
- IN PVOID HeapBase OPTIONAL,
- IN SIZE_T ReserveSize OPTIONAL,
- IN SIZE_T CommitSize OPTIONAL,
- IN PVOID Lock OPTIONAL,
- IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlDestroyHeap(
- IN PVOID HeapHandle);
-
-NTSYSAPI
-USHORT
-NTAPI
-RtlCaptureStackBackTrace(
- IN ULONG FramesToSkip,
- IN ULONG FramesToCapture,
- OUT PVOID *BackTrace,
- OUT PULONG BackTraceHash OPTIONAL);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlRandomEx(
- IN OUT PULONG Seed);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlInitUnicodeStringEx(
- OUT PUNICODE_STRING DestinationString,
- IN PCWSTR SourceString OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlValidateUnicodeString(
- IN ULONG Flags,
- IN PCUNICODE_STRING String);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDuplicateUnicodeString(
- IN ULONG Flags,
- IN PCUNICODE_STRING SourceString,
- OUT PUNICODE_STRING DestinationString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetCompressionWorkSpaceSize(
- IN USHORT CompressionFormatAndEngine,
- OUT PULONG CompressBufferWorkSpaceSize,
- OUT PULONG CompressFragmentWorkSpaceSize);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCompressBuffer(
- IN USHORT CompressionFormatAndEngine,
- IN PUCHAR UncompressedBuffer,
- IN ULONG UncompressedBufferSize,
- OUT PUCHAR CompressedBuffer,
- IN ULONG CompressedBufferSize,
- IN ULONG UncompressedChunkSize,
- OUT PULONG FinalCompressedSize,
- IN PVOID WorkSpace);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDecompressBuffer(
- IN USHORT CompressionFormat,
- OUT PUCHAR UncompressedBuffer,
- IN ULONG UncompressedBufferSize,
- IN PUCHAR CompressedBuffer,
- IN ULONG CompressedBufferSize,
- OUT PULONG FinalUncompressedSize);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDecompressFragment(
- IN USHORT CompressionFormat,
- OUT PUCHAR UncompressedFragment,
- IN ULONG UncompressedFragmentSize,
- IN PUCHAR CompressedBuffer,
- IN ULONG CompressedBufferSize,
- IN ULONG FragmentOffset,
- OUT PULONG FinalUncompressedSize,
- IN PVOID WorkSpace);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDescribeChunk(
- IN USHORT CompressionFormat,
- IN OUT PUCHAR *CompressedBuffer,
- IN PUCHAR EndOfCompressedBufferPlus1,
- OUT PUCHAR *ChunkBuffer,
- OUT PULONG ChunkSize);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlReserveChunk(
- IN USHORT CompressionFormat,
- IN OUT PUCHAR *CompressedBuffer,
- IN PUCHAR EndOfCompressedBufferPlus1,
- OUT PUCHAR *ChunkBuffer,
- IN ULONG ChunkSize);
-
-typedef struct _COMPRESSED_DATA_INFO {
- USHORT CompressionFormatAndEngine;
- UCHAR CompressionUnitShift;
- UCHAR ChunkShift;
- UCHAR ClusterShift;
- UCHAR Reserved;
- USHORT NumberOfChunks;
- ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
-} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlDecompressChunks(
- OUT PUCHAR UncompressedBuffer,
- IN ULONG UncompressedBufferSize,
- IN PUCHAR CompressedBuffer,
- IN ULONG CompressedBufferSize,
- IN PUCHAR CompressedTail,
- IN ULONG CompressedTailSize,
- IN PCOMPRESSED_DATA_INFO CompressedDataInfo);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCompressChunks(
- IN PUCHAR UncompressedBuffer,
- IN ULONG UncompressedBufferSize,
- OUT PUCHAR CompressedBuffer,
- IN ULONG CompressedBufferSize,
- IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
- IN ULONG CompressedDataInfoLength,
- IN PVOID WorkSpace);
-
-NTSYSAPI
-PSID_IDENTIFIER_AUTHORITY
-NTAPI
-RtlIdentifierAuthoritySid(
- IN PSID Sid);
-
-NTSYSAPI
-PUCHAR
-NTAPI
-RtlSubAuthorityCountSid(
- IN PSID Sid);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlNtStatusToDosErrorNoTeb(
- IN NTSTATUS Status);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateSystemVolumeInformationFolder(
- IN PCUNICODE_STRING VolumeRootPath);
-
-#endif
-
-#if defined(_M_AMD64)
-
-FORCEINLINE
-VOID
-RtlFillMemoryUlong (
- OUT PVOID Destination,
- IN SIZE_T Length,
- IN ULONG Pattern)
-{
- PULONG Address = (PULONG)Destination;
- if ((Length /= 4) != 0) {
- if (((ULONG64)Address & 4) != 0) {
- *Address = Pattern;
- if ((Length -= 1) == 0) {
- return;
- }
- Address += 1;
- }
- __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
- if ((Length & 1) != 0) Address[Length - 1] = Pattern;
- }
- return;
-}
-
-#define RtlFillMemoryUlonglong(Destination, Length, Pattern) \
- __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
-
-#else
-
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-
-NTSYSAPI
-VOID
-NTAPI
-RtlFillMemoryUlong(
- OUT PVOID Destination,
- IN SIZE_T Length,
- IN ULONG Pattern);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlFillMemoryUlonglong(
- OUT PVOID Destination,
- IN SIZE_T Length,
- IN ULONGLONG Pattern);
-
-#endif
-
-#endif // defined(_M_AMD64)
-
-#if (NTDDI_VERSION >= NTDDI_WS03)
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlInitAnsiStringEx(
- OUT PANSI_STRING DestinationString,
- IN PCSZ SourceString OPTIONAL);
-
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_WS03SP1)
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetSaclSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor,
- OUT PBOOLEAN SaclPresent,
- OUT PACL *Sacl,
- OUT PBOOLEAN SaclDefaulted);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlSetGroupSecurityDescriptor(
- IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
- IN PSID Group OPTIONAL,
- IN BOOLEAN GroupDefaulted OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetGroupSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor,
- OUT PSID *Group,
- OUT PBOOLEAN GroupDefaulted);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlAbsoluteToSelfRelativeSD(
- IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
- OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL,
- IN OUT PULONG BufferLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlSelfRelativeToAbsoluteSD(
- IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
- OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL,
- IN OUT PULONG AbsoluteSecurityDescriptorSize,
- OUT PACL Dacl OPTIONAL,
- IN OUT PULONG DaclSize,
- OUT PACL Sacl OPTIONAL,
- IN OUT PULONG SaclSize,
- OUT PSID Owner OPTIONAL,
- IN OUT PULONG OwnerSize,
- OUT PSID PrimaryGroup OPTIONAL,
- IN OUT PULONG PrimaryGroupSize);
-
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlNormalizeString(
- IN ULONG NormForm,
- IN PCWSTR SourceString,
- IN LONG SourceStringLength,
- OUT PWSTR DestinationString,
- IN OUT PLONG DestinationStringLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlIsNormalizedString(
- IN ULONG NormForm,
- IN PCWSTR SourceString,
- IN LONG SourceStringLength,
- OUT PBOOLEAN Normalized);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlIdnToAscii(
- IN ULONG Flags,
- IN PCWSTR SourceString,
- IN LONG SourceStringLength,
- OUT PWSTR DestinationString,
- IN OUT PLONG DestinationStringLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlIdnToUnicode(
- IN ULONG Flags,
- IN PCWSTR SourceString,
- IN LONG SourceStringLength,
- OUT PWSTR DestinationString,
- IN OUT PLONG DestinationStringLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlIdnToNameprepUnicode(
- IN ULONG Flags,
- IN PCWSTR SourceString,
- IN LONG SourceStringLength,
- OUT PWSTR DestinationString,
- IN OUT PLONG DestinationStringLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateServiceSid(
- IN PUNICODE_STRING ServiceName,
- OUT PSID ServiceSid,
- IN OUT PULONG ServiceSidLength);
-
-NTSYSAPI
-LONG
-NTAPI
-RtlCompareAltitudes(
- IN PCUNICODE_STRING Altitude1,
- IN PCUNICODE_STRING Altitude2);
-
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUnicodeToUTF8N(
- OUT PCHAR UTF8StringDestination,
- IN ULONG UTF8StringMaxByteCount,
- OUT PULONG UTF8StringActualByteCount,
- IN PCWCH UnicodeStringSource,
- IN ULONG UnicodeStringByteCount);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUTF8ToUnicodeN(
- OUT PWSTR UnicodeStringDestination,
- IN ULONG UnicodeStringMaxByteCount,
- OUT PULONG UnicodeStringActualByteCount,
- IN PCCH UTF8StringSource,
- IN ULONG UTF8StringByteCount);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlReplaceSidInSd(
- IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
- IN PSID OldSid,
- IN PSID NewSid,
- OUT ULONG *NumChanges);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCreateVirtualAccountSid(
- IN PCUNICODE_STRING Name,
- IN ULONG BaseSubAuthority,
- OUT PSID Sid,
- IN OUT PULONG SidLength);
-
-#endif
-
-#define HEAP_NO_SERIALIZE 0x00000001
-#define HEAP_GROWABLE 0x00000002
-#define HEAP_GENERATE_EXCEPTIONS 0x00000004
-#define HEAP_ZERO_MEMORY 0x00000008
-#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
-#define HEAP_TAIL_CHECKING_ENABLED 0x00000020
-#define HEAP_FREE_CHECKING_ENABLED 0x00000040
-#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
-
-#define HEAP_CREATE_ALIGN_16 0x00010000
-#define HEAP_CREATE_ENABLE_TRACING 0x00020000
-#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
-
-#define HEAP_SETTABLE_USER_VALUE 0x00000100
-#define HEAP_SETTABLE_USER_FLAG1 0x00000200
-#define HEAP_SETTABLE_USER_FLAG2 0x00000400
-#define HEAP_SETTABLE_USER_FLAG3 0x00000800
-#define HEAP_SETTABLE_USER_FLAGS 0x00000E00
-
-#define HEAP_CLASS_0 0x00000000
-#define HEAP_CLASS_1 0x00001000
-#define HEAP_CLASS_2 0x00002000
-#define HEAP_CLASS_3 0x00003000
-#define HEAP_CLASS_4 0x00004000
-#define HEAP_CLASS_5 0x00005000
-#define HEAP_CLASS_6 0x00006000
-#define HEAP_CLASS_7 0x00007000
-#define HEAP_CLASS_8 0x00008000
-#define HEAP_CLASS_MASK 0x0000F000
-
-#define HEAP_MAXIMUM_TAG 0x0FFF
-#define HEAP_GLOBAL_TAG 0x0800
-#define HEAP_PSEUDO_TAG_FLAG 0x8000
-#define HEAP_TAG_SHIFT 18
-#define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
-
-#define HEAP_CREATE_VALID_MASK (HEAP_NO_SERIALIZE | \
- HEAP_GROWABLE | \
- HEAP_GENERATE_EXCEPTIONS | \
- HEAP_ZERO_MEMORY | \
- HEAP_REALLOC_IN_PLACE_ONLY | \
- HEAP_TAIL_CHECKING_ENABLED | \
- HEAP_FREE_CHECKING_ENABLED | \
- HEAP_DISABLE_COALESCE_ON_FREE | \
- HEAP_CLASS_MASK | \
- HEAP_CREATE_ALIGN_16 | \
- HEAP_CREATE_ENABLE_TRACING | \
- HEAP_CREATE_ENABLE_EXECUTE)
-
-FORCEINLINE
-ULONG
-HEAP_MAKE_TAG_FLAGS(
- IN ULONG TagBase,
- IN ULONG Tag)
-{
- //__assume_bound(TagBase); // FIXME
- return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
-}
-
-#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
-#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
-
-#define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ? \
- RtlxUnicodeStringToOemSize(STRING) : \
- ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
-)
-
-#define RtlOemStringToUnicodeSize(STRING) ( \
- NLS_MB_OEM_CODE_PAGE_TAG ? \
- RtlxOemStringToUnicodeSize(STRING) : \
- ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
-)
-
-#define RtlOemStringToCountedUnicodeSize(STRING) ( \
- (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
-)
-
-typedef PVOID
-(NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
- IN SIZE_T NumberOfBytes);
-
-#if _WIN32_WINNT >= 0x0600
-
-typedef PVOID
-(NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
- IN SIZE_T NumberOfBytes,
- IN PVOID Buffer);
-
-#endif
-
-typedef VOID
-(NTAPI *PRTL_FREE_STRING_ROUTINE)(
- IN PVOID Buffer);
-
-extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
-extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
-
-#if _WIN32_WINNT >= 0x0600
-extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
-#endif
-
#define COMPRESSION_FORMAT_NONE (0x0000)
#define COMPRESSION_FORMAT_DEFAULT (0x0001)
#define COMPRESSION_FORMAT_LZNT1 (0x0002)
@@ -2371,19 +2430,14 @@ extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
#define COMPRESSION_ENGINE_MAXIMUM (0x0100)
#define COMPRESSION_ENGINE_HIBER (0x0200)
-#define RtlOffsetToPointer(B,O) ((PCHAR)( ((PCHAR)(B)) + ((ULONG_PTR)(O)) ))
-#define RtlPointerToOffset(B,P) ((ULONG)( ((PCHAR)(P)) - ((PCHAR)(B)) ))
-
#define MAX_UNICODE_STACK_BUFFER_LENGTH 256
-#define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information"
-
-#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
+#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
-typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
+typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
typedef enum _SECURITY_LOGON_TYPE {
UndefinedLogonType = 0,
@@ -2455,20 +2509,20 @@ LsaFreeReturnBuffer(
#define MSV1_0_SUBAUTHENTICATION_KEY "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0"
#define MSV1_0_SUBAUTHENTICATION_VALUE "Auth"
-#define MSV1_0_CHALLENGE_LENGTH 8
-#define MSV1_0_USER_SESSION_KEY_LENGTH 16
-#define MSV1_0_LANMAN_SESSION_KEY_LENGTH 8
+#define MSV1_0_CHALLENGE_LENGTH 8
+#define MSV1_0_USER_SESSION_KEY_LENGTH 16
+#define MSV1_0_LANMAN_SESSION_KEY_LENGTH 8
-#define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED 0x02
-#define MSV1_0_UPDATE_LOGON_STATISTICS 0x04
-#define MSV1_0_RETURN_USER_PARAMETERS 0x08
-#define MSV1_0_DONT_TRY_GUEST_ACCOUNT 0x10
-#define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT 0x20
-#define MSV1_0_RETURN_PASSWORD_EXPIRY 0x40
-#define MSV1_0_USE_CLIENT_CHALLENGE 0x80
-#define MSV1_0_TRY_GUEST_ACCOUNT_ONLY 0x100
-#define MSV1_0_RETURN_PROFILE_PATH 0x200
-#define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY 0x400
+#define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED 0x02
+#define MSV1_0_UPDATE_LOGON_STATISTICS 0x04
+#define MSV1_0_RETURN_USER_PARAMETERS 0x08
+#define MSV1_0_DONT_TRY_GUEST_ACCOUNT 0x10
+#define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT 0x20
+#define MSV1_0_RETURN_PASSWORD_EXPIRY 0x40
+#define MSV1_0_USE_CLIENT_CHALLENGE 0x80
+#define MSV1_0_TRY_GUEST_ACCOUNT_ONLY 0x100
+#define MSV1_0_RETURN_PROFILE_PATH 0x200
+#define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY 0x400
#define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 0x800
#define MSV1_0_DISABLE_PERSONAL_FALLBACK 0x00001000
@@ -2784,6 +2838,8 @@ typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
SECURITY_LOGON_TYPE LogonType;
} MSV1_0_GETUSERINFO_RESPONSE, *PMSV1_0_GETUSERINFO_RESPONSE;
+
+
#define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007
#define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008
#define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009
@@ -2817,8 +2873,8 @@ typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
#define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B
/* end winnt.h */
-#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
-#define FILE_PIPE_MESSAGE_TYPE 0x00000001
+#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
+#define FILE_PIPE_MESSAGE_TYPE 0x00000001
#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
@@ -2827,44 +2883,44 @@ typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
#define FILE_PIPE_TYPE_VALID_MASK 0x00000003
-#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
-#define FILE_PIPE_MESSAGE_MODE 0x00000001
+#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
+#define FILE_PIPE_MESSAGE_MODE 0x00000001
-#define FILE_PIPE_QUEUE_OPERATION 0x00000000
-#define FILE_PIPE_COMPLETE_OPERATION 0x00000001
+#define FILE_PIPE_QUEUE_OPERATION 0x00000000
+#define FILE_PIPE_COMPLETE_OPERATION 0x00000001
-#define FILE_PIPE_INBOUND 0x00000000
-#define FILE_PIPE_OUTBOUND 0x00000001
-#define FILE_PIPE_FULL_DUPLEX 0x00000002
+#define FILE_PIPE_INBOUND 0x00000000
+#define FILE_PIPE_OUTBOUND 0x00000001
+#define FILE_PIPE_FULL_DUPLEX 0x00000002
-#define FILE_PIPE_DISCONNECTED_STATE 0x00000001
-#define FILE_PIPE_LISTENING_STATE 0x00000002
-#define FILE_PIPE_CONNECTED_STATE 0x00000003
-#define FILE_PIPE_CLOSING_STATE 0x00000004
+#define FILE_PIPE_DISCONNECTED_STATE 0x00000001
+#define FILE_PIPE_LISTENING_STATE 0x00000002
+#define FILE_PIPE_CONNECTED_STATE 0x00000003
+#define FILE_PIPE_CLOSING_STATE 0x00000004
-#define FILE_PIPE_CLIENT_END 0x00000000
-#define FILE_PIPE_SERVER_END 0x00000001
+#define FILE_PIPE_CLIENT_END 0x00000000
+#define FILE_PIPE_SERVER_END 0x00000001
-#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
-#define FILE_CASE_PRESERVED_NAMES 0x00000002
-#define FILE_UNICODE_ON_DISK 0x00000004
-#define FILE_PERSISTENT_ACLS 0x00000008
-#define FILE_FILE_COMPRESSION 0x00000010
-#define FILE_VOLUME_QUOTAS 0x00000020
-#define FILE_SUPPORTS_SPARSE_FILES 0x00000040
-#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
-#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
-#define FILE_VOLUME_IS_COMPRESSED 0x00008000
-#define FILE_SUPPORTS_OBJECT_IDS 0x00010000
-#define FILE_SUPPORTS_ENCRYPTION 0x00020000
-#define FILE_NAMED_STREAMS 0x00040000
-#define FILE_READ_ONLY_VOLUME 0x00080000
-#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
-#define FILE_SUPPORTS_TRANSACTIONS 0x00200000
-#define FILE_SUPPORTS_HARD_LINKS 0x00400000
-#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
-#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
-#define FILE_SUPPORTS_USN_JOURNAL 0x02000000
+#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
+#define FILE_CASE_PRESERVED_NAMES 0x00000002
+#define FILE_UNICODE_ON_DISK 0x00000004
+#define FILE_PERSISTENT_ACLS 0x00000008
+#define FILE_FILE_COMPRESSION 0x00000010
+#define FILE_VOLUME_QUOTAS 0x00000020
+#define FILE_SUPPORTS_SPARSE_FILES 0x00000040
+#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
+#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
+#define FILE_VOLUME_IS_COMPRESSED 0x00008000
+#define FILE_SUPPORTS_OBJECT_IDS 0x00010000
+#define FILE_SUPPORTS_ENCRYPTION 0x00020000
+#define FILE_NAMED_STREAMS 0x00040000
+#define FILE_READ_ONLY_VOLUME 0x00080000
+#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
+#define FILE_SUPPORTS_TRANSACTIONS 0x00200000
+#define FILE_SUPPORTS_HARD_LINKS 0x00400000
+#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
+#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
+#define FILE_SUPPORTS_USN_JOURNAL 0x02000000
#define FILE_NEED_EA 0x00000080
@@ -2998,11 +3054,11 @@ typedef struct _FILE_OBJECTID_INFORMATION {
LONGLONG FileReference;
UCHAR ObjectId[16];
_ANONYMOUS_UNION union {
- __GNU_EXTENSION struct {
+ _ANONYMOUS_STRUCT struct {
UCHAR BirthVolumeId[16];
UCHAR BirthObjectId[16];
UCHAR DomainId[16];
- };
+ } DUMMYSTRUCTNAME;
UCHAR ExtendedInfo[48];
} DUMMYUNIONNAME;
} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
@@ -3633,8 +3689,8 @@ typedef struct _FILE_PREFETCH_EX {
typedef struct _FILE_OBJECTID_BUFFER {
UCHAR ObjectId[16];
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
UCHAR BirthVolumeId[16];
UCHAR BirthObjectId[16];
UCHAR DomainId[16];
@@ -3722,7 +3778,7 @@ typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
} FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
- BOOLEAN Disable;
+ BOOLEAN Disable;
} FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
typedef struct _FILE_QUERY_SPARING_BUFFER {
@@ -3791,24 +3847,23 @@ typedef struct _SHRINK_VOLUME_INFORMATION {
#define TXFS_TRANSACTION_STATE_PREPARED 0x02
#define TXFS_TRANSACTION_STATE_NOTACTIVE 0x03
-#define TXFS_MODIFY_RM_VALID_FLAGS \
- (TXFS_RM_FLAG_LOGGING_MODE | \
- TXFS_RM_FLAG_RENAME_RM | \
- TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
- TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
- TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
- TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
- TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
- TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
- TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
- TXFS_RM_FLAG_SHRINK_LOG | \
- TXFS_RM_FLAG_GROW_LOG | \
- TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \
- TXFS_RM_FLAG_PRESERVE_CHANGES | \
- TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
- TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
- TXFS_RM_FLAG_PREFER_CONSISTENCY | \
- TXFS_RM_FLAG_PREFER_AVAILABILITY)
+#define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE | \
+ TXFS_RM_FLAG_RENAME_RM | \
+ TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
+ TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
+ TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
+ TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
+ TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
+ TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
+ TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
+ TXFS_RM_FLAG_SHRINK_LOG | \
+ TXFS_RM_FLAG_GROW_LOG | \
+ TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \
+ TXFS_RM_FLAG_PRESERVE_CHANGES | \
+ TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
+ TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
+ TXFS_RM_FLAG_PREFER_CONSISTENCY | \
+ TXFS_RM_FLAG_PREFER_AVAILABILITY)
typedef struct _TXFS_MODIFY_RM {
ULONG Flags;
@@ -3968,7 +4023,7 @@ typedef struct _TXFS_LIST_TRANSACTIONS {
} TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
- union {
+ _ANONYMOUS_UNION union {
ULONG BufferLength;
UCHAR Buffer[1];
} DUMMYUNIONNAME;
@@ -4097,17 +4152,17 @@ typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
typedef struct _SD_GLOBAL_CHANGE_INPUT {
ULONG Flags;
ULONG ChangeType;
- union {
+ _ANONYMOUS_UNION union {
SD_CHANGE_MACHINE_SID_INPUT SdChange;
- };
+ } DUMMYUNIONNAME;
} SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
ULONG Flags;
ULONG ChangeType;
- union {
+ _ANONYMOUS_UNION union {
SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
- };
+ } DUMMYUNIONNAME;
} SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
#define ENCRYPTED_DATA_INFO_SPARSE_FILE 1
@@ -4158,15 +4213,15 @@ typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN 0x00000001
#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END 0x00000002
-DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c );
-DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7 );
-DEFINE_GUID( FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9 );
+DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
+DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
+DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
#ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
#define _VIRTUAL_STORAGE_TYPE_DEFINED
typedef struct _VIRTUAL_STORAGE_TYPE {
ULONG DeviceId;
- GUID VendorId;
+ GUID VendorId;
} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
#endif
@@ -4204,10 +4259,10 @@ typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
ULONG ResponseLevel;
ULONG NumberEntries;
- union {
+ _ANONYMOUS_UNION union {
STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[];
STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[];
- };
+ } DUMMYUNIONNAME;
} STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
#endif /* (_WIN32_WINNT >= 0x0601) */
@@ -4336,7 +4391,7 @@ typedef struct _NTFS_STATISTICS {
} Allocate;
} NTFS_STATISTICS, *PNTFS_STATISTICS;
-#endif // _FILESYSTEMFSCTL_
+#endif /* _FILESYSTEMFSCTL_ */
#define SYMLINK_FLAG_RELATIVE 1
@@ -4344,7 +4399,7 @@ typedef struct _REPARSE_DATA_BUFFER {
ULONG ReparseTag;
USHORT ReparseDataLength;
USHORT Reserved;
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
struct {
USHORT SubstituteNameOffset;
USHORT SubstituteNameLength;
@@ -4363,7 +4418,7 @@ typedef struct _REPARSE_DATA_BUFFER {
struct {
UCHAR DataBuffer[1];
} GenericReparseBuffer;
- };
+ } DUMMYUNIONNAME;
} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
@@ -4387,15 +4442,15 @@ typedef struct _REPARSE_GUID_DATA_BUFFER {
#define IO_REPARSE_TAG_RESERVED_ONE (1)
#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
-#define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
-#define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
+#define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
+#define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
-#define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF)
+#define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF)
#define IsReparseTagValid(tag) ( \
!((tag) & ~IO_REPARSE_TAG_VALID_VALUES) && \
((tag) > IO_REPARSE_TAG_RESERVED_RANGE) \
- )
+ )
/* MicroSoft reparse point tags */
#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
@@ -4422,16 +4477,16 @@ typedef struct _REPARSE_INDEX_KEY {
#define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
-#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
-#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
-#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
@@ -4440,13 +4495,13 @@ typedef struct _REPARSE_INDEX_KEY {
#define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
-#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
-#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
-#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
-#define FILE_PIPE_READ_DATA 0x00000000
-#define FILE_PIPE_WRITE_SPACE 0x00000001
+#define FILE_PIPE_READ_DATA 0x00000000
+#define FILE_PIPE_WRITE_SPACE 0x00000001
typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
HANDLE EventHandle;
@@ -4518,6 +4573,157 @@ typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
UCHAR TargetLinkTrackingInformationBuffer[1];
} REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
+#define IO_OPEN_PAGING_FILE 0x0002
+#define IO_OPEN_TARGET_DIRECTORY 0x0004
+#define IO_STOP_ON_SYMLINK 0x0008
+#define IO_MM_PAGING_FILE 0x0010
+
+typedef VOID
+(NTAPI *PDRIVER_FS_NOTIFICATION) (
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN FsActive);
+
+typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
+ SyncTypeOther = 0,
+ SyncTypeCreateSection
+} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
+
+typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
+ NotifyTypeCreate = 0,
+ NotifyTypeRetired
+} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
+
+typedef union _FS_FILTER_PARAMETERS {
+ struct {
+ PLARGE_INTEGER EndingOffset;
+ PERESOURCE *ResourceToRelease;
+ } AcquireForModifiedPageWriter;
+ struct {
+ PERESOURCE ResourceToRelease;
+ } ReleaseForModifiedPageWriter;
+ struct {
+ FS_FILTER_SECTION_SYNC_TYPE SyncType;
+ ULONG PageProtection;
+ } AcquireForSectionSynchronization;
+ struct {
+ FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
+ BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
+ } NotifyStreamFileObject;
+ struct {
+ PVOID Argument1;
+ PVOID Argument2;
+ PVOID Argument3;
+ PVOID Argument4;
+ PVOID Argument5;
+ } Others;
+} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
+
+#define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1
+#define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2
+#define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3
+#define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4
+#define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5
+#define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6
+
+typedef struct _FS_FILTER_CALLBACK_DATA {
+ ULONG SizeOfFsFilterCallbackData;
+ UCHAR Operation;
+ UCHAR Reserved;
+ struct _DEVICE_OBJECT *DeviceObject;
+ struct _FILE_OBJECT *FileObject;
+ FS_FILTER_PARAMETERS Parameters;
+} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
+
+typedef NTSTATUS
+(NTAPI *PFS_FILTER_CALLBACK) (
+ IN PFS_FILTER_CALLBACK_DATA Data,
+ OUT PVOID *CompletionContext);
+
+typedef VOID
+(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
+ IN PFS_FILTER_CALLBACK_DATA Data,
+ IN NTSTATUS OperationStatus,
+ IN PVOID CompletionContext);
+
+typedef struct _FS_FILTER_CALLBACKS {
+ ULONG SizeOfFsFilterCallbacks;
+ ULONG Reserved;
+ PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
+ PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
+ PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
+ PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
+ PFS_FILTER_CALLBACK PreAcquireForCcFlush;
+ PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
+ PFS_FILTER_CALLBACK PreReleaseForCcFlush;
+ PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
+ PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
+ PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
+ PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
+ PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
+} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlRegisterFileSystemFilterCallbacks(
+ IN struct _DRIVER_OBJECT *FilterDriverObject,
+ IN PFS_FILTER_CALLBACKS Callbacks);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlNotifyStreamFileObject(
+ IN struct _FILE_OBJECT * StreamFileObject,
+ IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
+ IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
+ IN BOOLEAN SafeToRecurse);
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#define DO_VERIFY_VOLUME 0x00000002
+#define DO_BUFFERED_IO 0x00000004
+#define DO_EXCLUSIVE 0x00000008
+#define DO_DIRECT_IO 0x00000010
+#define DO_MAP_IO_BUFFER 0x00000020
+#define DO_DEVICE_HAS_NAME 0x00000040
+#define DO_DEVICE_INITIALIZING 0x00000080
+#define DO_SYSTEM_BOOT_PARTITION 0x00000100
+#define DO_LONG_TERM_REQUESTS 0x00000200
+#define DO_NEVER_LAST_DEVICE 0x00000400
+#define DO_SHUTDOWN_REGISTERED 0x00000800
+#define DO_BUS_ENUMERATED_DEVICE 0x00001000
+#define DO_POWER_PAGABLE 0x00002000
+#define DO_POWER_INRUSH 0x00004000
+#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
+#define DO_SUPPORTS_TRANSACTIONS 0x00040000
+#define DO_FORCE_NEITHER_IO 0x00080000
+#define DO_VOLUME_DEVICE_OBJECT 0x00100000
+#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
+#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
+#define DO_DISALLOW_EXECUTE 0x00800000
+
+extern KSPIN_LOCK IoStatisticsLock;
+extern ULONG IoReadOperationCount;
+extern ULONG IoWriteOperationCount;
+extern ULONG IoOtherOperationCount;
+extern LARGE_INTEGER IoReadTransferCount;
+extern LARGE_INTEGER IoWriteTransferCount;
+extern LARGE_INTEGER IoOtherTransferCount;
+
+#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64
+#define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+typedef struct _IO_PRIORITY_INFO {
+ ULONG Size;
+ ULONG ThreadPriority;
+ ULONG PagePriority;
+ IO_PRIORITY_HINT IoPriority;
+} IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
+#endif
+
typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
ULONG Attributes;
ACCESS_MASK GrantedAccess;
@@ -4563,8 +4769,26 @@ typedef struct _KQUEUE {
LIST_ENTRY ThreadListHead;
} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+/******************************************************************************
+ * Kernel Functions *
+ ******************************************************************************/
+
+NTSTATUS
+NTAPI
+KeGetProcessorNumberFromIndex(
+ IN ULONG ProcIndex,
+ OUT PPROCESSOR_NUMBER ProcNumber);
+
+ULONG
+NTAPI
+KeGetProcessorIndexFromNumber(
+ IN PPROCESSOR_NUMBER ProcNumber);
+
#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+
+
NTKERNELAPI
VOID
NTAPI
@@ -4683,6 +4907,7 @@ KeAcquireSpinLockRaiseToSynch(
#if (NTDDI_VERSION >= NTDDI_WINXP)
+
_DECL_HAL_KE_IMPORT
KIRQL
FASTCALL
@@ -4705,6 +4930,10 @@ KeTryToAcquireQueuedSpinLock(
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+
+
+
#if (NTDDI_VERSION >= NTDDI_VISTA)
NTKERNELAPI
@@ -4725,18 +4954,22 @@ KeRemoveQueueEx (
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+
#define INVALID_PROCESSOR_INDEX 0xffffffff
-NTSTATUS
-NTAPI
-KeGetProcessorNumberFromIndex(
- IN ULONG ProcIndex,
- OUT PPROCESSOR_NUMBER ProcNumber);
+#define EX_PUSH_LOCK ULONG_PTR
+#define PEX_PUSH_LOCK PULONG_PTR
+/******************************************************************************
+ * Executive Functions *
+ ******************************************************************************/
-ULONG
-NTAPI
-KeGetProcessorIndexFromNumber(
- IN PPROCESSOR_NUMBER ProcNumber);
+
+#define ExDisableResourceBoost ExDisableResourceBoostLite
+
+VOID
+ExInitializePushLock (
+ OUT PEX_PUSH_LOCK PushLock);
#if (NTDDI_VERSION >= NTDDI_WIN2K)
@@ -4756,19 +4989,10 @@ VOID
NTAPI
ExDisableResourceBoostLite(
IN PERESOURCE Resource);
-
-#endif
-
-#define ExDisableResourceBoost ExDisableResourceBoostLite
-
-#define EX_PUSH_LOCK ULONG_PTR
-#define PEX_PUSH_LOCK PULONG_PTR
-
-VOID
-ExInitializePushLock (
- OUT PEX_PUSH_LOCK PushLock);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_WINXP)
+
PSLIST_ENTRY
FASTCALL
InterlockedPushListSList(
@@ -4776,134 +5000,15 @@ InterlockedPushListSList(
IN OUT PSLIST_ENTRY List,
IN OUT PSLIST_ENTRY ListEnd,
IN ULONG Count);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
-#endif
-
-/* #if !defined(_X86AMD64_) FIXME : WHAT ?! */
-#if defined(_WIN64)
-
-C_ASSERT(sizeof(ERESOURCE) == 0x68);
-C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x18);
-C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x1a);
-
-#else
-
-C_ASSERT(sizeof(ERESOURCE) == 0x38);
-C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x0c);
-C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x0e);
-
-#endif
-/* #endif */
-
-#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x0001
-#define TOKEN_HAS_BACKUP_PRIVILEGE 0x0002
-#define TOKEN_HAS_RESTORE_PRIVILEGE 0x0004
-#define TOKEN_WRITE_RESTRICTED 0x0008
-#define TOKEN_IS_RESTRICTED 0x0010
-#define TOKEN_SESSION_NOT_REFERENCED 0x0020
-#define TOKEN_SANDBOX_INERT 0x0040
-#define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080
-#define SE_BACKUP_PRIVILEGES_CHECKED 0x0100
-#define TOKEN_VIRTUALIZE_ALLOWED 0x0200
-#define TOKEN_VIRTUALIZE_ENABLED 0x0400
-#define TOKEN_IS_FILTERED 0x0800
-#define TOKEN_UIACCESS 0x1000
-#define TOKEN_NOT_LOW 0x2000
-
-typedef struct _SE_EXPORTS {
- LUID SeCreateTokenPrivilege;
- LUID SeAssignPrimaryTokenPrivilege;
- LUID SeLockMemoryPrivilege;
- LUID SeIncreaseQuotaPrivilege;
- LUID SeUnsolicitedInputPrivilege;
- LUID SeTcbPrivilege;
- LUID SeSecurityPrivilege;
- LUID SeTakeOwnershipPrivilege;
- LUID SeLoadDriverPrivilege;
- LUID SeCreatePagefilePrivilege;
- LUID SeIncreaseBasePriorityPrivilege;
- LUID SeSystemProfilePrivilege;
- LUID SeSystemtimePrivilege;
- LUID SeProfileSingleProcessPrivilege;
- LUID SeCreatePermanentPrivilege;
- LUID SeBackupPrivilege;
- LUID SeRestorePrivilege;
- LUID SeShutdownPrivilege;
- LUID SeDebugPrivilege;
- LUID SeAuditPrivilege;
- LUID SeSystemEnvironmentPrivilege;
- LUID SeChangeNotifyPrivilege;
- LUID SeRemoteShutdownPrivilege;
- PSID SeNullSid;
- PSID SeWorldSid;
- PSID SeLocalSid;
- PSID SeCreatorOwnerSid;
- PSID SeCreatorGroupSid;
- PSID SeNtAuthoritySid;
- PSID SeDialupSid;
- PSID SeNetworkSid;
- PSID SeBatchSid;
- PSID SeInteractiveSid;
- PSID SeLocalSystemSid;
- PSID SeAliasAdminsSid;
- PSID SeAliasUsersSid;
- PSID SeAliasGuestsSid;
- PSID SeAliasPowerUsersSid;
- PSID SeAliasAccountOpsSid;
- PSID SeAliasSystemOpsSid;
- PSID SeAliasPrintOpsSid;
- PSID SeAliasBackupOpsSid;
- PSID SeAuthenticatedUsersSid;
- PSID SeRestrictedSid;
- PSID SeAnonymousLogonSid;
- LUID SeUndockPrivilege;
- LUID SeSyncAgentPrivilege;
- LUID SeEnableDelegationPrivilege;
- PSID SeLocalServiceSid;
- PSID SeNetworkServiceSid;
- LUID SeManageVolumePrivilege;
- LUID SeImpersonatePrivilege;
- LUID SeCreateGlobalPrivilege;
- LUID SeTrustedCredManAccessPrivilege;
- LUID SeRelabelPrivilege;
- LUID SeIncreaseWorkingSetPrivilege;
- LUID SeTimeZonePrivilege;
- LUID SeCreateSymbolicLinkPrivilege;
- PSID SeIUserSid;
- PSID SeUntrustedMandatorySid;
- PSID SeLowMandatorySid;
- PSID SeMediumMandatorySid;
- PSID SeHighMandatorySid;
- PSID SeSystemMandatorySid;
- PSID SeOwnerRightsSid;
-} SE_EXPORTS, *PSE_EXPORTS;
-
-typedef NTSTATUS
-(NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)(
- IN PLUID LogonId);
-
-#define SeLengthSid( Sid ) \
- (8 + (4 * ((SID *)Sid)->SubAuthorityCount))
-
-#define SeDeleteClientSecurity(C) { \
- if (SeTokenType((C)->ClientToken) == TokenPrimary) { \
- PsDereferencePrimaryToken( (C)->ClientToken ); \
- } else { \
- PsDereferenceImpersonationToken( (C)->ClientToken ); \
- } \
-}
-
-#define SeStopImpersonatingClient() PsRevertToSelf()
-
-#define SeQuerySubjectContextToken( SubjectContext ) \
- ( ARGUMENT_PRESENT( \
- ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken \
- ) ? \
- ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken : \
- ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )
+/******************************************************************************
+ * Security Manager Functions *
+ ******************************************************************************/
#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
NTKERNELAPI
VOID
NTAPI
@@ -5104,7 +5209,6 @@ SeQueryInformationToken(
OUT PVOID *TokenInformation);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
NTKERNELAPI
BOOLEAN
@@ -5157,6 +5261,7 @@ SeAuditingHardLinkEventsWithContext(
#endif
+
#if (NTDDI_VERSION >= NTDDI_VISTA)
NTKERNELAPI
@@ -5238,7 +5343,6 @@ SeAuditTransactionStateChange(
IN GUID *TransactionId,
IN GUID *ResourceManagerId,
IN ULONG NewTransactionState);
-
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
#if (NTDDI_VERSION >= NTDDI_VISTA || (NTDDI_VERSION >= NTDDI_WINXPSP2 && NTDDI_VERSION < NTDDI_WS03))
@@ -5278,7 +5382,7 @@ SeMaximumAuditMaskFromGlobalSacl(
IN PACCESS_TOKEN Token,
IN OUT PACCESS_MASK AuditMask);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
NTSTATUS
NTAPI
@@ -5315,10 +5419,48 @@ SeLocateProcessImageName(
IN OUT PEPROCESS Process,
OUT PUNICODE_STRING *pImageFileName);
+#define SeLengthSid( Sid ) \
+ (8 + (4 * ((SID *)Sid)->SubAuthorityCount))
+
+#define SeDeleteClientSecurity(C) { \
+ if (SeTokenType((C)->ClientToken) == TokenPrimary) { \
+ PsDereferencePrimaryToken( (C)->ClientToken ); \
+ } else { \
+ PsDereferenceImpersonationToken( (C)->ClientToken ); \
+ } \
+}
+
+#define SeStopImpersonatingClient() PsRevertToSelf()
+
+#define SeQuerySubjectContextToken( SubjectContext ) \
+ ( ARGUMENT_PRESENT( \
+ ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken \
+ ) ? \
+ ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken : \
+ ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )
+
extern NTKERNELAPI PSE_EXPORTS SeExports;
+/******************************************************************************
+ * Process Manager Functions *
+ ******************************************************************************/
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupProcessByProcessId(
+ IN HANDLE ProcessId,
+ OUT PEPROCESS *Process);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupThreadByThreadId(
+ IN HANDLE UniqueThreadId,
+ OUT PETHREAD *Thread);
#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
NTKERNELAPI
PACCESS_TOKEN
NTAPI
@@ -5331,8 +5473,7 @@ PsReferenceImpersonationToken(
NTKERNELAPI
LARGE_INTEGER
NTAPI
-PsGetProcessExitTime(
- VOID);
+PsGetProcessExitTime(VOID);
NTKERNELAPI
BOOLEAN
@@ -5367,8 +5508,7 @@ PsRestoreImpersonation(
NTKERNELAPI
VOID
NTAPI
-PsRevertToSelf(
- VOID);
+PsRevertToSelf(VOID);
NTKERNELAPI
VOID
@@ -5398,11 +5538,10 @@ HANDLE
NTAPI
PsReferencePrimaryToken(
IN OUT PEPROCESS Process);
-
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-
#if (NTDDI_VERSION >= NTDDI_WINXP)
+
NTKERNELAPI
VOID
NTAPI
@@ -5428,164 +5567,19 @@ BOOLEAN
NTAPI
PsIsSystemThread(
IN PETHREAD Thread);
-
-#endif
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsLookupProcessByProcessId(
- IN HANDLE ProcessId,
- OUT PEPROCESS *Process);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-PsLookupThreadByThreadId(
- IN HANDLE UniqueThreadId,
- OUT PETHREAD *Thread);
-
-#define IO_OPEN_PAGING_FILE 0x0002
-#define IO_OPEN_TARGET_DIRECTORY 0x0004
-#define IO_STOP_ON_SYMLINK 0x0008
-#define IO_MM_PAGING_FILE 0x0010
-
-typedef VOID
-(NTAPI *PDRIVER_FS_NOTIFICATION) (
- IN PDEVICE_OBJECT DeviceObject,
- IN BOOLEAN FsActive);
-
-typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
- SyncTypeOther = 0,
- SyncTypeCreateSection
-} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
-
-typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
- NotifyTypeCreate = 0,
- NotifyTypeRetired
-} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
-
-typedef union _FS_FILTER_PARAMETERS {
- struct {
- PLARGE_INTEGER EndingOffset;
- PERESOURCE *ResourceToRelease;
- } AcquireForModifiedPageWriter;
- struct {
- PERESOURCE ResourceToRelease;
- } ReleaseForModifiedPageWriter;
- struct {
- FS_FILTER_SECTION_SYNC_TYPE SyncType;
- ULONG PageProtection;
- } AcquireForSectionSynchronization;
- struct {
- FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
- BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
- } NotifyStreamFileObject;
- struct {
- PVOID Argument1;
- PVOID Argument2;
- PVOID Argument3;
- PVOID Argument4;
- PVOID Argument5;
- } Others;
-} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
-
-#define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1
-#define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2
-#define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3
-#define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4
-#define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5
-#define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6
-
-typedef struct _FS_FILTER_CALLBACK_DATA {
- ULONG SizeOfFsFilterCallbackData;
- UCHAR Operation;
- UCHAR Reserved;
- struct _DEVICE_OBJECT *DeviceObject;
- struct _FILE_OBJECT *FileObject;
- FS_FILTER_PARAMETERS Parameters;
-} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
-
-typedef NTSTATUS
-(NTAPI *PFS_FILTER_CALLBACK) (
- IN PFS_FILTER_CALLBACK_DATA Data,
- OUT PVOID *CompletionContext);
-
-typedef VOID
-(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
- IN PFS_FILTER_CALLBACK_DATA Data,
- IN NTSTATUS OperationStatus,
- IN PVOID CompletionContext);
-
-typedef struct _FS_FILTER_CALLBACKS {
- ULONG SizeOfFsFilterCallbacks;
- ULONG Reserved;
- PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
- PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
- PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
- PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
- PFS_FILTER_CALLBACK PreAcquireForCcFlush;
- PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
- PFS_FILTER_CALLBACK PreReleaseForCcFlush;
- PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
- PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
- PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
- PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
- PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
-} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
-
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-NTKERNELAPI
-NTSTATUS
-NTAPI
-FsRtlRegisterFileSystemFilterCallbacks(
- IN struct _DRIVER_OBJECT *FilterDriverObject,
- IN PFS_FILTER_CALLBACKS Callbacks);
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-NTKERNELAPI
-NTSTATUS
-NTAPI
-FsRtlNotifyStreamFileObject(
- IN struct _FILE_OBJECT * StreamFileObject,
- IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
- IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
- IN BOOLEAN SafeToRecurse);
-#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+/******************************************************************************
+ * I/O Manager Functions *
+ ******************************************************************************/
-#define DO_VERIFY_VOLUME 0x00000002
-#define DO_BUFFERED_IO 0x00000004
-#define DO_EXCLUSIVE 0x00000008
-#define DO_DIRECT_IO 0x00000010
-#define DO_MAP_IO_BUFFER 0x00000020
-#define DO_DEVICE_HAS_NAME 0x00000040
-#define DO_DEVICE_INITIALIZING 0x00000080
-#define DO_SYSTEM_BOOT_PARTITION 0x00000100
-#define DO_LONG_TERM_REQUESTS 0x00000200
-#define DO_NEVER_LAST_DEVICE 0x00000400
-#define DO_SHUTDOWN_REGISTERED 0x00000800
-#define DO_BUS_ENUMERATED_DEVICE 0x00001000
-#define DO_POWER_PAGABLE 0x00002000
-#define DO_POWER_INRUSH 0x00004000
-#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
-#define DO_SUPPORTS_TRANSACTIONS 0x00040000
-#define DO_FORCE_NEITHER_IO 0x00080000
-#define DO_VOLUME_DEVICE_OBJECT 0x00100000
-#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
-#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
-#define DO_DISALLOW_EXECUTE 0x00800000
-
-extern KSPIN_LOCK IoStatisticsLock;
-extern ULONG IoReadOperationCount;
-extern ULONG IoWriteOperationCount;
-extern ULONG IoOtherOperationCount;
-extern LARGE_INTEGER IoReadTransferCount;
-extern LARGE_INTEGER IoWriteTransferCount;
-extern LARGE_INTEGER IoOtherTransferCount;
-
-#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64
-#define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024
+#define IoIsFileOpenedExclusively(FileObject) ( \
+ (BOOLEAN) !( \
+ (FileObject)->SharedRead || \
+ (FileObject)->SharedWrite || \
+ (FileObject)->SharedDelete \
+ ) \
+)
#if (NTDDI_VERSION == NTDDI_WIN2K)
NTKERNELAPI
@@ -5595,9 +5589,9 @@ IoRegisterFsRegistrationChangeEx(
IN PDRIVER_OBJECT DriverObject,
IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
#endif
-
#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
NTKERNELAPI
VOID
NTAPI
@@ -5697,8 +5691,7 @@ IoGetBaseFileSystemDeviceObject(
NTKERNELAPI
PCONFIGURATION_INFORMATION
NTAPI
-IoGetConfigurationInformation(
- VOID);
+IoGetConfigurationInformation(VOID);
NTKERNELAPI
ULONG
@@ -5715,8 +5708,7 @@ IoGetRequestorProcess(
NTKERNELAPI
PIRP
NTAPI
-IoGetTopLevelIrp(
- VOID);
+IoGetTopLevelIrp(VOID);
NTKERNELAPI
BOOLEAN
@@ -5849,8 +5841,10 @@ IoGetRequestorSessionId(
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
#if (NTDDI_VERSION >= NTDDI_WINXP)
+
NTKERNELAPI
PFILE_OBJECT
NTAPI
@@ -5894,9 +5888,11 @@ IoGetDiskDeviceObject(
IN PDEVICE_OBJECT FileSystemDeviceObject,
OUT PDEVICE_OBJECT *DiskDeviceObject);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+
NTKERNELAPI
NTSTATUS
NTAPI
@@ -5904,9 +5900,10 @@ IoEnumerateRegisteredFiltersList(
OUT PDRIVER_OBJECT *DriverObjectList,
IN ULONG DriverObjectListSize,
OUT PULONG ActualNumberDriverObjects);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
+
VOID
FORCEINLINE
NTAPI
@@ -5918,10 +5915,11 @@ IoInitializePriorityInfo(
PriorityInfo->IoPriority = IoPriorityNormal;
PriorityInfo->PagePriority = 0;
}
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
#if (NTDDI_VERSION >= NTDDI_WIN7)
+
NTKERNELAPI
NTSTATUS
NTAPI
@@ -5937,25 +5935,8 @@ IoReplaceFileObjectName(
IN PFILE_OBJECT FileObject,
IN PWSTR NewFileName,
IN USHORT FileNameLength);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-#endif
-
-#define IoIsFileOpenedExclusively(FileObject) ( \
- (BOOLEAN) !( \
- (FileObject)->SharedRead || \
- (FileObject)->SharedWrite || \
- (FileObject)->SharedDelete \
- ) \
-)
-
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-typedef struct _IO_PRIORITY_INFO {
- ULONG Size;
- ULONG ThreadPriority;
- ULONG PagePriority;
- IO_PRIORITY_HINT IoPriority;
-} IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
-#endif
#define PO_CB_SYSTEM_POWER_POLICY 0
#define PO_CB_AC_STATUS 1
@@ -5964,6 +5945,7 @@ typedef struct _IO_PRIORITY_INFO {
#define PO_CB_LID_SWITCH_STATE 4
#define PO_CB_PROCESSOR_POWER_POLICY 5
+
#if (NTDDI_VERSION >= NTDDI_WINXP)
NTKERNELAPI
NTSTATUS
@@ -5971,27 +5953,98 @@ NTAPI
PoQueueShutdownWorkItem(
IN OUT PWORK_QUEUE_ITEM WorkItem);
#endif
-
-#if defined(_IA64_)
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-ULONG
-NTAPI
-HalGetDmaAlignmentRequirement(
- VOID);
-#endif
-#endif
-
-#if defined(_M_IX86) || defined(_M_AMD64)
-#define HalGetDmaAlignmentRequirement() 1L
-#endif
-
+/******************************************************************************
+ * Memory manager Types *
+ ******************************************************************************/
typedef enum _MMFLUSH_TYPE {
MmFlushForDelete,
MmFlushForWrite
} MMFLUSH_TYPE;
+typedef struct _READ_LIST {
+ PFILE_OBJECT FileObject;
+ ULONG NumberOfEntries;
+ LOGICAL IsImage;
+ FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY];
+} READ_LIST, *PREAD_LIST;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef union _MM_PREFETCH_FLAGS {
+ struct {
+ ULONG Priority : SYSTEM_PAGE_PRIORITY_BITS;
+ ULONG RepurposePriority : SYSTEM_PAGE_PRIORITY_BITS;
+ } Flags;
+ ULONG AllFlags;
+} MM_PREFETCH_FLAGS, *PMM_PREFETCH_FLAGS;
+
+#define MM_PREFETCH_FLAGS_MASK ((1 << (2*SYSTEM_PAGE_PRIORITY_BITS)) - 1)
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#define HEAP_NO_SERIALIZE 0x00000001
+#define HEAP_GROWABLE 0x00000002
+#define HEAP_GENERATE_EXCEPTIONS 0x00000004
+#define HEAP_ZERO_MEMORY 0x00000008
+#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
+#define HEAP_TAIL_CHECKING_ENABLED 0x00000020
+#define HEAP_FREE_CHECKING_ENABLED 0x00000040
+#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
+
+#define HEAP_CREATE_ALIGN_16 0x00010000
+#define HEAP_CREATE_ENABLE_TRACING 0x00020000
+#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
+
+#define HEAP_SETTABLE_USER_VALUE 0x00000100
+#define HEAP_SETTABLE_USER_FLAG1 0x00000200
+#define HEAP_SETTABLE_USER_FLAG2 0x00000400
+#define HEAP_SETTABLE_USER_FLAG3 0x00000800
+#define HEAP_SETTABLE_USER_FLAGS 0x00000E00
+
+#define HEAP_CLASS_0 0x00000000
+#define HEAP_CLASS_1 0x00001000
+#define HEAP_CLASS_2 0x00002000
+#define HEAP_CLASS_3 0x00003000
+#define HEAP_CLASS_4 0x00004000
+#define HEAP_CLASS_5 0x00005000
+#define HEAP_CLASS_6 0x00006000
+#define HEAP_CLASS_7 0x00007000
+#define HEAP_CLASS_8 0x00008000
+#define HEAP_CLASS_MASK 0x0000F000
+
+#define HEAP_MAXIMUM_TAG 0x0FFF
+#define HEAP_GLOBAL_TAG 0x0800
+#define HEAP_PSEUDO_TAG_FLAG 0x8000
+#define HEAP_TAG_SHIFT 18
+#define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
+
+#define HEAP_CREATE_VALID_MASK (HEAP_NO_SERIALIZE | \
+ HEAP_GROWABLE | \
+ HEAP_GENERATE_EXCEPTIONS | \
+ HEAP_ZERO_MEMORY | \
+ HEAP_REALLOC_IN_PLACE_ONLY | \
+ HEAP_TAIL_CHECKING_ENABLED | \
+ HEAP_FREE_CHECKING_ENABLED | \
+ HEAP_DISABLE_COALESCE_ON_FREE | \
+ HEAP_CLASS_MASK | \
+ HEAP_CREATE_ALIGN_16 | \
+ HEAP_CREATE_ENABLE_TRACING | \
+ HEAP_CREATE_ENABLE_EXECUTE)
+
+/******************************************************************************
+ * Memory manager Functions *
+ ******************************************************************************/
+
+FORCEINLINE
+ULONG
+HEAP_MAKE_TAG_FLAGS(
+ IN ULONG TagBase,
+ IN ULONG Tag)
+{
+ //__assume_bound(TagBase); // FIXME
+ return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
+}
+
#if (NTDDI_VERSION >= NTDDI_WIN2K)
NTKERNELAPI
@@ -6028,25 +6081,10 @@ MmSetAddressRangeModified(
IN PVOID Address,
IN SIZE_T Length);
-#endif
-
-typedef struct _READ_LIST {
- PFILE_OBJECT FileObject;
- ULONG NumberOfEntries;
- LOGICAL IsImage;
- FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY];
-} READ_LIST, *PREAD_LIST;
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_WINXP)
-typedef union _MM_PREFETCH_FLAGS {
- struct {
- ULONG Priority : SYSTEM_PAGE_PRIORITY_BITS;
- ULONG RepurposePriority : SYSTEM_PAGE_PRIORITY_BITS;
- } Flags;
- ULONG AllFlags;
-} MM_PREFETCH_FLAGS, *PMM_PREFETCH_FLAGS;
-#define MM_PREFETCH_FLAGS_MASK ((1 << (2*SYSTEM_PAGE_PRIORITY_BITS)) - 1)
NTKERNELAPI
NTSTATUS
@@ -6054,15 +6092,19 @@ NTAPI
MmPrefetchPages(
IN ULONG NumberOfLists,
IN PREAD_LIST *ReadLists);
-#endif
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
#if (NTDDI_VERSION >= NTDDI_VISTA)
+
NTKERNELAPI
ULONG
NTAPI
MmDoesFileHaveUserWritableReferences(
IN PSECTION_OBJECT_POINTERS SectionPointer);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
#if (NTDDI_VERSION >= NTDDI_WIN2K)
@@ -6110,10 +6152,10 @@ NTAPI
ObQueryObjectAuditingByHandle(
IN HANDLE Handle,
OUT PBOOLEAN GenerateOnClose);
-
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
+
NTKERNELAPI
BOOLEAN
NTAPI
@@ -6121,7 +6163,9 @@ ObIsKernelHandle(
IN HANDLE Handle);
#endif
+
#if (NTDDI_VERSION >= NTDDI_WIN7)
+
NTKERNELAPI
NTSTATUS
NTAPI
@@ -6134,7 +6178,9 @@ ObOpenObjectByPointerWithTag(
IN KPROCESSOR_MODE AccessMode,
IN ULONG Tag,
OUT PHANDLE Handle);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+/* FSRTL Types */
typedef ULONG LBN;
typedef LBN *PLBN;
@@ -6142,32 +6188,43 @@ typedef LBN *PLBN;
typedef ULONG VBN;
typedef VBN *PVBN;
-typedef enum _FAST_IO_POSSIBLE {
- FastIoIsNotPossible = 0,
- FastIoIsPossible,
- FastIoIsQuestionable
-} FAST_IO_POSSIBLE;
+#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
+ CSHORT NodeTypeCode; \
+ CSHORT NodeByteSize; \
+ UCHAR Flags; \
+ UCHAR IsFastIoPossible; \
+ UCHAR Flags2; \
+ UCHAR Reserved:4; \
+ UCHAR Version:4; \
+ PERESOURCE Resource; \
+ PERESOURCE PagingIoResource; \
+ LARGE_INTEGER AllocationSize; \
+ LARGE_INTEGER FileSize; \
+ LARGE_INTEGER ValidDataLength;
+
+#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
+ CSHORT NodeTypeCode; \
+ CSHORT NodeByteSize; \
+ UCHAR Flags; \
+ UCHAR IsFastIoPossible; \
+ UCHAR Flags2; \
+ UCHAR Reserved:4; \
+ UCHAR Version:4; \
+ PERESOURCE Resource; \
+ PERESOURCE PagingIoResource; \
+ LARGE_INTEGER AllocationSize; \
+ LARGE_INTEGER FileSize; \
+ LARGE_INTEGER ValidDataLength;
typedef struct _FSRTL_COMMON_FCB_HEADER {
- CSHORT NodeTypeCode;
- CSHORT NodeByteSize;
- UCHAR Flags;
- UCHAR IsFastIoPossible;
- UCHAR Flags2;
- UCHAR Reserved:4;
- UCHAR Version:4;
- PERESOURCE Resource;
- PERESOURCE PagingIoResource;
- LARGE_INTEGER AllocationSize;
- LARGE_INTEGER FileSize;
- LARGE_INTEGER ValidDataLength;
+ FSRTL_COMMON_FCB_HEADER_LAYOUT
} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
#ifdef __cplusplus
typedef struct _FSRTL_ADVANCED_FCB_HEADER:FSRTL_COMMON_FCB_HEADER {
#else /* __cplusplus */
typedef struct _FSRTL_ADVANCED_FCB_HEADER {
- FSRTL_COMMON_FCB_HEADER DUMMYSTRUCTNAME;
+ FSRTL_COMMON_FCB_HEADER_LAYOUT
#endif /* __cplusplus */
PFAST_MUTEX FastMutex;
LIST_ENTRY FilterContexts;
@@ -6202,11 +6259,6 @@ typedef struct _FSRTL_ADVANCED_FCB_HEADER {
#define FSRTL_NETWORK2_TOP_LEVEL_IRP ((LONG_PTR)0x06)
#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG ((LONG_PTR)0xFFFF)
-typedef struct _EOF_WAIT_BLOCK {
- LIST_ENTRY EofWaitLinks;
- KEVENT Event;
-} EOF_WAIT_BLOCK, *PEOF_WAIT_BLOCK;
-
typedef struct _FSRTL_AUXILIARY_BUFFER {
PVOID Buffer;
ULONG Length;
@@ -6216,44 +6268,6 @@ typedef struct _FSRTL_AUXILIARY_BUFFER {
#define FSRTL_AUXILIARY_FLAG_DEALLOCATE 0x00000001
-typedef struct _FILE_LOCK_INFO {
- LARGE_INTEGER StartingByte;
- LARGE_INTEGER Length;
- BOOLEAN ExclusiveLock;
- ULONG Key;
- PFILE_OBJECT FileObject;
- PVOID ProcessId;
- LARGE_INTEGER EndingByte;
-} FILE_LOCK_INFO, *PFILE_LOCK_INFO;
-
-typedef NTSTATUS
-(NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) (
- IN PVOID Context,
- IN PIRP Irp);
-
-typedef VOID
-(NTAPI *PUNLOCK_ROUTINE) (
- IN PVOID Context,
- IN PFILE_LOCK_INFO FileLockInfo);
-
-typedef struct _FILE_LOCK {
- PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine;
- PUNLOCK_ROUTINE UnlockRoutine;
- BOOLEAN FastIoIsQuestionable;
- BOOLEAN SpareC[3];
- PVOID LockInformation;
- FILE_LOCK_INFO LastReturnedLockInfo;
- PVOID LastReturnedLock;
- LONG volatile LockRequestsInProgress;
-} FILE_LOCK, *PFILE_LOCK;
-
-typedef struct _TUNNEL {
- FAST_MUTEX Mutex;
- PRTL_SPLAY_LINKS Cache;
- LIST_ENTRY TimerQueue;
- USHORT NumEntries;
-} TUNNEL, *PTUNNEL;
-
typedef enum _FSRTL_COMPARISON_RESULT {
LessThan = -1,
EqualTo = 0,
@@ -6267,59 +6281,6 @@ typedef enum _FSRTL_COMPARISON_RESULT {
#define FSRTL_OLE_LEGAL 0x10
#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL)
-typedef struct _BASE_MCB {
- ULONG MaximumPairCount;
- ULONG PairCount;
- USHORT PoolType;
- USHORT Flags;
- PVOID Mapping;
-} BASE_MCB, *PBASE_MCB;
-
-typedef struct _LARGE_MCB {
- PKGUARDED_MUTEX GuardedMutex;
- BASE_MCB BaseMcb;
-} LARGE_MCB, *PLARGE_MCB;
-
-#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
-
-typedef struct _MCB {
- LARGE_MCB DummyFieldThatSizesThisStructureCorrectly;
-} MCB, *PMCB;
-
-typedef PVOID OPLOCK, *POPLOCK;
-
-typedef VOID
-(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) (
- IN PVOID Context,
- IN PIRP Irp);
-
-typedef VOID
-(NTAPI *POPLOCK_FS_PREPOST_IRP) (
- IN PVOID Context,
- IN PIRP Irp);
-
-#if (NTDDI_VERSION >= NTDDI_VISTASP1)
-#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002
-#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004
-#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008
-#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-typedef struct _OPLOCK_KEY_ECP_CONTEXT {
- GUID OplockKey;
- ULONG Reserved;
-} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT;
-
-DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f );
-
-#endif
-
#define FSRTL_VOLUME_DISMOUNT 1
#define FSRTL_VOLUME_DISMOUNT_FAILED 2
#define FSRTL_VOLUME_LOCK 3
@@ -6335,19 +6296,6 @@ DEFINE_GUID( GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe,
#define FSRTL_VOLUME_CHANGE_SIZE 13
#define FSRTL_VOLUME_BACKGROUND_FORMAT 14
-typedef PVOID PNOTIFY_SYNC;
-
-typedef BOOLEAN
-(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
- IN PVOID NotifyContext,
- IN PVOID TargetContext OPTIONAL,
- IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
-
-typedef BOOLEAN
-(NTAPI *PFILTER_REPORT_CHANGE) (
- IN PVOID NotifyContext,
- IN PVOID FilterContext);
-
typedef VOID
(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) (
IN PVOID Context,
@@ -6423,12 +6371,128 @@ typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT {
PVOID InstanceId;
} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT;
-#define FsRtlEnterFileSystem KeEnterCriticalRegion
-#define FsRtlExitFileSystem KeLeaveCriticalRegion
-
#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1
#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2
+typedef NTSTATUS
+(NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) (
+ IN PVOID Context,
+ IN PIRP Irp);
+
+typedef struct _FILE_LOCK_INFO {
+ LARGE_INTEGER StartingByte;
+ LARGE_INTEGER Length;
+ BOOLEAN ExclusiveLock;
+ ULONG Key;
+ PFILE_OBJECT FileObject;
+ PVOID ProcessId;
+ LARGE_INTEGER EndingByte;
+} FILE_LOCK_INFO, *PFILE_LOCK_INFO;
+
+typedef VOID
+(NTAPI *PUNLOCK_ROUTINE) (
+ IN PVOID Context,
+ IN PFILE_LOCK_INFO FileLockInfo);
+
+typedef struct _FILE_LOCK {
+ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine;
+ PUNLOCK_ROUTINE UnlockRoutine;
+ BOOLEAN FastIoIsQuestionable;
+ BOOLEAN SpareC[3];
+ PVOID LockInformation;
+ FILE_LOCK_INFO LastReturnedLockInfo;
+ PVOID LastReturnedLock;
+ LONG volatile LockRequestsInProgress;
+} FILE_LOCK, *PFILE_LOCK;
+
+typedef struct _TUNNEL {
+ FAST_MUTEX Mutex;
+ PRTL_SPLAY_LINKS Cache;
+ LIST_ENTRY TimerQueue;
+ USHORT NumEntries;
+} TUNNEL, *PTUNNEL;
+
+typedef struct _BASE_MCB {
+ ULONG MaximumPairCount;
+ ULONG PairCount;
+ USHORT PoolType;
+ USHORT Flags;
+ PVOID Mapping;
+} BASE_MCB, *PBASE_MCB;
+
+typedef struct _LARGE_MCB {
+ PKGUARDED_MUTEX GuardedMutex;
+ BASE_MCB BaseMcb;
+} LARGE_MCB, *PLARGE_MCB;
+
+#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
+
+typedef struct _MCB {
+ LARGE_MCB DummyFieldThatSizesThisStructureCorrectly;
+} MCB, *PMCB;
+
+typedef enum _FAST_IO_POSSIBLE {
+ FastIoIsNotPossible = 0,
+ FastIoIsPossible,
+ FastIoIsQuestionable
+} FAST_IO_POSSIBLE;
+
+typedef struct _EOF_WAIT_BLOCK {
+ LIST_ENTRY EofWaitLinks;
+ KEVENT Event;
+} EOF_WAIT_BLOCK, *PEOF_WAIT_BLOCK;
+
+typedef PVOID OPLOCK, *POPLOCK;
+
+typedef VOID
+(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) (
+ IN PVOID Context,
+ IN PIRP Irp);
+
+typedef VOID
+(NTAPI *POPLOCK_FS_PREPOST_IRP) (
+ IN PVOID Context,
+ IN PIRP Irp);
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002
+#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004
+#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008
+#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+typedef struct _OPLOCK_KEY_ECP_CONTEXT {
+ GUID OplockKey;
+ ULONG Reserved;
+} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT;
+
+DEFINE_GUID(GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f);
+
+#endif
+
+typedef PVOID PNOTIFY_SYNC;
+
+typedef BOOLEAN
+(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
+ IN PVOID NotifyContext,
+ IN PVOID TargetContext OPTIONAL,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+typedef BOOLEAN
+(NTAPI *PFILTER_REPORT_CHANGE) (
+ IN PVOID NotifyContext,
+ IN PVOID FilterContext);
+/* FSRTL Functions */
+
+#define FsRtlEnterFileSystem KeEnterCriticalRegion
+#define FsRtlExitFileSystem KeLeaveCriticalRegion
+
#if (NTDDI_VERSION >= NTDDI_WIN2K)
NTKERNELAPI
@@ -6762,14 +6826,14 @@ BOOLEAN
NTAPI
FsRtlDoesDbcsContainWildCards(
IN PANSI_STRING Name);
-
+
NTKERNELAPI
BOOLEAN
NTAPI
FsRtlIsDbcsInExpression(
IN PANSI_STRING Expression,
IN PANSI_STRING Name);
-
+
NTKERNELAPI
BOOLEAN
NTAPI
@@ -6778,7 +6842,7 @@ FsRtlIsFatDbcsLegal(
IN BOOLEAN WildCardsPermissible,
IN BOOLEAN PathNamePermissible,
IN BOOLEAN LeadingBackslashPermissible);
-
+
NTKERNELAPI
BOOLEAN
NTAPI
@@ -7027,7 +7091,7 @@ NTKERNELAPI
NTSTATUS
NTAPI
FsRtlNotifyVolumeEvent(
- IN PFILE_OBJECT FileObject,
+ IN PFILE_OBJECT FileObject,
IN ULONG EventCode);
NTKERNELAPI
@@ -7169,7 +7233,7 @@ FsRtlCreateSectionForDataScan(
OUT PHANDLE SectionHandle,
OUT PVOID *SectionObject,
OUT PLARGE_INTEGER SectionFileSize OPTIONAL,
- IN PFILE_OBJECT FileObject,
+ IN PFILE_OBJECT FileObject,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN PLARGE_INTEGER MaximumSize OPTIONAL,
@@ -7255,7 +7319,7 @@ FsRtlIsPagingFile(
#if (NTDDI_VERSION >= NTDDI_WS03)
NTKERNELAPI
- VOID
+VOID
NTAPI
FsRtlInitializeBaseMcb(
IN PBASE_MCB Mcb,
@@ -7346,8 +7410,8 @@ NTKERNELAPI
BOOLEAN
NTAPI
FsRtlSplitBaseMcb(
- IN PBASE_MCB Mcb,
- IN LONGLONG Vbn,
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn,
IN LONGLONG Amount);
#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
@@ -7365,8 +7429,8 @@ NTSTATUS
NTAPI
FsRtlAddBaseMcbEntryEx(
IN PBASE_MCB Mcb,
- IN LONGLONG Vbn,
- IN LONGLONG Lbn,
+ IN LONGLONG Vbn,
+ IN LONGLONG Lbn,
IN LONGLONG SectorCount);
NTKERNELAPI
@@ -7792,14 +7856,6 @@ FsRtlRemovePerFileObjectContext(
(InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
}
-extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo;
-#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
-
-#ifdef NLS_MB_CODE_PAGE_TAG
-#undef NLS_MB_CODE_PAGE_TAG
-#endif
-#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag
-
/* GCC compatible definition, MS one is retarded */
extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray;
#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray
@@ -7929,118 +7985,7 @@ FsRtlSetupAdvancedHeader(
(IRP)->IoStatus.Status = (STATUS); \
IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
}
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
-#endif
-
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-
-typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER {
- NetworkOpenLocationAny,
- NetworkOpenLocationRemote,
- NetworkOpenLocationLoopback
-} NETWORK_OPEN_LOCATION_QUALIFIER;
-
-typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER {
- NetworkOpenIntegrityAny,
- NetworkOpenIntegrityNone,
- NetworkOpenIntegritySigned,
- NetworkOpenIntegrityEncrypted,
- NetworkOpenIntegrityMaximum
-} NETWORK_OPEN_INTEGRITY_QUALIFIER;
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1
-#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2
-#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000
-
-typedef struct _NETWORK_OPEN_ECP_CONTEXT {
- USHORT Size;
- USHORT Reserved;
- struct {
- struct {
- NETWORK_OPEN_LOCATION_QUALIFIER Location;
- NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
- ULONG Flags;
- } in;
- struct {
- NETWORK_OPEN_LOCATION_QUALIFIER Location;
- NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
- ULONG Flags;
- } out;
- } DUMMYSTRUCTNAME;
-} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
-
-typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 {
- USHORT Size;
- USHORT Reserved;
- struct {
- struct {
- NETWORK_OPEN_LOCATION_QUALIFIER Location;
- NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
- } in;
- struct {
- NETWORK_OPEN_LOCATION_QUALIFIER Location;
- NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
- } out;
- } DUMMYSTRUCTNAME;
-} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0;
-
-#elif (NTDDI_VERSION >= NTDDI_VISTA)
-typedef struct _NETWORK_OPEN_ECP_CONTEXT {
- USHORT Size;
- USHORT Reserved;
- struct {
- struct {
- NETWORK_OPEN_LOCATION_QUALIFIER Location;
- NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
- } in;
- struct {
- NETWORK_OPEN_LOCATION_QUALIFIER Location;
- NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
- } out;
- } DUMMYSTRUCTNAME;
-} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
-#endif
-
-DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8 );
-
-#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
-
-
-#if (NTDDI_VERSION >= NTDDI_VISTA)
-
-typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
- PVOID Context;
-} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;
-
-DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55 );
-
-#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb);
-DEFINE_GUID(GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53 );
-
-typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS;
-
-typedef struct _NFS_OPEN_ECP_CONTEXT {
- PUNICODE_STRING ExportAlias;
- PSOCKADDR_STORAGE_NFS ClientSocketAddress;
-} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT;
-
-typedef struct _SRV_OPEN_ECP_CONTEXT {
- PUNICODE_STRING ShareName;
- PSOCKADDR_STORAGE_NFS SocketAddress;
- BOOLEAN OplockBlockState;
- BOOLEAN OplockAppState;
- BOOLEAN OplockFinalState;
-} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT;
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+/* Common Cache Types */
#define VACB_MAPPING_GRANULARITY (0x40000)
#define VACB_OFFSET_SHIFT (18)
@@ -8108,6 +8053,13 @@ typedef VOID
IN PVOID Context1,
IN PVOID Context2);
+#define UNINITIALIZE_CACHE_MAPS (1)
+#define DO_NOT_RETRY_PURGE (2)
+#define DO_NOT_PURGE_DIRTY_PAGES (0x4)
+
+#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1)
+/* Common Cache Functions */
+
#define CcIsFileCached(FO) ( \
((FO)->SectionObjectPointer != NULL) && \
(((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
@@ -8210,7 +8162,7 @@ NTKERNELAPI
BOOLEAN
NTAPI
CcCanIWrite(
- IN PFILE_OBJECT FileObject,
+ IN PFILE_OBJECT FileObject,
IN ULONG BytesToWrite,
IN BOOLEAN Wait,
IN BOOLEAN Retrying);
@@ -8230,8 +8182,8 @@ NTKERNELAPI
BOOLEAN
NTAPI
CcCopyRead(
- IN PFILE_OBJECT FileObject,
- IN PLARGE_INTEGER FileOffset,
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN BOOLEAN Wait,
OUT PVOID Buffer,
@@ -8338,7 +8290,7 @@ NTKERNELAPI
BOOLEAN
NTAPI
CcPinMappedData(
- IN PFILE_OBJECT FileObject,
+ IN PFILE_OBJECT FileObject,
IN PLARGE_INTEGER FileOffset,
IN ULONG Length,
IN ULONG Flags,
@@ -8497,12 +8449,6 @@ CcCoherencyFlushAndPurgeCache(
((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \
)
-#define UNINITIALIZE_CACHE_MAPS (1)
-#define DO_NOT_RETRY_PURGE (2)
-#define DO_NOT_PURGE_DIRTY_PAGES (0x4)
-
-#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1)
-
#if (NTDDI_VERSION >= NTDDI_VISTA)
NTKERNELAPI
BOOLEAN
@@ -8540,42 +8486,45 @@ CcCopyWriteWontFlush(
CcScheduleReadAhead((FO), (FOFF), (LEN)); \
} \
)
+/******************************************************************************
+ * ZwXxx Functions *
+ ******************************************************************************/
-#define PIN_WAIT (1)
-#define PIN_EXCLUSIVE (2)
-#define PIN_NO_READ (4)
-#define PIN_IF_BCB (8)
-#define PIN_CALLER_TRACKS_DIRTY_DATA (32)
-#define PIN_HIGH_PRIORITY (64)
-#define MAP_WAIT 1
-#define MAP_NO_READ (16)
-#define MAP_HIGH_PRIORITY (64)
-#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)
-#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS)
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryEaFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PVOID EaList OPTIONAL,
+ IN ULONG EaListLength,
+ IN PULONG EaIndex OPTIONAL,
+ IN BOOLEAN RestartScan);
-typedef struct _QUERY_PATH_REQUEST {
- ULONG PathNameLength;
- PIO_SECURITY_CONTEXT SecurityContext;
- WCHAR FilePathName[1];
-} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetEaFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length);
-typedef struct _QUERY_PATH_REQUEST_EX {
- PIO_SECURITY_CONTEXT pSecurityContext;
- ULONG EaLength;
- PVOID pEaBuffer;
- UNICODE_STRING PathName;
- UNICODE_STRING DomainServiceName;
- ULONG_PTR Reserved[ 3 ];
-} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX;
-
-typedef struct _QUERY_PATH_RESPONSE {
- ULONG LengthAccepted;
-} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
-
-#define VOLSNAPCONTROLTYPE 0x00000053
-#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDuplicateToken(
+ IN HANDLE ExistingTokenHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN EffectiveOnly,
+ IN TOKEN_TYPE TokenType,
+ OUT PHANDLE NewTokenHandle);
#if (NTDDI_VERSION >= NTDDI_WIN2K)
@@ -8752,7 +8701,6 @@ ZwQuerySecurityObject(
OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
IN ULONG Length,
OUT PULONG ResultLength);
-
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_WINXP)
@@ -8776,7 +8724,7 @@ ZwOpenThreadTokenEx(
IN ULONG HandleAttributes,
OUT PHANDLE TokenHandle);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
@@ -8834,10 +8782,9 @@ NTAPI
ZwFlushBuffersFile(
IN HANDLE FileHandle,
OUT PIO_STATUS_BLOCK IoStatusBlock);
-
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
-
#if (NTDDI_VERSION >= NTDDI_WIN7)
+
NTSYSAPI
NTSTATUS
NTAPI
@@ -8846,42 +8793,197 @@ ZwSetInformationToken(
IN TOKEN_INFORMATION_CLASS TokenInformationClass,
IN PVOID TokenInformation,
IN ULONG TokenInformationLength);
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+
+/* #if !defined(_X86AMD64_) FIXME : WHAT ?! */
+#if defined(_WIN64)
+
+C_ASSERT(sizeof(ERESOURCE) == 0x68);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x18);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x1a);
+
+#else
+
+C_ASSERT(sizeof(ERESOURCE) == 0x38);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x0c);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x0e);
+
+#endif
+/* #endif */
+
+#if defined(_IA64_)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+ULONG
+NTAPI
+HalGetDmaAlignmentRequirement(
+ VOID);
+#endif
#endif
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwQueryEaFile(
- IN HANDLE FileHandle,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID Buffer,
- IN ULONG Length,
- IN BOOLEAN ReturnSingleEntry,
- IN PVOID EaList OPTIONAL,
- IN ULONG EaListLength,
- IN PULONG EaIndex OPTIONAL,
- IN BOOLEAN RestartScan);
+#if defined(_M_IX86) || defined(_M_AMD64)
+#define HalGetDmaAlignmentRequirement() 1L
+#endif
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetEaFile(
- IN HANDLE FileHandle,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID Buffer,
- IN ULONG Length);
+extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo;
+#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwDuplicateToken(
- IN HANDLE ExistingTokenHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOLEAN EffectiveOnly,
- IN TOKEN_TYPE TokenType,
- OUT PHANDLE NewTokenHandle);
+#ifdef NLS_MB_CODE_PAGE_TAG
+#undef NLS_MB_CODE_PAGE_TAG
+#endif
+#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER {
+ NetworkOpenLocationAny,
+ NetworkOpenLocationRemote,
+ NetworkOpenLocationLoopback
+} NETWORK_OPEN_LOCATION_QUALIFIER;
+
+typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER {
+ NetworkOpenIntegrityAny,
+ NetworkOpenIntegrityNone,
+ NetworkOpenIntegritySigned,
+ NetworkOpenIntegrityEncrypted,
+ NetworkOpenIntegrityMaximum
+} NETWORK_OPEN_INTEGRITY_QUALIFIER;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1
+#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2
+#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000
+
+typedef struct _NETWORK_OPEN_ECP_CONTEXT {
+ USHORT Size;
+ USHORT Reserved;
+ _ANONYMOUS_STRUCT struct {
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ ULONG Flags;
+ } in;
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ ULONG Flags;
+ } out;
+ } DUMMYSTRUCTNAME;
+} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
+
+typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 {
+ USHORT Size;
+ USHORT Reserved;
+ _ANONYMOUS_STRUCT struct {
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } in;
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } out;
+ } DUMMYSTRUCTNAME;
+} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0;
+
+#elif (NTDDI_VERSION >= NTDDI_VISTA)
+typedef struct _NETWORK_OPEN_ECP_CONTEXT {
+ USHORT Size;
+ USHORT Reserved;
+ _ANONYMOUS_STRUCT struct {
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } in;
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } out;
+ } DUMMYSTRUCTNAME;
+} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
+#endif
+
+DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
+ PVOID Context;
+} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;
+
+DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb);
+DEFINE_GUID (GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53);
+
+typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS;
+
+typedef struct _NFS_OPEN_ECP_CONTEXT {
+ PUNICODE_STRING ExportAlias;
+ PSOCKADDR_STORAGE_NFS ClientSocketAddress;
+} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT;
+
+typedef struct _SRV_OPEN_ECP_CONTEXT {
+ PUNICODE_STRING ShareName;
+ PSOCKADDR_STORAGE_NFS SocketAddress;
+ BOOLEAN OplockBlockState;
+ BOOLEAN OplockAppState;
+ BOOLEAN OplockFinalState;
+} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#define PIN_WAIT (1)
+#define PIN_EXCLUSIVE (2)
+#define PIN_NO_READ (4)
+#define PIN_IF_BCB (8)
+#define PIN_CALLER_TRACKS_DIRTY_DATA (32)
+#define PIN_HIGH_PRIORITY (64)
+
+#define MAP_WAIT 1
+#define MAP_NO_READ (16)
+#define MAP_HIGH_PRIORITY (64)
+
+#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+typedef struct _QUERY_PATH_REQUEST {
+ ULONG PathNameLength;
+ PIO_SECURITY_CONTEXT SecurityContext;
+ WCHAR FilePathName[1];
+} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;
+
+typedef struct _QUERY_PATH_REQUEST_EX {
+ PIO_SECURITY_CONTEXT pSecurityContext;
+ ULONG EaLength;
+ PVOID pEaBuffer;
+ UNICODE_STRING PathName;
+ UNICODE_STRING DomainServiceName;
+ ULONG_PTR Reserved[ 3 ];
+} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX;
+
+typedef struct _QUERY_PATH_RESPONSE {
+ ULONG LengthAccepted;
+} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
+
+#define VOLSNAPCONTROLTYPE 0x00000053
+#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+/* FIXME : These definitions below don't belong here (or anywhere in ddk really) */
#pragma pack(push,4)
#ifndef VER_PRODUCTBUILD
@@ -8893,7 +8995,7 @@ ZwDuplicateToken(
extern PACL SePublicDefaultDacl;
extern PACL SeSystemDefaultDacl;
-#define FS_LFN_APIS 0x00004000
+#define FS_LFN_APIS 0x00004000
#define FILE_STORAGE_TYPE_SPECIFIED 0x00000041 /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */
#define FILE_STORAGE_TYPE_DEFAULT (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT)
@@ -8910,7 +9012,7 @@ extern PACL SeSystemDefaultDacl;
#define FILE_STORAGE_TYPE_MASK 0x000f0000
#define FILE_STORAGE_TYPE_SHIFT 16
-#define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004
+#define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004
#ifdef _X86_
#define HARDWARE_PTE HARDWARE_PTE_X86
@@ -8959,7 +9061,7 @@ extern PACL SeSystemDefaultDacl;
#define OB_TYPE_IO_COMPLETION 22
#define OB_TYPE_FILE 23
-#define SEC_BASED 0x00200000
+#define SEC_BASED 0x00200000
/* end winnt.h */
diff --git a/include/ddk/ntstrsafe.h b/include/ddk/ntstrsafe.h
index d5a02cb1bf7..447a3a5265c 100644
--- a/include/ddk/ntstrsafe.h
+++ b/include/ddk/ntstrsafe.h
@@ -36,7 +36,7 @@ typedef unsigned long DWORD;
__inline
NTSTATUS
NTAPI
-RtlStringLengthWorkerA(IN PCHAR String,
+RtlStringLengthWorkerA(IN LPCSTR String,
IN SIZE_T MaxLength,
OUT PSIZE_T ReturnLength OPTIONAL)
{
@@ -69,7 +69,7 @@ RtlStringLengthWorkerA(IN PCHAR String,
__inline
NTSTATUS
NTAPI
-RtlStringValidateDestA(IN PCHAR Destination,
+RtlStringValidateDestA(IN LPSTR Destination,
IN SIZE_T Length,
OUT PSIZE_T ReturnLength OPTIONAL,
IN SIZE_T MaxLength)
@@ -98,7 +98,7 @@ RtlStringValidateDestA(IN PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringExValidateDestA(IN OUT PCHAR *Destination,
+RtlStringExValidateDestA(IN OUT LPSTR *Destination,
IN OUT PSIZE_T DestinationLength,
OUT PSIZE_T ReturnLength OPTIONAL,
IN SIZE_T MaxLength,
@@ -114,7 +114,7 @@ RtlStringExValidateDestA(IN OUT PCHAR *Destination,
__inline
NTSTATUS
NTAPI
-RtlStringExValidateSrcA(IN OUT PCCHAR *Source OPTIONAL,
+RtlStringExValidateSrcA(IN OUT LPCSTR *Source OPTIONAL,
IN OUT PSIZE_T ReturnLength OPTIONAL,
IN SIZE_T MaxLength,
IN DWORD Flags)
@@ -133,10 +133,10 @@ RtlStringExValidateSrcA(IN OUT PCCHAR *Source OPTIONAL,
__inline
NTSTATUS
NTAPI
-RtlStringVPrintfWorkerA(OUT PCHAR Destination,
+RtlStringVPrintfWorkerA(OUT LPSTR Destination,
IN SIZE_T Length,
OUT PSIZE_T NewLength OPTIONAL,
- IN PCCHAR Format,
+ IN LPCSTR Format,
IN va_list argList)
{
NTSTATUS Status = STATUS_SUCCESS;
@@ -174,10 +174,10 @@ RtlStringVPrintfWorkerA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCopyWorkerA(OUT PCHAR Destination,
+RtlStringCopyWorkerA(OUT LPSTR Destination,
IN SIZE_T Length,
OUT PSIZE_T NewLength OPTIONAL,
- IN PCCHAR Source,
+ IN LPCSTR Source,
IN SIZE_T CopyLength)
{
NTSTATUS Status = STATUS_SUCCESS;
@@ -211,9 +211,9 @@ RtlStringCopyWorkerA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCchCopyA(IN PCHAR Destination,
+RtlStringCchCopyA(IN LPSTR Destination,
IN SIZE_T cchDest,
- IN PCCHAR pszSrc)
+ IN LPCSTR pszSrc)
{
ASSERTMSG("RtlStringCchCopyA is UNIMPLEMENTED!\n", FALSE);
return STATUS_NOT_IMPLEMENTED;
@@ -222,9 +222,9 @@ RtlStringCchCopyA(IN PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbPrintfA(OUT PCHAR Destination,
+RtlStringCbPrintfA(OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCHAR Format,
+ IN LPCSTR Format,
...)
{
NTSTATUS Status;
@@ -252,12 +252,12 @@ RtlStringCbPrintfA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbPrintfExA(OUT PCHAR Destination,
+RtlStringCbPrintfExA(OUT LPSTR Destination,
IN SIZE_T Length,
- OUT PCHAR *DestinationEnd OPTIONAL,
+ OUT LPSTR *DestinationEnd OPTIONAL,
OUT PSIZE_T RemainingSize OPTIONAL,
IN DWORD Flags,
- IN PCCHAR Format,
+ IN LPCSTR Format,
...)
{
NTSTATUS Status;
@@ -333,10 +333,10 @@ RtlStringCbPrintfExA(OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbCopyExA(OUT PCHAR Destination,
+RtlStringCbCopyExA(OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCCHAR Source,
- OUT PCHAR *DestinationEnd OPTIONAL,
+ IN LPCSTR Source,
+ OUT LPSTR *DestinationEnd OPTIONAL,
OUT PSIZE_T RemainingSize OPTIONAL,
IN DWORD Flags)
{
@@ -423,10 +423,10 @@ RtlStringCbPrintfW(
__inline
NTSTATUS
NTAPI
-RtlStringCbCatExA(IN OUT PCHAR Destination,
+RtlStringCbCatExA(IN OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCCHAR Source,
- OUT PCHAR *DestinationEnd OPTIONAL,
+ IN LPCSTR Source,
+ OUT LPSTR *DestinationEnd OPTIONAL,
OUT PSIZE_T RemainingSize OPTIONAL,
IN DWORD Flags)
{
@@ -497,9 +497,9 @@ RtlStringCbCatExA(IN OUT PCHAR Destination,
__inline
NTSTATUS
NTAPI
-RtlStringCbCopyA(OUT PCHAR Destination,
+RtlStringCbCopyA(OUT LPSTR Destination,
IN SIZE_T Length,
- IN PCCHAR Source)
+ IN LPCSTR Source)
{
NTSTATUS Status;
SIZE_T CharLength = Length / sizeof(CHAR);
diff --git a/include/ddk/scsi.h b/include/ddk/scsi.h
index bf5f83631e9..59c7c5361b9 100644
--- a/include/ddk/scsi.h
+++ b/include/ddk/scsi.h
@@ -27,928 +27,432 @@
extern "C" {
#endif
-typedef union _CDB {
- struct _CDB6GENERIC {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR CommandUniqueBits : 4;
- UCHAR LogicalUnitNumber : 3;
- UCHAR CommandUniqueBytes[3];
- UCHAR Link : 1;
- UCHAR Flag : 1;
- UCHAR Reserved : 4;
- UCHAR VendorUnique : 2;
- } CDB6GENERIC, *PCDB6GENERIC;
-
- struct _CDB6READWRITE {
- UCHAR OperationCode;
- UCHAR LogicalBlockMsb1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR LogicalBlockMsb0;
- UCHAR LogicalBlockLsb;
- UCHAR TransferBlocks;
- UCHAR Control;
- } CDB6READWRITE, *PCDB6READWRITE;
-
- struct _CDB6INQUIRY {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR PageCode;
- UCHAR IReserved;
- UCHAR AllocationLength;
- UCHAR Control;
- } CDB6INQUIRY, *PCDB6INQUIRY;
-
- struct _CDB6INQUIRY3 {
- UCHAR OperationCode;
- UCHAR EnableVitalProductData : 1;
- UCHAR CommandSupportData : 1;
- UCHAR Reserved1 : 6;
- UCHAR PageCode;
- UCHAR Reserved2;
- UCHAR AllocationLength;
- UCHAR Control;
- } CDB6INQUIRY3, *PCDB6INQUIRY3;
-
- struct _CDB6VERIFY {
- UCHAR OperationCode;
- UCHAR Fixed : 1;
- UCHAR ByteCompare : 1;
- UCHAR Immediate : 1;
- UCHAR Reserved : 2;
- UCHAR LogicalUnitNumber : 3;
- UCHAR VerificationLength[3];
- UCHAR Control;
- } CDB6VERIFY, *PCDB6VERIFY;
-
- struct _CDB6FORMAT {
- UCHAR OperationCode;
- UCHAR FormatControl : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR FReserved1;
- UCHAR InterleaveMsb;
- UCHAR InterleaveLsb;
- UCHAR FReserved2;
- } CDB6FORMAT, *PCDB6FORMAT;
-
- struct _CDB10 {
- UCHAR OperationCode;
- UCHAR RelativeAddress : 1;
- UCHAR Reserved1 : 2;
- UCHAR ForceUnitAccess : 1;
- UCHAR DisablePageOut : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR LogicalBlockByte0;
- UCHAR LogicalBlockByte1;
- UCHAR LogicalBlockByte2;
- UCHAR LogicalBlockByte3;
- UCHAR Reserved2;
- UCHAR TransferBlocksMsb;
- UCHAR TransferBlocksLsb;
- UCHAR Control;
- } CDB10, *PCDB10;
-
- struct _CDB12 {
- UCHAR OperationCode;
- UCHAR RelativeAddress : 1;
- UCHAR Reserved1 : 2;
- UCHAR ForceUnitAccess : 1;
- UCHAR DisablePageOut : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR LogicalBlock[4];
- UCHAR TransferLength[4];
- UCHAR Reserved2;
- UCHAR Control;
- } CDB12, *PCDB12;
-
- struct _CDB16 {
- UCHAR OperationCode;
- UCHAR Reserved1 : 3;
- UCHAR ForceUnitAccess : 1;
- UCHAR DisablePageOut : 1;
- UCHAR Protection : 3;
- UCHAR LogicalBlock[8];
- UCHAR TransferLength[4];
- UCHAR Reserved2;
- UCHAR Control;
- } CDB16, *PCDB16;
-
- struct _PAUSE_RESUME {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2[6];
- UCHAR Action;
- UCHAR Control;
- } PAUSE_RESUME, *PPAUSE_RESUME;
-
- struct _READ_TOC {
- UCHAR OperationCode;
- UCHAR Reserved0 : 1;
- UCHAR Msf : 1;
- UCHAR Reserved1 : 3;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Format2 : 4;
- UCHAR Reserved2 : 4;
- UCHAR Reserved3[3];
- UCHAR StartingTrack;
- UCHAR AllocationLength[2];
- UCHAR Control : 6;
- UCHAR Format : 2;
- } READ_TOC, *PREAD_TOC;
-
- struct _READ_DISK_INFORMATION {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR Reserved2[5];
- UCHAR AllocationLength[2];
- UCHAR Control;
- } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
-
- struct _READ_TRACK_INFORMATION {
- UCHAR OperationCode;
- UCHAR Track : 1;
- UCHAR Reserved1 : 3;
- UCHAR Reserved2 : 1;
- UCHAR Lun : 3;
- UCHAR BlockAddress[4];
- UCHAR Reserved3;
- UCHAR AllocationLength[2];
- UCHAR Control;
- } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
-
- struct _RESERVE_TRACK_RZONE {
- UCHAR OperationCode;
- UCHAR Reserved1[4];
- UCHAR ReservationSize[4];
- UCHAR Control;
- } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE;
-
- struct _SEND_OPC_INFORMATION {
- UCHAR OperationCode;
- UCHAR DoOpc : 1;
- UCHAR Reserved : 7;
- UCHAR Reserved1[5];
- UCHAR ParameterListLength[2];
- UCHAR Reserved2;
- } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION;
-
- struct _CLOSE_TRACK {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR Reserved1 : 7;
- UCHAR Track : 1;
- UCHAR Session : 1;
- UCHAR Reserved2 : 6;
- UCHAR Reserved3;
- UCHAR TrackNumber[2];
- UCHAR Reserved4[3];
- UCHAR Control;
- } CLOSE_TRACK, *PCLOSE_TRACK;
-
- struct _SEND_CUE_SHEET {
- UCHAR OperationCode;
- UCHAR Reserved[5];
- UCHAR CueSheetSize[3];
- UCHAR Control;
- } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
-
- struct _READ_HEADER {
- UCHAR OperationCode;
- UCHAR Reserved1 : 1;
- UCHAR Msf : 1;
- UCHAR Reserved2 : 3;
- UCHAR Lun : 3;
- UCHAR LogicalBlockAddress[4];
- UCHAR Reserved3;
- UCHAR AllocationLength[2];
- UCHAR Control;
- } READ_HEADER, *PREAD_HEADER;
-
- struct _PLAY_AUDIO {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR StartingBlockAddress[4];
- UCHAR Reserved2;
- UCHAR PlayLength[2];
- UCHAR Control;
- } PLAY_AUDIO, *PPLAY_AUDIO;
-
- struct _PLAY_AUDIO_MSF {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2;
- UCHAR StartingM;
- UCHAR StartingS;
- UCHAR StartingF;
- UCHAR EndingM;
- UCHAR EndingS;
- UCHAR EndingF;
- UCHAR Control;
- } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
-
-/* FIXME: Should the union be anonymous in C++ too? If so,
- can't define named types _LBA and _MSF within anonymous union
- for C++. */
- struct _PLAY_CD {
- UCHAR OperationCode;
- UCHAR Reserved1 : 1;
- UCHAR CMSF : 1;
- UCHAR ExpectedSectorType : 3;
- UCHAR Lun : 3;
-#ifndef __cplusplus
- _ANONYMOUS_UNION
+#ifndef _NTSCSI_USER_MODE_
+#include "srb.h"
#endif
- union {
- struct _LBA {
- UCHAR StartingBlockAddress[4];
- UCHAR PlayLength[4];
- } LBA;
- struct _MSF {
- UCHAR Reserved1;
- UCHAR StartingM;
- UCHAR StartingS;
- UCHAR StartingF;
- UCHAR EndingM;
- UCHAR EndingS;
- UCHAR EndingF;
- UCHAR Reserved2;
- } MSF;
- #ifndef __cplusplus
- }DUMMYUNIONNAME;
- #else
- }u;
- #endif
+#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_MASK 0x02
+#define NOTIFICATION_POWER_MANAGEMENT_CLASS_MASK 0x04
+#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_MASK 0x08
+#define NOTIFICATION_MEDIA_STATUS_CLASS_MASK 0x10
+#define NOTIFICATION_MULTI_HOST_CLASS_MASK 0x20
+#define NOTIFICATION_DEVICE_BUSY_CLASS_MASK 0x40
- UCHAR Audio : 1;
- UCHAR Composite : 1;
- UCHAR Port1 : 1;
- UCHAR Port2 : 1;
- UCHAR Reserved2 : 3;
- UCHAR Speed : 1;
- UCHAR Control;
- } PLAY_CD, *PPLAY_CD;
- struct _SCAN_CD {
- UCHAR OperationCode;
- UCHAR RelativeAddress : 1;
- UCHAR Reserved1 : 3;
- UCHAR Direct : 1;
- UCHAR Lun : 3;
- UCHAR StartingAddress[4];
- UCHAR Reserved2[3];
- UCHAR Reserved3 : 6;
- UCHAR Type : 2;
- UCHAR Reserved4;
- UCHAR Control;
- } SCAN_CD, *PSCAN_CD;
+#define NOTIFICATION_NO_CLASS_EVENTS 0x0
+#define NOTIFICATION_OPERATIONAL_CHANGE_CLASS_EVENTS 0x1
+#define NOTIFICATION_POWER_MANAGEMENT_CLASS_EVENTS 0x2
+#define NOTIFICATION_EXTERNAL_REQUEST_CLASS_EVENTS 0x3
+#define NOTIFICATION_MEDIA_STATUS_CLASS_EVENTS 0x4
+#define NOTIFICATION_MULTI_HOST_CLASS_EVENTS 0x5
+#define NOTIFICATION_DEVICE_BUSY_CLASS_EVENTS 0x6
- struct _STOP_PLAY_SCAN {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR Reserved2[7];
- UCHAR Control;
- } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN;
+#define NOTIFICATION_OPERATIONAL_EVENT_NO_CHANGE 0x0
+#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_REQUESTED 0x1
+#define NOTIFICATION_OPERATIONAL_EVENT_CHANGE_OCCURRED 0x2
- struct _SUBCHANNEL {
- UCHAR OperationCode;
- UCHAR Reserved0 : 1;
- UCHAR Msf : 1;
- UCHAR Reserved1 : 3;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2 : 6;
- UCHAR SubQ : 1;
- UCHAR Reserved3 : 1;
- UCHAR Format;
- UCHAR Reserved4[2];
- UCHAR TrackNumber;
- UCHAR AllocationLength[2];
- UCHAR Control;
- } SUBCHANNEL, *PSUBCHANNEL;
+#define NOTIFICATION_OPERATIONAL_STATUS_AVAILABLE 0x0
+#define NOTIFICATION_OPERATIONAL_STATUS_TEMPORARY_BUSY 0x1
+#define NOTIFICATION_OPERATIONAL_STATUS_EXTENDED_BUSY 0x2
- struct _READ_CD {
- UCHAR OperationCode;
- UCHAR RelativeAddress : 1;
- UCHAR Reserved0 : 1;
- UCHAR ExpectedSectorType : 3;
- UCHAR Lun : 3;
- UCHAR StartingLBA[4];
- UCHAR TransferBlocks[3];
- UCHAR Reserved2 : 1;
- UCHAR ErrorFlags : 2;
- UCHAR IncludeEDC : 1;
- UCHAR IncludeUserData : 1;
- UCHAR HeaderCode : 2;
- UCHAR IncludeSyncData : 1;
- UCHAR SubChannelSelection : 3;
- UCHAR Reserved3 : 5;
- UCHAR Control;
- } READ_CD, *PREAD_CD;
+#define NOTIFICATION_OPERATIONAL_OPCODE_NONE 0x0
+#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_CHANGE 0x1
+#define NOTIFICATION_OPERATIONAL_OPCODE_FEATURE_ADDED 0x2
+#define NOTIFICATION_OPERATIONAL_OPCODE_UNIT_RESET 0x3
+#define NOTIFICATION_OPERATIONAL_OPCODE_FIRMWARE_CHANGED 0x4
+#define NOTIFICATION_OPERATIONAL_OPCODE_INQUIRY_CHANGED 0x5
- struct _READ_CD_MSF {
- UCHAR OperationCode;
- UCHAR RelativeAddress : 1;
- UCHAR Reserved1 : 1;
- UCHAR ExpectedSectorType : 3;
- UCHAR Lun : 3;
- UCHAR Reserved2;
- UCHAR StartingM;
- UCHAR StartingS;
- UCHAR StartingF;
- UCHAR EndingM;
- UCHAR EndingS;
- UCHAR EndingF;
- UCHAR Reserved3;
- UCHAR Reserved4 : 1;
- UCHAR ErrorFlags : 2;
- UCHAR IncludeEDC : 1;
- UCHAR IncludeUserData : 1;
- UCHAR HeaderCode : 2;
- UCHAR IncludeSyncData : 1;
- UCHAR SubChannelSelection : 3;
- UCHAR Reserved5 : 5;
- UCHAR Control;
- } READ_CD_MSF, *PREAD_CD_MSF;
+#define NOTIFICATION_POWER_EVENT_NO_CHANGE 0x0
+#define NOTIFICATION_POWER_EVENT_CHANGE_SUCCEEDED 0x1
+#define NOTIFICATION_POWER_EVENT_CHANGE_FAILED 0x2
- struct _PLXTR_READ_CDDA {
- UCHAR OperationCode;
- UCHAR Reserved0 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR LogicalBlockByte0;
- UCHAR LogicalBlockByte1;
- UCHAR LogicalBlockByte2;
- UCHAR LogicalBlockByte3;
- UCHAR TransferBlockByte0;
- UCHAR TransferBlockByte1;
- UCHAR TransferBlockByte2;
- UCHAR TransferBlockByte3;
- UCHAR SubCode;
- UCHAR Control;
- } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
+#define NOTIFICATION_POWER_STATUS_ACTIVE 0x1
+#define NOTIFICATION_POWER_STATUS_IDLE 0x2
+#define NOTIFICATION_POWER_STATUS_STANDBY 0x3
+#define NOTIFICATION_POWER_STATUS_SLEEP 0x4
- struct _NEC_READ_CDDA {
- UCHAR OperationCode;
- UCHAR Reserved0;
- UCHAR LogicalBlockByte0;
- UCHAR LogicalBlockByte1;
- UCHAR LogicalBlockByte2;
- UCHAR LogicalBlockByte3;
- UCHAR Reserved1;
- UCHAR TransferBlockByte0;
- UCHAR TransferBlockByte1;
- UCHAR Control;
- } NEC_READ_CDDA, *PNEC_READ_CDDA;
+#define NOTIFICATION_MEDIA_EVENT_NO_EVENT 0x0
+#define NOTIFICATION_EXTERNAL_EVENT_NO_CHANGE 0x0
+#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_DOWN 0x1
+#define NOTIFICATION_EXTERNAL_EVENT_BUTTON_UP 0x2
+#define NOTIFICATION_EXTERNAL_EVENT_EXTERNAL 0x3
- struct _MODE_SENSE {
- UCHAR OperationCode;
- UCHAR Reserved1 : 3;
- UCHAR Dbd : 1;
- UCHAR Reserved2 : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR PageCode : 6;
- UCHAR Pc : 2;
- UCHAR Reserved3;
- UCHAR AllocationLength;
- UCHAR Control;
- } MODE_SENSE, *PMODE_SENSE;
+#define NOTIFICATION_EXTERNAL_STATUS_READY 0x0
+#define NOTIFICATION_EXTERNAL_STATUS_PREVENT 0x1
- struct _MODE_SENSE10 {
- UCHAR OperationCode;
- UCHAR Reserved1 : 3;
- UCHAR Dbd : 1;
- UCHAR Reserved2 : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR PageCode : 6;
- UCHAR Pc : 2;
- UCHAR Reserved3[4];
- UCHAR AllocationLength[2];
- UCHAR Control;
- } MODE_SENSE10, *PMODE_SENSE10;
+#define NOTIFICATION_EXTERNAL_REQUEST_NONE 0x0000
+#define NOTIFICATION_EXTERNAL_REQUEST_QUEUE_OVERRUN 0x0001
+#define NOTIFICATION_EXTERNAL_REQUEST_PLAY 0x0101
+#define NOTIFICATION_EXTERNAL_REQUEST_REWIND_BACK 0x0102
+#define NOTIFICATION_EXTERNAL_REQUEST_FAST_FORWARD 0x0103
+#define NOTIFICATION_EXTERNAL_REQUEST_PAUSE 0x0104
+#define NOTIFICATION_EXTERNAL_REQUEST_STOP 0x0106
+#define NOTIFICATION_EXTERNAL_REQUEST_ASCII_LOW 0x0200
+#define NOTIFICATION_EXTERNAL_REQUEST_ASCII_HIGH 0x02ff
- struct _MODE_SELECT {
- UCHAR OperationCode;
- UCHAR SPBit : 1;
- UCHAR Reserved1 : 3;
- UCHAR PFBit : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2[2];
- UCHAR ParameterListLength;
- UCHAR Control;
- } MODE_SELECT, *PMODE_SELECT;
+#define NOTIFICATION_MEDIA_EVENT_NO_CHANGE 0x0
+#define NOTIFICATION_MEDIA_EVENT_EJECT_REQUEST 0x1
+#define NOTIFICATION_MEDIA_EVENT_NEW_MEDIA 0x2
+#define NOTIFICATION_MEDIA_EVENT_MEDIA_REMOVAL 0x3
+#define NOTIFICATION_MEDIA_EVENT_MEDIA_CHANGE 0x4
- struct _MODE_SELECT10 {
- UCHAR OperationCode;
- UCHAR SPBit : 1;
- UCHAR Reserved1 : 3;
- UCHAR PFBit : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2[5];
- UCHAR ParameterListLength[2];
- UCHAR Control;
- } MODE_SELECT10, *PMODE_SELECT10;
+#define NOTIFICATION_BUSY_EVENT_NO_EVENT 0x0
+#define NOTIFICATION_MULTI_HOST_EVENT_NO_CHANGE 0x0
+#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_REQUEST 0x1
+#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_GRANT 0x2
+#define NOTIFICATION_MULTI_HOST_EVENT_CONTROL_RELEASE 0x3
- struct _LOCATE {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR CPBit : 1;
- UCHAR BTBit : 1;
- UCHAR Reserved1 : 2;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved3;
- UCHAR LogicalBlockAddress[4];
- UCHAR Reserved4;
- UCHAR Partition;
- UCHAR Control;
- } LOCATE, *PLOCATE;
+#define NOTIFICATION_MULTI_HOST_STATUS_READY 0x0
+#define NOTIFICATION_MULTI_HOST_STATUS_PREVENT 0x1
- struct _LOGSENSE {
- UCHAR OperationCode;
- UCHAR SPBit : 1;
- UCHAR PPCBit : 1;
- UCHAR Reserved1 : 3;
- UCHAR LogicalUnitNumber : 3;
- UCHAR PageCode : 6;
- UCHAR PCBit : 2;
- UCHAR Reserved2;
- UCHAR Reserved3;
- UCHAR ParameterPointer[2];
- UCHAR AllocationLength[2];
- UCHAR Control;
- } LOGSENSE, *PLOGSENSE;
+#define NOTIFICATION_MULTI_HOST_PRIORITY_NO_REQUESTS 0x0
+#define NOTIFICATION_MULTI_HOST_PRIORITY_LOW 0x1
+#define NOTIFICATION_MULTI_HOST_PRIORITY_MEDIUM 0x2
+#define NOTIFICATION_MULTI_HOST_PRIORITY_HIGH 0x3
- struct _LOGSELECT {
- UCHAR OperationCode;
- UCHAR SPBit : 1;
- UCHAR PCRBit : 1;
- UCHAR Reserved1 : 3;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved : 6;
- UCHAR PCBit : 2;
- UCHAR Reserved2[4];
- UCHAR ParameterListLength[2];
- UCHAR Control;
- } LOGSELECT, *PLOGSELECT;
+#define NOTIFICATION_BUSY_EVENT_NO_EVENT 0x0
+#define NOTIFICATION_BUSY_EVENT_NO_CHANGE 0x0
+#define NOTIFICATION_BUSY_EVENT_BUSY 0x1
- struct _PRINT {
- UCHAR OperationCode;
- UCHAR Reserved : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR TransferLength[3];
- UCHAR Control;
- } PRINT, *PPRINT;
+#define NOTIFICATION_BUSY_STATUS_NO_EVENT 0x0
+#define NOTIFICATION_BUSY_STATUS_POWER 0x1
+#define NOTIFICATION_BUSY_STATUS_IMMEDIATE 0x2
+#define NOTIFICATION_BUSY_STATUS_DEFERRED 0x3
- struct _SEEK {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR LogicalBlockAddress[4];
- UCHAR Reserved2[3];
- UCHAR Control;
- } SEEK, *PSEEK;
+#define DVD_FORMAT_LEAD_IN 0x00
+#define DVD_FORMAT_COPYRIGHT 0x01
+#define DVD_FORMAT_DISK_KEY 0x02
+#define DVD_FORMAT_BCA 0x03
+#define DVD_FORMAT_MANUFACTURING 0x04
- struct _ERASE {
- UCHAR OperationCode;
- UCHAR Long : 1;
- UCHAR Immediate : 1;
- UCHAR Reserved1 : 3;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2[3];
- UCHAR Control;
- } ERASE, *PERASE;
+#define DVD_REPORT_AGID 0x00
+#define DVD_CHALLENGE_KEY 0x01
+#define DVD_KEY_1 0x02
+#define DVD_KEY_2 0x03
+#define DVD_TITLE_KEY 0x04
+#define DVD_REPORT_ASF 0x05
+#define DVD_INVALIDATE_AGID 0x3F
- struct _START_STOP {
- UCHAR OperationCode;
- UCHAR Immediate: 1;
- UCHAR Reserved1 : 4;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2[2];
- UCHAR Start : 1;
- UCHAR LoadEject : 1;
- UCHAR Reserved3 : 6;
- UCHAR Control;
- } START_STOP, *PSTART_STOP;
+#define BLANK_FULL 0x0
+#define BLANK_MINIMAL 0x1
+#define BLANK_TRACK 0x2
+#define BLANK_UNRESERVE_TRACK 0x3
+#define BLANK_TAIL 0x4
+#define BLANK_UNCLOSE_SESSION 0x5
+#define BLANK_SESSION 0x6
- struct _MEDIA_REMOVAL {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR Reserved2[2];
+#define CD_EXPECTED_SECTOR_ANY 0x0
+#define CD_EXPECTED_SECTOR_CDDA 0x1
+#define CD_EXPECTED_SECTOR_MODE1 0x2
+#define CD_EXPECTED_SECTOR_MODE2 0x3
+#define CD_EXPECTED_SECTOR_MODE2_FORM1 0x4
+#define CD_EXPECTED_SECTOR_MODE2_FORM2 0x5
- UCHAR Prevent : 1;
- UCHAR Persistant : 1;
- UCHAR Reserved3 : 6;
+#define DISK_STATUS_EMPTY 0x00
+#define DISK_STATUS_INCOMPLETE 0x01
+#define DISK_STATUS_COMPLETE 0x02
+#define DISK_STATUS_OTHERS 0x03
- UCHAR Control;
- } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
+#define LAST_SESSION_EMPTY 0x00
+#define LAST_SESSION_INCOMPLETE 0x01
+#define LAST_SESSION_RESERVED_DAMAGED 0x02
+#define LAST_SESSION_COMPLETE 0x03
- struct _SEEK_BLOCK {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR Reserved1 : 7;
- UCHAR BlockAddress[3];
- UCHAR Link : 1;
- UCHAR Flag : 1;
- UCHAR Reserved2 : 4;
- UCHAR VendorUnique : 2;
- } SEEK_BLOCK, *PSEEK_BLOCK;
+#define DISK_TYPE_CDDA 0x00
+#define DISK_TYPE_CDI 0x10
+#define DISK_TYPE_XA 0x20
+#define DISK_TYPE_UNDEFINED 0xFF
- struct _REQUEST_BLOCK_ADDRESS {
- UCHAR OperationCode;
- UCHAR Reserved1[3];
- UCHAR AllocationLength;
- UCHAR Link : 1;
- UCHAR Flag : 1;
- UCHAR Reserved2 : 4;
- UCHAR VendorUnique : 2;
- } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
+#define DISC_BGFORMAT_STATE_NONE 0x0
+#define DISC_BGFORMAT_STATE_INCOMPLETE 0x1
+#define DISC_BGFORMAT_STATE_RUNNING 0x2
+#define DISC_BGFORMAT_STATE_COMPLETE 0x3
- struct _PARTITION {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR Sel: 1;
- UCHAR PartitionSelect : 6;
- UCHAR Reserved1[3];
- UCHAR Control;
- } PARTITION, *PPARTITION;
+#define DATA_BLOCK_MODE0 0x0
+#define DATA_BLOCK_MODE1 0x1
+#define DATA_BLOCK_MODE2 0x2
- struct _WRITE_TAPE_MARKS {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR WriteSetMarks: 1;
- UCHAR Reserved : 3;
- UCHAR LogicalUnitNumber : 3;
- UCHAR TransferLength[3];
- UCHAR Control;
- } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
+/* READ_TOC formats */
+#define READ_TOC_FORMAT_TOC 0x00
+#define READ_TOC_FORMAT_SESSION 0x01
+#define READ_TOC_FORMAT_FULL_TOC 0x02
+#define READ_TOC_FORMAT_PMA 0x03
+#define READ_TOC_FORMAT_ATIP 0x04
- struct _SPACE_TAPE_MARKS {
- UCHAR OperationCode;
- UCHAR Code : 3;
- UCHAR Reserved : 2;
- UCHAR LogicalUnitNumber : 3;
- UCHAR NumMarksMSB ;
- UCHAR NumMarks;
- UCHAR NumMarksLSB;
- union {
- UCHAR value;
- struct {
- UCHAR Link : 1;
- UCHAR Flag : 1;
- UCHAR Reserved : 4;
- UCHAR VendorUnique : 2;
- } Fields;
- } Byte6;
- } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
+#define CDB6GENERIC_LENGTH 6
+#define CDB10GENERIC_LENGTH 10
+#define CDB12GENERIC_LENGTH 12
- struct _READ_POSITION {
- UCHAR Operation;
- UCHAR BlockType : 1;
- UCHAR Reserved1 : 4;
- UCHAR Lun : 3;
- UCHAR Reserved2[7];
- UCHAR Control;
- } READ_POSITION, *PREAD_POSITION;
+#define SETBITON 1
+#define SETBITOFF 0
- struct _CDB6READWRITETAPE {
- UCHAR OperationCode;
- UCHAR VendorSpecific : 5;
- UCHAR Reserved : 3;
- UCHAR TransferLenMSB;
- UCHAR TransferLen;
- UCHAR TransferLenLSB;
- UCHAR Link : 1;
- UCHAR Flag : 1;
- UCHAR Reserved1 : 4;
- UCHAR VendorUnique : 2;
- } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
+/* Mode Sense/Select page constants */
+#define MODE_PAGE_VENDOR_SPECIFIC 0x00
+#define MODE_PAGE_ERROR_RECOVERY 0x01
+#define MODE_PAGE_DISCONNECT 0x02
+#define MODE_PAGE_FORMAT_DEVICE 0x03
+#define MODE_PAGE_MRW 0x03
+#define MODE_PAGE_RIGID_GEOMETRY 0x04
+#define MODE_PAGE_FLEXIBILE 0x05
+#define MODE_PAGE_WRITE_PARAMETERS 0x05
+#define MODE_PAGE_VERIFY_ERROR 0x07
+#define MODE_PAGE_CACHING 0x08
+#define MODE_PAGE_PERIPHERAL 0x09
+#define MODE_PAGE_CONTROL 0x0A
+#define MODE_PAGE_MEDIUM_TYPES 0x0B
+#define MODE_PAGE_NOTCH_PARTITION 0x0C
+#define MODE_PAGE_CD_AUDIO_CONTROL 0x0E
+#define MODE_PAGE_DATA_COMPRESS 0x0F
+#define MODE_PAGE_DEVICE_CONFIG 0x10
+#define MODE_PAGE_XOR_CONTROL 0x10
+#define MODE_PAGE_MEDIUM_PARTITION 0x11
+#define MODE_PAGE_ENCLOSURE_SERVICES_MANAGEMENT 0x14
+#define MODE_PAGE_EXTENDED 0x15
+#define MODE_PAGE_EXTENDED_DEVICE_SPECIFIC 0x16
+#define MODE_PAGE_CDVD_FEATURE_SET 0x18
+#define MODE_PAGE_PROTOCOL_SPECIFIC_LUN 0x18
+#define MODE_PAGE_PROTOCOL_SPECIFIC_PORT 0x19
+#define MODE_PAGE_POWER_CONDITION 0x1A
+#define MODE_PAGE_LUN_MAPPING 0x1B
+#define MODE_PAGE_FAULT_REPORTING 0x1C
+#define MODE_PAGE_CDVD_INACTIVITY 0x1D
+#define MODE_PAGE_ELEMENT_ADDRESS 0x1D
+#define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E
+#define MODE_PAGE_DEVICE_CAPABILITIES 0x1F
+#define MODE_PAGE_CAPABILITIES 0x2A
- struct _INIT_ELEMENT_STATUS {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNubmer : 3;
- UCHAR Reserved2[3];
- UCHAR Reserved3 : 7;
- UCHAR NoBarCode : 1;
- } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
+#define MODE_SENSE_RETURN_ALL 0x3f
- struct _INITIALIZE_ELEMENT_RANGE {
- UCHAR OperationCode;
- UCHAR Range : 1;
- UCHAR Reserved1 : 4;
- UCHAR LogicalUnitNubmer : 3;
- UCHAR FirstElementAddress[2];
- UCHAR Reserved2[2];
- UCHAR NumberOfElements[2];
- UCHAR Reserved3;
- UCHAR Reserved4 : 7;
- UCHAR NoBarCode : 1;
- } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE;
+#define MODE_SENSE_CURRENT_VALUES 0x00
+#define MODE_SENSE_CHANGEABLE_VALUES 0x40
+#define MODE_SENSE_DEFAULT_VAULES 0x80
+#define MODE_SENSE_SAVED_VALUES 0xc0
- struct _POSITION_TO_ELEMENT {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR TransportElementAddress[2];
- UCHAR DestinationElementAddress[2];
- UCHAR Reserved2[2];
- UCHAR Flip : 1;
- UCHAR Reserved3 : 7;
- UCHAR Control;
- } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT;
+/* SCSI CDB operation codes */
+#define SCSIOP_TEST_UNIT_READY 0x00
+#define SCSIOP_REZERO_UNIT 0x01
+#define SCSIOP_REWIND 0x01
+#define SCSIOP_REQUEST_BLOCK_ADDR 0x02
+#define SCSIOP_REQUEST_SENSE 0x03
+#define SCSIOP_FORMAT_UNIT 0x04
+#define SCSIOP_READ_BLOCK_LIMITS 0x05
+#define SCSIOP_REASSIGN_BLOCKS 0x07
+#define SCSIOP_INIT_ELEMENT_STATUS 0x07
+#define SCSIOP_READ6 0x08
+#define SCSIOP_RECEIVE 0x08
+#define SCSIOP_WRITE6 0x0A
+#define SCSIOP_PRINT 0x0A
+#define SCSIOP_SEND 0x0A
+#define SCSIOP_SEEK6 0x0B
+#define SCSIOP_TRACK_SELECT 0x0B
+#define SCSIOP_SLEW_PRINT 0x0B
+#define SCSIOP_SET_CAPACITY 0x0B
+#define SCSIOP_SEEK_BLOCK 0x0C
+#define SCSIOP_PARTITION 0x0D
+#define SCSIOP_READ_REVERSE 0x0F
+#define SCSIOP_WRITE_FILEMARKS 0x10
+#define SCSIOP_FLUSH_BUFFER 0x10
+#define SCSIOP_SPACE 0x11
+#define SCSIOP_INQUIRY 0x12
+#define SCSIOP_VERIFY6 0x13
+#define SCSIOP_RECOVER_BUF_DATA 0x14
+#define SCSIOP_MODE_SELECT 0x15
+#define SCSIOP_RESERVE_UNIT 0x16
+#define SCSIOP_RELEASE_UNIT 0x17
+#define SCSIOP_COPY 0x18
+#define SCSIOP_ERASE 0x19
+#define SCSIOP_MODE_SENSE 0x1A
+#define SCSIOP_START_STOP_UNIT 0x1B
+#define SCSIOP_STOP_PRINT 0x1B
+#define SCSIOP_LOAD_UNLOAD 0x1B
+#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
+#define SCSIOP_SEND_DIAGNOSTIC 0x1D
+#define SCSIOP_MEDIUM_REMOVAL 0x1E
- struct _MOVE_MEDIUM {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR TransportElementAddress[2];
- UCHAR SourceElementAddress[2];
- UCHAR DestinationElementAddress[2];
- UCHAR Reserved2[2];
- UCHAR Flip : 1;
- UCHAR Reserved3 : 7;
- UCHAR Control;
- } MOVE_MEDIUM, *PMOVE_MEDIUM;
+#define SCSIOP_READ_FORMATTED_CAPACITY 0x23
+#define SCSIOP_READ_CAPACITY 0x25
+#define SCSIOP_READ 0x28
+#define SCSIOP_WRITE 0x2A
+#define SCSIOP_SEEK 0x2B
+#define SCSIOP_LOCATE 0x2B
+#define SCSIOP_POSITION_TO_ELEMENT 0x2B
+#define SCSIOP_WRITE_VERIFY 0x2E
+#define SCSIOP_VERIFY 0x2F
+#define SCSIOP_SEARCH_DATA_HIGH 0x30
+#define SCSIOP_SEARCH_DATA_EQUAL 0x31
+#define SCSIOP_SEARCH_DATA_LOW 0x32
+#define SCSIOP_SET_LIMITS 0x33
+#define SCSIOP_READ_POSITION 0x34
+#define SCSIOP_SYNCHRONIZE_CACHE 0x35
+#define SCSIOP_COMPARE 0x39
+#define SCSIOP_COPY_COMPARE 0x3A
+#define SCSIOP_WRITE_DATA_BUFF 0x3B
+#define SCSIOP_READ_DATA_BUFF 0x3C
+#define SCSIOP_WRITE_LONG 0x3F
+#define SCSIOP_CHANGE_DEFINITION 0x40
+#define SCSIOP_WRITE_SAME 0x41
+#define SCSIOP_READ_SUB_CHANNEL 0x42
+#define SCSIOP_READ_TOC 0x43
+#define SCSIOP_READ_HEADER 0x44
+#define SCSIOP_REPORT_DENSITY_SUPPORT 0x44
+#define SCSIOP_PLAY_AUDIO 0x45
+#define SCSIOP_GET_CONFIGURATION 0x46
+#define SCSIOP_PLAY_AUDIO_MSF 0x47
+#define SCSIOP_PLAY_TRACK_INDEX 0x48
+#define SCSIOP_PLAY_TRACK_RELATIVE 0x49
+#define SCSIOP_GET_EVENT_STATUS 0x4A
+#define SCSIOP_PAUSE_RESUME 0x4B
+#define SCSIOP_LOG_SELECT 0x4C
+#define SCSIOP_LOG_SENSE 0x4D
+#define SCSIOP_STOP_PLAY_SCAN 0x4E
+#define SCSIOP_XDWRITE 0x50
+#define SCSIOP_XPWRITE 0x51
+#define SCSIOP_READ_DISK_INFORMATION 0x51
+#define SCSIOP_READ_DISC_INFORMATION 0x51
+#define SCSIOP_READ_TRACK_INFORMATION 0x52
+#define SCSIOP_XDWRITE_READ 0x53
+#define SCSIOP_RESERVE_TRACK_RZONE 0x53
+#define SCSIOP_SEND_OPC_INFORMATION 0x54
+#define SCSIOP_MODE_SELECT10 0x55
+#define SCSIOP_RESERVE_UNIT10 0x56
+#define SCSIOP_RESERVE_ELEMENT 0x56
+#define SCSIOP_RELEASE_UNIT10 0x57
+#define SCSIOP_RELEASE_ELEMENT 0x57
+#define SCSIOP_REPAIR_TRACK 0x58
+#define SCSIOP_MODE_SENSE10 0x5A
+#define SCSIOP_CLOSE_TRACK_SESSION 0x5B
+#define SCSIOP_READ_BUFFER_CAPACITY 0x5C
+#define SCSIOP_SEND_CUE_SHEET 0x5D
+#define SCSIOP_PERSISTENT_RESERVE_IN 0x5E
+#define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F
- struct _EXCHANGE_MEDIUM {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR LogicalUnitNumber : 3;
- UCHAR TransportElementAddress[2];
- UCHAR SourceElementAddress[2];
- UCHAR Destination1ElementAddress[2];
- UCHAR Destination2ElementAddress[2];
- UCHAR Flip1 : 1;
- UCHAR Flip2 : 1;
- UCHAR Reserved3 : 6;
- UCHAR Control;
- } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM;
+#define SCSIOP_REPORT_LUNS 0xA0
+#define SCSIOP_BLANK 0xA1
+#define SCSIOP_ATA_PASSTHROUGH12 0xA1
+#define SCSIOP_SEND_EVENT 0xA2
+#define SCSIOP_SEND_KEY 0xA3
+#define SCSIOP_MAINTENANCE_IN 0xA3
+#define SCSIOP_REPORT_KEY 0xA4
+#define SCSIOP_MAINTENANCE_OUT 0xA4
+#define SCSIOP_MOVE_MEDIUM 0xA5
+#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
+#define SCSIOP_EXCHANGE_MEDIUM 0xA6
+#define SCSIOP_SET_READ_AHEAD 0xA7
+#define SCSIOP_MOVE_MEDIUM_ATTACHED 0xA7
+#define SCSIOP_READ12 0xA8
+#define SCSIOP_GET_MESSAGE 0xA8
+#define SCSIOP_SERVICE_ACTION_OUT12 0xA9
+#define SCSIOP_WRITE12 0xAA
+#define SCSIOP_SEND_MESSAGE 0xAB
+#define SCSIOP_SERVICE_ACTION_IN12 0xAB
+#define SCSIOP_GET_PERFORMANCE 0xAC
+#define SCSIOP_READ_DVD_STRUCTURE 0xAD
+#define SCSIOP_WRITE_VERIFY12 0xAE
+#define SCSIOP_VERIFY12 0xAF
+#define SCSIOP_SEARCH_DATA_HIGH12 0xB0
+#define SCSIOP_SEARCH_DATA_EQUAL12 0xB1
+#define SCSIOP_SEARCH_DATA_LOW12 0xB2
+#define SCSIOP_SET_LIMITS12 0xB3
+#define SCSIOP_READ_ELEMENT_STATUS_ATTACHED 0xB4
+#define SCSIOP_REQUEST_VOL_ELEMENT 0xB5
+#define SCSIOP_SEND_VOLUME_TAG 0xB6
+#define SCSIOP_SET_STREAMING 0xB6
+#define SCSIOP_READ_DEFECT_DATA 0xB7
+#define SCSIOP_READ_ELEMENT_STATUS 0xB8
+#define SCSIOP_READ_CD_MSF 0xB9
+#define SCSIOP_SCAN_CD 0xBA
+#define SCSIOP_REDUNDANCY_GROUP_IN 0xBA
+#define SCSIOP_SET_CD_SPEED 0xBB
+#define SCSIOP_REDUNDANCY_GROUP_OUT 0xBB
+#define SCSIOP_PLAY_CD 0xBC
+#define SCSIOP_SPARE_IN 0xBC
+#define SCSIOP_MECHANISM_STATUS 0xBD
+#define SCSIOP_SPARE_OUT 0xBD
+#define SCSIOP_READ_CD 0xBE
+#define SCSIOP_VOLUME_SET_IN 0xBE
+#define SCSIOP_SEND_DVD_STRUCTURE 0xBF
+#define SCSIOP_VOLUME_SET_OUT 0xBF
+#define SCSIOP_INIT_ELEMENT_RANGE 0xE7
- struct _READ_ELEMENT_STATUS {
- UCHAR OperationCode;
- UCHAR ElementType : 4;
- UCHAR VolTag : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR StartingElementAddress[2];
- UCHAR NumberOfElements[2];
- UCHAR Reserved1;
- UCHAR AllocationLength[3];
- UCHAR Reserved2;
- UCHAR Control;
- } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS;
+#define SCSIOP_XDWRITE_EXTENDED16 0x80
+#define SCSIOP_WRITE_FILEMARKS16 0x80
+#define SCSIOP_REBUILD16 0x81
+#define SCSIOP_READ_REVERSE16 0x81
+#define SCSIOP_REGENERATE16 0x82
+#define SCSIOP_EXTENDED_COPY 0x83
+#define SCSIOP_RECEIVE_COPY_RESULTS 0x84
+#define SCSIOP_ATA_PASSTHROUGH16 0x85
+#define SCSIOP_ACCESS_CONTROL_IN 0x86
+#define SCSIOP_ACCESS_CONTROL_OUT 0x87
+#define SCSIOP_READ16 0x88
+#define SCSIOP_WRITE16 0x8A
+#define SCSIOP_READ_ATTRIBUTES 0x8C
+#define SCSIOP_WRITE_ATTRIBUTES 0x8D
+#define SCSIOP_WRITE_VERIFY16 0x8E
+#define SCSIOP_VERIFY16 0x8F
+#define SCSIOP_PREFETCH16 0x90
+#define SCSIOP_SYNCHRONIZE_CACHE16 0x91
+#define SCSIOP_SPACE16 0x91
+#define SCSIOP_LOCK_UNLOCK_CACHE16 0x92
+#define SCSIOP_LOCATE16 0x92
+#define SCSIOP_WRITE_SAME16 0x93
+#define SCSIOP_ERASE16 0x93
+#define SCSIOP_READ_CAPACITY16 0x9E
+#define SCSIOP_SERVICE_ACTION_IN16 0x9E
+#define SCSIOP_SERVICE_ACTION_OUT16 0x9F
- struct _SEND_VOLUME_TAG {
- UCHAR OperationCode;
- UCHAR ElementType : 4;
- UCHAR Reserved1 : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR StartingElementAddress[2];
- UCHAR Reserved2;
- UCHAR ActionCode : 5;
- UCHAR Reserved3 : 3;
- UCHAR Reserved4[2];
- UCHAR ParameterListLength[2];
- UCHAR Reserved5;
- UCHAR Control;
- } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG;
+#define CDB_RETURN_ON_COMPLETION 0
+#define CDB_RETURN_IMMEDIATE 1
- struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
- UCHAR OperationCode;
- UCHAR ElementType : 4;
- UCHAR VolTag : 1;
- UCHAR LogicalUnitNumber : 3;
- UCHAR StartingElementAddress[2];
- UCHAR NumberElements[2];
- UCHAR Reserved1;
- UCHAR AllocationLength[3];
- UCHAR Reserved2;
- UCHAR Control;
- } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS;
+#define CDB_FORCE_MEDIA_ACCESS 0x08
- struct _LOAD_UNLOAD {
- UCHAR OperationCode;
- UCHAR Immediate : 1;
- UCHAR Reserved1 : 4;
- UCHAR Lun : 3;
- UCHAR Reserved2[2];
- UCHAR Start : 1;
- UCHAR LoadEject : 1;
- UCHAR Reserved3: 6;
- UCHAR Reserved4[3];
- UCHAR Slot;
- UCHAR Reserved5[3];
- } LOAD_UNLOAD, *PLOAD_UNLOAD;
+#define SCSIOP_DENON_EJECT_DISC 0xE6
+#define SCSIOP_DENON_STOP_AUDIO 0xE7
+#define SCSIOP_DENON_PLAY_AUDIO 0xE8
+#define SCSIOP_DENON_READ_TOC 0xE9
+#define SCSIOP_DENON_READ_SUBCODE 0xEB
- struct _MECH_STATUS {
- UCHAR OperationCode;
- UCHAR Reserved : 5;
- UCHAR Lun : 3;
- UCHAR Reserved1[6];
- UCHAR AllocationLength[2];
- UCHAR Reserved2[1];
- UCHAR Control;
- } MECH_STATUS, *PMECH_STATUS;
+#define SCSIMESS_ABORT 0x06
+#define SCSIMESS_ABORT_WITH_TAG 0x0D
+#define SCSIMESS_BUS_DEVICE_RESET 0X0C
+#define SCSIMESS_CLEAR_QUEUE 0X0E
+#define SCSIMESS_COMMAND_COMPLETE 0X00
+#define SCSIMESS_DISCONNECT 0X04
+#define SCSIMESS_EXTENDED_MESSAGE 0X01
+#define SCSIMESS_IDENTIFY 0X80
+#define SCSIMESS_IDENTIFY_WITH_DISCON 0XC0
+#define SCSIMESS_IGNORE_WIDE_RESIDUE 0X23
+#define SCSIMESS_INITIATE_RECOVERY 0X0F
+#define SCSIMESS_INIT_DETECTED_ERROR 0X05
+#define SCSIMESS_LINK_CMD_COMP 0X0A
+#define SCSIMESS_LINK_CMD_COMP_W_FLAG 0X0B
+#define SCSIMESS_MESS_PARITY_ERROR 0X09
+#define SCSIMESS_MESSAGE_REJECT 0X07
+#define SCSIMESS_NO_OPERATION 0X08
+#define SCSIMESS_HEAD_OF_QUEUE_TAG 0X21
+#define SCSIMESS_ORDERED_QUEUE_TAG 0X22
+#define SCSIMESS_SIMPLE_QUEUE_TAG 0X20
+#define SCSIMESS_RELEASE_RECOVERY 0X10
+#define SCSIMESS_RESTORE_POINTERS 0X03
+#define SCSIMESS_SAVE_DATA_POINTER 0X02
+#define SCSIMESS_TERMINATE_IO_PROCESS 0X11
- struct _SYNCHRONIZE_CACHE10 {
+#define SCSIMESS_MODIFY_DATA_POINTER 0X00
+#define SCSIMESS_SYNCHRONOUS_DATA_REQ 0X01
+#define SCSIMESS_WIDE_DATA_REQUEST 0X03
- UCHAR OperationCode;
+#define SCSIMESS_MODIFY_DATA_LENGTH 5
+#define SCSIMESS_SYNCH_DATA_LENGTH 3
+#define SCSIMESS_WIDE_DATA_LENGTH 2
- UCHAR RelAddr : 1;
- UCHAR Immediate : 1;
- UCHAR Reserved : 3;
- UCHAR Lun : 3;
+#define CDB_INQUIRY_EVPD 0x01
- UCHAR LogicalBlockAddress[4];
- UCHAR Reserved2;
- UCHAR BlockCount[2];
- UCHAR Control;
- } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10;
+#define LUN0_FORMAT_SAVING_DEFECT_LIST 0
+#define USE_DEFAULTMSB 0
+#define USE_DEFAULTLSB 0
- struct _GET_EVENT_STATUS_NOTIFICATION {
- UCHAR OperationCode;
-
- UCHAR Immediate : 1;
- UCHAR Reserved : 4;
- UCHAR Lun : 3;
-
- UCHAR Reserved2[2];
- UCHAR NotificationClassRequest;
- UCHAR Reserved3[2];
- UCHAR EventListLength[2];
-
- UCHAR Control;
- } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION;
-
- struct _READ_DVD_STRUCTURE {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR RMDBlockNumber[4];
- UCHAR LayerNumber;
- UCHAR Format;
- UCHAR AllocationLength[2];
- UCHAR Reserved3 : 6;
- UCHAR AGID : 2;
- UCHAR Control;
- } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
-
- struct _SEND_DVD_STRUCTURE {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR Reserved2[5];
- UCHAR Format;
- UCHAR ParameterListLength[2];
- UCHAR Reserved3;
- UCHAR Control;
- } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE;
-
- struct _SEND_KEY {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR Reserved2[6];
- UCHAR ParameterListLength[2];
- UCHAR KeyFormat : 6;
- UCHAR AGID : 2;
- UCHAR Control;
- } SEND_KEY, *PSEND_KEY;
-
- struct _REPORT_KEY {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR LogicalBlockAddress[4];
- UCHAR Reserved2[2];
- UCHAR AllocationLength[2];
- UCHAR KeyFormat : 6;
- UCHAR AGID : 2;
- UCHAR Control;
- } REPORT_KEY, *PREPORT_KEY;
-
- struct _SET_READ_AHEAD {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR TriggerLBA[4];
- UCHAR ReadAheadLBA[4];
- UCHAR Reserved2;
- UCHAR Control;
- } SET_READ_AHEAD, *PSET_READ_AHEAD;
-
- struct _READ_FORMATTED_CAPACITIES {
- UCHAR OperationCode;
- UCHAR Reserved1 : 5;
- UCHAR Lun : 3;
- UCHAR Reserved2[5];
- UCHAR AllocationLength[2];
- UCHAR Control;
- } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES;
-
- struct _REPORT_LUNS {
- UCHAR OperationCode;
- UCHAR Reserved1[5];
- UCHAR AllocationLength[4];
- UCHAR Reserved2[1];
- UCHAR Control;
- } REPORT_LUNS, *PREPORT_LUNS;
-
- struct _PERSISTENT_RESERVE_IN {
- UCHAR OperationCode;
- UCHAR ServiceAction : 5;
- UCHAR Reserved1 : 3;
- UCHAR Reserved2[5];
- UCHAR AllocationLength[2];
- UCHAR Control;
- } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN;
-
- struct _PERSISTENT_RESERVE_OUT {
- UCHAR OperationCode;
- UCHAR ServiceAction : 5;
- UCHAR Reserved1 : 3;
- UCHAR Type : 4;
- UCHAR Scope : 4;
- UCHAR Reserved2[4];
- UCHAR ParameterListLength[2];
- UCHAR Control;
- } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT;
-
- struct _GET_CONFIGURATION {
- UCHAR OperationCode;
- UCHAR RequestType : 1;
- UCHAR Reserved1 : 7;
- UCHAR StartingFeature[2];
- UCHAR Reserved2[3];
- UCHAR AllocationLength[2];
- UCHAR Control;
- } GET_CONFIGURATION, *PGET_CONFIGURATION;
-
- struct _SET_CD_SPEED {
- UCHAR OperationCode;
- UCHAR Reserved1;
- UCHAR ReadSpeed[2];
- UCHAR WriteSpeed[2];
- UCHAR Reserved2[5];
- UCHAR Control;
- } SET_CD_SPEED, *PSET_CD_SPEED;
-
- ULONG AsUlong[4];
- UCHAR AsByte[16];
-} CDB, *PCDB;
-
-#ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
-#define _INQUIRYDATA_DEFINED
-
-#define INQUIRYDATABUFFERSIZE 36
-
-typedef struct _INQUIRYDATA {
- UCHAR DeviceType : 5;
- UCHAR DeviceTypeQualifier : 3;
- UCHAR DeviceTypeModifier : 7;
- UCHAR RemovableMedia : 1;
- _ANONYMOUS_UNION union {
- UCHAR Versions;
- _ANONYMOUS_STRUCT struct {
- UCHAR ANSIVersion : 3;
- UCHAR ECMAVersion : 3;
- UCHAR ISOVersion : 2;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- UCHAR ResponseDataFormat : 4;
- UCHAR HiSupport : 1;
- UCHAR NormACA : 1;
- UCHAR TerminateTask : 1;
- UCHAR AERC : 1;
- UCHAR AdditionalLength;
- UCHAR Reserved;
- UCHAR Addr16 : 1;
- UCHAR Addr32 : 1;
- UCHAR AckReqQ: 1;
- UCHAR MediumChanger : 1;
- UCHAR MultiPort : 1;
- UCHAR ReservedBit2 : 1;
- UCHAR EnclosureServices : 1;
- UCHAR ReservedBit3 : 1;
- UCHAR SoftReset : 1;
- UCHAR CommandQueue : 1;
- UCHAR TransferDisable : 1;
- UCHAR LinkedCommands : 1;
- UCHAR Synchronous : 1;
- UCHAR Wide16Bit : 1;
- UCHAR Wide32Bit : 1;
- UCHAR RelativeAddressing : 1;
- UCHAR VendorId[8];
- UCHAR ProductId[16];
- UCHAR ProductRevisionLevel[4];
- UCHAR VendorSpecific[20];
- UCHAR Reserved3[40];
-} INQUIRYDATA, *PINQUIRYDATA;
-#endif
+#define START_UNIT_CODE 0x01
+#define STOP_UNIT_CODE 0x00
/* INQUIRYDATA.DeviceType constants */
#define DIRECT_ACCESS_DEVICE 0x00
@@ -961,7 +465,16 @@ typedef struct _INQUIRYDATA {
#define OPTICAL_DEVICE 0x07
#define MEDIUM_CHANGER 0x08
#define COMMUNICATION_DEVICE 0x09
+#define ARRAY_CONTROLLER_DEVICE 0x0C
+#define SCSI_ENCLOSURE_DEVICE 0x0D
+#define REDUCED_BLOCK_DEVICE 0x0E
+#define OPTICAL_CARD_READER_WRITER_DEVICE 0x0F
+#define BRIDGE_CONTROLLER_DEVICE 0x10
+#define OBJECT_BASED_STORAGE_DEVICE 0x11
#define LOGICAL_UNIT_NOT_PRESENT_DEVICE 0x7F
+
+#define DEVICE_QUALIFIER_ACTIVE 0x00
+#define DEVICE_QUALIFIER_NOT_ACTIVE 0x01
#define DEVICE_QUALIFIER_NOT_SUPPORTED 0x03
/* INQUIRYDATA.DeviceTypeQualifier constants */
@@ -977,215 +490,42 @@ typedef struct _INQUIRYDATA {
#define SCSISTAT_COMMAND_TERMINATED 0x22
#define SCSISTAT_QUEUE_FULL 0x28
-/* Mode Sense/Select page constants */
-#define MODE_PAGE_ERROR_RECOVERY 0x01
-#define MODE_PAGE_DISCONNECT 0x02
-#define MODE_PAGE_FORMAT_DEVICE 0x03
-#define MODE_PAGE_RIGID_GEOMETRY 0x04
-#define MODE_PAGE_FLEXIBILE 0x05
-#define MODE_PAGE_WRITE_PARAMETERS 0x05
-#define MODE_PAGE_VERIFY_ERROR 0x07
-#define MODE_PAGE_CACHING 0x08
-#define MODE_PAGE_PERIPHERAL 0x09
-#define MODE_PAGE_CONTROL 0x0A
-#define MODE_PAGE_MEDIUM_TYPES 0x0B
-#define MODE_PAGE_NOTCH_PARTITION 0x0C
-#define MODE_PAGE_CD_AUDIO_CONTROL 0x0E
-#define MODE_PAGE_DATA_COMPRESS 0x0F
-#define MODE_PAGE_DEVICE_CONFIG 0x10
-#define MODE_PAGE_MEDIUM_PARTITION 0x11
-#define MODE_PAGE_CDVD_FEATURE_SET 0x18
-#define MODE_PAGE_POWER_CONDITION 0x1A
-#define MODE_PAGE_FAULT_REPORTING 0x1C
-#define MODE_PAGE_CDVD_INACTIVITY 0x1D
-#define MODE_PAGE_ELEMENT_ADDRESS 0x1D
-#define MODE_PAGE_TRANSPORT_GEOMETRY 0x1E
-#define MODE_PAGE_DEVICE_CAPABILITIES 0x1F
-#define MODE_PAGE_CAPABILITIES 0x2A
-#define MODE_SENSE_RETURN_ALL 0x3f
-#define MODE_SENSE_CURRENT_VALUES 0x00
-#define MODE_SENSE_CHANGEABLE_VALUES 0x40
-#define MODE_SENSE_DEFAULT_VAULES 0x80
-#define MODE_SENSE_SAVED_VALUES 0xc0
+#define VPD_MAX_BUFFER_SIZE 0xff
-/* SCSI CDB operation codes */
-#define SCSIOP_TEST_UNIT_READY 0x00
-#define SCSIOP_REZERO_UNIT 0x01
-#define SCSIOP_REWIND 0x01
-#define SCSIOP_REQUEST_BLOCK_ADDR 0x02
-#define SCSIOP_REQUEST_SENSE 0x03
-#define SCSIOP_FORMAT_UNIT 0x04
-#define SCSIOP_READ_BLOCK_LIMITS 0x05
-#define SCSIOP_REASSIGN_BLOCKS 0x07
-#define SCSIOP_INIT_ELEMENT_STATUS 0x07
-#define SCSIOP_READ6 0x08
-#define SCSIOP_RECEIVE 0x08
-#define SCSIOP_WRITE6 0x0A
-#define SCSIOP_PRINT 0x0A
-#define SCSIOP_SEND 0x0A
-#define SCSIOP_SEEK6 0x0B
-#define SCSIOP_TRACK_SELECT 0x0B
-#define SCSIOP_SLEW_PRINT 0x0B
-#define SCSIOP_SEEK_BLOCK 0x0C
-#define SCSIOP_PARTITION 0x0D
-#define SCSIOP_READ_REVERSE 0x0F
-#define SCSIOP_WRITE_FILEMARKS 0x10
-#define SCSIOP_FLUSH_BUFFER 0x10
-#define SCSIOP_SPACE 0x11
-#define SCSIOP_INQUIRY 0x12
-#define SCSIOP_VERIFY6 0x13
-#define SCSIOP_RECOVER_BUF_DATA 0x14
-#define SCSIOP_MODE_SELECT 0x15
-#define SCSIOP_RESERVE_UNIT 0x16
-#define SCSIOP_RELEASE_UNIT 0x17
-#define SCSIOP_COPY 0x18
-#define SCSIOP_ERASE 0x19
-#define SCSIOP_MODE_SENSE 0x1A
-#define SCSIOP_START_STOP_UNIT 0x1B
-#define SCSIOP_STOP_PRINT 0x1B
-#define SCSIOP_LOAD_UNLOAD 0x1B
-#define SCSIOP_RECEIVE_DIAGNOSTIC 0x1C
-#define SCSIOP_SEND_DIAGNOSTIC 0x1D
-#define SCSIOP_MEDIUM_REMOVAL 0x1E
+#define VPD_SUPPORTED_PAGES 0x00
+#define VPD_SERIAL_NUMBER 0x80
+#define VPD_DEVICE_IDENTIFIERS 0x83
+#define VPD_MEDIA_SERIAL_NUMBER 0x84
+#define VPD_SOFTWARE_INTERFACE_IDENTIFIERS 0x84
+#define VPD_NETWORK_MANAGEMENT_ADDRESSES 0x85
+#define VPD_EXTENDED_INQUIRY_DATA 0x86
+#define VPD_MODE_PAGE_POLICY 0x87
+#define VPD_SCSI_PORTS 0x88
-#define SCSIOP_READ_FORMATTED_CAPACITY 0x23
-#define SCSIOP_READ_CAPACITY 0x25
-#define SCSIOP_READ 0x28
-#define SCSIOP_WRITE 0x2A
-#define SCSIOP_SEEK 0x2B
-#define SCSIOP_LOCATE 0x2B
-#define SCSIOP_POSITION_TO_ELEMENT 0x2B
-#define SCSIOP_WRITE_VERIFY 0x2E
-#define SCSIOP_VERIFY 0x2F
-#define SCSIOP_SEARCH_DATA_HIGH 0x30
-#define SCSIOP_SEARCH_DATA_EQUAL 0x31
-#define SCSIOP_SEARCH_DATA_LOW 0x32
-#define SCSIOP_SET_LIMITS 0x33
-#define SCSIOP_READ_POSITION 0x34
-#define SCSIOP_SYNCHRONIZE_CACHE 0x35
-#define SCSIOP_COMPARE 0x39
-#define SCSIOP_COPY_COMPARE 0x3A
-#define SCSIOP_WRITE_DATA_BUFF 0x3B
-#define SCSIOP_READ_DATA_BUFF 0x3C
-#define SCSIOP_CHANGE_DEFINITION 0x40
-#define SCSIOP_READ_SUB_CHANNEL 0x42
-#define SCSIOP_READ_TOC 0x43
-#define SCSIOP_READ_HEADER 0x44
-#define SCSIOP_PLAY_AUDIO 0x45
-#define SCSIOP_GET_CONFIGURATION 0x46
-#define SCSIOP_PLAY_AUDIO_MSF 0x47
-#define SCSIOP_PLAY_TRACK_INDEX 0x48
-#define SCSIOP_PLAY_TRACK_RELATIVE 0x49
-#define SCSIOP_GET_EVENT_STATUS 0x4A
-#define SCSIOP_PAUSE_RESUME 0x4B
-#define SCSIOP_LOG_SELECT 0x4C
-#define SCSIOP_LOG_SENSE 0x4D
-#define SCSIOP_STOP_PLAY_SCAN 0x4E
-#define SCSIOP_READ_DISK_INFORMATION 0x51
-#define SCSIOP_READ_TRACK_INFORMATION 0x52
-#define SCSIOP_RESERVE_TRACK_RZONE 0x53
-#define SCSIOP_SEND_OPC_INFORMATION 0x54
-#define SCSIOP_MODE_SELECT10 0x55
-#define SCSIOP_MODE_SENSE10 0x5A
-#define SCSIOP_CLOSE_TRACK_SESSION 0x5B
-#define SCSIOP_READ_BUFFER_CAPACITY 0x5C
-#define SCSIOP_SEND_CUE_SHEET 0x5D
-#define SCSIOP_PERSISTENT_RESERVE_IN 0x5E
-#define SCSIOP_PERSISTENT_RESERVE_OUT 0x5F
+#define RESERVATION_ACTION_READ_KEYS 0x00
+#define RESERVATION_ACTION_READ_RESERVATIONS 0x01
-#define SCSIOP_REPORT_LUNS 0xA0
-#define SCSIOP_BLANK 0xA1
-#define SCSIOP_SEND_KEY 0xA3
-#define SCSIOP_REPORT_KEY 0xA4
-#define SCSIOP_MOVE_MEDIUM 0xA5
-#define SCSIOP_LOAD_UNLOAD_SLOT 0xA6
-#define SCSIOP_EXCHANGE_MEDIUM 0xA6
-#define SCSIOP_SET_READ_AHEAD 0xA7
-#define SCSIOP_READ_DVD_STRUCTURE 0xAD
-#define SCSIOP_REQUEST_VOL_ELEMENT 0xB5
-#define SCSIOP_SEND_VOLUME_TAG 0xB6
-#define SCSIOP_READ_ELEMENT_STATUS 0xB8
-#define SCSIOP_READ_CD_MSF 0xB9
-#define SCSIOP_SCAN_CD 0xBA
-#define SCSIOP_SET_CD_SPEED 0xBB
-#define SCSIOP_PLAY_CD 0xBC
-#define SCSIOP_MECHANISM_STATUS 0xBD
-#define SCSIOP_READ_CD 0xBE
-#define SCSIOP_SEND_DVD_STRUCTURE 0xBF
-#define SCSIOP_INIT_ELEMENT_RANGE 0xE7
+#define RESERVATION_ACTION_REGISTER 0x00
+#define RESERVATION_ACTION_RESERVE 0x01
+#define RESERVATION_ACTION_RELEASE 0x02
+#define RESERVATION_ACTION_CLEAR 0x03
+#define RESERVATION_ACTION_PREEMPT 0x04
+#define RESERVATION_ACTION_PREEMPT_ABORT 0x05
+#define RESERVATION_ACTION_REGISTER_IGNORE_EXISTING 0x06
-#define SCSIOP_DENON_EJECT_DISC 0xE6
-#define SCSIOP_DENON_STOP_AUDIO 0xE7
-#define SCSIOP_DENON_PLAY_AUDIO 0xE8
-#define SCSIOP_DENON_READ_TOC 0xE9
-#define SCSIOP_DENON_READ_SUBCODE 0xEB
+#define RESERVATION_SCOPE_LU 0x00
+#define RESERVATION_SCOPE_ELEMENT 0x02
-#define SCSIMESS_MODIFY_DATA_POINTER 0x00
-#define SCSIMESS_SYNCHRONOUS_DATA_REQ 0x01
-#define SCSIMESS_WIDE_DATA_REQUEST 0x03
+#define RESERVATION_TYPE_WRITE_EXCLUSIVE 0x01
+#define RESERVATION_TYPE_EXCLUSIVE 0x03
+#define RESERVATION_TYPE_WRITE_EXCLUSIVE_REGISTRANTS 0x05
+#define RESERVATION_TYPE_EXCLUSIVE_REGISTRANTS 0x06
-#define SCSIMESS_MODIFY_DATA_LENGTH 5
-#define SCSIMESS_SYNCH_DATA_LENGTH 3
-#define SCSIMESS_WIDE_DATA_LENGTH 2
+#define SENSE_BUFFER_SIZE 18
-#define SCSIMESS_ABORT 0x06
-#define SCSIMESS_ABORT_WITH_TAG 0x0D
-#define SCSIMESS_BUS_DEVICE_RESET 0x0C
-#define SCSIMESS_CLEAR_QUEUE 0x0E
-#define SCSIMESS_COMMAND_COMPLETE 0x00
-#define SCSIMESS_DISCONNECT 0x04
-#define SCSIMESS_EXTENDED_MESSAGE 0x01
-#define SCSIMESS_IDENTIFY 0x80
-#define SCSIMESS_IDENTIFY_WITH_DISCON 0xC0
-#define SCSIMESS_IGNORE_WIDE_RESIDUE 0x23
-#define SCSIMESS_INITIATE_RECOVERY 0x0F
-#define SCSIMESS_INIT_DETECTED_ERROR 0x05
-#define SCSIMESS_LINK_CMD_COMP 0x0A
-#define SCSIMESS_LINK_CMD_COMP_W_FLAG 0x0B
-#define SCSIMESS_MESS_PARITY_ERROR 0x09
-#define SCSIMESS_MESSAGE_REJECT 0x07
-#define SCSIMESS_NO_OPERATION 0x08
-#define SCSIMESS_HEAD_OF_QUEUE_TAG 0x21
-#define SCSIMESS_ORDERED_QUEUE_TAG 0x22
-#define SCSIMESS_SIMPLE_QUEUE_TAG 0x20
-#define SCSIMESS_RELEASE_RECOVERY 0x10
-#define SCSIMESS_RESTORE_POINTERS 0x03
-#define SCSIMESS_SAVE_DATA_POINTER 0x02
-#define SCSIMESS_TERMINATE_IO_PROCESS 0x11
+#define MAX_SENSE_BUFFER_SIZE 255
-#define CDB_FORCE_MEDIA_ACCESS 0x08
-
-#define CDB_RETURN_ON_COMPLETION 0
-#define CDB_RETURN_IMMEDIATE 1
-
-#define CDB_INQUIRY_EVPD 0x01
-
-#define LUN0_FORMAT_SAVING_DEFECT_LIST 0
-#define USE_DEFAULTMSB 0
-#define USE_DEFAULTLSB 0
-
-#define START_UNIT_CODE 0x01
-#define STOP_UNIT_CODE 0x00
-
-typedef struct _SENSE_DATA {
- UCHAR ErrorCode : 7;
- UCHAR Valid : 1;
- UCHAR SegmentNumber;
- UCHAR SenseKey : 4;
- UCHAR Reserved : 1;
- UCHAR IncorrectLength : 1;
- UCHAR EndOfMedia : 1;
- UCHAR FileMark : 1;
- UCHAR Information[4];
- UCHAR AdditionalSenseLength;
- UCHAR CommandSpecificInformation[4];
- UCHAR AdditionalSenseCode;
- UCHAR AdditionalSenseCodeQualifier;
- UCHAR FieldReplaceableUnitCode;
- UCHAR SenseKeySpecific[3];
-} SENSE_DATA, *PSENSE_DATA;
-
-#define SENSE_BUFFER_SIZE 18
+#define MAX_ADDITIONAL_SENSE_BYTES (MAX_SENSE_BUFFER_SIZE - SENSE_BUFFER_SIZE)
/* Sense codes */
#define SCSI_SENSE_NO_SENSE 0x00
@@ -1214,22 +554,27 @@ typedef struct _SENSE_DATA {
#define SCSI_ADSENSE_NO_SENSE 0x00
#define SCSI_ADSENSE_NO_SEEK_COMPLETE 0x02
#define SCSI_ADSENSE_LUN_NOT_READY 0x04
+#define SCSI_ADSENSE_LUN_COMMUNICATION 0x08
#define SCSI_ADSENSE_WRITE_ERROR 0x0C
#define SCSI_ADSENSE_TRACK_ERROR 0x14
#define SCSI_ADSENSE_SEEK_ERROR 0x15
#define SCSI_ADSENSE_REC_DATA_NOECC 0x17
#define SCSI_ADSENSE_REC_DATA_ECC 0x18
+#define SCSI_ADSENSE_PARAMETER_LIST_LENGTH 0x1A
#define SCSI_ADSENSE_ILLEGAL_COMMAND 0x20
#define SCSI_ADSENSE_ILLEGAL_BLOCK 0x21
#define SCSI_ADSENSE_INVALID_CDB 0x24
#define SCSI_ADSENSE_INVALID_LUN 0x25
+#define SCSI_ADSENSE_INVALID_FIELD_PARAMETER_LIST 0x26
#define SCSI_ADSENSE_WRITE_PROTECT 0x27
#define SCSI_ADSENSE_MEDIUM_CHANGED 0x28
#define SCSI_ADSENSE_BUS_RESET 0x29
+#define SCSI_ADSENSE_PARAMETERS_CHANGED 0x2A
#define SCSI_ADSENSE_INSUFFICIENT_TIME_FOR_OPERATION 0x2E
#define SCSI_ADSENSE_INVALID_MEDIA 0x30
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE 0x3a
#define SCSI_ADSENSE_POSITION_ERROR 0x3b
+#define SCSI_ADSENSE_OPERATING_CONDITIONS_CHANGED 0x3f
#define SCSI_ADSENSE_OPERATOR_REQUEST 0x5a
#define SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED 0x5d
#define SCSI_ADSENSE_ILLEGAL_MODE_FOR_THIS_TRACK 0x64
@@ -1240,6 +585,9 @@ typedef struct _SENSE_DATA {
#define SCSI_ADSENSE_DATA_AREA 0xA1
#define SCSI_ADSENSE_VOLUME_OVERFLOW 0xA7
+#define SCSI_ADWRITE_PROTECT SCSI_ADSENSE_WRITE_PROTECT
+#define SCSI_FAILURE_PREDICTION_THRESHOLD_EXCEEDED SCSI_ADSENSE_FAILURE_PREDICTION_THRESHOLD_EXCEEDED
+
#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE 0x00
#define SCSI_SENSEQ_BECOMING_READY 0x01
#define SCSI_SENSEQ_INIT_COMMAND_REQUIRED 0x02
@@ -1252,6 +600,64 @@ typedef struct _SENSE_DATA {
#define SCSI_SENSEQ_LOSS_OF_STREAMING 0x09
#define SCSI_SENSEQ_PADDING_BLOCKS_ADDED 0x0A
+#define SCSI_SENSEQ_COMM_FAILURE 0x00
+#define SCSI_SENSEQ_COMM_TIMEOUT 0x01
+#define SCSI_SENSEQ_COMM_PARITY_ERROR 0x02
+#define SCSI_SESNEQ_COMM_CRC_ERROR 0x03
+#define SCSI_SENSEQ_UNREACHABLE_TARGET 0x04
+
+#define SCSI_SENSEQ_FILEMARK_DETECTED 0x01
+#define SCSI_SENSEQ_END_OF_MEDIA_DETECTED 0x02
+#define SCSI_SENSEQ_SETMARK_DETECTED 0x03
+#define SCSI_SENSEQ_BEGINNING_OF_MEDIA_DETECTED 0x04
+
+#define SCSI_SENSEQ_ILLEGAL_ELEMENT_ADDR 0x01
+
+#define SCSI_SENSEQ_DESTINATION_FULL 0x0d
+#define SCSI_SENSEQ_SOURCE_EMPTY 0x0e
+
+#define SCSI_SENSEQ_INCOMPATIBLE_MEDIA_INSTALLED 0x00
+#define SCSI_SENSEQ_UNKNOWN_FORMAT 0x01
+#define SCSI_SENSEQ_INCOMPATIBLE_FORMAT 0x02
+#define SCSI_SENSEQ_CLEANING_CARTRIDGE_INSTALLED 0x03
+
+#define SCSI_SENSEQ_TARGET_OPERATING_CONDITIONS_CHANGED 0x00
+#define SCSI_SENSEQ_MICROCODE_CHANGED 0x01
+#define SCSI_SENSEQ_OPERATING_DEFINITION_CHANGED 0x02
+#define SCSI_SENSEQ_INQUIRY_DATA_CHANGED 0x03
+#define SCSI_SENSEQ_COMPONENT_DEVICE_ATTACHED 0x04
+#define SCSI_SENSEQ_DEVICE_IDENTIFIER_CHANGED 0x05
+#define SCSI_SENSEQ_REDUNDANCY_GROUP_MODIFIED 0x06
+#define SCSI_SENSEQ_REDUNDANCY_GROUP_DELETED 0x07
+#define SCSI_SENSEQ_SPARE_MODIFIED 0x08
+#define SCSI_SENSEQ_SPARE_DELETED 0x09
+#define SCSI_SENSEQ_VOLUME_SET_MODIFIED 0x0A
+#define SCSI_SENSEQ_VOLUME_SET_DELETED 0x0B
+#define SCSI_SENSEQ_VOLUME_SET_DEASSIGNED 0x0C
+#define SCSI_SENSEQ_VOLUME_SET_REASSIGNED 0x0D
+#define SCSI_SENSEQ_REPORTED_LUNS_DATA_CHANGED 0x0E
+#define SCSI_SENSEQ_ECHO_BUFFER_OVERWRITTEN 0x0F
+#define SCSI_SENSEQ_MEDIUM_LOADABLE 0x10
+#define SCSI_SENSEQ_MEDIUM_AUXILIARY_MEMORY_ACCESSIBLE 0x11
+
+#define SCSI_SENSEQ_STATE_CHANGE_INPUT 0x00
+#define SCSI_SENSEQ_MEDIUM_REMOVAL 0x01
+#define SCSI_SENSEQ_WRITE_PROTECT_ENABLE 0x02
+#define SCSI_SENSEQ_WRITE_PROTECT_DISABLE 0x03
+
+#define SCSI_SENSEQ_AUTHENTICATION_FAILURE 0x00
+#define SCSI_SENSEQ_KEY_NOT_PRESENT 0x01
+#define SCSI_SENSEQ_KEY_NOT_ESTABLISHED 0x02
+#define SCSI_SENSEQ_READ_OF_SCRAMBLED_SECTOR_WITHOUT_AUTHENTICATION 0x03
+#define SCSI_SENSEQ_MEDIA_CODE_MISMATCHED_TO_LOGICAL_UNIT 0x04
+#define SCSI_SENSEQ_LOGICAL_UNIT_RESET_COUNT_ERROR 0x05
+
+#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ALMOST_FULL 0x01
+#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_FULL 0x02
+#define SCSI_SENSEQ_POWER_CALIBRATION_AREA_ERROR 0x03
+#define SCSI_SENSEQ_PMA_RMA_UPDATE_FAILURE 0x04
+#define SCSI_SENSEQ_PMA_RMA_IS_FULL 0x05
+#define SCSI_SENSEQ_PMA_RMA_ALMOST_FULL 0x06
#define FILE_DEVICE_SCSI 0x0000001b
@@ -1275,255 +681,39 @@ typedef struct _SENSE_DATA {
#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c)
/* CLUSTER support */
-#define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520)
+#define IOCTL_SCSI_MINIPORT_NOT_QUORUM_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0520)
#define IOCTL_SCSI_MINIPORT_NOT_CLUSTER_CAPABLE ((FILE_DEVICE_SCSI << 16) + 0x0521)
-/* Read Capacity Data. Returned in Big Endian format */
-typedef struct _READ_CAPACITY_DATA {
- ULONG LogicalBlockAddress;
- ULONG BytesPerBlock;
-} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
-
-/* Read Block Limits Data. Returned in Big Endian format */
-typedef struct _READ_BLOCK_LIMITS {
- UCHAR Reserved;
- UCHAR BlockMaximumSize[3];
- UCHAR BlockMinimumSize[2];
-} READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
-
-#define MODE_BLOCK_DESC_LENGTH 8
-#define MODE_HEADER_LENGTH 4
-#define MODE_HEADER_LENGTH10 8
-
-typedef struct _MODE_PARAMETER_HEADER {
- UCHAR ModeDataLength;
- UCHAR MediumType;
- UCHAR DeviceSpecificParameter;
- UCHAR BlockDescriptorLength;
-} MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
-
-typedef struct _MODE_PARAMETER_HEADER10 {
- UCHAR ModeDataLength[2];
- UCHAR MediumType;
- UCHAR DeviceSpecificParameter;
- UCHAR Reserved[2];
- UCHAR BlockDescriptorLength[2];
-} MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
-
#define MODE_FD_SINGLE_SIDE 0x01
#define MODE_FD_DOUBLE_SIDE 0x02
#define MODE_FD_MAXIMUM_TYPE 0x1E
#define MODE_DSP_FUA_SUPPORTED 0x10
#define MODE_DSP_WRITE_PROTECT 0x80
-typedef struct _MODE_PARAMETER_BLOCK {
- UCHAR DensityCode;
- UCHAR NumberOfBlocks[3];
- UCHAR Reserved;
- UCHAR BlockLength[3];
-} MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
+#define CDDA_CHANNEL_MUTED 0x0
+#define CDDA_CHANNEL_ZERO 0x1
+#define CDDA_CHANNEL_ONE 0x2
+#define CDDA_CHANNEL_TWO 0x4
+#define CDDA_CHANNEL_THREE 0x8
-typedef struct _MODE_DISCONNECT_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved : 1;
- UCHAR PageSavable : 1;
- UCHAR PageLength;
- UCHAR BufferFullRatio;
- UCHAR BufferEmptyRatio;
- UCHAR BusInactivityLimit[2];
- UCHAR BusDisconnectTime[2];
- UCHAR BusConnectTime[2];
- UCHAR MaximumBurstSize[2];
- UCHAR DataTransferDisconnect : 2;
- UCHAR Reserved2[3];
-} MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
+#define CDVD_LMT_CADDY 0
+#define CDVD_LMT_TRAY 1
+#define CDVD_LMT_POPUP 2
+#define CDVD_LMT_RESERVED1 3
+#define CDVD_LMT_CHANGER_INDIVIDUAL 4
+#define CDVD_LMT_CHANGER_CARTRIDGE 5
+#define CDVD_LMT_RESERVED2 6
+#define CDVD_LMT_RESERVED3 7
-typedef struct _MODE_CACHING_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved : 1;
- UCHAR PageSavable : 1;
- UCHAR PageLength;
- UCHAR ReadDisableCache : 1;
- UCHAR MultiplicationFactor : 1;
- UCHAR WriteCacheEnable : 1;
- UCHAR Reserved2 : 5;
- UCHAR WriteRetensionPriority : 4;
- UCHAR ReadRetensionPriority : 4;
- UCHAR DisablePrefetchTransfer[2];
- UCHAR MinimumPrefetch[2];
- UCHAR MaximumPrefetch[2];
- UCHAR MaximumPrefetchCeiling[2];
-} MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
+#define LOADING_MECHANISM_CADDY 0x00
+#define LOADING_MECHANISM_TRAY 0x01
+#define LOADING_MECHANISM_POPUP 0x02
+#define LOADING_MECHANISM_INDIVIDUAL_CHANGER 0x04
+#define LOADING_MECHANISM_CARTRIDGE_CHANGER 0x05
-typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
- UCHAR PageLength;
- UCHAR WriteType : 4;
- UCHAR TestWrite : 1;
- UCHAR LinkSizeValid : 1;
- UCHAR BufferUnderrunFreeEnabled : 1;
- UCHAR Reserved2 : 1;
- UCHAR TrackMode : 4;
- UCHAR Copy : 1;
- UCHAR FixedPacket : 1;
- UCHAR MultiSession : 2;
- UCHAR DataBlockType : 4;
- UCHAR Reserved3 : 4;
- UCHAR LinkSize;
- UCHAR Reserved4;
- UCHAR HostApplicationCode : 6;
- UCHAR Reserved5 : 2;
- UCHAR SessionFormat;
- UCHAR Reserved6;
- UCHAR PacketSize[4];
- UCHAR AudioPauseLength[2];
- UCHAR Reserved7 : 7;
- UCHAR MediaCatalogNumberValid : 1;
- UCHAR MediaCatalogNumber[13];
- UCHAR MediaCatalogNumberZero;
- UCHAR MediaCatalogNumberAFrame;
- UCHAR Reserved8 : 7;
- UCHAR ISRCValid : 1;
- UCHAR ISRCCountry[2];
- UCHAR ISRCOwner[3];
- UCHAR ISRCRecordingYear[2];
- UCHAR ISRCSerialNumber[5];
- UCHAR ISRCZero;
- UCHAR ISRCAFrame;
- UCHAR ISRCReserved;
- UCHAR SubHeaderData[4];
-} MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
-
-typedef struct _MODE_FLEXIBLE_DISK_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved : 1;
- UCHAR PageSavable : 1;
- UCHAR PageLength;
- UCHAR TransferRate[2];
- UCHAR NumberOfHeads;
- UCHAR SectorsPerTrack;
- UCHAR BytesPerSector[2];
- UCHAR NumberOfCylinders[2];
- UCHAR StartWritePrecom[2];
- UCHAR StartReducedCurrent[2];
- UCHAR StepRate[2];
- UCHAR StepPluseWidth;
- UCHAR HeadSettleDelay[2];
- UCHAR MotorOnDelay;
- UCHAR MotorOffDelay;
- UCHAR Reserved2 : 5;
- UCHAR MotorOnAsserted : 1;
- UCHAR StartSectorNumber : 1;
- UCHAR TrueReadySignal : 1;
- UCHAR StepPlusePerCyclynder : 4;
- UCHAR Reserved3 : 4;
- UCHAR WriteCompenstation;
- UCHAR HeadLoadDelay;
- UCHAR HeadUnloadDelay;
- UCHAR Pin2Usage : 4;
- UCHAR Pin34Usage : 4;
- UCHAR Pin1Usage : 4;
- UCHAR Pin4Usage : 4;
- UCHAR MediumRotationRate[2];
- UCHAR Reserved4[2];
-} MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
-
-typedef struct _MODE_FORMAT_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved : 1;
- UCHAR PageSavable : 1;
- UCHAR PageLength;
- UCHAR TracksPerZone[2];
- UCHAR AlternateSectorsPerZone[2];
- UCHAR AlternateTracksPerZone[2];
- UCHAR AlternateTracksPerLogicalUnit[2];
- UCHAR SectorsPerTrack[2];
- UCHAR BytesPerPhysicalSector[2];
- UCHAR Interleave[2];
- UCHAR TrackSkewFactor[2];
- UCHAR CylinderSkewFactor[2];
- UCHAR Reserved2 : 4;
- UCHAR SurfaceFirst : 1;
- UCHAR RemovableMedia : 1;
- UCHAR HardSectorFormating : 1;
- UCHAR SoftSectorFormating : 1;
- UCHAR Reserved3[3];
-} MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
-
-typedef struct _MODE_RIGID_GEOMETRY_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved : 1;
- UCHAR PageSavable : 1;
- UCHAR PageLength;
- UCHAR NumberOfCylinders[3];
- UCHAR NumberOfHeads;
- UCHAR StartWritePrecom[3];
- UCHAR StartReducedCurrent[3];
- UCHAR DriveStepRate[2];
- UCHAR LandZoneCyclinder[3];
- UCHAR RotationalPositionLock : 2;
- UCHAR Reserved2 : 6;
- UCHAR RotationOffset;
- UCHAR Reserved3;
- UCHAR RoataionRate[2];
- UCHAR Reserved4[2];
-} MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
-
-typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved1 : 1;
- UCHAR PSBit : 1;
- UCHAR PageLength;
- UCHAR DCRBit : 1;
- UCHAR DTEBit : 1;
- UCHAR PERBit : 1;
- UCHAR EERBit : 1;
- UCHAR RCBit : 1;
- UCHAR TBBit : 1;
- UCHAR ARRE : 1;
- UCHAR AWRE : 1;
- UCHAR ReadRetryCount;
- UCHAR Reserved4[4];
- UCHAR WriteRetryCount;
- UCHAR Reserved5[3];
-} MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
-
-typedef struct _MODE_READ_RECOVERY_PAGE {
- UCHAR PageCode : 6;
- UCHAR Reserved1 : 1;
- UCHAR PSBit : 1;
- UCHAR PageLength;
- UCHAR DCRBit : 1;
- UCHAR DTEBit : 1;
- UCHAR PERBit : 1;
- UCHAR Reserved2 : 1;
- UCHAR RCBit : 1;
- UCHAR TBBit : 1;
- UCHAR Reserved3 : 2;
- UCHAR ReadRetryCount;
- UCHAR Reserved4[4];
-} MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
-
-typedef struct _MODE_INFO_EXCEPTIONS {
- UCHAR PageCode : 6;
- UCHAR Reserved1 : 1;
- UCHAR PSBit : 1;
- UCHAR PageLength;
- _ANONYMOUS_UNION union {
- UCHAR Flags;
- _ANONYMOUS_STRUCT struct {
- UCHAR LogErr : 1;
- UCHAR Reserved2 : 1;
- UCHAR Test : 1;
- UCHAR Dexcpt : 1;
- UCHAR Reserved3 : 3;
- UCHAR Perf : 1;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- UCHAR ReportMethod : 4;
- UCHAR Reserved4 : 4;
- UCHAR IntervalTimer[4];
- UCHAR ReportCount[4];
-} MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
+#define MODE_BLOCK_DESC_LENGTH 8
+#define MODE_HEADER_LENGTH 4
+#define MODE_HEADER_LENGTH10 8
/* CDROM audio control */
#define CDB_AUDIO_PAUSE 0x00
@@ -1541,122 +731,1986 @@ typedef struct _MODE_INFO_EXCEPTIONS {
#define CDB_USE_MSF 0x01
+/* Multisession CDROMs */
+#define GET_LAST_SESSION 0x01
+#define GET_SESSION_DATA 0x02
+
+typedef union _CDB {
+ struct _CDB6GENERIC {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR CommandUniqueBits:4;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR CommandUniqueBytes[3];
+ UCHAR Link:1;
+ UCHAR Flag:1;
+ UCHAR Reserved:4;
+ UCHAR VendorUnique:2;
+ } CDB6GENERIC, *PCDB6GENERIC;
+ struct _CDB6READWRITE {
+ UCHAR OperationCode;
+ UCHAR LogicalBlockMsb1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlockMsb0;
+ UCHAR LogicalBlockLsb;
+ UCHAR TransferBlocks;
+ UCHAR Control;
+ } CDB6READWRITE, *PCDB6READWRITE;
+ struct _CDB6INQUIRY {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR PageCode;
+ UCHAR IReserved;
+ UCHAR AllocationLength;
+ UCHAR Control;
+ } CDB6INQUIRY, *PCDB6INQUIRY;
+ struct _CDB6INQUIRY3 {
+ UCHAR OperationCode;
+ UCHAR EnableVitalProductData:1;
+ UCHAR CommandSupportData:1;
+ UCHAR Reserved1:6;
+ UCHAR PageCode;
+ UCHAR Reserved2;
+ UCHAR AllocationLength;
+ UCHAR Control;
+ } CDB6INQUIRY3, *PCDB6INQUIRY3;
+ struct _CDB6VERIFY {
+ UCHAR OperationCode;
+ UCHAR Fixed:1;
+ UCHAR ByteCompare:1;
+ UCHAR Immediate:1;
+ UCHAR Reserved:2;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR VerificationLength[3];
+ UCHAR Control;
+ } CDB6VERIFY, *PCDB6VERIFY;
+ struct _CDB6FORMAT {
+ UCHAR OperationCode;
+ UCHAR FormatControl:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR FReserved1;
+ UCHAR InterleaveMsb;
+ UCHAR InterleaveLsb;
+ UCHAR FReserved2;
+ } CDB6FORMAT, *PCDB6FORMAT;
+ struct _CDB10 {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved1:2;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlockByte0;
+ UCHAR LogicalBlockByte1;
+ UCHAR LogicalBlockByte2;
+ UCHAR LogicalBlockByte3;
+ UCHAR Reserved2;
+ UCHAR TransferBlocksMsb;
+ UCHAR TransferBlocksLsb;
+ UCHAR Control;
+ } CDB10, *PCDB10;
+ struct _CDB12 {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved1:2;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlock[4];
+ UCHAR TransferLength[4];
+ UCHAR Reserved2;
+ UCHAR Control;
+ } CDB12, *PCDB12;
+ struct _CDB16 {
+ UCHAR OperationCode;
+ UCHAR Reserved1:3;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR Protection:3;
+ UCHAR LogicalBlock[8];
+ UCHAR TransferLength[4];
+ UCHAR Reserved2;
+ UCHAR Control;
+ } CDB16, *PCDB16;
+ struct _PAUSE_RESUME {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2[6];
+ UCHAR Action;
+ UCHAR Control;
+ } PAUSE_RESUME, *PPAUSE_RESUME;
+ struct _READ_TOC {
+ UCHAR OperationCode;
+ UCHAR Reserved0:1;
+ UCHAR Msf:1;
+ UCHAR Reserved1:3;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Format2:4;
+ UCHAR Reserved2:4;
+ UCHAR Reserved3[3];
+ UCHAR StartingTrack;
+ UCHAR AllocationLength[2];
+ UCHAR Control:6;
+ UCHAR Format:2;
+ } READ_TOC, *PREAD_TOC;
+ struct _READ_DISK_INFORMATION {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR Reserved2[5];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } READ_DISK_INFORMATION, *PREAD_DISK_INFORMATION;
+ struct _READ_TRACK_INFORMATION {
+ UCHAR OperationCode;
+ UCHAR Track:1;
+ UCHAR Reserved1:3;
+ UCHAR Reserved2:1;
+ UCHAR Lun:3;
+ UCHAR BlockAddress[4];
+ UCHAR Reserved3;
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } READ_TRACK_INFORMATION, *PREAD_TRACK_INFORMATION;
+ struct _RESERVE_TRACK_RZONE {
+ UCHAR OperationCode;
+ UCHAR Reserved1[4];
+ UCHAR ReservationSize[4];
+ UCHAR Control;
+ } RESERVE_TRACK_RZONE, *PRESERVE_TRACK_RZONE;
+ struct _SEND_OPC_INFORMATION {
+ UCHAR OperationCode;
+ UCHAR DoOpc:1;
+ UCHAR Reserved1:7;
+ UCHAR Exclude0:1;
+ UCHAR Exclude1:1;
+ UCHAR Reserved2:6;
+ UCHAR Reserved3[4];
+ UCHAR ParameterListLength[2];
+ UCHAR Reserved4;
+ } SEND_OPC_INFORMATION, *PSEND_OPC_INFORMATION;
+ struct _REPAIR_TRACK {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Reserved1:7;
+ UCHAR Reserved2[2];
+ UCHAR TrackNumber[2];
+ UCHAR Reserved3[3];
+ UCHAR Control;
+ } REPAIR_TRACK, *PREPAIR_TRACK;
+ struct _CLOSE_TRACK {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Reserved1:7;
+ UCHAR Track:1;
+ UCHAR Session:1;
+ UCHAR Reserved2:6;
+ UCHAR Reserved3;
+ UCHAR TrackNumber[2];
+ UCHAR Reserved4[3];
+ UCHAR Control;
+ } CLOSE_TRACK, *PCLOSE_TRACK;
+ struct _READ_BUFFER_CAPACITY {
+ UCHAR OperationCode;
+ UCHAR BlockInfo:1;
+ UCHAR Reserved1:7;
+ UCHAR Reserved2[5];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } READ_BUFFER_CAPACITY, *PREAD_BUFFER_CAPACITY;
+ struct _SEND_CUE_SHEET {
+ UCHAR OperationCode;
+ UCHAR Reserved[5];
+ UCHAR CueSheetSize[3];
+ UCHAR Control;
+ } SEND_CUE_SHEET, *PSEND_CUE_SHEET;
+ struct _READ_HEADER {
+ UCHAR OperationCode;
+ UCHAR Reserved1:1;
+ UCHAR Msf:1;
+ UCHAR Reserved2:3;
+ UCHAR Lun:3;
+ UCHAR LogicalBlockAddress[4];
+ UCHAR Reserved3;
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } READ_HEADER, *PREAD_HEADER;
+ struct _PLAY_AUDIO {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR StartingBlockAddress[4];
+ UCHAR Reserved2;
+ UCHAR PlayLength[2];
+ UCHAR Control;
+ } PLAY_AUDIO, *PPLAY_AUDIO;
+ struct _PLAY_AUDIO_MSF {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2;
+ UCHAR StartingM;
+ UCHAR StartingS;
+ UCHAR StartingF;
+ UCHAR EndingM;
+ UCHAR EndingS;
+ UCHAR EndingF;
+ UCHAR Control;
+ } PLAY_AUDIO_MSF, *PPLAY_AUDIO_MSF;
+ struct _BLANK_MEDIA {
+ UCHAR OperationCode;
+ UCHAR BlankType:3;
+ UCHAR Reserved1:1;
+ UCHAR Immediate:1;
+ UCHAR Reserved2:3;
+ UCHAR AddressOrTrack[4];
+ UCHAR Reserved3[5];
+ UCHAR Control;
+ } BLANK_MEDIA, *PBLANK_MEDIA;
+ struct _PLAY_CD {
+ UCHAR OperationCode;
+ UCHAR Reserved1:1;
+ UCHAR CMSF:1;
+ UCHAR ExpectedSectorType:3;
+ UCHAR Lun:3;
+ _ANONYMOUS_UNION union {
+ struct _LBA {
+ UCHAR StartingBlockAddress[4];
+ UCHAR PlayLength[4];
+ } LBA;
+ struct _MSF {
+ UCHAR Reserved1;
+ UCHAR StartingM;
+ UCHAR StartingS;
+ UCHAR StartingF;
+ UCHAR EndingM;
+ UCHAR EndingS;
+ UCHAR EndingF;
+ UCHAR Reserved2;
+ } MSF;
+ } DUMMYUNIONNAME;
+ UCHAR Audio:1;
+ UCHAR Composite:1;
+ UCHAR Port1:1;
+ UCHAR Port2:1;
+ UCHAR Reserved2:3;
+ UCHAR Speed:1;
+ UCHAR Control;
+ } PLAY_CD, *PPLAY_CD;
+ struct _SCAN_CD {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved1:3;
+ UCHAR Direct:1;
+ UCHAR Lun:3;
+ UCHAR StartingAddress[4];
+ UCHAR Reserved2[3];
+ UCHAR Reserved3:6;
+ UCHAR Type:2;
+ UCHAR Reserved4;
+ UCHAR Control;
+ } SCAN_CD, *PSCAN_CD;
+ struct _STOP_PLAY_SCAN {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR Reserved2[7];
+ UCHAR Control;
+ } STOP_PLAY_SCAN, *PSTOP_PLAY_SCAN;
+ struct _SUBCHANNEL {
+ UCHAR OperationCode;
+ UCHAR Reserved0:1;
+ UCHAR Msf:1;
+ UCHAR Reserved1:3;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2:6;
+ UCHAR SubQ:1;
+ UCHAR Reserved3:1;
+ UCHAR Format;
+ UCHAR Reserved4[2];
+ UCHAR TrackNumber;
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } SUBCHANNEL, *PSUBCHANNEL;
+ struct _READ_CD {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved0:1;
+ UCHAR ExpectedSectorType:3;
+ UCHAR Lun:3;
+ UCHAR StartingLBA[4];
+ UCHAR TransferBlocks[3];
+ UCHAR Reserved2:1;
+ UCHAR ErrorFlags:2;
+ UCHAR IncludeEDC:1;
+ UCHAR IncludeUserData:1;
+ UCHAR HeaderCode:2;
+ UCHAR IncludeSyncData:1;
+ UCHAR SubChannelSelection:3;
+ UCHAR Reserved3:5;
+ UCHAR Control;
+ } READ_CD, *PREAD_CD;
+ struct _READ_CD_MSF {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved1:1;
+ UCHAR ExpectedSectorType:3;
+ UCHAR Lun:3;
+ UCHAR Reserved2;
+ UCHAR StartingM;
+ UCHAR StartingS;
+ UCHAR StartingF;
+ UCHAR EndingM;
+ UCHAR EndingS;
+ UCHAR EndingF;
+ UCHAR Reserved3;
+ UCHAR Reserved4:1;
+ UCHAR ErrorFlags:2;
+ UCHAR IncludeEDC:1;
+ UCHAR IncludeUserData:1;
+ UCHAR HeaderCode:2;
+ UCHAR IncludeSyncData:1;
+ UCHAR SubChannelSelection:3;
+ UCHAR Reserved5:5;
+ UCHAR Control;
+ } READ_CD_MSF, *PREAD_CD_MSF;
+ struct _PLXTR_READ_CDDA {
+ UCHAR OperationCode;
+ UCHAR Reserved0:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlockByte0;
+ UCHAR LogicalBlockByte1;
+ UCHAR LogicalBlockByte2;
+ UCHAR LogicalBlockByte3;
+ UCHAR TransferBlockByte0;
+ UCHAR TransferBlockByte1;
+ UCHAR TransferBlockByte2;
+ UCHAR TransferBlockByte3;
+ UCHAR SubCode;
+ UCHAR Control;
+ } PLXTR_READ_CDDA, *PPLXTR_READ_CDDA;
+ struct _NEC_READ_CDDA {
+ UCHAR OperationCode;
+ UCHAR Reserved0;
+ UCHAR LogicalBlockByte0;
+ UCHAR LogicalBlockByte1;
+ UCHAR LogicalBlockByte2;
+ UCHAR LogicalBlockByte3;
+ UCHAR Reserved1;
+ UCHAR TransferBlockByte0;
+ UCHAR TransferBlockByte1;
+ UCHAR Control;
+ } NEC_READ_CDDA, *PNEC_READ_CDDA;
+ struct _MODE_SENSE {
+ UCHAR OperationCode;
+ UCHAR Reserved1:3;
+ UCHAR Dbd:1;
+ UCHAR Reserved2:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR PageCode:6;
+ UCHAR Pc:2;
+ UCHAR Reserved3;
+ UCHAR AllocationLength;
+ UCHAR Control;
+ } MODE_SENSE, *PMODE_SENSE;
+ struct _MODE_SENSE10 {
+ UCHAR OperationCode;
+ UCHAR Reserved1:3;
+ UCHAR Dbd:1;
+ UCHAR Reserved2:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR PageCode:6;
+ UCHAR Pc:2;
+ UCHAR Reserved3[4];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } MODE_SENSE10, *PMODE_SENSE10;
+ struct _MODE_SELECT {
+ UCHAR OperationCode;
+ UCHAR SPBit:1;
+ UCHAR Reserved1:3;
+ UCHAR PFBit:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2[2];
+ UCHAR ParameterListLength;
+ UCHAR Control;
+ } MODE_SELECT, *PMODE_SELECT;
+ struct _MODE_SELECT10 {
+ UCHAR OperationCode;
+ UCHAR SPBit:1;
+ UCHAR Reserved1:3;
+ UCHAR PFBit:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2[5];
+ UCHAR ParameterListLength[2];
+ UCHAR Control;
+ } MODE_SELECT10, *PMODE_SELECT10;
+ struct _LOCATE {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR CPBit:1;
+ UCHAR BTBit:1;
+ UCHAR Reserved1:2;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved3;
+ UCHAR LogicalBlockAddress[4];
+ UCHAR Reserved4;
+ UCHAR Partition;
+ UCHAR Control;
+ } LOCATE, *PLOCATE;
+ struct _LOGSENSE {
+ UCHAR OperationCode;
+ UCHAR SPBit:1;
+ UCHAR PPCBit:1;
+ UCHAR Reserved1:3;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR PageCode:6;
+ UCHAR PCBit:2;
+ UCHAR Reserved2;
+ UCHAR Reserved3;
+ UCHAR ParameterPointer[2];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } LOGSENSE, *PLOGSENSE;
+ struct _LOGSELECT {
+ UCHAR OperationCode;
+ UCHAR SPBit:1;
+ UCHAR PCRBit:1;
+ UCHAR Reserved1:3;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved:6;
+ UCHAR PCBit:2;
+ UCHAR Reserved2[4];
+ UCHAR ParameterListLength[2];
+ UCHAR Control;
+ } LOGSELECT, *PLOGSELECT;
+ struct _PRINT {
+ UCHAR OperationCode;
+ UCHAR Reserved:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR TransferLength[3];
+ UCHAR Control;
+ } PRINT, *PPRINT;
+ struct _SEEK {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlockAddress[4];
+ UCHAR Reserved2[3];
+ UCHAR Control;
+ } SEEK, *PSEEK;
+ struct _ERASE {
+ UCHAR OperationCode;
+ UCHAR Long:1;
+ UCHAR Immediate:1;
+ UCHAR Reserved1:3;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2[3];
+ UCHAR Control;
+ } ERASE, *PERASE;
+ struct _START_STOP {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Reserved1:4;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2[2];
+ UCHAR Start:1;
+ UCHAR LoadEject:1;
+ UCHAR Reserved3:6;
+ UCHAR Control;
+ } START_STOP, *PSTART_STOP;
+ struct _MEDIA_REMOVAL {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR Reserved2[2];
+ UCHAR Prevent:1;
+ UCHAR Persistant:1;
+ UCHAR Reserved3:6;
+ UCHAR Control;
+ } MEDIA_REMOVAL, *PMEDIA_REMOVAL;
+ struct _SEEK_BLOCK {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Reserved1:7;
+ UCHAR BlockAddress[3];
+ UCHAR Link:1;
+ UCHAR Flag:1;
+ UCHAR Reserved2:4;
+ UCHAR VendorUnique:2;
+ } SEEK_BLOCK, *PSEEK_BLOCK;
+ struct _REQUEST_BLOCK_ADDRESS {
+ UCHAR OperationCode;
+ UCHAR Reserved1[3];
+ UCHAR AllocationLength;
+ UCHAR Link:1;
+ UCHAR Flag:1;
+ UCHAR Reserved2:4;
+ UCHAR VendorUnique:2;
+ } REQUEST_BLOCK_ADDRESS, *PREQUEST_BLOCK_ADDRESS;
+ struct _PARTITION {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Sel:1;
+ UCHAR PartitionSelect:6;
+ UCHAR Reserved1[3];
+ UCHAR Control;
+ } PARTITION, *PPARTITION;
+ struct _WRITE_TAPE_MARKS {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR WriteSetMarks:1;
+ UCHAR Reserved:3;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR TransferLength[3];
+ UCHAR Control;
+ } WRITE_TAPE_MARKS, *PWRITE_TAPE_MARKS;
+ struct _SPACE_TAPE_MARKS {
+ UCHAR OperationCode;
+ UCHAR Code:3;
+ UCHAR Reserved:2;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR NumMarksMSB;
+ UCHAR NumMarks;
+ UCHAR NumMarksLSB;
+ union {
+ UCHAR value;
+ struct {
+ UCHAR Link:1;
+ UCHAR Flag:1;
+ UCHAR Reserved:4;
+ UCHAR VendorUnique:2;
+ } Fields;
+ } Byte6;
+ } SPACE_TAPE_MARKS, *PSPACE_TAPE_MARKS;
+ struct _READ_POSITION {
+ UCHAR Operation;
+ UCHAR BlockType:1;
+ UCHAR Reserved1:4;
+ UCHAR Lun:3;
+ UCHAR Reserved2[7];
+ UCHAR Control;
+ } READ_POSITION, *PREAD_POSITION;
+ struct _CDB6READWRITETAPE {
+ UCHAR OperationCode;
+ UCHAR VendorSpecific:5;
+ UCHAR Reserved:3;
+ UCHAR TransferLenMSB;
+ UCHAR TransferLen;
+ UCHAR TransferLenLSB;
+ UCHAR Link:1;
+ UCHAR Flag:1;
+ UCHAR Reserved1:4;
+ UCHAR VendorUnique:2;
+ } CDB6READWRITETAPE, *PCDB6READWRITETAPE;
+ struct _INIT_ELEMENT_STATUS {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNubmer:3;
+ UCHAR Reserved2[3];
+ UCHAR Reserved3:7;
+ UCHAR NoBarCode:1;
+ } INIT_ELEMENT_STATUS, *PINIT_ELEMENT_STATUS;
+ struct _INITIALIZE_ELEMENT_RANGE {
+ UCHAR OperationCode;
+ UCHAR Range:1;
+ UCHAR Reserved1:4;
+ UCHAR LogicalUnitNubmer:3;
+ UCHAR FirstElementAddress[2];
+ UCHAR Reserved2[2];
+ UCHAR NumberOfElements[2];
+ UCHAR Reserved3;
+ UCHAR Reserved4:7;
+ UCHAR NoBarCode:1;
+ } INITIALIZE_ELEMENT_RANGE, *PINITIALIZE_ELEMENT_RANGE;
+ struct _POSITION_TO_ELEMENT {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR TransportElementAddress[2];
+ UCHAR DestinationElementAddress[2];
+ UCHAR Reserved2[2];
+ UCHAR Flip:1;
+ UCHAR Reserved3:7;
+ UCHAR Control;
+ } POSITION_TO_ELEMENT, *PPOSITION_TO_ELEMENT;
+ struct _MOVE_MEDIUM {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR TransportElementAddress[2];
+ UCHAR SourceElementAddress[2];
+ UCHAR DestinationElementAddress[2];
+ UCHAR Reserved2[2];
+ UCHAR Flip:1;
+ UCHAR Reserved3:7;
+ UCHAR Control;
+ } MOVE_MEDIUM, *PMOVE_MEDIUM;
+ struct _EXCHANGE_MEDIUM {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR TransportElementAddress[2];
+ UCHAR SourceElementAddress[2];
+ UCHAR Destination1ElementAddress[2];
+ UCHAR Destination2ElementAddress[2];
+ UCHAR Flip1:1;
+ UCHAR Flip2:1;
+ UCHAR Reserved3:6;
+ UCHAR Control;
+ } EXCHANGE_MEDIUM, *PEXCHANGE_MEDIUM;
+ struct _READ_ELEMENT_STATUS {
+ UCHAR OperationCode;
+ UCHAR ElementType:4;
+ UCHAR VolTag:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR StartingElementAddress[2];
+ UCHAR NumberOfElements[2];
+ UCHAR Reserved1;
+ UCHAR AllocationLength[3];
+ UCHAR Reserved2;
+ UCHAR Control;
+ } READ_ELEMENT_STATUS, *PREAD_ELEMENT_STATUS;
+ struct _SEND_VOLUME_TAG {
+ UCHAR OperationCode;
+ UCHAR ElementType:4;
+ UCHAR Reserved1:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR StartingElementAddress[2];
+ UCHAR Reserved2;
+ UCHAR ActionCode:5;
+ UCHAR Reserved3:3;
+ UCHAR Reserved4[2];
+ UCHAR ParameterListLength[2];
+ UCHAR Reserved5;
+ UCHAR Control;
+ } SEND_VOLUME_TAG, *PSEND_VOLUME_TAG;
+ struct _REQUEST_VOLUME_ELEMENT_ADDRESS {
+ UCHAR OperationCode;
+ UCHAR ElementType:4;
+ UCHAR VolTag:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR StartingElementAddress[2];
+ UCHAR NumberElements[2];
+ UCHAR Reserved1;
+ UCHAR AllocationLength[3];
+ UCHAR Reserved2;
+ UCHAR Control;
+ } REQUEST_VOLUME_ELEMENT_ADDRESS, *PREQUEST_VOLUME_ELEMENT_ADDRESS;
+ struct _LOAD_UNLOAD {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Reserved1:4;
+ UCHAR Lun:3;
+ UCHAR Reserved2[2];
+ UCHAR Start:1;
+ UCHAR LoadEject:1;
+ UCHAR Reserved3:6;
+ UCHAR Reserved4[3];
+ UCHAR Slot;
+ UCHAR Reserved5[3];
+ } LOAD_UNLOAD, *PLOAD_UNLOAD;
+ struct _MECH_STATUS {
+ UCHAR OperationCode;
+ UCHAR Reserved:5;
+ UCHAR Lun:3;
+ UCHAR Reserved1[6];
+ UCHAR AllocationLength[2];
+ UCHAR Reserved2[1];
+ UCHAR Control;
+ } MECH_STATUS, *PMECH_STATUS;
+ struct _SYNCHRONIZE_CACHE10 {
+ UCHAR OperationCode;
+ UCHAR RelAddr:1;
+ UCHAR Immediate:1;
+ UCHAR Reserved:3;
+ UCHAR Lun:3;
+ UCHAR LogicalBlockAddress[4];
+ UCHAR Reserved2;
+ UCHAR BlockCount[2];
+ UCHAR Control;
+ } SYNCHRONIZE_CACHE10, *PSYNCHRONIZE_CACHE10;
+ struct _GET_EVENT_STATUS_NOTIFICATION {
+ UCHAR OperationCode;
+ UCHAR Immediate:1;
+ UCHAR Reserved:4;
+ UCHAR Lun:3;
+ UCHAR Reserved2[2];
+ UCHAR NotificationClassRequest;
+ UCHAR Reserved3[2];
+ UCHAR EventListLength[2];
+ UCHAR Control;
+ } GET_EVENT_STATUS_NOTIFICATION, *PGET_EVENT_STATUS_NOTIFICATION;
+ struct _GET_PERFORMANCE {
+ UCHAR OperationCode;
+ UCHAR Except:2;
+ UCHAR Write:1;
+ UCHAR Tolerance:2;
+ UCHAR Reserved0:3;
+ UCHAR StartingLBA[4];
+ UCHAR Reserved1[2];
+ UCHAR MaximumNumberOfDescriptors[2];
+ UCHAR Type;
+ UCHAR Control;
+ } GET_PERFORMANCE;
+ struct _READ_DVD_STRUCTURE {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR RMDBlockNumber[4];
+ UCHAR LayerNumber;
+ UCHAR Format;
+ UCHAR AllocationLength[2];
+ UCHAR Reserved3:6;
+ UCHAR AGID:2;
+ UCHAR Control;
+ } READ_DVD_STRUCTURE, *PREAD_DVD_STRUCTURE;
+ struct _SET_STREAMING {
+ UCHAR OperationCode;
+ UCHAR Reserved[8];
+ UCHAR ParameterListLength[2];
+ UCHAR Control;
+ } SET_STREAMING;
+ struct _SEND_DVD_STRUCTURE {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR Reserved2[5];
+ UCHAR Format;
+ UCHAR ParameterListLength[2];
+ UCHAR Reserved3;
+ UCHAR Control;
+ } SEND_DVD_STRUCTURE, *PSEND_DVD_STRUCTURE;
+ struct _SEND_KEY {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR Reserved2[6];
+ UCHAR ParameterListLength[2];
+ UCHAR KeyFormat:6;
+ UCHAR AGID:2;
+ UCHAR Control;
+ } SEND_KEY, *PSEND_KEY;
+ struct _REPORT_KEY {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR LogicalBlockAddress[4];
+ UCHAR Reserved2[2];
+ UCHAR AllocationLength[2];
+ UCHAR KeyFormat:6;
+ UCHAR AGID:2;
+ UCHAR Control;
+ } REPORT_KEY, *PREPORT_KEY;
+ struct _SET_READ_AHEAD {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR TriggerLBA[4];
+ UCHAR ReadAheadLBA[4];
+ UCHAR Reserved2;
+ UCHAR Control;
+ } SET_READ_AHEAD, *PSET_READ_AHEAD;
+ struct _READ_FORMATTED_CAPACITIES {
+ UCHAR OperationCode;
+ UCHAR Reserved1:5;
+ UCHAR Lun:3;
+ UCHAR Reserved2[5];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } READ_FORMATTED_CAPACITIES, *PREAD_FORMATTED_CAPACITIES;
+ struct _REPORT_LUNS {
+ UCHAR OperationCode;
+ UCHAR Reserved1[5];
+ UCHAR AllocationLength[4];
+ UCHAR Reserved2[1];
+ UCHAR Control;
+ } REPORT_LUNS, *PREPORT_LUNS;
+ struct _PERSISTENT_RESERVE_IN {
+ UCHAR OperationCode;
+ UCHAR ServiceAction:5;
+ UCHAR Reserved1:3;
+ UCHAR Reserved2[5];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } PERSISTENT_RESERVE_IN, *PPERSISTENT_RESERVE_IN;
+ struct _PERSISTENT_RESERVE_OUT {
+ UCHAR OperationCode;
+ UCHAR ServiceAction:5;
+ UCHAR Reserved1:3;
+ UCHAR Type:4;
+ UCHAR Scope:4;
+ UCHAR Reserved2[4];
+ UCHAR ParameterListLength[2];
+ UCHAR Control;
+ } PERSISTENT_RESERVE_OUT, *PPERSISTENT_RESERVE_OUT;
+ struct _GET_CONFIGURATION {
+ UCHAR OperationCode;
+ UCHAR RequestType:1;
+ UCHAR Reserved1:7;
+ UCHAR StartingFeature[2];
+ UCHAR Reserved2[3];
+ UCHAR AllocationLength[2];
+ UCHAR Control;
+ } GET_CONFIGURATION, *PGET_CONFIGURATION;
+ struct _SET_CD_SPEED {
+ UCHAR OperationCode;
+ _ANONYMOUS_UNION union {
+ UCHAR Reserved1;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR RotationControl:2;
+ UCHAR Reserved3:6;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR ReadSpeed[2];
+ UCHAR WriteSpeed[2];
+ UCHAR Reserved2[5];
+ UCHAR Control;
+ } SET_CD_SPEED, *PSET_CD_SPEED;
+ struct _READ12 {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved1:2;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlock[4];
+ UCHAR TransferLength[4];
+ UCHAR Reserved2:7;
+ UCHAR Streaming:1;
+ UCHAR Control;
+ } READ12;
+ struct _WRITE12 {
+ UCHAR OperationCode;
+ UCHAR RelativeAddress:1;
+ UCHAR Reserved1:1;
+ UCHAR EBP:1;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR LogicalUnitNumber:3;
+ UCHAR LogicalBlock[4];
+ UCHAR TransferLength[4];
+ UCHAR Reserved2:7;
+ UCHAR Streaming:1;
+ UCHAR Control;
+ } WRITE12;
+ struct _READ16 {
+ UCHAR OperationCode;
+ UCHAR Reserved1:3;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR ReadProtect:3;
+ UCHAR LogicalBlock[8];
+ UCHAR TransferLength[4];
+ UCHAR Reserved2:7;
+ UCHAR Streaming:1;
+ UCHAR Control;
+ } READ16;
+ struct _WRITE16 {
+ UCHAR OperationCode;
+ UCHAR Reserved1:3;
+ UCHAR ForceUnitAccess:1;
+ UCHAR DisablePageOut:1;
+ UCHAR WriteProtect:3;
+ UCHAR LogicalBlock[8];
+ UCHAR TransferLength[4];
+ UCHAR Reserved2:7;
+ UCHAR Streaming:1;
+ UCHAR Control;
+ } WRITE16;
+ struct _VERIFY16 {
+ UCHAR OperationCode;
+ UCHAR Reserved1:1;
+ UCHAR ByteCheck:1;
+ UCHAR BlockVerify:1;
+ UCHAR Reserved2: 1;
+ UCHAR DisablePageOut:1;
+ UCHAR VerifyProtect:3;
+ UCHAR LogicalBlock[8];
+ UCHAR VerificationLength[4];
+ UCHAR Reserved3:7;
+ UCHAR Streaming:1;
+ UCHAR Control;
+ } VERIFY16;
+ struct _SYNCHRONIZE_CACHE16 {
+ UCHAR OperationCode;
+ UCHAR Reserved1:1;
+ UCHAR Immediate:1;
+ UCHAR Reserved2:6;
+ UCHAR LogicalBlock[8];
+ UCHAR BlockCount[4];
+ UCHAR Reserved3;
+ UCHAR Control;
+ } SYNCHRONIZE_CACHE16;
+ struct _READ_CAPACITY16 {
+ UCHAR OperationCode;
+ UCHAR ServiceAction:5;
+ UCHAR Reserved1:3;
+ UCHAR LogicalBlock[8];
+ UCHAR BlockCount[4];
+ UCHAR PMI:1;
+ UCHAR Reserved2:7;
+ UCHAR Control;
+ } READ_CAPACITY16;
+ ULONG AsUlong[4];
+ UCHAR AsByte[16];
+} CDB, *PCDB;
+
+typedef struct _NOTIFICATION_EVENT_STATUS_HEADER {
+ UCHAR EventDataLength[2];
+ UCHAR NotificationClass:3;
+ UCHAR Reserved:4;
+ UCHAR NEA:1;
+ UCHAR SupportedEventClasses;
+ UCHAR ClassEventData[0];
+} NOTIFICATION_EVENT_STATUS_HEADER, *PNOTIFICATION_EVENT_STATUS_HEADER;
+
+typedef struct _NOTIFICATION_OPERATIONAL_STATUS {
+ UCHAR OperationalEvent:4;
+ UCHAR Reserved1:4;
+ UCHAR OperationalStatus:4;
+ UCHAR Reserved2:3;
+ UCHAR PersistentPrevented:1;
+ UCHAR Operation[2];
+} NOTIFICATION_OPERATIONAL_STATUS, *PNOTIFICATION_OPERATIONAL_STATUS;
+
+typedef struct _NOTIFICATION_POWER_STATUS {
+ UCHAR PowerEvent:4;
+ UCHAR Reserved:4;
+ UCHAR PowerStatus;
+ UCHAR Reserved2[2];
+} NOTIFICATION_POWER_STATUS, *PNOTIFICATION_POWER_STATUS;
+
+typedef struct _NOTIFICATION_EXTERNAL_STATUS {
+ UCHAR ExternalEvent:4;
+ UCHAR Reserved1:4;
+ UCHAR ExternalStatus:4;
+ UCHAR Reserved2:3;
+ UCHAR PersistentPrevented:1;
+ UCHAR Request[2];
+} NOTIFICATION_EXTERNAL_STATUS, *PNOTIFICATION_EXTERNAL_STATUS;
+
+typedef struct _NOTIFICATION_MEDIA_STATUS {
+ UCHAR MediaEvent:4;
+ UCHAR Reserved:4;
+ _ANONYMOUS_UNION union {
+ UCHAR PowerStatus;
+ UCHAR MediaStatus;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR DoorTrayOpen:1;
+ UCHAR MediaPresent:1;
+ UCHAR ReservedX:6;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR StartSlot;
+ UCHAR EndSlot;
+} NOTIFICATION_MEDIA_STATUS, *PNOTIFICATION_MEDIA_STATUS;
+
+typedef struct _NOTIFICATION_MULTI_HOST_STATUS {
+ UCHAR MultiHostEvent:4;
+ UCHAR Reserved1:4;
+ UCHAR MultiHostStatus:4;
+ UCHAR Reserved2:3;
+ UCHAR PersistentPrevented:1;
+ UCHAR Priority[2];
+} NOTIFICATION_MULTI_HOST_STATUS, *PNOTIFICATION_MULTI_HOST_STATUS;
+
+typedef struct _NOTIFICATION_BUSY_STATUS {
+ UCHAR DeviceBusyEvent:4;
+ UCHAR Reserved:4;
+ UCHAR DeviceBusyStatus;
+ UCHAR Time[2];
+} NOTIFICATION_BUSY_STATUS, *PNOTIFICATION_BUSY_STATUS;
+
+typedef struct _READ_DVD_STRUCTURES_HEADER {
+ UCHAR Length[2];
+ UCHAR Reserved[2];
+ UCHAR Data[0];
+} READ_DVD_STRUCTURES_HEADER, *PREAD_DVD_STRUCTURES_HEADER;
+
+typedef struct _CDVD_KEY_HEADER {
+ UCHAR DataLength[2];
+ UCHAR Reserved[2];
+ UCHAR Data[0];
+} CDVD_KEY_HEADER, *PCDVD_KEY_HEADER;
+
+typedef struct _CDVD_REPORT_AGID_DATA {
+ UCHAR Reserved1[3];
+ UCHAR Reserved2:6;
+ UCHAR AGID:2;
+} CDVD_REPORT_AGID_DATA, *PCDVD_REPORT_AGID_DATA;
+
+typedef struct _CDVD_CHALLENGE_KEY_DATA {
+ UCHAR ChallengeKeyValue[10];
+ UCHAR Reserved[2];
+} CDVD_CHALLENGE_KEY_DATA, *PCDVD_CHALLENGE_KEY_DATA;
+
+typedef struct _CDVD_KEY_DATA {
+ UCHAR Key[5];
+ UCHAR Reserved[3];
+} CDVD_KEY_DATA, *PCDVD_KEY_DATA;
+
+typedef struct _CDVD_REPORT_ASF_DATA {
+ UCHAR Reserved1[3];
+ UCHAR Success:1;
+ UCHAR Reserved2:7;
+} CDVD_REPORT_ASF_DATA, *PCDVD_REPORT_ASF_DATA;
+
+typedef struct _CDVD_TITLE_KEY_HEADER {
+ UCHAR DataLength[2];
+ UCHAR Reserved1[1];
+ UCHAR Reserved2:3;
+ UCHAR CGMS:2;
+ UCHAR CP_SEC:1;
+ UCHAR CPM:1;
+ UCHAR Zero:1;
+ CDVD_KEY_DATA TitleKey;
+} CDVD_TITLE_KEY_HEADER, *PCDVD_TITLE_KEY_HEADER;
+
+typedef struct _FORMAT_DESCRIPTOR {
+ UCHAR NumberOfBlocks[4];
+ UCHAR FormatSubType:2;
+ UCHAR FormatType:6;
+ UCHAR BlockLength[3];
+} FORMAT_DESCRIPTOR, *PFORMAT_DESCRIPTOR;
+
+typedef struct _FORMAT_LIST_HEADER {
+ UCHAR Reserved;
+ UCHAR VendorSpecific:1;
+ UCHAR Immediate:1;
+ UCHAR TryOut:1;
+ UCHAR IP:1;
+ UCHAR STPF:1;
+ UCHAR DCRT:1;
+ UCHAR DPRY:1;
+ UCHAR FOV:1;
+ UCHAR FormatDescriptorLength[2];
+ FORMAT_DESCRIPTOR Descriptors[0];
+} FORMAT_LIST_HEADER, *PFORMAT_LIST_HEADER;
+
+typedef struct _FORMATTED_CAPACITY_DESCRIPTOR {
+ UCHAR NumberOfBlocks[4];
+ UCHAR Maximum:1;
+ UCHAR Valid:1;
+ UCHAR FormatType:6;
+ UCHAR BlockLength[3];
+} FORMATTED_CAPACITY_DESCRIPTOR, *PFORMATTED_CAPACITY_DESCRIPTOR;
+
+typedef struct _FORMATTED_CAPACITY_LIST {
+ UCHAR Reserved[3];
+ UCHAR CapacityListLength;
+ FORMATTED_CAPACITY_DESCRIPTOR Descriptors[0];
+} FORMATTED_CAPACITY_LIST, *PFORMATTED_CAPACITY_LIST;
+
+typedef struct _OPC_TABLE_ENTRY {
+ UCHAR Speed[2];
+ UCHAR OPCValue[6];
+} OPC_TABLE_ENTRY, *POPC_TABLE_ENTRY;
+
+typedef struct _DISC_INFORMATION {
+ UCHAR Length[2];
+ UCHAR DiscStatus:2;
+ UCHAR LastSessionStatus:2;
+ UCHAR Erasable:1;
+ UCHAR Reserved1:3;
+ UCHAR FirstTrackNumber;
+ UCHAR NumberOfSessionsLsb;
+ UCHAR LastSessionFirstTrackLsb;
+ UCHAR LastSessionLastTrackLsb;
+ UCHAR MrwStatus:2;
+ UCHAR MrwDirtyBit:1;
+ UCHAR Reserved2:2;
+ UCHAR URU:1;
+ UCHAR DBC_V:1;
+ UCHAR DID_V:1;
+ UCHAR DiscType;
+ UCHAR NumberOfSessionsMsb;
+ UCHAR LastSessionFirstTrackMsb;
+ UCHAR LastSessionLastTrackMsb;
+ UCHAR DiskIdentification[4];
+ UCHAR LastSessionLeadIn[4];
+ UCHAR LastPossibleLeadOutStartTime[4];
+ UCHAR DiskBarCode[8];
+ UCHAR Reserved4;
+ UCHAR NumberOPCEntries;
+ OPC_TABLE_ENTRY OPCTable[1];
+} DISC_INFORMATION, *PDISC_INFORMATION;
+
+typedef struct _DISK_INFORMATION {
+ UCHAR Length[2];
+ UCHAR DiskStatus:2;
+ UCHAR LastSessionStatus:2;
+ UCHAR Erasable:1;
+ UCHAR Reserved1:3;
+ UCHAR FirstTrackNumber;
+ UCHAR NumberOfSessions;
+ UCHAR LastSessionFirstTrack;
+ UCHAR LastSessionLastTrack;
+ UCHAR Reserved2:5;
+ UCHAR GEN:1;
+ UCHAR DBC_V:1;
+ UCHAR DID_V:1;
+ UCHAR DiskType;
+ UCHAR Reserved3[3];
+ UCHAR DiskIdentification[4];
+ UCHAR LastSessionLeadIn[4];
+ UCHAR LastPossibleStartTime[4];
+ UCHAR DiskBarCode[8];
+ UCHAR Reserved4;
+ UCHAR NumberOPCEntries;
+ OPC_TABLE_ENTRY OPCTable[0];
+} DISK_INFORMATION, *PDISK_INFORMATION;
+
+typedef struct _DATA_BLOCK_HEADER {
+ UCHAR DataMode;
+ UCHAR Reserved[4];
+ _ANONYMOUS_UNION union {
+ UCHAR LogicalBlockAddress[4];
+ struct {
+ UCHAR Reserved;
+ UCHAR M;
+ UCHAR S;
+ UCHAR F;
+ } MSF;
+ } DUMMYUNIONNAME;
+} DATA_BLOCK_HEADER, *PDATA_BLOCK_HEADER;
+
+typedef struct _TRACK_INFORMATION {
+ UCHAR Length[2];
+ UCHAR TrackNumber;
+ UCHAR SessionNumber;
+ UCHAR Reserved1;
+ UCHAR TrackMode:4;
+ UCHAR Copy:1;
+ UCHAR Damage:1;
+ UCHAR Reserved2:2;
+ UCHAR DataMode:4;
+ UCHAR FP:1;
+ UCHAR Packet:1;
+ UCHAR Blank:1;
+ UCHAR RT:1;
+ UCHAR NWA_V:1;
+ UCHAR Reserved3:7;
+ UCHAR TrackStartAddress[4];
+ UCHAR NextWritableAddress[4];
+ UCHAR FreeBlocks[4];
+ UCHAR FixedPacketSize[4];
+} TRACK_INFORMATION, *PTRACK_INFORMATION;
+
+typedef struct _TRACK_INFORMATION2 {
+ UCHAR Length[2];
+ UCHAR TrackNumberLsb;
+ UCHAR SessionNumberLsb;
+ UCHAR Reserved4;
+ UCHAR TrackMode:4;
+ UCHAR Copy:1;
+ UCHAR Damage:1;
+ UCHAR Reserved5:2;
+ UCHAR DataMode:4;
+ UCHAR FixedPacket:1;
+ UCHAR Packet:1;
+ UCHAR Blank:1;
+ UCHAR ReservedTrack:1;
+ UCHAR NWA_V:1;
+ UCHAR LRA_V:1;
+ UCHAR Reserved6:6;
+ UCHAR TrackStartAddress[4];
+ UCHAR NextWritableAddress[4];
+ UCHAR FreeBlocks[4];
+ UCHAR FixedPacketSize[4];
+ UCHAR TrackSize[4];
+ UCHAR LastRecordedAddress[4];
+ UCHAR TrackNumberMsb;
+ UCHAR SessionNumberMsb;
+ UCHAR Reserved7[2];
+} TRACK_INFORMATION2, *PTRACK_INFORMATION2;
+
+typedef struct _TRACK_INFORMATION3 {
+ UCHAR Length[2];
+ UCHAR TrackNumberLsb;
+ UCHAR SessionNumberLsb;
+ UCHAR Reserved4;
+ UCHAR TrackMode:4;
+ UCHAR Copy:1;
+ UCHAR Damage:1;
+ UCHAR Reserved5:2;
+ UCHAR DataMode:4;
+ UCHAR FixedPacket:1;
+ UCHAR Packet:1;
+ UCHAR Blank:1;
+ UCHAR ReservedTrack:1;
+ UCHAR NWA_V:1;
+ UCHAR LRA_V:1;
+ UCHAR Reserved6:6;
+ UCHAR TrackStartAddress[4];
+ UCHAR NextWritableAddress[4];
+ UCHAR FreeBlocks[4];
+ UCHAR FixedPacketSize[4];
+ UCHAR TrackSize[4];
+ UCHAR LastRecordedAddress[4];
+ UCHAR TrackNumberMsb;
+ UCHAR SessionNumberMsb;
+ UCHAR Reserved7[2];
+ UCHAR ReadCompatibilityLba[4];
+} TRACK_INFORMATION3, *PTRACK_INFORMATION3;
+
+typedef struct _PERFORMANCE_DESCRIPTOR {
+ UCHAR RandomAccess:1;
+ UCHAR Exact:1;
+ UCHAR RestoreDefaults:1;
+ UCHAR WriteRotationControl:2;
+ UCHAR Reserved1:3;
+ UCHAR Reserved[3];
+ UCHAR StartLba[4];
+ UCHAR EndLba[4];
+ UCHAR ReadSize[4];
+ UCHAR ReadTime[4];
+ UCHAR WriteSize[4];
+ UCHAR WriteTime[4];
+} PERFORMANCE_DESCRIPTOR, *PPERFORMANCE_DESCRIPTOR;
+
+typedef struct _SCSI_EXTENDED_MESSAGE {
+ UCHAR InitialMessageCode;
+ UCHAR MessageLength;
+ UCHAR MessageType;
+ union _EXTENDED_ARGUMENTS {
+ struct {
+ UCHAR Modifier[4];
+ } Modify;
+ struct {
+ UCHAR TransferPeriod;
+ UCHAR ReqAckOffset;
+ } Synchronous;
+ struct{
+ UCHAR Width;
+ } Wide;
+ } ExtendedArguments;
+}SCSI_EXTENDED_MESSAGE, *PSCSI_EXTENDED_MESSAGE;
+
+#ifndef _INQUIRYDATA_DEFINED /* also in minitape.h */
+#define _INQUIRYDATA_DEFINED
+
+#define INQUIRYDATABUFFERSIZE 36
+
+#if (NTDDI_VERSION < NTDDI_WINXP)
+typedef struct _INQUIRYDATA {
+ UCHAR DeviceType:5;
+ UCHAR DeviceTypeQualifier:3;
+ UCHAR DeviceTypeModifier:7;
+ UCHAR RemovableMedia:1;
+ UCHAR Versions;
+ UCHAR ResponseDataFormat:4;
+ UCHAR HiSupport:1;
+ UCHAR NormACA:1;
+ UCHAR ReservedBit:1;
+ UCHAR AERC:1;
+ UCHAR AdditionalLength;
+ UCHAR Reserved[2];
+ UCHAR SoftReset:1;
+ UCHAR CommandQueue:1;
+ UCHAR Reserved2:1;
+ UCHAR LinkedCommands:1;
+ UCHAR Synchronous:1;
+ UCHAR Wide16Bit:1;
+ UCHAR Wide32Bit:1;
+ UCHAR RelativeAddressing:1;
+ UCHAR VendorId[8];
+ UCHAR ProductId[16];
+ UCHAR ProductRevisionLevel[4];
+ UCHAR VendorSpecific[20];
+ UCHAR Reserved3[40];
+} INQUIRYDATA, *PINQUIRYDATA;
+#else
+typedef struct _INQUIRYDATA {
+ UCHAR DeviceType:5;
+ UCHAR DeviceTypeQualifier:3;
+ UCHAR DeviceTypeModifier:7;
+ UCHAR RemovableMedia:1;
+ _ANONYMOUS_UNION union {
+ UCHAR Versions;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR ANSIVersion:3;
+ UCHAR ECMAVersion:3;
+ UCHAR ISOVersion:2;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR ResponseDataFormat:4;
+ UCHAR HiSupport:1;
+ UCHAR NormACA:1;
+ UCHAR TerminateTask:1;
+ UCHAR AERC:1;
+ UCHAR AdditionalLength;
+ UCHAR Reserved;
+ UCHAR Addr16:1;
+ UCHAR Addr32:1;
+ UCHAR AckReqQ:1;
+ UCHAR MediumChanger:1;
+ UCHAR MultiPort:1;
+ UCHAR ReservedBit2:1;
+ UCHAR EnclosureServices:1;
+ UCHAR ReservedBit3:1;
+ UCHAR SoftReset:1;
+ UCHAR CommandQueue:1;
+ UCHAR TransferDisable:1;
+ UCHAR LinkedCommands:1;
+ UCHAR Synchronous:1;
+ UCHAR Wide16Bit:1;
+ UCHAR Wide32Bit:1;
+ UCHAR RelativeAddressing:1;
+ UCHAR VendorId[8];
+ UCHAR ProductId[16];
+ UCHAR ProductRevisionLevel[4];
+ UCHAR VendorSpecific[20];
+ UCHAR Reserved3[40];
+} INQUIRYDATA, *PINQUIRYDATA;
+#endif /* (NTDDI_VERSION < NTDDI_WINXP) */
+
+#endif /* _INQUIRYDATA_DEFINED */
+
+typedef struct _VPD_MEDIA_SERIAL_NUMBER_PAGE {
+ UCHAR DeviceType:5;
+ UCHAR DeviceTypeQualifier:3;
+ UCHAR PageCode;
+ UCHAR Reserved;
+ UCHAR PageLength;
+ UCHAR SerialNumber[0];
+} VPD_MEDIA_SERIAL_NUMBER_PAGE, *PVPD_MEDIA_SERIAL_NUMBER_PAGE;
+
+typedef struct _VPD_SERIAL_NUMBER_PAGE {
+ UCHAR DeviceType:5;
+ UCHAR DeviceTypeQualifier:3;
+ UCHAR PageCode;
+ UCHAR Reserved;
+ UCHAR PageLength;
+ UCHAR SerialNumber[0];
+} VPD_SERIAL_NUMBER_PAGE, *PVPD_SERIAL_NUMBER_PAGE;
+
+typedef enum _VPD_CODE_SET {
+ VpdCodeSetReserved = 0,
+ VpdCodeSetBinary = 1,
+ VpdCodeSetAscii = 2,
+ VpdCodeSetUTF8 = 3
+} VPD_CODE_SET, *PVPD_CODE_SET;
+
+typedef enum _VPD_ASSOCIATION {
+ VpdAssocDevice = 0,
+ VpdAssocPort = 1,
+ VpdAssocTarget = 2,
+ VpdAssocReserved1 = 3,
+ VpdAssocReserved2 = 4
+} VPD_ASSOCIATION, *PVPD_ASSOCIATION;
+
+typedef enum _VPD_IDENTIFIER_TYPE {
+ VpdIdentifierTypeVendorSpecific = 0,
+ VpdIdentifierTypeVendorId = 1,
+ VpdIdentifierTypeEUI64 = 2,
+ VpdIdentifierTypeFCPHName = 3,
+ VpdIdentifierTypePortRelative = 4,
+ VpdIdentifierTypeTargetPortGroup = 5,
+ VpdIdentifierTypeLogicalUnitGroup = 6,
+ VpdIdentifierTypeMD5LogicalUnitId = 7,
+ VpdIdentifierTypeSCSINameString = 8
+} VPD_IDENTIFIER_TYPE, *PVPD_IDENTIFIER_TYPE;
+
+typedef struct _VPD_IDENTIFICATION_DESCRIPTOR {
+ UCHAR CodeSet:4;
+ UCHAR Reserved:4;
+ UCHAR IdentifierType:4;
+ UCHAR Association:2;
+ UCHAR Reserved2:2;
+ UCHAR Reserved3;
+ UCHAR IdentifierLength;
+ UCHAR Identifier[0];
+} VPD_IDENTIFICATION_DESCRIPTOR, *PVPD_IDENTIFICATION_DESCRIPTOR;
+
+typedef struct _VPD_IDENTIFICATION_PAGE {
+ UCHAR DeviceType:5;
+ UCHAR DeviceTypeQualifier:3;
+ UCHAR PageCode;
+ UCHAR Reserved;
+ UCHAR PageLength;
+ UCHAR Descriptors[0];
+} VPD_IDENTIFICATION_PAGE, *PVPD_IDENTIFICATION_PAGE;
+
+typedef struct _VPD_SUPPORTED_PAGES_PAGE {
+ UCHAR DeviceType:5;
+ UCHAR DeviceTypeQualifier:3;
+ UCHAR PageCode;
+ UCHAR Reserved;
+ UCHAR PageLength;
+ UCHAR SupportedPageList[0];
+} VPD_SUPPORTED_PAGES_PAGE, *PVPD_SUPPORTED_PAGES_PAGE;
+
+typedef struct _PRI_REGISTRATION_LIST {
+ UCHAR Generation[4];
+ UCHAR AdditionalLength[4];
+ UCHAR ReservationKeyList[0][8];
+} PRI_REGISTRATION_LIST, *PPRI_REGISTRATION_LIST;
+
+typedef struct _PRI_RESERVATION_DESCRIPTOR {
+ UCHAR ReservationKey[8];
+ UCHAR ScopeSpecificAddress[4];
+ UCHAR Reserved;
+ UCHAR Type:4;
+ UCHAR Scope:4;
+ UCHAR Obsolete[2];
+} PRI_RESERVATION_DESCRIPTOR, *PPRI_RESERVATION_DESCRIPTOR;
+
+typedef struct _PRI_RESERVATION_LIST {
+ UCHAR Generation[4];
+ UCHAR AdditionalLength[4];
+ PRI_RESERVATION_DESCRIPTOR Reservations[0];
+} PRI_RESERVATION_LIST, *PPRI_RESERVATION_LIST;
+
+typedef struct _PRO_PARAMETER_LIST {
+ UCHAR ReservationKey[8];
+ UCHAR ServiceActionReservationKey[8];
+ UCHAR ScopeSpecificAddress[4];
+ UCHAR ActivatePersistThroughPowerLoss:1;
+ UCHAR Reserved1:7;
+ UCHAR Reserved2;
+ UCHAR Obsolete[2];
+} PRO_PARAMETER_LIST, *PPRO_PARAMETER_LIST;
+
+typedef struct _SENSE_DATA {
+ UCHAR ErrorCode:7;
+ UCHAR Valid:1;
+ UCHAR SegmentNumber;
+ UCHAR SenseKey:4;
+ UCHAR Reserved:1;
+ UCHAR IncorrectLength:1;
+ UCHAR EndOfMedia:1;
+ UCHAR FileMark:1;
+ UCHAR Information[4];
+ UCHAR AdditionalSenseLength;
+ UCHAR CommandSpecificInformation[4];
+ UCHAR AdditionalSenseCode;
+ UCHAR AdditionalSenseCodeQualifier;
+ UCHAR FieldReplaceableUnitCode;
+ UCHAR SenseKeySpecific[3];
+} SENSE_DATA, *PSENSE_DATA;
+
+/* Read Capacity Data. Returned in Big Endian format */
+typedef struct _READ_CAPACITY_DATA {
+ ULONG LogicalBlockAddress;
+ ULONG BytesPerBlock;
+} READ_CAPACITY_DATA, *PREAD_CAPACITY_DATA;
+
+typedef struct _READ_CAPACITY_DATA_EX {
+ LARGE_INTEGER LogicalBlockAddress;
+ ULONG BytesPerBlock;
+} READ_CAPACITY_DATA_EX, *PREAD_CAPACITY_DATA_EX;
+
+/* Read Block Limits Data. Returned in Big Endian format */
+typedef struct _READ_BLOCK_LIMITS {
+ UCHAR Reserved;
+ UCHAR BlockMaximumSize[3];
+ UCHAR BlockMinimumSize[2];
+} READ_BLOCK_LIMITS_DATA, *PREAD_BLOCK_LIMITS_DATA;
+
+typedef struct _READ_BUFFER_CAPACITY_DATA {
+ UCHAR DataLength[2];
+ UCHAR Reserved1;
+ UCHAR BlockDataReturned:1;
+ UCHAR Reserved4:7;
+ UCHAR TotalBufferSize[4];
+ UCHAR AvailableBufferSize[4];
+} READ_BUFFER_CAPACITY_DATA, *PREAD_BUFFER_CAPACITY_DATA;
+
+typedef struct _MODE_PARAMETER_HEADER {
+ UCHAR ModeDataLength;
+ UCHAR MediumType;
+ UCHAR DeviceSpecificParameter;
+ UCHAR BlockDescriptorLength;
+} MODE_PARAMETER_HEADER, *PMODE_PARAMETER_HEADER;
+
+typedef struct _MODE_PARAMETER_HEADER10 {
+ UCHAR ModeDataLength[2];
+ UCHAR MediumType;
+ UCHAR DeviceSpecificParameter;
+ UCHAR Reserved[2];
+ UCHAR BlockDescriptorLength[2];
+} MODE_PARAMETER_HEADER10, *PMODE_PARAMETER_HEADER10;
+
+typedef struct _MODE_PARAMETER_BLOCK {
+ UCHAR DensityCode;
+ UCHAR NumberOfBlocks[3];
+ UCHAR Reserved;
+ UCHAR BlockLength[3];
+} MODE_PARAMETER_BLOCK, *PMODE_PARAMETER_BLOCK;
+
+typedef struct _MODE_DISCONNECT_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR BufferFullRatio;
+ UCHAR BufferEmptyRatio;
+ UCHAR BusInactivityLimit[2];
+ UCHAR BusDisconnectTime[2];
+ UCHAR BusConnectTime[2];
+ UCHAR MaximumBurstSize[2];
+ UCHAR DataTransferDisconnect:2;
+ UCHAR Reserved2[3];
+} MODE_DISCONNECT_PAGE, *PMODE_DISCONNECT_PAGE;
+
+typedef struct _MODE_CACHING_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR ReadDisableCache:1;
+ UCHAR MultiplicationFactor:1;
+ UCHAR WriteCacheEnable:1;
+ UCHAR Reserved2:5;
+ UCHAR WriteRetensionPriority:4;
+ UCHAR ReadRetensionPriority:4;
+ UCHAR DisablePrefetchTransfer[2];
+ UCHAR MinimumPrefetch[2];
+ UCHAR MaximumPrefetch[2];
+ UCHAR MaximumPrefetchCeiling[2];
+} MODE_CACHING_PAGE, *PMODE_CACHING_PAGE;
+
+typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE2 {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR WriteType:4;
+ UCHAR TestWrite:1;
+ UCHAR LinkSizeValid:1;
+ UCHAR BufferUnderrunFreeEnabled:1;
+ UCHAR Reserved2:1;
+ UCHAR TrackMode:4;
+ UCHAR Copy:1;
+ UCHAR FixedPacket:1;
+ UCHAR MultiSession:2;
+ UCHAR DataBlockType:4;
+ UCHAR Reserved3:4;
+ UCHAR LinkSize;
+ UCHAR Reserved4;
+ UCHAR HostApplicationCode:6;
+ UCHAR Reserved5:2;
+ UCHAR SessionFormat;
+ UCHAR Reserved6;
+ UCHAR PacketSize[4];
+ UCHAR AudioPauseLength[2];
+ UCHAR MediaCatalogNumber[16];
+ UCHAR ISRC[16];
+ UCHAR SubHeaderData[4];
+} MODE_CDROM_WRITE_PARAMETERS_PAGE2, *PMODE_CDROM_WRITE_PARAMETERS_PAGE2;
+
+typedef struct _MODE_MRW_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR Reserved1;
+ UCHAR LbaSpace:1;
+ UCHAR Reserved2:7;
+ UCHAR Reserved3[4];
+} MODE_MRW_PAGE, *PMODE_MRW_PAGE;
+
+typedef struct _MODE_FLEXIBLE_DISK_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR TransferRate[2];
+ UCHAR NumberOfHeads;
+ UCHAR SectorsPerTrack;
+ UCHAR BytesPerSector[2];
+ UCHAR NumberOfCylinders[2];
+ UCHAR StartWritePrecom[2];
+ UCHAR StartReducedCurrent[2];
+ UCHAR StepRate[2];
+ UCHAR StepPluseWidth;
+ UCHAR HeadSettleDelay[2];
+ UCHAR MotorOnDelay;
+ UCHAR MotorOffDelay;
+ UCHAR Reserved2:5;
+ UCHAR MotorOnAsserted:1;
+ UCHAR StartSectorNumber:1;
+ UCHAR TrueReadySignal:1;
+ UCHAR StepPlusePerCyclynder:4;
+ UCHAR Reserved3:4;
+ UCHAR WriteCompenstation;
+ UCHAR HeadLoadDelay;
+ UCHAR HeadUnloadDelay;
+ UCHAR Pin2Usage:4;
+ UCHAR Pin34Usage:4;
+ UCHAR Pin1Usage:4;
+ UCHAR Pin4Usage:4;
+ UCHAR MediumRotationRate[2];
+ UCHAR Reserved4[2];
+} MODE_FLEXIBLE_DISK_PAGE, *PMODE_FLEXIBLE_DISK_PAGE;
+
+typedef struct _MODE_FORMAT_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR TracksPerZone[2];
+ UCHAR AlternateSectorsPerZone[2];
+ UCHAR AlternateTracksPerZone[2];
+ UCHAR AlternateTracksPerLogicalUnit[2];
+ UCHAR SectorsPerTrack[2];
+ UCHAR BytesPerPhysicalSector[2];
+ UCHAR Interleave[2];
+ UCHAR TrackSkewFactor[2];
+ UCHAR CylinderSkewFactor[2];
+ UCHAR Reserved2:4;
+ UCHAR SurfaceFirst:1;
+ UCHAR RemovableMedia:1;
+ UCHAR HardSectorFormating:1;
+ UCHAR SoftSectorFormating:1;
+ UCHAR Reserved3[3];
+} MODE_FORMAT_PAGE, *PMODE_FORMAT_PAGE;
+
+typedef struct _MODE_RIGID_GEOMETRY_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PageSavable:1;
+ UCHAR PageLength;
+ UCHAR NumberOfCylinders[3];
+ UCHAR NumberOfHeads;
+ UCHAR StartWritePrecom[3];
+ UCHAR StartReducedCurrent[3];
+ UCHAR DriveStepRate[2];
+ UCHAR LandZoneCyclinder[3];
+ UCHAR RotationalPositionLock:2;
+ UCHAR Reserved2:6;
+ UCHAR RotationOffset;
+ UCHAR Reserved3;
+ UCHAR RoataionRate[2];
+ UCHAR Reserved4[2];
+} MODE_RIGID_GEOMETRY_PAGE, *PMODE_RIGID_GEOMETRY_PAGE;
+
+typedef struct _MODE_READ_WRITE_RECOVERY_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved1:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR DCRBit:1;
+ UCHAR DTEBit:1;
+ UCHAR PERBit:1;
+ UCHAR EERBit:1;
+ UCHAR RCBit:1;
+ UCHAR TBBit:1;
+ UCHAR ARRE:1;
+ UCHAR AWRE:1;
+ UCHAR ReadRetryCount;
+ UCHAR Reserved4[4];
+ UCHAR WriteRetryCount;
+ UCHAR Reserved5[3];
+} MODE_READ_WRITE_RECOVERY_PAGE, *PMODE_READ_WRITE_RECOVERY_PAGE;
+
+typedef struct _MODE_READ_RECOVERY_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved1:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR DCRBit:1;
+ UCHAR DTEBit:1;
+ UCHAR PERBit:1;
+ UCHAR Reserved2:1;
+ UCHAR RCBit:1;
+ UCHAR TBBit:1;
+ UCHAR Reserved3:2;
+ UCHAR ReadRetryCount;
+ UCHAR Reserved4[4];
+} MODE_READ_RECOVERY_PAGE, *PMODE_READ_RECOVERY_PAGE;
+
+typedef struct _MODE_INFO_EXCEPTIONS {
+ UCHAR PageCode:6;
+ UCHAR Reserved1:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ _ANONYMOUS_UNION union {
+ UCHAR Flags;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR LogErr:1;
+ UCHAR Reserved2:1;
+ UCHAR Test:1;
+ UCHAR Dexcpt:1;
+ UCHAR Reserved3:3;
+ UCHAR Perf:1;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR ReportMethod:4;
+ UCHAR Reserved4:4;
+ UCHAR IntervalTimer[4];
+ UCHAR ReportCount[4];
+} MODE_INFO_EXCEPTIONS, *PMODE_INFO_EXCEPTIONS;
+
+typedef struct _POWER_CONDITION_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR Reserved2;
+ UCHAR Standby:1;
+ UCHAR Idle:1;
+ UCHAR Reserved3:6;
+ UCHAR IdleTimer[4];
+ UCHAR StandbyTimer[4];
+} POWER_CONDITION_PAGE, *PPOWER_CONDITION_PAGE;
+
+typedef struct _CDDA_OUTPUT_PORT {
+ UCHAR ChannelSelection:4;
+ UCHAR Reserved:4;
+ UCHAR Volume;
+} CDDA_OUTPUT_PORT, *PCDDA_OUTPUT_PORT;
+
+typedef struct _CDAUDIO_CONTROL_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR Reserved2:1;
+ UCHAR StopOnTrackCrossing:1;
+ UCHAR Immediate:1;
+ UCHAR Reserved3:5;
+ UCHAR Reserved4[3];
+ UCHAR Obsolete[2];
+ CDDA_OUTPUT_PORT CDDAOutputPorts[4];
+} CDAUDIO_CONTROL_PAGE, *PCDAUDIO_CONTROL_PAGE;
+
+typedef struct _CDVD_FEATURE_SET_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR CDAudio[2];
+ UCHAR EmbeddedChanger[2];
+ UCHAR PacketSMART[2];
+ UCHAR PersistantPrevent[2];
+ UCHAR EventStatusNotification[2];
+ UCHAR DigitalOutput[2];
+ UCHAR CDSequentialRecordable[2];
+ UCHAR DVDSequentialRecordable[2];
+ UCHAR RandomRecordable[2];
+ UCHAR KeyExchange[2];
+ UCHAR Reserved2[2];
+} CDVD_FEATURE_SET_PAGE, *PCDVD_FEATURE_SET_PAGE;
+
+typedef struct _CDVD_INACTIVITY_TIMEOUT_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR Reserved2[2];
+ UCHAR SWPP:1;
+ UCHAR DISP:1;
+ UCHAR Reserved3:6;
+ UCHAR Reserved4;
+ UCHAR GroupOneMinimumTimeout[2];
+ UCHAR GroupTwoMinimumTimeout[2];
+} CDVD_INACTIVITY_TIMEOUT_PAGE, *PCDVD_INACTIVITY_TIMEOUT_PAGE;
+
+typedef struct _CDVD_CAPABILITIES_PAGE {
+ UCHAR PageCode:6;
+ UCHAR Reserved:1;
+ UCHAR PSBit:1;
+ UCHAR PageLength;
+ UCHAR CDRRead:1;
+ UCHAR CDERead:1;
+ UCHAR Method2:1;
+ UCHAR DVDROMRead:1;
+ UCHAR DVDRRead:1;
+ UCHAR DVDRAMRead:1;
+ UCHAR Reserved2:2;
+ UCHAR CDRWrite:1;
+ UCHAR CDEWrite:1;
+ UCHAR TestWrite:1;
+ UCHAR Reserved3:1;
+ UCHAR DVDRWrite:1;
+ UCHAR DVDRAMWrite:1;
+ UCHAR Reserved4:2;
+ UCHAR AudioPlay:1;
+ UCHAR Composite:1;
+ UCHAR DigitalPortOne:1;
+ UCHAR DigitalPortTwo:1;
+ UCHAR Mode2Form1:1;
+ UCHAR Mode2Form2:1;
+ UCHAR MultiSession:1;
+ UCHAR BufferUnderrunFree:1;
+ UCHAR CDDA:1;
+ UCHAR CDDAAccurate:1;
+ UCHAR RWSupported:1;
+ UCHAR RWDeinterleaved:1;
+ UCHAR C2Pointers:1;
+ UCHAR ISRC:1;
+ UCHAR UPC:1;
+ UCHAR ReadBarCodeCapable:1;
+ UCHAR Lock:1;
+ UCHAR LockState:1;
+ UCHAR PreventJumper:1;
+ UCHAR Eject:1;
+ UCHAR Reserved6:1;
+ UCHAR LoadingMechanismType:3;
+ UCHAR SeparateVolume:1;
+ UCHAR SeperateChannelMute:1;
+ UCHAR SupportsDiskPresent:1;
+ UCHAR SWSlotSelection:1;
+ UCHAR SideChangeCapable:1;
+ UCHAR RWInLeadInReadable:1;
+ UCHAR Reserved7:2;
+ _ANONYMOUS_UNION union {
+ UCHAR ReadSpeedMaximum[2];
+ UCHAR ObsoleteReserved[2];
+ } DUMMYUNIONNAME;
+ UCHAR NumberVolumeLevels[2];
+ UCHAR BufferSize[2];
+ _ANONYMOUS_UNION union {
+ UCHAR ReadSpeedCurrent[2];
+ UCHAR ObsoleteReserved2[2];
+ } DUMMYUNIONNAME2;
+ UCHAR ObsoleteReserved3;
+ UCHAR Reserved8:1;
+ UCHAR BCK:1;
+ UCHAR RCK:1;
+ UCHAR LSBF:1;
+ UCHAR Length:2;
+ UCHAR Reserved9:2;
+ _ANONYMOUS_UNION union {
+ UCHAR WriteSpeedMaximum[2];
+ UCHAR ObsoleteReserved4[2];
+ } DUMMYUNIONNAME3;
+ _ANONYMOUS_UNION union {
+ UCHAR WriteSpeedCurrent[2];
+ UCHAR ObsoleteReserved11[2];
+ } DUMMYUNIONNAME4;
+ _ANONYMOUS_UNION union {
+ UCHAR CopyManagementRevision[2];
+ UCHAR Reserved10[2];
+ } DUMMYUNIONNAME5;
+} CDVD_CAPABILITIES_PAGE, *PCDVD_CAPABILITIES_PAGE;
+
+typedef struct _LUN_LIST {
+ UCHAR LunListLength[4];
+ UCHAR Reserved[4];
+ UCHAR Lun[0][8];
+} LUN_LIST, *PLUN_LIST;
+
+typedef struct _MODE_PARM_READ_WRITE {
+ MODE_PARAMETER_HEADER ParameterListHeader;
+ MODE_PARAMETER_BLOCK ParameterListBlock;
+} MODE_PARM_READ_WRITE_DATA, *PMODE_PARM_READ_WRITE_DATA;
+
typedef struct _PORT_OUTPUT {
- UCHAR ChannelSelection;
- UCHAR Volume;
+ UCHAR ChannelSelection;
+ UCHAR Volume;
} PORT_OUTPUT, *PPORT_OUTPUT;
typedef struct _AUDIO_OUTPUT {
- UCHAR CodePage;
- UCHAR ParameterLength;
- UCHAR Immediate;
- UCHAR Reserved[2];
- UCHAR LbaFormat;
- UCHAR LogicalBlocksPerSecond[2];
- PORT_OUTPUT PortOutput[4];
+ UCHAR CodePage;
+ UCHAR ParameterLength;
+ UCHAR Immediate;
+ UCHAR Reserved[2];
+ UCHAR LbaFormat;
+ UCHAR LogicalBlocksPerSecond[2];
+ PORT_OUTPUT PortOutput[4];
} AUDIO_OUTPUT, *PAUDIO_OUTPUT;
-/* Multisession CDROMs */
-#define GET_LAST_SESSION 0x01
-#define GET_SESSION_DATA 0x02;
-
/* Atapi 2.5 changers */
typedef struct _MECHANICAL_STATUS_INFORMATION_HEADER {
- UCHAR CurrentSlot : 5;
- UCHAR ChangerState : 2;
- UCHAR Fault : 1;
- UCHAR Reserved : 5;
- UCHAR MechanismState : 3;
- UCHAR CurrentLogicalBlockAddress[3];
- UCHAR NumberAvailableSlots;
- UCHAR SlotTableLength[2];
+ UCHAR CurrentSlot:5;
+ UCHAR ChangerState:2;
+ UCHAR Fault:1;
+ UCHAR Reserved:5;
+ UCHAR MechanismState:3;
+ UCHAR CurrentLogicalBlockAddress[3];
+ UCHAR NumberAvailableSlots;
+ UCHAR SlotTableLength[2];
} MECHANICAL_STATUS_INFORMATION_HEADER, *PMECHANICAL_STATUS_INFORMATION_HEADER;
typedef struct _SLOT_TABLE_INFORMATION {
- UCHAR DiscChanged : 1;
- UCHAR Reserved : 6;
- UCHAR DiscPresent : 1;
- UCHAR Reserved2[3];
+ UCHAR DiscChanged:1;
+ UCHAR Reserved:6;
+ UCHAR DiscPresent:1;
+ UCHAR Reserved2[3];
} SLOT_TABLE_INFORMATION, *PSLOT_TABLE_INFORMATION;
typedef struct _MECHANICAL_STATUS {
- MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
- SLOT_TABLE_INFORMATION SlotTableInfo[1];
+ MECHANICAL_STATUS_INFORMATION_HEADER MechanicalStatusHeader;
+ SLOT_TABLE_INFORMATION SlotTableInfo[1];
} MECHANICAL_STATUS, *PMECHANICAL_STATUS;
-
/* Tape definitions */
typedef struct _TAPE_POSITION_DATA {
- UCHAR Reserved1 : 2;
- UCHAR BlockPositionUnsupported : 1;
- UCHAR Reserved2 : 3;
- UCHAR EndOfPartition : 1;
- UCHAR BeginningOfPartition : 1;
- UCHAR PartitionNumber;
- USHORT Reserved3;
- UCHAR FirstBlock[4];
- UCHAR LastBlock[4];
- UCHAR Reserved4;
- UCHAR NumberOfBlocks[3];
- UCHAR NumberOfBytes[4];
+ UCHAR Reserved1:2;
+ UCHAR BlockPositionUnsupported:1;
+ UCHAR Reserved2:3;
+ UCHAR EndOfPartition:1;
+ UCHAR BeginningOfPartition:1;
+ UCHAR PartitionNumber;
+ USHORT Reserved3;
+ UCHAR FirstBlock[4];
+ UCHAR LastBlock[4];
+ UCHAR Reserved4;
+ UCHAR NumberOfBlocks[3];
+ UCHAR NumberOfBytes[4];
} TAPE_POSITION_DATA, *PTAPE_POSITION_DATA;
/* This structure is used to convert little endian ULONGs
to SCSI CDB big endians values. */
typedef union _EIGHT_BYTE {
_ANONYMOUS_STRUCT struct {
- UCHAR Byte0;
- UCHAR Byte1;
- UCHAR Byte2;
- UCHAR Byte3;
- UCHAR Byte4;
- UCHAR Byte5;
- UCHAR Byte6;
- UCHAR Byte7;
+ UCHAR Byte0;
+ UCHAR Byte1;
+ UCHAR Byte2;
+ UCHAR Byte3;
+ UCHAR Byte4;
+ UCHAR Byte5;
+ UCHAR Byte6;
+ UCHAR Byte7;
} DUMMYSTRUCTNAME;
- ULONGLONG AsULongLong;
+ ULONGLONG AsULongLong;
} EIGHT_BYTE, *PEIGHT_BYTE;
typedef union _FOUR_BYTE {
_ANONYMOUS_STRUCT struct {
- UCHAR Byte0;
- UCHAR Byte1;
- UCHAR Byte2;
- UCHAR Byte3;
+ UCHAR Byte0;
+ UCHAR Byte1;
+ UCHAR Byte2;
+ UCHAR Byte3;
} DUMMYSTRUCTNAME;
- ULONG AsULong;
+ ULONG AsULong;
} FOUR_BYTE, *PFOUR_BYTE;
typedef union _TWO_BYTE {
_ANONYMOUS_STRUCT struct {
- UCHAR Byte0;
- UCHAR Byte1;
+ UCHAR Byte0;
+ UCHAR Byte1;
} DUMMYSTRUCTNAME;
- USHORT AsUShort;
+ USHORT AsUShort;
} TWO_BYTE, *PTWO_BYTE;
/* Byte reversing macro for converting between
big- and little-endian formats */
#define REVERSE_BYTES_QUAD(Destination, Source) { \
- PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
- PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
- _val1->Byte7 = _val2->Byte0; \
- _val1->Byte6 = _val2->Byte1; \
- _val1->Byte5 = _val2->Byte2; \
- _val1->Byte4 = _val2->Byte3; \
- _val1->Byte3 = _val2->Byte4; \
- _val1->Byte2 = _val2->Byte5; \
- _val1->Byte1 = _val2->Byte6; \
- _val1->Byte0 = _val2->Byte7; \
+ PEIGHT_BYTE _val1 = (PEIGHT_BYTE)(Destination); \
+ PEIGHT_BYTE _val2 = (PEIGHT_BYTE)(Source); \
+ _val1->Byte7 = _val2->Byte0; \
+ _val1->Byte6 = _val2->Byte1; \
+ _val1->Byte5 = _val2->Byte2; \
+ _val1->Byte4 = _val2->Byte3; \
+ _val1->Byte3 = _val2->Byte4; \
+ _val1->Byte2 = _val2->Byte5; \
+ _val1->Byte1 = _val2->Byte6; \
+ _val1->Byte0 = _val2->Byte7; \
}
#define REVERSE_BYTES(Destination, Source) { \
- PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
- PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
- _val1->Byte3 = _val2->Byte0; \
- _val1->Byte2 = _val2->Byte1; \
- _val1->Byte1 = _val2->Byte2; \
- _val1->Byte0 = _val2->Byte3; \
+ PFOUR_BYTE _val1 = (PFOUR_BYTE)(Destination); \
+ PFOUR_BYTE _val2 = (PFOUR_BYTE)(Source); \
+ _val1->Byte3 = _val2->Byte0; \
+ _val1->Byte2 = _val2->Byte1; \
+ _val1->Byte1 = _val2->Byte2; \
+ _val1->Byte0 = _val2->Byte3; \
}
#define REVERSE_BYTES_SHORT(Destination, Source) { \
@@ -1696,6 +2750,45 @@ typedef union _TWO_BYTE {
(Bit) = _val; \
}
+/* FIXME : This structure doesn't exist in the official header */
+typedef struct _MODE_CDROM_WRITE_PARAMETERS_PAGE {
+ UCHAR PageLength;
+ UCHAR WriteType:4;
+ UCHAR TestWrite:1;
+ UCHAR LinkSizeValid:1;
+ UCHAR BufferUnderrunFreeEnabled:1;
+ UCHAR Reserved2:1;
+ UCHAR TrackMode:4;
+ UCHAR Copy:1;
+ UCHAR FixedPacket:1;
+ UCHAR MultiSession:2;
+ UCHAR DataBlockType:4;
+ UCHAR Reserved3:4;
+ UCHAR LinkSize;
+ UCHAR Reserved4;
+ UCHAR HostApplicationCode:6;
+ UCHAR Reserved5:2;
+ UCHAR SessionFormat;
+ UCHAR Reserved6;
+ UCHAR PacketSize[4];
+ UCHAR AudioPauseLength[2];
+ UCHAR Reserved7:7;
+ UCHAR MediaCatalogNumberValid:1;
+ UCHAR MediaCatalogNumber[13];
+ UCHAR MediaCatalogNumberZero;
+ UCHAR MediaCatalogNumberAFrame;
+ UCHAR Reserved8:7;
+ UCHAR ISRCValid:1;
+ UCHAR ISRCCountry[2];
+ UCHAR ISRCOwner[3];
+ UCHAR ISRCRecordingYear[2];
+ UCHAR ISRCSerialNumber[5];
+ UCHAR ISRCZero;
+ UCHAR ISRCAFrame;
+ UCHAR ISRCReserved;
+ UCHAR SubHeaderData[4];
+} MODE_CDROM_WRITE_PARAMETERS_PAGE, *PMODE_CDROM_WRITE_PARAMETERS_PAGE;
+
#ifdef __cplusplus
}
#endif
diff --git a/include/ddk/srb.h b/include/ddk/srb.h
index 0763652749a..cca653d86ae 100644
--- a/include/ddk/srb.h
+++ b/include/ddk/srb.h
@@ -20,47 +20,13 @@
*
*/
-#ifndef __SRB_H
-#define __SRB_H
+#ifndef _NTSRB_
+#define _NTSRB_
#ifdef __cplusplus
extern "C" {
#endif
-#if defined(_SCSIPORT_)
- #define SCSIPORTAPI
-#else
- #define SCSIPORTAPI DECLSPEC_IMPORT
-#endif
-
-#if DBG
-#define DebugPrint(x) ScsiDebugPrint x
-#else
-#define DebugPrint(x)
-#endif
-
-typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
-
-#define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
-#define SP_UNTAGGED ((UCHAR) ~0)
-
-#define SRB_SIMPLE_TAG_REQUEST 0x20
-#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
-#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
-
-#define SRB_STATUS_QUEUE_FROZEN 0x40
-#define SRB_STATUS_AUTOSENSE_VALID 0x80
-
-#define SRB_STATUS(Status) \
- (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
-
-#define MAXIMUM_CDB_SIZE 12
-
-#if DBG
-#define SCSI_PORT_SIGNATURE 0x54524f50
-#endif
-
-
#define SCSI_MAXIMUM_LOGICAL_UNITS 8
#define SCSI_MAXIMUM_TARGETS_PER_BUS 128
#define SCSI_MAXIMUM_LUNS_PER_TARGET 255
@@ -69,21 +35,36 @@ typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
#define SCSI_MAXIMUM_PHYSICAL_BREAKS 255
#define SCSI_MAXIMUM_TARGETS 8
-#define SRB_FUNCTION_WMI 0x17
+/* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
+#define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
+#define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
+#if (NTDDI_VERSION > NTDDI_WS03SP1)
+#define SCSI_DMA64_MINIPORT_FULL64BIT_SUPPORTED 0x02
+#endif
-#define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001
+#define SP_UNINITIALIZED_VALUE ((ULONG) ~0)
+#define SP_UNTAGGED ((UCHAR) ~0)
-#define SP_BUS_PARITY_ERROR 0x0001
-#define SP_UNEXPECTED_DISCONNECT 0x0002
-#define SP_INVALID_RESELECTION 0x0003
-#define SP_BUS_TIME_OUT 0x0004
-#define SP_PROTOCOL_ERROR 0x0005
-#define SP_INTERNAL_ADAPTER_ERROR 0x0006
-#define SP_REQUEST_TIMEOUT 0x0007
-#define SP_IRQ_NOT_RESPONDING 0x0008
-#define SP_BAD_FW_WARNING 0x0009
-#define SP_BAD_FW_ERROR 0x000a
-#define SP_LOST_WMI_MINIPORT_REQUEST 0x000b
+/* Asynchronous events */
+#define SRBEV_BUS_RESET 0x0001
+#define SRBEV_SCSI_ASYNC_NOTIFICATION 0x0002
+
+#define MAXIMUM_CDB_SIZE 12
+
+#if DBG
+#define DebugPrint(x) ScsiDebugPrint x
+#else
+#define DebugPrint(x)
+#endif
+
+#define SCSI_COMBINE_BUS_TARGET(Bus, Target)( \
+ ((((UCHAR) (Target)) & ~(0x20 - 1)) << 8) | \
+ (((UCHAR) (Bus)) << 5) | \
+ (((UCHAR) (Target)) & (0x20 - 1)))
+
+#define SCSI_DECODE_BUS_TARGET(Value, Bus, Target)( \
+ Bus = (UCHAR) ((Value) >> 5), \
+ Target = (UCHAR) ((((Value) >> 8) & ~(0x20 - 1)) | ((Value) & (0x20 - 1))))
/* SCSI_REQUEST_BLOCK.Function constants */
#define SRB_FUNCTION_EXECUTE_SCSI 0x00
@@ -106,6 +87,12 @@ typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
#define SRB_FUNCTION_LOCK_QUEUE 0x18
#define SRB_FUNCTION_UNLOCK_QUEUE 0x19
#define SRB_FUNCTION_RESET_LOGICAL_UNIT 0x20
+#define SRB_FUNCTION_SET_LINK_TIMEOUT 0x21
+#define SRB_FUNCTION_LINK_TIMEOUT_OCCURRED 0x22
+#define SRB_FUNCTION_LINK_TIMEOUT_COMPLETE 0x23
+#define SRB_FUNCTION_POWER 0x24
+#define SRB_FUNCTION_PNP 0x25
+#define SRB_FUNCTION_DUMP_POINTERS 0x26
/* SCSI_REQUEST_BLOCK.SrbStatus constants */
#define SRB_STATUS_PENDING 0x00
@@ -135,8 +122,15 @@ typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
#define SRB_STATUS_BAD_FUNCTION 0x22
#define SRB_STATUS_ERROR_RECOVERY 0x23
#define SRB_STATUS_NOT_POWERED 0x24
+#define SRB_STATUS_LINK_DOWN 0x25
#define SRB_STATUS_INTERNAL_ERROR 0x30
+#define SRB_STATUS_QUEUE_FROZEN 0x40
+#define SRB_STATUS_AUTOSENSE_VALID 0x80
+
+#define SRB_STATUS(Status) \
+ (Status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
+
/* SCSI_REQUEST_BLOCK.SrbFlags constants */
#define SRB_FLAGS_QUEUE_ACTION_ENABLE 0x00000002
#define SRB_FLAGS_DISABLE_DISCONNECT 0x00000004
@@ -161,581 +155,553 @@ typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
#define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000
#define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000
-/* Asynchronous events */
-#define SRBEV_BUS_RESET 0x0001
-#define SRBEV_SCSI_ASYNC_NOTIFICATION 0x0002
-
-
-typedef struct _SCSI_REQUEST_BLOCK {
- USHORT Length;
- UCHAR Function;
- UCHAR SrbStatus;
- UCHAR ScsiStatus;
- UCHAR PathId;
- UCHAR TargetId;
- UCHAR Lun;
- UCHAR QueueTag;
- UCHAR QueueAction;
- UCHAR CdbLength;
- UCHAR SenseInfoBufferLength;
- ULONG SrbFlags;
- ULONG DataTransferLength;
- ULONG TimeOutValue;
- PVOID DataBuffer;
- PVOID SenseInfoBuffer;
- struct _SCSI_REQUEST_BLOCK *NextSrb;
- PVOID OriginalRequest;
- PVOID SrbExtension;
- _ANONYMOUS_UNION union {
- ULONG InternalStatus;
- ULONG QueueSortKey;
- } DUMMYUNIONNAME;
-#if defined(_WIN64)
- ULONG Reserved;
+#if DBG
+#define SCSI_PORT_SIGNATURE 0x54524f50
#endif
- UCHAR Cdb[16];
-} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
-#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
+#define SRB_SIMPLE_TAG_REQUEST 0x20
+#define SRB_HEAD_OF_QUEUE_TAG_REQUEST 0x21
+#define SRB_ORDERED_QUEUE_TAG_REQUEST 0x22
+
+#define SRB_WMI_FLAGS_ADAPTER_REQUEST 0x0001
+#define SRB_POWER_FLAGS_ADAPTER_REQUEST 0x0001
+#define SRB_PNP_FLAGS_ADAPTER_REQUEST 0x0001
+
+#define SP_BUS_PARITY_ERROR 0x0001
+#define SP_UNEXPECTED_DISCONNECT 0x0002
+#define SP_INVALID_RESELECTION 0x0003
+#define SP_BUS_TIME_OUT 0x0004
+#define SP_PROTOCOL_ERROR 0x0005
+#define SP_INTERNAL_ADAPTER_ERROR 0x0006
+#define SP_REQUEST_TIMEOUT 0x0007
+#define SP_IRQ_NOT_RESPONDING 0x0008
+#define SP_BAD_FW_WARNING 0x0009
+#define SP_BAD_FW_ERROR 0x000a
+#define SP_LOST_WMI_MINIPORT_REQUEST 0x000b
+
+#define SP_VER_TRACE_SUPPORT 0x0010
+
+#define SP_RETURN_NOT_FOUND 0
+#define SP_RETURN_FOUND 1
+#define SP_RETURN_ERROR 2
+#define SP_RETURN_BAD_CONFIG 3
+
+typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
typedef struct _ACCESS_RANGE {
- SCSI_PHYSICAL_ADDRESS RangeStart;
- ULONG RangeLength;
- BOOLEAN RangeInMemory;
+ SCSI_PHYSICAL_ADDRESS RangeStart;
+ ULONG RangeLength;
+ BOOLEAN RangeInMemory;
} ACCESS_RANGE, *PACCESS_RANGE;
-/* PORT_CONFIGURATION_INFORMATION.Dma64BitAddresses constants */
-#define SCSI_DMA64_MINIPORT_SUPPORTED 0x01
-#define SCSI_DMA64_SYSTEM_SUPPORTED 0x80
-
typedef struct _PORT_CONFIGURATION_INFORMATION {
- ULONG Length;
- ULONG SystemIoBusNumber;
- INTERFACE_TYPE AdapterInterfaceType;
- ULONG BusInterruptLevel;
- ULONG BusInterruptVector;
- KINTERRUPT_MODE InterruptMode;
- ULONG MaximumTransferLength;
- ULONG NumberOfPhysicalBreaks;
- ULONG DmaChannel;
- ULONG DmaPort;
- DMA_WIDTH DmaWidth;
- DMA_SPEED DmaSpeed;
- ULONG AlignmentMask;
- ULONG NumberOfAccessRanges;
- ACCESS_RANGE (*AccessRanges)[];
- PVOID Reserved;
- UCHAR NumberOfBuses;
- UCHAR InitiatorBusId[8];
- BOOLEAN ScatterGather;
- BOOLEAN Master;
- BOOLEAN CachesData;
- BOOLEAN AdapterScansDown;
- BOOLEAN AtdiskPrimaryClaimed;
- BOOLEAN AtdiskSecondaryClaimed;
- BOOLEAN Dma32BitAddresses;
- BOOLEAN DemandMode;
- BOOLEAN MapBuffers;
- BOOLEAN NeedPhysicalAddresses;
- BOOLEAN TaggedQueuing;
- BOOLEAN AutoRequestSense;
- BOOLEAN MultipleRequestPerLu;
- BOOLEAN ReceiveEvent;
- BOOLEAN RealModeInitialized;
- BOOLEAN BufferAccessScsiPortControlled;
- UCHAR MaximumNumberOfTargets;
- UCHAR ReservedUchars[2];
- ULONG SlotNumber;
- ULONG BusInterruptLevel2;
- ULONG BusInterruptVector2;
- KINTERRUPT_MODE InterruptMode2;
- ULONG DmaChannel2;
- ULONG DmaPort2;
- DMA_WIDTH DmaWidth2;
- DMA_SPEED DmaSpeed2;
- ULONG DeviceExtensionSize;
- ULONG SpecificLuExtensionSize;
- ULONG SrbExtensionSize;
- UCHAR Dma64BitAddresses;
- BOOLEAN ResetTargetSupported;
- UCHAR MaximumNumberOfLogicalUnits;
- BOOLEAN WmiDataProvider;
+ ULONG Length;
+ ULONG SystemIoBusNumber;
+ INTERFACE_TYPE AdapterInterfaceType;
+ ULONG BusInterruptLevel;
+ ULONG BusInterruptVector;
+ KINTERRUPT_MODE InterruptMode;
+ ULONG MaximumTransferLength;
+ ULONG NumberOfPhysicalBreaks;
+ ULONG DmaChannel;
+ ULONG DmaPort;
+ DMA_WIDTH DmaWidth;
+ DMA_SPEED DmaSpeed;
+ ULONG AlignmentMask;
+ ULONG NumberOfAccessRanges;
+ ACCESS_RANGE (*AccessRanges)[];
+ PVOID Reserved;
+ UCHAR NumberOfBuses;
+ UCHAR InitiatorBusId[8];
+ BOOLEAN ScatterGather;
+ BOOLEAN Master;
+ BOOLEAN CachesData;
+ BOOLEAN AdapterScansDown;
+ BOOLEAN AtdiskPrimaryClaimed;
+ BOOLEAN AtdiskSecondaryClaimed;
+ BOOLEAN Dma32BitAddresses;
+ BOOLEAN DemandMode;
+ BOOLEAN MapBuffers;
+ BOOLEAN NeedPhysicalAddresses;
+ BOOLEAN TaggedQueuing;
+ BOOLEAN AutoRequestSense;
+ BOOLEAN MultipleRequestPerLu;
+ BOOLEAN ReceiveEvent;
+ BOOLEAN RealModeInitialized;
+ BOOLEAN BufferAccessScsiPortControlled;
+ UCHAR MaximumNumberOfTargets;
+ UCHAR ReservedUchars[2];
+ ULONG SlotNumber;
+ ULONG BusInterruptLevel2;
+ ULONG BusInterruptVector2;
+ KINTERRUPT_MODE InterruptMode2;
+ ULONG DmaChannel2;
+ ULONG DmaPort2;
+ DMA_WIDTH DmaWidth2;
+ DMA_SPEED DmaSpeed2;
+ ULONG DeviceExtensionSize;
+ ULONG SpecificLuExtensionSize;
+ ULONG SrbExtensionSize;
+ UCHAR Dma64BitAddresses;
+ BOOLEAN ResetTargetSupported;
+ UCHAR MaximumNumberOfLogicalUnits;
+ BOOLEAN WmiDataProvider;
} PORT_CONFIGURATION_INFORMATION, *PPORT_CONFIGURATION_INFORMATION;
-#define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
-
-typedef enum _SCSI_NOTIFICATION_TYPE {
- RequestComplete,
- NextRequest,
- NextLuRequest,
- ResetDetected,
- CallDisableInterrupts,
- CallEnableInterrupts,
- RequestTimerCall,
- BusChangeDetected,
- WMIEvent,
- WMIReregister
-} SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
+#define CONFIG_INFO_VERSION_2 sizeof(PORT_CONFIGURATION_INFORMATION)
#ifdef __GNUC__
__extension__ /* enums limited to range of integer */
#endif
typedef enum _SCSI_ADAPTER_CONTROL_TYPE {
- ScsiQuerySupportedControlTypes = 0,
- ScsiStopAdapter,
- ScsiRestartAdapter,
- ScsiSetBootConfig,
- ScsiSetRunningConfig,
- ScsiAdapterControlMax,
- MakeAdapterControlTypeSizeOfUlong = 0xffffffff
+ ScsiQuerySupportedControlTypes = 0,
+ ScsiStopAdapter,
+ ScsiRestartAdapter,
+ ScsiSetBootConfig,
+ ScsiSetRunningConfig,
+ ScsiAdapterControlMax,
+ MakeAdapterControlTypeSizeOfUlong = 0xffffffff
} SCSI_ADAPTER_CONTROL_TYPE, *PSCSI_ADAPTER_CONTROL_TYPE;
typedef enum _SCSI_ADAPTER_CONTROL_STATUS {
- ScsiAdapterControlSuccess = 0,
- ScsiAdapterControlUnsuccessful
+ ScsiAdapterControlSuccess = 0,
+ ScsiAdapterControlUnsuccessful
} SCSI_ADAPTER_CONTROL_STATUS, *PSCSI_ADAPTER_CONTROL_STATUS;
typedef struct _SCSI_SUPPORTED_CONTROL_TYPE_LIST {
- ULONG MaxControlType;
- BOOLEAN SupportedTypeList[0];
+ ULONG MaxControlType;
+ BOOLEAN SupportedTypeList[0];
} SCSI_SUPPORTED_CONTROL_TYPE_LIST, *PSCSI_SUPPORTED_CONTROL_TYPE_LIST;
-typedef SCSI_ADAPTER_CONTROL_STATUS
-(NTAPI *PHW_ADAPTER_CONTROL)(
- IN PVOID DeviceExtension,
- IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
- IN PVOID Parameters);
+typedef struct _SCSI_REQUEST_BLOCK {
+ USHORT Length;
+ UCHAR Function;
+ UCHAR SrbStatus;
+ UCHAR ScsiStatus;
+ UCHAR PathId;
+ UCHAR TargetId;
+ UCHAR Lun;
+ UCHAR QueueTag;
+ UCHAR QueueAction;
+ UCHAR CdbLength;
+ UCHAR SenseInfoBufferLength;
+ ULONG SrbFlags;
+ ULONG DataTransferLength;
+ ULONG TimeOutValue;
+ PVOID DataBuffer;
+ PVOID SenseInfoBuffer;
+ struct _SCSI_REQUEST_BLOCK *NextSrb;
+ PVOID OriginalRequest;
+ PVOID SrbExtension;
+ _ANONYMOUS_UNION union {
+ ULONG InternalStatus;
+ ULONG QueueSortKey;
+ ULONG LinkTimeoutValue;
+ } DUMMYUNIONNAME;
+#if defined(_WIN64)
+ ULONG Reserved;
+#endif
+ UCHAR Cdb[16];
+} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
-typedef BOOLEAN
-(NTAPI *PHW_ADAPTER_STATE)(
- IN PVOID DeviceExtension,
- IN PVOID Context,
- IN BOOLEAN SaveState);
+#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
-#define SP_RETURN_NOT_FOUND 0
-#define SP_RETURN_FOUND 1
-#define SP_RETURN_ERROR 2
-#define SP_RETURN_BAD_CONFIG 3
+typedef struct _SCSI_WMI_REQUEST_BLOCK {
+ USHORT Length;
+ UCHAR Function;
+ UCHAR SrbStatus;
+ UCHAR WMISubFunction;
+ UCHAR PathId;
+ UCHAR TargetId;
+ UCHAR Lun;
+ UCHAR Reserved1;
+ UCHAR WMIFlags;
+ UCHAR Reserved2[2];
+ ULONG SrbFlags;
+ ULONG DataTransferLength;
+ ULONG TimeOutValue;
+ PVOID DataBuffer;
+ PVOID DataPath;
+ PVOID Reserved3;
+ PVOID OriginalRequest;
+ PVOID SrbExtension;
+ ULONG Reserved4;
+#if (NTDDI_VERSION >= NTDDI_WS03SP1) && defined(_WIN64)
+ ULONG Reserved6;
+#endif
+ UCHAR Reserved5[16];
+} SCSI_WMI_REQUEST_BLOCK, *PSCSI_WMI_REQUEST_BLOCK;
-typedef ULONG
-(NTAPI *PHW_FIND_ADAPTER)(
- IN PVOID DeviceExtension,
- IN PVOID HwContext,
- IN PVOID BusInformation,
- IN PCHAR ArgumentString,
- IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
- OUT PBOOLEAN Again);
+typedef enum _STOR_DEVICE_POWER_STATE {
+ StorPowerDeviceUnspecified = 0,
+ StorPowerDeviceD0,
+ StorPowerDeviceD1,
+ StorPowerDeviceD2,
+ StorPowerDeviceD3,
+ StorPowerDeviceMaximum
+} STOR_DEVICE_POWER_STATE, *PSTOR_DEVICE_POWER_STATE;
+
+typedef enum _STOR_POWER_ACTION {
+ StorPowerActionNone = 0,
+ StorPowerActionReserved,
+ StorPowerActionSleep,
+ StorPowerActionHibernate,
+ StorPowerActionShutdown,
+ StorPowerActionShutdownReset,
+ StorPowerActionShutdownOff,
+ StorPowerActionWarmEject
+} STOR_POWER_ACTION, *PSTOR_POWER_ACTION;
+
+typedef struct _SCSI_POWER_REQUEST_BLOCK {
+ USHORT Length;
+ UCHAR Function;
+ UCHAR SrbStatus;
+ UCHAR SrbPowerFlags;
+ UCHAR PathId;
+ UCHAR TargetId;
+ UCHAR Lun;
+ STOR_DEVICE_POWER_STATE DevicePowerState;
+ ULONG SrbFlags;
+ ULONG DataTransferLength;
+ ULONG TimeOutValue;
+ PVOID DataBuffer;
+ PVOID SenseInfoBuffer;
+ struct _SCSI_REQUEST_BLOCK *NextSrb;
+ PVOID OriginalRequest;
+ PVOID SrbExtension;
+ STOR_POWER_ACTION PowerAction;
+#if defined(_WIN64)
+ ULONG Reserved;
+#endif
+ UCHAR Reserved5[16];
+} SCSI_POWER_REQUEST_BLOCK, *PSCSI_POWER_REQUEST_BLOCK;
+
+typedef enum _STOR_PNP_ACTION {
+ StorStartDevice = 0x0,
+ StorRemoveDevice = 0x2,
+ StorStopDevice = 0x4,
+ StorQueryCapabilities = 0x9,
+ StorQueryResourceRequirements = 0xB,
+ StorFilterResourceRequirements = 0xD,
+ StorSurpriseRemoval = 0x17
+} STOR_PNP_ACTION, *PSTOR_PNP_ACTION;
+
+typedef struct _STOR_DEVICE_CAPABILITIES {
+ USHORT Version;
+ ULONG DeviceD1:1;
+ ULONG DeviceD2:1;
+ ULONG LockSupported:1;
+ ULONG EjectSupported:1;
+ ULONG Removable:1;
+ ULONG DockDevice:1;
+ ULONG UniqueID:1;
+ ULONG SilentInstall:1;
+ ULONG SurpriseRemovalOK:1;
+ ULONG NoDisplayInUI:1;
+} STOR_DEVICE_CAPABILITIES, *PSTOR_DEVICE_CAPABILITIES;
+
+typedef struct _SCSI_PNP_REQUEST_BLOCK {
+ USHORT Length;
+ UCHAR Function;
+ UCHAR SrbStatus;
+ UCHAR PnPSubFunction;
+ UCHAR PathId;
+ UCHAR TargetId;
+ UCHAR Lun;
+ STOR_PNP_ACTION PnPAction;
+ ULONG SrbFlags;
+ ULONG DataTransferLength;
+ ULONG TimeOutValue;
+ PVOID DataBuffer;
+ PVOID SenseInfoBuffer;
+ struct _SCSI_REQUEST_BLOCK *NextSrb;
+ PVOID OriginalRequest;
+ PVOID SrbExtension;
+ ULONG SrbPnPFlags;
+#if defined(_WIN64)
+ ULONG Reserved;
+#endif
+ UCHAR Reserved4[16];
+} SCSI_PNP_REQUEST_BLOCK, *PSCSI_PNP_REQUEST_BLOCK;
typedef BOOLEAN
(NTAPI *PHW_INITIALIZE)(
IN PVOID DeviceExtension);
-typedef BOOLEAN
-(NTAPI *PHW_INTERRUPT)(
- IN PVOID DeviceExtension);
-
-typedef BOOLEAN
-(NTAPI *PHW_RESET_BUS)(
- IN PVOID DeviceExtension,
- IN ULONG PathId);
-
-typedef VOID
-(NTAPI *PHW_DMA_STARTED)(
- IN PVOID DeviceExtension);
-
typedef BOOLEAN
(NTAPI *PHW_STARTIO)(
IN PVOID DeviceExtension,
IN PSCSI_REQUEST_BLOCK Srb);
+typedef BOOLEAN
+(NTAPI *PHW_INTERRUPT)(
+ IN PVOID DeviceExtension);
+
typedef VOID
(NTAPI *PHW_TIMER)(
IN PVOID DeviceExtension);
+typedef VOID
+(NTAPI *PHW_DMA_STARTED)(
+ IN PVOID DeviceExtension);
+
+typedef ULONG
+(NTAPI *PHW_FIND_ADAPTER)(
+ IN PVOID DeviceExtension,
+ IN PVOID HwContext,
+ IN PVOID BusInformation,
+ IN PCHAR ArgumentString,
+ IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ OUT PBOOLEAN Again);
+
+typedef BOOLEAN
+(NTAPI *PHW_RESET_BUS)(
+ IN PVOID DeviceExtension,
+ IN ULONG PathId);
+
+typedef BOOLEAN
+(NTAPI *PHW_ADAPTER_STATE)(
+ IN PVOID DeviceExtension,
+ IN PVOID Context,
+ IN BOOLEAN SaveState);
+
+typedef SCSI_ADAPTER_CONTROL_STATUS
+(NTAPI *PHW_ADAPTER_CONTROL)(
+ IN PVOID DeviceExtension,
+ IN SCSI_ADAPTER_CONTROL_TYPE ControlType,
+ IN PVOID Parameters);
+
+typedef enum _SCSI_NOTIFICATION_TYPE {
+ RequestComplete,
+ NextRequest,
+ NextLuRequest,
+ ResetDetected,
+ CallDisableInterrupts,
+ CallEnableInterrupts,
+ RequestTimerCall,
+ BusChangeDetected,
+ WMIEvent,
+ WMIReregister,
+ LinkUp,
+ LinkDown,
+ QueryTickCount,
+ BufferOverrunDetected,
+ TraceNotification
+} SCSI_NOTIFICATION_TYPE, *PSCSI_NOTIFICATION_TYPE;
+
typedef struct _HW_INITIALIZATION_DATA {
- ULONG HwInitializationDataSize;
+ ULONG HwInitializationDataSize;
INTERFACE_TYPE AdapterInterfaceType;
- PHW_INITIALIZE HwInitialize;
- PHW_STARTIO HwStartIo;
- PHW_INTERRUPT HwInterrupt;
- PHW_FIND_ADAPTER HwFindAdapter;
- PHW_RESET_BUS HwResetBus;
- PHW_DMA_STARTED HwDmaStarted;
- PHW_ADAPTER_STATE HwAdapterState;
- ULONG DeviceExtensionSize;
- ULONG SpecificLuExtensionSize;
- ULONG SrbExtensionSize;
- ULONG NumberOfAccessRanges;
- PVOID Reserved;
- BOOLEAN MapBuffers;
- BOOLEAN NeedPhysicalAddresses;
- BOOLEAN TaggedQueuing;
- BOOLEAN AutoRequestSense;
- BOOLEAN MultipleRequestPerLu;
- BOOLEAN ReceiveEvent;
- USHORT VendorIdLength;
- PVOID VendorId;
- USHORT ReservedUshort;
- USHORT DeviceIdLength;
- PVOID DeviceId;
- PHW_ADAPTER_CONTROL HwAdapterControl;
+ PHW_INITIALIZE HwInitialize;
+ PHW_STARTIO HwStartIo;
+ PHW_INTERRUPT HwInterrupt;
+ PHW_FIND_ADAPTER HwFindAdapter;
+ PHW_RESET_BUS HwResetBus;
+ PHW_DMA_STARTED HwDmaStarted;
+ PHW_ADAPTER_STATE HwAdapterState;
+ ULONG DeviceExtensionSize;
+ ULONG SpecificLuExtensionSize;
+ ULONG SrbExtensionSize;
+ ULONG NumberOfAccessRanges;
+ PVOID Reserved;
+ BOOLEAN MapBuffers;
+ BOOLEAN NeedPhysicalAddresses;
+ BOOLEAN TaggedQueuing;
+ BOOLEAN AutoRequestSense;
+ BOOLEAN MultipleRequestPerLu;
+ BOOLEAN ReceiveEvent;
+ USHORT VendorIdLength;
+ PVOID VendorId;
+ _ANONYMOUS_UNION union {
+ USHORT ReservedUshort;
+ USHORT PortVersionFlags;
+ } DUMMYUNIONNAME;
+ USHORT DeviceIdLength;
+ PVOID DeviceId;
+ PHW_ADAPTER_CONTROL HwAdapterControl;
} HW_INITIALIZATION_DATA, *PHW_INITIALIZATION_DATA;
+#if defined(_NTDDK_)
+#define SCSIPORTAPI
+#else
+#define SCSIPORTAPI DECLSPEC_IMPORT
+#endif
+
SCSIPORTAPI
VOID
NTAPI
ScsiPortCompleteRequest(
- IN PVOID HwDeviceExtension,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun,
- IN UCHAR SrbStatus);
+ IN PVOID HwDeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN UCHAR SrbStatus);
+
+SCSIPORTAPI
+ULONG
+NTAPI
+ScsiPortConvertPhysicalAddressToUlong(
+ IN SCSI_PHYSICAL_ADDRESS Address);
-/*
- * ULONG
- * ScsiPortConvertPhysicalAddressToUlong(
- * IN SCSI_PHYSICAL_ADDRESS Address);
- */
#define ScsiPortConvertPhysicalAddressToUlong(Address) ((Address).LowPart)
+#define ScsiPortConvertPhysicalAddressToULongPtr(Address) ((ULONG_PTR)((Address).QuadPart))
SCSIPORTAPI
SCSI_PHYSICAL_ADDRESS
NTAPI
ScsiPortConvertUlongToPhysicalAddress(
- IN ULONG UlongAddress);
+ IN ULONG UlongAddress);
SCSIPORTAPI
VOID
NTAPI
ScsiPortFlushDma(
- IN PVOID DeviceExtension);
+ IN PVOID DeviceExtension);
SCSIPORTAPI
VOID
NTAPI
ScsiPortFreeDeviceBase(
- IN PVOID HwDeviceExtension,
- IN PVOID MappedAddress);
+ IN PVOID HwDeviceExtension,
+ IN PVOID MappedAddress);
SCSIPORTAPI
ULONG
NTAPI
ScsiPortGetBusData(
- IN PVOID DeviceExtension,
- IN ULONG BusDataType,
- IN ULONG SystemIoBusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Length);
+ IN PVOID DeviceExtension,
+ IN ULONG BusDataType,
+ IN ULONG SystemIoBusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Length);
SCSIPORTAPI
PVOID
NTAPI
ScsiPortGetDeviceBase(
- IN PVOID HwDeviceExtension,
- IN INTERFACE_TYPE BusType,
- IN ULONG SystemIoBusNumber,
- IN SCSI_PHYSICAL_ADDRESS IoAddress,
- IN ULONG NumberOfBytes,
- IN BOOLEAN InIoSpace);
+ IN PVOID HwDeviceExtension,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG SystemIoBusNumber,
+ IN SCSI_PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfBytes,
+ IN BOOLEAN InIoSpace);
SCSIPORTAPI
PVOID
NTAPI
ScsiPortGetLogicalUnit(
- IN PVOID HwDeviceExtension,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun);
+ IN PVOID HwDeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun);
SCSIPORTAPI
SCSI_PHYSICAL_ADDRESS
NTAPI
ScsiPortGetPhysicalAddress(
- IN PVOID HwDeviceExtension,
- IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
- IN PVOID VirtualAddress,
- OUT ULONG *Length);
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+ IN PVOID VirtualAddress,
+ OUT ULONG *Length);
SCSIPORTAPI
PSCSI_REQUEST_BLOCK
NTAPI
ScsiPortGetSrb(
- IN PVOID DeviceExtension,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun,
- IN LONG QueueTag);
+ IN PVOID DeviceExtension,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN LONG QueueTag);
SCSIPORTAPI
PVOID
NTAPI
ScsiPortGetUncachedExtension(
- IN PVOID HwDeviceExtension,
- IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
- IN ULONG NumberOfBytes);
+ IN PVOID HwDeviceExtension,
+ IN PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ IN ULONG NumberOfBytes);
SCSIPORTAPI
PVOID
NTAPI
ScsiPortGetVirtualAddress(
- IN PVOID HwDeviceExtension,
- IN SCSI_PHYSICAL_ADDRESS PhysicalAddress);
+ IN PVOID HwDeviceExtension,
+ IN SCSI_PHYSICAL_ADDRESS PhysicalAddress);
SCSIPORTAPI
ULONG
NTAPI
ScsiPortInitialize(
- IN PVOID Argument1,
- IN PVOID Argument2,
- IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
- IN PVOID HwContext OPTIONAL);
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN struct _HW_INITIALIZATION_DATA *HwInitializationData,
+ IN PVOID HwContext OPTIONAL);
SCSIPORTAPI
VOID
NTAPI
ScsiPortIoMapTransfer(
- IN PVOID HwDeviceExtension,
- IN PSCSI_REQUEST_BLOCK Srb,
- IN PVOID LogicalAddress,
- IN ULONG Length);
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb,
+ IN PVOID LogicalAddress,
+ IN ULONG Length);
SCSIPORTAPI
VOID
NTAPI
ScsiPortLogError(
- IN PVOID HwDeviceExtension,
- IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
- IN UCHAR PathId,
- IN UCHAR TargetId,
- IN UCHAR Lun,
- IN ULONG ErrorCode,
- IN ULONG UniqueId);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortMoveMemory(
- IN PVOID WriteBuffer,
- IN PVOID ReadBuffer,
- IN ULONG Length);
+ IN PVOID HwDeviceExtension,
+ IN PSCSI_REQUEST_BLOCK Srb OPTIONAL,
+ IN UCHAR PathId,
+ IN UCHAR TargetId,
+ IN UCHAR Lun,
+ IN ULONG ErrorCode,
+ IN ULONG UniqueId);
SCSIPORTAPI
VOID
__cdecl
ScsiPortNotification(
- IN SCSI_NOTIFICATION_TYPE NotificationType,
- IN PVOID HwDeviceExtension,
+ IN SCSI_NOTIFICATION_TYPE NotificationType,
+ IN PVOID HwDeviceExtension,
IN ...);
SCSIPORTAPI
VOID
NTAPI
ScsiPortQuerySystemTime(
- OUT PLARGE_INTEGER CurrentTime);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortReadPortBufferUchar(
- IN PUCHAR Port,
- IN PUCHAR Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortReadPortBufferUlong(
- IN PULONG Port,
- IN PULONG Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortReadPortBufferUshort(
- IN PUSHORT Port,
- IN PUSHORT Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-UCHAR
-NTAPI
-ScsiPortReadPortUchar(
- IN PUCHAR Port);
-
-SCSIPORTAPI
-ULONG
-NTAPI
-ScsiPortReadPortUlong(
- IN PULONG Port);
-
-SCSIPORTAPI
-USHORT
-NTAPI
-ScsiPortReadPortUshort(
- IN PUSHORT Port);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortReadRegisterBufferUchar(
- IN PUCHAR Register,
- IN PUCHAR Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortReadRegisterBufferUlong(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortReadRegisterBufferUshort(
- IN PUSHORT Register,
- IN PUSHORT Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-UCHAR
-NTAPI
-ScsiPortReadRegisterUchar(
- IN PUCHAR Register);
-
-SCSIPORTAPI
-ULONG
-NTAPI
-ScsiPortReadRegisterUlong(
- IN PULONG Register);
-
-SCSIPORTAPI
-USHORT
-NTAPI
-ScsiPortReadRegisterUshort(
- IN PUSHORT Register);
+ OUT PLARGE_INTEGER CurrentTime);
SCSIPORTAPI
ULONG
NTAPI
ScsiPortSetBusDataByOffset(
- IN PVOID DeviceExtension,
- IN ULONG BusDataType,
- IN ULONG SystemIoBusNumber,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
+ IN PVOID DeviceExtension,
+ IN ULONG BusDataType,
+ IN ULONG SystemIoBusNumber,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
SCSIPORTAPI
VOID
NTAPI
ScsiPortStallExecution(
- IN ULONG Delay);
+ IN ULONG Delay);
SCSIPORTAPI
BOOLEAN
NTAPI
ScsiPortValidateRange(
- IN PVOID HwDeviceExtension,
- IN INTERFACE_TYPE BusType,
- IN ULONG SystemIoBusNumber,
- IN SCSI_PHYSICAL_ADDRESS IoAddress,
- IN ULONG NumberOfBytes,
- IN BOOLEAN InIoSpace);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWritePortBufferUchar(
- IN PUCHAR Port,
- IN PUCHAR Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWritePortBufferUlong(
- IN PULONG Port,
- IN PULONG Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWritePortBufferUshort(
- IN PUSHORT Port,
- IN PUSHORT Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWritePortUchar(
- IN PUCHAR Port,
- IN UCHAR Value);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWritePortUlong(
- IN PULONG Port,
- IN ULONG Value);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWritePortUshort(
- IN PUSHORT Port,
- IN USHORT Value);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWriteRegisterBufferUchar(
- IN PUCHAR Register,
- IN PUCHAR Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWriteRegisterBufferUlong(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWriteRegisterBufferUshort(
- IN PUSHORT Register,
- IN PUSHORT Buffer,
- IN ULONG Count);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWriteRegisterUchar(
- IN PUCHAR Register,
- IN ULONG Value);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWriteRegisterUlong(
- IN PULONG Register,
- IN ULONG Value);
-
-SCSIPORTAPI
-VOID
-NTAPI
-ScsiPortWriteRegisterUshort(
- IN PUSHORT Register,
- IN USHORT Value);
+ IN PVOID HwDeviceExtension,
+ IN INTERFACE_TYPE BusType,
+ IN ULONG SystemIoBusNumber,
+ IN SCSI_PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfBytes,
+ IN BOOLEAN InIoSpace);
SCSIPORTAPI
VOID
@@ -745,8 +711,230 @@ ScsiDebugPrint(
IN PCCHAR DebugMessage,
IN ...);
+#if defined(_M_AMD64)
+
+#define ScsiPortReadPortUchar READ_PORT_UCHAR
+#define ScsiPortReadPortUshort READ_PORT_USHORT
+#define ScsiPortReadPortUlong READ_PORT_ULONG
+
+#define ScsiPortReadPortBufferUchar READ_PORT_BUFFER_UCHAR
+#define ScsiPortReadPortBufferUshort READ_PORT_BUFFER_USHORT
+#define ScsiPortReadPortBufferUlong READ_PORT_BUFFER_ULONG
+
+#define ScsiPortReadRegisterUchar READ_REGISTER_UCHAR
+#define ScsiPortReadRegisterUshort READ_REGISTER_USHORT
+#define ScsiPortReadRegisterUlong READ_REGISTER_ULONG
+
+#define ScsiPortReadRegisterBufferUchar READ_REGISTER_BUFFER_UCHAR
+#define ScsiPortReadRegisterBufferUshort READ_REGISTER_BUFFER_USHORT
+#define ScsiPortReadRegisterBufferUlong READ_REGISTER_BUFFER_ULONG
+
+#define ScsiPortWritePortUchar WRITE_PORT_UCHAR
+#define ScsiPortWritePortUshort WRITE_PORT_USHORT
+#define ScsiPortWritePortUlong WRITE_PORT_ULONG
+
+#define ScsiPortWritePortBufferUchar WRITE_PORT_BUFFER_UCHAR
+#define ScsiPortWritePortBufferUshort WRITE_PORT_BUFFER_USHORT
+#define ScsiPortWritePortBufferUlong WRITE_PORT_BUFFER_ULONG
+
+#define ScsiPortWriteRegisterUchar WRITE_REGISTER_UCHAR
+#define ScsiPortWriteRegisterUshort WRITE_REGISTER_USHORT
+#define ScsiPortWriteRegisterUlong WRITE_REGISTER_ULONG
+
+#define ScsiPortWriteRegisterBufferUchar WRITE_REGISTER_BUFFER_UCHAR
+#define ScsiPortWriteRegisterBufferUshort WRITE_REGISTER_BUFFER_USHORT
+#define ScsiPortWriteRegisterBufferUlong WRITE_REGISTER_BUFFER_ULONG
+
+#define ScsiPortMoveMemory memmove
+
+#else
+
+SCSIPORTAPI
+UCHAR
+NTAPI
+ScsiPortReadPortUchar(
+ IN PUCHAR Port);
+
+SCSIPORTAPI
+ULONG
+NTAPI
+ScsiPortReadPortUlong(
+ IN PULONG Port);
+
+SCSIPORTAPI
+USHORT
+NTAPI
+ScsiPortReadPortUshort(
+ IN PUSHORT Port);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortReadPortBufferUchar(
+ IN PUCHAR Port,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortReadPortBufferUlong(
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortReadPortBufferUshort(
+ IN PUSHORT Port,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+UCHAR
+NTAPI
+ScsiPortReadRegisterUchar(
+ IN PUCHAR Register);
+
+SCSIPORTAPI
+ULONG
+NTAPI
+ScsiPortReadRegisterUlong(
+ IN PULONG Register);
+
+SCSIPORTAPI
+USHORT
+NTAPI
+ScsiPortReadRegisterUshort(
+ IN PUSHORT Register);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortReadRegisterBufferUchar(
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortReadRegisterBufferUlong(
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortReadRegisterBufferUshort(
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWritePortUchar(
+ IN PUCHAR Port,
+ IN UCHAR Value);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWritePortUlong(
+ IN PULONG Port,
+ IN ULONG Value);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWritePortUshort(
+ IN PUSHORT Port,
+ IN USHORT Value);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWritePortBufferUchar(
+ IN PUCHAR Port,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWritePortBufferUlong(
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWritePortBufferUshort(
+ IN PUSHORT Port,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWriteRegisterUchar(
+ IN PUCHAR Register,
+ IN ULONG Value);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWriteRegisterUlong(
+ IN PULONG Register,
+ IN ULONG Value);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWriteRegisterUshort(
+ IN PUSHORT Register,
+ IN USHORT Value);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWriteRegisterBufferUchar(
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWriteRegisterBufferUlong(
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortWriteRegisterBufferUshort(
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
+
+SCSIPORTAPI
+VOID
+NTAPI
+ScsiPortMoveMemory(
+ IN PVOID WriteBuffer,
+ IN PVOID ReadBuffer,
+ IN ULONG Length);
+
+#endif /* defined(_M_AMD64) */
+
#ifdef __cplusplus
}
#endif
-#endif /* __SRB_H */
+#endif /* _NTSRB_ */
diff --git a/include/ddk/video.h b/include/ddk/video.h
index 6294b5a5a75..41013e3af94 100644
--- a/include/ddk/video.h
+++ b/include/ddk/video.h
@@ -20,34 +20,89 @@
*
*/
-#ifndef __VIDEO_H__
+#pragma once
+
#define __VIDEO_H__
-#ifdef _WINDDI_
-#error winddi.h cannot be included with video.h
-#else
-
-#if defined(_VIDEOPORT_)
- #define VPAPI
-#else
- #define VPAPI DECLSPEC_IMPORT
-#endif
-#define VIDEOPORT_API VPAPI
-
-#include "videoagp.h"
#include "ntddvdeo.h"
+#include "videoagp.h"
#ifdef __cplusplus
extern "C" {
#endif
-typedef LONG VP_STATUS;
-typedef VP_STATUS *PVP_STATUS;
-typedef struct __DMA_PARAMETERS * PDMA;
-typedef struct _VIDEO_PORT_SPIN_LOCK *PSPIN_LOCK;
-typedef struct __VP_DMA_ADAPTER *PVP_DMA_ADAPTER;
+#ifndef _NTOSDEF_
-#define DISPLAY_ADAPTER_HW_ID 0xFFFFFFFF
+#ifdef PAGED_CODE
+#undef PAGED_CODE
+#endif
+
+#if defined(_MSC_VER)
+#define ALLOC_PRAGMA 1
+#endif
+
+#if defined(_VIDEOPORT_)
+#define VPAPI
+#else
+#define VPAPI DECLSPEC_IMPORT
+#endif
+
+#if DBG
+#define PAGED_CODE() \
+ if (VideoPortGetCurrentIrql() > 1 /* APC_LEVEL */) { \
+ VideoPortDebugPrint(Error, "Video: Pageable code called at IRQL %d\n", VideoPortGetCurrentIrql() ); \
+ ASSERT(FALSE); \
+ }
+#else
+#define PAGED_CODE()
+#endif /* DBG */
+
+ULONG
+NTAPI
+DriverEntry(
+ PVOID Context1,
+ PVOID Context2);
+
+#else
+
+#define VPAPI
+
+#endif /* _NTOSDEF_ */
+
+#if DBG
+#define VideoDebugPrint(x) VideoPortDebugPrint x
+#else
+#define VideoDebugPrint(x)
+#endif
+
+#define GET_VIDEO_PHYSICAL_ADDRESS(scatterList, \
+ VirtualAddress, \
+ InputBuffer, \
+ pLength, \
+ Address) \
+ do { \
+ ULONG_PTR byteOffset; \
+ \
+ byteOffset = (PCHAR) VirtualAddress - (PCHAR)InputBuffer; \
+ while (byteOffset >= scatterList->Length) { \
+ byteOffset -= scatterList->Length; \
+ scatterList++; \
+ } \
+ *pLength = scatterList->Length - byteOffset; \
+ Address = (ULONG_PTR) (scatterList->PhysicalAddress + byteOffset); \
+ } while (0)
+
+#define GET_VIDEO_SCATTERGATHER(ppDma) (**(PVRB_SG **)ppDma)
+
+/* VIDEO_ACCESS_RANGE.RangePassive */
+#define VIDEO_RANGE_PASSIVE_DECODE 1
+#define VIDEO_RANGE_10_BIT_DECODE 2
+
+#define SIZE_OF_NT4_VIDEO_PORT_CONFIG_INFO FIELD_OFFSET(VIDEO_PORT_CONFIG_INFO, Master)
+#define SIZE_OF_WXP_VIDEO_PORT_CONFIG_INFO sizeof(VIDEO_PORT_CONFIG_INFO)
+
+#define SET_USER_EVENT 0x01
+#define SET_DISPLAY_EVENT 0x02
#define EVENT_TYPE_MASK 1
#define SYNCHRONIZATION_EVENT 0
@@ -57,18 +112,120 @@ typedef struct __VP_DMA_ADAPTER *PVP_DMA_ADAPTER;
#define INITIAL_EVENT_NOT_SIGNALED 0
#define INITIAL_EVENT_SIGNALED 2
-typedef enum VIDEO_DEBUG_LEVEL {
- Error = 0,
- Warn,
- Trace,
- Info
-} VIDEO_DEBUG_LEVEL, *PVIDEO_DEBUG_LEVEL;
+#define DISPLAY_ADAPTER_HW_ID 0xFFFFFFFF
-typedef enum {
- VideoPortUnlockAfterDma = 1,
- VideoPortKeepPagesLocked,
- VideoPortDmaInitOnly
-} DMA_FLAGS;
+#define VIDEO_INVALID_CHILD_ID 0xFFFFFFFF
+
+#define SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, HwStartDma)
+#define SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA FIELD_OFFSET(VIDEO_HW_INITIALIZATION_DATA, Reserved)
+#define SIZE_OF_WXP_VIDEO_HW_INITIALIZATION_DATA (SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA + sizeof(ULONG))
+
+#define VIDEO_PORT_AGP_INTERFACE_VERSION_1 1
+#define VIDEO_PORT_AGP_INTERFACE_VERSION_2 2
+#define VIDEO_PORT_I2C_INTERFACE_VERSION_1 1
+#define VIDEO_PORT_I2C_INTERFACE_VERSION_2 2
+#define VIDEO_PORT_INT10_INTERFACE_VERSION_1 1
+#define VIDEO_PORT_WCMEMORYPROTECTION_INTERFACE_VERSION_1 1
+#define VIDEO_PORT_DEBUG_REPORT_INTERFACE_VERSION_1 1
+
+/* Flags for VideoPortGetDeviceBase and VideoPortMapMemory */
+#define VIDEO_MEMORY_SPACE_MEMORY 0x00
+#define VIDEO_MEMORY_SPACE_IO 0x01
+#define VIDEO_MEMORY_SPACE_USER_MODE 0x02
+#define VIDEO_MEMORY_SPACE_DENSE 0x04
+#define VIDEO_MEMORY_SPACE_P6CACHE 0x08
+
+/* PVIDEO_HW_GET_CHILD_DESCRIPTOR return values */
+#define VIDEO_ENUM_MORE_DEVICES ERROR_CONTINUE
+#define VIDEO_ENUM_NO_MORE_DEVICES ERROR_NO_MORE_DEVICES
+#define VIDEO_ENUM_INVALID_DEVICE ERROR_INVALID_NAME
+
+#define DEVICE_VGA_ENABLED 1
+
+/* VideoPortCheckForDeviceExistence.Flags constants */
+#define CDE_USE_SUBSYSTEM_IDS 0x00000001
+#define CDE_USE_REVISION 0x00000002
+
+#define BUGCHECK_DATA_SIZE_RESERVED 48
+
+#define VIDEO_DEBUG_REPORT_MAX_SIZE 0x8000
+
+typedef LONG VP_STATUS, *PVP_STATUS;
+typedef ULONG DMA_EVENT_FLAGS;
+
+typedef struct _VIDEO_PORT_SPIN_LOCK *PSPIN_LOCK;
+typedef struct _VIDEO_DEBUG_REPORT *PVIDEO_DEBUG_REPORT;
+typedef struct __DMA_PARAMETERS *PDMA;
+typedef struct __VP_DMA_ADAPTER *PVP_DMA_ADAPTER;
+
+typedef PVOID
+(NTAPI *PVIDEO_PORT_GET_PROC_ADDRESS)(
+ IN PVOID HwDeviceExtension,
+ IN PUCHAR FunctionName);
+
+typedef struct _VIDEO_PORT_CONFIG_INFO {
+ ULONG Length;
+ ULONG SystemIoBusNumber;
+ INTERFACE_TYPE AdapterInterfaceType;
+ ULONG BusInterruptLevel;
+ ULONG BusInterruptVector;
+ KINTERRUPT_MODE InterruptMode;
+ ULONG NumEmulatorAccessEntries;
+ PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries;
+ ULONG_PTR EmulatorAccessEntriesContext;
+ PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress;
+ ULONG VdmPhysicalVideoMemoryLength;
+ ULONG HardwareStateSize;
+ ULONG DmaChannel;
+ ULONG DmaPort;
+ UCHAR DmaShareable;
+ UCHAR InterruptShareable;
+ BOOLEAN Master;
+ DMA_WIDTH DmaWidth;
+ DMA_SPEED DmaSpeed;
+ BOOLEAN bMapBuffers;
+ BOOLEAN NeedPhysicalAddresses;
+ BOOLEAN DemandMode;
+ ULONG MaximumTransferLength;
+ ULONG NumberOfPhysicalBreaks;
+ BOOLEAN ScatterGather;
+ ULONG MaximumScatterGatherChunkSize;
+ PVIDEO_PORT_GET_PROC_ADDRESS VideoPortGetProcAddress;
+ PWSTR DriverRegistryPath;
+ ULONGLONG SystemMemorySize;
+} VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO;
+
+typedef VP_STATUS
+(NTAPI *PVIDEO_HW_FIND_ADAPTER)(
+ IN PVOID HwDeviceExtension,
+ IN PVOID HwContext,
+ IN PWSTR ArgumentString,
+ IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo,
+ OUT PUCHAR Again);
+
+typedef BOOLEAN
+(NTAPI *PVIDEO_HW_INITIALIZE)(
+ IN PVOID HwDeviceExtension);
+
+typedef BOOLEAN
+(NTAPI *PVIDEO_HW_INTERRUPT)(
+ IN PVOID HwDeviceExtension);
+
+typedef struct _VIDEO_ACCESS_RANGE {
+ PHYSICAL_ADDRESS RangeStart;
+ ULONG RangeLength;
+ UCHAR RangeInIoSpace;
+ UCHAR RangeVisible;
+ UCHAR RangeShareable;
+ UCHAR RangePassive;
+} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
+
+typedef VOID
+(NTAPI *PVIDEO_HW_LEGACYRESOURCES)(
+ IN ULONG VendorId,
+ IN ULONG DeviceId,
+ IN OUT PVIDEO_ACCESS_RANGE *LegacyResourceList,
+ IN OUT PULONG LegacyResourceCount);
typedef enum _HW_DMA_RETURN {
DmaAsyncReturn,
@@ -77,142 +234,35 @@ typedef enum _HW_DMA_RETURN {
typedef HW_DMA_RETURN
(NTAPI *PVIDEO_HW_START_DMA)(
- PVOID HwDeviceExtension,
- PDMA pDma);
-
-
-#ifdef PAGED_CODE
-#undef PAGED_CODE
-#endif
-
-#if DBG
-
-#define PAGED_CODE() \
- if (VideoPortGetCurrentIrql() > 1 /* APC_LEVEL */) \
- { \
- VideoPortDebugPrint(Error, "Video: Pageable code called at IRQL %d\n", VideoPortGetCurrentIrql() ); \
- ASSERT(FALSE); \
- }
-
-#else
-
-#define PAGED_CODE()
-
-#endif
-
-typedef struct _VIDEO_HARDWARE_CONFIGURATION_DATA {
- INTERFACE_TYPE InterfaceType;
- ULONG BusNumber;
- USHORT Version;
- USHORT Revision;
- USHORT Irql;
- USHORT Vector;
- ULONG ControlBase;
- ULONG ControlSize;
- ULONG CursorBase;
- ULONG CursorSize;
- ULONG FrameBase;
- ULONG FrameSize;
-} VIDEO_HARDWARE_CONFIGURATION_DATA, *PVIDEO_HARDWARE_CONFIGURATION_DATA;
-
-#define SIZE_OF_NT4_VIDEO_PORT_CONFIG_INFO 0x42
-#define SIZE_OF_NT4_VIDEO_HW_INITIALIZATION_DATA 0x28
-#define SIZE_OF_W2K_VIDEO_HW_INITIALIZATION_DATA 0x50
-
-typedef enum _VIDEO_DEVICE_DATA_TYPE {
- VpMachineData = 0,
- VpCmosData,
- VpBusData,
- VpControllerData,
- VpMonitorData
-} VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE;
-
-
-
-/* Video miniport driver functions */
+ PVOID HwDeviceExtension,
+ PDMA pDma);
typedef struct _VP_SCATTER_GATHER_ELEMENT {
- PHYSICAL_ADDRESS Address;
- ULONG Length;
- ULONG_PTR Reserved;
+ PHYSICAL_ADDRESS Address;
+ ULONG Length;
+ ULONG_PTR Reserved;
} VP_SCATTER_GATHER_ELEMENT, *PVP_SCATTER_GATHER_ELEMENT;
typedef struct _VP_SCATTER_GATHER_LIST {
- ULONG NumberOfElements;
- ULONG_PTR Reserved;
- VP_SCATTER_GATHER_ELEMENT Elements[0];
+ ULONG NumberOfElements;
+ ULONG_PTR Reserved;
+ VP_SCATTER_GATHER_ELEMENT Elements[0];
} VP_SCATTER_GATHER_LIST, *PVP_SCATTER_GATHER_LIST;
typedef VOID
(NTAPI *PEXECUTE_DMA)(
- IN PVOID HwDeviceExtension,
- IN PVP_DMA_ADAPTER VpDmaAdapter,
- IN PVP_SCATTER_GATHER_LIST SGList,
- IN PVOID Context);
-
-typedef PVOID
-(NTAPI *PVIDEO_PORT_GET_PROC_ADDRESS)(
- IN PVOID HwDeviceExtension,
- IN PUCHAR FunctionName);
-
-typedef struct _VIDEO_PORT_CONFIG_INFO {
- ULONG Length;
- ULONG SystemIoBusNumber;
- INTERFACE_TYPE AdapterInterfaceType;
- ULONG BusInterruptLevel;
- ULONG BusInterruptVector;
- KINTERRUPT_MODE InterruptMode;
- ULONG NumEmulatorAccessEntries;
- PEMULATOR_ACCESS_ENTRY EmulatorAccessEntries;
- ULONG_PTR EmulatorAccessEntriesContext;
- PHYSICAL_ADDRESS VdmPhysicalVideoMemoryAddress;
- ULONG VdmPhysicalVideoMemoryLength;
- ULONG HardwareStateSize;
- ULONG DmaChannel;
- ULONG DmaPort;
- UCHAR DmaShareable;
- UCHAR InterruptShareable;
- BOOLEAN Master;
- DMA_WIDTH DmaWidth;
- DMA_SPEED DmaSpeed;
- BOOLEAN bMapBuffers;
- BOOLEAN NeedPhysicalAddresses;
- BOOLEAN DemandMode;
- ULONG MaximumTransferLength;
- ULONG NumberOfPhysicalBreaks;
- BOOLEAN ScatterGather;
- ULONG MaximumScatterGatherChunkSize;
- PVIDEO_PORT_GET_PROC_ADDRESS VideoPortGetProcAddress;
- PWSTR DriverRegistryPath;
- ULONGLONG SystemMemorySize;
-} VIDEO_PORT_CONFIG_INFO, *PVIDEO_PORT_CONFIG_INFO;
-
-typedef VP_STATUS
-(NTAPI *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
-(NTAPI *PVIDEO_HW_POWER_GET)(
- IN PVOID HwDeviceExtension,
- IN ULONG HwId,
- IN OUT PVIDEO_POWER_MANAGEMENT VideoPowerControl);
-
-/* PVIDEO_HW_GET_CHILD_DESCRIPTOR return values */
-#define VIDEO_ENUM_MORE_DEVICES ERROR_CONTINUE
-#define VIDEO_ENUM_NO_MORE_DEVICES ERROR_NO_MORE_DEVICES
-#define VIDEO_ENUM_INVALID_DEVICE ERROR_INVALID_NAME
+ IN PVOID HwDeviceExtension,
+ IN PVP_DMA_ADAPTER VpDmaAdapter,
+ IN PVP_SCATTER_GATHER_LIST SGList,
+ IN PVOID Context);
/* PVIDEO_HW_GET_CHILD_DESCRIPTOR.ChildEnumInfo constants */
typedef struct _VIDEO_CHILD_ENUM_INFO {
- ULONG Size;
- ULONG ChildDescriptorSize;
- ULONG ChildIndex;
- ULONG ACPIHwId;
- PVOID ChildHwDeviceExtension;
+ ULONG Size;
+ ULONG ChildDescriptorSize;
+ ULONG ChildIndex;
+ ULONG ACPIHwId;
+ PVOID ChildHwDeviceExtension;
} VIDEO_CHILD_ENUM_INFO, *PVIDEO_CHILD_ENUM_INFO;
/* PVIDEO_HW_GET_CHILD_DESCRIPTOR.VideoChildType constants */
@@ -225,259 +275,74 @@ typedef enum _VIDEO_CHILD_TYPE {
typedef VP_STATUS
(NTAPI *PVIDEO_HW_GET_CHILD_DESCRIPTOR)(
- IN PVOID HwDeviceExtension,
- IN PVIDEO_CHILD_ENUM_INFO ChildEnumInfo,
- OUT PVIDEO_CHILD_TYPE VideoChildType,
- OUT PUCHAR pChildDescriptor,
- OUT PULONG UId,
- OUT PULONG pUnused);
-
-typedef BOOLEAN
-(NTAPI *PVIDEO_HW_INITIALIZE)(
- IN PVOID HwDeviceExtension);
-
-typedef BOOLEAN
-(NTAPI *PVIDEO_HW_INTERRUPT)(
- IN PVOID HwDeviceExtension);
-
-/* VIDEO_ACCESS_RANGE.RangePassive */
-#define VIDEO_RANGE_PASSIVE_DECODE 1
-#define VIDEO_RANGE_10_BIT_DECODE 2
-
-#ifndef VIDEO_ACCESS_RANGE_DEFINED /* also in miniport.h */
-#define VIDEO_ACCESS_RANGE_DEFINED
-typedef struct _VIDEO_ACCESS_RANGE {
- PHYSICAL_ADDRESS RangeStart;
- ULONG RangeLength;
- UCHAR RangeInIoSpace;
- UCHAR RangeVisible;
- UCHAR RangeShareable;
- UCHAR RangePassive;
-} VIDEO_ACCESS_RANGE, *PVIDEO_ACCESS_RANGE;
-#endif
-
-typedef VOID
-(NTAPI *PVIDEO_HW_LEGACYRESOURCES)(
- IN ULONG VendorId,
- IN ULONG DeviceId,
- IN OUT PVIDEO_ACCESS_RANGE *LegacyResourceList,
- IN OUT PULONG LegacyResourceCount);
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_CHILD_ENUM_INFO ChildEnumInfo,
+ OUT PVIDEO_CHILD_TYPE VideoChildType,
+ OUT PUCHAR pChildDescriptor,
+ OUT PULONG UId,
+ OUT PULONG pUnused);
typedef VP_STATUS
-(NTAPI *PMINIPORT_QUERY_DEVICE_ROUTINE)(
- IN PVOID HwDeviceExtension,
- IN PVOID Context,
- IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
- IN PVOID Identifier,
- IN ULONG IdentifierLength,
- IN PVOID ConfigurationData,
- IN ULONG ConfigurationDataLength,
- IN OUT PVOID ComponentInformation,
- IN ULONG ComponentInformationLength);
+(NTAPI *PVIDEO_HW_POWER_SET)(
+ IN PVOID HwDeviceExtension,
+ IN ULONG HwId,
+ IN PVIDEO_POWER_MANAGEMENT VideoPowerControl);
+
+typedef VP_STATUS
+(NTAPI *PVIDEO_HW_POWER_GET)(
+ IN PVOID HwDeviceExtension,
+ IN ULONG HwId,
+ IN OUT PVIDEO_POWER_MANAGEMENT VideoPowerControl);
typedef struct _QUERY_INTERFACE {
- CONST GUID *InterfaceType;
- USHORT Size;
- USHORT Version;
- PINTERFACE Interface;
- PVOID InterfaceSpecificData;
+ CONST GUID *InterfaceType;
+ USHORT Size;
+ USHORT Version;
+ PINTERFACE Interface;
+ PVOID InterfaceSpecificData;
} QUERY_INTERFACE, *PQUERY_INTERFACE;
typedef VP_STATUS
(NTAPI *PVIDEO_HW_QUERY_INTERFACE)(
- IN PVOID HwDeviceExtension,
- IN OUT PQUERY_INTERFACE QueryInterface);
+ IN PVOID HwDeviceExtension,
+ IN OUT PQUERY_INTERFACE QueryInterface);
typedef VP_STATUS
-(NTAPI *PMINIPORT_GET_REGISTRY_ROUTINE)(
- IN PVOID HwDeviceExtension,
- IN PVOID Context,
- IN OUT PWSTR ValueName,
- IN OUT PVOID ValueData,
- IN ULONG ValueLength);
+(NTAPI *PVIDEO_HW_CHILD_CALLBACK)(
+ PVOID HwDeviceExtension,
+ PVOID ChildDeviceExtension);
typedef BOOLEAN
(NTAPI *PVIDEO_HW_RESET_HW)(
- IN PVOID HwDeviceExtension,
- IN ULONG Columns,
- IN ULONG Rows);
-
-typedef VP_STATUS
-(NTAPI *PVIDEO_HW_POWER_SET)(
- IN PVOID HwDeviceExtension,
- IN ULONG HwId,
- IN PVIDEO_POWER_MANAGEMENT VideoPowerControl);
+ IN PVOID HwDeviceExtension,
+ IN ULONG Columns,
+ IN ULONG Rows);
typedef struct _STATUS_BLOCK {
- _ANONYMOUS_UNION union {
- VP_STATUS Status;
- PVOID Pointer;
+ _ANONYMOUS_UNION union {
+ VP_STATUS Status;
+ PVOID Pointer;
} DUMMYUNIONNAME;
ULONG_PTR Information;
} STATUS_BLOCK, *PSTATUS_BLOCK;
typedef struct _VIDEO_REQUEST_PACKET {
- ULONG IoControlCode;
- PSTATUS_BLOCK StatusBlock;
- PVOID InputBuffer;
- ULONG InputBufferLength;
- PVOID OutputBuffer;
- ULONG OutputBufferLength;
+ ULONG IoControlCode;
+ PSTATUS_BLOCK StatusBlock;
+ PVOID InputBuffer;
+ ULONG InputBufferLength;
+ PVOID OutputBuffer;
+ ULONG OutputBufferLength;
} VIDEO_REQUEST_PACKET, *PVIDEO_REQUEST_PACKET;
typedef BOOLEAN
(NTAPI *PVIDEO_HW_START_IO)(
- IN PVOID HwDeviceExtension,
- IN PVIDEO_REQUEST_PACKET RequestPacket);
-
-typedef BOOLEAN
-(NTAPI *PMINIPORT_SYNCHRONIZE_ROUTINE)(
- IN PVOID Context);
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_REQUEST_PACKET RequestPacket);
typedef VOID
(NTAPI *PVIDEO_HW_TIMER)(
- IN PVOID HwDeviceExtension);
-
-typedef VOID
-(NTAPI *PMINIPORT_DPC_ROUTINE)(
- IN PVOID HwDeviceExtension,
- IN PVOID Context);
-
-typedef VP_STATUS
-(NTAPI *PDRIVER_IO_PORT_UCHAR)(
- IN ULONG_PTR Context,
- IN ULONG Port,
- IN UCHAR AccessMode,
- IN PUCHAR Data);
-
-typedef VP_STATUS
-(NTAPI *PDRIVER_IO_PORT_UCHAR_STRING)(
- IN ULONG_PTR Context,
- IN ULONG Port,
- IN UCHAR AccessMode,
- IN PUCHAR Data,
- IN ULONG DataLength);
-
-typedef VP_STATUS
-(NTAPI *PDRIVER_IO_PORT_ULONG)(
- IN ULONG_PTR Context,
- IN ULONG Port,
- IN UCHAR AccessMode,
- IN PULONG Data);
-
-typedef VP_STATUS
-(NTAPI *PDRIVER_IO_PORT_ULONG_STRING)(
- IN ULONG_PTR Context,
- IN ULONG Port,
- IN UCHAR AccessMode,
- IN PULONG Data,
- IN ULONG DataLength);
-
-typedef VP_STATUS
-(NTAPI *PDRIVER_IO_PORT_USHORT)(
- IN ULONG_PTR Context,
- IN ULONG Port,
- IN UCHAR AccessMode,
- IN PUSHORT Data);
-
-typedef VP_STATUS
-(NTAPI *PDRIVER_IO_PORT_USHORT_STRING)(
- IN ULONG_PTR Context,
- IN ULONG Port,
- IN UCHAR AccessMode,
- IN PUSHORT Data,
- IN ULONG DataLength);
-
-
-
-typedef struct _INT10_BIOS_ARGUMENTS {
- ULONG Eax;
- ULONG Ebx;
- ULONG Ecx;
- ULONG Edx;
- ULONG Esi;
- ULONG Edi;
- ULONG Ebp;
- USHORT SegDs;
- USHORT SegEs;
-} INT10_BIOS_ARGUMENTS, *PINT10_BIOS_ARGUMENTS;
-
-typedef struct _VIDEO_CHILD_STATE {
- ULONG Id;
- ULONG State;
-} VIDEO_CHILD_STATE, *PVIDEO_CHILD_STATE;
-
-typedef struct _VIDEO_CHILD_STATE_CONFIGURATION {
- ULONG Count;
- VIDEO_CHILD_STATE ChildStateArray[ANYSIZE_ARRAY];
-} VIDEO_CHILD_STATE_CONFIGURATION, *PVIDEO_CHILD_STATE_CONFIGURATION;
-
-typedef struct _VIDEO_HW_INITIALIZATION_DATA {
- ULONG HwInitDataSize;
- INTERFACE_TYPE AdapterInterfaceType;
- PVIDEO_HW_FIND_ADAPTER HwFindAdapter;
- PVIDEO_HW_INITIALIZE HwInitialize;
- PVIDEO_HW_INTERRUPT HwInterrupt;
- PVIDEO_HW_START_IO HwStartIO;
- ULONG HwDeviceExtensionSize;
- ULONG StartingDeviceNumber;
- PVIDEO_HW_RESET_HW HwResetHw;
- PVIDEO_HW_TIMER HwTimer;
- PVIDEO_HW_START_DMA HwStartDma;
- PVIDEO_HW_POWER_SET HwSetPowerState;
- PVIDEO_HW_POWER_GET HwGetPowerState;
- PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor;
- PVIDEO_HW_QUERY_INTERFACE HwQueryInterface;
- ULONG HwChildDeviceExtensionSize;
- PVIDEO_ACCESS_RANGE HwLegacyResourceList;
- ULONG HwLegacyResourceCount;
- PVIDEO_HW_LEGACYRESOURCES HwGetLegacyResources;
- BOOLEAN AllowEarlyEnumeration;
- ULONG Reserved;
-} VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA;
-
-/* VIDEO_PORT_AGP_INTERFACE.Version contants */
-#define VIDEO_PORT_AGP_INTERFACE_VERSION_1 1
-
-typedef struct _VIDEO_PORT_AGP_INTERFACE {
- SHORT Size;
- SHORT Version;
- PVOID Context;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
- PAGP_RESERVE_PHYSICAL AgpReservePhysical;
- PAGP_RELEASE_PHYSICAL AgpReleasePhysical;
- PAGP_COMMIT_PHYSICAL AgpCommitPhysical;
- PAGP_FREE_PHYSICAL AgpFreePhysical;
- PAGP_RESERVE_VIRTUAL AgpReserveVirtual;
- PAGP_RELEASE_VIRTUAL AgpReleaseVirtual;
- PAGP_COMMIT_VIRTUAL AgpCommitVirtual;
- PAGP_FREE_VIRTUAL AgpFreeVirtual;
- ULONGLONG AgpAllocationLimit;
-} VIDEO_PORT_AGP_INTERFACE, *PVIDEO_PORT_AGP_INTERFACE;
-
-/* VIDEO_PORT_AGP_INTERFACE_2.Version constants */
-#define VIDEO_PORT_AGP_INTERFACE_VERSION_2 2
-
-typedef struct _VIDEO_PORT_AGP_INTERFACE_2 {
- IN USHORT Size;
- IN USHORT Version;
- OUT PVOID Context;
- OUT PINTERFACE_REFERENCE InterfaceReference;
- OUT PINTERFACE_DEREFERENCE InterfaceDereference;
- OUT PAGP_RESERVE_PHYSICAL AgpReservePhysical;
- OUT PAGP_RELEASE_PHYSICAL AgpReleasePhysical;
- OUT PAGP_COMMIT_PHYSICAL AgpCommitPhysical;
- OUT PAGP_FREE_PHYSICAL AgpFreePhysical;
- OUT PAGP_RESERVE_VIRTUAL AgpReserveVirtual;
- OUT PAGP_RELEASE_VIRTUAL AgpReleaseVirtual;
- OUT PAGP_COMMIT_VIRTUAL AgpCommitVirtual;
- OUT PAGP_FREE_VIRTUAL AgpFreeVirtual;
- OUT ULONGLONG AgpAllocationLimit;
- OUT PAGP_SET_RATE AgpSetRate;
-} VIDEO_PORT_AGP_INTERFACE_2, *PVIDEO_PORT_AGP_INTERFACE_2;
-
-#define VIDEO_PORT_I2C_INTERFACE_VERSION_1 1
+ IN PVOID HwDeviceExtension);
typedef VOID
(NTAPI *PVIDEO_WRITE_CLOCK_LINE)(
@@ -497,184 +362,180 @@ typedef BOOLEAN
(NTAPI *PVIDEO_READ_DATA_LINE)(
PVOID HwDeviceExtension);
-typedef struct _I2C_CALLBACKS
-{
- IN PVIDEO_WRITE_CLOCK_LINE WriteClockLine;
- IN PVIDEO_WRITE_DATA_LINE WriteDataLine;
- IN PVIDEO_READ_CLOCK_LINE ReadClockLine;
- IN PVIDEO_READ_DATA_LINE ReadDataLine;
+typedef VOID
+(NTAPI *PVIDEO_WAIT_VSYNC_ACTIVE)(
+ PVOID HwDeviceExtension);
+
+typedef struct _I2C_CALLBACKS {
+ IN PVIDEO_WRITE_CLOCK_LINE WriteClockLine;
+ IN PVIDEO_WRITE_DATA_LINE WriteDataLine;
+ IN PVIDEO_READ_CLOCK_LINE ReadClockLine;
+ IN PVIDEO_READ_DATA_LINE ReadDataLine;
} I2C_CALLBACKS, *PI2C_CALLBACKS;
typedef BOOLEAN
(NTAPI *PI2C_START)(
- IN PVOID HwDeviceExtension,
- IN PI2C_CALLBACKS I2CCallbacks);
+ IN PVOID HwDeviceExtension,
+ IN PI2C_CALLBACKS I2CCallbacks);
typedef BOOLEAN
(NTAPI *PI2C_STOP)(
- IN PVOID HwDeviceExtension,
- IN PI2C_CALLBACKS I2CCallbacks);
+ IN PVOID HwDeviceExtension,
+ IN PI2C_CALLBACKS I2CCallbacks);
typedef BOOLEAN
(NTAPI *PI2C_WRITE)(
- IN PVOID HwDeviceExtension,
- IN PI2C_CALLBACKS I2CCallbacks,
- IN PUCHAR Buffer,
- IN ULONG Length);
+ IN PVOID HwDeviceExtension,
+ IN PI2C_CALLBACKS I2CCallbacks,
+ IN PUCHAR Buffer,
+ IN ULONG Length);
typedef BOOLEAN
(NTAPI *PI2C_READ)(
- IN PVOID HwDeviceExtension,
- IN PI2C_CALLBACKS I2CCallbacks,
- OUT PUCHAR Buffer,
- IN ULONG Length);
+ IN PVOID HwDeviceExtension,
+ IN PI2C_CALLBACKS I2CCallbacks,
+ OUT PUCHAR Buffer,
+ IN ULONG Length);
-typedef struct _VIDEO_PORT_I2C_INTERFACE {
- USHORT Size;
- USHORT Version;
- PVOID Context;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
- PI2C_START I2CStart;
- PI2C_STOP I2CStop;
- PI2C_WRITE I2CWrite;
- PI2C_READ I2CRead;
-} VIDEO_PORT_I2C_INTERFACE, *PVIDEO_PORT_I2C_INTERFACE;
+typedef struct _VIDEO_I2C_CONTROL {
+ IN PVIDEO_WRITE_CLOCK_LINE WriteClockLine;
+ IN PVIDEO_WRITE_DATA_LINE WriteDataLine;
+ IN PVIDEO_READ_CLOCK_LINE ReadClockLine;
+ IN PVIDEO_READ_DATA_LINE ReadDataLine;
+ IN ULONG I2CDelay;
+} VIDEO_I2C_CONTROL, *PVIDEO_I2C_CONTROL;
-/* VIDEO_PORT_INT10_INTERFACE.Version constants */
-#define VIDEO_PORT_INT10_INTERFACE_VERSION_1 1
+typedef BOOLEAN
+(NTAPI *PI2C_START_2)(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_I2C_CONTROL I2CControl);
-typedef VP_STATUS
-(NTAPI *PINT10_ALLOCATE_BUFFER)(
- IN PVOID Context,
- OUT PUSHORT Seg,
- OUT PUSHORT Off,
- IN OUT PULONG Length);
+typedef BOOLEAN
+(NTAPI *PI2C_STOP_2)(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_I2C_CONTROL I2CControl);
+
+typedef BOOLEAN
+(NTAPI *PI2C_WRITE_2)(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_I2C_CONTROL I2CControl,
+ IN PUCHAR Buffer,
+ IN ULONG Length);
+
+typedef BOOLEAN
+(NTAPI *PI2C_READ_2)(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_I2C_CONTROL I2CControl,
+ OUT PUCHAR Buffer,
+ IN ULONG Length,
+ IN BOOLEAN EndOfRead);
+
+typedef struct _INT10_BIOS_ARGUMENTS {
+ ULONG Eax;
+ ULONG Ebx;
+ ULONG Ecx;
+ ULONG Edx;
+ ULONG Esi;
+ ULONG Edi;
+ ULONG Ebp;
+ USHORT SegDs;
+ USHORT SegEs;
+} INT10_BIOS_ARGUMENTS, *PINT10_BIOS_ARGUMENTS;
typedef VP_STATUS
(NTAPI *PINT10_CALL_BIOS)(
- IN PVOID Context,
- IN OUT PINT10_BIOS_ARGUMENTS BiosArguments);
+ IN PVOID Context,
+ IN OUT PINT10_BIOS_ARGUMENTS BiosArguments);
+
+typedef VP_STATUS
+(NTAPI *PINT10_ALLOCATE_BUFFER)(
+ IN PVOID Context,
+ OUT PUSHORT Seg,
+ OUT PUSHORT Off,
+ IN OUT PULONG Length);
typedef VP_STATUS
(NTAPI *PINT10_FREE_BUFFER)(
- IN PVOID Context,
- IN USHORT Seg,
- IN USHORT Off);
+ IN PVOID Context,
+ IN USHORT Seg,
+ IN USHORT Off);
typedef VP_STATUS
(NTAPI *PINT10_READ_MEMORY)(
- IN PVOID Context,
- IN USHORT Seg,
- IN USHORT Off,
- OUT PVOID Buffer,
- IN ULONG Length);
+ IN PVOID Context,
+ IN USHORT Seg,
+ IN USHORT Off,
+ OUT PVOID Buffer,
+ IN ULONG Length);
typedef VP_STATUS
(NTAPI *PINT10_WRITE_MEMORY)(
- IN PVOID Context,
- IN USHORT Seg,
- IN USHORT Off,
- IN PVOID Buffer,
- IN ULONG Length);
+ IN PVOID Context,
+ IN USHORT Seg,
+ IN USHORT Off,
+ IN PVOID Buffer,
+ IN ULONG Length);
-typedef struct _VIDEO_PORT_INT10_INTERFACE {
- IN USHORT Size;
- IN USHORT Version;
- OUT PVOID Context;
- OUT PINTERFACE_REFERENCE InterfaceReference;
- OUT PINTERFACE_DEREFERENCE InterfaceDereference;
- OUT PINT10_ALLOCATE_BUFFER Int10AllocateBuffer;
- OUT PINT10_FREE_BUFFER Int10FreeBuffer;
- OUT PINT10_READ_MEMORY Int10ReadMemory;
- OUT PINT10_WRITE_MEMORY Int10WriteMemory;
- OUT PINT10_CALL_BIOS Int10CallBios;
-} VIDEO_PORT_INT10_INTERFACE, *PVIDEO_PORT_INT10_INTERFACE;
+typedef VP_STATUS
+(NTAPI *PROTECT_WC_MEMORY)(
+ IN PVOID Context,
+ IN PVOID HwDeviceExtension);
-/* Flags for VideoPortGetDeviceBase and VideoPortMapMemory */
-#define VIDEO_MEMORY_SPACE_MEMORY 0x00
-#define VIDEO_MEMORY_SPACE_IO 0x01
-#define VIDEO_MEMORY_SPACE_USER_MODE 0x02
-#define VIDEO_MEMORY_SPACE_DENSE 0x04
-#define VIDEO_MEMORY_SPACE_P6CACHE 0x08
+typedef VP_STATUS
+(NTAPI *RESTORE_WC_MEMORY)(
+ IN PVOID Context,
+ IN PVOID HwDeviceExtension);
-typedef struct _VIDEO_X86_BIOS_ARGUMENTS {
- ULONG Eax;
- ULONG Ebx;
- ULONG Ecx;
- ULONG Edx;
- ULONG Esi;
- ULONG Edi;
- ULONG Ebp;
-} VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS;
+typedef enum _VIDEO_DEVICE_DATA_TYPE {
+ VpMachineData = 0,
+ VpCmosData,
+ VpBusData,
+ VpControllerData,
+ VpMonitorData
+} VIDEO_DEVICE_DATA_TYPE, *PVIDEO_DEVICE_DATA_TYPE;
-typedef struct _VP_DEVICE_DESCRIPTION {
- BOOLEAN ScatterGather;
- BOOLEAN Dma32BitAddresses;
- BOOLEAN Dma64BitAddresses;
- ULONG MaximumLength;
-} VP_DEVICE_DESCRIPTION, *PVP_DEVICE_DESCRIPTION;
+typedef VP_STATUS
+(NTAPI *PMINIPORT_QUERY_DEVICE_ROUTINE)(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Context,
+ IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
+ IN PVOID Identifier,
+ IN ULONG IdentifierLength,
+ IN PVOID ConfigurationData,
+ IN ULONG ConfigurationDataLength,
+ IN OUT PVOID ComponentInformation,
+ IN ULONG ComponentInformationLength);
-typedef struct _VPOSVERSIONINFO {
- IN ULONG Size;
- OUT ULONG MajorVersion;
- OUT ULONG MinorVersion;
- OUT ULONG BuildNumber;
- OUT USHORT ServicePackMajor;
- OUT USHORT ServicePackMinor;
-} VPOSVERSIONINFO, *PVPOSVERSIONINFO;
+typedef VP_STATUS
+(NTAPI *PMINIPORT_GET_REGISTRY_ROUTINE)(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Context,
+ IN OUT PWSTR ValueName,
+ IN OUT PVOID ValueData,
+ IN ULONG ValueLength);
+typedef VOID
+(NTAPI *PMINIPORT_DPC_ROUTINE)(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Context);
+typedef BOOLEAN
+(NTAPI *PMINIPORT_SYNCHRONIZE_ROUTINE)(
+ IN PVOID Context);
-/* Video port functions for miniports */
+typedef VOID
+(NTAPI *PVIDEO_BUGCHECK_CALLBACK)(
+ IN PVOID HwDeviceExtension,
+ IN ULONG BugcheckCode,
+ IN PUCHAR Buffer,
+ IN ULONG BufferSize);
-VPAPI
-VOID
-NTAPI
-VideoPortAcquireDeviceLock(
- IN PVOID HwDeviceExtension);
-
-VPAPI
-VOID
-NTAPI
-VideoPortAcquireSpinLock(
- IN PVOID HwDeviceExtension,
- IN PSPIN_LOCK SpinLock,
- OUT PUCHAR OldIrql);
-
-VPAPI
-VOID
-NTAPI
-VideoPortAcquireSpinLockAtDpcLevel(
- IN PVOID HwDeviceExtension,
- IN PSPIN_LOCK SpinLock);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortAllocateBuffer(
- IN PVOID HwDeviceExtension,
- IN ULONG Size,
- OUT PVOID *Buffer);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortAllocateCommonBuffer(
- IN PVOID HwDeviceExtension,
- IN PVP_DMA_ADAPTER VpDmaAdapter,
- IN ULONG DesiredLength,
- OUT PPHYSICAL_ADDRESS LogicalAddress,
- IN BOOLEAN CacheEnabled,
- PVOID Reserved);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortAllocateContiguousMemory(
- IN PVOID HwDeviceExtension,
- IN ULONG NumberOfBytes,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress);
+/* VideoPortSynchronizeExecution.Priority constants */
+typedef enum VIDEO_SYNCHRONIZE_PRIORITY {
+ VpLowPriority = 0,
+ VpMediumPriority,
+ VpHighPriority
+} VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY;
/* VideoPortAllocatePool.PoolType constants */
typedef enum _VP_POOL_TYPE {
@@ -684,342 +545,97 @@ typedef enum _VP_POOL_TYPE {
VpPagedPoolCacheAligned
} VP_POOL_TYPE, *PVP_POOL_TYPE;
-VPAPI
-PVOID
-NTAPI
-VideoPortAllocatePool(
- IN PVOID HwDeviceExtension,
- IN VP_POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag);
+typedef enum _DMA_FLAGS {
+ VideoPortUnlockAfterDma = 1,
+ VideoPortKeepPagesLocked,
+ VideoPortDmaInitOnly
+} DMA_FLAGS;
-VPAPI
-PDMA
-NTAPI
-VideoPortAssociateEventsWithDmaHandle(
- IN PVOID HwDeviceExtension,
- IN OUT PVIDEO_REQUEST_PACKET pVrp,
- IN PVOID MappedUserEvent,
- IN PVOID DisplayDriverEvent);
+typedef struct _VIDEO_HARDWARE_CONFIGURATION_DATA {
+ INTERFACE_TYPE InterfaceType;
+ ULONG BusNumber;
+ USHORT Version;
+ USHORT Revision;
+ USHORT Irql;
+ USHORT Vector;
+ ULONG ControlBase;
+ ULONG ControlSize;
+ ULONG CursorBase;
+ ULONG CursorSize;
+ ULONG FrameBase;
+ ULONG FrameSize;
+} VIDEO_HARDWARE_CONFIGURATION_DATA, *PVIDEO_HARDWARE_CONFIGURATION_DATA;
-/* VideoPortCheckForDeviceExistence.Flags constants */
-#define CDE_USE_SUBSYSTEM_IDS 0x00000001
-#define CDE_USE_REVISION 0x00000002
+typedef struct _VIDEO_X86_BIOS_ARGUMENTS {
+ ULONG Eax;
+ ULONG Ebx;
+ ULONG Ecx;
+ ULONG Edx;
+ ULONG Esi;
+ ULONG Edi;
+ ULONG Ebp;
+} VIDEO_X86_BIOS_ARGUMENTS, *PVIDEO_X86_BIOS_ARGUMENTS;
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortCheckForDeviceExistence(
- IN PVOID HwDeviceExtension,
- IN USHORT VendorId,
- IN USHORT DeviceId,
- IN UCHAR RevisionId,
- IN USHORT SubVendorId,
- IN USHORT SubSystemId,
- IN ULONG Flags);
+typedef enum VIDEO_DEBUG_LEVEL {
+ Error = 0,
+ Warn,
+ Trace,
+ Info
+} VIDEO_DEBUG_LEVEL, *PVIDEO_DEBUG_LEVEL;
-VPAPI
-VOID
-NTAPI
-VideoPortClearEvent(
- IN PVOID HwDeviceExtension,
- IN PEVENT pEvent);
+#ifndef _NTOS_
-VPAPI
-ULONG
-NTAPI
-VideoPortCompareMemory(
- IN PVOID Source1,
- IN PVOID Source2,
- IN ULONG Length);
+typedef VP_STATUS
+(NTAPI *PDRIVER_IO_PORT_UCHAR)(
+ IN ULONG_PTR Context,
+ IN ULONG Port,
+ IN UCHAR AccessMode,
+ IN PUCHAR Data);
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortCompleteDma(
- IN PVOID HwDeviceExtension,
- IN PVP_DMA_ADAPTER VpDmaAdapter,
- IN PVP_SCATTER_GATHER_LIST VpScatterGather,
- IN BOOLEAN WriteToDevice);
+typedef VP_STATUS
+(NTAPI *PDRIVER_IO_PORT_UCHAR_STRING)(
+ IN ULONG_PTR Context,
+ IN ULONG Port,
+ IN UCHAR AccessMode,
+ IN PUCHAR Data,
+ IN ULONG DataLength);
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortCreateEvent(
- IN PVOID HwDeviceExtension,
- IN ULONG EventFlag,
- IN PVOID Unused,
- OUT PEVENT *ppEvent);
+typedef VP_STATUS
+(NTAPI *PDRIVER_IO_PORT_ULONG)(
+ IN ULONG_PTR Context,
+ IN ULONG Port,
+ IN UCHAR AccessMode,
+ IN PULONG Data);
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortCreateSecondaryDisplay(
- IN PVOID HwDeviceExtension,
- IN OUT PVOID *SecondaryDeviceExtension,
- IN ULONG ulFlag);
+typedef VP_STATUS
+(NTAPI *PDRIVER_IO_PORT_ULONG_STRING)(
+ IN ULONG_PTR Context,
+ IN ULONG Port,
+ IN UCHAR AccessMode,
+ IN PULONG Data,
+ IN ULONG DataLength);
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortCreateSpinLock(
- IN PVOID HwDeviceExtension,
- OUT PSPIN_LOCK *SpinLock);
+typedef VP_STATUS
+(NTAPI *PDRIVER_IO_PORT_USHORT)(
+ IN ULONG_PTR Context,
+ IN ULONG Port,
+ IN UCHAR AccessMode,
+ IN PUSHORT Data);
-typedef struct _DDC_CONTROL {
- IN ULONG Size;
- IN I2C_CALLBACKS I2CCallbacks;
- IN UCHAR EdidSegment;
-} DDC_CONTROL, *PDDC_CONTROL;
+typedef VP_STATUS
+(NTAPI *PDRIVER_IO_PORT_USHORT_STRING)(
+ IN ULONG_PTR Context,
+ IN ULONG Port,
+ IN UCHAR AccessMode,
+ IN PUSHORT Data,
+ IN ULONG DataLength);
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortDDCMonitorHelper(
- IN PVOID HwDeviceExtension,
- IN PVOID DDCControl,
- IN OUT PUCHAR EdidBuffer,
- IN ULONG EdidBufferSize);
+#endif /* _NTOS_ */
-VPAPI
-VOID
-__cdecl
-VideoPortDebugPrint(
- IN VIDEO_DEBUG_LEVEL DebugPrintLevel,
- IN PCHAR DebugMessage,
- IN ...);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortDeleteEvent(
- IN PVOID HwDeviceExtension,
- IN PEVENT pEvent);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortDeleteSpinLock(
- IN PVOID HwDeviceExtension,
- IN PSPIN_LOCK SpinLock);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortDisableInterrupt(
- IN PVOID HwDeviceExtension);
-
-VPAPI
-PDMA
-NTAPI
-VideoPortDoDma(
- IN PVOID HwDeviceExtension,
- IN PDMA pDma,
- IN DMA_FLAGS DmaFlags);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortEnableInterrupt(
- IN PVOID HwDeviceExtension);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortEnumerateChildren(
- IN PVOID HwDeviceExtension,
- IN PVOID Reserved);
-
-VPAPI
-VOID
-NTAPI
-VideoPortFreeCommonBuffer(
- IN PVOID HwDeviceExtension,
- IN ULONG Length,
- IN PVOID VirtualAddress,
- IN PHYSICAL_ADDRESS LogicalAddress,
- IN BOOLEAN CacheEnabled);
-
-VPAPI
-VOID
-NTAPI
-VideoPortFreeDeviceBase(
- IN PVOID HwDeviceExtension,
- IN PVOID MappedAddress);
-
-VPAPI
-VOID
-NTAPI
-VideoPortFreePool(
- IN PVOID HwDeviceExtension,
- IN PVOID Ptr);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortGetAccessRanges(
- IN PVOID HwDeviceExtension,
- IN ULONG NumRequestedResources,
- IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
- IN ULONG NumAccessRanges,
- OUT PVIDEO_ACCESS_RANGE AccessRanges,
- IN PVOID VendorId,
- IN PVOID DeviceId,
- OUT PULONG Slot);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortGetAssociatedDeviceExtension(
- IN PVOID DeviceObject);
-
-VPAPI
-ULONG
-NTAPI
-VideoPortGetAssociatedDeviceID(
- IN PVOID DeviceObject);
-
-VPAPI
-ULONG
-NTAPI
-VideoPortGetBusData(
- IN PVOID HwDeviceExtension,
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG SlotNumber,
- IN OUT PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-VPAPI
-ULONG
-NTAPI
-VideoPortGetBytesUsed(
- IN PVOID HwDeviceExtension,
- IN PDMA pDma);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortGetCommonBuffer(
- IN PVOID HwDeviceExtension,
- IN ULONG DesiredLength,
- IN ULONG Alignment,
- OUT PPHYSICAL_ADDRESS LogicalAddress,
- OUT PULONG pActualLength,
- IN BOOLEAN CacheEnabled);
-
-VPAPI
-UCHAR
-NTAPI
-VideoPortGetCurrentIrql(
- VOID);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortGetDeviceBase(
- IN PVOID HwDeviceExtension,
- IN PHYSICAL_ADDRESS IoAddress,
- IN ULONG NumberOfUchars,
- IN UCHAR InIoSpace);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortGetDeviceData(
- IN PVOID HwDeviceExtension,
- IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
- IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
- IN PVOID Context);
-
-VPAPI
-PVP_DMA_ADAPTER
-NTAPI
-VideoPortGetDmaAdapter(
- IN PVOID HwDeviceExtension,
- IN PVP_DEVICE_DESCRIPTION VpDeviceDescription);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortGetDmaContext(
- IN PVOID HwDeviceExtension,
- IN PDMA pDma);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortGetMdl(
- IN PVOID HwDeviceExtension,
- IN PDMA pDma);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortGetRegistryParameters(
- IN PVOID HwDeviceExtension,
- IN PWSTR ParameterName,
- IN UCHAR IsParameterFileName,
- IN PMINIPORT_GET_REGISTRY_ROUTINE CallbackRoutine,
- IN PVOID Context);
-
-VPAPI
-PVOID
-NTAPI
-VideoPortGetRomImage(
- IN PVOID HwDeviceExtension,
- IN PVOID Unused1,
- IN ULONG Unused2,
- IN ULONG Length);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortGetVersion(
- IN PVOID HwDeviceExtension,
- IN OUT PVPOSVERSIONINFO pVpOsVersionInfo);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortGetVgaStatus(
- IN PVOID HwDeviceExtension,
- OUT PULONG VgaStatus);
-
-VPAPI
-ULONG
-NTAPI
-VideoPortInitialize(
- IN PVOID Argument1,
- IN PVOID Argument2,
- IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
- IN PVOID HwContext);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortInt10(
- IN PVOID HwDeviceExtension,
- IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments);
-
-VPAPI
-LONG
-FASTCALL
-VideoPortInterlockedDecrement(
- IN PLONG Addend);
-
-VPAPI
-LONG
-FASTCALL
-VideoPortInterlockedExchange(
- IN OUT PLONG Target,
- IN LONG Value);
-
-VPAPI
-LONG
-FASTCALL
-VideoPortInterlockedIncrement(
- IN PLONG Addend);
+typedef struct __VRB_SG {
+ __int64 PhysicalAddress;
+ ULONG Length;
+} VRB_SG, *PVRB_SG;
typedef enum _VP_LOCK_OPERATION {
VpReadAccess = 0,
@@ -1027,101 +643,417 @@ typedef enum _VP_LOCK_OPERATION {
VpModifyAccess
} VP_LOCK_OPERATION;
-VPAPI
-PVOID
-NTAPI
-VideoPortLockBuffer(
- IN PVOID HwDeviceExtension,
- IN PVOID BaseAddress,
- IN ULONG Length,
- IN VP_LOCK_OPERATION Operation);
+typedef struct _VP_DEVICE_DESCRIPTION {
+ BOOLEAN ScatterGather;
+ BOOLEAN Dma32BitAddresses;
+ BOOLEAN Dma64BitAddresses;
+ ULONG MaximumLength;
+} VP_DEVICE_DESCRIPTION, *PVP_DEVICE_DESCRIPTION;
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortLockPages(
- IN PVOID HwDeviceExtension,
- IN OUT PVIDEO_REQUEST_PACKET pVrp,
- IN OUT PEVENT pUEvent,
- IN PEVENT pDisplayEvent,
- IN DMA_FLAGS DmaFlags);
+typedef struct _VIDEO_CHILD_STATE {
+ ULONG Id;
+ ULONG State;
+} VIDEO_CHILD_STATE, *PVIDEO_CHILD_STATE;
-VPAPI
-VOID
-NTAPI
-VideoPortLogError(
- IN PVOID HwDeviceExtension,
- IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL,
- IN VP_STATUS ErrorCode,
- IN ULONG UniqueId);
+typedef struct _VIDEO_CHILD_STATE_CONFIGURATION {
+ ULONG Count;
+ VIDEO_CHILD_STATE ChildStateArray[ANYSIZE_ARRAY];
+} VIDEO_CHILD_STATE_CONFIGURATION, *PVIDEO_CHILD_STATE_CONFIGURATION;
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortMapBankedMemory(
- IN PVOID HwDeviceExtension,
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN OUT PULONG Length,
- PULONG InIoSpace,
- PVOID *VirtualAddress,
- ULONG BankLength,
- UCHAR ReadWriteBank,
- PBANKED_SECTION_ROUTINE BankRoutine,
- PVOID Context);
+typedef struct _VIDEO_HW_INITIALIZATION_DATA {
+ ULONG HwInitDataSize;
+ INTERFACE_TYPE AdapterInterfaceType;
+ PVIDEO_HW_FIND_ADAPTER HwFindAdapter;
+ PVIDEO_HW_INITIALIZE HwInitialize;
+ PVIDEO_HW_INTERRUPT HwInterrupt;
+ PVIDEO_HW_START_IO HwStartIO;
+ ULONG HwDeviceExtensionSize;
+ ULONG StartingDeviceNumber;
+ PVIDEO_HW_RESET_HW HwResetHw;
+ PVIDEO_HW_TIMER HwTimer;
+ PVIDEO_HW_START_DMA HwStartDma;
+ PVIDEO_HW_POWER_SET HwSetPowerState;
+ PVIDEO_HW_POWER_GET HwGetPowerState;
+ PVIDEO_HW_GET_CHILD_DESCRIPTOR HwGetVideoChildDescriptor;
+ PVIDEO_HW_QUERY_INTERFACE HwQueryInterface;
+ ULONG HwChildDeviceExtensionSize;
+ PVIDEO_ACCESS_RANGE HwLegacyResourceList;
+ ULONG HwLegacyResourceCount;
+ PVIDEO_HW_LEGACYRESOURCES HwGetLegacyResources;
+ BOOLEAN AllowEarlyEnumeration;
+ ULONG Reserved;
+} VIDEO_HW_INITIALIZATION_DATA, *PVIDEO_HW_INITIALIZATION_DATA;
-VPAPI
-PDMA
-NTAPI
-VideoPortMapDmaMemory(
- IN PVOID HwDeviceExtension,
- IN PVIDEO_REQUEST_PACKET pVrp,
- IN PHYSICAL_ADDRESS BoardAddress,
- IN PULONG Length,
- IN PULONG InIoSpace,
- IN PVOID MappedUserEvent,
- IN PVOID DisplayDriverEvent,
- IN OUT PVOID *VirtualAddress);
+typedef struct _I2C_FNC_TABLE {
+ IN ULONG Size;
+ IN PVIDEO_WRITE_CLOCK_LINE WriteClockLine;
+ IN PVIDEO_WRITE_DATA_LINE WriteDataLine;
+ IN PVIDEO_READ_CLOCK_LINE ReadClockLine;
+ IN PVIDEO_READ_DATA_LINE ReadDataLine;
+ IN PVIDEO_WAIT_VSYNC_ACTIVE WaitVsync;
+ PVOID Reserved;
+} I2C_FNC_TABLE, *PI2C_FNC_TABLE;
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortMapMemory(
- IN PVOID HwDeviceExtension,
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN OUT PULONG Length,
- IN PULONG InIoSpace,
- IN OUT PVOID *VirtualAddress);
-
-VPAPI
-VOID
-NTAPI
-VideoPortMoveMemory(
- IN PVOID Destination,
- IN PVOID Source,
- IN ULONG Length);
-
-VPAPI
-VOID
-NTAPI
-VideoPortPutDmaAdapter(
- IN PVOID HwDeviceExtension,
- IN PVP_DMA_ADAPTER VpDmaAdapter);
-
-VPAPI
-LONGLONG
-NTAPI
-VideoPortQueryPerformanceCounter(
- IN PVOID HwDeviceExtension,
- OUT PLONGLONG PerformanceFrequency OPTIONAL);
+typedef struct _DDC_CONTROL {
+ IN ULONG Size;
+ IN I2C_CALLBACKS I2CCallbacks;
+ IN UCHAR EdidSegment;
+} DDC_CONTROL, *PDDC_CONTROL;
/* VideoPortQueryServices.ServicesType constants */
typedef enum _VIDEO_PORT_SERVICES {
VideoPortServicesAGP = 1,
VideoPortServicesI2C,
VideoPortServicesHeadless,
- VideoPortServicesInt10
+ VideoPortServicesInt10,
+ VideoPortServicesDebugReport,
+ VideoPortServicesWCMemoryProtection
} VIDEO_PORT_SERVICES;
+typedef struct _VIDEO_PORT_AGP_INTERFACE {
+ SHORT Size;
+ SHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PAGP_RESERVE_PHYSICAL AgpReservePhysical;
+ PAGP_RELEASE_PHYSICAL AgpReleasePhysical;
+ PAGP_COMMIT_PHYSICAL AgpCommitPhysical;
+ PAGP_FREE_PHYSICAL AgpFreePhysical;
+ PAGP_RESERVE_VIRTUAL AgpReserveVirtual;
+ PAGP_RELEASE_VIRTUAL AgpReleaseVirtual;
+ PAGP_COMMIT_VIRTUAL AgpCommitVirtual;
+ PAGP_FREE_VIRTUAL AgpFreeVirtual;
+ ULONGLONG AgpAllocationLimit;
+} VIDEO_PORT_AGP_INTERFACE, *PVIDEO_PORT_AGP_INTERFACE;
+
+typedef struct _VIDEO_PORT_AGP_INTERFACE_2 {
+ IN USHORT Size;
+ IN USHORT Version;
+ OUT PVOID Context;
+ OUT PINTERFACE_REFERENCE InterfaceReference;
+ OUT PINTERFACE_DEREFERENCE InterfaceDereference;
+ OUT PAGP_RESERVE_PHYSICAL AgpReservePhysical;
+ OUT PAGP_RELEASE_PHYSICAL AgpReleasePhysical;
+ OUT PAGP_COMMIT_PHYSICAL AgpCommitPhysical;
+ OUT PAGP_FREE_PHYSICAL AgpFreePhysical;
+ OUT PAGP_RESERVE_VIRTUAL AgpReserveVirtual;
+ OUT PAGP_RELEASE_VIRTUAL AgpReleaseVirtual;
+ OUT PAGP_COMMIT_VIRTUAL AgpCommitVirtual;
+ OUT PAGP_FREE_VIRTUAL AgpFreeVirtual;
+ OUT ULONGLONG AgpAllocationLimit;
+ OUT PAGP_SET_RATE AgpSetRate;
+} VIDEO_PORT_AGP_INTERFACE_2, *PVIDEO_PORT_AGP_INTERFACE_2;
+
+typedef struct _VIDEO_PORT_I2C_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PI2C_START I2CStart;
+ PI2C_STOP I2CStop;
+ PI2C_WRITE I2CWrite;
+ PI2C_READ I2CRead;
+} VIDEO_PORT_I2C_INTERFACE, *PVIDEO_PORT_I2C_INTERFACE;
+
+typedef struct _VIDEO_PORT_I2C_INTERFACE_2 {
+ IN USHORT Size;
+ IN USHORT Version;
+ OUT PVOID Context;
+ OUT PINTERFACE_REFERENCE InterfaceReference;
+ OUT PINTERFACE_DEREFERENCE InterfaceDereference;
+ OUT PI2C_START_2 I2CStart;
+ OUT PI2C_STOP_2 I2CStop;
+ OUT PI2C_WRITE_2 I2CWrite;
+ OUT PI2C_READ_2 I2CRead;
+} VIDEO_PORT_I2C_INTERFACE_2, *PVIDEO_PORT_I2C_INTERFACE_2;
+
+typedef struct _VIDEO_PORT_INT10_INTERFACE {
+ IN USHORT Size;
+ IN USHORT Version;
+ OUT PVOID Context;
+ OUT PINTERFACE_REFERENCE InterfaceReference;
+ OUT PINTERFACE_DEREFERENCE InterfaceDereference;
+ OUT PINT10_ALLOCATE_BUFFER Int10AllocateBuffer;
+ OUT PINT10_FREE_BUFFER Int10FreeBuffer;
+ OUT PINT10_READ_MEMORY Int10ReadMemory;
+ OUT PINT10_WRITE_MEMORY Int10WriteMemory;
+ OUT PINT10_CALL_BIOS Int10CallBios;
+} VIDEO_PORT_INT10_INTERFACE, *PVIDEO_PORT_INT10_INTERFACE;
+
+typedef struct _VIDEO_PORT_WCMEMORYPROTECTION_INTERFACE {
+ IN USHORT Size;
+ IN USHORT Version;
+ OUT PVOID Context;
+ OUT PINTERFACE_REFERENCE InterfaceReference;
+ OUT PINTERFACE_DEREFERENCE InterfaceDereference;
+ OUT PROTECT_WC_MEMORY VideoPortProtectWCMemory;
+ OUT RESTORE_WC_MEMORY VideoPortRestoreWCMemory;
+} VIDEO_PORT_WCMEMORYPROTECTION_INTERFACE, *PVIDEO_PORT_WCMEMORYPROTECTION_INTERFACE;
+
+typedef struct _VPOSVERSIONINFO {
+ IN ULONG Size;
+ OUT ULONG MajorVersion;
+ OUT ULONG MinorVersion;
+ OUT ULONG BuildNumber;
+ OUT USHORT ServicePackMajor;
+ OUT USHORT ServicePackMinor;
+} VPOSVERSIONINFO, *PVPOSVERSIONINFO;
+
+typedef struct _VIDEO_PORT_DEBUG_REPORT_INTERFACE {
+ IN USHORT Size;
+ IN USHORT Version;
+ OUT PVOID Context;
+ OUT PINTERFACE_REFERENCE InterfaceReference;
+ OUT PINTERFACE_DEREFERENCE InterfaceDereference;
+ OUT PVIDEO_DEBUG_REPORT (*DbgReportCreate)(
+ IN PVOID HwDeviceExtension,
+ IN ULONG ulCode,
+ IN ULONG_PTR ulpArg1,
+ IN ULONG_PTR ulpArg2,
+ IN ULONG_PTR ulpArg3,
+ IN ULONG_PTR ulpArg4
+ );
+ OUT BOOLEAN (*DbgReportSecondaryData)(
+ IN OUT PVIDEO_DEBUG_REPORT pReport,
+ IN PVOID pvData,
+ IN ULONG ulDataSize
+ );
+ OUT VOID (*DbgReportComplete)(
+ IN OUT PVIDEO_DEBUG_REPORT pReport
+ );
+} VIDEO_PORT_DEBUG_REPORT_INTERFACE, *PVIDEO_PORT_DEBUG_REPORT_INTERFACE;
+
+/* Video port functions for miniports */
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortAllocateBuffer(
+ IN PVOID HwDeviceExtension,
+ IN ULONG Size,
+ OUT PVOID *Buffer);
+
+VPAPI
+VOID
+NTAPI
+VideoPortAcquireDeviceLock(
+ IN PVOID HwDeviceExtension);
+
+VPAPI
+ULONG
+NTAPI
+VideoPortCompareMemory(
+ IN PVOID Source1,
+ IN PVOID Source2,
+ IN SIZE_T Length);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortDDCMonitorHelper(
+ IN PVOID HwDeviceExtension,
+ IN PVOID DDCControl,
+ IN OUT PUCHAR EdidBuffer,
+ IN ULONG EdidBufferSize);
+
+VPAPI
+VOID
+__cdecl
+VideoPortDebugPrint(
+ IN VIDEO_DEBUG_LEVEL DebugPrintLevel,
+ IN PSTR DebugMessage,
+ IN ...);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortDisableInterrupt(
+ IN PVOID HwDeviceExtension);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortEnableInterrupt(
+ IN PVOID HwDeviceExtension);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortEnumerateChildren(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Reserved);
+
+VPAPI
+VOID
+NTAPI
+VideoPortFreeDeviceBase(
+ IN PVOID HwDeviceExtension,
+ IN PVOID MappedAddress);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortGetAccessRanges(
+ IN PVOID HwDeviceExtension,
+ IN ULONG NumRequestedResources,
+ IN PIO_RESOURCE_DESCRIPTOR RequestedResources OPTIONAL,
+ IN ULONG NumAccessRanges,
+ OUT PVIDEO_ACCESS_RANGE AccessRanges,
+ IN PVOID VendorId,
+ IN PVOID DeviceId,
+ OUT PULONG Slot);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortGetAssociatedDeviceExtension(
+ IN PVOID DeviceObject);
+
+VPAPI
+ULONG
+NTAPI
+VideoPortGetBusData(
+ IN PVOID HwDeviceExtension,
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG SlotNumber,
+ IN OUT PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
+
+VPAPI
+UCHAR
+NTAPI
+VideoPortGetCurrentIrql(VOID);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortGetDeviceBase(
+ IN PVOID HwDeviceExtension,
+ IN PHYSICAL_ADDRESS IoAddress,
+ IN ULONG NumberOfUchars,
+ IN UCHAR InIoSpace);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortGetDeviceData(
+ IN PVOID HwDeviceExtension,
+ IN VIDEO_DEVICE_DATA_TYPE DeviceDataType,
+ IN PMINIPORT_QUERY_DEVICE_ROUTINE CallbackRoutine,
+ IN PVOID Context);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortGetRegistryParameters(
+ IN PVOID HwDeviceExtension,
+ IN PWSTR ParameterName,
+ IN UCHAR IsParameterFileName,
+ IN PMINIPORT_GET_REGISTRY_ROUTINE CallbackRoutine,
+ IN PVOID Context);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortGetRomImage(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Unused1,
+ IN ULONG Unused2,
+ IN ULONG Length);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortGetVgaStatus(
+ IN PVOID HwDeviceExtension,
+ OUT PULONG VgaStatus);
+
+VPAPI
+LONG
+FASTCALL
+VideoPortInterlockedDecrement(
+ IN PLONG Addend);
+
+VPAPI
+LONG
+FASTCALL
+VideoPortInterlockedExchange(
+ IN OUT PLONG Target,
+ IN LONG Value);
+
+VPAPI
+LONG
+FASTCALL
+VideoPortInterlockedIncrement(
+ IN PLONG Addend);
+
+VPAPI
+ULONG
+NTAPI
+VideoPortInitialize(
+ IN PVOID Argument1,
+ IN PVOID Argument2,
+ IN PVIDEO_HW_INITIALIZATION_DATA HwInitializationData,
+ IN PVOID HwContext);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortInt10(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_X86_BIOS_ARGUMENTS BiosArguments);
+
+VPAPI
+VOID
+NTAPI
+VideoPortLogError(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_REQUEST_PACKET Vrp OPTIONAL,
+ IN VP_STATUS ErrorCode,
+ IN ULONG UniqueId);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortMapBankedMemory(
+ IN PVOID HwDeviceExtension,
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN OUT PULONG Length,
+ PULONG InIoSpace,
+ PVOID *VirtualAddress,
+ ULONG BankLength,
+ UCHAR ReadWriteBank,
+ PBANKED_SECTION_ROUTINE BankRoutine,
+ PVOID Context);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortMapMemory(
+ IN PVOID HwDeviceExtension,
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN OUT PULONG Length,
+ IN PULONG InIoSpace,
+ IN OUT PVOID *VirtualAddress);
+
+VPAPI
+VOID
+NTAPI
+VideoPortMoveMemory(
+ IN PVOID Destination,
+ IN PVOID Source,
+ IN ULONG Length);
+
+VPAPI
+LONGLONG
+NTAPI
+VideoPortQueryPerformanceCounter(
+ IN PVOID HwDeviceExtension,
+ OUT PLONGLONG PerformanceFrequency OPTIONAL);
+
VPAPI
VP_STATUS
NTAPI
@@ -1130,432 +1062,687 @@ VideoPortQueryServices(
IN VIDEO_PORT_SERVICES ServicesType,
IN OUT PINTERFACE Interface);
-VPAPI
-VOID
-NTAPI
-VideoPortQuerySystemTime(
- OUT PLARGE_INTEGER CurrentTime);
-
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortIsNoVesa(
- VOID
-);
-
VPAPI
BOOLEAN
NTAPI
VideoPortQueueDpc(
- IN PVOID HwDeviceExtension,
- IN PMINIPORT_DPC_ROUTINE CallbackRoutine,
- IN PVOID Context);
+ IN PVOID HwDeviceExtension,
+ IN PMINIPORT_DPC_ROUTINE CallbackRoutine,
+ IN PVOID Context);
VPAPI
VOID
NTAPI
VideoPortReadPortBufferUchar(
- IN PUCHAR Port,
- OUT PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Port,
+ OUT PUCHAR Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortReadPortBufferUlong(
- IN PULONG Port,
- OUT PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Port,
+ OUT PULONG Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortReadPortBufferUshort(
- IN PUSHORT Port,
- OUT PUSHORT Buffer,
- IN ULONG Count);
+ IN PUSHORT Port,
+ OUT PUSHORT Buffer,
+ IN ULONG Count);
VPAPI
UCHAR
NTAPI
VideoPortReadPortUchar(
- IN PUCHAR Port);
+ IN PUCHAR Port);
VPAPI
ULONG
NTAPI
VideoPortReadPortUlong(
- IN PULONG Port);
+ IN PULONG Port);
VPAPI
USHORT
NTAPI
VideoPortReadPortUshort(
- IN PUSHORT Port);
+ IN PUSHORT Port);
VPAPI
VOID
NTAPI
VideoPortReadRegisterBufferUchar(
- IN PUCHAR Register,
- OUT PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Register,
+ OUT PUCHAR Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortReadRegisterBufferUlong(
- IN PULONG Register,
- OUT PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Register,
+ OUT PULONG Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortReadRegisterBufferUshort(
- IN PUSHORT Register,
- OUT PUSHORT Buffer,
- IN ULONG Count);
+ IN PUSHORT Register,
+ OUT PUSHORT Buffer,
+ IN ULONG Count);
VPAPI
UCHAR
NTAPI
VideoPortReadRegisterUchar(
- IN PUCHAR Register);
+ IN PUCHAR Register);
VPAPI
ULONG
NTAPI
VideoPortReadRegisterUlong(
- IN PULONG Register);
+ IN PULONG Register);
VPAPI
USHORT
NTAPI
VideoPortReadRegisterUshort(
- IN PUSHORT Register);
-
-VPAPI
-LONG
-NTAPI
-VideoPortReadStateEvent(
- IN PVOID HwDeviceExtension,
- IN PEVENT pEvent);
+ IN PUSHORT Register);
VPAPI
VOID
NTAPI
VideoPortReleaseBuffer(
- IN PVOID HwDeviceExtension,
- IN PVOID Buffer);
-
-VPAPI
-VOID
-NTAPI
-VideoPortReleaseCommonBuffer(
- IN PVOID HwDeviceExtension,
- IN PVP_DMA_ADAPTER VpDmaAdapter,
- IN ULONG Length,
- IN PHYSICAL_ADDRESS LogicalAddress,
- IN PVOID VirtualAddress,
- IN BOOLEAN CacheEnabled);
+ IN PVOID HwDeviceExtension,
+ IN PVOID Buffer);
VPAPI
VOID
NTAPI
VideoPortReleaseDeviceLock(
- IN PVOID HwDeviceExtension);
-
-VPAPI
-VOID
-NTAPI
-VideoPortReleaseSpinLock(
- IN PVOID HwDeviceExtension,
- IN PSPIN_LOCK SpinLock,
- IN UCHAR NewIrql);
-
-VPAPI
-VOID
-NTAPI
-VideoPortReleaseSpinLockFromDpcLevel(
- IN PVOID HwDeviceExtension,
- IN PSPIN_LOCK SpinLock);
+ IN PVOID HwDeviceExtension);
VPAPI
BOOLEAN
NTAPI
VideoPortScanRom(
- PVOID HwDeviceExtension,
- PUCHAR RomBase,
- ULONG RomLength,
- PUCHAR String);
+ PVOID HwDeviceExtension,
+ PUCHAR RomBase,
+ ULONG RomLength,
+ PUCHAR String);
VPAPI
ULONG
NTAPI
VideoPortSetBusData(
- IN PVOID HwDeviceExtension,
- IN BUS_DATA_TYPE BusDataType,
- IN ULONG SlotNumber,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
-
-VPAPI
-VOID
-NTAPI
-VideoPortSetBytesUsed(
- IN PVOID HwDeviceExtension,
- IN OUT PDMA pDma,
- IN ULONG BytesUsed);
-
-VPAPI
-VOID
-NTAPI
-VideoPortSetDmaContext(
- IN PVOID HwDeviceExtension,
- OUT PDMA pDma,
- IN PVOID InstanceContext);
-
-VPAPI
-LONG
-NTAPI
-VideoPortSetEvent(
- IN PVOID HwDeviceExtension,
- IN PEVENT pEvent);
+ IN PVOID HwDeviceExtension,
+ IN BUS_DATA_TYPE BusDataType,
+ IN ULONG SlotNumber,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
VPAPI
VP_STATUS
NTAPI
VideoPortSetRegistryParameters(
- IN PVOID HwDeviceExtension,
- IN PWSTR ValueName,
- IN PVOID ValueData,
- IN ULONG ValueLength);
+ IN PVOID HwDeviceExtension,
+ IN PWSTR ValueName,
+ IN PVOID ValueData,
+ IN ULONG ValueLength);
VPAPI
VP_STATUS
NTAPI
VideoPortSetTrappedEmulatorPorts(
- IN PVOID HwDeviceExtension,
- IN ULONG NumAccessRanges,
- IN PVIDEO_ACCESS_RANGE AccessRange);
-
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortSignalDmaComplete(
- IN PVOID HwDeviceExtension,
- IN PDMA pDmaHandle);
+ IN PVOID HwDeviceExtension,
+ IN ULONG NumAccessRanges,
+ IN PVIDEO_ACCESS_RANGE AccessRange);
VPAPI
VOID
NTAPI
VideoPortStallExecution(
- IN ULONG Microseconds);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortStartDma(
- IN PVOID HwDeviceExtension,
- IN PVP_DMA_ADAPTER VpDmaAdapter,
- IN PVOID Mdl,
- IN ULONG Offset,
- IN OUT PULONG pLength,
- IN PEXECUTE_DMA ExecuteDmaRoutine,
- IN PVOID Context,
- IN BOOLEAN WriteToDevice);
+ IN ULONG Microseconds);
VPAPI
VOID
NTAPI
VideoPortStartTimer(
- IN PVOID HwDeviceExtension);
+ IN PVOID HwDeviceExtension);
VPAPI
VOID
NTAPI
VideoPortStopTimer(
- IN PVOID HwDeviceExtension);
-
-/* VideoPortSynchronizeExecution.Priority constants */
-typedef enum VIDEO_SYNCHRONIZE_PRIORITY {
- VpLowPriority = 0,
- VpMediumPriority,
- VpHighPriority
-} VIDEO_SYNCHRONIZE_PRIORITY, *PVIDEO_SYNCHRONIZE_PRIORITY;
+ IN PVOID HwDeviceExtension);
VPAPI
BOOLEAN
NTAPI
VideoPortSynchronizeExecution(
- IN PVOID HwDeviceExtension,
- IN VIDEO_SYNCHRONIZE_PRIORITY Priority,
- IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine,
- IN PVOID Context);
-
-VPAPI
-VOID
-NTAPI
-VideoPortUnLockBuffer(
- IN PVOID HwDeviceExtension,
- IN PVOID Mdl);
-
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortUnlockPages(
- IN PVOID hwDeviceExtension,
- IN OUT PDMA pDma);
-
-VPAPI
-BOOLEAN
-NTAPI
-VideoPortUnmapDmaMemory(
- IN PVOID HwDeviceExtension,
- IN PVOID VirtualAddress,
- IN HANDLE ProcessHandle,
- IN PDMA BoardMemoryHandle);
+ IN PVOID HwDeviceExtension,
+ IN VIDEO_SYNCHRONIZE_PRIORITY Priority,
+ IN PMINIPORT_SYNCHRONIZE_ROUTINE SynchronizeRoutine,
+ IN PVOID Context);
VPAPI
VP_STATUS
NTAPI
VideoPortUnmapMemory(
- IN PVOID HwDeviceExtension,
- IN OUT PVOID VirtualAddress,
- IN HANDLE ProcessHandle);
+ IN PVOID HwDeviceExtension,
+ IN OUT PVOID VirtualAddress,
+ IN HANDLE ProcessHandle);
VPAPI
VP_STATUS
NTAPI
VideoPortVerifyAccessRanges(
- IN PVOID HwDeviceExtension,
- IN ULONG NumAccessRanges,
- IN PVIDEO_ACCESS_RANGE AccessRanges);
-
-VPAPI
-VP_STATUS
-NTAPI
-VideoPortWaitForSingleObject(
- IN PVOID HwDeviceExtension,
- IN PVOID Object,
- IN PLARGE_INTEGER Timeout OPTIONAL);
+ IN PVOID HwDeviceExtension,
+ IN ULONG NumAccessRanges,
+ IN PVIDEO_ACCESS_RANGE AccessRanges);
VPAPI
VOID
NTAPI
VideoPortWritePortBufferUchar(
- IN PUCHAR Port,
- IN PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Port,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortWritePortBufferUlong(
- IN PULONG Port,
- IN PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortWritePortBufferUshort(
- IN PUSHORT Port,
- IN PUSHORT Buffer,
- IN ULONG Count);
+ IN PUSHORT Port,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortWritePortUchar(
- IN PUCHAR Port,
- IN UCHAR Value);
+ IN PUCHAR Port,
+ IN UCHAR Value);
VPAPI
VOID
NTAPI
VideoPortWritePortUlong(
- IN PULONG Port,
- IN ULONG Value);
+ IN PULONG Port,
+ IN ULONG Value);
VPAPI
VOID
NTAPI
VideoPortWritePortUshort(
- IN PUSHORT Port,
- IN USHORT Value);
+ IN PUSHORT Port,
+ IN USHORT Value);
VPAPI
VOID
NTAPI
VideoPortWriteRegisterBufferUchar(
- IN PUCHAR Register,
- IN PUCHAR Buffer,
- IN ULONG Count);
+ IN PUCHAR Register,
+ IN PUCHAR Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortWriteRegisterBufferUlong(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortWriteRegisterBufferUshort(
- IN PUSHORT Register,
- IN PUSHORT Buffer,
- IN ULONG Count);
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count);
VPAPI
VOID
NTAPI
VideoPortWriteRegisterUchar(
- IN PUCHAR Register,
- IN UCHAR Value);
+ IN PUCHAR Register,
+ IN UCHAR Value);
VPAPI
VOID
NTAPI
VideoPortWriteRegisterUlong(
- IN PULONG Register,
- IN ULONG Value);
+ IN PULONG Register,
+ IN ULONG Value);
VPAPI
VOID
NTAPI
VideoPortWriteRegisterUshort(
- IN PUSHORT Register,
- IN USHORT Value);
+ IN PUSHORT Register,
+ IN USHORT Value);
VPAPI
VOID
NTAPI
VideoPortZeroDeviceMemory(
- IN PVOID Destination,
- IN ULONG Length);
+ IN PVOID Destination,
+ IN ULONG Length);
VPAPI
VOID
NTAPI
VideoPortZeroMemory(
- IN PVOID Destination,
- IN ULONG Length);
+ IN PVOID Destination,
+ IN ULONG Length);
-#if DBG
-#define VideoDebugPrint(x) VideoPortDebugPrint x
-#else
-#define VideoDebugPrint(x)
-#endif
+VPAPI
+PVOID
+NTAPI
+VideoPortAllocateContiguousMemory(
+ IN PVOID HwDeviceExtension,
+ IN ULONG NumberOfBytes,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortGetCommonBuffer(
+ IN PVOID HwDeviceExtension,
+ IN ULONG DesiredLength,
+ IN ULONG Alignment,
+ OUT PPHYSICAL_ADDRESS LogicalAddress,
+ OUT PULONG pActualLength,
+ IN BOOLEAN CacheEnabled);
+
+VPAPI
+VOID
+NTAPI
+VideoPortFreeCommonBuffer(
+ IN PVOID HwDeviceExtension,
+ IN ULONG Length,
+ IN PVOID VirtualAddress,
+ IN PHYSICAL_ADDRESS LogicalAddress,
+ IN BOOLEAN CacheEnabled);
+
+VPAPI
+PDMA
+NTAPI
+VideoPortDoDma(
+ IN PVOID HwDeviceExtension,
+ IN PDMA pDma,
+ IN DMA_FLAGS DmaFlags);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortLockPages(
+ IN PVOID HwDeviceExtension,
+ IN OUT PVIDEO_REQUEST_PACKET pVrp,
+ IN OUT PEVENT pUEvent,
+ IN PEVENT pDisplayEvent,
+ IN DMA_FLAGS DmaFlags);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortUnlockPages(
+ IN PVOID hwDeviceExtension,
+ IN OUT PDMA pDma);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortSignalDmaComplete(
+ IN PVOID HwDeviceExtension,
+ IN PDMA pDmaHandle);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortGetMdl(
+ IN PVOID HwDeviceExtension,
+ IN PDMA pDma);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortGetDmaContext(
+ IN PVOID HwDeviceExtension,
+ IN PDMA pDma);
+
+VPAPI
+VOID
+NTAPI
+VideoPortSetDmaContext(
+ IN PVOID HwDeviceExtension,
+ OUT PDMA pDma,
+ IN PVOID InstanceContext);
+
+VPAPI
+ULONG
+NTAPI
+VideoPortGetBytesUsed(
+ IN PVOID HwDeviceExtension,
+ IN PDMA pDma);
+
+VPAPI
+VOID
+NTAPI
+VideoPortSetBytesUsed(
+ IN PVOID HwDeviceExtension,
+ IN OUT PDMA pDma,
+ IN ULONG BytesUsed);
+
+VPAPI
+PDMA
+NTAPI
+VideoPortAssociateEventsWithDmaHandle(
+ IN PVOID HwDeviceExtension,
+ IN OUT PVIDEO_REQUEST_PACKET pVrp,
+ IN PVOID MappedUserEvent,
+ IN PVOID DisplayDriverEvent);
+
+VPAPI
+PDMA
+NTAPI
+VideoPortMapDmaMemory(
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_REQUEST_PACKET pVrp,
+ IN PHYSICAL_ADDRESS BoardAddress,
+ IN PULONG Length,
+ IN PULONG InIoSpace,
+ IN PVOID MappedUserEvent,
+ IN PVOID DisplayDriverEvent,
+ IN OUT PVOID *VirtualAddress);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortUnmapDmaMemory(
+ IN PVOID HwDeviceExtension,
+ IN PVOID VirtualAddress,
+ IN HANDLE ProcessHandle,
+ IN PDMA BoardMemoryHandle);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortCreateSecondaryDisplay(
+ IN PVOID HwDeviceExtension,
+ IN OUT PVOID *SecondaryDeviceExtension,
+ IN ULONG ulFlag);
+
+VPAPI
+PVP_DMA_ADAPTER
+NTAPI
+VideoPortGetDmaAdapter(
+ IN PVOID HwDeviceExtension,
+ IN PVP_DEVICE_DESCRIPTION VpDeviceDescription);
+
+VPAPI
+VOID
+NTAPI
+VideoPortPutDmaAdapter(
+ IN PVOID HwDeviceExtension,
+ IN PVP_DMA_ADAPTER VpDmaAdapter);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortAllocateCommonBuffer(
+ IN PVOID HwDeviceExtension,
+ IN PVP_DMA_ADAPTER VpDmaAdapter,
+ IN ULONG DesiredLength,
+ OUT PPHYSICAL_ADDRESS LogicalAddress,
+ IN BOOLEAN CacheEnabled,
+ PVOID Reserved);
+
+VPAPI
+VOID
+NTAPI
+VideoPortReleaseCommonBuffer(
+ IN PVOID HwDeviceExtension,
+ IN PVP_DMA_ADAPTER VpDmaAdapter,
+ IN ULONG Length,
+ IN PHYSICAL_ADDRESS LogicalAddress,
+ IN PVOID VirtualAddress,
+ IN BOOLEAN CacheEnabled);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortLockBuffer(
+ IN PVOID HwDeviceExtension,
+ IN PVOID BaseAddress,
+ IN ULONG Length,
+ IN VP_LOCK_OPERATION Operation);
+
+VPAPI
+VOID
+NTAPI
+VideoPortUnLockBuffer(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Mdl);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortStartDma(
+ IN PVOID HwDeviceExtension,
+ IN PVP_DMA_ADAPTER VpDmaAdapter,
+ IN PVOID Mdl,
+ IN ULONG Offset,
+ IN OUT PULONG pLength,
+ IN PEXECUTE_DMA ExecuteDmaRoutine,
+ IN PVOID Context,
+ IN BOOLEAN WriteToDevice);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortCompleteDma(
+ IN PVOID HwDeviceExtension,
+ IN PVP_DMA_ADAPTER VpDmaAdapter,
+ IN PVP_SCATTER_GATHER_LIST VpScatterGather,
+ IN BOOLEAN WriteToDevice);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortCreateEvent(
+ IN PVOID HwDeviceExtension,
+ IN ULONG EventFlag,
+ IN PVOID Unused,
+ OUT PEVENT *ppEvent);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortDeleteEvent(
+ IN PVOID HwDeviceExtension,
+ IN PEVENT pEvent);
+
+VPAPI
+LONG
+NTAPI
+VideoPortSetEvent(
+ IN PVOID HwDeviceExtension,
+ IN PEVENT pEvent);
+
+VPAPI
+VOID
+NTAPI
+VideoPortClearEvent(
+ IN PVOID HwDeviceExtension,
+ IN PEVENT pEvent);
+
+VPAPI
+LONG
+NTAPI
+VideoPortReadStateEvent(
+ IN PVOID HwDeviceExtension,
+ IN PEVENT pEvent);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortWaitForSingleObject(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Object,
+ IN PLARGE_INTEGER Timeout OPTIONAL);
+
+VPAPI
+PVOID
+NTAPI
+VideoPortAllocatePool(
+ IN PVOID HwDeviceExtension,
+ IN VP_POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag);
+
+VPAPI
+VOID
+NTAPI
+VideoPortFreePool(
+ IN PVOID HwDeviceExtension,
+ IN PVOID Ptr);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortCreateSpinLock(
+ IN PVOID HwDeviceExtension,
+ OUT PSPIN_LOCK *SpinLock);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortDeleteSpinLock(
+ IN PVOID HwDeviceExtension,
+ IN PSPIN_LOCK SpinLock);
+
+VPAPI
+VOID
+NTAPI
+VideoPortAcquireSpinLock(
+ IN PVOID HwDeviceExtension,
+ IN PSPIN_LOCK SpinLock,
+ OUT PUCHAR OldIrql);
+
+VPAPI
+VOID
+NTAPI
+VideoPortAcquireSpinLockAtDpcLevel(
+ IN PVOID HwDeviceExtension,
+ IN PSPIN_LOCK SpinLock);
+
+VPAPI
+VOID
+NTAPI
+VideoPortReleaseSpinLock(
+ IN PVOID HwDeviceExtension,
+ IN PSPIN_LOCK SpinLock,
+ IN UCHAR NewIrql);
+
+VPAPI
+VOID
+NTAPI
+VideoPortReleaseSpinLockFromDpcLevel(
+ IN PVOID HwDeviceExtension,
+ IN PSPIN_LOCK SpinLock);
+
+VPAPI
+VOID
+NTAPI
+VideoPortQuerySystemTime(
+ OUT PLARGE_INTEGER CurrentTime);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortCheckForDeviceExistence(
+ IN PVOID HwDeviceExtension,
+ IN USHORT VendorId,
+ IN USHORT DeviceId,
+ IN UCHAR RevisionId,
+ IN USHORT SubVendorId,
+ IN USHORT SubSystemId,
+ IN ULONG Flags);
+
+VPAPI
+ULONG
+NTAPI
+VideoPortGetAssociatedDeviceID(
+ IN PVOID DeviceObject);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortFlushRegistry(
+ PVOID HwDeviceExtension);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortGetVersion(
+ IN PVOID HwDeviceExtension,
+ IN OUT PVPOSVERSIONINFO pVpOsVersionInfo);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortIsNoVesa(VOID);
+
+VPAPI
+VP_STATUS
+NTAPI
+VideoPortRegisterBugcheckCallback(
+ IN PVOID HwDeviceExtension,
+ IN ULONG BugcheckCode,
+ IN PVIDEO_BUGCHECK_CALLBACK Callback,
+ IN ULONG BugcheckDataSize);
+
+VPAPI
+PVIDEO_DEBUG_REPORT
+NTAPI
+VideoPortDbgReportCreate(
+ IN PVOID HwDeviceExtension,
+ IN ULONG ulCode,
+ IN ULONG_PTR ulpArg1,
+ IN ULONG_PTR ulpArg2,
+ IN ULONG_PTR ulpArg3,
+ IN ULONG_PTR ulpArg4);
+
+VPAPI
+BOOLEAN
+NTAPI
+VideoPortDbgReportSecondaryData(
+ IN OUT PVIDEO_DEBUG_REPORT pReport,
+ IN PVOID pvData,
+ IN ULONG ulDataSize);
+
+VPAPI
+VOID
+NTAPI
+VideoPortDbgReportComplete(
+ IN OUT PVIDEO_DEBUG_REPORT pReport);
#ifdef __cplusplus
}
#endif
-
-#endif /* defined _WINDDI_ */
-
-#endif /* __VIDEO_H__ */
diff --git a/include/ddk/videoagp.h b/include/ddk/videoagp.h
index 0b6d36d4126..2fb0761c839 100644
--- a/include/ddk/videoagp.h
+++ b/include/ddk/videoagp.h
@@ -20,10 +20,9 @@
*
*/
-#ifndef __VIDEOAGP_H__
-#define __VIDEOAGP_H__
+#pragma once
-#include "video.h"
+#define __VIDEOAGP_H__
#ifdef __cplusplus
extern "C" {
@@ -42,82 +41,79 @@ typedef enum _VIDEO_PORT_CACHE_TYPE {
typedef BOOLEAN
(NTAPI *PAGP_COMMIT_PHYSICAL)(
- IN PVOID HwDeviceExtension,
- IN PVOID PhysicalReserveContext,
- IN ULONG Pages,
- IN ULONG Offset);
+ IN PVOID HwDeviceExtension,
+ IN PVOID PhysicalReserveContext,
+ IN ULONG Pages,
+ IN ULONG Offset);
typedef PVOID
(NTAPI *PAGP_COMMIT_VIRTUAL)(
- IN PVOID HwDeviceExtension,
- IN PVOID VirtualReserveContext,
- IN ULONG Pages,
- IN ULONG Offset);
+ IN PVOID HwDeviceExtension,
+ IN PVOID VirtualReserveContext,
+ IN ULONG Pages,
+ IN ULONG Offset);
typedef VOID
(NTAPI *PAGP_FREE_PHYSICAL)(
- IN PVOID HwDeviceExtension,
- IN PVOID PhysicalReserveContext,
- IN ULONG Pages,
- IN ULONG Offset);
+ IN PVOID HwDeviceExtension,
+ IN PVOID PhysicalReserveContext,
+ IN ULONG Pages,
+ IN ULONG Offset);
typedef VOID
(NTAPI *PAGP_FREE_VIRTUAL)(
- IN PVOID HwDeviceExtension,
- IN PVOID VirtualReserveContext,
- IN ULONG Pages,
- IN ULONG Offset);
+ IN PVOID HwDeviceExtension,
+ IN PVOID VirtualReserveContext,
+ IN ULONG Pages,
+ IN ULONG Offset);
typedef VOID
(NTAPI *PAGP_RELEASE_PHYSICAL)(
- IN PVOID HwDeviceExtension,
- IN PVOID PhysicalReserveContext);
+ IN PVOID HwDeviceExtension,
+ IN PVOID PhysicalReserveContext);
typedef VOID
(NTAPI *PAGP_RELEASE_VIRTUAL)(
- IN PVOID HwDeviceExtension,
- IN PVOID VirtualReserveContext);
+ IN PVOID HwDeviceExtension,
+ IN PVOID VirtualReserveContext);
typedef PHYSICAL_ADDRESS
(NTAPI *PAGP_RESERVE_PHYSICAL)(
- IN PVOID HwDeviceExtension,
- IN ULONG Pages,
+ IN PVOID HwDeviceExtension,
+ IN ULONG Pages,
IN VIDEO_PORT_CACHE_TYPE Caching,
- OUT PVOID *PhysicalReserveContext);
+ OUT PVOID *PhysicalReserveContext);
typedef PVOID
(NTAPI *PAGP_RESERVE_VIRTUAL)(
- IN PVOID HwDeviceExtension,
- IN HANDLE ProcessHandle,
- IN PVOID PhysicalReserveContext,
- OUT PVOID *VirtualReserveContext);
+ IN PVOID HwDeviceExtension,
+ IN HANDLE ProcessHandle,
+ IN PVOID PhysicalReserveContext,
+ OUT PVOID *VirtualReserveContext);
typedef BOOLEAN
(NTAPI *PAGP_SET_RATE)(
- IN PVOID HwDeviceExtension,
- IN ULONG AgpRate);
+ IN PVOID HwDeviceExtension,
+ IN ULONG AgpRate);
typedef struct _VIDEO_PORT_AGP_SERVICES {
- PAGP_RESERVE_PHYSICAL AgpReservePhysical;
- PAGP_RELEASE_PHYSICAL AgpReleasePhysical;
- PAGP_COMMIT_PHYSICAL AgpCommitPhysical;
- PAGP_FREE_PHYSICAL AgpFreePhysical;
- PAGP_RESERVE_VIRTUAL AgpReserveVirtual;
- PAGP_RELEASE_VIRTUAL AgpReleaseVirtual;
- PAGP_COMMIT_VIRTUAL AgpCommitVirtual;
- PAGP_FREE_VIRTUAL AgpFreeVirtual;
- ULONGLONG AllocationLimit;
+ PAGP_RESERVE_PHYSICAL AgpReservePhysical;
+ PAGP_RELEASE_PHYSICAL AgpReleasePhysical;
+ PAGP_COMMIT_PHYSICAL AgpCommitPhysical;
+ PAGP_FREE_PHYSICAL AgpFreePhysical;
+ PAGP_RESERVE_VIRTUAL AgpReserveVirtual;
+ PAGP_RELEASE_VIRTUAL AgpReleaseVirtual;
+ PAGP_COMMIT_VIRTUAL AgpCommitVirtual;
+ PAGP_FREE_VIRTUAL AgpFreeVirtual;
+ ULONGLONG AllocationLimit;
} VIDEO_PORT_AGP_SERVICES, *PVIDEO_PORT_AGP_SERVICES;
-VPAPI
BOOLEAN
NTAPI
VideoPortGetAgpServices(
- IN PVOID HwDeviceExtension,
- IN PVIDEO_PORT_AGP_SERVICES AgpServices);
+ IN PVOID HwDeviceExtension,
+ IN PVIDEO_PORT_AGP_SERVICES AgpServices);
#ifdef __cplusplus
}
#endif
-
-#endif /* __VIDEOAGP_H__ */
diff --git a/include/ddk/wdm.h b/include/ddk/wdm.h
index 3a523235742..44725ead733 100644
--- a/include/ddk/wdm.h
+++ b/include/ddk/wdm.h
@@ -25,6 +25,9 @@
#ifndef _WDMDDK_
#define _WDMDDK_
+#define WDM_MAJORVERSION 0x06
+#define WDM_MINORVERSION 0x00
+
/* Included via ntddk.h? */
#ifndef _NTDDK_
#define _NTDDK_
@@ -124,6 +127,15 @@ extern "C" {
#endif
+#if defined(_WIN64)
+#if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
+#define USE_DMA_MACROS
+#endif
+#ifndef NO_LEGACY_DRIVERS
+#define NO_LEGACY_DRIVERS
+#endif
+#endif /* defined(_WIN64) */
+
/* Forward declarations */
struct _IRP;
struct _MDL;
@@ -153,7 +165,7 @@ typedef struct _KPROCESS *PKPROCESS;
typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
typedef struct _CONTEXT *PCONTEXT;
-#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_))
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
#elif defined(_WDM_INCLUDED_)
typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
@@ -202,38 +214,38 @@ inline int IsEqualGUIDAligned(REFGUID guid1, REFGUID guid2)
static __inline__ BOOLEAN
InterlockedBitTestAndSet(
IN LONG volatile *Base,
- IN LONG Bit)
+ IN LONG Bit)
{
#if defined(_M_IX86)
- LONG OldBit;
- __asm__ __volatile__("lock "
- "btsl %2,%1\n\t"
- "sbbl %0,%0\n\t"
- :"=r" (OldBit),"+m" (*Base)
- :"Ir" (Bit)
- : "memory");
- return OldBit;
+ LONG OldBit;
+ __asm__ __volatile__("lock "
+ "btsl %2,%1\n\t"
+ "sbbl %0,%0\n\t"
+ :"=r" (OldBit),"+m" (*Base)
+ :"Ir" (Bit)
+ : "memory");
+ return OldBit;
#else
- return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
+ return (_InterlockedOr(Base, 1 << Bit) >> Bit) & 1;
#endif
}
static __inline__ BOOLEAN
InterlockedBitTestAndReset(
IN LONG volatile *Base,
- IN LONG Bit)
+ IN LONG Bit)
{
#if defined(_M_IX86)
- LONG OldBit;
- __asm__ __volatile__("lock "
- "btrl %2,%1\n\t"
- "sbbl %0,%0\n\t"
- :"=r" (OldBit),"+m" (*Base)
- :"Ir" (Bit)
- : "memory");
- return OldBit;
+ LONG OldBit;
+ __asm__ __volatile__("lock "
+ "btrl %2,%1\n\t"
+ "sbbl %0,%0\n\t"
+ :"=r" (OldBit),"+m" (*Base)
+ :"Ir" (Bit)
+ : "memory");
+ return OldBit;
#else
- return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
+ return (_InterlockedAnd(Base, ~(1 << Bit)) >> Bit) & 1;
#endif
}
@@ -279,8 +291,8 @@ LONG
FASTCALL
InterlockedCompareExchange(
IN OUT LONG volatile *Destination,
- IN LONG Exchange,
- IN LONG Comparand);
+ IN LONG Exchange,
+ IN LONG Comparand);
NTKERNELAPI
LONG
@@ -372,10 +384,10 @@ InterlockedExchangeAdd(
FORCEINLINE
LONG64
InterlockedAdd64(
- IN OUT LONG64 volatile *Addend,
- IN LONG64 Value)
+ IN OUT LONG64 volatile *Addend,
+ IN LONG64 Value)
{
- return InterlockedExchangeAdd64(Addend, Value) + Value;
+ return InterlockedExchangeAdd64(Addend, Value) + Value;
}
//#endif
#endif
@@ -411,43 +423,43 @@ InterlockedAdd64(
#define HASH_STRING_ALGORITHM_INVALID 0xffffffff
typedef struct _RTL_BITMAP {
- ULONG SizeOfBitMap;
- PULONG Buffer;
+ ULONG SizeOfBitMap;
+ PULONG Buffer;
} RTL_BITMAP, *PRTL_BITMAP;
typedef struct _RTL_BITMAP_RUN {
- ULONG StartingIndex;
- ULONG NumberOfBits;
+ ULONG StartingIndex;
+ ULONG NumberOfBits;
} RTL_BITMAP_RUN, *PRTL_BITMAP_RUN;
typedef NTSTATUS
(NTAPI *PRTL_QUERY_REGISTRY_ROUTINE)(
- IN PWSTR ValueName,
- IN ULONG ValueType,
- IN PVOID ValueData,
- IN ULONG ValueLength,
- IN PVOID Context,
- IN PVOID EntryContext);
+ IN PWSTR ValueName,
+ IN ULONG ValueType,
+ IN PVOID ValueData,
+ IN ULONG ValueLength,
+ IN PVOID Context,
+ IN PVOID EntryContext);
typedef struct _RTL_QUERY_REGISTRY_TABLE {
- PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
- ULONG Flags;
- PCWSTR Name;
- PVOID EntryContext;
- ULONG DefaultType;
- PVOID DefaultData;
- ULONG DefaultLength;
+ PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine;
+ ULONG Flags;
+ PCWSTR Name;
+ PVOID EntryContext;
+ ULONG DefaultType;
+ PVOID DefaultData;
+ ULONG DefaultLength;
} RTL_QUERY_REGISTRY_TABLE, *PRTL_QUERY_REGISTRY_TABLE;
typedef struct _TIME_FIELDS {
- CSHORT Year;
- CSHORT Month;
- CSHORT Day;
- CSHORT Hour;
- CSHORT Minute;
- CSHORT Second;
- CSHORT Milliseconds;
- CSHORT Weekday;
+ CSHORT Year;
+ CSHORT Month;
+ CSHORT Day;
+ CSHORT Hour;
+ CSHORT Minute;
+ CSHORT Second;
+ CSHORT Milliseconds;
+ CSHORT Weekday;
} TIME_FIELDS, *PTIME_FIELDS;
/* Slist Header */
@@ -465,27 +477,27 @@ typedef struct _SLIST_ENTRY32 {
} SLIST_ENTRY32, *PSLIST_ENTRY32;
typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
- struct {
- ULONGLONG Alignment;
- ULONGLONG Region;
- } DUMMYSTRUCTNAME;
- struct {
- ULONGLONG Depth:16;
- ULONGLONG Sequence:9;
- ULONGLONG NextEntry:39;
- ULONGLONG HeaderType:1;
- ULONGLONG Init:1;
- ULONGLONG Reserved:59;
- ULONGLONG Region:3;
- } Header8;
- struct {
- ULONGLONG Depth:16;
- ULONGLONG Sequence:48;
- ULONGLONG HeaderType:1;
- ULONGLONG Init:1;
- ULONGLONG Reserved:2;
- ULONGLONG NextEntry:60;
- } Header16;
+ _ANONYMOUS_STRUCT struct {
+ ULONGLONG Alignment;
+ ULONGLONG Region;
+ } DUMMYSTRUCTNAME;
+ struct {
+ ULONGLONG Depth:16;
+ ULONGLONG Sequence:9;
+ ULONGLONG NextEntry:39;
+ ULONGLONG HeaderType:1;
+ ULONGLONG Init:1;
+ ULONGLONG Reserved:59;
+ ULONGLONG Region:3;
+ } Header8;
+ struct {
+ ULONGLONG Depth:16;
+ ULONGLONG Sequence:48;
+ ULONGLONG HeaderType:1;
+ ULONGLONG Init:1;
+ ULONGLONG Reserved:2;
+ ULONGLONG NextEntry:60;
+ } Header16;
struct {
ULONGLONG Depth:16;
ULONGLONG Sequence:48;
@@ -497,7 +509,7 @@ typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
typedef union _SLIST_HEADER32 {
ULONGLONG Alignment;
- struct {
+ _ANONYMOUS_STRUCT struct {
SLIST_ENTRY32 Next;
USHORT Depth;
USHORT Sequence;
@@ -513,12 +525,12 @@ typedef union _SLIST_HEADER32 {
typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
typedef union _SLIST_HEADER {
- ULONGLONG Alignment;
- struct {
- SLIST_ENTRY Next;
- USHORT Depth;
- USHORT Sequence;
- } DUMMYSTRUCTNAME;
+ ULONGLONG Alignment;
+ _ANONYMOUS_STRUCT struct {
+ SLIST_ENTRY Next;
+ USHORT Depth;
+ USHORT Sequence;
+ } DUMMYSTRUCTNAME;
} SLIST_HEADER, *PSLIST_HEADER;
typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
@@ -551,7 +563,6 @@ typedef BOOLEAN
(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
IN ULONG Version);
-
/******************************************************************************
* Kernel Types *
******************************************************************************/
@@ -610,7 +621,7 @@ typedef struct _CACHE_DESCRIPTOR {
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
ULONG_PTR ProcessorMask;
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
- union {
+ _ANONYMOUS_UNION union {
struct {
UCHAR Flags;
} ProcessorCore;
@@ -618,7 +629,7 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
ULONG NodeNumber;
} NumaNode;
CACHE_DESCRIPTOR Cache;
- ULONGLONG Reserved[2];
+ ULONGLONG Reserved[2];
} DUMMYUNIONNAME;
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
@@ -662,7 +673,7 @@ typedef struct _GROUP_RELATIONSHIP {
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
ULONG Size;
- union {
+ _ANONYMOUS_UNION union {
PROCESSOR_RELATIONSHIP Processor;
NUMA_NODE_RELATIONSHIP NumaNode;
CACHE_RELATIONSHIP Cache;
@@ -671,24 +682,24 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;;
/* Processor features */
-#define PF_FLOATING_POINT_PRECISION_ERRATA 0
-#define PF_FLOATING_POINT_EMULATED 1
-#define PF_COMPARE_EXCHANGE_DOUBLE 2
-#define PF_MMX_INSTRUCTIONS_AVAILABLE 3
-#define PF_PPC_MOVEMEM_64BIT_OK 4
-#define PF_ALPHA_BYTE_INSTRUCTIONS 5
-#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
-#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
-#define PF_RDTSC_INSTRUCTION_AVAILABLE 8
-#define PF_PAE_ENABLED 9
-#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
-#define PF_SSE_DAZ_MODE_AVAILABLE 11
-#define PF_NX_ENABLED 12
-#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
-#define PF_COMPARE_EXCHANGE128 14
-#define PF_COMPARE64_EXCHANGE128 15
-#define PF_CHANNELS_ENABLED 16
-#define PF_XSAVE_ENABLED 17
+#define PF_FLOATING_POINT_PRECISION_ERRATA 0
+#define PF_FLOATING_POINT_EMULATED 1
+#define PF_COMPARE_EXCHANGE_DOUBLE 2
+#define PF_MMX_INSTRUCTIONS_AVAILABLE 3
+#define PF_PPC_MOVEMEM_64BIT_OK 4
+#define PF_ALPHA_BYTE_INSTRUCTIONS 5
+#define PF_XMMI_INSTRUCTIONS_AVAILABLE 6
+#define PF_3DNOW_INSTRUCTIONS_AVAILABLE 7
+#define PF_RDTSC_INSTRUCTION_AVAILABLE 8
+#define PF_PAE_ENABLED 9
+#define PF_XMMI64_INSTRUCTIONS_AVAILABLE 10
+#define PF_SSE_DAZ_MODE_AVAILABLE 11
+#define PF_NX_ENABLED 12
+#define PF_SSE3_INSTRUCTIONS_AVAILABLE 13
+#define PF_COMPARE_EXCHANGE128 14
+#define PF_COMPARE64_EXCHANGE128 15
+#define PF_CHANNELS_ENABLED 16
+#define PF_XSAVE_ENABLED 17
#define MAXIMUM_WAIT_OBJECTS 64
@@ -701,14 +712,14 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
#define ASSERT_GATE(object) \
NT_ASSERT((((object)->Header.Type & KOBJECT_TYPE_MASK) == GateObject) || \
- (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
+ (((object)->Header.Type & KOBJECT_TYPE_MASK) == EventSynchronizationObject))
#define ASSERT_DEVICE_QUEUE(Object) \
NT_ASSERT((Object)->Type == DeviceQueueObject)
#define ASSERT_TIMER(E) \
NT_ASSERT(((E)->Header.Type == TimerNotificationObject) || \
- ((E)->Header.Type == TimerSynchronizationObject))
+ ((E)->Header.Type == TimerSynchronizationObject))
#define ASSERT_MUTANT(E) \
NT_ASSERT((E)->Header.Type == MutantObject)
@@ -718,7 +729,7 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
#define ASSERT_EVENT(E) \
NT_ASSERT(((E)->Header.Type == NotificationEvent) || \
- ((E)->Header.Type == SynchronizationEvent))
+ ((E)->Header.Type == SynchronizationEvent))
#define DPC_NORMAL 0
#define DPC_THREADED 1
@@ -754,7 +765,7 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
#define MAXIMUM_PROCESSORS MAXIMUM_PROC_PER_GROUP
/* Exception Records */
-#define EXCEPTION_NONCONTINUABLE 1
+#define EXCEPTION_NONCONTINUABLE 1
#define EXCEPTION_MAXIMUM_PARAMETERS 15
#define EXCEPTION_DIVIDED_BY_ZERO 0
@@ -775,36 +786,36 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
#define EXCEPTION_ALIGNMENT_CHECK 0x011
typedef struct _EXCEPTION_RECORD {
- NTSTATUS ExceptionCode;
- ULONG ExceptionFlags;
- struct _EXCEPTION_RECORD *ExceptionRecord;
- PVOID ExceptionAddress;
- ULONG NumberParameters;
- ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+ NTSTATUS ExceptionCode;
+ ULONG ExceptionFlags;
+ struct _EXCEPTION_RECORD *ExceptionRecord;
+ PVOID ExceptionAddress;
+ ULONG NumberParameters;
+ ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
typedef struct _EXCEPTION_RECORD32 {
- NTSTATUS ExceptionCode;
- ULONG ExceptionFlags;
- ULONG ExceptionRecord;
- ULONG ExceptionAddress;
- ULONG NumberParameters;
- ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+ NTSTATUS ExceptionCode;
+ ULONG ExceptionFlags;
+ ULONG ExceptionRecord;
+ ULONG ExceptionAddress;
+ ULONG NumberParameters;
+ ULONG ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD32, *PEXCEPTION_RECORD32;
typedef struct _EXCEPTION_RECORD64 {
- NTSTATUS ExceptionCode;
- ULONG ExceptionFlags;
- ULONG64 ExceptionRecord;
- ULONG64 ExceptionAddress;
- ULONG NumberParameters;
- ULONG __unusedAlignment;
- ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+ NTSTATUS ExceptionCode;
+ ULONG ExceptionFlags;
+ ULONG64 ExceptionRecord;
+ ULONG64 ExceptionAddress;
+ ULONG NumberParameters;
+ ULONG __unusedAlignment;
+ ULONG64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD64, *PEXCEPTION_RECORD64;
typedef struct _EXCEPTION_POINTERS {
- PEXCEPTION_RECORD ExceptionRecord;
- PCONTEXT ContextRecord;
+ PEXCEPTION_RECORD ExceptionRecord;
+ PCONTEXT ContextRecord;
} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
typedef enum _KBUGCHECK_CALLBACK_REASON {
@@ -819,10 +830,10 @@ struct _KBUGCHECK_REASON_CALLBACK_RECORD;
typedef VOID
(NTAPI KBUGCHECK_REASON_CALLBACK_ROUTINE)(
- IN KBUGCHECK_CALLBACK_REASON Reason,
- IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
- IN OUT PVOID ReasonSpecificData,
- IN ULONG ReasonSpecificDataLength);
+ IN KBUGCHECK_CALLBACK_REASON Reason,
+ IN struct _KBUGCHECK_REASON_CALLBACK_RECORD *Record,
+ IN OUT PVOID ReasonSpecificData,
+ IN ULONG ReasonSpecificDataLength);
typedef KBUGCHECK_REASON_CALLBACK_ROUTINE *PKBUGCHECK_REASON_CALLBACK_ROUTINE;
typedef struct _KBUGCHECK_ADD_PAGES {
@@ -862,12 +873,12 @@ typedef struct _KBUGCHECK_DUMP_IO {
#define KB_ADD_PAGES_FLAG_ADDITIONAL_RANGES_EXIST 0x80000000UL
typedef struct _KBUGCHECK_REASON_CALLBACK_RECORD {
- LIST_ENTRY Entry;
- PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
- PUCHAR Component;
- ULONG_PTR Checksum;
- KBUGCHECK_CALLBACK_REASON Reason;
- UCHAR State;
+ LIST_ENTRY Entry;
+ PKBUGCHECK_REASON_CALLBACK_ROUTINE CallbackRoutine;
+ PUCHAR Component;
+ ULONG_PTR Checksum;
+ KBUGCHECK_CALLBACK_REASON Reason;
+ UCHAR State;
} KBUGCHECK_REASON_CALLBACK_RECORD, *PKBUGCHECK_REASON_CALLBACK_RECORD;
typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
@@ -880,24 +891,24 @@ typedef enum _KBUGCHECK_BUFFER_DUMP_STATE {
typedef VOID
(NTAPI KBUGCHECK_CALLBACK_ROUTINE)(
- IN PVOID Buffer,
- IN ULONG Length);
+ IN PVOID Buffer,
+ IN ULONG Length);
typedef KBUGCHECK_CALLBACK_ROUTINE *PKBUGCHECK_CALLBACK_ROUTINE;
typedef struct _KBUGCHECK_CALLBACK_RECORD {
- LIST_ENTRY Entry;
- PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
- PVOID Buffer;
- ULONG Length;
- PUCHAR Component;
- ULONG_PTR Checksum;
- UCHAR State;
+ LIST_ENTRY Entry;
+ PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine;
+ PVOID Buffer;
+ ULONG Length;
+ PUCHAR Component;
+ ULONG_PTR Checksum;
+ UCHAR State;
} KBUGCHECK_CALLBACK_RECORD, *PKBUGCHECK_CALLBACK_RECORD;
typedef BOOLEAN
(NTAPI NMI_CALLBACK)(
- IN PVOID Context,
- IN BOOLEAN Handled);
+ IN PVOID Context,
+ IN BOOLEAN Handled);
typedef NMI_CALLBACK *PNMI_CALLBACK;
typedef enum _KE_PROCESSOR_CHANGE_NOTIFY_STATE {
@@ -1044,7 +1055,7 @@ typedef BOOLEAN
typedef KMESSAGE_SERVICE_ROUTINE *PKMESSAGE_SERVICE_ROUTINE;
typedef enum _KD_OPTION {
- KD_OPTION_SET_BLOCK_ENABLE,
+ KD_OPTION_SET_BLOCK_ENABLE,
} KD_OPTION;
typedef VOID
@@ -1055,11 +1066,11 @@ typedef VOID
typedef VOID
(NTAPI *PKRUNDOWN_ROUTINE)(
- IN struct _KAPC *Apc);
+ IN struct _KAPC *Apc);
typedef VOID
(NTAPI *PKKERNEL_ROUTINE)(
- IN struct _KAPC *Apc,
+ IN struct _KAPC *Apc,
IN OUT PKNORMAL_ROUTINE *NormalRoutine OPTIONAL,
IN OUT PVOID *NormalContext OPTIONAL,
IN OUT PVOID *SystemArgument1 OPTIONAL,
@@ -1093,9 +1104,9 @@ typedef struct _KAPC {
#define KAPC_ACTUAL_LENGTH (FIELD_OFFSET(KAPC, Inserted) + sizeof(BOOLEAN))
typedef struct _KDEVICE_QUEUE_ENTRY {
- LIST_ENTRY DeviceListEntry;
- ULONG SortKey;
- BOOLEAN Inserted;
+ LIST_ENTRY DeviceListEntry;
+ ULONG SortKey;
+ BOOLEAN Inserted;
} KDEVICE_QUEUE_ENTRY, *PKDEVICE_QUEUE_ENTRY,
*RESTRICTED_POINTER PRKDEVICE_QUEUE_ENTRY;
@@ -1127,19 +1138,19 @@ typedef struct _KIPI_COUNTS {
typedef ULONG_PTR
(NTAPI KIPI_BROADCAST_WORKER)(
- IN ULONG_PTR Argument);
+ IN ULONG_PTR Argument);
typedef KIPI_BROADCAST_WORKER *PKIPI_BROADCAST_WORKER;
typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK;
typedef struct _KSPIN_LOCK_QUEUE {
- struct _KSPIN_LOCK_QUEUE *volatile Next;
- PKSPIN_LOCK volatile Lock;
+ struct _KSPIN_LOCK_QUEUE *volatile Next;
+ PKSPIN_LOCK volatile Lock;
} KSPIN_LOCK_QUEUE, *PKSPIN_LOCK_QUEUE;
typedef struct _KLOCK_QUEUE_HANDLE {
- KSPIN_LOCK_QUEUE LockQueue;
- KIRQL OldIrql;
+ KSPIN_LOCK_QUEUE LockQueue;
+ KIRQL OldIrql;
} KLOCK_QUEUE_HANDLE, *PKLOCK_QUEUE_HANDLE;
#if defined(_AMD64_)
@@ -1194,7 +1205,7 @@ typedef enum _KSPIN_LOCK_QUEUE_NUMBER {
typedef VOID
(NTAPI *PKDEFERRED_ROUTINE)(
- IN struct _KDPC *Dpc,
+ IN struct _KDPC *Dpc,
IN PVOID DeferredContext OPTIONAL,
IN PVOID SystemArgument1 OPTIONAL,
IN PVOID SystemArgument2 OPTIONAL);
@@ -1207,15 +1218,15 @@ typedef enum _KDPC_IMPORTANCE {
} KDPC_IMPORTANCE;
typedef struct _KDPC {
- UCHAR Type;
- UCHAR Importance;
- volatile USHORT Number;
- LIST_ENTRY DpcListEntry;
- PKDEFERRED_ROUTINE DeferredRoutine;
- PVOID DeferredContext;
- PVOID SystemArgument1;
- PVOID SystemArgument2;
- volatile PVOID DpcData;
+ UCHAR Type;
+ UCHAR Importance;
+ volatile USHORT Number;
+ LIST_ENTRY DpcListEntry;
+ PKDEFERRED_ROUTINE DeferredRoutine;
+ PVOID DeferredContext;
+ PVOID SystemArgument1;
+ PVOID SystemArgument2;
+ volatile PVOID DpcData;
} KDPC, *PKDPC, *RESTRICTED_POINTER PRKDPC;
typedef struct _KDPC_WATCHDOG_INFORMATION {
@@ -1232,13 +1243,13 @@ typedef struct _KDEVICE_QUEUE {
LIST_ENTRY DeviceListHead;
KSPIN_LOCK Lock;
#if defined(_AMD64_)
- union {
+ _ANONYMOUS_UNION union {
BOOLEAN Busy;
- struct {
- LONG64 Reserved : 8;
- LONG64 Hint : 56;
- };
- };
+ _ANONYMOUS_STRUCT struct {
+ LONG64 Reserved:8;
+ LONG64 Hint:56;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
#else
BOOLEAN Busy;
#endif
@@ -1248,111 +1259,111 @@ typedef struct _KDEVICE_QUEUE {
#define TIMER_PROCESSOR_INDEX_BITS 5
typedef struct _DISPATCHER_HEADER {
- _ANONYMOUS_UNION union {
- _ANONYMOUS_STRUCT struct {
- UCHAR Type;
- _ANONYMOUS_UNION union {
- _ANONYMOUS_UNION union {
- UCHAR TimerControlFlags;
- _ANONYMOUS_STRUCT struct {
- UCHAR Absolute:1;
- UCHAR Coalescable:1;
- UCHAR KeepShifting:1;
- UCHAR EncodedTolerableDelay:5;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- UCHAR Abandoned;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ UCHAR Type;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_UNION union {
+ UCHAR TimerControlFlags;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR Absolute:1;
+ UCHAR Coalescable:1;
+ UCHAR KeepShifting:1;
+ UCHAR EncodedTolerableDelay:5;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR Abandoned;
#if (NTDDI_VERSION < NTDDI_WIN7)
- UCHAR NpxIrql;
+ UCHAR NpxIrql;
#endif
- BOOLEAN Signalling;
- } DUMMYUNIONNAME;
- _ANONYMOUS_UNION union {
- _ANONYMOUS_UNION union {
- UCHAR ThreadControlFlags;
- _ANONYMOUS_STRUCT struct {
- UCHAR CpuThrottled:1;
- UCHAR CycleProfiling:1;
- UCHAR CounterProfiling:1;
- UCHAR Reserved:5;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- UCHAR Size;
- UCHAR Hand;
- } DUMMYUNIONNAME2;
- _ANONYMOUS_UNION union {
+ BOOLEAN Signalling;
+ } DUMMYUNIONNAME;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_UNION union {
+ UCHAR ThreadControlFlags;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR CpuThrottled:1;
+ UCHAR CycleProfiling:1;
+ UCHAR CounterProfiling:1;
+ UCHAR Reserved:5;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ UCHAR Size;
+ UCHAR Hand;
+ } DUMMYUNIONNAME2;
+ _ANONYMOUS_UNION union {
#if (NTDDI_VERSION >= NTDDI_WIN7)
- _ANONYMOUS_UNION union {
- UCHAR TimerMiscFlags;
- _ANONYMOUS_STRUCT struct {
+ _ANONYMOUS_UNION union {
+ UCHAR TimerMiscFlags;
+ _ANONYMOUS_STRUCT struct {
#if !defined(_X86_)
- UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
+ UCHAR Index:TIMER_EXPIRED_INDEX_BITS;
#else
- UCHAR Index:1;
- UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
+ UCHAR Index:1;
+ UCHAR Processor:TIMER_PROCESSOR_INDEX_BITS;
#endif
- UCHAR Inserted:1;
- volatile UCHAR Expired:1;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
+ UCHAR Inserted:1;
+ volatile UCHAR Expired:1;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
#else
- /* Pre Win7 compatibility fix to latest WDK */
- UCHAR Inserted;
+ /* Pre Win7 compatibility fix to latest WDK */
+ UCHAR Inserted;
#endif
- _ANONYMOUS_UNION union {
- BOOLEAN DebugActive;
- _ANONYMOUS_STRUCT struct {
- BOOLEAN ActiveDR7:1;
- BOOLEAN Instrumented:1;
- BOOLEAN Reserved2:4;
- BOOLEAN UmsScheduled:1;
- BOOLEAN UmsPrimary:1;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
- BOOLEAN DpcActive;
- } DUMMYUNIONNAME3;
- } DUMMYSTRUCTNAME;
- volatile LONG Lock;
- } DUMMYUNIONNAME;
- LONG SignalState;
- LIST_ENTRY WaitListHead;
+ _ANONYMOUS_UNION union {
+ BOOLEAN DebugActive;
+ _ANONYMOUS_STRUCT struct {
+ BOOLEAN ActiveDR7:1;
+ BOOLEAN Instrumented:1;
+ BOOLEAN Reserved2:4;
+ BOOLEAN UmsScheduled:1;
+ BOOLEAN UmsPrimary:1;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME; /* should probably be DUMMYUNIONNAME2, but this is what WDK says */
+ BOOLEAN DpcActive;
+ } DUMMYUNIONNAME3;
+ } DUMMYSTRUCTNAME;
+ volatile LONG Lock;
+ } DUMMYUNIONNAME;
+ LONG SignalState;
+ LIST_ENTRY WaitListHead;
} DISPATCHER_HEADER, *PDISPATCHER_HEADER;
typedef struct _KEVENT {
- DISPATCHER_HEADER Header;
+ DISPATCHER_HEADER Header;
} KEVENT, *PKEVENT, *RESTRICTED_POINTER PRKEVENT;
typedef struct _KSEMAPHORE {
- DISPATCHER_HEADER Header;
- LONG Limit;
+ DISPATCHER_HEADER Header;
+ LONG Limit;
} KSEMAPHORE, *PKSEMAPHORE, *RESTRICTED_POINTER PRKSEMAPHORE;
#define KSEMAPHORE_ACTUAL_LENGTH (FIELD_OFFSET(KSEMAPHORE, Limit) + sizeof(LONG))
typedef struct _KGATE {
- DISPATCHER_HEADER Header;
+ DISPATCHER_HEADER Header;
} KGATE, *PKGATE, *RESTRICTED_POINTER PRKGATE;
typedef struct _KGUARDED_MUTEX {
- volatile LONG Count;
- PKTHREAD Owner;
- ULONG Contention;
- KGATE Gate;
- __GNU_EXTENSION union {
- __GNU_EXTENSION struct {
- SHORT KernelApcDisable;
- SHORT SpecialApcDisable;
- };
- ULONG CombinedApcDisable;
- };
+ volatile LONG Count;
+ PKTHREAD Owner;
+ ULONG Contention;
+ KGATE Gate;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ SHORT KernelApcDisable;
+ SHORT SpecialApcDisable;
+ } DUMMYSTRUCTNAME;
+ ULONG CombinedApcDisable;
+ } DUMMYUNIONNAME;
} KGUARDED_MUTEX, *PKGUARDED_MUTEX;
typedef struct _KMUTANT {
- DISPATCHER_HEADER Header;
- LIST_ENTRY MutantListEntry;
- struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
- BOOLEAN Abandoned;
- UCHAR ApcDisable;
+ DISPATCHER_HEADER Header;
+ LIST_ENTRY MutantListEntry;
+ struct _KTHREAD *RESTRICTED_POINTER OwnerThread;
+ BOOLEAN Abandoned;
+ UCHAR ApcDisable;
} KMUTANT, *PKMUTANT, *RESTRICTED_POINTER PRKMUTANT, KMUTEX, *PKMUTEX, *RESTRICTED_POINTER PRKMUTEX;
#define TIMER_TABLE_SIZE 512
@@ -1379,7 +1390,7 @@ typedef enum _LOCK_OPERATION {
typedef BOOLEAN
(NTAPI *PKSYNCHRONIZE_ROUTINE)(
- IN PVOID SynchronizeContext);
+ IN PVOID SynchronizeContext);
typedef enum _POOL_TYPE {
NonPagedPool,
@@ -1400,9 +1411,9 @@ typedef enum _POOL_TYPE {
} POOL_TYPE;
typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
- StandardDesign,
- NEC98x86,
- EndAlternatives
+ StandardDesign,
+ NEC98x86,
+ EndAlternatives
} ALTERNATIVE_ARCHITECTURE_TYPE;
#ifndef _X86_
@@ -1426,14 +1437,14 @@ typedef enum _ALTERNATIVE_ARCHITECTURE_TYPE {
#endif
typedef struct _KSYSTEM_TIME {
- ULONG LowPart;
- LONG High1Time;
- LONG High2Time;
+ ULONG LowPart;
+ LONG High1Time;
+ LONG High2Time;
} KSYSTEM_TIME, *PKSYSTEM_TIME;
typedef struct DECLSPEC_ALIGN(16) _M128A {
- ULONGLONG Low;
- LONGLONG High;
+ ULONGLONG Low;
+ LONGLONG High;
} M128A, *PM128A;
typedef struct DECLSPEC_ALIGN(16) _XSAVE_FORMAT {
@@ -1495,8 +1506,8 @@ typedef struct _XSTATE_SAVE {
#elif defined(_IA64_)
ULONG Dummy;
#elif defined(_X86_)
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
LONG64 Reserved1;
ULONG Reserved2;
struct _XSTATE_SAVE* Prev;
@@ -1504,9 +1515,9 @@ typedef struct _XSTATE_SAVE {
struct _KTHREAD* Thread;
PVOID Reserved4;
UCHAR Level;
- };
+ } DUMMYSTRUCTNAME;
XSTATE_CONTEXT XStateContext;
- };
+ } DUMMYUNIONNAME;
#endif
} XSTATE_SAVE, *PXSTATE_SAVE;
@@ -1560,12 +1571,12 @@ typedef ULONG NODE_REQUIREMENT;
#define MM_ANY_NODE_OK 0x80000000
#endif
-#define MM_DONT_ZERO_ALLOCATION 0x00000001
-#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
-#define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
-#define MM_ALLOCATE_NO_WAIT 0x00000008
-#define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
-#define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
+#define MM_DONT_ZERO_ALLOCATION 0x00000001
+#define MM_ALLOCATE_FROM_LOCAL_NODE_ONLY 0x00000002
+#define MM_ALLOCATE_FULLY_REQUIRED 0x00000004
+#define MM_ALLOCATE_NO_WAIT 0x00000008
+#define MM_ALLOCATE_PREFER_CONTIGUOUS 0x00000010
+#define MM_ALLOCATE_REQUIRE_CONTIGUOUS_CHUNKS 0x00000020
#define MDL_MAPPED_TO_SYSTEM_VA 0x0001
#define MDL_PAGES_LOCKED 0x0002
@@ -1584,16 +1595,15 @@ typedef ULONG NODE_REQUIREMENT;
#define MDL_ALLOCATED_MUST_SUCCEED 0x4000
#define MDL_INTERNAL 0x8000
-#define MDL_MAPPING_FLAGS ( \
- MDL_MAPPED_TO_SYSTEM_VA | \
- MDL_PAGES_LOCKED | \
- MDL_SOURCE_IS_NONPAGED_POOL | \
- MDL_PARTIAL_HAS_BEEN_MAPPED | \
- MDL_PARENT_MAPPED_SYSTEM_VA | \
- MDL_SYSTEM_VA | \
- MDL_IO_SPACE)
+#define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
+ MDL_PAGES_LOCKED | \
+ MDL_SOURCE_IS_NONPAGED_POOL | \
+ MDL_PARTIAL_HAS_BEEN_MAPPED | \
+ MDL_PARENT_MAPPED_SYSTEM_VA | \
+ MDL_SYSTEM_VA | \
+ MDL_IO_SPACE)
-#define FLUSH_MULTIPLE_MAXIMUM 32
+#define FLUSH_MULTIPLE_MAXIMUM 32
/* Section access rights */
#define SECTION_QUERY 0x0001
@@ -1603,17 +1613,17 @@ typedef ULONG NODE_REQUIREMENT;
#define SECTION_EXTEND_SIZE 0x0010
#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
-#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
- SECTION_MAP_WRITE | \
- SECTION_MAP_READ | \
- SECTION_MAP_EXECUTE | \
+#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
+ SECTION_MAP_WRITE | \
+ SECTION_MAP_READ | \
+ SECTION_MAP_EXECUTE | \
SECTION_EXTEND_SIZE)
-#define SESSION_QUERY_ACCESS 0x0001
-#define SESSION_MODIFY_ACCESS 0x0002
+#define SESSION_QUERY_ACCESS 0x0001
+#define SESSION_MODIFY_ACCESS 0x0002
#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
- SESSION_QUERY_ACCESS | \
+ SESSION_QUERY_ACCESS | \
SESSION_MODIFY_ACCESS)
#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
@@ -1648,8 +1658,8 @@ typedef ULONG NODE_REQUIREMENT;
/* Section map options */
typedef enum _SECTION_INHERIT {
- ViewShare = 1,
- ViewUnmap = 2
+ ViewShare = 1,
+ ViewUnmap = 2
} SECTION_INHERIT;
typedef ULONG PFN_COUNT;
@@ -1657,14 +1667,14 @@ typedef LONG_PTR SPFN_NUMBER, *PSPFN_NUMBER;
typedef ULONG_PTR PFN_NUMBER, *PPFN_NUMBER;
typedef struct _MDL {
- struct _MDL *Next;
- CSHORT Size;
- CSHORT MdlFlags;
- struct _EPROCESS *Process;
- PVOID MappedSystemVa;
- PVOID StartVa;
- ULONG ByteCount;
- ULONG ByteOffset;
+ struct _MDL *Next;
+ CSHORT Size;
+ CSHORT MdlFlags;
+ struct _EPROCESS *Process;
+ PVOID MappedSystemVa;
+ PVOID StartVa;
+ ULONG ByteCount;
+ ULONG ByteOffset;
} MDL, *PMDL;
typedef MDL *PMDLX;
@@ -1701,7 +1711,6 @@ extern PVOID MmBadPointer;
/******************************************************************************
* Executive Types *
******************************************************************************/
-
#define EX_RUNDOWN_ACTIVE 0x1
#define EX_RUNDOWN_COUNT_SHIFT 0x1
#define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
@@ -1715,35 +1724,35 @@ typedef struct _FAST_MUTEX {
} FAST_MUTEX, *PFAST_MUTEX;
typedef enum _SUITE_TYPE {
- SmallBusiness,
- Enterprise,
- BackOffice,
- CommunicationServer,
- TerminalServer,
- SmallBusinessRestricted,
- EmbeddedNT,
- DataCenter,
- SingleUserTS,
- Personal,
- Blade,
- EmbeddedRestricted,
- SecurityAppliance,
- StorageServer,
- ComputeServer,
- WHServer,
- MaxSuiteType
+ SmallBusiness,
+ Enterprise,
+ BackOffice,
+ CommunicationServer,
+ TerminalServer,
+ SmallBusinessRestricted,
+ EmbeddedNT,
+ DataCenter,
+ SingleUserTS,
+ Personal,
+ Blade,
+ EmbeddedRestricted,
+ SecurityAppliance,
+ StorageServer,
+ ComputeServer,
+ WHServer,
+ MaxSuiteType
} SUITE_TYPE;
typedef enum _EX_POOL_PRIORITY {
- LowPoolPriority,
- LowPoolPrioritySpecialPoolOverrun = 8,
- LowPoolPrioritySpecialPoolUnderrun = 9,
- NormalPoolPriority = 16,
- NormalPoolPrioritySpecialPoolOverrun = 24,
- NormalPoolPrioritySpecialPoolUnderrun = 25,
- HighPoolPriority = 32,
- HighPoolPrioritySpecialPoolOverrun = 40,
- HighPoolPrioritySpecialPoolUnderrun = 41
+ LowPoolPriority,
+ LowPoolPrioritySpecialPoolOverrun = 8,
+ LowPoolPrioritySpecialPoolUnderrun = 9,
+ NormalPoolPriority = 16,
+ NormalPoolPrioritySpecialPoolOverrun = 24,
+ NormalPoolPrioritySpecialPoolUnderrun = 25,
+ HighPoolPriority = 32,
+ HighPoolPrioritySpecialPoolOverrun = 40,
+ HighPoolPrioritySpecialPoolUnderrun = 41
} EX_POOL_PRIORITY;
#if !defined(_WIN64) && (defined(_NTDDK_) || defined(_NTIFS_) || defined(_NDIS_))
@@ -1756,25 +1765,25 @@ typedef struct _LOOKASIDE_LIST_EX *PLOOKASIDE_LIST_EX;
typedef PVOID
(NTAPI *PALLOCATE_FUNCTION)(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag);
typedef PVOID
(NTAPI *PALLOCATE_FUNCTION_EX)(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag,
- IN OUT PLOOKASIDE_LIST_EX Lookaside);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag,
+ IN OUT PLOOKASIDE_LIST_EX Lookaside);
typedef VOID
(NTAPI *PFREE_FUNCTION)(
- IN PVOID Buffer);
+ IN PVOID Buffer);
typedef VOID
(NTAPI *PFREE_FUNCTION_EX)(
- IN PVOID Buffer,
- IN OUT PLOOKASIDE_LIST_EX Lookaside);
+ IN PVOID Buffer,
+ IN OUT PLOOKASIDE_LIST_EX Lookaside);
typedef VOID
(NTAPI CALLBACK_FUNCTION)(
@@ -1784,51 +1793,47 @@ typedef VOID
typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
#define GENERAL_LOOKASIDE_LAYOUT \
- union { \
+ _ANONYMOUS_UNION union { \
SLIST_HEADER ListHead; \
SINGLE_LIST_ENTRY SingleListHead; \
} DUMMYUNIONNAME; \
USHORT Depth; \
USHORT MaximumDepth; \
ULONG TotalAllocates; \
- union { \
+ _ANONYMOUS_UNION union { \
ULONG AllocateMisses; \
ULONG AllocateHits; \
} DUMMYUNIONNAME2; \
- \
ULONG TotalFrees; \
- union { \
+ _ANONYMOUS_UNION union { \
ULONG FreeMisses; \
ULONG FreeHits; \
} DUMMYUNIONNAME3; \
- \
POOL_TYPE Type; \
ULONG Tag; \
ULONG Size; \
- union { \
+ _ANONYMOUS_UNION union { \
PALLOCATE_FUNCTION_EX AllocateEx; \
PALLOCATE_FUNCTION Allocate; \
} DUMMYUNIONNAME4; \
- \
- union { \
+ _ANONYMOUS_UNION union { \
PFREE_FUNCTION_EX FreeEx; \
PFREE_FUNCTION Free; \
} DUMMYUNIONNAME5; \
- \
LIST_ENTRY ListEntry; \
ULONG LastTotalAllocates; \
- union { \
+ _ANONYMOUS_UNION union { \
ULONG LastAllocateMisses; \
ULONG LastAllocateHits; \
} DUMMYUNIONNAME6; \
ULONG Future[2];
typedef struct LOOKASIDE_ALIGN _GENERAL_LOOKASIDE {
- GENERAL_LOOKASIDE_LAYOUT
+ GENERAL_LOOKASIDE_LAYOUT
} GENERAL_LOOKASIDE, *PGENERAL_LOOKASIDE;
typedef struct _GENERAL_LOOKASIDE_POOL {
- GENERAL_LOOKASIDE_LAYOUT
+ GENERAL_LOOKASIDE_LAYOUT
} GENERAL_LOOKASIDE_POOL, *PGENERAL_LOOKASIDE_POOL;
#define LOOKASIDE_CHECK(f) \
@@ -1839,23 +1844,23 @@ LOOKASIDE_CHECK(Tag);
LOOKASIDE_CHECK(Future);
typedef struct _PAGED_LOOKASIDE_LIST {
- GENERAL_LOOKASIDE L;
+ GENERAL_LOOKASIDE L;
#if !defined(_AMD64_) && !defined(_IA64_)
- FAST_MUTEX Lock__ObsoleteButDoNotDelete;
+ FAST_MUTEX Lock__ObsoleteButDoNotDelete;
#endif
} PAGED_LOOKASIDE_LIST, *PPAGED_LOOKASIDE_LIST;
typedef struct LOOKASIDE_ALIGN _NPAGED_LOOKASIDE_LIST {
- GENERAL_LOOKASIDE L;
+ GENERAL_LOOKASIDE L;
#if !defined(_AMD64_) && !defined(_IA64_)
- KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
+ KSPIN_LOCK Lock__ObsoleteButDoNotDelete;
#endif
} NPAGED_LOOKASIDE_LIST, *PNPAGED_LOOKASIDE_LIST;
#define LOOKASIDE_MINIMUM_BLOCK_SIZE (RTL_SIZEOF_THROUGH_FIELD (SLIST_ENTRY, Next))
typedef struct _LOOKASIDE_LIST_EX {
- GENERAL_LOOKASIDE_POOL L;
+ GENERAL_LOOKASIDE_POOL L;
} LOOKASIDE_LIST_EX;
#if (NTDDI_VERSION >= NTDDI_VISTA)
@@ -1869,13 +1874,13 @@ typedef struct _LOOKASIDE_LIST_EX {
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
typedef struct _EX_RUNDOWN_REF {
- __GNU_EXTENSION union {
- volatile ULONG_PTR Count;
- volatile PVOID Ptr;
- };
+ _ANONYMOUS_UNION union {
+ volatile ULONG_PTR Count;
+ volatile PVOID Ptr;
+ } DUMMYUNIONNAME;
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
-typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
+typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
typedef enum _WORK_QUEUE_TYPE {
CriticalWorkQueue,
@@ -1890,23 +1895,23 @@ typedef VOID
typedef WORKER_THREAD_ROUTINE *PWORKER_THREAD_ROUTINE;
typedef struct _WORK_QUEUE_ITEM {
- LIST_ENTRY List;
- PWORKER_THREAD_ROUTINE WorkerRoutine;
- volatile PVOID Parameter;
+ LIST_ENTRY List;
+ PWORKER_THREAD_ROUTINE WorkerRoutine;
+ volatile PVOID Parameter;
} WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM;
typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
typedef struct _OWNER_ENTRY {
ERESOURCE_THREAD OwnerThread;
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
ULONG IoPriorityBoosted:1;
ULONG OwnerReferenced:1;
ULONG OwnerCount:30;
- };
+ } DUMMYSTRUCTNAME;
ULONG TableSize;
- };
+ } DUMMYUNIONNAME;
} OWNER_ENTRY, *POWNER_ENTRY;
typedef struct _ERESOURCE {
@@ -1924,10 +1929,10 @@ typedef struct _ERESOURCE {
#if defined(_WIN64)
PVOID Reserved2;
#endif
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
PVOID Address;
ULONG_PTR CreatorBackTraceIndex;
- };
+ } DUMMYUNIONNAME;
KSPIN_LOCK SpinLock;
} ERESOURCE, *PERESOURCE;
@@ -1967,7 +1972,6 @@ extern ULONG NtGlobalFlag;
#define IF_NTOS_DEBUG(FlagName) if(FALSE)
#endif
-
/******************************************************************************
* Security Manager Types *
******************************************************************************/
@@ -1998,10 +2002,10 @@ typedef PVOID PSID;
#define GENERIC_ALL 0x10000000L
typedef struct _GENERIC_MAPPING {
- ACCESS_MASK GenericRead;
- ACCESS_MASK GenericWrite;
- ACCESS_MASK GenericExecute;
- ACCESS_MASK GenericAll;
+ ACCESS_MASK GenericRead;
+ ACCESS_MASK GenericWrite;
+ ACCESS_MASK GenericExecute;
+ ACCESS_MASK GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING;
#define ACL_REVISION 2
@@ -2015,11 +2019,11 @@ typedef struct _GENERIC_MAPPING {
#define MAX_ACL_REVISION ACL_REVISION4
typedef struct _ACL {
- UCHAR AclRevision;
- UCHAR Sbz1;
- USHORT AclSize;
- USHORT AceCount;
- USHORT Sbz2;
+ UCHAR AclRevision;
+ UCHAR Sbz1;
+ USHORT AclSize;
+ USHORT AceCount;
+ USHORT Sbz2;
} ACL, *PACL;
/* Current security descriptor revision value */
@@ -2039,8 +2043,8 @@ typedef struct _ACL {
#include
typedef struct _LUID_AND_ATTRIBUTES {
- LUID Luid;
- ULONG Attributes;
+ LUID Luid;
+ ULONG Attributes;
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
#include
@@ -2051,16 +2055,16 @@ typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
#define PRIVILEGE_SET_ALL_NECESSARY (1)
typedef struct _PRIVILEGE_SET {
- ULONG PrivilegeCount;
- ULONG Control;
- LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+ ULONG PrivilegeCount;
+ ULONG Control;
+ LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
} PRIVILEGE_SET,*PPRIVILEGE_SET;
typedef enum _SECURITY_IMPERSONATION_LEVEL {
- SecurityAnonymous,
- SecurityIdentification,
- SecurityImpersonation,
- SecurityDelegation
+ SecurityAnonymous,
+ SecurityIdentification,
+ SecurityImpersonation,
+ SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL, * PSECURITY_IMPERSONATION_LEVEL;
#define SECURITY_MAX_IMPERSONATION_LEVEL SecurityDelegation
@@ -2074,17 +2078,17 @@ typedef enum _SECURITY_IMPERSONATION_LEVEL {
typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE, *PSECURITY_CONTEXT_TRACKING_MODE;
typedef struct _SECURITY_QUALITY_OF_SERVICE {
- ULONG Length;
- SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
- SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
- BOOLEAN EffectiveOnly;
+ ULONG Length;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+ BOOLEAN EffectiveOnly;
} SECURITY_QUALITY_OF_SERVICE, *PSECURITY_QUALITY_OF_SERVICE;
typedef struct _SE_IMPERSONATION_STATE {
- PACCESS_TOKEN Token;
- BOOLEAN CopyOnOpen;
- BOOLEAN EffectiveOnly;
- SECURITY_IMPERSONATION_LEVEL Level;
+ PACCESS_TOKEN Token;
+ BOOLEAN CopyOnOpen;
+ BOOLEAN EffectiveOnly;
+ SECURITY_IMPERSONATION_LEVEL Level;
} SE_IMPERSONATION_STATE, *PSE_IMPERSONATION_STATE;
#define OWNER_SECURITY_INFORMATION (0x00000001L)
@@ -2108,9 +2112,9 @@ typedef enum _SECURITY_OPERATION_CODE {
#define INITIAL_PRIVILEGE_COUNT 3
typedef struct _INITIAL_PRIVILEGE_SET {
- ULONG PrivilegeCount;
- ULONG Control;
- LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
+ ULONG PrivilegeCount;
+ ULONG Control;
+ LUID_AND_ATTRIBUTES Privilege[INITIAL_PRIVILEGE_COUNT];
} INITIAL_PRIVILEGE_SET, * PINITIAL_PRIVILEGE_SET;
#define SE_MIN_WELL_KNOWN_PRIVILEGE 2
@@ -2151,32 +2155,32 @@ typedef struct _INITIAL_PRIVILEGE_SET {
#define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_SYMBOLIC_LINK_PRIVILEGE
typedef struct _SECURITY_SUBJECT_CONTEXT {
- PACCESS_TOKEN ClientToken;
- SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
- PACCESS_TOKEN PrimaryToken;
- PVOID ProcessAuditId;
+ PACCESS_TOKEN ClientToken;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ PACCESS_TOKEN PrimaryToken;
+ PVOID ProcessAuditId;
} SECURITY_SUBJECT_CONTEXT, *PSECURITY_SUBJECT_CONTEXT;
typedef struct _ACCESS_STATE {
- LUID OperationID;
- BOOLEAN SecurityEvaluated;
- BOOLEAN GenerateAudit;
- BOOLEAN GenerateOnClose;
- BOOLEAN PrivilegesAllocated;
- ULONG Flags;
- ACCESS_MASK RemainingDesiredAccess;
- ACCESS_MASK PreviouslyGrantedAccess;
- ACCESS_MASK OriginalDesiredAccess;
- SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
- PSECURITY_DESCRIPTOR SecurityDescriptor;
- PVOID AuxData;
+ LUID OperationID;
+ BOOLEAN SecurityEvaluated;
+ BOOLEAN GenerateAudit;
+ BOOLEAN GenerateOnClose;
+ BOOLEAN PrivilegesAllocated;
+ ULONG Flags;
+ ACCESS_MASK RemainingDesiredAccess;
+ ACCESS_MASK PreviouslyGrantedAccess;
+ ACCESS_MASK OriginalDesiredAccess;
+ SECURITY_SUBJECT_CONTEXT SubjectSecurityContext;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
+ PVOID AuxData;
union {
- INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
- PRIVILEGE_SET PrivilegeSet;
+ INITIAL_PRIVILEGE_SET InitialPrivilegeSet;
+ PRIVILEGE_SET PrivilegeSet;
} Privileges;
- BOOLEAN AuditPrivileges;
- UNICODE_STRING ObjectName;
- UNICODE_STRING ObjectTypeName;
+ BOOLEAN AuditPrivileges;
+ UNICODE_STRING ObjectName;
+ UNICODE_STRING ObjectTypeName;
} ACCESS_STATE, *PACCESS_STATE;
typedef VOID
@@ -2253,8 +2257,8 @@ typedef struct _SE_ADT_PARAMETER_ARRAY_ENTRY {
typedef struct _SE_ADT_ACCESS_REASON {
ACCESS_MASK AccessMask;
- ULONG AccessReasons[32];
- ULONG ObjectTypeIndex;
+ ULONG AccessReasons[32];
+ ULONG ObjectTypeIndex;
ULONG AccessGranted;
PSECURITY_DESCRIPTOR SecurityDescriptor;
} SE_ADT_ACCESS_REASON, *PSE_ADT_ACCESS_REASON;
@@ -2272,7 +2276,6 @@ typedef struct _SE_ADT_PARAMETER_ARRAY {
#endif /* !_NTLSA_AUDIT_ */
#endif /* !_NTLSA_IFS_ */
-
/******************************************************************************
* Power Management Support Types *
******************************************************************************/
@@ -2290,91 +2293,91 @@ typedef struct _SE_ADT_PARAMETER_ARRAY {
/* Power States/Levels */
typedef enum _SYSTEM_POWER_STATE {
PowerSystemUnspecified = 0,
- PowerSystemWorking,
- PowerSystemSleeping1,
- PowerSystemSleeping2,
- PowerSystemSleeping3,
- PowerSystemHibernate,
- PowerSystemShutdown,
- PowerSystemMaximum
+ PowerSystemWorking,
+ PowerSystemSleeping1,
+ PowerSystemSleeping2,
+ PowerSystemSleeping3,
+ PowerSystemHibernate,
+ PowerSystemShutdown,
+ PowerSystemMaximum
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
typedef enum _POWER_INFORMATION_LEVEL {
- SystemPowerPolicyAc,
- SystemPowerPolicyDc,
- VerifySystemPolicyAc,
- VerifySystemPolicyDc,
- SystemPowerCapabilities,
- SystemBatteryState,
- SystemPowerStateHandler,
- ProcessorStateHandler,
- SystemPowerPolicyCurrent,
- AdministratorPowerPolicy,
- SystemReserveHiberFile,
- ProcessorInformation,
- SystemPowerInformation,
- ProcessorStateHandler2,
- LastWakeTime,
- LastSleepTime,
- SystemExecutionState,
- SystemPowerStateNotifyHandler,
- ProcessorPowerPolicyAc,
- ProcessorPowerPolicyDc,
- VerifyProcessorPowerPolicyAc,
- VerifyProcessorPowerPolicyDc,
- ProcessorPowerPolicyCurrent,
- SystemPowerStateLogging,
- SystemPowerLoggingEntry,
- SetPowerSettingValue,
- NotifyUserPowerSetting,
- PowerInformationLevelUnused0,
- PowerInformationLevelUnused1,
- SystemVideoState,
- TraceApplicationPowerMessage,
- TraceApplicationPowerMessageEnd,
- ProcessorPerfStates,
- ProcessorIdleStates,
- ProcessorCap,
- SystemWakeSource,
- SystemHiberFileInformation,
- TraceServicePowerMessage,
- ProcessorLoad,
- PowerShutdownNotification,
- MonitorCapabilities,
- SessionPowerInit,
- SessionDisplayState,
- PowerRequestCreate,
- PowerRequestAction,
- GetPowerRequestList,
- ProcessorInformationEx,
- NotifyUserModeLegacyPowerEvent,
- GroupPark,
- ProcessorIdleDomains,
- WakeTimerList,
- SystemHiberFileSize,
- PowerInformationLevelMaximum
+ SystemPowerPolicyAc,
+ SystemPowerPolicyDc,
+ VerifySystemPolicyAc,
+ VerifySystemPolicyDc,
+ SystemPowerCapabilities,
+ SystemBatteryState,
+ SystemPowerStateHandler,
+ ProcessorStateHandler,
+ SystemPowerPolicyCurrent,
+ AdministratorPowerPolicy,
+ SystemReserveHiberFile,
+ ProcessorInformation,
+ SystemPowerInformation,
+ ProcessorStateHandler2,
+ LastWakeTime,
+ LastSleepTime,
+ SystemExecutionState,
+ SystemPowerStateNotifyHandler,
+ ProcessorPowerPolicyAc,
+ ProcessorPowerPolicyDc,
+ VerifyProcessorPowerPolicyAc,
+ VerifyProcessorPowerPolicyDc,
+ ProcessorPowerPolicyCurrent,
+ SystemPowerStateLogging,
+ SystemPowerLoggingEntry,
+ SetPowerSettingValue,
+ NotifyUserPowerSetting,
+ PowerInformationLevelUnused0,
+ PowerInformationLevelUnused1,
+ SystemVideoState,
+ TraceApplicationPowerMessage,
+ TraceApplicationPowerMessageEnd,
+ ProcessorPerfStates,
+ ProcessorIdleStates,
+ ProcessorCap,
+ SystemWakeSource,
+ SystemHiberFileInformation,
+ TraceServicePowerMessage,
+ ProcessorLoad,
+ PowerShutdownNotification,
+ MonitorCapabilities,
+ SessionPowerInit,
+ SessionDisplayState,
+ PowerRequestCreate,
+ PowerRequestAction,
+ GetPowerRequestList,
+ ProcessorInformationEx,
+ NotifyUserModeLegacyPowerEvent,
+ GroupPark,
+ ProcessorIdleDomains,
+ WakeTimerList,
+ SystemHiberFileSize,
+ PowerInformationLevelMaximum
} POWER_INFORMATION_LEVEL;
typedef enum {
PowerActionNone = 0,
- PowerActionReserved,
- PowerActionSleep,
- PowerActionHibernate,
- PowerActionShutdown,
- PowerActionShutdownReset,
- PowerActionShutdownOff,
- PowerActionWarmEject
+ PowerActionReserved,
+ PowerActionSleep,
+ PowerActionHibernate,
+ PowerActionShutdown,
+ PowerActionShutdownReset,
+ PowerActionShutdownOff,
+ PowerActionWarmEject
} POWER_ACTION, *PPOWER_ACTION;
typedef enum _DEVICE_POWER_STATE {
PowerDeviceUnspecified = 0,
- PowerDeviceD0,
- PowerDeviceD1,
- PowerDeviceD2,
- PowerDeviceD3,
- PowerDeviceMaximum
+ PowerDeviceD0,
+ PowerDeviceD1,
+ PowerDeviceD2,
+ PowerDeviceD3,
+ PowerDeviceMaximum
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
typedef enum _MONITOR_DISPLAY_STATE {
@@ -2384,8 +2387,8 @@ typedef enum _MONITOR_DISPLAY_STATE {
} MONITOR_DISPLAY_STATE, *PMONITOR_DISPLAY_STATE;
typedef union _POWER_STATE {
- SYSTEM_POWER_STATE SystemState;
- DEVICE_POWER_STATE DeviceState;
+ SYSTEM_POWER_STATE SystemState;
+ DEVICE_POWER_STATE DeviceState;
} POWER_STATE, *PPOWER_STATE;
typedef enum _POWER_STATE_TYPE {
@@ -2395,8 +2398,8 @@ typedef enum _POWER_STATE_TYPE {
#if (NTDDI_VERSION >= NTDDI_VISTA)
typedef struct _SYSTEM_POWER_STATE_CONTEXT {
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
ULONG Reserved1:8;
ULONG TargetSystemState:4;
ULONG EffectiveSystemState:4;
@@ -2414,8 +2417,8 @@ typedef struct _SYSTEM_POWER_STATE_CONTEXT {
typedef struct _COUNTED_REASON_CONTEXT {
ULONG Version;
ULONG Flags;
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
UNICODE_STRING ResourceFileName;
USHORT ResourceReasonId;
ULONG StringCount;
@@ -2533,8 +2536,8 @@ typedef enum _POWER_PLATFORM_ROLE {
#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
typedef struct {
- ULONG Granularity;
- ULONG Capacity;
+ ULONG Granularity;
+ ULONG Capacity;
} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_) */
@@ -2545,74 +2548,74 @@ typedef struct {
#define CORE_PARKING_POLICY_CHANGE_ROCKET 2
#define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
-DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A );
-DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C );
-DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E );
-DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94 );
-DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0 );
-DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7 );
-DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63 );
-DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99 );
-DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E );
-DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63 );
-DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64 );
+DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
+DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
+DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
+DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
+DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
+DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
+DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
+DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
+DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
+DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
+DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
-DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B );
-DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA );
+DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
+DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
-DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67 );
+DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
-DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23 );
-DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42 );
-DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E );
-DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63 );
-DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67 );
-DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20 );
-DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70 );
-DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA );
-DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0 );
-DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64 );
-DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E );
+DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
+DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
+DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
+DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
+DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
+DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
+DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
+DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
+DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
+DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
+DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
-DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0 );
-DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87 );
-DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab );
-DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D );
-DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2 );
-DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47 );
-DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80 );
-DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78 );
-DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB );
-DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93 );
-DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5 );
-DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36 );
-DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B );
-DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4 );
-DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3 );
-DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00 );
-DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36 );
-DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC );
-DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C );
-DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb );
+DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
+DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
+DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
+DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
+DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
+DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
+DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
+DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
+DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
+DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
+DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
+DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
+DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
+DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
+DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
+DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
+DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
+DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
+DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
+DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
-DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d );
-DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6 );
+DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
+DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
@@ -2624,7 +2627,7 @@ DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33,
DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
-DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1 );
+DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
@@ -2643,17 +2646,17 @@ DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0x
DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
-DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51 );
-DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19 );
-DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48 );
-DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3 );
-DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1 );
-DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1 );
-DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E );
-DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA );
-DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20 );
-DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5 );
-DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6 );
+DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
+DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
+DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
+DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
+DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
+DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
+DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
+DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
+DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
+DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
+DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
#define PERFSTATE_POLICY_CHANGE_IDEAL 0
#define PERFSTATE_POLICY_CHANGE_SINGLE 1
@@ -2684,7 +2687,6 @@ NTSTATUS
IN OUT PVOID Context OPTIONAL);
typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
-
/******************************************************************************
* Configuration Manager Types *
******************************************************************************/
@@ -2699,11 +2701,11 @@ typedef int CM_RESOURCE_TYPE;
#define CmResourceTypeDma 4
#define CmResourceTypeDeviceSpecific 5
#define CmResourceTypeBusNumber 6
-#define CmResourceTypeNonArbitrated 128
-#define CmResourceTypeConfigData 128
-#define CmResourceTypeDevicePrivate 129
-#define CmResourceTypePcCardConfig 130
-#define CmResourceTypeMfCardConfig 131
+#define CmResourceTypeNonArbitrated 128
+#define CmResourceTypeConfigData 128
+#define CmResourceTypeDevicePrivate 129
+#define CmResourceTypePcCardConfig 130
+#define CmResourceTypeMfCardConfig 131
/* KEY_VALUE_Xxx.Type */
#define REG_NONE 0
@@ -2717,9 +2719,9 @@ typedef int CM_RESOURCE_TYPE;
#define REG_MULTI_SZ 7
#define REG_RESOURCE_LIST 8
#define REG_FULL_RESOURCE_DESCRIPTOR 9
-#define REG_RESOURCE_REQUIREMENTS_LIST 10
-#define REG_QWORD 11
-#define REG_QWORD_LITTLE_ENDIAN 11
+#define REG_RESOURCE_REQUIREMENTS_LIST 10
+#define REG_QWORD 11
+#define REG_QWORD_LITTLE_ENDIAN 11
/* Registry Access Rights */
#define KEY_QUERY_VALUE (0x0001)
@@ -2842,7 +2844,7 @@ typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
} Interrupt;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
struct {
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
struct {
#if defined(NT_PROCESSOR_GROUPS)
USHORT Group;
@@ -2915,11 +2917,11 @@ typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
#define CmResourceTypeDeviceSpecific 5
#define CmResourceTypeBusNumber 6
#define CmResourceTypeMemoryLarge 7
-#define CmResourceTypeNonArbitrated 128
-#define CmResourceTypeConfigData 128
-#define CmResourceTypeDevicePrivate 129
-#define CmResourceTypePcCardConfig 130
-#define CmResourceTypeMfCardConfig 131
+#define CmResourceTypeNonArbitrated 128
+#define CmResourceTypeConfigData 128
+#define CmResourceTypeDevicePrivate 129
+#define CmResourceTypePcCardConfig 130
+#define CmResourceTypeMfCardConfig 131
/* CM_PARTIAL_RESOURCE_DESCRIPTOR.ShareDisposition */
typedef enum _CM_SHARE_DISPOSITION {
@@ -3027,21 +3029,21 @@ typedef struct _CM_ROM_BLOCK {
} CM_ROM_BLOCK, *PCM_ROM_BLOCK;
typedef struct _CM_PARTIAL_RESOURCE_LIST {
- USHORT Version;
- USHORT Revision;
- ULONG Count;
+ USHORT Version;
+ USHORT Revision;
+ ULONG Count;
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1];
} CM_PARTIAL_RESOURCE_LIST, *PCM_PARTIAL_RESOURCE_LIST;
typedef struct _CM_FULL_RESOURCE_DESCRIPTOR {
- INTERFACE_TYPE InterfaceType;
- ULONG BusNumber;
- CM_PARTIAL_RESOURCE_LIST PartialResourceList;
+ INTERFACE_TYPE InterfaceType;
+ ULONG BusNumber;
+ CM_PARTIAL_RESOURCE_LIST PartialResourceList;
} CM_FULL_RESOURCE_DESCRIPTOR, *PCM_FULL_RESOURCE_DESCRIPTOR;
typedef struct _CM_RESOURCE_LIST {
- ULONG Count;
- CM_FULL_RESOURCE_DESCRIPTOR List[1];
+ ULONG Count;
+ CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
typedef struct _PNP_BUS_INFORMATION {
@@ -3053,11 +3055,11 @@ typedef struct _PNP_BUS_INFORMATION {
#include
typedef struct _CM_INT13_DRIVE_PARAMETER {
- USHORT DriveSelect;
- ULONG MaxCylinders;
- USHORT SectorsPerTrack;
- USHORT MaxHeads;
- USHORT NumberDrives;
+ USHORT DriveSelect;
+ ULONG MaxCylinders;
+ USHORT SectorsPerTrack;
+ USHORT MaxHeads;
+ USHORT NumberDrives;
} CM_INT13_DRIVE_PARAMETER, *PCM_INT13_DRIVE_PARAMETER;
typedef struct _CM_MCA_POS_DATA {
@@ -3095,24 +3097,24 @@ typedef struct _CM_PNP_BIOS_INSTALLATION_CHECK {
#include
typedef struct _CM_DISK_GEOMETRY_DEVICE_DATA {
- ULONG BytesPerSector;
- ULONG NumberOfCylinders;
- ULONG SectorsPerTrack;
- ULONG NumberOfHeads;
+ ULONG BytesPerSector;
+ ULONG NumberOfCylinders;
+ ULONG SectorsPerTrack;
+ ULONG NumberOfHeads;
} CM_DISK_GEOMETRY_DEVICE_DATA, *PCM_DISK_GEOMETRY_DEVICE_DATA;
typedef struct _CM_KEYBOARD_DEVICE_DATA {
- USHORT Version;
- USHORT Revision;
- UCHAR Type;
- UCHAR Subtype;
- USHORT KeyboardFlags;
+ USHORT Version;
+ USHORT Revision;
+ UCHAR Type;
+ UCHAR Subtype;
+ USHORT KeyboardFlags;
} CM_KEYBOARD_DEVICE_DATA, *PCM_KEYBOARD_DEVICE_DATA;
typedef struct _CM_SCSI_DEVICE_DATA {
- USHORT Version;
- USHORT Revision;
- UCHAR HostIdentifier;
+ USHORT Version;
+ USHORT Revision;
+ UCHAR HostIdentifier;
} CM_SCSI_DEVICE_DATA, *PCM_SCSI_DEVICE_DATA;
typedef struct _CM_VIDEO_DEVICE_DATA {
@@ -3129,9 +3131,9 @@ typedef struct _CM_SONIC_DEVICE_DATA {
} CM_SONIC_DEVICE_DATA, *PCM_SONIC_DEVICE_DATA;
typedef struct _CM_SERIAL_DEVICE_DATA {
- USHORT Version;
- USHORT Revision;
- ULONG BaudClock;
+ USHORT Version;
+ USHORT Revision;
+ ULONG BaudClock;
} CM_SERIAL_DEVICE_DATA, *PCM_SERIAL_DEVICE_DATA;
typedef struct _CM_MONITOR_DEVICE_DATA {
@@ -3198,10 +3200,10 @@ typedef enum _KEY_INFORMATION_CLASS {
} KEY_INFORMATION_CLASS;
typedef struct _KEY_BASIC_INFORMATION {
- LARGE_INTEGER LastWriteTime;
- ULONG TitleIndex;
- ULONG NameLength;
- WCHAR Name[1];
+ LARGE_INTEGER LastWriteTime;
+ ULONG TitleIndex;
+ ULONG NameLength;
+ WCHAR Name[1];
} KEY_BASIC_INFORMATION, *PKEY_BASIC_INFORMATION;
typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
@@ -3209,17 +3211,17 @@ typedef struct _KEY_CONTROL_FLAGS_INFORMATION {
} KEY_CONTROL_FLAGS_INFORMATION, *PKEY_CONTROL_FLAGS_INFORMATION;
typedef struct _KEY_FULL_INFORMATION {
- LARGE_INTEGER LastWriteTime;
- ULONG TitleIndex;
- ULONG ClassOffset;
- ULONG ClassLength;
- ULONG SubKeys;
- ULONG MaxNameLen;
- ULONG MaxClassLen;
- ULONG Values;
- ULONG MaxValueNameLen;
- ULONG MaxValueDataLen;
- WCHAR Class[1];
+ LARGE_INTEGER LastWriteTime;
+ ULONG TitleIndex;
+ ULONG ClassOffset;
+ ULONG ClassLength;
+ ULONG SubKeys;
+ ULONG MaxNameLen;
+ ULONG MaxClassLen;
+ ULONG Values;
+ ULONG MaxValueNameLen;
+ ULONG MaxValueDataLen;
+ WCHAR Class[1];
} KEY_FULL_INFORMATION, *PKEY_FULL_INFORMATION;
typedef struct _KEY_HANDLE_TAGS_INFORMATION {
@@ -3227,12 +3229,12 @@ typedef struct _KEY_HANDLE_TAGS_INFORMATION {
} KEY_HANDLE_TAGS_INFORMATION, *PKEY_HANDLE_TAGS_INFORMATION;
typedef struct _KEY_NODE_INFORMATION {
- LARGE_INTEGER LastWriteTime;
- ULONG TitleIndex;
- ULONG ClassOffset;
- ULONG ClassLength;
- ULONG NameLength;
- WCHAR Name[1];
+ LARGE_INTEGER LastWriteTime;
+ ULONG TitleIndex;
+ ULONG ClassOffset;
+ ULONG ClassLength;
+ ULONG NameLength;
+ WCHAR Name[1];
} KEY_NODE_INFORMATION, *PKEY_NODE_INFORMATION;
typedef enum _KEY_SET_INFORMATION_CLASS {
@@ -3253,39 +3255,39 @@ typedef struct _KEY_SET_VIRTUALIZATION_INFORMATION {
} KEY_SET_VIRTUALIZATION_INFORMATION, *PKEY_SET_VIRTUALIZATION_INFORMATION;
typedef struct _KEY_VALUE_BASIC_INFORMATION {
- ULONG TitleIndex;
- ULONG Type;
- ULONG NameLength;
- WCHAR Name[1];
+ ULONG TitleIndex;
+ ULONG Type;
+ ULONG NameLength;
+ WCHAR Name[1];
} KEY_VALUE_BASIC_INFORMATION, *PKEY_VALUE_BASIC_INFORMATION;
typedef struct _KEY_VALUE_FULL_INFORMATION {
- ULONG TitleIndex;
- ULONG Type;
- ULONG DataOffset;
- ULONG DataLength;
- ULONG NameLength;
- WCHAR Name[1];
+ ULONG TitleIndex;
+ ULONG Type;
+ ULONG DataOffset;
+ ULONG DataLength;
+ ULONG NameLength;
+ WCHAR Name[1];
} KEY_VALUE_FULL_INFORMATION, *PKEY_VALUE_FULL_INFORMATION;
typedef struct _KEY_VALUE_PARTIAL_INFORMATION {
- ULONG TitleIndex;
- ULONG Type;
- ULONG DataLength;
- UCHAR Data[1];
+ ULONG TitleIndex;
+ ULONG Type;
+ ULONG DataLength;
+ UCHAR Data[1];
} KEY_VALUE_PARTIAL_INFORMATION, *PKEY_VALUE_PARTIAL_INFORMATION;
typedef struct _KEY_VALUE_PARTIAL_INFORMATION_ALIGN64 {
- ULONG Type;
- ULONG DataLength;
- UCHAR Data[1];
+ ULONG Type;
+ ULONG DataLength;
+ UCHAR Data[1];
} KEY_VALUE_PARTIAL_INFORMATION_ALIGN64, *PKEY_VALUE_PARTIAL_INFORMATION_ALIGN64;
typedef struct _KEY_VALUE_ENTRY {
- PUNICODE_STRING ValueName;
- ULONG DataLength;
- ULONG DataOffset;
- ULONG Type;
+ PUNICODE_STRING ValueName;
+ ULONG DataLength;
+ ULONG DataOffset;
+ ULONG Type;
} KEY_VALUE_ENTRY, *PKEY_VALUE_ENTRY;
typedef enum _KEY_VALUE_INFORMATION_CLASS {
@@ -3301,7 +3303,7 @@ typedef struct _KEY_WOW64_FLAGS_INFORMATION {
} KEY_WOW64_FLAGS_INFORMATION, *PKEY_WOW64_FLAGS_INFORMATION;
typedef struct _KEY_WRITE_TIME_INFORMATION {
- LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER LastWriteTime;
} KEY_WRITE_TIME_INFORMATION, *PKEY_WRITE_TIME_INFORMATION;
typedef enum _REG_NOTIFY_CLASS {
@@ -3368,8 +3370,8 @@ typedef enum _REG_NOTIFY_CLASS {
typedef NTSTATUS
(NTAPI EX_CALLBACK_FUNCTION)(
- IN PVOID CallbackContext,
- IN PVOID Argument1,
+ IN PVOID CallbackContext,
+ IN PVOID Argument1,
IN PVOID Argument2);
typedef EX_CALLBACK_FUNCTION *PEX_CALLBACK_FUNCTION;
@@ -3695,20 +3697,6 @@ typedef enum _CM_ERROR_CONTROL_TYPE {
* I/O Manager Types *
******************************************************************************/
-#define WDM_MAJORVERSION 0x06
-#define WDM_MINORVERSION 0x00
-
-#if defined(_WIN64)
-
-#ifndef USE_DMA_MACROS
-#define USE_DMA_MACROS
-#endif
-
-#ifndef NO_LEGACY_DRIVERS
-#define NO_LEGACY_DRIVERS
-#endif
-
-#endif /* defined(_WIN64) */
#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
@@ -3859,20 +3847,20 @@ typedef struct _OBJECT_HANDLE_INFORMATION {
} OBJECT_HANDLE_INFORMATION, *POBJECT_HANDLE_INFORMATION;
typedef struct _CLIENT_ID {
- HANDLE UniqueProcess;
- HANDLE UniqueThread;
+ HANDLE UniqueProcess;
+ HANDLE UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
typedef struct _VPB {
- CSHORT Type;
- CSHORT Size;
- USHORT Flags;
- USHORT VolumeLabelLength;
- struct _DEVICE_OBJECT *DeviceObject;
- struct _DEVICE_OBJECT *RealDevice;
- ULONG SerialNumber;
- ULONG ReferenceCount;
- WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
+ CSHORT Type;
+ CSHORT Size;
+ USHORT Flags;
+ USHORT VolumeLabelLength;
+ struct _DEVICE_OBJECT *DeviceObject;
+ struct _DEVICE_OBJECT *RealDevice;
+ ULONG SerialNumber;
+ ULONG ReferenceCount;
+ WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
} VPB, *PVPB;
typedef enum _IO_ALLOCATION_ACTION {
@@ -3883,20 +3871,20 @@ typedef enum _IO_ALLOCATION_ACTION {
typedef IO_ALLOCATION_ACTION
(NTAPI DRIVER_CONTROL)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp,
- IN PVOID MapRegisterBase,
- IN PVOID Context);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp,
+ IN PVOID MapRegisterBase,
+ IN PVOID Context);
typedef DRIVER_CONTROL *PDRIVER_CONTROL;
typedef struct _WAIT_CONTEXT_BLOCK {
- KDEVICE_QUEUE_ENTRY WaitQueueEntry;
- PDRIVER_CONTROL DeviceRoutine;
- PVOID DeviceContext;
- ULONG NumberOfMapRegisters;
- PVOID DeviceObject;
- PVOID CurrentIrp;
- PKDPC BufferChainingDpc;
+ KDEVICE_QUEUE_ENTRY WaitQueueEntry;
+ PDRIVER_CONTROL DeviceRoutine;
+ PVOID DeviceContext;
+ ULONG NumberOfMapRegisters;
+ PVOID DeviceObject;
+ PVOID CurrentIrp;
+ PKDPC BufferChainingDpc;
} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
/* DEVICE_OBJECT.Flags */
@@ -3941,34 +3929,34 @@ typedef struct _WAIT_CONTEXT_BLOCK {
#define DEVICE_TYPE ULONG
typedef struct _DEVICE_OBJECT {
- CSHORT Type;
- USHORT Size;
- LONG ReferenceCount;
- struct _DRIVER_OBJECT *DriverObject;
- struct _DEVICE_OBJECT *NextDevice;
- struct _DEVICE_OBJECT *AttachedDevice;
- struct _IRP *CurrentIrp;
- PIO_TIMER Timer;
- ULONG Flags;
- ULONG Characteristics;
- volatile PVPB Vpb;
- PVOID DeviceExtension;
- DEVICE_TYPE DeviceType;
- CCHAR StackSize;
+ CSHORT Type;
+ USHORT Size;
+ LONG ReferenceCount;
+ struct _DRIVER_OBJECT *DriverObject;
+ struct _DEVICE_OBJECT *NextDevice;
+ struct _DEVICE_OBJECT *AttachedDevice;
+ struct _IRP *CurrentIrp;
+ PIO_TIMER Timer;
+ ULONG Flags;
+ ULONG Characteristics;
+ volatile PVPB Vpb;
+ PVOID DeviceExtension;
+ DEVICE_TYPE DeviceType;
+ CCHAR StackSize;
union {
- LIST_ENTRY ListEntry;
- WAIT_CONTEXT_BLOCK Wcb;
+ LIST_ENTRY ListEntry;
+ WAIT_CONTEXT_BLOCK Wcb;
} Queue;
- ULONG AlignmentRequirement;
- KDEVICE_QUEUE DeviceQueue;
- KDPC Dpc;
- ULONG ActiveThreadCount;
- PSECURITY_DESCRIPTOR SecurityDescriptor;
- KEVENT DeviceLock;
- USHORT SectorSize;
- USHORT Spare1;
- struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
- PVOID Reserved;
+ ULONG AlignmentRequirement;
+ KDEVICE_QUEUE DeviceQueue;
+ KDPC Dpc;
+ ULONG ActiveThreadCount;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
+ KEVENT DeviceLock;
+ USHORT SectorSize;
+ USHORT Spare1;
+ struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
+ PVOID Reserved;
} DEVICE_OBJECT, *PDEVICE_OBJECT;
typedef enum _IO_SESSION_STATE {
@@ -4048,11 +4036,11 @@ typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
IN OUT ULONG Version;
- union {
+ _ANONYMOUS_UNION union {
IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
- };
+ } DUMMYUNIONNAME;
} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
@@ -4121,29 +4109,29 @@ typedef IO_SESSION_NOTIFICATION_FUNCTION *PIO_SESSION_NOTIFICATION_FUNCTION;
typedef struct _IO_REMOVE_LOCK_TRACKING_BLOCK * PIO_REMOVE_LOCK_TRACKING_BLOCK;
typedef struct _IO_REMOVE_LOCK_COMMON_BLOCK {
- BOOLEAN Removed;
- BOOLEAN Reserved[3];
- volatile LONG IoCount;
- KEVENT RemoveEvent;
+ BOOLEAN Removed;
+ BOOLEAN Reserved[3];
+ volatile LONG IoCount;
+ KEVENT RemoveEvent;
} IO_REMOVE_LOCK_COMMON_BLOCK;
typedef struct _IO_REMOVE_LOCK_DBG_BLOCK {
- LONG Signature;
- LONG HighWatermark;
- LONGLONG MaxLockedTicks;
- LONG AllocateTag;
- LIST_ENTRY LockList;
- KSPIN_LOCK Spin;
- volatile LONG LowMemoryCount;
- ULONG Reserved1[4];
- PVOID Reserved2;
- PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
+ LONG Signature;
+ LONG HighWatermark;
+ LONGLONG MaxLockedTicks;
+ LONG AllocateTag;
+ LIST_ENTRY LockList;
+ KSPIN_LOCK Spin;
+ volatile LONG LowMemoryCount;
+ ULONG Reserved1[4];
+ PVOID Reserved2;
+ PIO_REMOVE_LOCK_TRACKING_BLOCK Blocks;
} IO_REMOVE_LOCK_DBG_BLOCK;
typedef struct _IO_REMOVE_LOCK {
- IO_REMOVE_LOCK_COMMON_BLOCK Common;
+ IO_REMOVE_LOCK_COMMON_BLOCK Common;
#if DBG
- IO_REMOVE_LOCK_DBG_BLOCK Dbg;
+ IO_REMOVE_LOCK_DBG_BLOCK Dbg;
#endif
} IO_REMOVE_LOCK, *PIO_REMOVE_LOCK;
@@ -4151,8 +4139,8 @@ typedef struct _IO_WORKITEM *PIO_WORKITEM;
typedef VOID
(NTAPI IO_WORKITEM_ROUTINE)(
- IN PDEVICE_OBJECT DeviceObject,
- IN PVOID Context);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PVOID Context);
typedef IO_WORKITEM_ROUTINE *PIO_WORKITEM_ROUTINE;
typedef VOID
@@ -4163,87 +4151,87 @@ typedef VOID
typedef IO_WORKITEM_ROUTINE_EX *PIO_WORKITEM_ROUTINE_EX;
typedef struct _SHARE_ACCESS {
- ULONG OpenCount;
- ULONG Readers;
- ULONG Writers;
- ULONG Deleters;
- ULONG SharedRead;
- ULONG SharedWrite;
- ULONG SharedDelete;
+ ULONG OpenCount;
+ ULONG Readers;
+ ULONG Writers;
+ ULONG Deleters;
+ ULONG SharedRead;
+ ULONG SharedWrite;
+ ULONG SharedDelete;
} SHARE_ACCESS, *PSHARE_ACCESS;
/* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
inheritance, even from a struct renders the type non-POD. So we use
this hack */
-#define PCI_COMMON_HEADER_LAYOUT \
- USHORT VendorID; \
- USHORT DeviceID; \
- USHORT Command; \
- USHORT Status; \
- UCHAR RevisionID; \
- UCHAR ProgIf; \
- UCHAR SubClass; \
- UCHAR BaseClass; \
- UCHAR CacheLineSize; \
- UCHAR LatencyTimer; \
- UCHAR HeaderType; \
- UCHAR BIST; \
- union { \
- struct _PCI_HEADER_TYPE_0 { \
- ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
- ULONG CIS; \
- USHORT SubVendorID; \
- USHORT SubSystemID; \
- ULONG ROMBaseAddress; \
- UCHAR CapabilitiesPtr; \
- UCHAR Reserved1[3]; \
- ULONG Reserved2; \
- UCHAR InterruptLine; \
- UCHAR InterruptPin; \
- UCHAR MinimumGrant; \
- UCHAR MaximumLatency; \
- } type0; \
- struct _PCI_HEADER_TYPE_1 { \
- ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
- UCHAR PrimaryBus; \
- UCHAR SecondaryBus; \
- UCHAR SubordinateBus; \
- UCHAR SecondaryLatency; \
- UCHAR IOBase; \
- UCHAR IOLimit; \
- USHORT SecondaryStatus; \
- USHORT MemoryBase; \
- USHORT MemoryLimit; \
- USHORT PrefetchBase; \
- USHORT PrefetchLimit; \
- ULONG PrefetchBaseUpper32; \
- ULONG PrefetchLimitUpper32; \
- USHORT IOBaseUpper16; \
- USHORT IOLimitUpper16; \
- UCHAR CapabilitiesPtr; \
- UCHAR Reserved1[3]; \
- ULONG ROMBaseAddress; \
- UCHAR InterruptLine; \
- UCHAR InterruptPin; \
- USHORT BridgeControl; \
- } type1; \
- struct _PCI_HEADER_TYPE_2 { \
- ULONG SocketRegistersBaseAddress; \
- UCHAR CapabilitiesPtr; \
- UCHAR Reserved; \
- USHORT SecondaryStatus; \
- UCHAR PrimaryBus; \
- UCHAR SecondaryBus; \
- UCHAR SubordinateBus; \
- UCHAR SecondaryLatency; \
- struct { \
- ULONG Base; \
- ULONG Limit; \
- } Range[PCI_TYPE2_ADDRESSES-1]; \
- UCHAR InterruptLine; \
- UCHAR InterruptPin; \
- USHORT BridgeControl; \
- } type2; \
+#define PCI_COMMON_HEADER_LAYOUT \
+ USHORT VendorID; \
+ USHORT DeviceID; \
+ USHORT Command; \
+ USHORT Status; \
+ UCHAR RevisionID; \
+ UCHAR ProgIf; \
+ UCHAR SubClass; \
+ UCHAR BaseClass; \
+ UCHAR CacheLineSize; \
+ UCHAR LatencyTimer; \
+ UCHAR HeaderType; \
+ UCHAR BIST; \
+ union { \
+ struct _PCI_HEADER_TYPE_0 { \
+ ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
+ ULONG CIS; \
+ USHORT SubVendorID; \
+ USHORT SubSystemID; \
+ ULONG ROMBaseAddress; \
+ UCHAR CapabilitiesPtr; \
+ UCHAR Reserved1[3]; \
+ ULONG Reserved2; \
+ UCHAR InterruptLine; \
+ UCHAR InterruptPin; \
+ UCHAR MinimumGrant; \
+ UCHAR MaximumLatency; \
+ } type0; \
+ struct _PCI_HEADER_TYPE_1 { \
+ ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
+ UCHAR PrimaryBus; \
+ UCHAR SecondaryBus; \
+ UCHAR SubordinateBus; \
+ UCHAR SecondaryLatency; \
+ UCHAR IOBase; \
+ UCHAR IOLimit; \
+ USHORT SecondaryStatus; \
+ USHORT MemoryBase; \
+ USHORT MemoryLimit; \
+ USHORT PrefetchBase; \
+ USHORT PrefetchLimit; \
+ ULONG PrefetchBaseUpper32; \
+ ULONG PrefetchLimitUpper32; \
+ USHORT IOBaseUpper16; \
+ USHORT IOLimitUpper16; \
+ UCHAR CapabilitiesPtr; \
+ UCHAR Reserved1[3]; \
+ ULONG ROMBaseAddress; \
+ UCHAR InterruptLine; \
+ UCHAR InterruptPin; \
+ USHORT BridgeControl; \
+ } type1; \
+ struct _PCI_HEADER_TYPE_2 { \
+ ULONG SocketRegistersBaseAddress; \
+ UCHAR CapabilitiesPtr; \
+ UCHAR Reserved; \
+ USHORT SecondaryStatus; \
+ UCHAR PrimaryBus; \
+ UCHAR SecondaryBus; \
+ UCHAR SubordinateBus; \
+ UCHAR SecondaryLatency; \
+ struct { \
+ ULONG Base; \
+ ULONG Limit; \
+ } Range[PCI_TYPE2_ADDRESSES-1]; \
+ UCHAR InterruptLine; \
+ UCHAR InterruptPin; \
+ USHORT BridgeControl; \
+ } type2; \
} u;
typedef enum _CREATE_FILE_TYPE {
@@ -4260,10 +4248,10 @@ typedef enum _CREATE_FILE_TYPE {
typedef struct _IO_STATUS_BLOCK {
_ANONYMOUS_UNION union {
- NTSTATUS Status;
- PVOID Pointer;
+ NTSTATUS Status;
+ PVOID Pointer;
} DUMMYUNIONNAME;
- ULONG_PTR Information;
+ ULONG_PTR Information;
} IO_STATUS_BLOCK, *PIO_STATUS_BLOCK;
#if defined(_WIN64)
@@ -4280,7 +4268,7 @@ typedef VOID
IN ULONG Reserved);
#define PIO_APC_ROUTINE_DEFINED
-
+
typedef enum _IO_SESSION_EVENT {
IoSessionEventIgnore = 0,
IoSessionEventCreated,
@@ -4327,21 +4315,21 @@ typedef struct _IO_SESSION_CONNECT_INFO {
#define MM_MAXIMUM_DISK_IO_SIZE (0x10000)
typedef struct _BOOTDISK_INFORMATION {
- LONGLONG BootPartitionOffset;
- LONGLONG SystemPartitionOffset;
- ULONG BootDeviceSignature;
- ULONG SystemDeviceSignature;
+ LONGLONG BootPartitionOffset;
+ LONGLONG SystemPartitionOffset;
+ ULONG BootDeviceSignature;
+ ULONG SystemDeviceSignature;
} BOOTDISK_INFORMATION, *PBOOTDISK_INFORMATION;
typedef struct _BOOTDISK_INFORMATION_EX {
- LONGLONG BootPartitionOffset;
- LONGLONG SystemPartitionOffset;
- ULONG BootDeviceSignature;
- ULONG SystemDeviceSignature;
- GUID BootDeviceGuid;
- GUID SystemDeviceGuid;
- BOOLEAN BootDeviceIsGpt;
- BOOLEAN SystemDeviceIsGpt;
+ LONGLONG BootPartitionOffset;
+ LONGLONG SystemPartitionOffset;
+ ULONG BootDeviceSignature;
+ ULONG SystemDeviceSignature;
+ GUID BootDeviceGuid;
+ GUID SystemDeviceGuid;
+ BOOLEAN BootDeviceIsGpt;
+ BOOLEAN SystemDeviceIsGpt;
} BOOTDISK_INFORMATION_EX, *PBOOTDISK_INFORMATION_EX;
#if (NTDDI_VERSION >= NTDDI_WIN7)
@@ -4349,10 +4337,10 @@ typedef struct _BOOTDISK_INFORMATION_EX {
typedef struct _LOADER_PARTITION_INFORMATION_EX {
ULONG PartitionStyle;
ULONG PartitionNumber;
- union {
+ _ANONYMOUS_UNION union {
ULONG Signature;
GUID DeviceId;
- };
+ } DUMMYUNIONNAME;
ULONG Flags;
} LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
@@ -4379,65 +4367,65 @@ typedef struct _BOOTDISK_INFORMATION_LITE {
#include
typedef struct _EISA_MEMORY_TYPE {
- UCHAR ReadWrite : 1;
- UCHAR Cached : 1;
- UCHAR Reserved0 : 1;
- UCHAR Type : 2;
- UCHAR Shared : 1;
- UCHAR Reserved1 : 1;
- UCHAR MoreEntries : 1;
+ UCHAR ReadWrite:1;
+ UCHAR Cached:1;
+ UCHAR Reserved0:1;
+ UCHAR Type:2;
+ UCHAR Shared:1;
+ UCHAR Reserved1:1;
+ UCHAR MoreEntries:1;
} EISA_MEMORY_TYPE, *PEISA_MEMORY_TYPE;
typedef struct _EISA_MEMORY_CONFIGURATION {
- EISA_MEMORY_TYPE ConfigurationByte;
- UCHAR DataSize;
- USHORT AddressLowWord;
- UCHAR AddressHighByte;
- USHORT MemorySize;
+ EISA_MEMORY_TYPE ConfigurationByte;
+ UCHAR DataSize;
+ USHORT AddressLowWord;
+ UCHAR AddressHighByte;
+ USHORT MemorySize;
} EISA_MEMORY_CONFIGURATION, *PEISA_MEMORY_CONFIGURATION;
typedef struct _EISA_IRQ_DESCRIPTOR {
- UCHAR Interrupt : 4;
- UCHAR Reserved : 1;
- UCHAR LevelTriggered : 1;
- UCHAR Shared : 1;
- UCHAR MoreEntries : 1;
+ UCHAR Interrupt:4;
+ UCHAR Reserved:1;
+ UCHAR LevelTriggered:1;
+ UCHAR Shared:1;
+ UCHAR MoreEntries:1;
} EISA_IRQ_DESCRIPTOR, *PEISA_IRQ_DESCRIPTOR;
typedef struct _EISA_IRQ_CONFIGURATION {
- EISA_IRQ_DESCRIPTOR ConfigurationByte;
- UCHAR Reserved;
+ EISA_IRQ_DESCRIPTOR ConfigurationByte;
+ UCHAR Reserved;
} EISA_IRQ_CONFIGURATION, *PEISA_IRQ_CONFIGURATION;
typedef struct _DMA_CONFIGURATION_BYTE0 {
- UCHAR Channel : 3;
- UCHAR Reserved : 3;
- UCHAR Shared : 1;
- UCHAR MoreEntries : 1;
+ UCHAR Channel:3;
+ UCHAR Reserved:3;
+ UCHAR Shared:1;
+ UCHAR MoreEntries:1;
} DMA_CONFIGURATION_BYTE0;
typedef struct _DMA_CONFIGURATION_BYTE1 {
- UCHAR Reserved0 : 2;
- UCHAR TransferSize : 2;
- UCHAR Timing : 2;
- UCHAR Reserved1 : 2;
+ UCHAR Reserved0:2;
+ UCHAR TransferSize:2;
+ UCHAR Timing:2;
+ UCHAR Reserved1:2;
} DMA_CONFIGURATION_BYTE1;
typedef struct _EISA_DMA_CONFIGURATION {
- DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
- DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
+ DMA_CONFIGURATION_BYTE0 ConfigurationByte0;
+ DMA_CONFIGURATION_BYTE1 ConfigurationByte1;
} EISA_DMA_CONFIGURATION, *PEISA_DMA_CONFIGURATION;
typedef struct _EISA_PORT_DESCRIPTOR {
- UCHAR NumberPorts : 5;
- UCHAR Reserved : 1;
- UCHAR Shared : 1;
- UCHAR MoreEntries : 1;
+ UCHAR NumberPorts:5;
+ UCHAR Reserved:1;
+ UCHAR Shared:1;
+ UCHAR MoreEntries:1;
} EISA_PORT_DESCRIPTOR, *PEISA_PORT_DESCRIPTOR;
typedef struct _EISA_PORT_CONFIGURATION {
- EISA_PORT_DESCRIPTOR Configuration;
- USHORT PortAddress;
+ EISA_PORT_DESCRIPTOR Configuration;
+ USHORT PortAddress;
} EISA_PORT_CONFIGURATION, *PEISA_PORT_CONFIGURATION;
typedef struct _CM_EISA_SLOT_INFORMATION {
@@ -4452,19 +4440,19 @@ typedef struct _CM_EISA_SLOT_INFORMATION {
} CM_EISA_SLOT_INFORMATION, *PCM_EISA_SLOT_INFORMATION;
typedef struct _CM_EISA_FUNCTION_INFORMATION {
- ULONG CompressedId;
- UCHAR IdSlotFlags1;
- UCHAR IdSlotFlags2;
- UCHAR MinorRevision;
- UCHAR MajorRevision;
- UCHAR Selections[26];
- UCHAR FunctionFlags;
- UCHAR TypeString[80];
- EISA_MEMORY_CONFIGURATION EisaMemory[9];
- EISA_IRQ_CONFIGURATION EisaIrq[7];
- EISA_DMA_CONFIGURATION EisaDma[4];
- EISA_PORT_CONFIGURATION EisaPort[20];
- UCHAR InitializationData[60];
+ ULONG CompressedId;
+ UCHAR IdSlotFlags1;
+ UCHAR IdSlotFlags2;
+ UCHAR MinorRevision;
+ UCHAR MajorRevision;
+ UCHAR Selections[26];
+ UCHAR FunctionFlags;
+ UCHAR TypeString[80];
+ EISA_MEMORY_CONFIGURATION EisaMemory[9];
+ EISA_IRQ_CONFIGURATION EisaIrq[7];
+ EISA_DMA_CONFIGURATION EisaDma[4];
+ EISA_PORT_CONFIGURATION EisaPort[20];
+ UCHAR InitializationData[60];
} CM_EISA_FUNCTION_INFORMATION, *PCM_EISA_FUNCTION_INFORMATION;
#include
@@ -4501,7 +4489,7 @@ typedef struct _CM_EISA_FUNCTION_INFORMATION {
typedef VOID
(NTAPI *PINTERFACE_REFERENCE)(
- PVOID Context);
+ PVOID Context);
typedef VOID
(NTAPI *PINTERFACE_DEREFERENCE)(
@@ -4509,27 +4497,27 @@ typedef VOID
typedef BOOLEAN
(NTAPI TRANSLATE_BUS_ADDRESS)(
- IN PVOID Context,
- IN PHYSICAL_ADDRESS BusAddress,
- IN ULONG Length,
- IN OUT PULONG AddressSpace,
+ IN PVOID Context,
+ IN PHYSICAL_ADDRESS BusAddress,
+ IN ULONG Length,
+ IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
typedef TRANSLATE_BUS_ADDRESS *PTRANSLATE_BUS_ADDRESS;
typedef struct _DMA_ADAPTER*
(NTAPI GET_DMA_ADAPTER)(
- IN PVOID Context,
- IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
- OUT PULONG NumberOfMapRegisters);
+ IN PVOID Context,
+ IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
+ OUT PULONG NumberOfMapRegisters);
typedef GET_DMA_ADAPTER *PGET_DMA_ADAPTER;
typedef ULONG
(NTAPI GET_SET_DEVICE_DATA)(
- IN PVOID Context,
- IN ULONG DataType,
- IN PVOID Buffer,
- IN ULONG Offset,
- IN ULONG Length);
+ IN PVOID Context,
+ IN ULONG DataType,
+ IN PVOID Buffer,
+ IN ULONG Offset,
+ IN ULONG Length);
typedef GET_SET_DEVICE_DATA *PGET_SET_DEVICE_DATA;
typedef enum _DEVICE_INSTALL_STATE {
@@ -4581,26 +4569,26 @@ typedef VOID
#define PCI_USE_LOCAL_DEVICE 0x00000040
typedef struct _PCI_DEVICE_PRESENCE_PARAMETERS {
- ULONG Size;
- ULONG Flags;
- USHORT VendorID;
- USHORT DeviceID;
- UCHAR RevisionID;
- USHORT SubVendorID;
- USHORT SubSystemID;
- UCHAR BaseClass;
- UCHAR SubClass;
- UCHAR ProgIf;
+ ULONG Size;
+ ULONG Flags;
+ USHORT VendorID;
+ USHORT DeviceID;
+ UCHAR RevisionID;
+ USHORT SubVendorID;
+ USHORT SubSystemID;
+ UCHAR BaseClass;
+ UCHAR SubClass;
+ UCHAR ProgIf;
} PCI_DEVICE_PRESENCE_PARAMETERS, *PPCI_DEVICE_PRESENCE_PARAMETERS;
typedef BOOLEAN
(NTAPI PCI_IS_DEVICE_PRESENT)(
- IN USHORT VendorID,
- IN USHORT DeviceID,
- IN UCHAR RevisionID,
- IN USHORT SubVendorID,
- IN USHORT SubSystemID,
- IN ULONG Flags);
+ IN USHORT VendorID,
+ IN USHORT DeviceID,
+ IN UCHAR RevisionID,
+ IN USHORT SubVendorID,
+ IN USHORT SubSystemID,
+ IN ULONG Flags);
typedef PCI_IS_DEVICE_PRESENT *PPCI_IS_DEVICE_PRESENT;
typedef BOOLEAN
@@ -4610,87 +4598,87 @@ typedef BOOLEAN
typedef PCI_IS_DEVICE_PRESENT_EX *PPCI_IS_DEVICE_PRESENT_EX;
typedef struct _BUS_INTERFACE_STANDARD {
- USHORT Size;
- USHORT Version;
- PVOID Context;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
- PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
- PGET_DMA_ADAPTER GetDmaAdapter;
- PGET_SET_DEVICE_DATA SetBusData;
- PGET_SET_DEVICE_DATA GetBusData;
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
+ PGET_DMA_ADAPTER GetDmaAdapter;
+ PGET_SET_DEVICE_DATA SetBusData;
+ PGET_SET_DEVICE_DATA GetBusData;
} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
typedef struct _PCI_DEVICE_PRESENT_INTERFACE {
- USHORT Size;
- USHORT Version;
- PVOID Context;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
- PPCI_IS_DEVICE_PRESENT IsDevicePresent;
- PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PPCI_IS_DEVICE_PRESENT IsDevicePresent;
+ PPCI_IS_DEVICE_PRESENT_EX IsDevicePresentEx;
} PCI_DEVICE_PRESENT_INTERFACE, *PPCI_DEVICE_PRESENT_INTERFACE;
typedef struct _DEVICE_CAPABILITIES {
- USHORT Size;
- USHORT Version;
- ULONG DeviceD1 : 1;
- ULONG DeviceD2 : 1;
- ULONG LockSupported : 1;
- ULONG EjectSupported : 1;
- ULONG Removable : 1;
- ULONG DockDevice : 1;
- ULONG UniqueID : 1;
- ULONG SilentInstall : 1;
- ULONG RawDeviceOK : 1;
- ULONG SurpriseRemovalOK : 1;
- ULONG WakeFromD0 : 1;
- ULONG WakeFromD1 : 1;
- ULONG WakeFromD2 : 1;
- ULONG WakeFromD3 : 1;
- ULONG HardwareDisabled : 1;
- ULONG NonDynamic : 1;
- ULONG WarmEjectSupported : 1;
- ULONG NoDisplayInUI : 1;
- ULONG Reserved : 14;
- ULONG Address;
- ULONG UINumber;
- DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
- SYSTEM_POWER_STATE SystemWake;
- DEVICE_POWER_STATE DeviceWake;
- ULONG D1Latency;
- ULONG D2Latency;
- ULONG D3Latency;
+ USHORT Size;
+ USHORT Version;
+ ULONG DeviceD1:1;
+ ULONG DeviceD2:1;
+ ULONG LockSupported:1;
+ ULONG EjectSupported:1;
+ ULONG Removable:1;
+ ULONG DockDevice:1;
+ ULONG UniqueID:1;
+ ULONG SilentInstall:1;
+ ULONG RawDeviceOK:1;
+ ULONG SurpriseRemovalOK:1;
+ ULONG WakeFromD0:1;
+ ULONG WakeFromD1:1;
+ ULONG WakeFromD2:1;
+ ULONG WakeFromD3:1;
+ ULONG HardwareDisabled:1;
+ ULONG NonDynamic:1;
+ ULONG WarmEjectSupported:1;
+ ULONG NoDisplayInUI:1;
+ ULONG Reserved:14;
+ ULONG Address;
+ ULONG UINumber;
+ DEVICE_POWER_STATE DeviceState[PowerSystemMaximum];
+ SYSTEM_POWER_STATE SystemWake;
+ DEVICE_POWER_STATE DeviceWake;
+ ULONG D1Latency;
+ ULONG D2Latency;
+ ULONG D3Latency;
} DEVICE_CAPABILITIES, *PDEVICE_CAPABILITIES;
typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
- USHORT Version;
- USHORT Size;
- GUID Event;
- GUID InterfaceClassGuid;
- PUNICODE_STRING SymbolicLinkName;
+ USHORT Version;
+ USHORT Size;
+ GUID Event;
+ GUID InterfaceClassGuid;
+ PUNICODE_STRING SymbolicLinkName;
} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
- USHORT Version;
- USHORT Size;
- GUID Event;
+ USHORT Version;
+ USHORT Size;
+ GUID Event;
} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
#undef INTERFACE
typedef struct _INTERFACE {
- USHORT Size;
- USHORT Version;
- PVOID Context;
- PINTERFACE_REFERENCE InterfaceReference;
- PINTERFACE_DEREFERENCE InterfaceDereference;
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
} INTERFACE, *PINTERFACE;
typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
- USHORT Version;
- USHORT Size;
- GUID Event;
+ USHORT Version;
+ USHORT Size;
+ GUID Event;
} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
@@ -4705,19 +4693,19 @@ typedef ULONG PNP_DEVICE_STATE, *PPNP_DEVICE_STATE;
#define PNP_DEVICE_NOT_DISABLEABLE 0x00000020
typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
- USHORT Version;
- USHORT Size;
- GUID Event;
- struct _FILE_OBJECT *FileObject;
- LONG NameBufferOffset;
- UCHAR CustomDataBuffer[1];
+ USHORT Version;
+ USHORT Size;
+ GUID Event;
+ struct _FILE_OBJECT *FileObject;
+ LONG NameBufferOffset;
+ UCHAR CustomDataBuffer[1];
} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
- USHORT Version;
- USHORT Size;
- GUID Event;
- struct _FILE_OBJECT *FileObject;
+ USHORT Version;
+ USHORT Size;
+ GUID Event;
+ struct _FILE_OBJECT *FileObject;
} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
#if (NTDDI_VERSION >= NTDDI_VISTA)
@@ -4861,9 +4849,9 @@ typedef enum _DEVICE_USAGE_NOTIFICATION_TYPE {
} DEVICE_USAGE_NOTIFICATION_TYPE;
typedef struct _POWER_SEQUENCE {
- ULONG SequenceD1;
- ULONG SequenceD2;
- ULONG SequenceD3;
+ ULONG SequenceD1;
+ ULONG SequenceD2;
+ ULONG SequenceD3;
} POWER_SEQUENCE, *PPOWER_SEQUENCE;
typedef enum {
@@ -4981,15 +4969,15 @@ typedef enum _FILE_INFORMATION_CLASS {
} FILE_INFORMATION_CLASS, *PFILE_INFORMATION_CLASS;
typedef struct _FILE_POSITION_INFORMATION {
- LARGE_INTEGER CurrentByteOffset;
+ LARGE_INTEGER CurrentByteOffset;
} FILE_POSITION_INFORMATION, *PFILE_POSITION_INFORMATION;
typedef struct _FILE_BASIC_INFORMATION {
- LARGE_INTEGER CreationTime;
- LARGE_INTEGER LastAccessTime;
- LARGE_INTEGER LastWriteTime;
- LARGE_INTEGER ChangeTime;
- ULONG FileAttributes;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ ULONG FileAttributes;
} FILE_BASIC_INFORMATION, *PFILE_BASIC_INFORMATION;
typedef struct _FILE_IO_PRIORITY_HINT_INFORMATION {
@@ -5019,21 +5007,21 @@ typedef struct _FILE_PROCESS_IDS_USING_FILE_INFORMATION {
} FILE_PROCESS_IDS_USING_FILE_INFORMATION, *PFILE_PROCESS_IDS_USING_FILE_INFORMATION;
typedef struct _FILE_STANDARD_INFORMATION {
- LARGE_INTEGER AllocationSize;
- LARGE_INTEGER EndOfFile;
- ULONG NumberOfLinks;
- BOOLEAN DeletePending;
- BOOLEAN Directory;
+ LARGE_INTEGER AllocationSize;
+ LARGE_INTEGER EndOfFile;
+ ULONG NumberOfLinks;
+ BOOLEAN DeletePending;
+ BOOLEAN Directory;
} FILE_STANDARD_INFORMATION, *PFILE_STANDARD_INFORMATION;
typedef struct _FILE_NETWORK_OPEN_INFORMATION {
- LARGE_INTEGER CreationTime;
- LARGE_INTEGER LastAccessTime;
- LARGE_INTEGER LastWriteTime;
- LARGE_INTEGER ChangeTime;
- LARGE_INTEGER AllocationSize;
- LARGE_INTEGER EndOfFile;
- ULONG FileAttributes;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER AllocationSize;
+ LARGE_INTEGER EndOfFile;
+ ULONG FileAttributes;
} FILE_NETWORK_OPEN_INFORMATION, *PFILE_NETWORK_OPEN_INFORMATION;
typedef enum _FSINFOCLASS {
@@ -5051,16 +5039,16 @@ typedef enum _FSINFOCLASS {
} FS_INFORMATION_CLASS, *PFS_INFORMATION_CLASS;
typedef struct _FILE_FS_DEVICE_INFORMATION {
- DEVICE_TYPE DeviceType;
- ULONG Characteristics;
+ DEVICE_TYPE DeviceType;
+ ULONG Characteristics;
} FILE_FS_DEVICE_INFORMATION, *PFILE_FS_DEVICE_INFORMATION;
typedef struct _FILE_FULL_EA_INFORMATION {
- ULONG NextEntryOffset;
- UCHAR Flags;
- UCHAR EaNameLength;
- USHORT EaValueLength;
- CHAR EaName[1];
+ ULONG NextEntryOffset;
+ UCHAR Flags;
+ UCHAR EaNameLength;
+ USHORT EaValueLength;
+ CHAR EaName[1];
} FILE_FULL_EA_INFORMATION, *PFILE_FULL_EA_INFORMATION;
typedef struct _FILE_SFIO_RESERVE_INFORMATION {
@@ -5089,154 +5077,154 @@ typedef struct _FILE_SFIO_VOLUME_INFORMATION {
typedef BOOLEAN
(NTAPI FAST_IO_CHECK_IF_POSSIBLE)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN BOOLEAN Wait,
- IN ULONG LockKey,
- IN BOOLEAN CheckForReadOperation,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ IN BOOLEAN CheckForReadOperation,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_CHECK_IF_POSSIBLE *PFAST_IO_CHECK_IF_POSSIBLE;
typedef BOOLEAN
(NTAPI FAST_IO_READ)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN BOOLEAN Wait,
- IN ULONG LockKey,
- OUT PVOID Buffer,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ OUT PVOID Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_READ *PFAST_IO_READ;
typedef BOOLEAN
(NTAPI FAST_IO_WRITE)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN BOOLEAN Wait,
- IN ULONG LockKey,
- IN PVOID Buffer,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ IN PVOID Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_WRITE *PFAST_IO_WRITE;
typedef BOOLEAN
(NTAPI FAST_IO_QUERY_BASIC_INFO)(
- IN struct _FILE_OBJECT *FileObject,
- IN BOOLEAN Wait,
- OUT PFILE_BASIC_INFORMATION Buffer,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN BOOLEAN Wait,
+ OUT PFILE_BASIC_INFORMATION Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_QUERY_BASIC_INFO *PFAST_IO_QUERY_BASIC_INFO;
typedef BOOLEAN
(NTAPI FAST_IO_QUERY_STANDARD_INFO)(
- IN struct _FILE_OBJECT *FileObject,
- IN BOOLEAN Wait,
- OUT PFILE_STANDARD_INFORMATION Buffer,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN BOOLEAN Wait,
+ OUT PFILE_STANDARD_INFORMATION Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_QUERY_STANDARD_INFO *PFAST_IO_QUERY_STANDARD_INFO;
typedef BOOLEAN
(NTAPI FAST_IO_LOCK)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN PLARGE_INTEGER Length,
- PEPROCESS ProcessId,
- ULONG Key,
- BOOLEAN FailImmediately,
- BOOLEAN ExclusiveLock,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PLARGE_INTEGER Length,
+ PEPROCESS ProcessId,
+ ULONG Key,
+ BOOLEAN FailImmediately,
+ BOOLEAN ExclusiveLock,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_LOCK *PFAST_IO_LOCK;
typedef BOOLEAN
(NTAPI FAST_IO_UNLOCK_SINGLE)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN PLARGE_INTEGER Length,
- PEPROCESS ProcessId,
- ULONG Key,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PLARGE_INTEGER Length,
+ PEPROCESS ProcessId,
+ ULONG Key,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_UNLOCK_SINGLE *PFAST_IO_UNLOCK_SINGLE;
typedef BOOLEAN
(NTAPI FAST_IO_UNLOCK_ALL)(
- IN struct _FILE_OBJECT *FileObject,
- PEPROCESS ProcessId,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ PEPROCESS ProcessId,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_UNLOCK_ALL *PFAST_IO_UNLOCK_ALL;
typedef BOOLEAN
(NTAPI FAST_IO_UNLOCK_ALL_BY_KEY)(
- IN struct _FILE_OBJECT *FileObject,
- PVOID ProcessId,
- ULONG Key,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ PVOID ProcessId,
+ ULONG Key,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_UNLOCK_ALL_BY_KEY *PFAST_IO_UNLOCK_ALL_BY_KEY;
typedef BOOLEAN
(NTAPI FAST_IO_DEVICE_CONTROL)(
- IN struct _FILE_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 struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_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 struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_DEVICE_CONTROL *PFAST_IO_DEVICE_CONTROL;
typedef VOID
(NTAPI FAST_IO_ACQUIRE_FILE)(
- IN struct _FILE_OBJECT *FileObject);
+ IN struct _FILE_OBJECT *FileObject);
typedef FAST_IO_ACQUIRE_FILE *PFAST_IO_ACQUIRE_FILE;
typedef VOID
(NTAPI FAST_IO_RELEASE_FILE)(
- IN struct _FILE_OBJECT *FileObject);
+ IN struct _FILE_OBJECT *FileObject);
typedef FAST_IO_RELEASE_FILE *PFAST_IO_RELEASE_FILE;
typedef VOID
(NTAPI FAST_IO_DETACH_DEVICE)(
- IN struct _DEVICE_OBJECT *SourceDevice,
- IN struct _DEVICE_OBJECT *TargetDevice);
+ IN struct _DEVICE_OBJECT *SourceDevice,
+ IN struct _DEVICE_OBJECT *TargetDevice);
typedef FAST_IO_DETACH_DEVICE *PFAST_IO_DETACH_DEVICE;
typedef BOOLEAN
(NTAPI FAST_IO_QUERY_NETWORK_OPEN_INFO)(
- IN struct _FILE_OBJECT *FileObject,
- IN BOOLEAN Wait,
- OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
- OUT struct _IO_STATUS_BLOCK *IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN BOOLEAN Wait,
+ OUT struct _FILE_NETWORK_OPEN_INFORMATION *Buffer,
+ OUT struct _IO_STATUS_BLOCK *IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_QUERY_NETWORK_OPEN_INFO *PFAST_IO_QUERY_NETWORK_OPEN_INFO;
typedef NTSTATUS
(NTAPI FAST_IO_ACQUIRE_FOR_MOD_WRITE)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER EndingOffset,
- OUT struct _ERESOURCE **ResourceToRelease,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER EndingOffset,
+ OUT struct _ERESOURCE **ResourceToRelease,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_ACQUIRE_FOR_MOD_WRITE *PFAST_IO_ACQUIRE_FOR_MOD_WRITE;
typedef BOOLEAN
(NTAPI FAST_IO_MDL_READ)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN ULONG LockKey,
- OUT PMDL *MdlChain,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_MDL_READ *PFAST_IO_MDL_READ;
typedef BOOLEAN
@@ -5248,132 +5236,132 @@ typedef FAST_IO_MDL_READ_COMPLETE *PFAST_IO_MDL_READ_COMPLETE;
typedef BOOLEAN
(NTAPI FAST_IO_PREPARE_MDL_WRITE)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN ULONG LockKey,
- OUT PMDL *MdlChain,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_PREPARE_MDL_WRITE *PFAST_IO_PREPARE_MDL_WRITE;
typedef BOOLEAN
(NTAPI FAST_IO_MDL_WRITE_COMPLETE)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN PMDL MdlChain,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PMDL MdlChain,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_MDL_WRITE_COMPLETE *PFAST_IO_MDL_WRITE_COMPLETE;
typedef BOOLEAN
(NTAPI FAST_IO_READ_COMPRESSED)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN ULONG LockKey,
- OUT PVOID Buffer,
- OUT PMDL *MdlChain,
- OUT PIO_STATUS_BLOCK IoStatus,
- OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
- IN ULONG CompressedDataInfoLength,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ OUT PVOID Buffer,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ OUT struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
+ IN ULONG CompressedDataInfoLength,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_READ_COMPRESSED *PFAST_IO_READ_COMPRESSED;
typedef BOOLEAN
(NTAPI FAST_IO_WRITE_COMPRESSED)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN ULONG Length,
- IN ULONG LockKey,
- IN PVOID Buffer,
- OUT PMDL *MdlChain,
- OUT PIO_STATUS_BLOCK IoStatus,
- IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
- IN ULONG CompressedDataInfoLength,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ IN PVOID Buffer,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN struct _COMPRESSED_DATA_INFO *CompressedDataInfo,
+ IN ULONG CompressedDataInfoLength,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_WRITE_COMPRESSED *PFAST_IO_WRITE_COMPRESSED;
typedef BOOLEAN
(NTAPI FAST_IO_MDL_READ_COMPLETE_COMPRESSED)(
- IN struct _FILE_OBJECT *FileObject,
- IN PMDL MdlChain,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PMDL MdlChain,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_MDL_READ_COMPLETE_COMPRESSED *PFAST_IO_MDL_READ_COMPLETE_COMPRESSED;
typedef BOOLEAN
(NTAPI FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED)(
- IN struct _FILE_OBJECT *FileObject,
- IN PLARGE_INTEGER FileOffset,
- IN PMDL MdlChain,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PMDL MdlChain,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_MDL_WRITE_COMPLETE_COMPRESSED *PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED;
typedef BOOLEAN
(NTAPI FAST_IO_QUERY_OPEN)(
- IN struct _IRP *Irp,
- OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _IRP *Irp,
+ OUT PFILE_NETWORK_OPEN_INFORMATION NetworkInformation,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_QUERY_OPEN *PFAST_IO_QUERY_OPEN;
typedef NTSTATUS
(NTAPI FAST_IO_RELEASE_FOR_MOD_WRITE)(
- IN struct _FILE_OBJECT *FileObject,
- IN struct _ERESOURCE *ResourceToRelease,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN struct _ERESOURCE *ResourceToRelease,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_RELEASE_FOR_MOD_WRITE *PFAST_IO_RELEASE_FOR_MOD_WRITE;
typedef NTSTATUS
(NTAPI FAST_IO_ACQUIRE_FOR_CCFLUSH)(
- IN struct _FILE_OBJECT *FileObject,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_ACQUIRE_FOR_CCFLUSH *PFAST_IO_ACQUIRE_FOR_CCFLUSH;
typedef NTSTATUS
(NTAPI FAST_IO_RELEASE_FOR_CCFLUSH)(
- IN struct _FILE_OBJECT *FileObject,
- IN struct _DEVICE_OBJECT *DeviceObject);
+ IN struct _FILE_OBJECT *FileObject,
+ IN struct _DEVICE_OBJECT *DeviceObject);
typedef FAST_IO_RELEASE_FOR_CCFLUSH *PFAST_IO_RELEASE_FOR_CCFLUSH;
typedef struct _FAST_IO_DISPATCH {
- ULONG SizeOfFastIoDispatch;
- PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
- PFAST_IO_READ FastIoRead;
- PFAST_IO_WRITE FastIoWrite;
- PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
- PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
- PFAST_IO_LOCK FastIoLock;
- PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
- PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
- PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
- PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
- PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
- PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
- PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
- PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
- PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
- PFAST_IO_MDL_READ MdlRead;
- PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
- PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
- PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
- PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
- PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
- PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
- PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
- PFAST_IO_QUERY_OPEN FastIoQueryOpen;
- PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
- PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
- PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
+ ULONG SizeOfFastIoDispatch;
+ PFAST_IO_CHECK_IF_POSSIBLE FastIoCheckIfPossible;
+ PFAST_IO_READ FastIoRead;
+ PFAST_IO_WRITE FastIoWrite;
+ PFAST_IO_QUERY_BASIC_INFO FastIoQueryBasicInfo;
+ PFAST_IO_QUERY_STANDARD_INFO FastIoQueryStandardInfo;
+ PFAST_IO_LOCK FastIoLock;
+ PFAST_IO_UNLOCK_SINGLE FastIoUnlockSingle;
+ PFAST_IO_UNLOCK_ALL FastIoUnlockAll;
+ PFAST_IO_UNLOCK_ALL_BY_KEY FastIoUnlockAllByKey;
+ PFAST_IO_DEVICE_CONTROL FastIoDeviceControl;
+ PFAST_IO_ACQUIRE_FILE AcquireFileForNtCreateSection;
+ PFAST_IO_RELEASE_FILE ReleaseFileForNtCreateSection;
+ PFAST_IO_DETACH_DEVICE FastIoDetachDevice;
+ PFAST_IO_QUERY_NETWORK_OPEN_INFO FastIoQueryNetworkOpenInfo;
+ PFAST_IO_ACQUIRE_FOR_MOD_WRITE AcquireForModWrite;
+ PFAST_IO_MDL_READ MdlRead;
+ PFAST_IO_MDL_READ_COMPLETE MdlReadComplete;
+ PFAST_IO_PREPARE_MDL_WRITE PrepareMdlWrite;
+ PFAST_IO_MDL_WRITE_COMPLETE MdlWriteComplete;
+ PFAST_IO_READ_COMPRESSED FastIoReadCompressed;
+ PFAST_IO_WRITE_COMPRESSED FastIoWriteCompressed;
+ PFAST_IO_MDL_READ_COMPLETE_COMPRESSED MdlReadCompleteCompressed;
+ PFAST_IO_MDL_WRITE_COMPLETE_COMPRESSED MdlWriteCompleteCompressed;
+ PFAST_IO_QUERY_OPEN FastIoQueryOpen;
+ PFAST_IO_RELEASE_FOR_MOD_WRITE ReleaseForModWrite;
+ PFAST_IO_ACQUIRE_FOR_CCFLUSH AcquireForCcFlush;
+ PFAST_IO_RELEASE_FOR_CCFLUSH ReleaseForCcFlush;
} FAST_IO_DISPATCH, *PFAST_IO_DISPATCH;
typedef struct _SECTION_OBJECT_POINTERS {
- PVOID DataSectionObject;
- PVOID SharedCacheMap;
- PVOID ImageSectionObject;
+ PVOID DataSectionObject;
+ PVOID SharedCacheMap;
+ PVOID ImageSectionObject;
} SECTION_OBJECT_POINTERS, *PSECTION_OBJECT_POINTERS;
typedef struct _IO_COMPLETION_CONTEXT {
- PVOID Port;
- PVOID Key;
+ PVOID Port;
+ PVOID Key;
} IO_COMPLETION_CONTEXT, *PIO_COMPLETION_CONTEXT;
/* FILE_OBJECT.Flags */
@@ -5560,61 +5548,61 @@ typedef struct _IO_COMPLETION_CONTEXT {
#define IRP_MN_REGINFO_EX 0x0b
typedef struct _FILE_OBJECT {
- CSHORT Type;
- CSHORT Size;
- PDEVICE_OBJECT DeviceObject;
- PVPB Vpb;
- PVOID FsContext;
- PVOID FsContext2;
- PSECTION_OBJECT_POINTERS SectionObjectPointer;
- PVOID PrivateCacheMap;
- NTSTATUS FinalStatus;
- struct _FILE_OBJECT *RelatedFileObject;
- BOOLEAN LockOperation;
- BOOLEAN DeletePending;
- BOOLEAN ReadAccess;
- BOOLEAN WriteAccess;
- BOOLEAN DeleteAccess;
- BOOLEAN SharedRead;
- BOOLEAN SharedWrite;
- BOOLEAN SharedDelete;
- ULONG Flags;
- UNICODE_STRING FileName;
- LARGE_INTEGER CurrentByteOffset;
- volatile ULONG Waiters;
- volatile ULONG Busy;
- PVOID LastLock;
- KEVENT Lock;
- KEVENT Event;
- volatile PIO_COMPLETION_CONTEXT CompletionContext;
- KSPIN_LOCK IrpListLock;
- LIST_ENTRY IrpList;
- volatile PVOID FileObjectExtension;
+ CSHORT Type;
+ CSHORT Size;
+ PDEVICE_OBJECT DeviceObject;
+ PVPB Vpb;
+ PVOID FsContext;
+ PVOID FsContext2;
+ PSECTION_OBJECT_POINTERS SectionObjectPointer;
+ PVOID PrivateCacheMap;
+ NTSTATUS FinalStatus;
+ struct _FILE_OBJECT *RelatedFileObject;
+ BOOLEAN LockOperation;
+ BOOLEAN DeletePending;
+ BOOLEAN ReadAccess;
+ BOOLEAN WriteAccess;
+ BOOLEAN DeleteAccess;
+ BOOLEAN SharedRead;
+ BOOLEAN SharedWrite;
+ BOOLEAN SharedDelete;
+ ULONG Flags;
+ UNICODE_STRING FileName;
+ LARGE_INTEGER CurrentByteOffset;
+ volatile ULONG Waiters;
+ volatile ULONG Busy;
+ PVOID LastLock;
+ KEVENT Lock;
+ KEVENT Event;
+ volatile PIO_COMPLETION_CONTEXT CompletionContext;
+ KSPIN_LOCK IrpListLock;
+ LIST_ENTRY IrpList;
+ volatile PVOID FileObjectExtension;
} FILE_OBJECT, *PFILE_OBJECT;
typedef struct _IO_ERROR_LOG_PACKET {
- UCHAR MajorFunctionCode;
- UCHAR RetryCount;
- USHORT DumpDataSize;
- USHORT NumberOfStrings;
- USHORT StringOffset;
- USHORT EventCategory;
- NTSTATUS ErrorCode;
- ULONG UniqueErrorValue;
- NTSTATUS FinalStatus;
- ULONG SequenceNumber;
- ULONG IoControlCode;
- LARGE_INTEGER DeviceOffset;
- ULONG DumpData[1];
+ UCHAR MajorFunctionCode;
+ UCHAR RetryCount;
+ USHORT DumpDataSize;
+ USHORT NumberOfStrings;
+ USHORT StringOffset;
+ USHORT EventCategory;
+ NTSTATUS ErrorCode;
+ ULONG UniqueErrorValue;
+ NTSTATUS FinalStatus;
+ ULONG SequenceNumber;
+ ULONG IoControlCode;
+ LARGE_INTEGER DeviceOffset;
+ ULONG DumpData[1];
} IO_ERROR_LOG_PACKET, *PIO_ERROR_LOG_PACKET;
typedef struct _IO_ERROR_LOG_MESSAGE {
- USHORT Type;
- USHORT Size;
- USHORT DriverNameLength;
- LARGE_INTEGER TimeStamp;
- ULONG DriverNameOffset;
- IO_ERROR_LOG_PACKET EntryData;
+ USHORT Type;
+ USHORT Size;
+ USHORT DriverNameLength;
+ LARGE_INTEGER TimeStamp;
+ ULONG DriverNameOffset;
+ IO_ERROR_LOG_PACKET EntryData;
} IO_ERROR_LOG_MESSAGE, *PIO_ERROR_LOG_MESSAGE;
#define ERROR_LOG_LIMIT_SIZE 240
@@ -5659,22 +5647,22 @@ typedef enum _DMA_SPEED {
#define DEVICE_DESCRIPTION_VERSION2 0x0002
typedef struct _DEVICE_DESCRIPTION {
- ULONG Version;
- BOOLEAN Master;
- BOOLEAN ScatterGather;
- BOOLEAN DemandMode;
- BOOLEAN AutoInitialize;
- BOOLEAN Dma32BitAddresses;
- BOOLEAN IgnoreCount;
- BOOLEAN Reserved1;
- BOOLEAN Dma64BitAddresses;
- ULONG BusNumber;
- ULONG DmaChannel;
- INTERFACE_TYPE InterfaceType;
- DMA_WIDTH DmaWidth;
- DMA_SPEED DmaSpeed;
- ULONG MaximumLength;
- ULONG DmaPort;
+ ULONG Version;
+ BOOLEAN Master;
+ BOOLEAN ScatterGather;
+ BOOLEAN DemandMode;
+ BOOLEAN AutoInitialize;
+ BOOLEAN Dma32BitAddresses;
+ BOOLEAN IgnoreCount;
+ BOOLEAN Reserved1;
+ BOOLEAN Dma64BitAddresses;
+ ULONG BusNumber;
+ ULONG DmaChannel;
+ INTERFACE_TYPE InterfaceType;
+ DMA_WIDTH DmaWidth;
+ DMA_SPEED DmaSpeed;
+ ULONG MaximumLength;
+ ULONG DmaPort;
} DEVICE_DESCRIPTION, *PDEVICE_DESCRIPTION;
typedef enum _DEVICE_RELATION_TYPE {
@@ -5688,20 +5676,20 @@ typedef enum _DEVICE_RELATION_TYPE {
} DEVICE_RELATION_TYPE, *PDEVICE_RELATION_TYPE;
typedef struct _DEVICE_RELATIONS {
- ULONG Count;
+ ULONG Count;
PDEVICE_OBJECT Objects[1];
} DEVICE_RELATIONS, *PDEVICE_RELATIONS;
typedef struct _DEVOBJ_EXTENSION {
- CSHORT Type;
- USHORT Size;
- PDEVICE_OBJECT DeviceObject;
+ CSHORT Type;
+ USHORT Size;
+ PDEVICE_OBJECT DeviceObject;
} DEVOBJ_EXTENSION, *PDEVOBJ_EXTENSION;
typedef struct _SCATTER_GATHER_ELEMENT {
- PHYSICAL_ADDRESS Address;
- ULONG Length;
- ULONG_PTR Reserved;
+ PHYSICAL_ADDRESS Address;
+ ULONG Length;
+ ULONG_PTR Reserved;
} SCATTER_GATHER_ELEMENT, *PSCATTER_GATHER_ELEMENT;
#if defined(_MSC_EXTENSIONS)
@@ -5711,9 +5699,9 @@ typedef struct _SCATTER_GATHER_ELEMENT {
#endif
#pragma warning(disable:4200)
typedef struct _SCATTER_GATHER_LIST {
- ULONG NumberOfElements;
- ULONG_PTR Reserved;
- SCATTER_GATHER_ELEMENT Elements[1];
+ ULONG NumberOfElements;
+ ULONG_PTR Reserved;
+ SCATTER_GATHER_ELEMENT Elements[1];
} SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
#if _MSC_VER >= 1200
@@ -5731,15 +5719,15 @@ typedef struct _SCATTER_GATHER_LIST SCATTER_GATHER_LIST, *PSCATTER_GATHER_LIST;
typedef NTSTATUS
(NTAPI DRIVER_ADD_DEVICE)(
- IN struct _DRIVER_OBJECT *DriverObject,
- IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
+ IN struct _DRIVER_OBJECT *DriverObject,
+ IN struct _DEVICE_OBJECT *PhysicalDeviceObject);
typedef DRIVER_ADD_DEVICE *PDRIVER_ADD_DEVICE;
typedef struct _DRIVER_EXTENSION {
- struct _DRIVER_OBJECT *DriverObject;
- PDRIVER_ADD_DEVICE AddDevice;
- ULONG Count;
- UNICODE_STRING ServiceKeyName;
+ struct _DRIVER_OBJECT *DriverObject;
+ PDRIVER_ADD_DEVICE AddDevice;
+ ULONG Count;
+ UNICODE_STRING ServiceKeyName;
} DRIVER_EXTENSION, *PDRIVER_EXTENSION;
#define DRVO_UNLOAD_INVOKED 0x00000001
@@ -5748,316 +5736,316 @@ typedef struct _DRIVER_EXTENSION {
typedef NTSTATUS
(NTAPI DRIVER_INITIALIZE)(
- IN struct _DRIVER_OBJECT *DriverObject,
- IN PUNICODE_STRING RegistryPath);
+ IN struct _DRIVER_OBJECT *DriverObject,
+ IN PUNICODE_STRING RegistryPath);
typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
typedef VOID
(NTAPI DRIVER_STARTIO)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp);
typedef DRIVER_STARTIO *PDRIVER_STARTIO;
typedef VOID
(NTAPI DRIVER_UNLOAD)(
- IN struct _DRIVER_OBJECT *DriverObject);
+ IN struct _DRIVER_OBJECT *DriverObject);
typedef DRIVER_UNLOAD *PDRIVER_UNLOAD;
typedef NTSTATUS
(NTAPI DRIVER_DISPATCH)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp);
typedef DRIVER_DISPATCH *PDRIVER_DISPATCH;
typedef struct _DRIVER_OBJECT {
- CSHORT Type;
- CSHORT Size;
- PDEVICE_OBJECT DeviceObject;
- ULONG Flags;
- PVOID DriverStart;
- ULONG DriverSize;
- PVOID DriverSection;
- PDRIVER_EXTENSION DriverExtension;
- UNICODE_STRING DriverName;
- PUNICODE_STRING HardwareDatabase;
+ CSHORT Type;
+ CSHORT Size;
+ PDEVICE_OBJECT DeviceObject;
+ ULONG Flags;
+ PVOID DriverStart;
+ ULONG DriverSize;
+ PVOID DriverSection;
+ PDRIVER_EXTENSION DriverExtension;
+ UNICODE_STRING DriverName;
+ PUNICODE_STRING HardwareDatabase;
struct _FAST_IO_DISPATCH *FastIoDispatch;
- PDRIVER_INITIALIZE DriverInit;
- PDRIVER_STARTIO DriverStartIo;
- PDRIVER_UNLOAD DriverUnload;
- PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
+ PDRIVER_INITIALIZE DriverInit;
+ PDRIVER_STARTIO DriverStartIo;
+ PDRIVER_UNLOAD DriverUnload;
+ PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT, *PDRIVER_OBJECT;
typedef struct _DMA_ADAPTER {
- USHORT Version;
- USHORT Size;
- struct _DMA_OPERATIONS* DmaOperations;
+ USHORT Version;
+ USHORT Size;
+ struct _DMA_OPERATIONS* DmaOperations;
} DMA_ADAPTER, *PDMA_ADAPTER;
typedef VOID
(NTAPI *PPUT_DMA_ADAPTER)(
- IN PDMA_ADAPTER DmaAdapter);
+ IN PDMA_ADAPTER DmaAdapter);
typedef PVOID
(NTAPI *PALLOCATE_COMMON_BUFFER)(
- IN PDMA_ADAPTER DmaAdapter,
- IN ULONG Length,
- OUT PPHYSICAL_ADDRESS LogicalAddress,
- IN BOOLEAN CacheEnabled);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN ULONG Length,
+ OUT PPHYSICAL_ADDRESS LogicalAddress,
+ IN BOOLEAN CacheEnabled);
typedef VOID
(NTAPI *PFREE_COMMON_BUFFER)(
- IN PDMA_ADAPTER DmaAdapter,
- IN ULONG Length,
- IN PHYSICAL_ADDRESS LogicalAddress,
- IN PVOID VirtualAddress,
- IN BOOLEAN CacheEnabled);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN ULONG Length,
+ IN PHYSICAL_ADDRESS LogicalAddress,
+ IN PVOID VirtualAddress,
+ IN BOOLEAN CacheEnabled);
typedef NTSTATUS
(NTAPI *PALLOCATE_ADAPTER_CHANNEL)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG NumberOfMapRegisters,
- IN PDRIVER_CONTROL ExecutionRoutine,
- IN PVOID Context);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG NumberOfMapRegisters,
+ IN PDRIVER_CONTROL ExecutionRoutine,
+ IN PVOID Context);
typedef BOOLEAN
(NTAPI *PFLUSH_ADAPTER_BUFFERS)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN ULONG Length,
- IN BOOLEAN WriteToDevice);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ IN BOOLEAN WriteToDevice);
typedef VOID
(NTAPI *PFREE_ADAPTER_CHANNEL)(
- IN PDMA_ADAPTER DmaAdapter);
+ IN PDMA_ADAPTER DmaAdapter);
typedef VOID
(NTAPI *PFREE_MAP_REGISTERS)(
- IN PDMA_ADAPTER DmaAdapter,
- PVOID MapRegisterBase,
- ULONG NumberOfMapRegisters);
+ IN PDMA_ADAPTER DmaAdapter,
+ PVOID MapRegisterBase,
+ ULONG NumberOfMapRegisters);
typedef PHYSICAL_ADDRESS
(NTAPI *PMAP_TRANSFER)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN OUT PULONG Length,
- IN BOOLEAN WriteToDevice);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN OUT PULONG Length,
+ IN BOOLEAN WriteToDevice);
typedef ULONG
(NTAPI *PGET_DMA_ALIGNMENT)(
- IN PDMA_ADAPTER DmaAdapter);
+ IN PDMA_ADAPTER DmaAdapter);
typedef ULONG
(NTAPI *PREAD_DMA_COUNTER)(
- IN PDMA_ADAPTER DmaAdapter);
+ IN PDMA_ADAPTER DmaAdapter);
typedef VOID
(NTAPI DRIVER_LIST_CONTROL)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp,
- IN struct _SCATTER_GATHER_LIST *ScatterGather,
- IN PVOID Context);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp,
+ IN struct _SCATTER_GATHER_LIST *ScatterGather,
+ IN PVOID Context);
typedef DRIVER_LIST_CONTROL *PDRIVER_LIST_CONTROL;
typedef NTSTATUS
(NTAPI *PGET_SCATTER_GATHER_LIST)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PDEVICE_OBJECT DeviceObject,
- IN PMDL Mdl,
- IN PVOID CurrentVa,
- IN ULONG Length,
- IN PDRIVER_LIST_CONTROL ExecutionRoutine,
- IN PVOID Context,
- IN BOOLEAN WriteToDevice);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PMDL Mdl,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ IN PDRIVER_LIST_CONTROL ExecutionRoutine,
+ IN PVOID Context,
+ IN BOOLEAN WriteToDevice);
typedef VOID
(NTAPI *PPUT_SCATTER_GATHER_LIST)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PSCATTER_GATHER_LIST ScatterGather,
- IN BOOLEAN WriteToDevice);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PSCATTER_GATHER_LIST ScatterGather,
+ IN BOOLEAN WriteToDevice);
typedef NTSTATUS
(NTAPI *PCALCULATE_SCATTER_GATHER_LIST_SIZE)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PMDL Mdl OPTIONAL,
- IN PVOID CurrentVa,
- IN ULONG Length,
- OUT PULONG ScatterGatherListSize,
- OUT PULONG pNumberOfMapRegisters OPTIONAL);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PMDL Mdl OPTIONAL,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ OUT PULONG ScatterGatherListSize,
+ OUT PULONG pNumberOfMapRegisters OPTIONAL);
typedef NTSTATUS
(NTAPI *PBUILD_SCATTER_GATHER_LIST)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PDEVICE_OBJECT DeviceObject,
- IN PMDL Mdl,
- IN PVOID CurrentVa,
- IN ULONG Length,
- IN PDRIVER_LIST_CONTROL ExecutionRoutine,
- IN PVOID Context,
- IN BOOLEAN WriteToDevice,
- IN PVOID ScatterGatherBuffer,
- IN ULONG ScatterGatherLength);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PMDL Mdl,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ IN PDRIVER_LIST_CONTROL ExecutionRoutine,
+ IN PVOID Context,
+ IN BOOLEAN WriteToDevice,
+ IN PVOID ScatterGatherBuffer,
+ IN ULONG ScatterGatherLength);
typedef NTSTATUS
(NTAPI *PBUILD_MDL_FROM_SCATTER_GATHER_LIST)(
- IN PDMA_ADAPTER DmaAdapter,
- IN PSCATTER_GATHER_LIST ScatterGather,
- IN PMDL OriginalMdl,
- OUT PMDL *TargetMdl);
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PSCATTER_GATHER_LIST ScatterGather,
+ IN PMDL OriginalMdl,
+ OUT PMDL *TargetMdl);
typedef struct _DMA_OPERATIONS {
- ULONG Size;
- PPUT_DMA_ADAPTER PutDmaAdapter;
- PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
- PFREE_COMMON_BUFFER FreeCommonBuffer;
- PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
- PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
- PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
- PFREE_MAP_REGISTERS FreeMapRegisters;
- PMAP_TRANSFER MapTransfer;
- PGET_DMA_ALIGNMENT GetDmaAlignment;
- PREAD_DMA_COUNTER ReadDmaCounter;
- PGET_SCATTER_GATHER_LIST GetScatterGatherList;
- PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
- PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
- PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
- PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
+ ULONG Size;
+ PPUT_DMA_ADAPTER PutDmaAdapter;
+ PALLOCATE_COMMON_BUFFER AllocateCommonBuffer;
+ PFREE_COMMON_BUFFER FreeCommonBuffer;
+ PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
+ PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
+ PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
+ PFREE_MAP_REGISTERS FreeMapRegisters;
+ PMAP_TRANSFER MapTransfer;
+ PGET_DMA_ALIGNMENT GetDmaAlignment;
+ PREAD_DMA_COUNTER ReadDmaCounter;
+ PGET_SCATTER_GATHER_LIST GetScatterGatherList;
+ PPUT_SCATTER_GATHER_LIST PutScatterGatherList;
+ PCALCULATE_SCATTER_GATHER_LIST_SIZE CalculateScatterGatherList;
+ PBUILD_SCATTER_GATHER_LIST BuildScatterGatherList;
+ PBUILD_MDL_FROM_SCATTER_GATHER_LIST BuildMdlFromScatterGatherList;
} DMA_OPERATIONS, *PDMA_OPERATIONS;
typedef struct _IO_RESOURCE_DESCRIPTOR {
- UCHAR Option;
- UCHAR Type;
- UCHAR ShareDisposition;
- UCHAR Spare1;
- USHORT Flags;
- USHORT Spare2;
+ UCHAR Option;
+ UCHAR Type;
+ UCHAR ShareDisposition;
+ UCHAR Spare1;
+ USHORT Flags;
+ USHORT Spare2;
union {
struct {
- ULONG Length;
- ULONG Alignment;
- PHYSICAL_ADDRESS MinimumAddress;
- PHYSICAL_ADDRESS MaximumAddress;
+ ULONG Length;
+ ULONG Alignment;
+ PHYSICAL_ADDRESS MinimumAddress;
+ PHYSICAL_ADDRESS MaximumAddress;
} Port;
struct {
- ULONG Length;
- ULONG Alignment;
- PHYSICAL_ADDRESS MinimumAddress;
- PHYSICAL_ADDRESS MaximumAddress;
+ ULONG Length;
+ ULONG Alignment;
+ PHYSICAL_ADDRESS MinimumAddress;
+ PHYSICAL_ADDRESS MaximumAddress;
} Memory;
struct {
- ULONG MinimumVector;
- ULONG MaximumVector;
+ ULONG MinimumVector;
+ ULONG MaximumVector;
} Interrupt;
struct {
- ULONG MinimumChannel;
- ULONG MaximumChannel;
+ ULONG MinimumChannel;
+ ULONG MaximumChannel;
} Dma;
struct {
- ULONG Length;
- ULONG Alignment;
- PHYSICAL_ADDRESS MinimumAddress;
- PHYSICAL_ADDRESS MaximumAddress;
+ ULONG Length;
+ ULONG Alignment;
+ PHYSICAL_ADDRESS MinimumAddress;
+ PHYSICAL_ADDRESS MaximumAddress;
} Generic;
struct {
- ULONG Data[3];
+ ULONG Data[3];
} DevicePrivate;
struct {
- ULONG Length;
- ULONG MinBusNumber;
- ULONG MaxBusNumber;
- ULONG Reserved;
+ ULONG Length;
+ ULONG MinBusNumber;
+ ULONG MaxBusNumber;
+ ULONG Reserved;
} BusNumber;
struct {
- ULONG Priority;
- ULONG Reserved1;
- ULONG Reserved2;
+ ULONG Priority;
+ ULONG Reserved1;
+ ULONG Reserved2;
} ConfigData;
} u;
} IO_RESOURCE_DESCRIPTOR, *PIO_RESOURCE_DESCRIPTOR;
typedef struct _IO_RESOURCE_LIST {
- USHORT Version;
- USHORT Revision;
- ULONG Count;
- IO_RESOURCE_DESCRIPTOR Descriptors[1];
+ USHORT Version;
+ USHORT Revision;
+ ULONG Count;
+ IO_RESOURCE_DESCRIPTOR Descriptors[1];
} IO_RESOURCE_LIST, *PIO_RESOURCE_LIST;
typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
- ULONG ListSize;
- INTERFACE_TYPE InterfaceType;
- ULONG BusNumber;
- ULONG SlotNumber;
- ULONG Reserved[3];
- ULONG AlternativeLists;
- IO_RESOURCE_LIST List[1];
+ ULONG ListSize;
+ INTERFACE_TYPE InterfaceType;
+ ULONG BusNumber;
+ ULONG SlotNumber;
+ ULONG Reserved[3];
+ ULONG AlternativeLists;
+ IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
typedef VOID
(NTAPI DRIVER_CANCEL)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp);
typedef DRIVER_CANCEL *PDRIVER_CANCEL;
typedef struct _IRP {
- CSHORT Type;
- USHORT Size;
- struct _MDL *MdlAddress;
- ULONG Flags;
+ CSHORT Type;
+ USHORT Size;
+ struct _MDL *MdlAddress;
+ ULONG Flags;
union {
- struct _IRP *MasterIrp;
- volatile LONG IrpCount;
- PVOID SystemBuffer;
+ struct _IRP *MasterIrp;
+ volatile LONG IrpCount;
+ PVOID SystemBuffer;
} AssociatedIrp;
- LIST_ENTRY ThreadListEntry;
- IO_STATUS_BLOCK IoStatus;
- KPROCESSOR_MODE RequestorMode;
- BOOLEAN PendingReturned;
- CHAR StackCount;
- CHAR CurrentLocation;
- BOOLEAN Cancel;
- KIRQL CancelIrql;
- CCHAR ApcEnvironment;
- UCHAR AllocationFlags;
- PIO_STATUS_BLOCK UserIosb;
- PKEVENT UserEvent;
- union {
- struct {
- _ANONYMOUS_UNION union {
- PIO_APC_ROUTINE UserApcRoutine;
- PVOID IssuingProcess;
- } DUMMYUNIONNAME;
- PVOID UserApcContext;
- } AsynchronousParameters;
- LARGE_INTEGER AllocationSize;
- } Overlay;
- volatile PDRIVER_CANCEL CancelRoutine;
- PVOID UserBuffer;
+ LIST_ENTRY ThreadListEntry;
+ IO_STATUS_BLOCK IoStatus;
+ KPROCESSOR_MODE RequestorMode;
+ BOOLEAN PendingReturned;
+ CHAR StackCount;
+ CHAR CurrentLocation;
+ BOOLEAN Cancel;
+ KIRQL CancelIrql;
+ CCHAR ApcEnvironment;
+ UCHAR AllocationFlags;
+ PIO_STATUS_BLOCK UserIosb;
+ PKEVENT UserEvent;
union {
struct {
_ANONYMOUS_UNION union {
- KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
+ PIO_APC_ROUTINE UserApcRoutine;
+ PVOID IssuingProcess;
+ } DUMMYUNIONNAME;
+ PVOID UserApcContext;
+ } AsynchronousParameters;
+ LARGE_INTEGER AllocationSize;
+ } Overlay;
+ volatile PDRIVER_CANCEL CancelRoutine;
+ PVOID UserBuffer;
+ union {
+ struct {
+ _ANONYMOUS_UNION union {
+ KDEVICE_QUEUE_ENTRY DeviceQueueEntry;
_ANONYMOUS_STRUCT struct {
- PVOID DriverContext[4];
+ PVOID DriverContext[4];
} DUMMYSTRUCTNAME;
} DUMMYUNIONNAME;
- PETHREAD Thread;
- PCHAR AuxiliaryBuffer;
+ PETHREAD Thread;
+ PCHAR AuxiliaryBuffer;
_ANONYMOUS_STRUCT struct {
- LIST_ENTRY ListEntry;
+ LIST_ENTRY ListEntry;
_ANONYMOUS_UNION union {
- struct _IO_STACK_LOCATION *CurrentStackLocation;
- ULONG PacketType;
+ struct _IO_STACK_LOCATION *CurrentStackLocation;
+ ULONG PacketType;
} DUMMYUNIONNAME;
} DUMMYSTRUCTNAME;
- struct _FILE_OBJECT *OriginalFileObject;
+ struct _FILE_OBJECT *OriginalFileObject;
} Overlay;
- KAPC Apc;
- PVOID CompletionKey;
+ KAPC Apc;
+ PVOID CompletionKey;
} Tail;
} IRP, *PIRP;
@@ -6071,22 +6059,22 @@ typedef enum _IO_PAGING_PRIORITY {
typedef NTSTATUS
(NTAPI IO_COMPLETION_ROUTINE)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp,
- IN PVOID Context);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp,
+ IN PVOID Context);
typedef IO_COMPLETION_ROUTINE *PIO_COMPLETION_ROUTINE;
typedef VOID
(NTAPI IO_DPC_ROUTINE)(
- IN struct _KDPC *Dpc,
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN struct _IRP *Irp,
- IN PVOID Context);
+ IN struct _KDPC *Dpc,
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN struct _IRP *Irp,
+ IN PVOID Context);
typedef IO_DPC_ROUTINE *PIO_DPC_ROUTINE;
typedef NTSTATUS
(NTAPI *PMM_DLL_INITIALIZE)(
- IN PUNICODE_STRING RegistryPath);
+ IN PUNICODE_STRING RegistryPath);
typedef NTSTATUS
(NTAPI *PMM_DLL_UNLOAD)(
@@ -6094,29 +6082,29 @@ typedef NTSTATUS
typedef VOID
(NTAPI IO_TIMER_ROUTINE)(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN PVOID Context);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN PVOID Context);
typedef IO_TIMER_ROUTINE *PIO_TIMER_ROUTINE;
typedef struct _IO_SECURITY_CONTEXT {
- PSECURITY_QUALITY_OF_SERVICE SecurityQos;
- PACCESS_STATE AccessState;
- ACCESS_MASK DesiredAccess;
- ULONG FullCreateOptions;
+ PSECURITY_QUALITY_OF_SERVICE SecurityQos;
+ PACCESS_STATE AccessState;
+ ACCESS_MASK DesiredAccess;
+ ULONG FullCreateOptions;
} IO_SECURITY_CONTEXT, *PIO_SECURITY_CONTEXT;
struct _IO_CSQ;
typedef struct _IO_CSQ_IRP_CONTEXT {
- ULONG Type;
- struct _IRP *Irp;
- struct _IO_CSQ *Csq;
+ ULONG Type;
+ struct _IRP *Irp;
+ struct _IO_CSQ *Csq;
} IO_CSQ_IRP_CONTEXT, *PIO_CSQ_IRP_CONTEXT;
typedef VOID
(NTAPI *PIO_CSQ_INSERT_IRP)(
- IN struct _IO_CSQ *Csq,
- IN PIRP Irp);
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp);
typedef NTSTATUS
(NTAPI IO_CSQ_INSERT_IRP_EX)(
@@ -6127,39 +6115,39 @@ typedef IO_CSQ_INSERT_IRP_EX *PIO_CSQ_INSERT_IRP_EX;
typedef VOID
(NTAPI *PIO_CSQ_REMOVE_IRP)(
- IN struct _IO_CSQ *Csq,
- IN PIRP Irp);
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp);
typedef PIRP
(NTAPI *PIO_CSQ_PEEK_NEXT_IRP)(
- IN struct _IO_CSQ *Csq,
- IN PIRP Irp,
- IN PVOID PeekContext);
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp,
+ IN PVOID PeekContext);
typedef VOID
(NTAPI *PIO_CSQ_ACQUIRE_LOCK)(
- IN struct _IO_CSQ *Csq,
- OUT PKIRQL Irql);
+ IN struct _IO_CSQ *Csq,
+ OUT PKIRQL Irql);
typedef VOID
(NTAPI *PIO_CSQ_RELEASE_LOCK)(
- IN struct _IO_CSQ *Csq,
- IN KIRQL Irql);
+ IN struct _IO_CSQ *Csq,
+ IN KIRQL Irql);
typedef VOID
(NTAPI *PIO_CSQ_COMPLETE_CANCELED_IRP)(
- IN struct _IO_CSQ *Csq,
- IN PIRP Irp);
+ IN struct _IO_CSQ *Csq,
+ IN PIRP Irp);
typedef struct _IO_CSQ {
- ULONG Type;
- PIO_CSQ_INSERT_IRP CsqInsertIrp;
- PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
- PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
- PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
- PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
- PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
- PVOID ReservePointer;
+ ULONG Type;
+ PIO_CSQ_INSERT_IRP CsqInsertIrp;
+ PIO_CSQ_REMOVE_IRP CsqRemoveIrp;
+ PIO_CSQ_PEEK_NEXT_IRP CsqPeekNextIrp;
+ PIO_CSQ_ACQUIRE_LOCK CsqAcquireLock;
+ PIO_CSQ_RELEASE_LOCK CsqReleaseLock;
+ PIO_CSQ_COMPLETE_CANCELED_IRP CsqCompleteCanceledIrp;
+ PVOID ReservePointer;
} IO_CSQ, *PIO_CSQ;
typedef enum _BUS_QUERY_ID_TYPE {
@@ -6309,187 +6297,187 @@ typedef struct _ACPI_INTERFACE_STANDARD2 {
#include
#endif
typedef struct _IO_STACK_LOCATION {
- UCHAR MajorFunction;
- UCHAR MinorFunction;
- UCHAR Flags;
- UCHAR Control;
+ UCHAR MajorFunction;
+ UCHAR MinorFunction;
+ UCHAR Flags;
+ UCHAR Control;
union {
struct {
- PIO_SECURITY_CONTEXT SecurityContext;
- ULONG Options;
- USHORT POINTER_ALIGNMENT FileAttributes;
- USHORT ShareAccess;
- ULONG POINTER_ALIGNMENT EaLength;
+ PIO_SECURITY_CONTEXT SecurityContext;
+ ULONG Options;
+ USHORT POINTER_ALIGNMENT FileAttributes;
+ USHORT ShareAccess;
+ ULONG POINTER_ALIGNMENT EaLength;
} Create;
struct {
- ULONG Length;
- ULONG POINTER_ALIGNMENT Key;
- LARGE_INTEGER ByteOffset;
+ ULONG Length;
+ ULONG POINTER_ALIGNMENT Key;
+ LARGE_INTEGER ByteOffset;
} Read;
struct {
- ULONG Length;
- ULONG POINTER_ALIGNMENT Key;
- LARGE_INTEGER ByteOffset;
+ ULONG Length;
+ ULONG POINTER_ALIGNMENT Key;
+ LARGE_INTEGER ByteOffset;
} Write;
struct {
- ULONG Length;
- PUNICODE_STRING FileName;
- FILE_INFORMATION_CLASS FileInformationClass;
- ULONG FileIndex;
+ ULONG Length;
+ PUNICODE_STRING FileName;
+ FILE_INFORMATION_CLASS FileInformationClass;
+ ULONG FileIndex;
} QueryDirectory;
struct {
- ULONG Length;
- ULONG CompletionFilter;
+ ULONG Length;
+ ULONG CompletionFilter;
} NotifyDirectory;
struct {
- ULONG Length;
- FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
+ ULONG Length;
+ FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
} QueryFile;
struct {
- ULONG Length;
- FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
- PFILE_OBJECT FileObject;
+ ULONG Length;
+ FILE_INFORMATION_CLASS POINTER_ALIGNMENT FileInformationClass;
+ PFILE_OBJECT FileObject;
_ANONYMOUS_UNION union {
_ANONYMOUS_STRUCT struct {
- BOOLEAN ReplaceIfExists;
- BOOLEAN AdvanceOnly;
+ BOOLEAN ReplaceIfExists;
+ BOOLEAN AdvanceOnly;
} DUMMYSTRUCTNAME;
- ULONG ClusterCount;
- HANDLE DeleteHandle;
+ ULONG ClusterCount;
+ HANDLE DeleteHandle;
} DUMMYUNIONNAME;
} SetFile;
struct {
- ULONG Length;
- PVOID EaList;
- ULONG EaListLength;
- ULONG EaIndex;
+ ULONG Length;
+ PVOID EaList;
+ ULONG EaListLength;
+ ULONG EaIndex;
} QueryEa;
struct {
- ULONG Length;
+ ULONG Length;
} SetEa;
struct {
- ULONG Length;
- FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
+ ULONG Length;
+ FS_INFORMATION_CLASS POINTER_ALIGNMENT FsInformationClass;
} QueryVolume;
struct {
- ULONG Length;
- FS_INFORMATION_CLASS FsInformationClass;
+ ULONG Length;
+ FS_INFORMATION_CLASS FsInformationClass;
} SetVolume;
struct {
- ULONG OutputBufferLength;
- ULONG InputBufferLength;
- ULONG FsControlCode;
- PVOID Type3InputBuffer;
+ ULONG OutputBufferLength;
+ ULONG InputBufferLength;
+ ULONG FsControlCode;
+ PVOID Type3InputBuffer;
} FileSystemControl;
struct {
- PLARGE_INTEGER Length;
- ULONG Key;
- LARGE_INTEGER ByteOffset;
+ PLARGE_INTEGER Length;
+ ULONG Key;
+ LARGE_INTEGER ByteOffset;
} LockControl;
struct {
- ULONG OutputBufferLength;
- ULONG POINTER_ALIGNMENT InputBufferLength;
- ULONG POINTER_ALIGNMENT IoControlCode;
- PVOID Type3InputBuffer;
+ ULONG OutputBufferLength;
+ ULONG POINTER_ALIGNMENT InputBufferLength;
+ ULONG POINTER_ALIGNMENT IoControlCode;
+ PVOID Type3InputBuffer;
} DeviceIoControl;
struct {
- SECURITY_INFORMATION SecurityInformation;
- ULONG POINTER_ALIGNMENT Length;
+ SECURITY_INFORMATION SecurityInformation;
+ ULONG POINTER_ALIGNMENT Length;
} QuerySecurity;
struct {
- SECURITY_INFORMATION SecurityInformation;
- PSECURITY_DESCRIPTOR SecurityDescriptor;
+ SECURITY_INFORMATION SecurityInformation;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
} SetSecurity;
struct {
- PVPB Vpb;
- PDEVICE_OBJECT DeviceObject;
+ PVPB Vpb;
+ PDEVICE_OBJECT DeviceObject;
} MountVolume;
struct {
- PVPB Vpb;
- PDEVICE_OBJECT DeviceObject;
+ PVPB Vpb;
+ PDEVICE_OBJECT DeviceObject;
} VerifyVolume;
struct {
- struct _SCSI_REQUEST_BLOCK *Srb;
+ struct _SCSI_REQUEST_BLOCK *Srb;
} Scsi;
struct {
- ULONG Length;
- PSID StartSid;
- struct _FILE_GET_QUOTA_INFORMATION *SidList;
- ULONG SidListLength;
+ ULONG Length;
+ PSID StartSid;
+ struct _FILE_GET_QUOTA_INFORMATION *SidList;
+ ULONG SidListLength;
} QueryQuota;
struct {
- ULONG Length;
+ ULONG Length;
} SetQuota;
struct {
- DEVICE_RELATION_TYPE Type;
+ DEVICE_RELATION_TYPE Type;
} QueryDeviceRelations;
struct {
- CONST GUID *InterfaceType;
- USHORT Size;
- USHORT Version;
- PINTERFACE Interface;
- PVOID InterfaceSpecificData;
+ CONST GUID *InterfaceType;
+ USHORT Size;
+ USHORT Version;
+ PINTERFACE Interface;
+ PVOID InterfaceSpecificData;
} QueryInterface;
struct {
- PDEVICE_CAPABILITIES Capabilities;
+ PDEVICE_CAPABILITIES Capabilities;
} DeviceCapabilities;
struct {
- PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
+ PIO_RESOURCE_REQUIREMENTS_LIST IoResourceRequirementList;
} FilterResourceRequirements;
struct {
- ULONG WhichSpace;
- PVOID Buffer;
- ULONG Offset;
- ULONG POINTER_ALIGNMENT Length;
+ ULONG WhichSpace;
+ PVOID Buffer;
+ ULONG Offset;
+ ULONG POINTER_ALIGNMENT Length;
} ReadWriteConfig;
struct {
- BOOLEAN Lock;
+ BOOLEAN Lock;
} SetLock;
struct {
- BUS_QUERY_ID_TYPE IdType;
+ BUS_QUERY_ID_TYPE IdType;
} QueryId;
struct {
- DEVICE_TEXT_TYPE DeviceTextType;
- LCID POINTER_ALIGNMENT LocaleId;
+ DEVICE_TEXT_TYPE DeviceTextType;
+ LCID POINTER_ALIGNMENT LocaleId;
} QueryDeviceText;
struct {
- BOOLEAN InPath;
- BOOLEAN Reserved[3];
- DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
+ BOOLEAN InPath;
+ BOOLEAN Reserved[3];
+ DEVICE_USAGE_NOTIFICATION_TYPE POINTER_ALIGNMENT Type;
} UsageNotification;
struct {
- SYSTEM_POWER_STATE PowerState;
+ SYSTEM_POWER_STATE PowerState;
} WaitWake;
struct {
- PPOWER_SEQUENCE PowerSequence;
+ PPOWER_SEQUENCE PowerSequence;
} PowerSequence;
struct {
- ULONG SystemContext;
- POWER_STATE_TYPE POINTER_ALIGNMENT Type;
- POWER_STATE POINTER_ALIGNMENT State;
- POWER_ACTION POINTER_ALIGNMENT ShutdownType;
+ ULONG SystemContext;
+ POWER_STATE_TYPE POINTER_ALIGNMENT Type;
+ POWER_STATE POINTER_ALIGNMENT State;
+ POWER_ACTION POINTER_ALIGNMENT ShutdownType;
} Power;
struct {
- PCM_RESOURCE_LIST AllocatedResources;
- PCM_RESOURCE_LIST AllocatedResourcesTranslated;
+ PCM_RESOURCE_LIST AllocatedResources;
+ PCM_RESOURCE_LIST AllocatedResourcesTranslated;
} StartDevice;
struct {
- ULONG_PTR ProviderId;
- PVOID DataPath;
- ULONG BufferSize;
- PVOID Buffer;
+ ULONG_PTR ProviderId;
+ PVOID DataPath;
+ ULONG BufferSize;
+ PVOID Buffer;
} WMI;
struct {
- PVOID Argument1;
- PVOID Argument2;
- PVOID Argument3;
- PVOID Argument4;
+ PVOID Argument1;
+ PVOID Argument2;
+ PVOID Argument3;
+ PVOID Argument4;
} Others;
} Parameters;
- PDEVICE_OBJECT DeviceObject;
- PFILE_OBJECT FileObject;
- PIO_COMPLETION_ROUTINE CompletionRoutine;
- PVOID Context;
+ PDEVICE_OBJECT DeviceObject;
+ PFILE_OBJECT FileObject;
+ PIO_COMPLETION_ROUTINE CompletionRoutine;
+ PVOID Context;
} IO_STACK_LOCATION, *PIO_STACK_LOCATION;
#if !defined(_AMD64_) && !defined(_IA64_)
#include
@@ -6865,7 +6853,7 @@ typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG Undefined:1;
ULONG Reserved1:3;
ULONG DataLinkProtocolError:1;
@@ -6886,7 +6874,7 @@ typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG Undefined:1;
ULONG Reserved1:3;
ULONG DataLinkProtocolError:1;
@@ -6907,7 +6895,7 @@ typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG Undefined:1;
ULONG Reserved1:3;
ULONG DataLinkProtocolError:1;
@@ -6928,7 +6916,7 @@ typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG ReceiverError:1;
ULONG Reserved1:5;
ULONG BadTLP:1;
@@ -6943,7 +6931,7 @@ typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG ReceiverError:1;
ULONG Reserved1:5;
ULONG BadTLP:1;
@@ -6958,7 +6946,7 @@ typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
typedef union _PCI_EXPRESS_AER_CAPABILITIES {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG FirstErrorPointer:5;
ULONG ECRCGenerationCapable:1;
ULONG ECRCGenerationEnable:1;
@@ -6970,7 +6958,7 @@ typedef union _PCI_EXPRESS_AER_CAPABILITIES {
} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG CorrectableErrorReportingEnable:1;
ULONG NonFatalErrorReportingEnable:1;
ULONG FatalErrorReportingEnable:1;
@@ -6980,7 +6968,7 @@ typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG CorrectableErrorReceived:1;
ULONG MultipleCorrectableErrorsReceived:1;
ULONG UncorrectableErrorReceived:1;
@@ -6995,7 +6983,7 @@ typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CorrectableSourceIdFun:3;
USHORT CorrectableSourceIdDev:5;
USHORT CorrectableSourceIdBus:8;
@@ -7007,7 +6995,7 @@ typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG TargetAbortOnSplitCompletion:1;
ULONG MasterAbortOnSplitCompletion:1;
ULONG ReceivedTargetAbort:1;
@@ -7028,7 +7016,7 @@ typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG TargetAbortOnSplitCompletion:1;
ULONG MasterAbortOnSplitCompletion:1;
ULONG ReceivedTargetAbort:1;
@@ -7049,7 +7037,7 @@ typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG TargetAbortOnSplitCompletion:1;
ULONG MasterAbortOnSplitCompletion:1;
ULONG ReceivedTargetAbort:1;
@@ -7070,7 +7058,7 @@ typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG SecondaryUncorrectableFirstErrorPtr:5;
ULONG Reserved:27;
} DUMMYSTRUCTNAME;
@@ -7133,7 +7121,7 @@ typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
typedef union _PCI_EXPRESS_SRIOV_CAPS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG VFMigrationCapable:1;
ULONG Reserved1:20;
ULONG VFMigrationInterruptNumber:11;
@@ -7142,7 +7130,7 @@ typedef union _PCI_EXPRESS_SRIOV_CAPS {
} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
typedef union _PCI_EXPRESS_SRIOV_CONTROL {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT VFEnable:1;
USHORT VFMigrationEnable:1;
USHORT VFMigrationInterruptEnable:1;
@@ -7154,7 +7142,7 @@ typedef union _PCI_EXPRESS_SRIOV_CONTROL {
} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
typedef union _PCI_EXPRESS_SRIOV_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT VFMigrationStatus:1;
USHORT Reserved1:15;
} DUMMYSTRUCTNAME;
@@ -7162,7 +7150,7 @@ typedef union _PCI_EXPRESS_SRIOV_STATUS {
} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG VFMigrationStateBIR:3;
ULONG VFMigrationStateOffset:29;
} DUMMYSTRUCTNAME;
@@ -7430,16 +7418,16 @@ typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
******************************************************************************/
#define MAXIMUM_FILENAME_LENGTH 256
-#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
+#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
-#define OBJECT_TYPE_CREATE 0x0001
-#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
+#define OBJECT_TYPE_CREATE 0x0001
+#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
-#define DIRECTORY_QUERY 0x0001
-#define DIRECTORY_TRAVERSE 0x0002
-#define DIRECTORY_CREATE_OBJECT 0x0004
-#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
-#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
+#define DIRECTORY_QUERY 0x0001
+#define DIRECTORY_TRAVERSE 0x0002
+#define DIRECTORY_CREATE_OBJECT 0x0004
+#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
+#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
#define SYMBOLIC_LINK_QUERY 0x0001
#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
@@ -7448,13 +7436,13 @@ typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
#define DUPLICATE_SAME_ACCESS 0x00000002
#define DUPLICATE_SAME_ATTRIBUTES 0x00000004
-#define OB_FLT_REGISTRATION_VERSION_0100 0x0100
-#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
+#define OB_FLT_REGISTRATION_VERSION_0100 0x0100
+#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
typedef ULONG OB_OPERATION;
-#define OB_OPERATION_HANDLE_CREATE 0x00000001
-#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
+#define OB_OPERATION_HANDLE_CREATE 0x00000001
+#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
IN OUT ACCESS_MASK DesiredAccess;
@@ -7475,13 +7463,13 @@ typedef union _OB_PRE_OPERATION_PARAMETERS {
typedef struct _OB_PRE_OPERATION_INFORMATION {
IN OB_OPERATION Operation;
- union {
+ _ANONYMOUS_UNION union {
IN ULONG Flags;
- struct {
+ _ANONYMOUS_STRUCT struct {
IN ULONG KernelHandle:1;
IN ULONG Reserved:31;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
IN PVOID Object;
IN POBJECT_TYPE ObjectType;
OUT PVOID CallContext;
@@ -7503,13 +7491,13 @@ typedef union _OB_POST_OPERATION_PARAMETERS {
typedef struct _OB_POST_OPERATION_INFORMATION {
IN OB_OPERATION Operation;
- union {
- IN ULONG Flags;
- struct {
- IN ULONG KernelHandle:1;
- IN ULONG Reserved:31;
- };
- };
+ _ANONYMOUS_UNION union {
+ IN ULONG Flags;
+ _ANONYMOUS_STRUCT struct {
+ IN ULONG KernelHandle:1;
+ IN ULONG Reserved:31;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
IN PVOID Object;
IN POBJECT_TYPE ObjectType;
IN PVOID CallContext;
@@ -7547,7 +7535,7 @@ typedef struct _OB_CALLBACK_REGISTRATION {
} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;
typedef struct _OBJECT_NAME_INFORMATION {
- UNICODE_STRING Name;
+ UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;
/* Exported object types */
@@ -7559,7 +7547,6 @@ extern POBJECT_TYPE NTSYSAPI PsThreadType;
extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
extern POBJECT_TYPE NTSYSAPI PsProcessType;
-
/******************************************************************************
* Process Manager Types *
******************************************************************************/
@@ -7580,7 +7567,7 @@ extern POBJECT_TYPE NTSYSAPI PsProcessType;
#define THREAD_SET_LIMITED_INFORMATION 0x0400
#define THREAD_QUERY_LIMITED_INFORMATION 0x0800
-#define PROCESS_DUP_HANDLE (0x0040)
+#define PROCESS_DUP_HANDLE (0x0040)
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
@@ -7680,9 +7667,9 @@ typedef VOID
#define HIGH_LEVEL 31
#define CLOCK_LEVEL CLOCK2_LEVEL
-#define KIP0PCRADDRESS 0xffdff000
+#define KIP0PCRADDRESS 0xffdff000
#define KI_USER_SHARED_DATA 0xffdf0000
-#define SharedUserData ((KUSER_SHARED_DATA * CONST) KI_USER_SHARED_DATA)
+#define SharedUserData ((KUSER_SHARED_DATA * CONST)KI_USER_SHARED_DATA)
#define PAGE_SIZE 0x1000
#define PAGE_SHIFT 12L
@@ -7698,14 +7685,14 @@ typedef VOID
typedef struct _KFLOATING_SAVE {
- ULONG ControlWord;
- ULONG StatusWord;
- ULONG ErrorOffset;
- ULONG ErrorSelector;
- ULONG DataOffset;
- ULONG DataSelector;
- ULONG Cr0NpxState;
- ULONG Spare1;
+ ULONG ControlWord;
+ ULONG StatusWord;
+ ULONG ErrorOffset;
+ ULONG ErrorSelector;
+ ULONG DataOffset;
+ ULONG DataSelector;
+ ULONG Cr0NpxState;
+ ULONG Spare1;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
extern NTKERNELAPI volatile KSYSTEM_TIME KeTickCount;
@@ -7733,14 +7720,14 @@ NTHALAPI
VOID
FASTCALL
KfLowerIrql(
- IN KIRQL NewIrql);
+ IN KIRQL NewIrql);
#define KeLowerIrql(a) KfLowerIrql(a)
NTHALAPI
KIRQL
FASTCALL
KfRaiseIrql(
- IN KIRQL NewIrql);
+ IN KIRQL NewIrql);
#define KeRaiseIrql(a,b) *(b) = KfRaiseIrql(a)
NTHALAPI
@@ -7758,7 +7745,7 @@ KIRQL
FASTCALL
KfAcquireSpinLock(
IN OUT PKSPIN_LOCK SpinLock);
-#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
+#define KeAcquireSpinLock(a,b) *(b) = KfAcquireSpinLock(a)
NTHALAPI
VOID
@@ -7766,7 +7753,7 @@ FASTCALL
KfReleaseSpinLock(
IN OUT PKSPIN_LOCK SpinLock,
IN KIRQL NewIrql);
-#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
+#define KeReleaseSpinLock(a,b) KfReleaseSpinLock(a,b)
NTKERNELAPI
VOID
@@ -7791,13 +7778,13 @@ NTKERNELAPI
NTSTATUS
NTAPI
KeSaveFloatingPointState(
- OUT PKFLOATING_SAVE FloatSave);
+ OUT PKFLOATING_SAVE FloatSave);
NTKERNELAPI
NTSTATUS
NTAPI
KeRestoreFloatingPointState(
- IN PKFLOATING_SAVE FloatSave);
+ IN PKFLOATING_SAVE FloatSave);
/* VOID
* KeFlushIoBuffers(
@@ -7816,11 +7803,11 @@ _KeQueryTickCount(
OUT PLARGE_INTEGER CurrentCount)
{
for (;;) {
- CurrentCount->HighPart = KeTickCount.High1Time;
- CurrentCount->LowPart = KeTickCount.LowPart;
- if (CurrentCount->HighPart == KeTickCount.High2Time) break;
- YieldProcessor();
- }
+ CurrentCount->HighPart = KeTickCount.High1Time;
+ CurrentCount->LowPart = KeTickCount.LowPart;
+ if (CurrentCount->HighPart == KeTickCount.High2Time) break;
+ YieldProcessor();
+ }
}
#define KeQueryTickCount(CurrentCount) _KeQueryTickCount(CurrentCount)
@@ -7857,11 +7844,6 @@ _KeQueryTickCount(
#define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
-#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
-#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
-#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
-
-
typedef struct _KFLOATING_SAVE {
ULONG Dummy;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
@@ -7921,7 +7903,7 @@ KIRQL
KeRaiseIrqlToSynchLevel(VOID)
{
return KfRaiseIrql(12); // SYNCH_LEVEL = IPI_LEVEL - 2
- }
+}
FORCEINLINE
PKTHREAD
@@ -8183,7 +8165,7 @@ IsListEmpty(
FORCEINLINE
BOOLEAN
RemoveEntryList(
- IN PLIST_ENTRY Entry)
+ IN PLIST_ENTRY Entry)
{
PLIST_ENTRY OldFlink;
PLIST_ENTRY OldBlink;
@@ -8198,7 +8180,7 @@ RemoveEntryList(
FORCEINLINE
PLIST_ENTRY
RemoveHeadList(
- IN OUT PLIST_ENTRY ListHead)
+ IN OUT PLIST_ENTRY ListHead)
{
PLIST_ENTRY Flink;
PLIST_ENTRY Entry;
@@ -8213,7 +8195,7 @@ RemoveHeadList(
FORCEINLINE
PLIST_ENTRY
RemoveTailList(
- IN OUT PLIST_ENTRY ListHead)
+ IN OUT PLIST_ENTRY ListHead)
{
PLIST_ENTRY Blink;
PLIST_ENTRY Entry;
@@ -8296,10 +8278,10 @@ NTSYSAPI
VOID
NTAPI
RtlAssert(
- IN PVOID FailedAssertion,
- IN PVOID FileName,
- IN ULONG LineNumber,
- IN PSTR Message);
+ IN PVOID FailedAssertion,
+ IN PVOID FileName,
+ IN ULONG LineNumber,
+ IN PSTR Message);
/* VOID
* RtlCopyMemory(
@@ -8317,9 +8299,9 @@ NTSYSAPI
VOID
NTAPI
RtlCopyMemoryNonTemporal(
- VOID UNALIGNED *Destination,
- CONST VOID UNALIGNED *Source,
- SIZE_T Length);
+ VOID UNALIGNED *Destination,
+ CONST VOID UNALIGNED *Source,
+ SIZE_T Length);
#else
#define RtlCopyMemoryNonTemporal RtlCopyMemory
#endif
@@ -8356,21 +8338,21 @@ NTSYSAPI
VOID
NTAPI
RtlFreeUnicodeString(
- IN OUT PUNICODE_STRING UnicodeString);
+ IN OUT PUNICODE_STRING UnicodeString);
NTSYSAPI
NTSTATUS
NTAPI
RtlGUIDFromString(
- IN PUNICODE_STRING GuidString,
- OUT GUID *Guid);
+ IN PUNICODE_STRING GuidString,
+ OUT GUID *Guid);
NTSYSAPI
VOID
NTAPI
RtlInitUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
- IN PCWSTR SourceString OPTIONAL);
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCWSTR SourceString OPTIONAL);
/* VOID
* RtlMoveMemory(
@@ -8385,8 +8367,8 @@ NTSYSAPI
NTSTATUS
NTAPI
RtlStringFromGUID(
- IN REFGUID Guid,
- OUT PUNICODE_STRING GuidString);
+ IN REFGUID Guid,
+ OUT PUNICODE_STRING GuidString);
/* VOID
* RtlZeroMemory(
@@ -8400,37 +8382,35 @@ RtlStringFromGUID(
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-
NTSYSAPI
BOOLEAN
NTAPI
RtlAreBitsClear(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG StartingIndex,
- IN ULONG Length);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG StartingIndex,
+ IN ULONG Length);
NTSYSAPI
BOOLEAN
NTAPI
RtlAreBitsSet(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG StartingIndex,
- IN ULONG Length);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG StartingIndex,
+ IN ULONG Length);
NTSYSAPI
NTSTATUS
NTAPI
RtlAnsiStringToUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
- IN PANSI_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PANSI_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
NTSYSAPI
ULONG
NTAPI
RtlxAnsiStringToUnicodeSize(
- IN PCANSI_STRING AnsiString);
+ IN PCANSI_STRING AnsiString);
#define RtlAnsiStringToUnicodeSize(String) ( \
NLS_MB_CODE_PAGE_TAG ? \
@@ -8442,107 +8422,107 @@ NTSYSAPI
NTSTATUS
NTAPI
RtlAppendUnicodeStringToString(
- IN OUT PUNICODE_STRING Destination,
- IN PCUNICODE_STRING Source);
+ IN OUT PUNICODE_STRING Destination,
+ IN PCUNICODE_STRING Source);
NTSYSAPI
NTSTATUS
NTAPI
RtlAppendUnicodeToString(
- IN OUT PUNICODE_STRING Destination,
- IN PCWSTR Source);
+ IN OUT PUNICODE_STRING Destination,
+ IN PCWSTR Source);
NTSYSAPI
NTSTATUS
NTAPI
RtlCheckRegistryKey(
- IN ULONG RelativeTo,
- IN PWSTR Path);
+ IN ULONG RelativeTo,
+ IN PWSTR Path);
NTSYSAPI
VOID
NTAPI
RtlClearAllBits(
- IN PRTL_BITMAP BitMapHeader);
+ IN PRTL_BITMAP BitMapHeader);
NTSYSAPI
VOID
NTAPI
RtlClearBits(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG StartingIndex,
- IN ULONG NumberToClear);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG StartingIndex,
+ IN ULONG NumberToClear);
NTSYSAPI
SIZE_T
NTAPI
RtlCompareMemory(
- IN CONST VOID *Source1,
- IN CONST VOID *Source2,
- IN SIZE_T Length);
+ IN CONST VOID *Source1,
+ IN CONST VOID *Source2,
+ IN SIZE_T Length);
NTSYSAPI
LONG
NTAPI
RtlCompareUnicodeString(
- IN PCUNICODE_STRING String1,
- IN PCUNICODE_STRING String2,
- IN BOOLEAN CaseInSensitive);
+ IN PCUNICODE_STRING String1,
+ IN PCUNICODE_STRING String2,
+ IN BOOLEAN CaseInSensitive);
NTSYSAPI
LONG
NTAPI
RtlCompareUnicodeStrings(
- IN PCWCH String1,
- IN SIZE_T String1Length,
- IN PCWCH String2,
- IN SIZE_T String2Length,
- IN BOOLEAN CaseInSensitive);
+ IN PCWCH String1,
+ IN SIZE_T String1Length,
+ IN PCWCH String2,
+ IN SIZE_T String2Length,
+ IN BOOLEAN CaseInSensitive);
NTSYSAPI
VOID
NTAPI
RtlCopyUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
+ IN OUT PUNICODE_STRING DestinationString,
IN PCUNICODE_STRING SourceString OPTIONAL);
NTSYSAPI
NTSTATUS
NTAPI
RtlCreateRegistryKey(
- IN ULONG RelativeTo,
- IN PWSTR Path);
+ IN ULONG RelativeTo,
+ IN PWSTR Path);
NTSYSAPI
NTSTATUS
NTAPI
RtlCreateSecurityDescriptor(
- IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
- IN ULONG Revision);
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN ULONG Revision);
NTSYSAPI
NTSTATUS
NTAPI
RtlDeleteRegistryValue(
- IN ULONG RelativeTo,
- IN PCWSTR Path,
- IN PCWSTR ValueName);
+ IN ULONG RelativeTo,
+ IN PCWSTR Path,
+ IN PCWSTR ValueName);
NTSYSAPI
BOOLEAN
NTAPI
RtlEqualUnicodeString(
- IN CONST UNICODE_STRING *String1,
- IN CONST UNICODE_STRING *String2,
- IN BOOLEAN CaseInSensitive);
+ IN CONST UNICODE_STRING *String1,
+ IN CONST UNICODE_STRING *String2,
+ IN BOOLEAN CaseInSensitive);
#if !defined(_AMD64_) && !defined(_IA64_)
NTSYSAPI
LARGE_INTEGER
NTAPI
RtlExtendedIntegerMultiply(
- IN LARGE_INTEGER Multiplicand,
- IN LONG Multiplier);
+ IN LARGE_INTEGER Multiplicand,
+ IN LONG Multiplier);
NTSYSAPI
LARGE_INTEGER
@@ -8567,128 +8547,128 @@ NTSYSAPI
VOID
NTAPI
RtlFreeAnsiString(
- IN PANSI_STRING AnsiString);
+ IN PANSI_STRING AnsiString);
NTSYSAPI
ULONG
NTAPI
RtlFindClearBits(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG NumberToFind,
- IN ULONG HintIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG NumberToFind,
+ IN ULONG HintIndex);
NTSYSAPI
ULONG
NTAPI
RtlFindClearBitsAndSet(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG NumberToFind,
- IN ULONG HintIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG NumberToFind,
+ IN ULONG HintIndex);
NTSYSAPI
ULONG
NTAPI
RtlFindFirstRunClear(
- IN PRTL_BITMAP BitMapHeader,
- OUT PULONG StartingIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ OUT PULONG StartingIndex);
NTSYSAPI
ULONG
NTAPI
RtlFindClearRuns(
- IN PRTL_BITMAP BitMapHeader,
- OUT PRTL_BITMAP_RUN RunArray,
- IN ULONG SizeOfRunArray,
- IN BOOLEAN LocateLongestRuns);
+ IN PRTL_BITMAP BitMapHeader,
+ OUT PRTL_BITMAP_RUN RunArray,
+ IN ULONG SizeOfRunArray,
+ IN BOOLEAN LocateLongestRuns);
NTSYSAPI
ULONG
NTAPI
RtlFindLastBackwardRunClear(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG FromIndex,
- OUT PULONG StartingRunIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG FromIndex,
+ OUT PULONG StartingRunIndex);
NTSYSAPI
CCHAR
NTAPI
RtlFindLeastSignificantBit(
- IN ULONGLONG Set);
+ IN ULONGLONG Set);
NTSYSAPI
ULONG
NTAPI
RtlFindLongestRunClear(
- IN PRTL_BITMAP BitMapHeader,
- OUT PULONG StartingIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ OUT PULONG StartingIndex);
NTSYSAPI
CCHAR
NTAPI
RtlFindMostSignificantBit(
- IN ULONGLONG Set);
+ IN ULONGLONG Set);
NTSYSAPI
ULONG
NTAPI
RtlFindNextForwardRunClear(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG FromIndex,
- OUT PULONG StartingRunIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG FromIndex,
+ OUT PULONG StartingRunIndex);
NTSYSAPI
ULONG
NTAPI
RtlFindSetBits(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG NumberToFind,
- IN ULONG HintIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG NumberToFind,
+ IN ULONG HintIndex);
NTSYSAPI
ULONG
NTAPI
RtlFindSetBitsAndClear(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG NumberToFind,
- IN ULONG HintIndex);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG NumberToFind,
+ IN ULONG HintIndex);
NTSYSAPI
VOID
NTAPI
RtlInitAnsiString(
- IN OUT PANSI_STRING DestinationString,
- IN PCSZ SourceString);
+ IN OUT PANSI_STRING DestinationString,
+ IN PCSZ SourceString);
NTSYSAPI
VOID
NTAPI
RtlInitializeBitMap(
- IN PRTL_BITMAP BitMapHeader,
- IN PULONG BitMapBuffer,
- IN ULONG SizeOfBitMap);
+ IN PRTL_BITMAP BitMapHeader,
+ IN PULONG BitMapBuffer,
+ IN ULONG SizeOfBitMap);
NTSYSAPI
VOID
NTAPI
RtlInitString(
- IN OUT PSTRING DestinationString,
- IN PCSZ SourceString);
+ IN OUT PSTRING DestinationString,
+ IN PCSZ SourceString);
NTSYSAPI
NTSTATUS
NTAPI
RtlIntegerToUnicodeString(
- IN ULONG Value,
- IN ULONG Base OPTIONAL,
- IN OUT PUNICODE_STRING String);
+ IN ULONG Value,
+ IN ULONG Base OPTIONAL,
+ IN OUT PUNICODE_STRING String);
NTSYSAPI
NTSTATUS
NTAPI
RtlInt64ToUnicodeString(
- IN ULONGLONG Value,
- IN ULONG Base OPTIONAL,
- IN OUT PUNICODE_STRING String);
+ IN ULONGLONG Value,
+ IN ULONG Base OPTIONAL,
+ IN OUT PUNICODE_STRING String);
#ifdef _WIN64
#define RtlIntPtrToUnicodeString(Value, Base, String) \
@@ -8709,29 +8689,29 @@ NTSYSAPI
ULONG
NTAPI
RtlLengthSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);
NTSYSAPI
ULONG
NTAPI
RtlNumberOfClearBits(
- IN PRTL_BITMAP BitMapHeader);
+ IN PRTL_BITMAP BitMapHeader);
NTSYSAPI
ULONG
NTAPI
RtlNumberOfSetBits(
- IN PRTL_BITMAP BitMapHeader);
+ IN PRTL_BITMAP BitMapHeader);
NTSYSAPI
NTSTATUS
NTAPI
RtlQueryRegistryValues(
- IN ULONG RelativeTo,
- IN PCWSTR Path,
+ IN ULONG RelativeTo,
+ IN PCWSTR Path,
IN OUT PRTL_QUERY_REGISTRY_TABLE QueryTable,
IN PVOID Context OPTIONAL,
- IN PVOID Environment OPTIONAL);
+ IN PVOID Environment OPTIONAL);
#define SHORT_SIZE (sizeof(USHORT))
#define SHORT_MASK (SHORT_SIZE - 1)
@@ -8750,24 +8730,24 @@ NTSYSAPI
VOID
NTAPI
RtlSetAllBits(
- IN PRTL_BITMAP BitMapHeader);
+ IN PRTL_BITMAP BitMapHeader);
NTSYSAPI
VOID
NTAPI
RtlSetBits(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG StartingIndex,
- IN ULONG NumberToSet);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG StartingIndex,
+ IN ULONG NumberToSet);
NTSYSAPI
NTSTATUS
NTAPI
RtlSetDaclSecurityDescriptor(
- IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
- IN BOOLEAN DaclPresent,
- IN PACL Dacl OPTIONAL,
- IN BOOLEAN DaclDefaulted OPTIONAL);
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN BOOLEAN DaclPresent,
+ IN PACL Dacl OPTIONAL,
+ IN BOOLEAN DaclDefaulted OPTIONAL);
#if defined(_AMD64_)
@@ -8880,46 +8860,45 @@ RtlSetDaclSecurityDescriptor(
#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
#endif /* _WIN64 */
-
NTSYSAPI
BOOLEAN
NTAPI
RtlTimeFieldsToTime(
- IN PTIME_FIELDS TimeFields,
- IN PLARGE_INTEGER Time);
+ IN PTIME_FIELDS TimeFields,
+ IN PLARGE_INTEGER Time);
NTSYSAPI
VOID
NTAPI
RtlTimeToTimeFields(
- IN PLARGE_INTEGER Time,
- IN PTIME_FIELDS TimeFields);
+ IN PLARGE_INTEGER Time,
+ IN PTIME_FIELDS TimeFields);
NTSYSAPI
ULONG
FASTCALL
RtlUlongByteSwap(
- IN ULONG Source);
+ IN ULONG Source);
NTSYSAPI
ULONGLONG
FASTCALL
RtlUlonglongByteSwap(
- IN ULONGLONG Source);
+ IN ULONGLONG Source);
NTSYSAPI
NTSTATUS
NTAPI
RtlUnicodeStringToAnsiString(
- IN OUT PANSI_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
+ IN OUT PANSI_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
NTSYSAPI
ULONG
NTAPI
RtlxUnicodeStringToAnsiSize(
- IN PCUNICODE_STRING UnicodeString);
+ IN PCUNICODE_STRING UnicodeString);
#define RtlUnicodeStringToAnsiSize(String) ( \
NLS_MB_CODE_PAGE_TAG ? \
@@ -8931,46 +8910,46 @@ NTSYSAPI
NTSTATUS
NTAPI
RtlUnicodeStringToInteger(
- IN PCUNICODE_STRING String,
- IN ULONG Base OPTIONAL,
- OUT PULONG Value);
+ IN PCUNICODE_STRING String,
+ IN ULONG Base OPTIONAL,
+ OUT PULONG Value);
NTSYSAPI
WCHAR
NTAPI
RtlUpcaseUnicodeChar(
- IN WCHAR SourceCharacter);
+ IN WCHAR SourceCharacter);
NTSYSAPI
USHORT
FASTCALL
RtlUshortByteSwap(
- IN USHORT Source);
+ IN USHORT Source);
NTSYSAPI
BOOLEAN
NTAPI
RtlValidRelativeSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
- IN ULONG SecurityDescriptorLength,
- IN SECURITY_INFORMATION RequiredInformation);
+ IN PSECURITY_DESCRIPTOR SecurityDescriptorInput,
+ IN ULONG SecurityDescriptorLength,
+ IN SECURITY_INFORMATION RequiredInformation);
NTSYSAPI
BOOLEAN
NTAPI
RtlValidSecurityDescriptor(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);
NTSYSAPI
NTSTATUS
NTAPI
RtlWriteRegistryValue(
- IN ULONG RelativeTo,
- IN PCWSTR Path,
- IN PCWSTR ValueName,
- IN ULONG ValueType,
- IN PVOID ValueData,
- IN ULONG ValueLength);
+ IN ULONG RelativeTo,
+ IN PCWSTR Path,
+ IN PCWSTR ValueName,
+ IN ULONG ValueType,
+ IN PVOID ValueData,
+ IN ULONG ValueLength);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
@@ -8981,41 +8960,40 @@ NTSYSAPI
VOID
FASTCALL
RtlPrefetchMemoryNonTemporal(
- IN PVOID Source,
- IN SIZE_T Length);
+ IN PVOID Source,
+ IN SIZE_T Length);
#endif
#if (NTDDI_VERSION >= NTDDI_WINXP)
-
NTSYSAPI
VOID
NTAPI
RtlClearBit(
- PRTL_BITMAP BitMapHeader,
- ULONG BitNumber);
+ PRTL_BITMAP BitMapHeader,
+ ULONG BitNumber);
NTSYSAPI
WCHAR
NTAPI
RtlDowncaseUnicodeChar(
- IN WCHAR SourceCharacter);
+ IN WCHAR SourceCharacter);
NTSYSAPI
VOID
NTAPI
RtlSetBit(
- PRTL_BITMAP BitMapHeader,
- ULONG BitNumber);
+ PRTL_BITMAP BitMapHeader,
+ ULONG BitNumber);
NTSYSAPI
BOOLEAN
NTAPI
RtlTestBit(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG BitNumber);
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG BitNumber);
NTSYSAPI
NTSTATUS
@@ -9027,51 +9005,51 @@ RtlHashUnicodeString(
OUT PULONG HashValue);
+
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
-
NTSYSAPI
ULONG
NTAPI
RtlNumberOfSetBitsUlongPtr(
- IN ULONG_PTR Target);
+ IN ULONG_PTR Target);
NTSYSAPI
ULONGLONG
NTAPI
-RtlIoDecodeMemIoResource (
- IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
- OUT PULONGLONG Alignment OPTIONAL,
- OUT PULONGLONG MinimumAddress OPTIONAL,
- OUT PULONGLONG MaximumAddress OPTIONAL);
+RtlIoDecodeMemIoResource(
+ IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
+ OUT PULONGLONG Alignment OPTIONAL,
+ OUT PULONGLONG MinimumAddress OPTIONAL,
+ OUT PULONGLONG MaximumAddress OPTIONAL);
NTSYSAPI
NTSTATUS
NTAPI
RtlIoEncodeMemIoResource(
- IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
- IN UCHAR Type,
- IN ULONGLONG Length,
- IN ULONGLONG Alignment,
- IN ULONGLONG MinimumAddress,
- IN ULONGLONG MaximumAddress);
+ IN struct _IO_RESOURCE_DESCRIPTOR *Descriptor,
+ IN UCHAR Type,
+ IN ULONGLONG Length,
+ IN ULONGLONG Alignment,
+ IN ULONGLONG MinimumAddress,
+ IN ULONGLONG MaximumAddress);
NTSYSAPI
ULONGLONG
NTAPI
RtlCmDecodeMemIoResource(
- IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
- OUT PULONGLONG Start OPTIONAL);
+ IN struct _CM_PARTIAL_RESOURCE_DESCRIPTOR *Descriptor,
+ OUT PULONGLONG Start OPTIONAL);
NTSYSAPI
NTSTATUS
NTAPI
RtlFindClosestEncodableLength(
- IN ULONGLONG SourceLength,
- OUT PULONGLONG TargetLength);
+ IN ULONGLONG SourceLength,
+ OUT PULONGLONG TargetLength);
NTSYSAPI
NTSTATUS
@@ -9087,8 +9065,6 @@ RtlCmEncodeMemIoResource(
#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-
NTSYSAPI
NTSTATUS
NTAPI
@@ -9128,9 +9104,9 @@ NTAPI_INLINE
RtlConvertLongToLargeInteger(
IN LONG SignedInteger)
{
- LARGE_INTEGER ret;
- ret.QuadPart = SignedInteger;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = SignedInteger;
+ return ret;
}
//DECLSPEC_DEPRECATED_DDK_WINXP
@@ -9140,9 +9116,9 @@ NTAPI_INLINE
RtlConvertUlongToLargeInteger(
IN ULONG UnsignedInteger)
{
- LARGE_INTEGER ret;
- ret.QuadPart = UnsignedInteger;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = UnsignedInteger;
+ return ret;
}
//DECLSPEC_DEPRECATED_DDK_WINXP
@@ -9178,13 +9154,13 @@ static __inline
ULONG
NTAPI_INLINE
RtlEnlargedUnsignedDivide(
- IN ULARGE_INTEGER Dividend,
- IN ULONG Divisor,
- IN OUT PULONG Remainder)
+ IN ULARGE_INTEGER Dividend,
+ IN ULONG Divisor,
+ IN OUT PULONG Remainder)
{
- if (Remainder)
- *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
- return (ULONG)(Dividend.QuadPart / Divisor);
+ if (Remainder)
+ *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+ return (ULONG)(Dividend.QuadPart / Divisor);
}
//DECLSPEC_DEPRECATED_DDK
@@ -9219,12 +9195,12 @@ static __inline
LARGE_INTEGER
NTAPI_INLINE
RtlEnlargedUnsignedMultiply(
- IN ULONG Multiplicand,
- IN ULONG Multiplier)
+ IN ULONG Multiplicand,
+ IN ULONG Multiplier)
{
- LARGE_INTEGER ret;
- ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = (ULONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+ return ret;
}
//DECLSPEC_DEPRECATED_DDK
@@ -9232,36 +9208,36 @@ static __inline
LARGE_INTEGER
NTAPI_INLINE
RtlEnlargedIntegerMultiply(
- IN LONG Multiplicand,
- IN LONG Multiplier)
+ IN LONG Multiplicand,
+ IN LONG Multiplier)
{
- LARGE_INTEGER ret;
- ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = (LONGLONG)Multiplicand * (ULONGLONG)Multiplier;
+ return ret;
}
FORCEINLINE
VOID
RtlInitEmptyAnsiString(
OUT PANSI_STRING AnsiString,
- IN PCHAR Buffer,
- IN USHORT BufferSize)
+ IN PCHAR Buffer,
+ IN USHORT BufferSize)
{
- AnsiString->Length = 0;
- AnsiString->MaximumLength = BufferSize;
- AnsiString->Buffer = Buffer;
+ AnsiString->Length = 0;
+ AnsiString->MaximumLength = BufferSize;
+ AnsiString->Buffer = Buffer;
}
FORCEINLINE
VOID
RtlInitEmptyUnicodeString(
- OUT PUNICODE_STRING UnicodeString,
- IN PWSTR Buffer,
- IN USHORT BufferSize)
+ OUT PUNICODE_STRING UnicodeString,
+ IN PWSTR Buffer,
+ IN USHORT BufferSize)
{
- UnicodeString->Length = 0;
- UnicodeString->MaximumLength = BufferSize;
- UnicodeString->Buffer = Buffer;
+ UnicodeString->Length = 0;
+ UnicodeString->MaximumLength = BufferSize;
+ UnicodeString->Buffer = Buffer;
}
#if defined(_AMD64_) || defined(_IA64_)
@@ -9274,9 +9250,9 @@ RtlExtendedIntegerMultiply(
IN LARGE_INTEGER Multiplicand,
IN LONG Multiplier)
{
- LARGE_INTEGER ret;
- ret.QuadPart = Multiplicand.QuadPart * Multiplier;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = Multiplicand.QuadPart * Multiplier;
+ return ret;
}
static __inline
@@ -9287,11 +9263,11 @@ RtlExtendedLargeIntegerDivide(
IN ULONG Divisor,
OUT PULONG Remainder OPTIONAL)
{
- LARGE_INTEGER ret;
- ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
- if (Remainder)
- *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = (ULONG64)Dividend.QuadPart / Divisor;
+ if (Remainder)
+ *Remainder = (ULONG)(Dividend.QuadPart % Divisor);
+ return ret;
}
@@ -9309,19 +9285,19 @@ static __inline
LARGE_INTEGER
NTAPI_INLINE
RtlExtendedMagicDivide(
- IN LARGE_INTEGER Dividend,
- IN LARGE_INTEGER MagicDivisor,
- IN CCHAR ShiftCount)
+ IN LARGE_INTEGER Dividend,
+ IN LARGE_INTEGER MagicDivisor,
+ IN CCHAR ShiftCount)
{
- LARGE_INTEGER ret;
- ULONG64 ret64;
- BOOLEAN Pos;
- Pos = (Dividend.QuadPart >= 0);
- ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
- MagicDivisor.QuadPart);
- ret64 >>= ShiftCount;
- ret.QuadPart = Pos ? ret64 : -ret64;
- return ret;
+ LARGE_INTEGER ret;
+ ULONG64 ret64;
+ BOOLEAN Pos;
+ Pos = (Dividend.QuadPart >= 0);
+ ret64 = UnsignedMultiplyHigh(Pos ? Dividend.QuadPart : -Dividend.QuadPart,
+ MagicDivisor.QuadPart);
+ ret64 >>= ShiftCount;
+ ret.QuadPart = Pos ? ret64 : -ret64;
+ return ret;
}
#endif
@@ -9330,12 +9306,12 @@ static __inline
LARGE_INTEGER
NTAPI_INLINE
RtlLargeIntegerAdd(
- IN LARGE_INTEGER Addend1,
- IN LARGE_INTEGER Addend2)
+ IN LARGE_INTEGER Addend1,
+ IN LARGE_INTEGER Addend2)
{
- LARGE_INTEGER ret;
- ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = Addend1.QuadPart + Addend2.QuadPart;
+ return ret;
}
/* VOID
@@ -9352,12 +9328,12 @@ static __inline
LARGE_INTEGER
NTAPI_INLINE
RtlLargeIntegerArithmeticShift(
- IN LARGE_INTEGER LargeInteger,
- IN CCHAR ShiftCount)
+ IN LARGE_INTEGER LargeInteger,
+ IN CCHAR ShiftCount)
{
- LARGE_INTEGER ret;
- ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
- return ret;
+ LARGE_INTEGER ret;
+ ret.QuadPart = LargeInteger.QuadPart >> ShiftCount;
+ return ret;
}
/* BOOLEAN
@@ -9371,27 +9347,27 @@ RtlLargeIntegerArithmeticShift(
FORCEINLINE
PVOID
RtlSecureZeroMemory(
- OUT PVOID Pointer,
- IN SIZE_T Size)
+ OUT PVOID Pointer,
+ IN SIZE_T Size)
{
- volatile char* vptr = (volatile char*)Pointer;
+ volatile char* vptr = (volatile char*)Pointer;
#if defined(_M_AMD64)
- __stosb((PUCHAR)vptr, 0, Size);
+ __stosb((PUCHAR)vptr, 0, Size);
#else
- char * endptr = (char *)vptr + Size;
+ char * endptr = (char *)vptr + Size;
while (vptr < endptr) {
- *vptr = 0; vptr++;
- }
+ *vptr = 0; vptr++;
+ }
#endif
- return Pointer;
+ return Pointer;
}
#if defined(_M_AMD64)
FORCEINLINE
BOOLEAN
RtlCheckBit(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG BitPosition)
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG BitPosition)
{
return BitTest64((LONG64 CONST*)BitMapHeader->Buffer, (LONG64)BitPosition);
}
@@ -9459,7 +9435,7 @@ RtlCheckBit(
#define ASSERTMSG(msg, exp) \
(VOID)((!(exp)) ? \
- RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
+ RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
#define RTL_SOFT_ASSERT(exp) \
(VOID)((!(exp)) ? \
@@ -9521,7 +9497,7 @@ RtlCheckBit(
#define RTL_SOFT_VERIFY(exp) ((exp) ? TRUE : FALSE)
#define RTL_SOFT_VERIFYMSG(msg, exp) ((exp) ? TRUE : FALSE)
-#define NT_ASSERT(exp) ((VOID)0)
+#define NT_ASSERT(exp) ((VOID)0)
#define NT_ASSERTMSG(msg, exp) ((VOID)0)
#define NT_ASSERTMSGW(msg, exp) ((VOID)0)
@@ -9551,21 +9527,21 @@ InitializeSListHead(
OUT PSLIST_HEADER SListHead)
{
#if defined(_IA64_)
- ULONG64 FeatureBits;
+ ULONG64 FeatureBits;
#endif
#if defined(_WIN64)
if (((ULONG_PTR)SListHead & 0xf) != 0) {
- RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
- }
+ RtlRaiseStatus(STATUS_DATATYPE_MISALIGNMENT);
+ }
#endif
- RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
+ RtlZeroMemory(SListHead, sizeof(SLIST_HEADER));
#if defined(_IA64_)
- FeatureBits = __getReg(CV_IA64_CPUID4);
+ FeatureBits = __getReg(CV_IA64_CPUID4);
if ((FeatureBits & KF_16BYTE_INSTR) != 0) {
- SListHead->Header16.HeaderType = 1;
- SListHead->Header16.Init = 1;
- }
+ SListHead->Header16.HeaderType = 1;
+ SListHead->Header16.Init = 1;
+ }
#endif
}
@@ -9591,14 +9567,14 @@ NTKERNELAPI
PSLIST_ENTRY
FASTCALL
InterlockedPopEntrySList(
- IN PSLIST_HEADER ListHead);
+ IN PSLIST_HEADER ListHead);
NTKERNELAPI
PSLIST_ENTRY
FASTCALL
InterlockedPushEntrySList(
- IN PSLIST_HEADER ListHead,
- IN PSLIST_ENTRY ListEntry);
+ IN PSLIST_HEADER ListHead,
+ IN PSLIST_ENTRY ListEntry);
#define InterlockedFlushSList(ListHead) \
ExInterlockedFlushSList(ListHead)
@@ -9664,14 +9640,13 @@ RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
/******************************************************************************
* Kernel Functions *
******************************************************************************/
-
NTKERNELAPI
VOID
NTAPI
KeInitializeEvent(
- OUT PRKEVENT Event,
- IN EVENT_TYPE Type,
- IN BOOLEAN State);
+ OUT PRKEVENT Event,
+ IN EVENT_TYPE Type,
+ IN BOOLEAN State);
NTKERNELAPI
VOID
@@ -9681,7 +9656,6 @@ KeClearEvent(
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
#if defined(_NTDDK_) || defined(_NTIFS_)
NTKERNELAPI
VOID
@@ -9700,7 +9674,6 @@ ProbeForWrite(
IN SIZE_T Length,
IN ULONG Alignment);
-
#if defined(SINGLE_GROUP_LEGACY_API)
NTKERNELAPI
@@ -9712,7 +9685,7 @@ NTKERNELAPI
VOID
NTAPI
KeSetSystemAffinityThread(
- IN KAFFINITY Affinity);
+ IN KAFFINITY Affinity);
NTKERNELAPI
VOID
@@ -9725,8 +9698,6 @@ NTKERNELAPI
KAFFINITY
NTAPI
KeQueryActiveProcessors(VOID);
-
-
#endif /* defined(SINGLE_GROUP_LEGACY_API) */
#if !defined(_M_AMD64)
@@ -9739,7 +9710,7 @@ NTKERNELAPI
VOID
NTAPI
KeQuerySystemTime(
- OUT PLARGE_INTEGER CurrentTime);
+ OUT PLARGE_INTEGER CurrentTime);
#endif /* !_M_AMD64 */
#if !defined(_X86_)
@@ -9777,14 +9748,14 @@ 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;
+ /* Clear the lock */
+ *SpinLock = 0;
}
#endif
@@ -9793,11 +9764,11 @@ DECLSPEC_NORETURN
VOID
NTAPI
KeBugCheckEx(
- IN ULONG BugCheckCode,
- IN ULONG_PTR BugCheckParameter1,
- IN ULONG_PTR BugCheckParameter2,
- IN ULONG_PTR BugCheckParameter3,
- IN ULONG_PTR BugCheckParameter4);
+ IN ULONG BugCheckCode,
+ IN ULONG_PTR BugCheckParameter1,
+ IN ULONG_PTR BugCheckParameter2,
+ IN ULONG_PTR BugCheckParameter3,
+ IN ULONG_PTR BugCheckParameter4);
NTKERNELAPI
BOOLEAN
@@ -9828,66 +9799,66 @@ NTKERNELAPI
VOID
NTAPI
KeInitializeDeviceQueue(
- OUT PKDEVICE_QUEUE DeviceQueue);
+ OUT PKDEVICE_QUEUE DeviceQueue);
NTKERNELAPI
VOID
NTAPI
KeInitializeDpc(
- OUT PRKDPC Dpc,
- IN PKDEFERRED_ROUTINE DeferredRoutine,
- IN PVOID DeferredContext OPTIONAL);
+ OUT PRKDPC Dpc,
+ IN PKDEFERRED_ROUTINE DeferredRoutine,
+ IN PVOID DeferredContext OPTIONAL);
NTKERNELAPI
VOID
NTAPI
KeInitializeMutex(
- OUT PRKMUTEX Mutex,
- IN ULONG Level);
+ OUT PRKMUTEX Mutex,
+ IN ULONG Level);
NTKERNELAPI
VOID
NTAPI
KeInitializeSemaphore(
- OUT PRKSEMAPHORE Semaphore,
- IN LONG Count,
- IN LONG Limit);
+ OUT PRKSEMAPHORE Semaphore,
+ IN LONG Count,
+ IN LONG Limit);
NTKERNELAPI
VOID
NTAPI
KeInitializeTimer(
- OUT PKTIMER Timer);
+ OUT PKTIMER Timer);
NTKERNELAPI
VOID
NTAPI
KeInitializeTimerEx(
- OUT PKTIMER Timer,
- IN TIMER_TYPE Type);
+ OUT PKTIMER Timer,
+ IN TIMER_TYPE Type);
NTKERNELAPI
BOOLEAN
NTAPI
KeInsertByKeyDeviceQueue(
- IN OUT PKDEVICE_QUEUE DeviceQueue,
- IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
- IN ULONG SortKey);
+ IN OUT PKDEVICE_QUEUE DeviceQueue,
+ IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry,
+ IN ULONG SortKey);
NTKERNELAPI
BOOLEAN
NTAPI
KeInsertDeviceQueue(
- IN OUT PKDEVICE_QUEUE DeviceQueue,
- IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
+ IN OUT PKDEVICE_QUEUE DeviceQueue,
+ IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
NTKERNELAPI
BOOLEAN
NTAPI
KeInsertQueueDpc(
- IN OUT PRKDPC Dpc,
- IN PVOID SystemArgument1 OPTIONAL,
- IN PVOID SystemArgument2 OPTIONAL);
+ IN OUT PRKDPC Dpc,
+ IN PVOID SystemArgument1 OPTIONAL,
+ IN PVOID SystemArgument2 OPTIONAL);
NTKERNELAPI
VOID
@@ -9898,13 +9869,13 @@ NTHALAPI
LARGE_INTEGER
NTAPI
KeQueryPerformanceCounter(
- OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
+ OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL);
NTKERNELAPI
KPRIORITY
NTAPI
KeQueryPriorityThread(
- IN PRKTHREAD Thread);
+ IN PRKTHREAD Thread);
NTKERNELAPI
ULONG
@@ -9915,149 +9886,149 @@ NTKERNELAPI
LONG
NTAPI
KeReadStateEvent(
- IN PRKEVENT Event);
+ IN PRKEVENT Event);
NTKERNELAPI
LONG
NTAPI
KeReadStateMutex(
- IN PRKMUTEX Mutex);
+ IN PRKMUTEX Mutex);
NTKERNELAPI
LONG
NTAPI
KeReadStateSemaphore(
- IN PRKSEMAPHORE Semaphore);
+ IN PRKSEMAPHORE Semaphore);
NTKERNELAPI
BOOLEAN
NTAPI
KeReadStateTimer(
- IN PKTIMER Timer);
+ IN PKTIMER Timer);
NTKERNELAPI
BOOLEAN
NTAPI
KeRegisterBugCheckCallback(
- OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
- IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
- IN PVOID Buffer,
- IN ULONG Length,
- IN PUCHAR Component);
+ OUT PKBUGCHECK_CALLBACK_RECORD CallbackRecord,
+ IN PKBUGCHECK_CALLBACK_ROUTINE CallbackRoutine,
+ IN PVOID Buffer,
+ IN ULONG Length,
+ IN PUCHAR Component);
NTKERNELAPI
LONG
NTAPI
KeReleaseMutex(
- IN OUT PRKMUTEX Mutex,
- IN BOOLEAN Wait);
+ IN OUT PRKMUTEX Mutex,
+ IN BOOLEAN Wait);
NTKERNELAPI
LONG
NTAPI
KeReleaseSemaphore(
- IN OUT PRKSEMAPHORE Semaphore,
- IN KPRIORITY Increment,
- IN LONG Adjustment,
- IN BOOLEAN Wait);
+ IN OUT PRKSEMAPHORE Semaphore,
+ IN KPRIORITY Increment,
+ IN LONG Adjustment,
+ IN BOOLEAN Wait);
NTKERNELAPI
PKDEVICE_QUEUE_ENTRY
NTAPI
KeRemoveByKeyDeviceQueue(
- IN OUT PKDEVICE_QUEUE DeviceQueue,
- IN ULONG SortKey);
+ IN OUT PKDEVICE_QUEUE DeviceQueue,
+ IN ULONG SortKey);
NTKERNELAPI
PKDEVICE_QUEUE_ENTRY
NTAPI
KeRemoveDeviceQueue(
- IN OUT PKDEVICE_QUEUE DeviceQueue);
+ IN OUT PKDEVICE_QUEUE DeviceQueue);
NTKERNELAPI
BOOLEAN
NTAPI
KeRemoveEntryDeviceQueue(
- IN OUT PKDEVICE_QUEUE DeviceQueue,
- IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
+ IN OUT PKDEVICE_QUEUE DeviceQueue,
+ IN OUT PKDEVICE_QUEUE_ENTRY DeviceQueueEntry);
NTKERNELAPI
BOOLEAN
NTAPI
KeRemoveQueueDpc(
- IN OUT PRKDPC Dpc);
+ IN OUT PRKDPC Dpc);
NTKERNELAPI
LONG
NTAPI
KeResetEvent(
- IN OUT PRKEVENT Event);
+ IN OUT PRKEVENT Event);
NTKERNELAPI
LONG
NTAPI
KeSetEvent(
- IN OUT PRKEVENT Event,
- IN KPRIORITY Increment,
- IN BOOLEAN Wait);
+ IN OUT PRKEVENT Event,
+ IN KPRIORITY Increment,
+ IN BOOLEAN Wait);
NTKERNELAPI
VOID
NTAPI
KeSetImportanceDpc(
- IN OUT PRKDPC Dpc,
- IN KDPC_IMPORTANCE Importance);
+ IN OUT PRKDPC Dpc,
+ IN KDPC_IMPORTANCE Importance);
NTKERNELAPI
KPRIORITY
NTAPI
KeSetPriorityThread(
- IN OUT PKTHREAD Thread,
- IN KPRIORITY Priority);
+ IN OUT PKTHREAD Thread,
+ IN KPRIORITY Priority);
NTKERNELAPI
BOOLEAN
NTAPI
KeSetTimer(
- IN OUT PKTIMER Timer,
- IN LARGE_INTEGER DueTime,
- IN PKDPC Dpc OPTIONAL);
+ IN OUT PKTIMER Timer,
+ IN LARGE_INTEGER DueTime,
+ IN PKDPC Dpc OPTIONAL);
NTKERNELAPI
BOOLEAN
NTAPI
KeSetTimerEx(
- IN OUT PKTIMER Timer,
- IN LARGE_INTEGER DueTime,
- IN LONG Period OPTIONAL,
- IN PKDPC Dpc OPTIONAL);
+ IN OUT PKTIMER Timer,
+ IN LARGE_INTEGER DueTime,
+ IN LONG Period OPTIONAL,
+ IN PKDPC Dpc OPTIONAL);
NTHALAPI
VOID
NTAPI
KeStallExecutionProcessor(
- IN ULONG MicroSeconds);
+ IN ULONG MicroSeconds);
NTKERNELAPI
BOOLEAN
NTAPI
KeSynchronizeExecution(
- IN OUT PKINTERRUPT Interrupt,
- IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
- IN PVOID SynchronizeContext OPTIONAL);
+ IN OUT PKINTERRUPT Interrupt,
+ IN PKSYNCHRONIZE_ROUTINE SynchronizeRoutine,
+ IN PVOID SynchronizeContext OPTIONAL);
NTKERNELAPI
NTSTATUS
NTAPI
KeWaitForMultipleObjects(
- IN ULONG Count,
- IN PVOID Object[],
- IN WAIT_TYPE WaitType,
- IN KWAIT_REASON WaitReason,
- IN KPROCESSOR_MODE WaitMode,
- IN BOOLEAN Alertable,
- IN PLARGE_INTEGER Timeout OPTIONAL,
- OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
+ IN ULONG Count,
+ IN PVOID Object[],
+ IN WAIT_TYPE WaitType,
+ IN KWAIT_REASON WaitReason,
+ IN KPROCESSOR_MODE WaitMode,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Timeout OPTIONAL,
+ OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL);
#define KeWaitForMutexObject KeWaitForSingleObject
@@ -10065,11 +10036,11 @@ NTKERNELAPI
NTSTATUS
NTAPI
KeWaitForSingleObject(
- IN PVOID Object,
- IN KWAIT_REASON WaitReason,
- IN KPROCESSOR_MODE WaitMode,
- IN BOOLEAN Alertable,
- IN PLARGE_INTEGER Timeout OPTIONAL);
+ IN PVOID Object,
+ IN KWAIT_REASON WaitReason,
+ IN KPROCESSOR_MODE WaitMode,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Timeout OPTIONAL);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
@@ -10086,14 +10057,14 @@ NTKERNELAPI
VOID
FASTCALL
KeAcquireInStackQueuedSpinLockAtDpcLevel(
- IN OUT PKSPIN_LOCK SpinLock,
- OUT PKLOCK_QUEUE_HANDLE LockHandle);
+ IN OUT PKSPIN_LOCK SpinLock,
+ OUT PKLOCK_QUEUE_HANDLE LockHandle);
NTKERNELAPI
KIRQL
NTAPI
KeAcquireInterruptSpinLock(
- IN OUT PKINTERRUPT Interrupt);
+ IN OUT PKINTERRUPT Interrupt);
NTKERNELAPI
BOOLEAN
@@ -10116,14 +10087,14 @@ NTKERNELAPI
VOID
FASTCALL
KeReleaseInStackQueuedSpinLockFromDpcLevel(
- IN PKLOCK_QUEUE_HANDLE LockHandle);
+ IN PKLOCK_QUEUE_HANDLE LockHandle);
NTKERNELAPI
VOID
NTAPI
KeReleaseInterruptSpinLock(
- IN OUT PKINTERRUPT Interrupt,
- IN KIRQL OldIrql);
+ IN OUT PKINTERRUPT Interrupt,
+ IN KIRQL OldIrql);
NTKERNELAPI
PKDEVICE_QUEUE_ENTRY
@@ -10165,7 +10136,6 @@ VOID
NTAPI
KeFlushQueuedDpcs(VOID);
#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
-
#if (NTDDI_VERSION >= NTDDI_WS03)
NTKERNELAPI
@@ -10215,12 +10185,9 @@ FASTCALL
KeTestSpinLock(
IN PKSPIN_LOCK SpinLock);
-
#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
-
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
-
NTKERNELAPI
BOOLEAN
FASTCALL
@@ -10277,11 +10244,9 @@ BOOLEAN
FASTCALL
KeTryToAcquireGuardedMutex(
IN OUT PKGUARDED_MUTEX GuardedMutex);
-
#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
NTKERNELAPI
VOID
FASTCALL
@@ -10300,7 +10265,6 @@ NTSTATUS
NTAPI
KeQueryDpcWatchdogInformation(
OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
-
#if defined(SINGLE_GROUP_LEGACY_API)
NTKERNELAPI
@@ -10327,7 +10291,7 @@ NTAPI
KeQueryMaximumProcessorCount(VOID);
#endif /* SINGLE_GROUP_LEGACY_API */
-#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
#if (NTDDI_VERSION >= NTDDI_WS08)
@@ -10342,10 +10306,8 @@ KeDeregisterProcessorChangeCallback(
IN PVOID CallbackHandle);
#endif /* (NTDDI_VERSION >= NTDDI_WS08) */
-
#if (NTDDI_VERSION >= NTDDI_WIN7)
-
ULONG64
NTAPI
KeQueryTotalCycleTimeProcess(
@@ -10483,9 +10445,7 @@ ULONG
NTAPI
KeGetProcessorIndexFromNumber(
IN PPROCESSOR_NUMBER ProcNumber);
-
-#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
#if !defined(_IA64_)
NTHALAPI
VOID
@@ -10700,61 +10660,60 @@ KeFlushWriteBuffer(VOID);
}
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
NTKERNELAPI
PVOID
NTAPI
MmAllocateContiguousMemory(
- IN SIZE_T NumberOfBytes,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress);
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress);
NTKERNELAPI
PVOID
NTAPI
MmAllocateContiguousMemorySpecifyCache(
- IN SIZE_T NumberOfBytes,
- IN PHYSICAL_ADDRESS LowestAcceptableAddress,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress,
- IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
- IN MEMORY_CACHING_TYPE CacheType);
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+ IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+ IN MEMORY_CACHING_TYPE CacheType);
NTKERNELAPI
PMDL
NTAPI
MmAllocatePagesForMdl(
- IN PHYSICAL_ADDRESS LowAddress,
- IN PHYSICAL_ADDRESS HighAddress,
- IN PHYSICAL_ADDRESS SkipBytes,
- IN SIZE_T TotalBytes);
+ IN PHYSICAL_ADDRESS LowAddress,
+ IN PHYSICAL_ADDRESS HighAddress,
+ IN PHYSICAL_ADDRESS SkipBytes,
+ IN SIZE_T TotalBytes);
NTKERNELAPI
VOID
NTAPI
MmBuildMdlForNonPagedPool(
- IN OUT PMDLX MemoryDescriptorList);
+ IN OUT PMDLX MemoryDescriptorList);
//DECLSPEC_DEPRECATED_DDK
NTKERNELAPI
PMDL
NTAPI
MmCreateMdl(
- IN PMDL MemoryDescriptorList OPTIONAL,
- IN PVOID Base,
- IN SIZE_T Length);
+ IN PMDL MemoryDescriptorList OPTIONAL,
+ IN PVOID Base,
+ IN SIZE_T Length);
NTKERNELAPI
VOID
NTAPI
MmFreeContiguousMemory(
- IN PVOID BaseAddress);
+ IN PVOID BaseAddress);
NTKERNELAPI
VOID
NTAPI
MmFreeContiguousMemorySpecifyCache(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheType);
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType);
NTKERNELAPI
VOID
@@ -10766,7 +10725,7 @@ NTKERNELAPI
PVOID
NTAPI
MmGetSystemRoutineAddress(
- IN PUNICODE_STRING SystemRoutineName);
+ IN PUNICODE_STRING SystemRoutineName);
NTKERNELAPI
LOGICAL
@@ -10778,22 +10737,22 @@ NTKERNELAPI
PVOID
NTAPI
MmLockPagableDataSection(
- IN PVOID AddressWithinSection);
+ IN PVOID AddressWithinSection);
NTKERNELAPI
PVOID
NTAPI
MmMapIoSpace(
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheEnable);
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN SIZE_T NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheEnable);
NTKERNELAPI
PVOID
NTAPI
MmMapLockedPages(
- IN PMDL MemoryDescriptorList,
- IN KPROCESSOR_MODE AccessMode);
+ IN PMDL MemoryDescriptorList,
+ IN KPROCESSOR_MODE AccessMode);
NTKERNELAPI
PVOID
@@ -10810,15 +10769,15 @@ NTKERNELAPI
PVOID
NTAPI
MmPageEntireDriver(
- IN PVOID AddressWithinSection);
+ IN PVOID AddressWithinSection);
NTKERNELAPI
VOID
NTAPI
MmProbeAndLockPages(
- IN OUT PMDL MemoryDescriptorList,
- IN KPROCESSOR_MODE AccessMode,
- IN LOCK_OPERATION Operation);
+ IN OUT PMDL MemoryDescriptorList,
+ IN KPROCESSOR_MODE AccessMode,
+ IN LOCK_OPERATION Operation);
NTKERNELAPI
MM_SYSTEMSIZE
@@ -10829,49 +10788,49 @@ NTKERNELAPI
VOID
NTAPI
MmResetDriverPaging(
- IN PVOID AddressWithinSection);
+ IN PVOID AddressWithinSection);
NTKERNELAPI
SIZE_T
NTAPI
MmSizeOfMdl(
- IN PVOID Base,
- IN SIZE_T Length);
+ IN PVOID Base,
+ IN SIZE_T Length);
NTKERNELAPI
VOID
NTAPI
MmUnlockPagableImageSection(
- IN PVOID ImageSectionHandle);
+ IN PVOID ImageSectionHandle);
NTKERNELAPI
VOID
NTAPI
MmUnlockPages(
- IN OUT PMDL MemoryDescriptorList);
+ IN OUT PMDL MemoryDescriptorList);
NTKERNELAPI
VOID
NTAPI
MmUnmapIoSpace(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes);
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes);
NTKERNELAPI
VOID
NTAPI
MmProbeAndLockProcessPages(
- IN OUT PMDL MemoryDescriptorList,
- IN PEPROCESS Process,
- IN KPROCESSOR_MODE AccessMode,
- IN LOCK_OPERATION Operation);
+ IN OUT PMDL MemoryDescriptorList,
+ IN PEPROCESS Process,
+ IN KPROCESSOR_MODE AccessMode,
+ IN LOCK_OPERATION Operation);
NTKERNELAPI
VOID
NTAPI
MmUnmapLockedPages(
- IN PVOID BaseAddress,
- IN PMDL MemoryDescriptorList);
+ IN PVOID BaseAddress,
+ IN PMDL MemoryDescriptorList);
NTKERNELAPI
PVOID
@@ -10892,52 +10851,52 @@ NTKERNELAPI
NTSTATUS
NTAPI
MmAdvanceMdl(
- IN OUT PMDL Mdl,
- IN ULONG NumberOfBytes);
+ IN OUT PMDL Mdl,
+ IN ULONG NumberOfBytes);
NTKERNELAPI
PVOID
NTAPI
MmAllocateMappingAddress(
- IN SIZE_T NumberOfBytes,
- IN ULONG PoolTag);
+ IN SIZE_T NumberOfBytes,
+ IN ULONG PoolTag);
NTKERNELAPI
VOID
NTAPI
MmFreeMappingAddress(
- IN PVOID BaseAddress,
- IN ULONG PoolTag);
+ IN PVOID BaseAddress,
+ IN ULONG PoolTag);
NTKERNELAPI
NTSTATUS
NTAPI
MmIsVerifierEnabled(
- OUT PULONG VerifierFlags);
+ OUT PULONG VerifierFlags);
NTKERNELAPI
PVOID
NTAPI
MmMapLockedPagesWithReservedMapping(
- IN PVOID MappingAddress,
- IN ULONG PoolTag,
- IN PMDL MemoryDescriptorList,
- IN MEMORY_CACHING_TYPE CacheType);
+ IN PVOID MappingAddress,
+ IN ULONG PoolTag,
+ IN PMDL MemoryDescriptorList,
+ IN MEMORY_CACHING_TYPE CacheType);
NTKERNELAPI
NTSTATUS
NTAPI
MmProtectMdlSystemAddress(
- IN PMDL MemoryDescriptorList,
- IN ULONG NewProtect);
+ IN PMDL MemoryDescriptorList,
+ IN ULONG NewProtect);
NTKERNELAPI
VOID
NTAPI
MmUnmapReservedMapping(
- IN PVOID BaseAddress,
- IN ULONG PoolTag,
- IN PMDL MemoryDescriptorList);
+ IN PVOID BaseAddress,
+ IN ULONG PoolTag,
+ IN PMDL MemoryDescriptorList);
NTKERNELAPI
NTSTATUS
@@ -10947,7 +10906,6 @@ MmAddVerifierThunks(
IN ULONG ThunkBufferSize);
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
-
#if (NTDDI_VERSION >= NTDDI_WS03)
NTKERNELAPI
LOGICAL
@@ -10955,8 +10913,8 @@ NTAPI
MmIsIoSpaceActive(
IN PHYSICAL_ADDRESS StartAddress,
IN SIZE_T NumberOfBytes);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
NTKERNELAPI
PMDL
@@ -10971,60 +10929,58 @@ MmAllocatePagesForMdlEx(
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
NTKERNELAPI
LOGICAL
NTAPI
MmIsDriverVerifyingByAddress(
IN PVOID AddressWithinSection);
-#endif
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
/******************************************************************************
* Security Manager Functions *
******************************************************************************/
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
NTKERNELAPI
BOOLEAN
NTAPI
SeAccessCheck(
- IN PSECURITY_DESCRIPTOR SecurityDescriptor,
- IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
- IN BOOLEAN SubjectContextLocked,
- IN ACCESS_MASK DesiredAccess,
- IN ACCESS_MASK PreviouslyGrantedAccess,
- OUT PPRIVILEGE_SET *Privileges OPTIONAL,
- IN PGENERIC_MAPPING GenericMapping,
- IN KPROCESSOR_MODE AccessMode,
- OUT PACCESS_MASK GrantedAccess,
- OUT PNTSTATUS AccessStatus);
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext,
+ IN BOOLEAN SubjectContextLocked,
+ IN ACCESS_MASK DesiredAccess,
+ IN ACCESS_MASK PreviouslyGrantedAccess,
+ OUT PPRIVILEGE_SET *Privileges OPTIONAL,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN KPROCESSOR_MODE AccessMode,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PNTSTATUS AccessStatus);
NTKERNELAPI
NTSTATUS
NTAPI
SeAssignSecurity(
- IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
- IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
- OUT PSECURITY_DESCRIPTOR *NewDescriptor,
- IN BOOLEAN IsDirectoryObject,
- IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
- IN PGENERIC_MAPPING GenericMapping,
- IN POOL_TYPE PoolType);
+ IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
+ IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
+ OUT PSECURITY_DESCRIPTOR *NewDescriptor,
+ IN BOOLEAN IsDirectoryObject,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN POOL_TYPE PoolType);
NTKERNELAPI
NTSTATUS
NTAPI
SeAssignSecurityEx(
- IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
- IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
- OUT PSECURITY_DESCRIPTOR *NewDescriptor,
- IN GUID *ObjectType OPTIONAL,
- IN BOOLEAN IsDirectoryObject,
- IN ULONG AutoInheritFlags,
- IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
- IN PGENERIC_MAPPING GenericMapping,
- IN POOL_TYPE PoolType);
+ IN PSECURITY_DESCRIPTOR ParentDescriptor OPTIONAL,
+ IN PSECURITY_DESCRIPTOR ExplicitDescriptor OPTIONAL,
+ OUT PSECURITY_DESCRIPTOR *NewDescriptor,
+ IN GUID *ObjectType OPTIONAL,
+ IN BOOLEAN IsDirectoryObject,
+ IN ULONG AutoInheritFlags,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN POOL_TYPE PoolType);
NTKERNELAPI
NTSTATUS
@@ -11069,6 +11025,7 @@ NTAPI
SeLockSubjectContext(
IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
@@ -11092,7 +11049,6 @@ SeReportSecurityEvent(
#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
NTKERNELAPI
ULONG
NTAPI
@@ -11109,7 +11065,6 @@ SeGetWorldRights(
IN PGENERIC_MAPPING GenericMapping,
OUT PACCESS_MASK GrantedAccess);
#endif /* SE_NTFS_WORLD_CACHE */
-
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
/******************************************************************************
* Configuration Manager Functions *
@@ -11120,15 +11075,15 @@ NTKERNELAPI
NTSTATUS
NTAPI
CmRegisterCallback(
- IN PEX_CALLBACK_FUNCTION Function,
- IN PVOID Context OPTIONAL,
- OUT PLARGE_INTEGER Cookie);
+ IN PEX_CALLBACK_FUNCTION Function,
+ IN PVOID Context OPTIONAL,
+ OUT PLARGE_INTEGER Cookie);
NTKERNELAPI
NTSTATUS
NTAPI
CmUnRegisterCallback(
- IN LARGE_INTEGER Cookie);
+ IN LARGE_INTEGER Cookie);
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
@@ -11183,7 +11138,6 @@ CmGetBoundTransaction(
* I/O Manager Functions *
******************************************************************************/
-
/*
* NTSTATUS
* IoAcquireRemoveLock(
@@ -11359,9 +11313,9 @@ NTKERNELAPI
VOID
NTAPI
WRITE_REGISTER_BUFFER_ULONG(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count);
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count);
NTKERNELAPI
VOID
@@ -11389,8 +11343,8 @@ NTKERNELAPI
VOID
NTAPI
WRITE_REGISTER_USHORT(
- IN PUSHORT Register,
- IN USHORT Value);
+ IN PUSHORT Register,
+ IN USHORT Value);
#else
@@ -11401,17 +11355,17 @@ READ_PORT_BUFFER_UCHAR(
IN PUCHAR Buffer,
IN ULONG Count)
{
- __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+ __inbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
}
FORCEINLINE
VOID
READ_PORT_BUFFER_ULONG(
- IN PULONG Port,
- IN PULONG Buffer,
- IN ULONG Count)
+ IN PULONG Port,
+ IN PULONG Buffer,
+ IN ULONG Count)
{
- __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+ __indwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
}
FORCEINLINE
@@ -11421,7 +11375,7 @@ READ_PORT_BUFFER_USHORT(
IN PUSHORT Buffer,
IN ULONG Count)
{
- __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+ __inwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
}
FORCEINLINE
@@ -11429,7 +11383,7 @@ UCHAR
READ_PORT_UCHAR(
IN PUCHAR Port)
{
- return __inbyte((USHORT)(ULONG_PTR)Port);
+ return __inbyte((USHORT)(ULONG_PTR)Port);
}
FORCEINLINE
@@ -11437,7 +11391,7 @@ ULONG
READ_PORT_ULONG(
IN PULONG Port)
{
- return __indword((USHORT)(ULONG_PTR)Port);
+ return __indword((USHORT)(ULONG_PTR)Port);
}
FORCEINLINE
@@ -11445,7 +11399,7 @@ USHORT
READ_PORT_USHORT(
IN PUSHORT Port)
{
- return __inword((USHORT)(ULONG_PTR)Port);
+ return __inword((USHORT)(ULONG_PTR)Port);
}
FORCEINLINE
@@ -11455,27 +11409,27 @@ READ_REGISTER_BUFFER_UCHAR(
IN PUCHAR Buffer,
IN ULONG Count)
{
- __movsb(Register, Buffer, Count);
+ __movsb(Register, Buffer, Count);
}
FORCEINLINE
VOID
READ_REGISTER_BUFFER_ULONG(
- IN PULONG Register,
- IN PULONG Buffer,
- IN ULONG Count)
+ IN PULONG Register,
+ IN PULONG Buffer,
+ IN ULONG Count)
{
- __movsd(Register, Buffer, Count);
+ __movsd(Register, Buffer, Count);
}
FORCEINLINE
VOID
READ_REGISTER_BUFFER_USHORT(
- IN PUSHORT Register,
- IN PUSHORT Buffer,
- IN ULONG Count)
+ IN PUSHORT Register,
+ IN PUSHORT Buffer,
+ IN ULONG Count)
{
- __movsw(Register, Buffer, Count);
+ __movsw(Register, Buffer, Count);
}
FORCEINLINE
@@ -11483,7 +11437,7 @@ UCHAR
READ_REGISTER_UCHAR(
IN volatile UCHAR *Register)
{
- return *Register;
+ return *Register;
}
FORCEINLINE
@@ -11491,7 +11445,7 @@ ULONG
READ_REGISTER_ULONG(
IN volatile ULONG *Register)
{
- return *Register;
+ return *Register;
}
FORCEINLINE
@@ -11499,7 +11453,7 @@ USHORT
READ_REGISTER_USHORT(
IN volatile USHORT *Register)
{
- return *Register;
+ return *Register;
}
FORCEINLINE
@@ -11509,7 +11463,7 @@ WRITE_PORT_BUFFER_UCHAR(
IN PUCHAR Buffer,
IN ULONG Count)
{
- __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+ __outbytestring((USHORT)(ULONG_PTR)Port, Buffer, Count);
}
FORCEINLINE
@@ -11519,7 +11473,7 @@ WRITE_PORT_BUFFER_ULONG(
IN PULONG Buffer,
IN ULONG Count)
{
- __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+ __outdwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
}
FORCEINLINE
@@ -11529,7 +11483,7 @@ WRITE_PORT_BUFFER_USHORT(
IN PUSHORT Buffer,
IN ULONG Count)
{
- __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
+ __outwordstring((USHORT)(ULONG_PTR)Port, Buffer, Count);
}
FORCEINLINE
@@ -11538,7 +11492,7 @@ WRITE_PORT_UCHAR(
IN PUCHAR Port,
IN UCHAR Value)
{
- __outbyte((USHORT)(ULONG_PTR)Port, Value);
+ __outbyte((USHORT)(ULONG_PTR)Port, Value);
}
FORCEINLINE
@@ -11547,7 +11501,7 @@ WRITE_PORT_ULONG(
IN PULONG Port,
IN ULONG Value)
{
- __outdword((USHORT)(ULONG_PTR)Port, Value);
+ __outdword((USHORT)(ULONG_PTR)Port, Value);
}
FORCEINLINE
@@ -11556,7 +11510,7 @@ WRITE_PORT_USHORT(
IN PUSHORT Port,
IN USHORT Value)
{
- __outword((USHORT)(ULONG_PTR)Port, Value);
+ __outword((USHORT)(ULONG_PTR)Port, Value);
}
FORCEINLINE
@@ -11566,9 +11520,9 @@ WRITE_REGISTER_BUFFER_UCHAR(
IN PUCHAR Buffer,
IN ULONG Count)
{
- LONG Synch;
- __movsb(Register, Buffer, Count);
- InterlockedOr(&Synch, 1);
+ LONG Synch;
+ __movsb(Register, Buffer, Count);
+ InterlockedOr(&Synch, 1);
}
FORCEINLINE
@@ -11578,9 +11532,9 @@ WRITE_REGISTER_BUFFER_ULONG(
IN PULONG Buffer,
IN ULONG Count)
{
- LONG Synch;
- __movsd(Register, Buffer, Count);
- InterlockedOr(&Synch, 1);
+ LONG Synch;
+ __movsd(Register, Buffer, Count);
+ InterlockedOr(&Synch, 1);
}
FORCEINLINE
@@ -11590,9 +11544,9 @@ WRITE_REGISTER_BUFFER_USHORT(
IN PUSHORT Buffer,
IN ULONG Count)
{
- LONG Synch;
- __movsw(Register, Buffer, Count);
- InterlockedOr(&Synch, 1);
+ LONG Synch;
+ __movsw(Register, Buffer, Count);
+ InterlockedOr(&Synch, 1);
}
FORCEINLINE
@@ -11601,9 +11555,9 @@ WRITE_REGISTER_UCHAR(
IN volatile UCHAR *Register,
IN UCHAR Value)
{
- LONG Synch;
- *Register = Value;
- InterlockedOr(&Synch, 1);
+ LONG Synch;
+ *Register = Value;
+ InterlockedOr(&Synch, 1);
}
FORCEINLINE
@@ -11612,9 +11566,9 @@ WRITE_REGISTER_ULONG(
IN volatile ULONG *Register,
IN ULONG Value)
{
- LONG Synch;
- *Register = Value;
- InterlockedOr(&Synch, 1);
+ LONG Synch;
+ *Register = Value;
+ InterlockedOr(&Synch, 1);
}
FORCEINLINE
@@ -11623,9 +11577,9 @@ WRITE_REGISTER_USHORT(
IN volatile USHORT *Register,
IN USHORT Value)
{
- LONG Sync;
- *Register = Value;
- InterlockedOr(&Sync, 1);
+ LONG Sync;
+ *Register = Value;
+ InterlockedOr(&Sync, 1);
}
#endif
@@ -11637,92 +11591,92 @@ WRITE_REGISTER_USHORT(
FORCEINLINE
NTSTATUS
IoAllocateAdapterChannel(
- IN PDMA_ADAPTER DmaAdapter,
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG NumberOfMapRegisters,
- IN PDRIVER_CONTROL ExecutionRoutine,
- IN PVOID Context)
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG NumberOfMapRegisters,
+ IN PDRIVER_CONTROL ExecutionRoutine,
+ IN PVOID Context)
{
- PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
- AllocateAdapterChannel =
- *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
- ASSERT(AllocateAdapterChannel);
- return AllocateAdapterChannel(DmaAdapter,
- DeviceObject,
- NumberOfMapRegisters,
- ExecutionRoutine,
- Context );
+ PALLOCATE_ADAPTER_CHANNEL AllocateAdapterChannel;
+ AllocateAdapterChannel =
+ *(DmaAdapter)->DmaOperations->AllocateAdapterChannel;
+ ASSERT(AllocateAdapterChannel);
+ return AllocateAdapterChannel(DmaAdapter,
+ DeviceObject,
+ NumberOfMapRegisters,
+ ExecutionRoutine,
+ Context );
}
FORCEINLINE
BOOLEAN
NTAPI
IoFlushAdapterBuffers(
- IN PDMA_ADAPTER DmaAdapter,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN ULONG Length,
- IN BOOLEAN WriteToDevice)
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN ULONG Length,
+ IN BOOLEAN WriteToDevice)
{
- PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
- FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
- ASSERT(FlushAdapterBuffers);
- return FlushAdapterBuffers(DmaAdapter,
- Mdl,
- MapRegisterBase,
- CurrentVa,
- Length,
- WriteToDevice);
+ PFLUSH_ADAPTER_BUFFERS FlushAdapterBuffers;
+ FlushAdapterBuffers = *(DmaAdapter)->DmaOperations->FlushAdapterBuffers;
+ ASSERT(FlushAdapterBuffers);
+ return FlushAdapterBuffers(DmaAdapter,
+ Mdl,
+ MapRegisterBase,
+ CurrentVa,
+ Length,
+ WriteToDevice);
}
FORCEINLINE
VOID
NTAPI
IoFreeAdapterChannel(
- IN PDMA_ADAPTER DmaAdapter)
+ IN PDMA_ADAPTER DmaAdapter)
{
- PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
- FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
- ASSERT(FreeAdapterChannel);
- FreeAdapterChannel(DmaAdapter);
+ PFREE_ADAPTER_CHANNEL FreeAdapterChannel;
+ FreeAdapterChannel = *(DmaAdapter)->DmaOperations->FreeAdapterChannel;
+ ASSERT(FreeAdapterChannel);
+ FreeAdapterChannel(DmaAdapter);
}
FORCEINLINE
VOID
NTAPI
IoFreeMapRegisters(
- IN PDMA_ADAPTER DmaAdapter,
- IN PVOID MapRegisterBase,
- IN ULONG NumberOfMapRegisters)
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PVOID MapRegisterBase,
+ IN ULONG NumberOfMapRegisters)
{
- PFREE_MAP_REGISTERS FreeMapRegisters;
- FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
- ASSERT(FreeMapRegisters);
- FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
+ PFREE_MAP_REGISTERS FreeMapRegisters;
+ FreeMapRegisters = *(DmaAdapter)->DmaOperations->FreeMapRegisters;
+ ASSERT(FreeMapRegisters);
+ FreeMapRegisters(DmaAdapter, MapRegisterBase, NumberOfMapRegisters);
}
FORCEINLINE
PHYSICAL_ADDRESS
NTAPI
IoMapTransfer(
- IN PDMA_ADAPTER DmaAdapter,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN OUT PULONG Length,
- IN BOOLEAN WriteToDevice)
+ IN PDMA_ADAPTER DmaAdapter,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN OUT PULONG Length,
+ IN BOOLEAN WriteToDevice)
{
- PMAP_TRANSFER MapTransfer;
+ PMAP_TRANSFER MapTransfer;
- MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
- ASSERT(MapTransfer);
- return MapTransfer(DmaAdapter,
- Mdl,
- MapRegisterBase,
- CurrentVa,
- Length,
- WriteToDevice);
+ MapTransfer = *(DmaAdapter)->DmaOperations->MapTransfer;
+ ASSERT(MapTransfer);
+ return MapTransfer(DmaAdapter,
+ Mdl,
+ MapRegisterBase,
+ CurrentVa,
+ Length,
+ WriteToDevice);
}
#endif
@@ -11732,123 +11686,123 @@ NTKERNELAPI
VOID
NTAPI
IoAcquireCancelSpinLock(
- OUT PKIRQL Irql);
+ OUT PKIRQL Irql);
NTKERNELAPI
NTSTATUS
NTAPI
IoAcquireRemoveLockEx(
- IN PIO_REMOVE_LOCK RemoveLock,
- IN PVOID Tag OPTIONAL,
- IN PCSTR File,
- IN ULONG Line,
- IN ULONG RemlockSize);
+ IN PIO_REMOVE_LOCK RemoveLock,
+ IN PVOID Tag OPTIONAL,
+ IN PCSTR File,
+ IN ULONG Line,
+ IN ULONG RemlockSize);
NTKERNELAPI
NTSTATUS
NTAPI
IoAllocateDriverObjectExtension(
- IN PDRIVER_OBJECT DriverObject,
- IN PVOID ClientIdentificationAddress,
- IN ULONG DriverObjectExtensionSize,
- OUT PVOID *DriverObjectExtension);
+ IN PDRIVER_OBJECT DriverObject,
+ IN PVOID ClientIdentificationAddress,
+ IN ULONG DriverObjectExtensionSize,
+ OUT PVOID *DriverObjectExtension);
NTKERNELAPI
PVOID
NTAPI
IoAllocateErrorLogEntry(
- IN PVOID IoObject,
- IN UCHAR EntrySize);
+ IN PVOID IoObject,
+ IN UCHAR EntrySize);
NTKERNELAPI
PIRP
NTAPI
IoAllocateIrp(
- IN CCHAR StackSize,
- IN BOOLEAN ChargeQuota);
+ IN CCHAR StackSize,
+ IN BOOLEAN ChargeQuota);
NTKERNELAPI
PMDL
NTAPI
IoAllocateMdl(
- IN PVOID VirtualAddress OPTIONAL,
- IN ULONG Length,
- IN BOOLEAN SecondaryBuffer,
- IN BOOLEAN ChargeQuota,
- IN OUT PIRP Irp OPTIONAL);
+ IN PVOID VirtualAddress OPTIONAL,
+ IN ULONG Length,
+ IN BOOLEAN SecondaryBuffer,
+ IN BOOLEAN ChargeQuota,
+ IN OUT PIRP Irp OPTIONAL);
NTKERNELAPI
PIO_WORKITEM
NTAPI
IoAllocateWorkItem(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
NTSTATUS
NTAPI
IoAttachDevice(
- IN PDEVICE_OBJECT SourceDevice,
- IN PUNICODE_STRING TargetDevice,
- OUT PDEVICE_OBJECT *AttachedDevice);
+ IN PDEVICE_OBJECT SourceDevice,
+ IN PUNICODE_STRING TargetDevice,
+ OUT PDEVICE_OBJECT *AttachedDevice);
NTKERNELAPI
PDEVICE_OBJECT
NTAPI
IoAttachDeviceToDeviceStack(
- IN PDEVICE_OBJECT SourceDevice,
- IN PDEVICE_OBJECT TargetDevice);
+ IN PDEVICE_OBJECT SourceDevice,
+ IN PDEVICE_OBJECT TargetDevice);
NTKERNELAPI
PIRP
NTAPI
IoBuildAsynchronousFsdRequest(
- IN ULONG MajorFunction,
- IN PDEVICE_OBJECT DeviceObject,
- IN OUT PVOID Buffer OPTIONAL,
- IN ULONG Length OPTIONAL,
- IN PLARGE_INTEGER StartingOffset OPTIONAL,
- IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
+ IN ULONG MajorFunction,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PVOID Buffer OPTIONAL,
+ IN ULONG Length OPTIONAL,
+ IN PLARGE_INTEGER StartingOffset OPTIONAL,
+ IN PIO_STATUS_BLOCK IoStatusBlock OPTIONAL);
NTKERNELAPI
PIRP
NTAPI
IoBuildDeviceIoControlRequest(
- IN ULONG IoControlCode,
- IN PDEVICE_OBJECT DeviceObject,
- IN PVOID InputBuffer OPTIONAL,
- IN ULONG InputBufferLength,
- OUT PVOID OutputBuffer OPTIONAL,
- IN ULONG OutputBufferLength,
- IN BOOLEAN InternalDeviceIoControl,
- IN PKEVENT Event,
- OUT PIO_STATUS_BLOCK IoStatusBlock);
+ IN ULONG IoControlCode,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength,
+ IN BOOLEAN InternalDeviceIoControl,
+ IN PKEVENT Event,
+ OUT PIO_STATUS_BLOCK IoStatusBlock);
NTKERNELAPI
VOID
NTAPI
IoBuildPartialMdl(
- IN PMDL SourceMdl,
- IN OUT PMDL TargetMdl,
- IN PVOID VirtualAddress,
- IN ULONG Length);
+ IN PMDL SourceMdl,
+ IN OUT PMDL TargetMdl,
+ IN PVOID VirtualAddress,
+ IN ULONG Length);
NTKERNELAPI
PIRP
NTAPI
IoBuildSynchronousFsdRequest(
- IN ULONG MajorFunction,
- IN PDEVICE_OBJECT DeviceObject,
- IN OUT PVOID Buffer OPTIONAL,
- IN ULONG Length OPTIONAL,
- IN PLARGE_INTEGER StartingOffset OPTIONAL,
- IN PKEVENT Event,
- OUT PIO_STATUS_BLOCK IoStatusBlock);
+ IN ULONG MajorFunction,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PVOID Buffer OPTIONAL,
+ IN ULONG Length OPTIONAL,
+ IN PLARGE_INTEGER StartingOffset OPTIONAL,
+ IN PKEVENT Event,
+ OUT PIO_STATUS_BLOCK IoStatusBlock);
NTKERNELAPI
NTSTATUS
FASTCALL
IofCallDriver(
- IN PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PIRP Irp);
#define IoCallDriver IofCallDriver
NTKERNELAPI
@@ -11863,52 +11817,52 @@ NTKERNELAPI
BOOLEAN
NTAPI
IoCancelIrp(
- IN PIRP Irp);
+ IN PIRP Irp);
NTKERNELAPI
NTSTATUS
NTAPI
IoCheckShareAccess(
- IN ACCESS_MASK DesiredAccess,
- IN ULONG DesiredShareAccess,
- IN OUT PFILE_OBJECT FileObject,
- IN OUT PSHARE_ACCESS ShareAccess,
- IN BOOLEAN Update);
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG DesiredShareAccess,
+ IN OUT PFILE_OBJECT FileObject,
+ IN OUT PSHARE_ACCESS ShareAccess,
+ IN BOOLEAN Update);
NTKERNELAPI
VOID
FASTCALL
IofCompleteRequest(
- IN PIRP Irp,
- IN CCHAR PriorityBoost);
+ IN PIRP Irp,
+ IN CCHAR PriorityBoost);
NTKERNELAPI
NTSTATUS
NTAPI
IoConnectInterrupt(
- OUT PKINTERRUPT *InterruptObject,
- IN PKSERVICE_ROUTINE ServiceRoutine,
- IN PVOID ServiceContext OPTIONAL,
- IN PKSPIN_LOCK SpinLock OPTIONAL,
- IN ULONG Vector,
- IN KIRQL Irql,
- IN KIRQL SynchronizeIrql,
- IN KINTERRUPT_MODE InterruptMode,
- IN BOOLEAN ShareVector,
- IN KAFFINITY ProcessorEnableMask,
- IN BOOLEAN FloatingSave);
+ OUT PKINTERRUPT *InterruptObject,
+ IN PKSERVICE_ROUTINE ServiceRoutine,
+ IN PVOID ServiceContext OPTIONAL,
+ IN PKSPIN_LOCK SpinLock OPTIONAL,
+ IN ULONG Vector,
+ IN KIRQL Irql,
+ IN KIRQL SynchronizeIrql,
+ IN KINTERRUPT_MODE InterruptMode,
+ IN BOOLEAN ShareVector,
+ IN KAFFINITY ProcessorEnableMask,
+ IN BOOLEAN FloatingSave);
NTKERNELAPI
NTSTATUS
NTAPI
IoCreateDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN ULONG DeviceExtensionSize,
- IN PUNICODE_STRING DeviceName OPTIONAL,
- IN DEVICE_TYPE DeviceType,
- IN ULONG DeviceCharacteristics,
- IN BOOLEAN Exclusive,
- OUT PDEVICE_OBJECT *DeviceObject);
+ IN PDRIVER_OBJECT DriverObject,
+ IN ULONG DeviceExtensionSize,
+ IN PUNICODE_STRING DeviceName OPTIONAL,
+ IN DEVICE_TYPE DeviceType,
+ IN ULONG DeviceCharacteristics,
+ IN BOOLEAN Exclusive,
+ OUT PDEVICE_OBJECT *DeviceObject);
NTKERNELAPI
NTSTATUS
@@ -11933,53 +11887,53 @@ NTKERNELAPI
PKEVENT
NTAPI
IoCreateNotificationEvent(
- IN PUNICODE_STRING EventName,
- OUT PHANDLE EventHandle);
+ IN PUNICODE_STRING EventName,
+ OUT PHANDLE EventHandle);
NTKERNELAPI
NTSTATUS
NTAPI
IoCreateSymbolicLink(
- IN PUNICODE_STRING SymbolicLinkName,
- IN PUNICODE_STRING DeviceName);
+ IN PUNICODE_STRING SymbolicLinkName,
+ IN PUNICODE_STRING DeviceName);
NTKERNELAPI
PKEVENT
NTAPI
IoCreateSynchronizationEvent(
- IN PUNICODE_STRING EventName,
- OUT PHANDLE EventHandle);
+ IN PUNICODE_STRING EventName,
+ OUT PHANDLE EventHandle);
NTKERNELAPI
NTSTATUS
NTAPI
IoCreateUnprotectedSymbolicLink(
- IN PUNICODE_STRING SymbolicLinkName,
- IN PUNICODE_STRING DeviceName);
+ IN PUNICODE_STRING SymbolicLinkName,
+ IN PUNICODE_STRING DeviceName);
NTKERNELAPI
VOID
NTAPI
IoDeleteDevice(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
NTSTATUS
NTAPI
IoDeleteSymbolicLink(
- IN PUNICODE_STRING SymbolicLinkName);
+ IN PUNICODE_STRING SymbolicLinkName);
NTKERNELAPI
VOID
NTAPI
IoDetachDevice(
- IN OUT PDEVICE_OBJECT TargetDevice);
+ IN OUT PDEVICE_OBJECT TargetDevice);
NTKERNELAPI
VOID
NTAPI
IoDisconnectInterrupt(
- IN PKINTERRUPT InterruptObject);
+ IN PKINTERRUPT InterruptObject);
NTKERNELAPI
VOID
@@ -12009,22 +11963,22 @@ NTKERNELAPI
PDEVICE_OBJECT
NTAPI
IoGetAttachedDeviceReference(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
NTSTATUS
NTAPI
IoGetBootDiskInformation(
- IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
- IN ULONG Size);
+ IN OUT PBOOTDISK_INFORMATION BootDiskInformation,
+ IN ULONG Size);
NTKERNELAPI
NTSTATUS
NTAPI
IoGetDeviceInterfaceAlias(
- IN PUNICODE_STRING SymbolicLinkName,
- IN CONST GUID *AliasInterfaceClassGuid,
- OUT PUNICODE_STRING AliasSymbolicLinkName);
+ IN PUNICODE_STRING SymbolicLinkName,
+ IN CONST GUID *AliasInterfaceClassGuid,
+ OUT PUNICODE_STRING AliasSymbolicLinkName);
NTKERNELAPI
PEPROCESS
@@ -12035,44 +11989,44 @@ NTKERNELAPI
NTSTATUS
NTAPI
IoGetDeviceInterfaces(
- IN CONST GUID *InterfaceClassGuid,
- IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
- IN ULONG Flags,
- OUT PWSTR *SymbolicLinkList);
+ IN CONST GUID *InterfaceClassGuid,
+ IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
+ IN ULONG Flags,
+ OUT PWSTR *SymbolicLinkList);
NTKERNELAPI
NTSTATUS
NTAPI
IoGetDeviceObjectPointer(
- IN PUNICODE_STRING ObjectName,
- IN ACCESS_MASK DesiredAccess,
- OUT PFILE_OBJECT *FileObject,
- OUT PDEVICE_OBJECT *DeviceObject);
+ IN PUNICODE_STRING ObjectName,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PFILE_OBJECT *FileObject,
+ OUT PDEVICE_OBJECT *DeviceObject);
NTKERNELAPI
NTSTATUS
NTAPI
IoGetDeviceProperty(
- IN PDEVICE_OBJECT DeviceObject,
- IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
- IN ULONG BufferLength,
- OUT PVOID PropertyBuffer,
- OUT PULONG ResultLength);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
+ IN ULONG BufferLength,
+ OUT PVOID PropertyBuffer,
+ OUT PULONG ResultLength);
NTKERNELAPI
PDMA_ADAPTER
NTAPI
IoGetDmaAdapter(
- IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
- IN PDEVICE_DESCRIPTION DeviceDescription,
- IN OUT PULONG NumberOfMapRegisters);
+ IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
+ IN PDEVICE_DESCRIPTION DeviceDescription,
+ IN OUT PULONG NumberOfMapRegisters);
NTKERNELAPI
PVOID
NTAPI
IoGetDriverObjectExtension(
- IN PDRIVER_OBJECT DriverObject,
- IN PVOID ClientIdentificationAddress);
+ IN PDRIVER_OBJECT DriverObject,
+ IN PVOID ClientIdentificationAddress);
NTKERNELAPI
PVOID
@@ -12083,269 +12037,269 @@ NTKERNELAPI
PDEVICE_OBJECT
NTAPI
IoGetRelatedDeviceObject(
- IN PFILE_OBJECT FileObject);
+ IN PFILE_OBJECT FileObject);
NTKERNELAPI
VOID
NTAPI
IoQueueWorkItem(
- IN PIO_WORKITEM IoWorkItem,
- IN PIO_WORKITEM_ROUTINE WorkerRoutine,
- IN WORK_QUEUE_TYPE QueueType,
- IN PVOID Context OPTIONAL);
+ IN PIO_WORKITEM IoWorkItem,
+ IN PIO_WORKITEM_ROUTINE WorkerRoutine,
+ IN WORK_QUEUE_TYPE QueueType,
+ IN PVOID Context OPTIONAL);
NTKERNELAPI
VOID
NTAPI
IoInitializeIrp(
- IN OUT PIRP Irp,
- IN USHORT PacketSize,
- IN CCHAR StackSize);
+ IN OUT PIRP Irp,
+ IN USHORT PacketSize,
+ IN CCHAR StackSize);
NTKERNELAPI
VOID
NTAPI
IoInitializeRemoveLockEx(
- IN PIO_REMOVE_LOCK Lock,
- IN ULONG AllocateTag,
- IN ULONG MaxLockedMinutes,
- IN ULONG HighWatermark,
- IN ULONG RemlockSize);
+ IN PIO_REMOVE_LOCK Lock,
+ IN ULONG AllocateTag,
+ IN ULONG MaxLockedMinutes,
+ IN ULONG HighWatermark,
+ IN ULONG RemlockSize);
NTKERNELAPI
NTSTATUS
NTAPI
IoInitializeTimer(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIO_TIMER_ROUTINE TimerRoutine,
- IN PVOID Context OPTIONAL);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIO_TIMER_ROUTINE TimerRoutine,
+ IN PVOID Context OPTIONAL);
NTKERNELAPI
VOID
NTAPI
IoInvalidateDeviceRelations(
- IN PDEVICE_OBJECT DeviceObject,
- IN DEVICE_RELATION_TYPE Type);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN DEVICE_RELATION_TYPE Type);
NTKERNELAPI
VOID
NTAPI
IoInvalidateDeviceState(
- IN PDEVICE_OBJECT PhysicalDeviceObject);
+ IN PDEVICE_OBJECT PhysicalDeviceObject);
NTKERNELAPI
BOOLEAN
NTAPI
IoIsWdmVersionAvailable(
- IN UCHAR MajorVersion,
- IN UCHAR MinorVersion);
+ IN UCHAR MajorVersion,
+ IN UCHAR MinorVersion);
NTKERNELAPI
NTSTATUS
NTAPI
IoOpenDeviceInterfaceRegistryKey(
- IN PUNICODE_STRING SymbolicLinkName,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE DeviceInterfaceKey);
+ IN PUNICODE_STRING SymbolicLinkName,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE DeviceInterfaceKey);
NTKERNELAPI
NTSTATUS
NTAPI
IoOpenDeviceRegistryKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG DevInstKeyType,
- IN ACCESS_MASK DesiredAccess,
- OUT PHANDLE DevInstRegKey);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG DevInstKeyType,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE DevInstRegKey);
NTKERNELAPI
NTSTATUS
NTAPI
IoRegisterDeviceInterface(
- IN PDEVICE_OBJECT PhysicalDeviceObject,
- IN CONST GUID *InterfaceClassGuid,
- IN PUNICODE_STRING ReferenceString OPTIONAL,
- OUT PUNICODE_STRING SymbolicLinkName);
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN CONST GUID *InterfaceClassGuid,
+ IN PUNICODE_STRING ReferenceString OPTIONAL,
+ OUT PUNICODE_STRING SymbolicLinkName);
NTKERNELAPI
NTSTATUS
NTAPI
IoRegisterPlugPlayNotification(
- IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
- IN ULONG EventCategoryFlags,
- IN PVOID EventCategoryData OPTIONAL,
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
- IN OUT PVOID Context OPTIONAL,
- OUT PVOID *NotificationEntry);
+ IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
+ IN ULONG EventCategoryFlags,
+ IN PVOID EventCategoryData OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
+ IN OUT PVOID Context OPTIONAL,
+ OUT PVOID *NotificationEntry);
NTKERNELAPI
NTSTATUS
NTAPI
IoRegisterShutdownNotification(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
VOID
NTAPI
IoReleaseCancelSpinLock(
- IN KIRQL Irql);
+ IN KIRQL Irql);
NTKERNELAPI
VOID
NTAPI
IoReleaseRemoveLockAndWaitEx(
- IN PIO_REMOVE_LOCK RemoveLock,
- IN PVOID Tag OPTIONAL,
- IN ULONG RemlockSize);
+ IN PIO_REMOVE_LOCK RemoveLock,
+ IN PVOID Tag OPTIONAL,
+ IN ULONG RemlockSize);
NTKERNELAPI
VOID
NTAPI
IoReleaseRemoveLockEx(
- IN PIO_REMOVE_LOCK RemoveLock,
- IN PVOID Tag OPTIONAL,
- IN ULONG RemlockSize);
+ IN PIO_REMOVE_LOCK RemoveLock,
+ IN PVOID Tag OPTIONAL,
+ IN ULONG RemlockSize);
NTKERNELAPI
VOID
NTAPI
IoRemoveShareAccess(
- IN PFILE_OBJECT FileObject,
- IN OUT PSHARE_ACCESS ShareAccess);
+ IN PFILE_OBJECT FileObject,
+ IN OUT PSHARE_ACCESS ShareAccess);
NTKERNELAPI
NTSTATUS
NTAPI
IoReportTargetDeviceChange(
- IN PDEVICE_OBJECT PhysicalDeviceObject,
- IN PVOID NotificationStructure);
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PVOID NotificationStructure);
NTKERNELAPI
NTSTATUS
NTAPI
IoReportTargetDeviceChangeAsynchronous(
- IN PDEVICE_OBJECT PhysicalDeviceObject,
- IN PVOID NotificationStructure,
- IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
- IN PVOID Context OPTIONAL);
+ IN PDEVICE_OBJECT PhysicalDeviceObject,
+ IN PVOID NotificationStructure,
+ IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
+ IN PVOID Context OPTIONAL);
NTKERNELAPI
VOID
NTAPI
IoRequestDeviceEject(
- IN PDEVICE_OBJECT PhysicalDeviceObject);
+ IN PDEVICE_OBJECT PhysicalDeviceObject);
NTKERNELAPI
VOID
NTAPI
IoReuseIrp(
- IN OUT PIRP Irp,
- IN NTSTATUS Status);
+ IN OUT PIRP Irp,
+ IN NTSTATUS Status);
NTKERNELAPI
NTSTATUS
NTAPI
IoSetDeviceInterfaceState(
- IN PUNICODE_STRING SymbolicLinkName,
- IN BOOLEAN Enable);
+ IN PUNICODE_STRING SymbolicLinkName,
+ IN BOOLEAN Enable);
NTKERNELAPI
VOID
NTAPI
IoSetShareAccess(
- IN ACCESS_MASK DesiredAccess,
- IN ULONG DesiredShareAccess,
- IN OUT PFILE_OBJECT FileObject,
- OUT PSHARE_ACCESS ShareAccess);
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG DesiredShareAccess,
+ IN OUT PFILE_OBJECT FileObject,
+ OUT PSHARE_ACCESS ShareAccess);
NTKERNELAPI
VOID
NTAPI
IoStartNextPacket(
- IN PDEVICE_OBJECT DeviceObject,
- IN BOOLEAN Cancelable);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN Cancelable);
NTKERNELAPI
VOID
NTAPI
IoStartNextPacketByKey(
- IN PDEVICE_OBJECT DeviceObject,
- IN BOOLEAN Cancelable,
- IN ULONG Key);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN Cancelable,
+ IN ULONG Key);
NTKERNELAPI
VOID
NTAPI
IoStartPacket(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PULONG Key OPTIONAL,
- IN PDRIVER_CANCEL CancelFunction OPTIONAL);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PULONG Key OPTIONAL,
+ IN PDRIVER_CANCEL CancelFunction OPTIONAL);
NTKERNELAPI
VOID
NTAPI
IoStartTimer(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
VOID
NTAPI
IoStopTimer(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
NTSTATUS
NTAPI
IoUnregisterPlugPlayNotification(
- IN PVOID NotificationEntry);
+ IN PVOID NotificationEntry);
NTKERNELAPI
VOID
NTAPI
IoUnregisterShutdownNotification(
- IN PDEVICE_OBJECT DeviceObject);
+ IN PDEVICE_OBJECT DeviceObject);
NTKERNELAPI
VOID
NTAPI
IoUpdateShareAccess(
- IN PFILE_OBJECT FileObject,
- IN OUT PSHARE_ACCESS ShareAccess);
+ IN PFILE_OBJECT FileObject,
+ IN OUT PSHARE_ACCESS ShareAccess);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIAllocateInstanceIds(
- IN GUID *Guid,
- IN ULONG InstanceCount,
- OUT ULONG *FirstInstanceId);
+ IN GUID *Guid,
+ IN ULONG InstanceCount,
+ OUT ULONG *FirstInstanceId);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIQuerySingleInstanceMultiple(
- IN PVOID *DataBlockObjectList,
- IN PUNICODE_STRING InstanceNames,
- IN ULONG ObjectCount,
- IN OUT ULONG *InOutBufferSize,
- OUT PVOID OutBuffer);
+ IN PVOID *DataBlockObjectList,
+ IN PUNICODE_STRING InstanceNames,
+ IN ULONG ObjectCount,
+ IN OUT ULONG *InOutBufferSize,
+ OUT PVOID OutBuffer);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIRegistrationControl(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG Action);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG Action);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMISuggestInstanceName(
- IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
- IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
- IN BOOLEAN CombineNames,
- OUT PUNICODE_STRING SuggestedInstanceName);
+ IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
+ IN PUNICODE_STRING SymbolicLinkName OPTIONAL,
+ IN BOOLEAN CombineNames,
+ OUT PUNICODE_STRING SuggestedInstanceName);
NTKERNELAPI
NTSTATUS
@@ -12357,7 +12311,7 @@ NTKERNELAPI
VOID
NTAPI
IoWriteErrorLogEntry(
- IN PVOID ElEntry);
+ IN PVOID ElEntry);
NTKERNELAPI
PIRP
@@ -12376,6 +12330,7 @@ NTAPI
IoSetTopLevelIrp(
IN PIRP Irp OPTIONAL);
+
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
@@ -12412,15 +12367,15 @@ NTKERNELAPI
PIRP
NTAPI
IoCsqRemoveNextIrp(
- IN PIO_CSQ Csq,
+ IN PIO_CSQ Csq,
IN PVOID PeekContext OPTIONAL);
NTKERNELAPI
BOOLEAN
NTAPI
IoForwardIrpSynchronously(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp);
#define IoForwardAndCatchIrp IoForwardIrpSynchronously
@@ -12428,116 +12383,117 @@ NTKERNELAPI
VOID
NTAPI
IoFreeErrorLogEntry(
- PVOID ElEntry);
+ PVOID ElEntry);
NTKERNELAPI
NTSTATUS
NTAPI
IoSetCompletionRoutineEx(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PIO_COMPLETION_ROUTINE CompletionRoutine,
- IN PVOID Context,
- IN BOOLEAN InvokeOnSuccess,
- IN BOOLEAN InvokeOnError,
- IN BOOLEAN InvokeOnCancel);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp,
+ IN PIO_COMPLETION_ROUTINE CompletionRoutine,
+ IN PVOID Context,
+ IN BOOLEAN InvokeOnSuccess,
+ IN BOOLEAN InvokeOnError,
+ IN BOOLEAN InvokeOnCancel);
VOID
NTAPI
IoSetStartIoAttributes(
- IN PDEVICE_OBJECT DeviceObject,
- IN BOOLEAN DeferredStartIo,
- IN BOOLEAN NonCancelable);
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN DeferredStartIo,
+ IN BOOLEAN NonCancelable);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIDeviceObjectToInstanceName(
- IN PVOID DataBlockObject,
- IN PDEVICE_OBJECT DeviceObject,
- OUT PUNICODE_STRING InstanceName);
+ IN PVOID DataBlockObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT PUNICODE_STRING InstanceName);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIExecuteMethod(
- IN PVOID DataBlockObject,
- IN PUNICODE_STRING InstanceName,
- IN ULONG MethodId,
- IN ULONG InBufferSize,
- IN OUT PULONG OutBufferSize,
- IN OUT PUCHAR InOutBuffer);
+ IN PVOID DataBlockObject,
+ IN PUNICODE_STRING InstanceName,
+ IN ULONG MethodId,
+ IN ULONG InBufferSize,
+ IN OUT PULONG OutBufferSize,
+ IN OUT PUCHAR InOutBuffer);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIHandleToInstanceName(
- IN PVOID DataBlockObject,
- IN HANDLE FileHandle,
- OUT PUNICODE_STRING InstanceName);
+ IN PVOID DataBlockObject,
+ IN HANDLE FileHandle,
+ OUT PUNICODE_STRING InstanceName);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIOpenBlock(
- IN GUID *DataBlockGuid,
- IN ULONG DesiredAccess,
- OUT PVOID *DataBlockObject);
+ IN GUID *DataBlockGuid,
+ IN ULONG DesiredAccess,
+ OUT PVOID *DataBlockObject);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIQueryAllData(
- IN PVOID DataBlockObject,
- IN OUT ULONG *InOutBufferSize,
- OUT PVOID OutBuffer);
+ IN PVOID DataBlockObject,
+ IN OUT ULONG *InOutBufferSize,
+ OUT PVOID OutBuffer);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIQueryAllDataMultiple(
- IN PVOID *DataBlockObjectList,
- IN ULONG ObjectCount,
- IN OUT ULONG *InOutBufferSize,
- OUT PVOID OutBuffer);
+ IN PVOID *DataBlockObjectList,
+ IN ULONG ObjectCount,
+ IN OUT ULONG *InOutBufferSize,
+ OUT PVOID OutBuffer);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMIQuerySingleInstance(
- IN PVOID DataBlockObject,
- IN PUNICODE_STRING InstanceName,
- IN OUT ULONG *InOutBufferSize,
+ IN PVOID DataBlockObject,
+ IN PUNICODE_STRING InstanceName,
+ IN OUT ULONG *InOutBufferSize,
OUT PVOID OutBuffer);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMISetNotificationCallback(
- IN OUT PVOID Object,
- IN WMI_NOTIFICATION_CALLBACK Callback,
- IN PVOID Context OPTIONAL);
+ IN OUT PVOID Object,
+ IN WMI_NOTIFICATION_CALLBACK Callback,
+ IN PVOID Context OPTIONAL);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMISetSingleInstance(
- IN PVOID DataBlockObject,
- IN PUNICODE_STRING InstanceName,
- IN ULONG Version,
- IN ULONG ValueBufferSize,
- IN PVOID ValueBuffer);
+ IN PVOID DataBlockObject,
+ IN PUNICODE_STRING InstanceName,
+ IN ULONG Version,
+ IN ULONG ValueBufferSize,
+ IN PVOID ValueBuffer);
NTKERNELAPI
NTSTATUS
NTAPI
IoWMISetSingleItem(
- IN PVOID DataBlockObject,
- IN PUNICODE_STRING InstanceName,
- IN ULONG DataItemId,
- IN ULONG Version,
- IN ULONG ValueBufferSize,
- IN PVOID ValueBuffer);
+ IN PVOID DataBlockObject,
+ IN PUNICODE_STRING InstanceName,
+ IN ULONG DataItemId,
+ IN ULONG Version,
+ IN ULONG ValueBufferSize,
+ IN PVOID ValueBuffer);
+
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
#if (NTDDI_VERSION >= NTDDI_WINXPSP1)
@@ -12550,7 +12506,6 @@ IoValidateDeviceIoControlAccess(
#endif
#if (NTDDI_VERSION >= NTDDI_WS03)
-
NTKERNELAPI
NTSTATUS
NTAPI
@@ -12575,7 +12530,6 @@ IoCsqInsertIrpEx(
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
NTKERNELAPI
NTSTATUS
NTAPI
@@ -12789,7 +12743,7 @@ IoWMIDeviceObjectToProviderId(
FORCEINLINE
VOID
-IoSkipCurrentIrpStackLocation (
+IoSkipCurrentIrpStackLocation(
IN OUT PIRP Irp)
{
ASSERT(Irp->CurrentLocation <= Irp->StackCount);
@@ -12799,7 +12753,7 @@ IoSkipCurrentIrpStackLocation (
FORCEINLINE
VOID
-IoSetNextIrpStackLocation (
+IoSetNextIrpStackLocation(
IN OUT PIRP Irp)
{
ASSERT(Irp->CurrentLocation > 0);
@@ -12891,7 +12845,7 @@ IoSetCompletionRoutine(
NTKERNELAPI
BOOLEAN
IoIs32bitProcess(
- IN PIRP Irp OPTIONAL);
+ IN PIRP Irp OPTIONAL);
#endif
#define PLUGPLAY_REGKEY_DEVICE 1
@@ -12979,8 +12933,8 @@ NTKERNELAPI
VOID
NTAPI
IoGetStackLimits(
- OUT PULONG_PTR LowLimit,
- OUT PULONG_PTR HighLimit);
+ OUT PULONG_PTR LowLimit,
+ OUT PULONG_PTR HighLimit);
FORCEINLINE
ULONG_PTR
@@ -13019,17 +12973,17 @@ NTKERNELAPI
NTSTATUS
NTAPI
PoCallDriver(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN OUT struct _IRP *Irp);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN OUT struct _IRP *Irp);
NTKERNELAPI
PULONG
NTAPI
PoRegisterDeviceForIdleDetection(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN ULONG ConservationIdleTime,
- IN ULONG PerformanceIdleTime,
- IN DEVICE_POWER_STATE State);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN ULONG ConservationIdleTime,
+ IN ULONG PerformanceIdleTime,
+ IN DEVICE_POWER_STATE State);
NTKERNELAPI
PVOID
@@ -13042,26 +12996,26 @@ NTKERNELAPI
NTSTATUS
NTAPI
PoRequestPowerIrp(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN UCHAR MinorFunction,
- IN POWER_STATE PowerState,
- IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
- IN PVOID Context OPTIONAL,
- OUT struct _IRP **Irp OPTIONAL);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN UCHAR MinorFunction,
+ IN POWER_STATE PowerState,
+ IN PREQUEST_POWER_COMPLETE CompletionFunction OPTIONAL,
+ IN PVOID Context OPTIONAL,
+ OUT struct _IRP **Irp OPTIONAL);
NTKERNELAPI
POWER_STATE
NTAPI
PoSetPowerState(
- IN struct _DEVICE_OBJECT *DeviceObject,
- IN POWER_STATE_TYPE Type,
- IN POWER_STATE State);
+ IN struct _DEVICE_OBJECT *DeviceObject,
+ IN POWER_STATE_TYPE Type,
+ IN POWER_STATE State);
NTKERNELAPI
VOID
NTAPI
PoSetSystemState(
- IN EXECUTION_STATE Flags);
+ IN EXECUTION_STATE Flags);
NTKERNELAPI
VOID
@@ -13260,25 +13214,25 @@ FORCEINLINE
USHORT
ExQueryDepthSList(IN PSLIST_HEADER ListHead)
{
- return (USHORT)(ListHead->Alignment & 0xffff);
+ return (USHORT)(ListHead->Alignment & 0xffff);
}
#endif
NTKERNELAPI
PSLIST_ENTRY
ExpInterlockedFlushSList(
- PSLIST_HEADER ListHead);
+ PSLIST_HEADER ListHead);
NTKERNELAPI
PSLIST_ENTRY
ExpInterlockedPopEntrySList(
- PSLIST_HEADER ListHead);
+ PSLIST_HEADER ListHead);
NTKERNELAPI
PSLIST_ENTRY
ExpInterlockedPushEntrySList(
- PSLIST_HEADER ListHead,
- PSLIST_ENTRY ListEntry);
+ PSLIST_HEADER ListHead,
+ PSLIST_ENTRY ListEntry);
#define ExInterlockedFlushSList(Head) \
ExpInterlockedFlushSList(Head)
@@ -13305,16 +13259,16 @@ NTKERNELAPI
PSINGLE_LIST_ENTRY
FASTCALL
ExInterlockedPopEntrySList(
- IN PSLIST_HEADER ListHead,
- IN PKSPIN_LOCK Lock);
+ IN PSLIST_HEADER ListHead,
+ IN PKSPIN_LOCK Lock);
NTKERNELAPI
PSINGLE_LIST_ENTRY
FASTCALL
ExInterlockedPushEntrySList(
- IN PSLIST_HEADER ListHead,
- IN PSINGLE_LIST_ENTRY ListEntry,
- IN PKSPIN_LOCK Lock);
+ IN PSLIST_HEADER ListHead,
+ IN PSINGLE_LIST_ENTRY ListEntry,
+ IN PKSPIN_LOCK Lock);
NTKERNELAPI
PVOID
@@ -13407,69 +13361,69 @@ ExInitializeFastMutex(
return;
}
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
NTKERNELAPI
VOID
FASTCALL
ExAcquireFastMutexUnsafe(
- IN OUT PFAST_MUTEX FastMutex);
+ IN OUT PFAST_MUTEX FastMutex);
NTKERNELAPI
VOID
FASTCALL
ExReleaseFastMutexUnsafe(
- IN OUT PFAST_MUTEX FastMutex);
+ IN OUT PFAST_MUTEX FastMutex);
NTKERNELAPI
BOOLEAN
NTAPI
ExAcquireResourceExclusiveLite(
IN OUT PERESOURCE Resource,
- IN BOOLEAN Wait);
+ IN BOOLEAN Wait);
NTKERNELAPI
BOOLEAN
NTAPI
ExAcquireResourceSharedLite(
IN OUT PERESOURCE Resource,
- IN BOOLEAN Wait);
+ IN BOOLEAN Wait);
NTKERNELAPI
BOOLEAN
NTAPI
ExAcquireSharedStarveExclusive(
IN OUT PERESOURCE Resource,
- IN BOOLEAN Wait);
+ IN BOOLEAN Wait);
NTKERNELAPI
BOOLEAN
NTAPI
ExAcquireSharedWaitForExclusive(
IN OUT PERESOURCE Resource,
- IN BOOLEAN Wait);
+ IN BOOLEAN Wait);
NTKERNELAPI
PVOID
NTAPI
ExAllocatePool(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes);
NTKERNELAPI
PVOID
NTAPI
ExAllocatePoolWithQuota(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes);
NTKERNELAPI
PVOID
NTAPI
ExAllocatePoolWithQuotaTag(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag);
#ifndef POOL_TAGGING
#define ExAllocatePoolWithQuotaTag(a,b,c) ExAllocatePoolWithQuota(a,b)
@@ -13479,9 +13433,9 @@ NTKERNELAPI
PVOID
NTAPI
ExAllocatePoolWithTag(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag);
#ifndef POOL_TAGGING
#define ExAllocatePoolWithTag(a,b,c) ExAllocatePool(a,b)
@@ -13491,10 +13445,10 @@ NTKERNELAPI
PVOID
NTAPI
ExAllocatePoolWithTagPriority(
- IN POOL_TYPE PoolType,
- IN SIZE_T NumberOfBytes,
- IN ULONG Tag,
- IN EX_POOL_PRIORITY Priority);
+ IN POOL_TYPE PoolType,
+ IN SIZE_T NumberOfBytes,
+ IN ULONG Tag,
+ IN EX_POOL_PRIORITY Priority);
NTKERNELAPI
VOID
@@ -13506,10 +13460,10 @@ NTKERNELAPI
NTSTATUS
NTAPI
ExCreateCallback(
- OUT PCALLBACK_OBJECT *CallbackObject,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN BOOLEAN Create,
- IN BOOLEAN AllowMultipleCallbacks);
+ OUT PCALLBACK_OBJECT *CallbackObject,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN Create,
+ IN BOOLEAN AllowMultipleCallbacks);
NTKERNELAPI
VOID
@@ -13521,7 +13475,7 @@ NTKERNELAPI
VOID
NTAPI
ExDeletePagedLookasideList(
- IN PPAGED_LOOKASIDE_LIST Lookaside);
+ IN PPAGED_LOOKASIDE_LIST Lookaside);
NTKERNELAPI
NTSTATUS
@@ -13533,20 +13487,20 @@ NTKERNELAPI
VOID
NTAPI
ExFreePool(
- IN PVOID P);
+ IN PVOID P);
NTKERNELAPI
VOID
NTAPI
ExFreePoolWithTag(
- IN PVOID P,
- IN ULONG Tag);
+ IN PVOID P,
+ IN ULONG Tag);
NTKERNELAPI
ULONG
NTAPI
ExGetExclusiveWaiterCount(
- IN PERESOURCE Resource);
+ IN PERESOURCE Resource);
NTKERNELAPI
KPROCESSOR_MODE
@@ -13557,31 +13511,31 @@ NTKERNELAPI
ULONG
NTAPI
ExGetSharedWaiterCount(
- IN PERESOURCE Resource);
+ IN PERESOURCE Resource);
NTKERNELAPI
VOID
NTAPI
ExInitializeNPagedLookasideList(
- IN PNPAGED_LOOKASIDE_LIST Lookaside,
- IN PALLOCATE_FUNCTION Allocate OPTIONAL,
- IN PFREE_FUNCTION Free OPTIONAL,
- IN ULONG Flags,
- IN SIZE_T Size,
- IN ULONG Tag,
- IN USHORT Depth);
+ IN PNPAGED_LOOKASIDE_LIST Lookaside,
+ IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+ IN PFREE_FUNCTION Free OPTIONAL,
+ IN ULONG Flags,
+ IN SIZE_T Size,
+ IN ULONG Tag,
+ IN USHORT Depth);
NTKERNELAPI
VOID
NTAPI
ExInitializePagedLookasideList(
- IN PPAGED_LOOKASIDE_LIST Lookaside,
- IN PALLOCATE_FUNCTION Allocate OPTIONAL,
- IN PFREE_FUNCTION Free OPTIONAL,
- IN ULONG Flags,
- IN SIZE_T Size,
- IN ULONG Tag,
- IN USHORT Depth);
+ IN PPAGED_LOOKASIDE_LIST Lookaside,
+ IN PALLOCATE_FUNCTION Allocate OPTIONAL,
+ IN PFREE_FUNCTION Free OPTIONAL,
+ IN ULONG Flags,
+ IN SIZE_T Size,
+ IN ULONG Tag,
+ IN USHORT Depth);
NTKERNELAPI
NTSTATUS
@@ -13593,9 +13547,9 @@ NTKERNELAPI
LARGE_INTEGER
NTAPI
ExInterlockedAddLargeInteger(
- IN PLARGE_INTEGER Addend,
- IN LARGE_INTEGER Increment,
- IN PKSPIN_LOCK Lock);
+ IN PLARGE_INTEGER Addend,
+ IN LARGE_INTEGER Increment,
+ IN PKSPIN_LOCK Lock);
#if defined(_WIN64)
#define ExInterlockedAddLargeStatistic(Addend, Increment) \
@@ -13609,8 +13563,8 @@ NTKERNELAPI
ULONG
FASTCALL
ExInterlockedAddUlong(
- IN PULONG Addend,
- IN ULONG Increment,
+ IN PULONG Addend,
+ IN ULONG Increment,
IN OUT PKSPIN_LOCK Lock);
#if defined(_AMD64_) || defined(_IA64_)
@@ -13624,9 +13578,9 @@ NTKERNELAPI
LONGLONG
FASTCALL
ExfInterlockedCompareExchange64(
- IN OUT LONGLONG volatile *Destination,
- IN PLONGLONG Exchange,
- IN PLONGLONG Comperand);
+ IN OUT LONGLONG volatile *Destination,
+ IN PLONGLONG Exchange,
+ IN PLONGLONG Comperand);
#define ExInterlockedCompareExchange64(Destination, Exchange, Comperand, Lock) \
ExfInterlockedCompareExchange64(Destination, Exchange, Comperand)
@@ -13637,10 +13591,10 @@ NTKERNELAPI
LONGLONG
FASTCALL
ExInterlockedCompareExchange64(
- IN OUT LONGLONG volatile *Destination,
- IN PLONGLONG Exchange,
- IN PLONGLONG Comparand,
- IN PKSPIN_LOCK Lock);
+ IN OUT LONGLONG volatile *Destination,
+ IN PLONGLONG Exchange,
+ IN PLONGLONG Comparand,
+ IN PKSPIN_LOCK Lock);
#endif /* defined(_AMD64_) || defined(_IA64_) */
@@ -13686,19 +13640,19 @@ NTKERNELAPI
BOOLEAN
NTAPI
ExIsProcessorFeaturePresent(
- IN ULONG ProcessorFeature);
+ IN ULONG ProcessorFeature);
NTKERNELAPI
BOOLEAN
NTAPI
ExIsResourceAcquiredExclusiveLite(
- IN PERESOURCE Resource);
+ IN PERESOURCE Resource);
NTKERNELAPI
ULONG
NTAPI
ExIsResourceAcquiredSharedLite(
- IN PERESOURCE Resource);
+ IN PERESOURCE Resource);
#define ExIsResourceAcquiredLite ExIsResourceAcquiredSharedLite
@@ -13706,14 +13660,14 @@ NTKERNELAPI
VOID
NTAPI
ExLocalTimeToSystemTime(
- IN PLARGE_INTEGER LocalTime,
- OUT PLARGE_INTEGER SystemTime);
+ IN PLARGE_INTEGER LocalTime,
+ OUT PLARGE_INTEGER SystemTime);
NTKERNELAPI
VOID
NTAPI
ExNotifyCallback(
- IN PCALLBACK_OBJECT CallbackObject,
+ IN PCALLBACK_OBJECT CallbackObject,
IN PVOID Argument1 OPTIONAL,
IN PVOID Argument2 OPTIONAL);
@@ -13722,21 +13676,21 @@ VOID
NTAPI
ExQueueWorkItem(
IN OUT PWORK_QUEUE_ITEM WorkItem,
- IN WORK_QUEUE_TYPE QueueType);
+ IN WORK_QUEUE_TYPE QueueType);
NTKERNELAPI
DECLSPEC_NORETURN
VOID
NTAPI
ExRaiseStatus(
- IN NTSTATUS Status);
+ IN NTSTATUS Status);
NTKERNELAPI
PVOID
NTAPI
ExRegisterCallback(
- IN PCALLBACK_OBJECT CallbackObject,
- IN PCALLBACK_FUNCTION CallbackFunction,
+ IN PCALLBACK_OBJECT CallbackObject,
+ IN PCALLBACK_FUNCTION CallbackFunction,
IN PVOID CallbackContext OPTIONAL);
NTKERNELAPI
@@ -13750,7 +13704,7 @@ VOID
NTAPI
ExReleaseResourceForThreadLite(
IN OUT PERESOURCE Resource,
- IN ERESOURCE_THREAD ResourceThreadId);
+ IN ERESOURCE_THREAD ResourceThreadId);
NTKERNELAPI
VOID
@@ -13763,21 +13717,21 @@ VOID
NTAPI
ExSetResourceOwnerPointer(
IN OUT PERESOURCE Resource,
- IN PVOID OwnerPointer);
+ IN PVOID OwnerPointer);
NTKERNELAPI
ULONG
NTAPI
ExSetTimerResolution(
- IN ULONG DesiredTime,
- IN BOOLEAN SetResolution);
+ IN ULONG DesiredTime,
+ IN BOOLEAN SetResolution);
NTKERNELAPI
VOID
NTAPI
ExSystemTimeToLocalTime(
- IN PLARGE_INTEGER SystemTime,
- OUT PLARGE_INTEGER LocalTime);
+ IN PLARGE_INTEGER SystemTime,
+ OUT PLARGE_INTEGER LocalTime);
NTKERNELAPI
VOID
@@ -13793,13 +13747,13 @@ NTKERNELAPI
BOOLEAN
FASTCALL
ExAcquireRundownProtection(
- IN OUT PEX_RUNDOWN_REF RunRef);
+ IN OUT PEX_RUNDOWN_REF RunRef);
NTKERNELAPI
VOID
FASTCALL
ExInitializeRundownProtection(
- OUT PEX_RUNDOWN_REF RunRef);
+ OUT PEX_RUNDOWN_REF RunRef);
NTKERNELAPI
VOID
@@ -13811,26 +13765,25 @@ NTKERNELAPI
VOID
FASTCALL
ExReleaseRundownProtection(
- IN OUT PEX_RUNDOWN_REF RunRef);
+ IN OUT PEX_RUNDOWN_REF RunRef);
NTKERNELAPI
VOID
FASTCALL
ExRundownCompleted(
- OUT PEX_RUNDOWN_REF RunRef);
+ OUT PEX_RUNDOWN_REF RunRef);
NTKERNELAPI
BOOLEAN
NTAPI
ExVerifySuite(
- IN SUITE_TYPE SuiteType);
+ IN SUITE_TYPE SuiteType);
NTKERNELAPI
VOID
FASTCALL
ExWaitForRundownProtectionRelease(
- IN OUT PEX_RUNDOWN_REF RunRef);
-
+ IN OUT PEX_RUNDOWN_REF RunRef);
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
@@ -13839,15 +13792,15 @@ NTKERNELAPI
BOOLEAN
FASTCALL
ExAcquireRundownProtectionEx(
- IN OUT PEX_RUNDOWN_REF RunRef,
- IN ULONG Count);
+ IN OUT PEX_RUNDOWN_REF RunRef,
+ IN ULONG Count);
NTKERNELAPI
VOID
FASTCALL
ExReleaseRundownProtectionEx(
- IN OUT PEX_RUNDOWN_REF RunRef,
- IN ULONG Count);
+ IN OUT PEX_RUNDOWN_REF RunRef,
+ IN ULONG Count);
#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
@@ -13857,8 +13810,8 @@ NTKERNELAPI
PEX_RUNDOWN_REF_CACHE_AWARE
NTAPI
ExAllocateCacheAwareRundownProtection(
- IN POOL_TYPE PoolType,
- IN ULONG PoolTag);
+ IN POOL_TYPE PoolType,
+ IN ULONG PoolTag);
NTKERNELAPI
SIZE_T
@@ -13954,14 +13907,14 @@ NTKERNELAPI
NTSTATUS
NTAPI
ExInitializeLookasideListEx(
- OUT PLOOKASIDE_LIST_EX Lookaside,
- IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
- IN PFREE_FUNCTION_EX Free OPTIONAL,
- IN POOL_TYPE PoolType,
- IN ULONG Flags,
- IN SIZE_T Size,
- IN ULONG Tag,
- IN USHORT Depth);
+ OUT PLOOKASIDE_LIST_EX Lookaside,
+ IN PALLOCATE_FUNCTION_EX Allocate OPTIONAL,
+ IN PFREE_FUNCTION_EX Free OPTIONAL,
+ IN POOL_TYPE PoolType,
+ IN ULONG Flags,
+ IN SIZE_T Size,
+ IN ULONG Tag,
+ IN USHORT Depth);
NTKERNELAPI
VOID
@@ -13980,18 +13933,18 @@ PVOID
ExAllocateFromLookasideListEx(
IN OUT PLOOKASIDE_LIST_EX Lookaside)
{
- PVOID Entry;
+ PVOID Entry;
Lookaside->L.TotalAllocates += 1;
- Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
- if (Entry == NULL) {
+ Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+ if (Entry == NULL) {
Lookaside->L.AllocateMisses += 1;
Entry = (Lookaside->L.AllocateEx)(Lookaside->L.Type,
- Lookaside->L.Size,
+ Lookaside->L.Size,
Lookaside->L.Tag,
Lookaside);
- }
- return Entry;
+ }
+ return Entry;
}
FORCEINLINE
@@ -14030,51 +13983,49 @@ static __inline PVOID
ExAllocateFromNPagedLookasideList(
IN OUT PNPAGED_LOOKASIDE_LIST Lookaside)
{
- PVOID Entry;
+ PVOID Entry;
- Lookaside->L.TotalAllocates++;
+ Lookaside->L.TotalAllocates++;
#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
Entry = ExInterlockedPopEntrySList(&Lookaside->L.ListHead,
&Lookaside->Lock__ObsoleteButDoNotDelete);
#else
- Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
+ Entry = InterlockedPopEntrySList(&Lookaside->L.ListHead);
#endif
- if (Entry == NULL) {
- Lookaside->L.AllocateMisses++;
- Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
- Lookaside->L.Size,
- Lookaside->L.Tag);
- }
- return Entry;
+ if (Entry == NULL) {
+ Lookaside->L.AllocateMisses++;
+ Entry = (Lookaside->L.Allocate)(Lookaside->L.Type,
+ Lookaside->L.Size,
+ Lookaside->L.Tag);
+ }
+ return Entry;
}
static __inline VOID
ExFreeToNPagedLookasideList(
IN OUT PNPAGED_LOOKASIDE_LIST Lookaside,
- IN PVOID Entry)
+ IN PVOID Entry)
{
- Lookaside->L.TotalFrees++;
- if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
- Lookaside->L.FreeMisses++;
- (Lookaside->L.Free)(Entry);
- } else {
+ Lookaside->L.TotalFrees++;
+ if (ExQueryDepthSList(&Lookaside->L.ListHead) >= Lookaside->L.Depth) {
+ Lookaside->L.FreeMisses++;
+ (Lookaside->L.Free)(Entry);
+ } else {
#if defined(_WIN2K_COMPAT_SLIST_USAGE) && defined(_X86_)
ExInterlockedPushEntrySList(&Lookaside->L.ListHead,
(PSLIST_ENTRY)Entry,
&Lookaside->Lock__ObsoleteButDoNotDelete);
#else
- InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
+ InterlockedPushEntrySList(&Lookaside->L.ListHead, (PSLIST_ENTRY)Entry);
#endif
- }
+ }
}
-
/******************************************************************************
* Object Manager Functions *
******************************************************************************/
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
NTKERNELAPI
LONG_PTR
FASTCALL
@@ -14112,7 +14063,7 @@ NTKERNELAPI
NTSTATUS
NTAPI
ObReferenceObjectByPointer(
- IN PVOID Object,
+ IN PVOID Object,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode);
@@ -14123,7 +14074,6 @@ NTAPI
ObReleaseObjectSecurity(
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN BOOLEAN MemoryAllocated);
-
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
@@ -14156,7 +14106,6 @@ ObGetFilterVersion(VOID);
#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
#if (NTDDI_VERSION >= NTDDI_WIN7)
-
NTKERNELAPI
NTSTATUS
NTAPI
@@ -14204,10 +14153,8 @@ ObDereferenceObjectDeferDeleteWithTag(
#define ObReferenceObject ObfReferenceObject
#define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
#define ObReferenceObjectWithTag ObfReferenceObjectWithTag
-
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-
/******************************************************************************
* Process Manager Functions *
******************************************************************************/
@@ -14243,23 +14190,23 @@ NTKERNELAPI
NTSTATUS
NTAPI
PsCreateSystemThread(
- OUT PHANDLE ThreadHandle,
- IN ULONG DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
- IN HANDLE ProcessHandle OPTIONAL,
- OUT PCLIENT_ID ClientId OPTIONAL,
- IN PKSTART_ROUTINE StartRoutine,
- IN PVOID StartContext OPTIONAL);
+ OUT PHANDLE ThreadHandle,
+ IN ULONG DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN HANDLE ProcessHandle OPTIONAL,
+ OUT PCLIENT_ID ClientId OPTIONAL,
+ IN PKSTART_ROUTINE StartRoutine,
+ IN PVOID StartContext OPTIONAL);
NTKERNELAPI
NTSTATUS
NTAPI
PsTerminateSystemThread(
- IN NTSTATUS ExitStatus);
-
+ IN NTSTATUS ExitStatus);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
/******************************************************************************
* WMI Library Support Functions *
******************************************************************************/
@@ -14270,10 +14217,10 @@ NTKERNELAPI
NTSTATUS
__cdecl
WmiTraceMessage(
- IN TRACEHANDLE LoggerHandle,
- IN ULONG MessageFlags,
- IN LPGUID MessageGuid,
- IN USHORT MessageNumber,
+ IN TRACEHANDLE LoggerHandle,
+ IN ULONG MessageFlags,
+ IN LPGUID MessageGuid,
+ IN USHORT MessageNumber,
IN ...);
#endif
#endif /* RUN_WPP */
@@ -14284,11 +14231,11 @@ NTKERNELAPI
NTSTATUS
NTAPI
WmiQueryTraceInformation(
- IN TRACE_INFORMATION_CLASS TraceInformationClass,
- OUT PVOID TraceInformation,
- IN ULONG TraceInformationLength,
- OUT PULONG RequiredLength OPTIONAL,
- IN PVOID Buffer OPTIONAL);
+ IN TRACE_INFORMATION_CLASS TraceInformationClass,
+ OUT PVOID TraceInformation,
+ IN ULONG TraceInformationLength,
+ OUT PULONG RequiredLength OPTIONAL,
+ IN PVOID Buffer OPTIONAL);
#if 0
/* FIXME: Get va_list from where? */
@@ -14296,11 +14243,11 @@ NTKERNELAPI
NTSTATUS
__cdecl
WmiTraceMessageVa(
- IN TRACEHANDLE LoggerHandle,
- IN ULONG MessageFlags,
- IN LPGUID MessageGuid,
- IN USHORT MessageNumber,
- IN va_list MessageArgList);
+ IN TRACEHANDLE LoggerHandle,
+ IN ULONG MessageFlags,
+ IN LPGUID MessageGuid,
+ IN USHORT MessageNumber,
+ IN va_list MessageArgList);
#endif
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
@@ -14421,7 +14368,7 @@ EtwWriteEx(
ULONG
__cdecl
DbgPrint(
- IN PCSTR Format,
+ IN PCSTR Format,
IN ...);
#if (NTDDI_VERSION >= NTDDI_WIN2K)
@@ -14527,21 +14474,21 @@ DbgSetDebugPrintCallback(
extern NTKERNELAPI BOOLEAN KdDebuggerNotPresent;
extern NTKERNELAPI BOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED KdDebuggerEnabled
+#define KD_DEBUGGER_ENABLED KdDebuggerEnabled
#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
#elif defined(_NTDDK_) || defined(_NTIFS_) || defined(_NTHAL_) || defined(_WDMDDK_) || defined(_NTOSP_)
extern NTKERNELAPI PBOOLEAN KdDebuggerNotPresent;
extern NTKERNELAPI PBOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
+#define KD_DEBUGGER_ENABLED *KdDebuggerEnabled
#define KD_DEBUGGER_NOT_PRESENT *KdDebuggerNotPresent
#else
extern BOOLEAN KdDebuggerNotPresent;
extern BOOLEAN KdDebuggerEnabled;
-#define KD_DEBUGGER_ENABLED KdDebuggerEnabled
+#define KD_DEBUGGER_ENABLED KdDebuggerEnabled
#define KD_DEBUGGER_NOT_PRESENT KdDebuggerNotPresent
#endif
@@ -14570,7 +14517,7 @@ NTSYSAPI
VOID
NTAPI
DbgBreakPointWithStatus(
- IN ULONG Status);
+ IN ULONG Status);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
@@ -14604,9 +14551,9 @@ PVOID
NTAPI
HalAllocateCommonBuffer(
IN PDMA_ADAPTER DmaAdapter,
- IN ULONG Length,
- OUT PPHYSICAL_ADDRESS LogicalAddress,
- IN BOOLEAN CacheEnabled)
+ IN ULONG Length,
+ OUT PPHYSICAL_ADDRESS LogicalAddress,
+ IN BOOLEAN CacheEnabled)
{
PALLOCATE_COMMON_BUFFER allocateCommonBuffer;
PVOID commonBuffer;
@@ -14622,10 +14569,10 @@ VOID
NTAPI
HalFreeCommonBuffer(
IN PDMA_ADAPTER DmaAdapter,
- IN ULONG Length,
- IN PHYSICAL_ADDRESS LogicalAddress,
- IN PVOID VirtualAddress,
- IN BOOLEAN CacheEnabled)
+ IN ULONG Length,
+ IN PHYSICAL_ADDRESS LogicalAddress,
+ IN PVOID VirtualAddress,
+ IN BOOLEAN CacheEnabled)
{
PFREE_COMMON_BUFFER freeCommonBuffer;
@@ -14664,6 +14611,7 @@ HalGetDmaAlignment(
}
#endif /* USE_DMA_MACROS ... */
+
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#ifndef _NTTMAPI_
@@ -15328,52 +15276,49 @@ NtPropagationFailed(
#define ZwCurrentThread() NtCurrentThread()
-
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-
NTSYSAPI
NTSTATUS
NTAPI
ZwClose(
- IN HANDLE Handle);
+ IN HANDLE Handle);
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateDirectoryObject(
- OUT PHANDLE DirectoryHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes);
+ OUT PHANDLE DirectoryHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateFile(
- OUT PHANDLE FileHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- IN ULONG FileAttributes,
- IN ULONG ShareAccess,
- IN ULONG CreateDisposition,
- IN ULONG CreateOptions,
- IN PVOID EaBuffer OPTIONAL,
- IN ULONG EaLength);
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG CreateDisposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength);
NTSYSAPI
NTSTATUS
NTAPI
ZwCreateKey(
- OUT PHANDLE KeyHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- IN ULONG TitleIndex,
- IN PUNICODE_STRING Class OPTIONAL,
- IN ULONG CreateOptions,
- OUT PULONG Disposition OPTIONAL);
+ OUT PHANDLE KeyHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN ULONG TitleIndex,
+ IN PUNICODE_STRING Class OPTIONAL,
+ IN ULONG CreateOptions,
+ OUT PULONG Disposition OPTIONAL);
NTSYSAPI
NTSTATUS
@@ -15397,7 +15342,7 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwDeleteValueKey(
- IN HANDLE KeyHandle,
+ IN HANDLE KeyHandle,
IN PUNICODE_STRING ValueName);
NTSYSAPI
@@ -15426,7 +15371,7 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwFlushKey(
- IN HANDLE KeyHandle);
+ IN HANDLE KeyHandle);
NTSYSAPI
NTSTATUS
@@ -15438,22 +15383,22 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwMakeTemporaryObject(
- IN HANDLE Handle);
+ IN HANDLE Handle);
NTSYSAPI
NTSTATUS
NTAPI
ZwMapViewOfSection(
- IN HANDLE SectionHandle,
- IN HANDLE ProcessHandle,
- IN OUT PVOID *BaseAddress,
- IN ULONG_PTR ZeroBits,
- IN SIZE_T CommitSize,
- IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
- IN OUT PSIZE_T ViewSize,
- IN SECTION_INHERIT InheritDisposition,
- IN ULONG AllocationType,
- IN ULONG Protect);
+ IN HANDLE SectionHandle,
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN ULONG_PTR ZeroBits,
+ IN SIZE_T CommitSize,
+ IN OUT PLARGE_INTEGER SectionOffset OPTIONAL,
+ IN OUT PSIZE_T ViewSize,
+ IN SECTION_INHERIT InheritDisposition,
+ IN ULONG AllocationType,
+ IN ULONG Protect);
NTSYSAPI
NTSTATUS
@@ -15470,35 +15415,35 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwOpenKey(
- OUT PHANDLE KeyHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes);
+ OUT PHANDLE KeyHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSYSAPI
NTSTATUS
NTAPI
ZwOpenSection(
- OUT PHANDLE SectionHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes);
+ OUT PHANDLE SectionHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSYSAPI
NTSTATUS
NTAPI
ZwOpenSymbolicLinkObject(
- OUT PHANDLE LinkHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes);
+ OUT PHANDLE LinkHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
NTSYSAPI
NTSTATUS
NTAPI
ZwQueryInformationFile(
- IN HANDLE FileHandle,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID FileInformation,
- IN ULONG Length,
- IN FILE_INFORMATION_CLASS FileInformationClass);
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass);
NTSYSAPI
NTSTATUS
@@ -15514,9 +15459,9 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwQuerySymbolicLinkObject(
- IN HANDLE LinkHandle,
- IN OUT PUNICODE_STRING LinkTarget,
- OUT PULONG ReturnedLength OPTIONAL);
+ IN HANDLE LinkHandle,
+ IN OUT PUNICODE_STRING LinkTarget,
+ OUT PULONG ReturnedLength OPTIONAL);
NTSYSAPI
NTSTATUS
@@ -15533,36 +15478,36 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwReadFile(
- IN HANDLE FileHandle,
- IN HANDLE Event OPTIONAL,
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
- IN PVOID ApcContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID Buffer,
- IN ULONG Length,
- IN PLARGE_INTEGER ByteOffset OPTIONAL,
- IN PULONG Key OPTIONAL);
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN PLARGE_INTEGER ByteOffset OPTIONAL,
+ IN PULONG Key OPTIONAL);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetInformationFile(
- IN HANDLE FileHandle,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PVOID FileInformation,
- IN ULONG Length,
- IN FILE_INFORMATION_CLASS FileInformationClass);
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass);
NTSYSAPI
NTSTATUS
NTAPI
ZwSetValueKey(
- IN HANDLE KeyHandle,
- IN PUNICODE_STRING ValueName,
- IN ULONG TitleIndex OPTIONAL,
- IN ULONG Type,
- IN PVOID Data OPTIONAL,
- IN ULONG DataSize);
+ IN HANDLE KeyHandle,
+ IN PUNICODE_STRING ValueName,
+ IN ULONG TitleIndex OPTIONAL,
+ IN ULONG Type,
+ IN PVOID Data OPTIONAL,
+ IN ULONG DataSize);
NTSYSAPI
NTSTATUS
@@ -15574,22 +15519,22 @@ NTSYSAPI
NTSTATUS
NTAPI
ZwUnmapViewOfSection(
- IN HANDLE ProcessHandle,
- IN PVOID BaseAddress OPTIONAL);
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress OPTIONAL);
NTSYSAPI
NTSTATUS
NTAPI
ZwWriteFile(
- IN HANDLE FileHandle,
- IN HANDLE Event OPTIONAL,
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
- IN PVOID ApcContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PVOID Buffer,
- IN ULONG Length,
- IN PLARGE_INTEGER ByteOffset OPTIONAL,
- IN PULONG Key OPTIONAL);
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID Buffer,
+ IN ULONG Length,
+ IN PLARGE_INTEGER ByteOffset OPTIONAL,
+ IN PULONG Key OPTIONAL);
NTSYSAPI
NTSTATUS
@@ -15598,7 +15543,6 @@ ZwQueryFullAttributesFile(
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
-
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
@@ -15934,15 +15878,9 @@ NTAPI
ZwSinglePhaseReject(
IN HANDLE EnlistmentHandle,
IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
-
-
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
-
-
#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-
NTSYSAPI
NTSTATUS
NTAPI
@@ -16006,7 +15944,6 @@ ZwSetInformationKey(
IN PVOID KeySetInformation,
IN ULONG KeySetInformationLength);
-
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
diff --git a/include/ddk/winsplp.h b/include/ddk/winsplp.h
deleted file mode 100644
index 4dfdb5b834e..00000000000
--- a/include/ddk/winsplp.h
+++ /dev/null
@@ -1,428 +0,0 @@
-/*
- * Definitions for print provider, monitor, processor and spooler
- *
- * Copyright 2005 Detlef Riekenberg
- *
- * 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
- *
- *
- * "providor" is not a spelling error in this file. It's the real name.
- *
- */
-
-#ifndef _WINSPLP_
-#define _WINSPLP_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DEFINES */
-
-#define PRINTER_NOTIFY_STATUS_ENDPOINT 1
-#define PRINTER_NOTIFY_STATUS_POLL 2
-#define PRINTER_NOTIFY_STATUS_INFO 4
-
-
-#define ROUTER_UNKNOWN 0
-#define ROUTER_SUCCESS 1
-#define ROUTER_STOP_ROUTING 2
-
-/*
- * WARNING: Many Functions are declared as "BOOL", but return ROUTER_*
- */
-
-
-/* TYPES */
-
-typedef struct _MONITOR {
- BOOL (WINAPI *pfnEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
- DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
- BOOL (WINAPI *pfnOpenPort)(LPWSTR pName, PHANDLE pHandle);
- BOOL (WINAPI *pfnOpenPortEx)(LPWSTR pPortName, LPWSTR pPrinterName,
- PHANDLE pHandle, struct _MONITOR *pMonitor);
- BOOL (WINAPI *pfnStartDocPort)(HANDLE hPort, LPWSTR pPrinterName,
- DWORD JobId, DWORD Level, LPBYTE pDocInfo);
- BOOL (WINAPI *pfnWritePort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
- LPDWORD pcbWritten);
- BOOL (WINAPI *pfnReadPort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
- LPDWORD pcbRead);
- BOOL (WINAPI *pfnEndDocPort)(HANDLE hPort);
- BOOL (WINAPI *pfnClosePort)(HANDLE hPort);
- BOOL (WINAPI *pfnAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
- BOOL (WINAPI *pfnAddPortEx)(LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
- LPWSTR lpMonitorName);
- BOOL (WINAPI *pfnConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
- BOOL (WINAPI *pfnDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
- BOOL (WINAPI *pfnGetPrinterDataFromPort)(HANDLE hPort, DWORD ControlID,
- LPWSTR pValueName, LPWSTR lpInBuffer, DWORD cbInBuffer,
- LPWSTR lpOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbReturned);
- BOOL (WINAPI *pfnSetPortTimeOuts)(HANDLE hPort, LPCOMMTIMEOUTS lpCTO,
- DWORD reserved);
- BOOL (WINAPI *pfnXcvOpenPort)(LPCWSTR pszObject, ACCESS_MASK GrantedAccess, PHANDLE phXcv);
- DWORD (WINAPI *pfnXcvDataPort)(HANDLE hXcv, LPCWSTR pszDataName,
- PBYTE pInputData, DWORD cbInputData,
- PBYTE pOutputData, DWORD cbOutputData, PDWORD pcbOutputNeeded);
- BOOL (WINAPI *pfnXcvClosePort)(HANDLE hXcv);
-} MONITOR, *LPMONITOR;
-
-typedef struct _MONITOR2 {
- DWORD cbSize;
- BOOL (WINAPI *pfnEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
- DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
- BOOL (WINAPI *pfnOpenPort)(LPWSTR pName, PHANDLE pHandle);
- BOOL (WINAPI *pfnOpenPortEx)(LPWSTR pPortName, LPWSTR pPrinterName,
- PHANDLE pHandle, struct _MONITOR2 *pMonitor2);
- BOOL (WINAPI *pfnStartDocPort)(HANDLE hPort, LPWSTR pPrinterName,
- DWORD JobId, DWORD Level, LPBYTE pDocInfo);
- BOOL (WINAPI *pfnWritePort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
- LPDWORD pcbWritten);
- BOOL (WINAPI *pfnReadPort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
- LPDWORD pcbRead);
- BOOL (WINAPI *pfnEndDocPort)(HANDLE hPort);
- BOOL (WINAPI *pfnClosePort)(HANDLE hPort);
- BOOL (WINAPI *pfnAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
- BOOL (WINAPI *pfnAddPortEx)(LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
- LPWSTR lpMonitorName);
- BOOL (WINAPI *pfnConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
- BOOL (WINAPI *pfnDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
- BOOL (WINAPI *pfnGetPrinterDataFromPort)(HANDLE hPort, DWORD ControlID,
- LPWSTR pValueName, LPWSTR lpInBuffer, DWORD cbInBuffer,
- LPWSTR lpOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbReturned);
- BOOL (WINAPI *pfnSetPortTimeOuts)(HANDLE hPort, LPCOMMTIMEOUTS lpCTO,
- DWORD reserved);
- BOOL (WINAPI *pfnXcvOpenPort)(HANDLE hMonitor, LPCWSTR pszObject,
- ACCESS_MASK GrantedAccess, PHANDLE phXcv);
- DWORD (WINAPI *pfnXcvDataPort)(HANDLE hXcv, LPCWSTR pszDataName,
- PBYTE pInputData, DWORD cbInputData,
- PBYTE pOutputData, DWORD cbOutputData, PDWORD pcbOutputNeeded);
- BOOL (WINAPI *pfnXcvClosePort)(HANDLE hXcv);
- /* Additions from MONITOR to MONITOR2 */
- VOID (WINAPI *pfnShutdown)(HANDLE hMonitor);
- DWORD (WINAPI *pfnSendRecvBidiDataFromPort)(HANDLE hPort, DWORD dwAccessBit,
- LPCWSTR pAction, PBIDI_REQUEST_CONTAINER pReqData,
- PBIDI_RESPONSE_CONTAINER *ppResData);
-} MONITOR2, *LPMONITOR2, *PMONITOR2;
-
-typedef struct _MONITOREX {
- DWORD dwMonitorSize;
- MONITOR Monitor;
-} MONITOREX, *LPMONITOREX;
-
-typedef struct _MONITORREG {
- DWORD cbSize;
- LONG (WINAPI *fpCreateKey)(HANDLE hcKey, LPCWSTR pszSubKey, DWORD dwOptions,
- REGSAM samDesired, PSECURITY_ATTRIBUTES pSecurityAttributes,
- PHANDLE phckResult, PDWORD pdwDisposition, HANDLE hSpooler);
- LONG (WINAPI *fpOpenKey)(HANDLE hcKey, LPCWSTR pszSubKey, REGSAM samDesired,
- PHANDLE phkResult, HANDLE hSpooler);
- LONG (WINAPI *fpCloseKey)(HANDLE hcKey, HANDLE hSpooler);
- LONG (WINAPI *fpDeleteKey)(HANDLE hcKey, LPCWSTR pszSubKey, HANDLE hSpooler);
- LONG (WINAPI *fpEnumKey)(HANDLE hcKey, DWORD dwIndex, LPWSTR pszName,
- PDWORD pcchName, PFILETIME pftLastWriteTime, HANDLE hSpooler);
- LONG (WINAPI *fpQueryInfoKey)(HANDLE hcKey, PDWORD pcSubKeys, PDWORD pcbKey,
- PDWORD pcValues, PDWORD pcbValue, PDWORD pcbData,
- PDWORD pcbSecurityDescriptor, PFILETIME pftLastWriteTime,
- HANDLE hSpooler);
- LONG (WINAPI *fpSetValue)(HANDLE hcKey, LPCWSTR pszValue, DWORD dwType,
- const BYTE* pData, DWORD cbData, HANDLE hSpooler);
- LONG (WINAPI *fpDeleteValue)(HANDLE hcKey, LPCWSTR pszValue, HANDLE hSpooler);
- LONG (WINAPI *fpEnumValue)(HANDLE hcKey, DWORD dwIndex, LPWSTR pszValue,
- PDWORD pcbValue, PDWORD pType, PBYTE pData, PDWORD pcbData,
- HANDLE hSpooler);
- LONG (WINAPI *fpQueryValue)(HANDLE hcKey, LPCWSTR pszValue, PDWORD pType,
- PBYTE pData, PDWORD pcbData, HANDLE hSpooler);
-} MONITORREG, *PMONITORREG;
-
-typedef struct _MONITORINIT {
- DWORD cbSize;
- HANDLE hSpooler;
- HANDLE hckRegistryRoot;
- PMONITORREG pMonitorReg;
- BOOL bLocal;
-} MONITORINIT, *PMONITORINIT;
-
-typedef struct _MONITORUI {
- DWORD dwMonitorUISize;
- BOOL (WINAPI *pfnAddPortUI)(PCWSTR pszServer, HWND hWnd,
- PCWSTR pszPortNameIn, PWSTR *ppszPortNameOut);
- BOOL (WINAPI *pfnConfigurePortUI)(PCWSTR pName, HWND hWnd, PCWSTR pPortName);
- BOOL (WINAPI *pfnDeletePortUI)(PCWSTR pszServer, HWND hWnd, PCWSTR pszPortName);
-}MONITORUI, *PMONITORUI;
-
-typedef struct _PRINTER_NOTIFY_INIT {
- DWORD Size;
- DWORD Reserved;
- DWORD PollTime;
-} PRINTER_NOTIFY_INIT, *LPPRINTER_NOTIFY_INIT, *PPRINTER_NOTIFY_INIT;
-
-typedef struct _PRINTPROCESSOROPENDATA {
- PDEVMODEW pDevMode;
- LPWSTR pDatatype;
- LPWSTR pParameters;
- LPWSTR pDocumentName;
- DWORD JobId;
- LPWSTR pOutputFile;
- LPWSTR pPrinterName;
-} PRINTPROCESSOROPENDATA, *LPPRINTPROCESSOROPENDATA, *PPRINTPROCESSOROPENDATA;
-
-
-/*
- * WARNING: Many Functions are declared as "BOOL", but return ROUTER_*
- */
-
-typedef struct _PRINTPROVIDOR {
- BOOL (WINAPI *fpOpenPrinter)(LPWSTR lpPrinterName, HANDLE *phPrinter,
- LPPRINTER_DEFAULTSW pDefault);
- BOOL (WINAPI *fpSetJob)(HANDLE hPrinter, DWORD JobID, DWORD Level,
- LPBYTE pJob, DWORD Command);
- BOOL (WINAPI *fpGetJob)(HANDLE hPrinter, DWORD JobID, DWORD Level,
- LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded);
- BOOL (WINAPI *fpEnumJobs)(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs,
- DWORD Level, LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded,
- LPDWORD pcReturned);
- HANDLE (WINAPI *fpAddPrinter)(LPWSTR pName, DWORD Level, LPBYTE pPrinter);
- BOOL (WINAPI *fpDeletePrinter)(HANDLE hPrinter);
- BOOL (WINAPI *fpSetPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
- DWORD Command);
- BOOL (WINAPI *fpGetPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
- DWORD cbBuf, LPDWORD pcbNeeded);
- BOOL (WINAPI *fpEnumPrinters)(DWORD dwType, LPWSTR lpszName, DWORD dwLevel,
- LPBYTE lpbPrinters, DWORD cbBuf, LPDWORD lpdwNeeded,
- LPDWORD lpdwReturned);
- BOOL (WINAPI *fpAddPrinterDriver)(LPWSTR pName, DWORD Level,
- LPBYTE pDriverInfo);
- BOOL (WINAPI *fpEnumPrinterDrivers)(LPWSTR pName, LPWSTR pEnvironment,
- DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf,
- LPDWORD pcbNeeded, LPDWORD pcbReturned);
- BOOL (WINAPI *fpGetPrinterDriver)(HANDLE hPrinter, LPWSTR pEnvironment,
- DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf,
- LPDWORD pcbNeeded);
- BOOL (WINAPI *fpGetPrinterDriverDirectory)(LPWSTR pName, LPWSTR pEnvironment,
- DWORD Level, LPBYTE pDriverDirectory, DWORD cbBuf,
- LPDWORD pcbNeeded);
- BOOL (WINAPI *fpDeletePrinterDriver)(LPWSTR pName, LPWSTR pEnvironment,
- LPWSTR pDriverName);
- BOOL (WINAPI *fpAddPrintProcessor)(LPWSTR pName, LPWSTR pEnvironment,
- LPWSTR pPathName, LPWSTR pPrintProcessorName);
- BOOL (WINAPI *fpEnumPrintProcessors)(LPWSTR pName, LPWSTR pEnvironment,
- DWORD Level, LPBYTE pPrintProcessorInfo, DWORD cbBuf,
- LPDWORD pcbNeeded, LPDWORD pcbReturned);
- BOOL (WINAPI *fpGetPrintProcessorDirectory)(LPWSTR pName, LPWSTR pEnvironment,
- DWORD Level, LPBYTE pPrintProcessorInfo, DWORD cbBuf,
- LPDWORD pcbNeeded);
- BOOL (WINAPI *fpDeletePrintProcessor)(LPWSTR pName, LPWSTR pEnvironment,
- LPWSTR pPrintProcessorName);
- BOOL (WINAPI *fpEnumPrintProcessorDatatypes)(LPWSTR pName,
- LPWSTR pPrintProcessorName, DWORD Level, LPBYTE pDatatypes,
- DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcbReturned);
- DWORD (WINAPI *fpStartDocPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pDocInfo);
- BOOL (WINAPI *fpStartPagePrinter)(HANDLE hPrinter);
- BOOL (WINAPI *fpWritePrinter)(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf,
- LPDWORD pcWritten);
- BOOL (WINAPI *fpEndPagePrinter)(HANDLE hPrinter);
- BOOL (WINAPI *fpAbortPrinter)(HANDLE hPrinter);
- BOOL (WINAPI *fpReadPrinter)(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf,
- LPDWORD pNoBytesRead);
- BOOL (WINAPI *fpEndDocPrinter)(HANDLE hPrinter);
- BOOL (WINAPI *fpAddJob)(HANDLE hPrinter, DWORD Level, LPBYTE pData,
- DWORD cbBuf, LPDWORD pcbNeeded);
- BOOL (WINAPI *fpScheduleJob)(HANDLE hPrinter, DWORD JobID);
- DWORD (WINAPI *fpGetPrinterData)(HANDLE hPrinter, LPWSTR pValueName,
- LPDWORD pType, LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded);
- DWORD (WINAPI *fpSetPrinterData)(HANDLE hPrinter, LPWSTR pValueName,
- DWORD Type, LPBYTE pData, DWORD cbData);
- DWORD (WINAPI *fpWaitForPrinterChange)(HANDLE hPrinter, DWORD Flags);
- BOOL (WINAPI *fpClosePrinter)(HANDLE phPrinter);
- BOOL (WINAPI *fpAddForm)(HANDLE hPrinter, DWORD Level, LPBYTE pForm);
- BOOL (WINAPI *fpDeleteForm)(HANDLE hPrinter, LPWSTR pFormName);
- BOOL (WINAPI *fpGetForm)(HANDLE hPrinter, LPWSTR pFormName, DWORD Level,
- LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded);
- BOOL (WINAPI *fpSetForm)(HANDLE hPrinter, LPWSTR pFormName, DWORD Level,
- LPBYTE pForm);
- BOOL (WINAPI *fpEnumForms)(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
- DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
- BOOL (WINAPI *fpEnumMonitors)(LPWSTR pName, DWORD Level, LPBYTE pMonitors,
- DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
- BOOL (WINAPI *fpEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
- DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
- BOOL (WINAPI *fpAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
- BOOL (WINAPI *fpConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
- BOOL (WINAPI *fpDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
- HANDLE (WINAPI *fpCreatePrinterIC)(HANDLE hPrinter, LPDEVMODEW pDevMode);
- BOOL (WINAPI *fpPlayGdiScriptOnPrinterIC)(HANDLE hPrinterIC, LPBYTE pIn,
- DWORD cIn, LPBYTE pOut, DWORD cOut, DWORD ul);
- BOOL (WINAPI *fpDeletePrinterIC)(HANDLE hPrinterIC);
- BOOL (WINAPI *fpAddPrinterConnection)(LPWSTR pName);
- BOOL (WINAPI *fpDeletePrinterConnection)(LPWSTR pName);
- DWORD (WINAPI *fpPrinterMessageBox)(HANDLE hPrinter, DWORD Error, HWND hWnd,
- LPWSTR pText, LPWSTR pCaption, DWORD dwType);
- BOOL (WINAPI *fpAddMonitor)(LPWSTR pName, DWORD Level, LPBYTE pMonitors);
- BOOL (WINAPI *fpDeleteMonitor)(LPWSTR pName, LPWSTR pEnvironment,
- LPWSTR pMonitorName);
- BOOL (WINAPI *fpResetPrinter)(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault);
- BOOL (WINAPI *fpGetPrinterDriverEx)(HANDLE hPrinter, LPWSTR pEnvironment,
- DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf, LPDWORD pcbNeeded,
- DWORD dwClientMajorVersion, DWORD dwClientMinorVersion,
- PDWORD pdwServerMajorVersion, PDWORD pdwServerMinorVersion);
- HANDLE (WINAPI *fpFindFirstPrinterChangeNotification)(HANDLE hPrinter,
- DWORD fdwFlags, DWORD fdwOptions, LPVOID pPrinterNotifyOptions);
- BOOL (WINAPI *fpFindClosePrinterChangeNotification)(HANDLE hChange);
- BOOL (WINAPI *fpAddPortEx)(HANDLE hMonitor, LPWSTR pName, DWORD Level,
- LPBYTE lpBuffer, LPWSTR lpMonitorName);
- BOOL (WINAPI *fpShutDown)(LPVOID pvReserved);
- BOOL (WINAPI *fpRefreshPrinterChangeNotification)(HANDLE hPrinter,
- DWORD Reserved, PVOID pvReserved, PVOID pPrinterNotifyInfo);
- BOOL (WINAPI *fpOpenPrinterEx)(LPWSTR pPrinterName, LPHANDLE phPrinter,
- LPPRINTER_DEFAULTSW pDefault, LPBYTE pClientInfo, DWORD Level);
- HANDLE (WINAPI *fpAddPrinterEx)(LPWSTR pName, DWORD Level, LPBYTE pPrinter,
- LPBYTE pClientInfo, DWORD ClientInfoLevel);
- BOOL (WINAPI *fpSetPort)(LPWSTR pName, LPWSTR pPortName, DWORD dwLevel,
- LPBYTE pPortInfo);
- DWORD (WINAPI *fpEnumPrinterData)( HANDLE hPrinter, DWORD dwIndex,
- LPWSTR pValueName, DWORD cbValueName, LPDWORD pcbValueName,
- LPDWORD pType, LPBYTE pData, DWORD cbData, LPDWORD pcbData);
- DWORD (WINAPI *fpDeletePrinterData)(HANDLE hPrinter, LPWSTR pValueName);
- DWORD (WINAPI *fpClusterSplOpen)(LPCWSTR pszServer, LPCWSTR pszResource,
- PHANDLE phSpooler, LPCWSTR pszName, LPCWSTR pszAddress);
- DWORD (WINAPI *fpClusterSplClose)(HANDLE hSpooler);
- DWORD (WINAPI *fpClusterSplIsAlive)(HANDLE hSpooler);
- DWORD (WINAPI *fpSetPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
- LPCWSTR pValueName, DWORD Type, LPBYTE pData, DWORD cbData);
- DWORD (WINAPI *fpGetPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
- LPCWSTR pValueName, LPDWORD pType, LPBYTE pData, DWORD nSize,
- LPDWORD pcbNeeded);
- DWORD (WINAPI *fpEnumPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
- LPBYTE pEnumValues, DWORD cbEnumValues, LPDWORD pcbEnumValues,
- LPDWORD pnEnumValues);
- DWORD (WINAPI *fpEnumPrinterKey)(HANDLE hPrinter, LPCWSTR pKeyName,
- LPWSTR pSubkey, DWORD cbSubkey, LPDWORD pcbSubkey);
- DWORD (WINAPI *fpDeletePrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
- LPCWSTR pValueName);
- DWORD (WINAPI *fpDeletePrinterKey)(HANDLE hPrinter, LPCWSTR pKeyName);
- BOOL (WINAPI *fpSeekPrinter)(HANDLE hPrinter, LARGE_INTEGER liDistanceToMove,
- PLARGE_INTEGER pliNewPointer, DWORD dwMoveMethod, BOOL bWrite);
- BOOL (WINAPI *fpDeletePrinterDriverEx)(LPWSTR pName, LPWSTR pEnvironment,
- LPWSTR pDriverName, DWORD dwDeleteFlag, DWORD dwVersionNum);
- BOOL (WINAPI *fpAddPerMachineConnection)(LPCWSTR pServer,
- LPCWSTR pPrinterName, LPCWSTR pPrintServer, LPCWSTR pProvider);
- BOOL (WINAPI *fpDeletePerMachineConnection)(LPCWSTR pServer,
- LPCWSTR pPrinterName);
- BOOL (WINAPI *fpEnumPerMachineConnections)(LPCWSTR pServer,
- LPBYTE pPrinterEnum, DWORD cbBuf, LPDWORD pcbNeeded,
- LPDWORD pcReturned);
- BOOL (WINAPI *fpXcvData)(HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
- DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData,
- PDWORD pcbOutputNeeded, PDWORD pdwStatus);
- BOOL (WINAPI *fpAddPrinterDriverEx)(LPWSTR pName, DWORD Level,
- LPBYTE pDriverInfo, DWORD dwFileCopyFlags);
- BOOL (WINAPI *fpSplReadPrinter)(HANDLE hPrinter, LPBYTE *pBuf, DWORD cbBuf);
- BOOL (WINAPI *fpDriverUnloadComplete)(LPWSTR pDriverFile);
- BOOL (WINAPI *fpGetSpoolFileInfo)(HANDLE hPrinter, LPWSTR *pSpoolDir,
- LPHANDLE phFile, HANDLE hSpoolerProcess, HANDLE hAppProcess);
- BOOL (WINAPI *fpCommitSpoolData)(HANDLE hPrinter, DWORD cbCommit);
- BOOL (WINAPI *fpCloseSpoolFileHandle)(HANDLE hPrinter);
- BOOL (WINAPI *fpFlushPrinter)(HANDLE hPrinter, LPBYTE pBuf, DWORD cbBuf,
- LPDWORD pcWritten, DWORD cSleep);
- DWORD (WINAPI *fpSendRecvBidiData)(HANDLE hPort, LPCWSTR pAction,
- LPBIDI_REQUEST_CONTAINER pReqData,
- LPBIDI_RESPONSE_CONTAINER *ppResData);
- BOOL (WINAPI *fpAddDriverCatalog)(HANDLE hPrinter, DWORD dwLevel,
- VOID *pvDriverInfCatInfo, DWORD dwCatalogCopyFlags);
-} PRINTPROVIDOR, *LPPRINTPROVIDOR;
-
-typedef struct _SPLCLIENT_INFO_1 {
- DWORD dwSize;
- LPWSTR pMachineName;
- LPWSTR pUserName;
- DWORD dwBuildNum;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- WORD wProcessorArchitecture;
-} SPLCLIENT_INFO_1, *LPSPLCLIENT_INFO_1, *PSPLCLIENT_INFO_1;
-
-/* DECLARATIONS */
-
-HANDLE WINAPI CreatePrinterIC(HANDLE hPrinter, LPDEVMODEW pDevMode);
-BOOL WINAPI PlayGdiScriptOnPrinterIC(HANDLE hPrinterIC, LPBYTE pIn,
- DWORD cIn, LPBYTE pOut, DWORD cOut, DWORD ul);
-BOOL WINAPI DeletePrinterIC(HANDLE hPrinterIC);
-BOOL WINAPI DevQueryPrint(HANDLE hPrinter, LPDEVMODEW pDevMode, DWORD *pResID);
-
-/* Security and Access */
-HANDLE WINAPI RevertToPrinterSelf(VOID);
-BOOL WINAPI ImpersonatePrinterClient(HANDLE hToken);
-BOOL WINAPI OpenPrinterToken(PHANDLE phToken);
-BOOL WINAPI SetPrinterToken(HANDLE hToken);
-BOOL WINAPI ClosePrinterToken(HANDLE hToken);
-
-/* Notification */
-BOOL WINAPI ReplyPrinterChangeNotification(HANDLE hNotify, DWORD fdwFlags,
- PDWORD pdwResult, PVOID pPrinterNotifyInfo);
-BOOL WINAPI PartialReplyPrinterChangeNotification(HANDLE hNotify,
- PPRINTER_NOTIFY_INFO_DATA pInfoDataSrc);
-PPRINTER_NOTIFY_INFO RouterAllocPrinterNotifyInfo(DWORD cPrinterNotifyInfoData);
-BOOL WINAPI RouterFreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO pInfo);
-BOOL WINAPI AppendPrinterNotifyInfoData(PPRINTER_NOTIFY_INFO pInfoDest,
- PPRINTER_NOTIFY_INFO_DATA pInfoDataSrc, DWORD fdwFlags);
-DWORD WINAPI CallRouterFindFirstPrinterChangeNotification(HANDLE hPrinter,
- DWORD fdwFlags, DWORD fdwOptions, HANDLE hNotify, PVOID pvReserved);
-
-/* Port monitor / Language monitor / Print monitor */
-LPMONITOR2 WINAPI InitializePrintMonitor2(PMONITORINIT pMonitorInit,
- PHANDLE phMonitor);
-PMONITORUI WINAPI InitializePrintMonitorUI(VOID);
-LPMONITOREX WINAPI InitializePrintMonitor(LPWSTR pRegistryRoot);
-BOOL WINAPI InitializeMonitorEx(LPWSTR pRegistryRoot, LPMONITOR pMonitor);
-BOOL WINAPI InitializeMonitor(LPWSTR pRegistryRoot);
-
-BOOL WINAPI OpenPort(LPWSTR pName, PHANDLE pHandle);
-BOOL WINAPI WritePort(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
- LPDWORD pcbWritten);
-BOOL WINAPI ReadPort(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
- LPDWORD pcbRead);
-BOOL WINAPI ClosePort(HANDLE hPort);
-
-/* Print processor */
-HANDLE WINAPI OpenPrintProcessor(LPWSTR pPrinterName,
- PPRINTPROCESSOROPENDATA pPrintProcessorOpenData);
-BOOL WINAPI PrintDocumentOnPrintProcessor(HANDLE hPrintProcessor,
- LPWSTR pDocumentName);
-BOOL WINAPI ClosePrintProcessor(HANDLE hPrintProcessor);
-BOOL WINAPI ControlPrintProcessor(HANDLE hPrintProcessor, DWORD Command);
-BOOL WINAPI InstallPrintProcessor(HWND hWnd);
-
-/* Print provider */
-BOOL WINAPI InitializePrintProvidor(LPPRINTPROVIDOR pPrintProvidor,
- DWORD cbPrintProvidor, LPWSTR pFullRegistryPath);
-BOOL WINAPI ProvidorFindFirstPrinterChangeNotification(HANDLE hPrinter,
- DWORD fdwFlags, DWORD fdwOptions, HANDLE hNotify,
- PVOID pvReserved0, PVOID pvReserved1);
-BOOL WINAPI ProvidorFindClosePrinterChangeNotification(HANDLE hPrinter);
-
-/* Spooler */
-BOOL WINAPI SpoolerFindFirstPrinterChangeNotification(HANDLE hPrinter,
- DWORD fdwFlags, DWORD fdwOptions, PHANDLE phEvent,
- PVOID pPrinterNotifyOptions, PVOID pvReserved);
-BOOL WINAPI SpoolerFindNextPrinterChangeNotification(HANDLE hPrinter,
- LPDWORD pfdwChange, PVOID pvReserved0, PVOID ppPrinterNotifyInfo);
-VOID WINAPI SpoolerFreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO pInfo);
-BOOL WINAPI SpoolerFindClosePrinterChangeNotification(HANDLE hPrinter);
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* _WINSPLP_ */
diff --git a/include/ddk/wmidata.h b/include/ddk/wmidata.h
new file mode 100644
index 00000000000..4c72b31a8a5
--- /dev/null
+++ b/include/ddk/wmidata.h
@@ -0,0 +1,6746 @@
+#pragma once
+
+#define AGP_WMI_STD_DATA_GUID {0x8c27fbed,0x1c7b,0x47e4, {0xa6,0x49,0x0e,0x38,0x9d,0x3a,0xda,0x4f}}
+#define DATA_PROVIDER_PNPID_GUID {0xc7bf35d2,0xaadb,0x11d1, {0xbf,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define DATA_PROVIDER_PNPID_INSTANCE_NAMES_GUID {0xc7bf35d3,0xaadb,0x11d1, {0xbf,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define DEVICE_UI_FIRMWARE_REVISION_GUID {0x4504b1d4,0xc5ee,0x4df6, {0x95,0x1f,0x16,0x18,0x0e,0x3d,0xd8,0x15}}
+#define FrequencyRangeDescriptorGuid {0xf4546078,0xf3b2,0x417e, {0x94,0xcd,0x47,0xea,0x30,0x6c,0x57,0x51}}
+#define GUID_REDBOOK_WMI_PERF_DATA {0xb90550e8,0xae0a,0x11d1, {0xa5,0x71,0x00,0xc0,0x4f,0xa3,0x47,0x30}}
+#define GUID_REDBOOK_WMI_STD_DATA {0xb90550e7,0xae0a,0x11d1, {0xa5,0x71,0x00,0xc0,0x4f,0xa3,0x47,0x30}}
+#define IdleAccountingExGuid {0xd67abd39,0x81f8,0x4a5e, {0x81,0x52,0x72,0xe3,0x1e,0xc9,0x12,0xee}}
+#define IdleAccountingGuid {0xe2a26f78,0xae07,0x4ee0, {0xa3,0x0f,0xce,0x35,0x4f,0x5a,0x94,0xcd}}
+#define IdleStateAccountingExGuid {0x3e0d7b2c,0x401b,0x480f, {0x83,0x03,0xd0,0xc2,0x0e,0xa1,0xa7,0xd8}}
+#define IdleStateAccountingGuid {0x5280028a,0xc24f,0x43ec, {0xb2,0x7d,0xa9,0x60,0xa7,0x0e,0x31,0x9a}}
+#define IdleStateBucketExGuid {0xe53e0a7d,0x36f0,0x4a77, {0x87,0x9e,0x9c,0x6b,0x5e,0x4a,0x85,0x54}}
+#define KEYBOARD_PORT_WMI_EXTENDED_ID {0x6ac4e23d,0xa950,0x4518, {0x8b,0x2b,0xaa,0x4d,0xcd,0x5f,0xe1,0x4a}}
+#define KEYBOARD_PORT_WMI_STD_DATA_GUID {0x4731f89a,0x71cb,0x11d1, {0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define KernelIdleStateChangeGuid {0x4838fe4f,0xf71c,0x4e51, {0x9e,0xcc,0x84,0x30,0xa7,0xac,0x4c,0x6c}}
+#define KernelIdleStateGuid {0x46bdcf4a,0xe076,0x4550, {0x82,0xb2,0x9f,0x32,0xed,0xed,0x3e,0x7f}}
+#define KernelIdleStatesGuid {0xba138e10,0xe250,0x4ad7, {0x86,0x16,0xcf,0x1a,0x7a,0xd4,0x10,0xe7}}
+#define KernelPerfStateChangeGuid {0xa5b32ddd,0x7f39,0x4abc, {0xb8,0x92,0x90,0x0e,0x43,0xb5,0x9e,0xbb}}
+#define KernelPerfStateDomainChangeGuid {0x995e6b7f,0xd653,0x497a, {0xb9,0x78,0x36,0xa3,0x0c,0x29,0xbf,0x01}}
+#define KernelPerfStateGuid {0x8c7980e1,0xf62b,0x419e, {0xaa,0x82,0x27,0x6c,0x8d,0x06,0x4a,0x1f}}
+#define KernelPerfStatesGuid {0x5708cc20,0x7d40,0x4bf4, {0xb4,0xaa,0x2b,0x01,0x33,0x8d,0x01,0x26}}
+#define KernelThermalConstraintChangeGuid {0xa852c2c8,0x1a4c,0x423b, {0x8c,0x2c,0xf3,0x0d,0x82,0x93,0x1a,0x88}}
+#define KernelThermalPolicyChangeGuid {0xaca5a8f7,0x96ca,0x4397, {0xba,0xde,0x43,0xbe,0x2f,0x57,0x7d,0x51}}
+#define MSAcpiInfoGuid {0x5daf38ae,0xf6f8,0x4d90, {0x81,0x99,0xeb,0xde,0x68,0x00,0xec,0x3b}}
+#define MSAcpi_ThermalZoneTemperatureGuid {0xa1bc18c0,0xa7c8,0x11d1, {0xbf,0x3c,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSDiskDriver_GeometryGuid {0x25007f51,0x57c2,0x11d1, {0xa5,0x28,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSDiskDriver_PerformanceDataGuid {0xbdd865d2,0xd7c1,0x11d0, {0xa5,0x01,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSDiskDriver_PerformanceGuid {0xbdd865d1,0xd7c1,0x11d0, {0xa5,0x01,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSIde_PortDeviceInfoGuid {0x53f5630f,0xb6bf,0x11d0, {0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b}}
+#define MSKeyboard_ClassInformationGuid {0x4731f899,0x71cb,0x11d1, {0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSMCAEvent_BusErrorGuid {0x1ee17050,0x0039,0x40f7, {0x9e,0xad,0x14,0xad,0x51,0x61,0x2c,0xb2}}
+#define MSMCAEvent_CPUErrorGuid {0x5ce27cde,0xd179,0x4c68, {0x93,0x7f,0xa0,0x7b,0x8c,0xc2,0xea,0x39}}
+#define MSMCAEvent_HeaderGuid {0x6381c27f,0xc8fa,0x4da7, {0x89,0x53,0xb8,0x68,0x33,0x73,0x6e,0x15}}
+#define MSMCAEvent_InvalidErrorGuid {0x477b769b,0x785c,0x48dd, {0xa0,0x2e,0x57,0xe0,0x51,0xbe,0x7b,0x85}}
+#define MSMCAEvent_MemoryErrorGuid {0x433eea38,0xc1a7,0x48f1, {0x88,0x4f,0xb6,0x87,0x5f,0x17,0x6c,0xc7}}
+#define MSMCAEvent_MemoryHierarchyErrorGuid {0xcede75a0,0xa77f,0x452b, {0x8f,0x2f,0x54,0x1f,0x92,0x6d,0xb0,0xf9}}
+#define MSMCAEvent_MemoryPageRemovedGuid {0x84e9ddb6,0xe233,0x4dfc, {0x98,0x8c,0x74,0x12,0xc8,0x75,0x4f,0xec}}
+#define MSMCAEvent_PCIBusErrorGuid {0xa14a5594,0x25de,0x410e, {0x9b,0x92,0x80,0xf0,0x80,0x1a,0xec,0x07}}
+#define MSMCAEvent_PCIComponentErrorGuid {0x805caf4e,0x336c,0x4eb2, {0x8c,0x0c,0x02,0xf3,0x51,0xcb,0xf1,0x3c}}
+#define MSMCAEvent_PlatformSpecificErrorGuid {0x2d2434aa,0xef83,0x4200, {0xba,0x24,0xde,0x36,0x6c,0x41,0x5f,0x7b}}
+#define MSMCAEvent_SMBIOSErrorGuid {0x4184df1b,0xedfe,0x406b, {0xb1,0x72,0x54,0xc9,0x1f,0xbd,0x9b,0xaf}}
+#define MSMCAEvent_SwitchToCMCPollingGuid {0x39c14290,0xf036,0x4999, {0xb8,0xa1,0xb6,0xf8,0x71,0xfb,0x32,0x9e}}
+#define MSMCAEvent_SwitchToCPEPollingGuid {0xd5c870ce,0x4ed0,0x4fdc, {0xbb,0x54,0x8b,0x45,0x2c,0x18,0x79,0x7e}}
+#define MSMCAEvent_SystemEventErrorGuid {0xbdba4b12,0x8d00,0x4570, {0xb9,0xb2,0x3f,0xde,0xcf,0x1d,0x56,0x61}}
+#define MSMCAEvent_TLBErrorGuid {0xb161eeab,0xac03,0x4c2b, {0xae,0x7a,0x5a,0x37,0x68,0xf7,0x0e,0x85}}
+#define MSMCAInfo_EntryGuid {0x9e77a308,0x6b82,0x4fc1, {0xab,0x41,0x0a,0x55,0x86,0x7c,0x35,0xc2}}
+#define MSMCAInfo_RawCMCEventGuid {0x2f1a8a9d,0x7988,0x457f, {0xa1,0x7a,0x89,0x79,0xe8,0x20,0x43,0xc5}}
+#define MSMCAInfo_RawCorrectedPlatformEventGuid {0x6b629d5e,0xe63c,0x48a3, {0x9e,0xbb,0x97,0x42,0x27,0x07,0x52,0x65}}
+#define MSMCAInfo_RawMCADataGuid {0x23602a8a,0xdadd,0x462f, {0x9a,0xe5,0x30,0xfa,0x2c,0x37,0xdd,0x5b}}
+#define MSMCAInfo_RawMCAEventGuid {0x2f1a8a9f,0x7988,0x457f, {0xa1,0x7a,0x89,0x79,0xe8,0x20,0x43,0xc5}}
+#define MSMouse_ClassInformationGuid {0x4731f89b,0x71cb,0x11d1, {0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSNdis_80211_AddWEPGuid {0x4307bff0,0x2129,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_AuthenticationModeGuid {0x43920a24,0x2129,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_BSSIListGuid {0x69526f9a,0x2062,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_BaseServiceSetIdentifierGuid {0x2504b6c2,0x1fa5,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_BssIdListScanGuid {0x0d9e01e1,0xba70,0x11d4, {0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37}}
+#define MSNdis_80211_ConfigurationFHGuid {0x4a800b8c,0x2068,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ConfigurationGuid {0x4a4df982,0x2068,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ConfigurationInfoGuid {0x220c16fc,0xb9a8,0x11d4, {0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37}}
+#define MSNdis_80211_DataRatesGuid {0x49db8722,0x2068,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_DesiredDataRatesGuid {0x452ee08e,0x2536,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_DisassociateGuid {0x43671f40,0x2129,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_FragmentationThresholdGuid {0x69aaa7c4,0x2062,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_InfrastructureModeGuid {0x697d5a7e,0x2062,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_NetworkInfrastructureGuid {0x34e1fa48,0xb9b6,0x11d4, {0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37}}
+#define MSNdis_80211_NetworkTypeGuid {0xe779ab61,0xb9ab,0x11d4, {0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37}}
+#define MSNdis_80211_NetworkTypeInUseGuid {0x857e2326,0x2041,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_NetworkTypesSupportedGuid {0x8531d6e6,0x2041,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_NumberOfAntennasGuid {0x01779336,0x2064,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_PowerModeGuid {0x85be837c,0x2041,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_PrivacyFilterGuid {0x6733c4e9,0x4792,0x11d4, {0x97,0xf1,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_RTSThresholdGuid {0x0134d07e,0x2064,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ReceiveAntennaSelectedGuid {0x01ac07a2,0x2064,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ReceivedSignalStrengthEventTriggerGuid {0x155689b8,0x2053,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ReceivedSignalStrengthGuid {0x1507db16,0x2053,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ReloadDefaultsGuid {0x748b14e8,0x32ee,0x4425, {0xb9,0x1b,0xc9,0x84,0x8c,0x58,0xb5,0x5a}}
+#define MSNdis_80211_RemoveWEPGuid {0x433c345c,0x2129,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_ServiceSetIdentifierGuid {0x7d2a90ea,0x2041,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_StatisticsGuid {0x42bb73b0,0x2129,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_TransmitAntennaSelectedGuid {0x01dbb74a,0x2064,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_TransmitPowerLevelGuid {0x11e6ba76,0x2053,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_80211_WEPStatusGuid {0xb027a21f,0x3cfa,0x4125, {0x80,0x0b,0x3f,0x7a,0x18,0xfd,0xdc,0xdc}}
+#define MSNdis_80211_WLanBssIdGuid {0x6929e718,0x2062,0x11d4, {0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03}}
+#define MSNdis_AtmHardwareCurrentAddressGuid {0x791ad1a1,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxAal0PacketSizeGuid {0x791ad1a5,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxAal1PacketSizeGuid {0x791ad1a6,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxAal34PacketSizeGuid {0x791ad1a7,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxAal5PacketSizeGuid {0x791ad191,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxActiveVciBitsGuid {0x791ad1a3,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxActiveVcsGuid {0x791ad1a2,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmMaxActiveVpiBitsGuid {0x791ad1a4,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmReceiveCellsDroppedGuid {0x0a21480c,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmReceiveCellsOkGuid {0x0a21480a,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmSupportedAalTypesGuid {0x791ad1a0,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmSupportedServiceCategoryGuid {0x791ad19f,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmSupportedVcRatesGuid {0x791ad19e,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_AtmTransmitCellsOkGuid {0x0a21480b,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoDriverVersionGuid {0x791ad198,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoHardwareStatusGuid {0x791ad192,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoLinkSpeedGuid {0x791ad195,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoMacOptionsGuid {0x791ad19a,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoMediaConnectStatusGuid {0x791ad19b,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoMediaInUseGuid {0x791ad194,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoMediaSupportedGuid {0x791ad193,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoMinimumLinkSpeedGuid {0x791ad19d,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoReceivePduErrorsGuid {0x0a214808,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoReceivePdusNoBufferGuid {0x0a214809,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoReceivePdusOkGuid {0x0a214806,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoTransmitPduErrorsGuid {0x0a214807,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoTransmitPdusOkGuid {0x0a214805,0xe35f,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoVendorDescriptionGuid {0x791ad197,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoVendorDriverVersionGuid {0x791ad19c,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CoVendorIdGuid {0x791ad196,0xe35c,0x11d0, {0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CountedStringGuid {0x146360a5,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_CurrentLookaheadGuid {0x5ec10361,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_CurrentPacketFilterGuid {0x5ec10360,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_DeviceWakeOnMagicPacketOnlyGuid {0xa14f1c97,0x8839,0x4f8a, {0x99,0x96,0xa2,0x89,0x96,0xeb,0xbf,0x1d}}
+#define MSNdis_DriverVersionGuid {0x5ec10362,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EnumerateAdapterExGuid {0x16716917,0x4306,0x4be4, {0x9b,0x5a,0x38,0x09,0xae,0x44,0xb1,0x25}}
+#define MSNdis_EnumerateAdapterGuid {0x981f2d7f,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EnumeratePortsGuid {0xf1d6abe8,0x15e4,0x4407, {0x81,0xb7,0x6b,0x83,0x0c,0x77,0x7c,0xd9}}
+#define MSNdis_EnumerateReceiveFiltersGuid {0x3f2c141d,0x83bc,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_EnumerateReceiveQueuesGuid {0x3f2c141b,0x83bc,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_EthernetCurrentAddressGuid {0x44795700,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetMacOptionsGuid {0x44795703,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetMaximumMulticastListSizeGuid {0x44795702,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetMoreTransmitCollisionsGuid {0x44795706,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetMulticastListGuid {0x44795701,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetOneTransmitCollisionGuid {0x44795705,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetPermanentAddressGuid {0x447956ff,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_EthernetReceiveErrorAlignmentGuid {0x44795704,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiAttachmentTypeGuid {0xacf1403d,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiDownstreamNodeLongGuid {0xacf1403f,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiFrameErrorsGuid {0xacf14040,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiFramesLostGuid {0xacf14041,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLConnectionStateGuid {0xacf14045,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLctFailuresGuid {0xacf14043,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLemRejectsGuid {0xacf14044,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLongCurrentAddressGuid {0xacf14036,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLongMaximumListSizeGuid {0xacf14038,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLongMulticastListGuid {0xacf14037,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiLongPermanentAddressGuid {0xacf14035,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiRingManagmentStateGuid {0xacf14042,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiShortCurrentAddressGuid {0xacf1403a,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiShortMaximumListSizeGuid {0xacf1403c,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiShortMulticastListGuid {0xacf1403b,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiShortPermanentAddressGuid {0xacf14039,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_FddiUpstreamNodeLongGuid {0xacf1403e,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_GroupAffinityGuid {0xf786fbd5,0xc049,0x11dd, {0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_HDSplitCurrentConfigGuid {0x81d1303c,0xab00,0x4e49, {0x80,0xb1,0x5e,0x6e,0x0b,0xf9,0xbe,0x53}}
+#define MSNdis_HDSplitParametersGuid {0x1131c56a,0x0a5a,0x4d79, {0x8d,0xde,0x1e,0x6f,0x17,0x80,0x05,0xee}}
+#define MSNdis_HardwareStatusGuid {0x5ec10354,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_InterruptModerationParametersGuid {0x09f58643,0x31fb,0x45b5, {0x85,0x2b,0x09,0xb4,0xd3,0xff,0x37,0x65}}
+#define MSNdis_LinkParametersGuid {0x29380131,0xa312,0x4400, {0xbe,0x0c,0x53,0x87,0x7a,0x41,0xc4,0x65}}
+#define MSNdis_LinkSpeedGuid {0x5ec10359,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_LinkStateDataGuid {0x5b26b94f,0x0272,0x4d4c, {0x87,0x44,0xbd,0x84,0xbe,0x42,0x1f,0x3b}}
+#define MSNdis_LinkStateGuid {0xba1f4c14,0xa945,0x4762, {0xb9,0x16,0x0b,0x55,0x15,0xb6,0xf4,0x3a}}
+#define MSNdis_MacOptionsGuid {0x5ec10365,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MaximumFrameSizeGuid {0x5ec10358,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MaximumLookaheadGuid {0x5ec10357,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MaximumSendPacketsGuid {0x5ec10367,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MaximumTotalSizeGuid {0x5ec10363,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MediaConnectStatusGuid {0x5ec10366,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MediaInUseGuid {0x5ec10356,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_MediaSupportedGuid {0x5ec10355,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_NdisEnumerateVcGuid {0x981f2d82,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_NetworkAddressGuid {0xb5bd98b7,0x0201,0x11d1, {0xa5,0x0e,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSNdis_NetworkLinkSpeedGuid {0x60fc6b57,0x0f66,0x11d1, {0x96,0xa7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_NetworkShortAddressGuid {0xb5bd98b8,0x0201,0x11d1, {0xa5,0x0e,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSNdis_NicSwitchCapabilitiesGuid {0xdb80dd1c,0x59ae,0x48e7, {0xb7,0xec,0xf9,0xbe,0x2c,0x4b,0x8c,0xb0}}
+#define MSNdis_NotifyAdapterArrivalGuid {0x981f2d81,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_NotifyAdapterRemovalGuid {0x981f2d80,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_NotifyFilterArrivalGuid {0x0b6d3c89,0x5917,0x43ca, {0xb5,0x78,0xd0,0x1a,0x79,0x67,0xc4,0x1c}}
+#define MSNdis_NotifyFilterRemovalGuid {0x1f177cd9,0x5955,0x4721, {0x9f,0x6a,0x78,0xeb,0xdf,0xae,0xf8,0x89}}
+#define MSNdis_NotifyVcArrivalGuid {0x182f9e0c,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_NotifyVcRemovalGuid {0x981f2d79,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_ObjectHeaderGuid {0x2b1831b2,0x2216,0x4ede, {0xa4,0x69,0x9f,0xe3,0xdd,0x6d,0x5a,0x7e}}
+#define MSNdis_PMAdminConfigGuid {0x1528d111,0x708a,0x4ca4, {0x92,0x15,0xc0,0x57,0x71,0x16,0x1c,0xda}}
+#define MSNdis_PMAdminConfigParamGuid {0x492dc449,0x13d9,0x4bd6, {0x89,0xd4,0x96,0xe3,0x53,0x4e,0x6a,0x05}}
+#define MSNdis_PMAdminConfigStateGuid {0x0cffd0fc,0x8333,0x4000, {0x9a,0x3b,0x20,0x07,0x35,0xd6,0x98,0xf9}}
+#define MSNdis_PMCapabilitiesGuid {0xb2cf76e3,0xb3ae,0x4394, {0xa0,0x1f,0x33,0x8c,0x98,0x70,0xe9,0x39}}
+#define MSNdis_PMCapabilitiesParamGuid {0xcccb122d,0xd5c4,0x4ee1, {0x80,0x01,0xb8,0xad,0x6d,0x3c,0xe8,0x76}}
+#define MSNdis_PMCapabilityStateGuid {0xc1cc6857,0x1a26,0x4f6d, {0xab,0x98,0x29,0x1f,0x0c,0x3b,0xbd,0x4c}}
+#define MSNdis_PciDevicePropertyGuid {0x0573f70f,0xded8,0x401c, {0x8b,0x56,0xa6,0x2b,0xb5,0x28,0xc0,0xe2}}
+#define MSNdis_PhysicalMediumTypeGuid {0x418ca16d,0x3937,0x4208, {0x94,0x0a,0xec,0x61,0x96,0x27,0x80,0x85}}
+#define MSNdis_PortArrayGuid {0x0fee8708,0xdf65,0x456e, {0xb4,0xca,0xfa,0x62,0x32,0x66,0xa1,0x2a}}
+#define MSNdis_PortAuthParametersGuid {0x5c3bda24,0x8b64,0x4829, {0xa5,0x87,0x8c,0xe7,0x19,0x15,0x2f,0xe2}}
+#define MSNdis_PortCharGuid {0xf5b7d202,0xe594,0x4aa3, {0xbe,0x43,0x49,0x76,0x83,0x3c,0x78,0x40}}
+#define MSNdis_PortStateDataGuid {0x8feae2c6,0xee28,0x469f, {0x8b,0x5d,0x9f,0x74,0x3b,0xab,0x21,0xaa}}
+#define MSNdis_QueryInterruptModerationGuid {0xd9c8eea5,0xf16e,0x467c, {0x84,0xd5,0x63,0x45,0xa2,0x2c,0xe2,0x13}}
+#define MSNdis_QueryNicSwitchCurrentCapabilitiesGuid {0xe76fdaf3,0x0be7,0x4d95, {0x87,0xe9,0x5a,0xea,0xd4,0xb5,0x90,0xe9}}
+#define MSNdis_QueryNicSwitchHardwareCapabilitiesGuid {0x37cab40c,0xd1e8,0x4301, {0x8c,0x1d,0x58,0x46,0x5e,0x0c,0x4c,0x0f}}
+#define MSNdis_QueryPciDeviceCustomPropertyGuid {0xaa39f5ab,0xe260,0x4d01, {0x82,0xb0,0xb7,0x37,0xc8,0x80,0xea,0x05}}
+#define MSNdis_QueryPhysicalMediumTypeExGuid {0x899e7782,0x035b,0x43f9, {0x8b,0xb6,0x2b,0x58,0x97,0x16,0x12,0xe5}}
+#define MSNdis_QueryPortStateGuid {0x6fbf2a5f,0x8b8f,0x4920, {0x81,0x43,0xe6,0xc4,0x60,0xf5,0x25,0x24}}
+#define MSNdis_QueryReceiveFilterCurrentCapabilitiesGuid {0x4054e80f,0x2bc1,0x4ccc, {0xb0,0x33,0x4a,0xbc,0x0c,0x4a,0x1e,0x8c}}
+#define MSNdis_QueryReceiveFilterGlobalParametersGuid {0x3f2c141a,0x83bc,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_QueryReceiveFilterHardwareCapabilitiesGuid {0x3f2c1419,0x83bc,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_QueryReceiveFilterParametersGuid {0x3f2c141e,0x83bc,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_QueryReceiveQueueParametersGuid {0x3f2c141c,0x83bc,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_QueryStatisticsInfoGuid {0x368c45b5,0xc129,0x43c1, {0x93,0x9e,0x7e,0xdc,0x2d,0x7f,0xe6,0x21}}
+#define MSNdis_RSSEnabledGuid {0x9565cd55,0x3402,0x4e32, {0xa5,0xb6,0x2f,0x14,0x3f,0x2f,0x2c,0x30}}
+#define MSNdis_ReceiveBlockSizeGuid {0x5ec1035d,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_ReceiveBufferSpaceGuid {0x5ec1035b,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_ReceiveErrorGuid {0x447956fd,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_ReceiveFilterCapabilitiesGuid {0x146360a3,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveFilterFieldParametersGuid {0x146360ab,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveFilterGlobalParametersGuid {0x146360a4,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveFilterInfoArrayGuid {0x146360aa,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveFilterInfoGuid {0x146360a9,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveFilterParametersGuid {0x146360ac,0x88dd,0x11dd, {0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveNoBufferGuid {0x447956fe,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_ReceiveQueueInfoArrayGuid {0xf786fbd8,0xc049,0x11dd, {0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveQueueInfoGuid {0xf786fbd7,0xc049,0x11dd, {0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveQueueParametersGuid {0xf786fbd6,0xc049,0x11dd, {0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3}}
+#define MSNdis_ReceiveScaleCapabilitiesGuid {0x26c28774,0x4252,0x48fe, {0xa6,0x10,0xa5,0x8a,0x39,0x8c,0x0e,0xb1}}
+#define MSNdis_ReceivesOkGuid {0x447956fb,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_SetHDSplitParametersGuid {0x8c048bea,0x2913,0x4458, {0xb6,0x8e,0x17,0xf6,0xc1,0xe5,0xc6,0x0e}}
+#define MSNdis_SetInterruptModerationGuid {0xd789adfa,0x9c56,0x433b, {0xad,0x01,0x75,0x74,0xf3,0xce,0xdb,0xe9}}
+#define MSNdis_SetLinkParametersGuid {0x8c7d3579,0x252b,0x4614, {0x82,0xc5,0xa6,0x50,0xda,0xa1,0x50,0x49}}
+#define MSNdis_SetPortParametersGuid {0xaab6ac31,0x86fb,0x48fb, {0x8b,0x48,0x63,0xdb,0x23,0x5a,0xce,0x16}}
+#define MSNdis_SetTcpOffloadParametersGuid {0x8ead9a22,0x7f69,0x4bc6, {0x94,0x9a,0xc8,0x18,0x7b,0x07,0x4e,0x61}}
+#define MSNdis_StatisticsInfoGuid {0x8ecc74e1,0xba85,0x482e, {0xaf,0xaf,0xb4,0xf8,0xb0,0x87,0xc0,0x6b}}
+#define MSNdis_StatusDevicePowerOffExGuid {0x4159353c,0x5cd7,0x42ce, {0x8f,0xe4,0xa4,0x5a,0x23,0x80,0xcc,0x4f}}
+#define MSNdis_StatusDevicePowerOffGuid {0x81bc8189,0xb026,0x46ab, {0x64,0xb9,0xf1,0x82,0xe3,0x42,0x93,0x4e}}
+#define MSNdis_StatusDevicePowerOnExGuid {0x2b440188,0x92ac,0x4f60, {0x9b,0x2d,0x20,0xa3,0x0c,0xbb,0x6b,0xbe}}
+#define MSNdis_StatusDevicePowerOnGuid {0x5f81cfd0,0xf046,0x4342, {0x61,0xaf,0x89,0x5a,0xce,0xda,0xef,0xd9}}
+#define MSNdis_StatusDot11AssociationCompletionGuid {0x458bbea7,0x45a4,0x4ae2, {0xb1,0x76,0xe5,0x1f,0x96,0xfc,0x05,0x68}}
+#define MSNdis_StatusDot11AssociationStartGuid {0x3927843b,0x6980,0x4b48, {0xb1,0x5b,0x4d,0xe5,0x09,0x77,0xac,0x40}}
+#define MSNdis_StatusDot11ConnectionCompletionGuid {0x96efd9c9,0x7f1b,0x4a89, {0xbc,0x04,0x3e,0x9e,0x27,0x17,0x65,0xf1}}
+#define MSNdis_StatusDot11ConnectionStartGuid {0x7b74299d,0x998f,0x4454, {0xad,0x08,0xc5,0xaf,0x28,0x57,0x6d,0x1b}}
+#define MSNdis_StatusDot11DisassociationGuid {0x3fbeb6fc,0x0fe2,0x43fd, {0xb2,0xad,0xbd,0x99,0xb5,0xf9,0x3e,0x13}}
+#define MSNdis_StatusDot11LinkQualityGuid {0xa3285184,0xea99,0x48ed, {0x82,0x5e,0xa4,0x26,0xb1,0x1c,0x27,0x54}}
+#define MSNdis_StatusDot11MPDUMaxLengthChangeGuid {0x1d6560ec,0x8e48,0x4a3e, {0x9f,0xd5,0xa0,0x1b,0x69,0x8d,0xb6,0xc5}}
+#define MSNdis_StatusDot11PhyStateChangeGuid {0xdeb45316,0x71b5,0x4736, {0xbd,0xef,0x0a,0x9e,0x9f,0x4e,0x62,0xdc}}
+#define MSNdis_StatusDot11PmkidCandidateListGuid {0x26d8b8f6,0xdb82,0x49eb, {0x8b,0xf3,0x4c,0x13,0x0e,0xf0,0x69,0x50}}
+#define MSNdis_StatusDot11RoamingCompletionGuid {0xdd9d47d1,0x282b,0x41e4, {0xb9,0x24,0x66,0x36,0x88,0x17,0xfc,0xd3}}
+#define MSNdis_StatusDot11RoamingStartGuid {0xb2412d0d,0x26c8,0x4f4e, {0x93,0xdf,0xf7,0xb7,0x05,0xa0,0xb4,0x33}}
+#define MSNdis_StatusDot11ScanConfirmGuid {0x8500591e,0xa0c7,0x4efb, {0x93,0x42,0xb6,0x74,0xb0,0x02,0xcb,0xe6}}
+#define MSNdis_StatusDot11TkipmicFailureGuid {0x442c2ae4,0x9bc5,0x4b90, {0xa8,0x89,0x45,0x5e,0xf2,0x20,0xf4,0xee}}
+#define MSNdis_StatusHDSplitCurrentConfigGuid {0x6c744b0e,0xee9c,0x4205, {0x90,0xa2,0x01,0x5f,0x6d,0x65,0xf4,0x03}}
+#define MSNdis_StatusLinkSpeedChangeGuid {0x981f2d85,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusLinkStateGuid {0x64c6f797,0x878c,0x4311, {0x92,0x46,0x65,0xdb,0xa8,0x9c,0x3a,0x61}}
+#define MSNdis_StatusMediaConnectGuid {0x981f2d7d,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusMediaDisconnectGuid {0x981f2d7e,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusMediaSpecificIndicationExGuid {0xaaacfca7,0x954a,0x4632, {0xa1,0x6e,0xa8,0xa6,0x37,0x93,0xa9,0xe5}}
+#define MSNdis_StatusMediaSpecificIndicationGuid {0x981f2d84,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusNetworkChangeGuid {0xca8a56f9,0xce81,0x40e6, {0xa7,0x0f,0xa0,0x67,0xa4,0x76,0xe9,0xe9}}
+#define MSNdis_StatusOperationalStatusGuid {0xf917b663,0x845e,0x4d3d, {0xb6,0xd4,0x15,0xeb,0x27,0xaf,0x81,0xc5}}
+#define MSNdis_StatusPacketFilterChangeGuid {0xd47c5407,0x2e75,0x46dd, {0x81,0x46,0x1d,0x7e,0xd2,0xd6,0xab,0x1d}}
+#define MSNdis_StatusPortStateGuid {0x1dac0dfe,0x43e5,0x44b7, {0xb7,0x59,0x7b,0xf4,0x6d,0xe3,0x2e,0x81}}
+#define MSNdis_StatusProtocolBindGuid {0x5413531c,0xb1f3,0x11d0, {0xd7,0x8d,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusProtocolUnbindGuid {0x6e3ce1ec,0xb1f3,0x11d0, {0xd7,0x8d,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusResetEndGuid {0x981f2d77,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusResetStartGuid {0x981f2d76,0xb1f3,0x11d0, {0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_StatusTaskOffloadChangeGuid {0x45049fc6,0x54d8,0x40c8, {0x9c,0x3d,0xb0,0x11,0xc4,0xe7,0x15,0xbc}}
+#define MSNdis_TcpConnectionOffloadCurrentConfigGuid {0x2ee6aef1,0x0851,0x458b, {0xbf,0x0d,0x79,0x23,0x43,0xd1,0xcd,0xe1}}
+#define MSNdis_TcpConnectionOffloadHardwareConfigGuid {0x8ce71f2c,0xd63a,0x4390, {0xa4,0x87,0x18,0xfa,0x47,0x26,0x2c,0xeb}}
+#define MSNdis_TcpOffloadCurrentConfigGuid {0x68542fed,0x5c74,0x461e, {0x89,0x34,0x91,0xc6,0xf9,0xc6,0x09,0x60}}
+#define MSNdis_TcpOffloadHardwareConfigGuid {0xcd5f1102,0x590f,0x4ada, {0xab,0x65,0x5b,0x31,0xb1,0xdc,0x01,0x72}}
+#define MSNdis_TcpOffloadParametersGuid {0x43fe82d8,0x3468,0x497e, {0x9d,0xcf,0xf8,0xff,0xc0,0x13,0x37,0x44}}
+#define MSNdis_TokenRingCurrentAddressGuid {0x44795708,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingCurrentFunctionalGuid {0x44795709,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingCurrentGroupGuid {0x4479570a,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingCurrentRingStateGuid {0xacf14032,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingCurrentRingStatusGuid {0x890a36ec,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingLastOpenStatusGuid {0x4479570b,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingLineErrorsGuid {0xacf14033,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingLostFramesGuid {0xacf14034,0xa61c,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TokenRingPermanentAddressGuid {0x44795707,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TransmitBlockSizeGuid {0x5ec1035c,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TransmitBufferSpaceGuid {0x5ec1035a,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TransmitsErrorGuid {0x447956fc,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_TransmitsOkGuid {0x447956fa,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_VendorDescriptionGuid {0x5ec1035f,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_VendorDriverVersionGuid {0x447956f9,0xa61b,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_VendorIDGuid {0x5ec1035e,0xa61a,0x11d0, {0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c}}
+#define MSNdis_VlanIdentifierGuid {0x765dc702,0xc5e8,0x4b67, {0x84,0x3b,0x3f,0x5a,0x4f,0xf2,0x64,0x8b}}
+#define MSNdis_WmiEnumAdapterGuid {0xe7001b59,0xc3d6,0x4537, {0xb4,0x0e,0xa1,0x63,0xd5,0x16,0xe4,0xa3}}
+#define MSNdis_WmiHDSplitCurrentConfigGuid {0x34ff16bf,0x30ca,0x4a2a, {0xa4,0x6d,0xc7,0xee,0x74,0xbc,0x35,0x82}}
+#define MSNdis_WmiIPSecOffloadV1Guid {0x4ec63447,0x2238,0x43a7, {0xac,0x33,0x11,0xc7,0xcc,0x7d,0x86,0x65}}
+#define MSNdis_WmiIPSecOffloadV1_IPv4AHGuid {0x29bacfdd,0xf063,0x48d8, {0x95,0x2c,0xd3,0xdc,0x93,0x30,0x0f,0x15}}
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESPGuid {0x86522023,0x4536,0x4b58, {0xa1,0xf4,0x25,0x38,0x94,0x1a,0xce,0x43}}
+#define MSNdis_WmiIPSecOffloadV1_SupportedGuid {0xf86676b9,0xd9fa,0x4d26, {0x95,0xce,0xbf,0xbc,0x77,0xd8,0x05,0x96}}
+#define MSNdis_WmiMethodHeaderGuid {0xe3eac9dd,0x2fd3,0x4963, {0xbf,0xfd,0xb4,0x69,0x28,0x88,0xc0,0xd4}}
+#define MSNdis_WmiOffloadGuid {0x7a877086,0x2204,0x4a8a, {0x92,0xa4,0xe3,0xe8,0xab,0x62,0x66,0x29}}
+#define MSNdis_WmiOutputInfoGuid {0x7510bb9d,0xdf70,0x4f7e, {0xba,0x07,0xe2,0x9d,0x33,0x0b,0x3c,0xc5}}
+#define MSNdis_WmiReceiveScaleCapabilitiesGuid {0xf7a4960a,0xace3,0x44dc, {0xb5,0x1e,0x72,0xe0,0x5c,0x5e,0xaf,0xa8}}
+#define MSNdis_WmiSetHeaderGuid {0x3b5605d8,0x1aaf,0x4ff6, {0x85,0xb9,0xbc,0x5f,0xb9,0x73,0xdc,0x54}}
+#define MSNdis_WmiTcpConnectionOffloadGuid {0x93cfcd3f,0x6228,0x455c, {0x90,0x5e,0x3a,0xb8,0x0a,0x2f,0xf0,0x90}}
+#define MSNdis_WmiTcpIpChecksumOffloadGuid {0x189d4015,0x1b25,0x4d8e, {0xa4,0xa9,0xf9,0xeb,0xa8,0x21,0x97,0xc7}}
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceiveGuid {0xd63d537a,0x59c1,0x4fae, {0x8f,0x9b,0xcd,0x9f,0xbb,0xec,0xb8,0x5a}}
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceiveGuid {0xb9760e75,0x6662,0x49e4, {0xaa,0x6c,0xf0,0x28,0xbe,0xfe,0xc8,0xee}}
+#define MSNdis_WmiTcpLargeSendOffloadV1Guid {0xb9e4e2f9,0xee89,0x4756, {0xb0,0x57,0x38,0xf9,0xd9,0xb5,0x9a,0x92}}
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4Guid {0xd7673b11,0xe892,0x4a9d, {0x8b,0xd8,0x76,0x1f,0xf2,0x56,0xed,0xd9}}
+#define MSNdis_WmiTcpLargeSendOffloadV2Guid {0x592977c2,0xcfbe,0x462c, {0xb5,0xcf,0x1a,0x76,0x79,0xfe,0x1c,0xba}}
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4Guid {0x8823d030,0xfa30,0x4b73, {0xb3,0x39,0xdb,0x19,0x20,0x7f,0x0d,0x81}}
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6Guid {0xa7a9597c,0x2f8e,0x410b, {0x9b,0xb3,0x5c,0x3a,0x50,0x79,0x2b,0xfc}}
+#define MSPower_DeviceEnableGuid {0x827c0a6f,0xfeb0,0x11d0, {0xbd,0x26,0x00,0xaa,0x00,0xb7,0xb3,0x2a}}
+#define MSPower_DeviceWakeEnableGuid {0xa9546a82,0xfeb0,0x11d0, {0xbd,0x26,0x00,0xaa,0x00,0xb7,0xb3,0x2a}}
+#define MSSmBios_RawSMBiosTablesGuid {0x8f680850,0xa584,0x11d1, {0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSSmBios_SMBiosEventlogGuid {0x8f680851,0xa584,0x11d1, {0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSSmBios_Sysid1394Guid {0x8f680854,0xa584,0x11d1, {0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSSmBios_SysidUUIDGuid {0x8f680852,0xa584,0x11d1, {0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSVerifierIrpLogEntryGuid {0x45068237,0x595d,0x4c7d, {0xbd,0x80,0xf8,0x4a,0xdc,0x02,0x57,0xf8}}
+#define MSVerifierIrpLogInformationGuid {0x1e2c2980,0xf7db,0x46aa, {0x82,0x0e,0x87,0x34,0xfc,0xc2,0x1f,0x4c}}
+#define MSWmi_GuidGuid {0xf8c60aed,0xef8d,0x4f95, {0x9e,0xa8,0xf0,0x43,0x18,0xa0,0x0f,0x30}}
+#define MSWmi_GuidRegistrationInfoGuid {0xb48d49a1,0xe777,0x11d0, {0xa5,0x0c,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSWmi_MofDataGuid {0x05901221,0xd566,0x11d1, {0xb2,0xf0,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define MSWmi_ProviderInfoGuid {0xc7bf35d0,0xaadb,0x11d1, {0xbf,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define PARALLEL_WMI_BYTES_TRANSFERRED_GUID {0x89fef2d6,0x654b,0x11d2, {0x9e,0x15,0x00,0xc0,0x4f,0x8e,0xf4,0x81}}
+#define PARPORT_WMI_ALLOCATE_FREE_COUNTS_GUID {0x4bbb69ea,0x6853,0x11d2, {0x8e,0xce,0x00,0xc0,0x4f,0x8e,0xf4,0x81}}
+#define POINTER_PORT_WMI_STD_DATA_GUID {0x4731f89c,0x71cb,0x11d1, {0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define ProcessorPerformanceGuid {0x7fd18652,0x0cfe,0x40d2, {0xb0,0xa1,0x0b,0x06,0x6a,0x87,0x75,0x9e}}
+#define RegisteredGuidsGuid {0xe3dff7bd,0x3915,0x11d2, {0x91,0x03,0x00,0xc0,0x4f,0xb9,0x98,0xa2}}
+#define SERIAL_PORT_WMI_COMM_GUID {0xedb16a62,0xb16c,0x11d1, {0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d}}
+#define SERIAL_PORT_WMI_HW_GUID {0x270b9b86,0xb16d,0x11d1, {0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d}}
+#define SERIAL_PORT_WMI_NAME_GUID {0xa0ec11a8,0xb16c,0x11d1, {0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d}}
+#define SERIAL_PORT_WMI_PERF_GUID {0x56415acc,0xb16d,0x11d1, {0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d}}
+#define SERIAL_PORT_WMI_PROPERTIES_GUID {0x8209ec2a,0x2d6b,0x11d2, {0xba,0x49,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define SYSID_1394_DATA_GUID {0x8f680855,0xa584,0x11d1, {0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define SYSID_UUID_DATA_GUID {0x8f680853,0xa584,0x11d1, {0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define VideoModeDescriptorGuid {0x4a97ed30,0xbfaa,0x491a, {0x9d,0xfd,0xb4,0x3a,0xde,0xdb,0xf8,0xe3}}
+#define WHEAErrorInjectionMethodsGuid {0xe808ff73,0x2093,0x472a, {0xa5,0xcc,0xdf,0x24,0xf0,0x31,0xb0,0x35}}
+#define WHEAErrorSourceMethodsGuid {0x91c3c007,0x185d,0x4d78, {0xa7,0x51,0xbf,0xcb,0x31,0xc2,0xc6,0x4d}}
+#define WMI_ATAPI_FAILURE_PREDICT_DATA_GUID {0x78ebc103,0x4cf9,0x11d2, {0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define WMI_CHANGER_PARAMETERS_GUID {0x24eb52ac,0x7c77,0x438b, {0xab,0x61,0xd0,0x24,0xda,0xb0,0xc0,0x3a}}
+#define WMI_CHANGER_PROBLEM_DEVICE_ERROR_GUID {0x56b396a8,0x0b95,0x42fe, {0xbb,0xce,0xd3,0x6f,0xda,0x90,0x4f,0x8e}}
+#define WMI_CHANGER_PROBLEM_WARNING_GUID {0x45db06a5,0x20d5,0x4de3, {0xa3,0x6c,0x3a,0xb9,0x74,0x60,0x0a,0x4c}}
+#define WMI_STORAGE_FAILURE_PREDICT_DATA_GUID {0x78ebc103,0x4cf9,0x11d2, {0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define WMI_STORAGE_FAILURE_PREDICT_FUNCTION_GUID {0x78ebc105,0x4cf9,0x11d2, {0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define WMI_STORAGE_FAILURE_PREDICT_STATUS_GUID {0x78ebc102,0x4cf9,0x11d2, {0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define WMI_STORAGE_FAILURE_PREDICT_THRESHOLDS_GUID {0xdae10783,0xcc31,0x4d2a, {0x8a,0x0f,0x86,0x1c,0x04,0x07,0x7a,0x95}}
+#define WMI_STORAGE_PREDICT_FAILURE_EVENT_GUID {0x78ebc104,0x4cf9,0x11d2, {0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10}}
+#define WMI_STORAGE_SCSI_INFO_EXCEPTIONS_GUID {0x1101d829,0x167b,0x4ebf, {0xac,0xae,0x28,0xca,0xb7,0xc3,0x48,0x02}}
+#define WMI_TAPE_DRIVE_PARAMETERS_GUID {0xb9a8cfd5,0x8d72,0x47a4, {0xac,0x0e,0x28,0x4a,0x32,0x00,0xf4,0xfb}}
+#define WMI_TAPE_MEDIA_PARAMETERS_GUID {0x8c2147a4,0xff29,0x4336, {0xb8,0xa4,0x22,0x7b,0x54,0xcc,0x09,0x66}}
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_GUID {0x43ec6b13,0x10bb,0x4bf6, {0xb7,0x16,0x1c,0x1e,0x2f,0x10,0xbb,0x5f}}
+#define WMI_TAPE_PROBLEM_IO_ERROR_GUID {0x58fd29f9,0xb516,0x40fd, {0x87,0x1a,0x7e,0xe7,0x6d,0x5b,0xb5,0x3e}}
+#define WMI_TAPE_PROBLEM_WARNING_GUID {0xbc4dd36c,0xfa66,0x4080, {0x87,0xa0,0x0c,0x59,0x22,0xeb,0x78,0x87}}
+#define WMI_TAPE_SYMBOLIC_NAME_GUID {0x3fb828f7,0xf119,0x4066, {0xb1,0xe6,0xdb,0x40,0x7c,0xe9,0xde,0x91}}
+#define WmiMonitorAnalogVideoInputParamsGuid {0xa56dbcf9,0xc4f0,0x44a8, {0x9c,0x1b,0xbb,0x3b,0x3f,0x77,0x4b,0x4d}}
+#define WmiMonitorBasicDisplayParamsGuid {0x9831b7e6,0x09ac,0x491f, {0x8d,0x07,0x3c,0x3d,0x64,0x9d,0x82,0x40}}
+#define WmiMonitorBrightnessEventGuid {0x123c80d2,0x937f,0x4cfe, {0x80,0xf4,0xc4,0x0d,0x59,0x6e,0x48,0xb7}}
+#define WmiMonitorBrightnessGuid {0xd43412ac,0x67f9,0x4fbb, {0xa0,0x81,0x17,0x52,0xa2,0xc3,0x3e,0x84}}
+#define WmiMonitorBrightnessMethodsGuid {0x479b20b4,0x5559,0x46fe, {0xbe,0x97,0x7d,0x22,0x21,0x54,0x42,0x1f}}
+#define WmiMonitorColorCharacteristicsGuid {0xea324793,0x51bb,0x486a, {0xaa,0x9d,0x0f,0x55,0x52,0x35,0x34,0x13}}
+#define WmiMonitorColorXYZinCIEGuid {0x01faf041,0x842c,0x4230, {0xa3,0x1e,0x13,0x35,0x42,0x8c,0xd8,0xf0}}
+#define WmiMonitorConnectionParamsGuid {0x2e2d2463,0xb537,0x4da7, {0x8e,0xee,0x51,0x30,0x6f,0x1f,0x48,0x2f}}
+#define WmiMonitorDescriptorMethodsGuid {0x5341576e,0x75c4,0x4aeb, {0xa8,0x2b,0x87,0x3c,0xd3,0xc6,0xb3,0x84}}
+#define WmiMonitorDigitalVideoInputParamsGuid {0x51565945,0x498a,0x4a77, {0xac,0xc6,0x15,0x1b,0xec,0xc8,0x05,0xca}}
+#define WmiMonitorIDGuid {0x671a8285,0x4edb,0x4cae, {0x99,0xfe,0x69,0xa1,0x5c,0x48,0xc0,0xbc}}
+#define WmiMonitorListedFrequencyRangesGuid {0xe86e9525,0x65b6,0x4b85, {0x95,0xc5,0x00,0xbe,0xac,0xc9,0x75,0xed}}
+#define WmiMonitorListedSupportedSourceModesGuid {0x6dc76655,0x063c,0x4524, {0xa8,0x62,0xb8,0x41,0x0c,0x26,0x28,0x1b}}
+#define WmiMonitorRawEEdidV1BlockGuid {0xfaee1471,0x5149,0x4a68, {0xac,0x2c,0xbf,0x96,0xec,0x09,0xf0,0x04}}
+#define WmiMonitorSupportedDisplayFeaturesGuid {0x9fa9c28b,0x5e5c,0x4035, {0xa5,0xf8,0x67,0xd4,0x55,0x4f,0x8d,0x04}}
+
+#if !(defined(MIDL_PASS))
+
+DEFINE_GUID(FrequencyRangeDescriptor_GUID, 0xf4546078,0xf3b2,0x417e,0x94,0xcd,0x47,0xea,0x30,0x6c,0x57,0x51);
+DEFINE_GUID(IdleAccountingEx_GUID, 0xd67abd39,0x81f8,0x4a5e,0x81,0x52,0x72,0xe3,0x1e,0xc9,0x12,0xee);
+DEFINE_GUID(IdleAccounting_GUID, 0xe2a26f78,0xae07,0x4ee0,0xa3,0x0f,0xce,0x35,0x4f,0x5a,0x94,0xcd);
+DEFINE_GUID(IdleStateAccountingEx_GUID, 0x3e0d7b2c,0x401b,0x480f,0x83,0x03,0xd0,0xc2,0x0e,0xa1,0xa7,0xd8);
+DEFINE_GUID(IdleStateAccounting_GUID, 0x5280028a,0xc24f,0x43ec,0xb2,0x7d,0xa9,0x60,0xa7,0x0e,0x31,0x9a);
+DEFINE_GUID(IdleStateBucketEx_GUID, 0xe53e0a7d,0x36f0,0x4a77,0x87,0x9e,0x9c,0x6b,0x5e,0x4a,0x85,0x54);
+DEFINE_GUID(KernelIdleStateChange_GUID, 0x4838fe4f,0xf71c,0x4e51,0x9e,0xcc,0x84,0x30,0xa7,0xac,0x4c,0x6c);
+DEFINE_GUID(KernelIdleState_GUID, 0x46bdcf4a,0xe076,0x4550,0x82,0xb2,0x9f,0x32,0xed,0xed,0x3e,0x7f);
+DEFINE_GUID(KernelIdleStates_GUID, 0xba138e10,0xe250,0x4ad7,0x86,0x16,0xcf,0x1a,0x7a,0xd4,0x10,0xe7);
+DEFINE_GUID(KernelPerfStateChange_GUID, 0xa5b32ddd,0x7f39,0x4abc,0xb8,0x92,0x90,0x0e,0x43,0xb5,0x9e,0xbb);
+DEFINE_GUID(KernelPerfStateDomainChange_GUID, 0x995e6b7f,0xd653,0x497a,0xb9,0x78,0x36,0xa3,0x0c,0x29,0xbf,0x01);
+DEFINE_GUID(KernelPerfState_GUID, 0x8c7980e1,0xf62b,0x419e,0xaa,0x82,0x27,0x6c,0x8d,0x06,0x4a,0x1f);
+DEFINE_GUID(KernelPerfStates_GUID, 0x5708cc20,0x7d40,0x4bf4,0xb4,0xaa,0x2b,0x01,0x33,0x8d,0x01,0x26);
+DEFINE_GUID(KernelThermalConstraintChange_GUID, 0xa852c2c8,0x1a4c,0x423b,0x8c,0x2c,0xf3,0x0d,0x82,0x93,0x1a,0x88);
+DEFINE_GUID(KernelThermalPolicyChange_GUID, 0xaca5a8f7,0x96ca,0x4397,0xba,0xde,0x43,0xbe,0x2f,0x57,0x7d,0x51);
+DEFINE_GUID(MSAcpiInfo_GUID, 0x5daf38ae,0xf6f8,0x4d90,0x81,0x99,0xeb,0xde,0x68,0x00,0xec,0x3b);
+DEFINE_GUID(MSAcpi_ThermalZoneTemperature_GUID, 0xa1bc18c0,0xa7c8,0x11d1,0xbf,0x3c,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSAgp_Information_GUID, 0x8c27fbed,0x1c7b,0x47e4,0xa6,0x49,0x0e,0x38,0x9d,0x3a,0xda,0x4f);
+DEFINE_GUID(MSChangerParameters_GUID, 0x24eb52ac,0x7c77,0x438b,0xab,0x61,0xd0,0x24,0xda,0xb0,0xc0,0x3a);
+DEFINE_GUID(MSChangerProblemDeviceError_GUID, 0x56b396a8,0x0b95,0x42fe,0xbb,0xce,0xd3,0x6f,0xda,0x90,0x4f,0x8e);
+DEFINE_GUID(MSChangerProblemEvent_GUID, 0x45db06a5,0x20d5,0x4de3,0xa3,0x6c,0x3a,0xb9,0x74,0x60,0x0a,0x4c);
+DEFINE_GUID(MSDeviceUI_FirmwareRevision_GUID, 0x4504b1d4,0xc5ee,0x4df6,0x95,0x1f,0x16,0x18,0x0e,0x3d,0xd8,0x15);
+DEFINE_GUID(MSDiskDriver_Geometry_GUID, 0x25007f51,0x57c2,0x11d1,0xa5,0x28,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSDiskDriver_PerformanceData_GUID, 0xbdd865d2,0xd7c1,0x11d0,0xa5,0x01,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSDiskDriver_Performance_GUID, 0xbdd865d1,0xd7c1,0x11d0,0xa5,0x01,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSIde_PortDeviceInfo_GUID, 0x53f5630f,0xb6bf,0x11d0,0x94,0xf2,0x00,0xa0,0xc9,0x1e,0xfb,0x8b);
+DEFINE_GUID(MSKeyboard_ClassInformation_GUID, 0x4731f899,0x71cb,0x11d1,0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSKeyboard_ExtendedID_GUID, 0x6ac4e23d,0xa950,0x4518,0x8b,0x2b,0xaa,0x4d,0xcd,0x5f,0xe1,0x4a);
+DEFINE_GUID(MSKeyboard_PortInformation_GUID, 0x4731f89a,0x71cb,0x11d1,0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSMCAEvent_BusError_GUID, 0x1ee17050,0x0039,0x40f7,0x9e,0xad,0x14,0xad,0x51,0x61,0x2c,0xb2);
+DEFINE_GUID(MSMCAEvent_CPUError_GUID, 0x5ce27cde,0xd179,0x4c68,0x93,0x7f,0xa0,0x7b,0x8c,0xc2,0xea,0x39);
+DEFINE_GUID(MSMCAEvent_Header_GUID, 0x6381c27f,0xc8fa,0x4da7,0x89,0x53,0xb8,0x68,0x33,0x73,0x6e,0x15);
+DEFINE_GUID(MSMCAEvent_InvalidError_GUID, 0x477b769b,0x785c,0x48dd,0xa0,0x2e,0x57,0xe0,0x51,0xbe,0x7b,0x85);
+DEFINE_GUID(MSMCAEvent_MemoryError_GUID, 0x433eea38,0xc1a7,0x48f1,0x88,0x4f,0xb6,0x87,0x5f,0x17,0x6c,0xc7);
+DEFINE_GUID(MSMCAEvent_MemoryHierarchyError_GUID, 0xcede75a0,0xa77f,0x452b,0x8f,0x2f,0x54,0x1f,0x92,0x6d,0xb0,0xf9);
+DEFINE_GUID(MSMCAEvent_MemoryPageRemoved_GUID, 0x84e9ddb6,0xe233,0x4dfc,0x98,0x8c,0x74,0x12,0xc8,0x75,0x4f,0xec);
+DEFINE_GUID(MSMCAEvent_PCIBusError_GUID, 0xa14a5594,0x25de,0x410e,0x9b,0x92,0x80,0xf0,0x80,0x1a,0xec,0x07);
+DEFINE_GUID(MSMCAEvent_PCIComponentError_GUID, 0x805caf4e,0x336c,0x4eb2,0x8c,0x0c,0x02,0xf3,0x51,0xcb,0xf1,0x3c);
+DEFINE_GUID(MSMCAEvent_PlatformSpecificError_GUID, 0x2d2434aa,0xef83,0x4200,0xba,0x24,0xde,0x36,0x6c,0x41,0x5f,0x7b);
+DEFINE_GUID(MSMCAEvent_SMBIOSError_GUID, 0x4184df1b,0xedfe,0x406b,0xb1,0x72,0x54,0xc9,0x1f,0xbd,0x9b,0xaf);
+DEFINE_GUID(MSMCAEvent_SwitchToCMCPolling_GUID, 0x39c14290,0xf036,0x4999,0xb8,0xa1,0xb6,0xf8,0x71,0xfb,0x32,0x9e);
+DEFINE_GUID(MSMCAEvent_SwitchToCPEPolling_GUID, 0xd5c870ce,0x4ed0,0x4fdc,0xbb,0x54,0x8b,0x45,0x2c,0x18,0x79,0x7e);
+DEFINE_GUID(MSMCAEvent_SystemEventError_GUID, 0xbdba4b12,0x8d00,0x4570,0xb9,0xb2,0x3f,0xde,0xcf,0x1d,0x56,0x61);
+DEFINE_GUID(MSMCAEvent_TLBError_GUID, 0xb161eeab,0xac03,0x4c2b,0xae,0x7a,0x5a,0x37,0x68,0xf7,0x0e,0x85);
+DEFINE_GUID(MSMCAInfo_Entry_GUID, 0x9e77a308,0x6b82,0x4fc1,0xab,0x41,0x0a,0x55,0x86,0x7c,0x35,0xc2);
+DEFINE_GUID(MSMCAInfo_RawCMCEvent_GUID, 0x2f1a8a9d,0x7988,0x457f,0xa1,0x7a,0x89,0x79,0xe8,0x20,0x43,0xc5);
+DEFINE_GUID(MSMCAInfo_RawCorrectedPlatformEvent_GUID, 0x6b629d5e,0xe63c,0x48a3,0x9e,0xbb,0x97,0x42,0x27,0x07,0x52,0x65);
+DEFINE_GUID(MSMCAInfo_RawMCAData_GUID, 0x23602a8a,0xdadd,0x462f,0x9a,0xe5,0x30,0xfa,0x2c,0x37,0xdd,0x5b);
+DEFINE_GUID(MSMCAInfo_RawMCAEvent_GUID, 0x2f1a8a9f,0x7988,0x457f,0xa1,0x7a,0x89,0x79,0xe8,0x20,0x43,0xc5);
+DEFINE_GUID(MSMouse_ClassInformation_GUID, 0x4731f89b,0x71cb,0x11d1,0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSMouse_PortInformation_GUID, 0x4731f89c,0x71cb,0x11d1,0xa5,0x2c,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSNdis_80211_AddWEP_GUID, 0x4307bff0,0x2129,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_AuthenticationMode_GUID, 0x43920a24,0x2129,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_BSSIList_GUID, 0x69526f9a,0x2062,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_BaseServiceSetIdentifier_GUID, 0x2504b6c2,0x1fa5,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_BssIdListScan_GUID, 0x0d9e01e1,0xba70,0x11d4,0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37);
+DEFINE_GUID(MSNdis_80211_ConfigurationFH_GUID, 0x4a800b8c,0x2068,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_ConfigurationInfo_GUID, 0x220c16fc,0xb9a8,0x11d4,0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37);
+DEFINE_GUID(MSNdis_80211_Configuration_GUID, 0x4a4df982,0x2068,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_DataRates_GUID, 0x49db8722,0x2068,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_DesiredDataRates_GUID, 0x452ee08e,0x2536,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_Disassociate_GUID, 0x43671f40,0x2129,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_FragmentationThreshold_GUID, 0x69aaa7c4,0x2062,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_InfrastructureMode_GUID, 0x697d5a7e,0x2062,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_NetworkInfrastructure_GUID, 0x34e1fa48,0xb9b6,0x11d4,0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37);
+DEFINE_GUID(MSNdis_80211_NetworkTypeInUse_GUID, 0x857e2326,0x2041,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_NetworkType_GUID, 0xe779ab61,0xb9ab,0x11d4,0xb6,0x75,0x00,0x20,0x48,0x57,0x03,0x37);
+DEFINE_GUID(MSNdis_80211_NetworkTypesSupported_GUID, 0x8531d6e6,0x2041,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_NumberOfAntennas_GUID, 0x01779336,0x2064,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_PowerMode_GUID, 0x85be837c,0x2041,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_PrivacyFilter_GUID, 0x6733c4e9,0x4792,0x11d4,0x97,0xf1,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_RTSThreshold_GUID, 0x0134d07e,0x2064,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_ReceiveAntennaSelected_GUID, 0x01ac07a2,0x2064,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_ReceivedSignalStrengthEventTrigger_GUID, 0x155689b8,0x2053,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_ReceivedSignalStrength_GUID, 0x1507db16,0x2053,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_ReloadDefaults_GUID, 0x748b14e8,0x32ee,0x4425,0xb9,0x1b,0xc9,0x84,0x8c,0x58,0xb5,0x5a);
+DEFINE_GUID(MSNdis_80211_RemoveWEP_GUID, 0x433c345c,0x2129,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_ServiceSetIdentifier_GUID, 0x7d2a90ea,0x2041,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_Statistics_GUID, 0x42bb73b0,0x2129,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_TransmitAntennaSelected_GUID, 0x01dbb74a,0x2064,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_TransmitPowerLevel_GUID, 0x11e6ba76,0x2053,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_80211_WEPStatus_GUID, 0xb027a21f,0x3cfa,0x4125,0x80,0x0b,0x3f,0x7a,0x18,0xfd,0xdc,0xdc);
+DEFINE_GUID(MSNdis_80211_WLanBssId_GUID, 0x6929e718,0x2062,0x11d4,0x97,0xeb,0x00,0xc0,0x4f,0x79,0xc4,0x03);
+DEFINE_GUID(MSNdis_AtmHardwareCurrentAddress_GUID, 0x791ad1a1,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxAal0PacketSize_GUID, 0x791ad1a5,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxAal1PacketSize_GUID, 0x791ad1a6,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxAal34PacketSize_GUID, 0x791ad1a7,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxAal5PacketSize_GUID, 0x791ad191,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxActiveVciBits_GUID, 0x791ad1a3,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxActiveVcs_GUID, 0x791ad1a2,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmMaxActiveVpiBits_GUID, 0x791ad1a4,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmReceiveCellsDropped_GUID, 0x0a21480c,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmReceiveCellsOk_GUID, 0x0a21480a,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmSupportedAalTypes_GUID, 0x791ad1a0,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmSupportedServiceCategory_GUID, 0x791ad19f,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmSupportedVcRates_GUID, 0x791ad19e,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_AtmTransmitCellsOk_GUID, 0x0a21480b,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoDriverVersion_GUID, 0x791ad198,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoHardwareStatus_GUID, 0x791ad192,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoLinkSpeed_GUID, 0x791ad195,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoMacOptions_GUID, 0x791ad19a,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoMediaConnectStatus_GUID, 0x791ad19b,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoMediaInUse_GUID, 0x791ad194,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoMediaSupported_GUID, 0x791ad193,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoMinimumLinkSpeed_GUID, 0x791ad19d,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoReceivePduErrors_GUID, 0x0a214808,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoReceivePdusNoBuffer_GUID, 0x0a214809,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoReceivePdusOk_GUID, 0x0a214806,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoTransmitPduErrors_GUID, 0x0a214807,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoTransmitPdusOk_GUID, 0x0a214805,0xe35f,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoVendorDescription_GUID, 0x791ad197,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoVendorDriverVersion_GUID, 0x791ad19c,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CoVendorId_GUID, 0x791ad196,0xe35c,0x11d0,0x96,0x92,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CountedString_GUID, 0x146360a5,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_CurrentLookahead_GUID, 0x5ec10361,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_CurrentPacketFilter_GUID, 0x5ec10360,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_DeviceWakeOnMagicPacketOnly_GUID, 0xa14f1c97,0x8839,0x4f8a,0x99,0x96,0xa2,0x89,0x96,0xeb,0xbf,0x1d);
+DEFINE_GUID(MSNdis_DriverVersion_GUID, 0x5ec10362,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EnumerateAdapterEx_GUID, 0x16716917,0x4306,0x4be4,0x9b,0x5a,0x38,0x09,0xae,0x44,0xb1,0x25);
+DEFINE_GUID(MSNdis_EnumerateAdapter_GUID, 0x981f2d7f,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EnumeratePorts_GUID, 0xf1d6abe8,0x15e4,0x4407,0x81,0xb7,0x6b,0x83,0x0c,0x77,0x7c,0xd9);
+DEFINE_GUID(MSNdis_EnumerateReceiveFilters_GUID, 0x3f2c141d,0x83bc,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_EnumerateReceiveQueues_GUID, 0x3f2c141b,0x83bc,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_EthernetCurrentAddress_GUID, 0x44795700,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetMacOptions_GUID, 0x44795703,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetMaximumMulticastListSize_GUID, 0x44795702,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetMoreTransmitCollisions_GUID, 0x44795706,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetMulticastList_GUID, 0x44795701,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetOneTransmitCollision_GUID, 0x44795705,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetPermanentAddress_GUID, 0x447956ff,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_EthernetReceiveErrorAlignment_GUID, 0x44795704,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiAttachmentType_GUID, 0xacf1403d,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiDownstreamNodeLong_GUID, 0xacf1403f,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiFrameErrors_GUID, 0xacf14040,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiFramesLost_GUID, 0xacf14041,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLConnectionState_GUID, 0xacf14045,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLctFailures_GUID, 0xacf14043,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLemRejects_GUID, 0xacf14044,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLongCurrentAddress_GUID, 0xacf14036,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLongMaximumListSize_GUID, 0xacf14038,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLongMulticastList_GUID, 0xacf14037,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiLongPermanentAddress_GUID, 0xacf14035,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiRingManagmentState_GUID, 0xacf14042,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiShortCurrentAddress_GUID, 0xacf1403a,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiShortMaximumListSize_GUID, 0xacf1403c,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiShortMulticastList_GUID, 0xacf1403b,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiShortPermanentAddress_GUID, 0xacf14039,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_FddiUpstreamNodeLong_GUID, 0xacf1403e,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_GroupAffinity_GUID, 0xf786fbd5,0xc049,0x11dd,0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_HDSplitCurrentConfig_GUID, 0x81d1303c,0xab00,0x4e49,0x80,0xb1,0x5e,0x6e,0x0b,0xf9,0xbe,0x53);
+DEFINE_GUID(MSNdis_HDSplitParameters_GUID, 0x1131c56a,0x0a5a,0x4d79,0x8d,0xde,0x1e,0x6f,0x17,0x80,0x05,0xee);
+DEFINE_GUID(MSNdis_HardwareStatus_GUID, 0x5ec10354,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_InterruptModerationParameters_GUID, 0x09f58643,0x31fb,0x45b5,0x85,0x2b,0x09,0xb4,0xd3,0xff,0x37,0x65);
+DEFINE_GUID(MSNdis_LinkParameters_GUID, 0x29380131,0xa312,0x4400,0xbe,0x0c,0x53,0x87,0x7a,0x41,0xc4,0x65);
+DEFINE_GUID(MSNdis_LinkSpeed_GUID, 0x5ec10359,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_LinkStateData_GUID, 0x5b26b94f,0x0272,0x4d4c,0x87,0x44,0xbd,0x84,0xbe,0x42,0x1f,0x3b);
+DEFINE_GUID(MSNdis_LinkState_GUID, 0xba1f4c14,0xa945,0x4762,0xb9,0x16,0x0b,0x55,0x15,0xb6,0xf4,0x3a);
+DEFINE_GUID(MSNdis_MacOptions_GUID, 0x5ec10365,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MaximumFrameSize_GUID, 0x5ec10358,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MaximumLookahead_GUID, 0x5ec10357,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MaximumSendPackets_GUID, 0x5ec10367,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MaximumTotalSize_GUID, 0x5ec10363,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MediaConnectStatus_GUID, 0x5ec10366,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MediaInUse_GUID, 0x5ec10356,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_MediaSupported_GUID, 0x5ec10355,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_NdisEnumerateVc_GUID, 0x981f2d82,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_NetworkAddress_GUID, 0xb5bd98b7,0x0201,0x11d1,0xa5,0x0e,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSNdis_NetworkLinkSpeed_GUID, 0x60fc6b57,0x0f66,0x11d1,0x96,0xa7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_NetworkShortAddress_GUID, 0xb5bd98b8,0x0201,0x11d1,0xa5,0x0e,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSNdis_NicSwitchCapabilities_GUID, 0xdb80dd1c,0x59ae,0x48e7,0xb7,0xec,0xf9,0xbe,0x2c,0x4b,0x8c,0xb0);
+DEFINE_GUID(MSNdis_NotifyAdapterArrival_GUID, 0x981f2d81,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_NotifyAdapterRemoval_GUID, 0x981f2d80,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_NotifyFilterArrival_GUID, 0x0b6d3c89,0x5917,0x43ca,0xb5,0x78,0xd0,0x1a,0x79,0x67,0xc4,0x1c);
+DEFINE_GUID(MSNdis_NotifyFilterRemoval_GUID, 0x1f177cd9,0x5955,0x4721,0x9f,0x6a,0x78,0xeb,0xdf,0xae,0xf8,0x89);
+DEFINE_GUID(MSNdis_NotifyVcArrival_GUID, 0x182f9e0c,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_NotifyVcRemoval_GUID, 0x981f2d79,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_ObjectHeader_GUID, 0x2b1831b2,0x2216,0x4ede,0xa4,0x69,0x9f,0xe3,0xdd,0x6d,0x5a,0x7e);
+DEFINE_GUID(MSNdis_PMAdminConfigParam_GUID, 0x492dc449,0x13d9,0x4bd6,0x89,0xd4,0x96,0xe3,0x53,0x4e,0x6a,0x05);
+DEFINE_GUID(MSNdis_PMAdminConfigState_GUID, 0x0cffd0fc,0x8333,0x4000,0x9a,0x3b,0x20,0x07,0x35,0xd6,0x98,0xf9);
+DEFINE_GUID(MSNdis_PMAdminConfig_GUID, 0x1528d111,0x708a,0x4ca4,0x92,0x15,0xc0,0x57,0x71,0x16,0x1c,0xda);
+DEFINE_GUID(MSNdis_PMCapabilitiesParam_GUID, 0xcccb122d,0xd5c4,0x4ee1,0x80,0x01,0xb8,0xad,0x6d,0x3c,0xe8,0x76);
+DEFINE_GUID(MSNdis_PMCapabilities_GUID, 0xb2cf76e3,0xb3ae,0x4394,0xa0,0x1f,0x33,0x8c,0x98,0x70,0xe9,0x39);
+DEFINE_GUID(MSNdis_PMCapabilityState_GUID, 0xc1cc6857,0x1a26,0x4f6d,0xab,0x98,0x29,0x1f,0x0c,0x3b,0xbd,0x4c);
+DEFINE_GUID(MSNdis_PciDeviceProperty_GUID, 0x0573f70f,0xded8,0x401c,0x8b,0x56,0xa6,0x2b,0xb5,0x28,0xc0,0xe2);
+DEFINE_GUID(MSNdis_PhysicalMediumType_GUID, 0x418ca16d,0x3937,0x4208,0x94,0x0a,0xec,0x61,0x96,0x27,0x80,0x85);
+DEFINE_GUID(MSNdis_PortArray_GUID, 0x0fee8708,0xdf65,0x456e,0xb4,0xca,0xfa,0x62,0x32,0x66,0xa1,0x2a);
+DEFINE_GUID(MSNdis_PortAuthParameters_GUID, 0x5c3bda24,0x8b64,0x4829,0xa5,0x87,0x8c,0xe7,0x19,0x15,0x2f,0xe2);
+DEFINE_GUID(MSNdis_PortChar_GUID, 0xf5b7d202,0xe594,0x4aa3,0xbe,0x43,0x49,0x76,0x83,0x3c,0x78,0x40);
+DEFINE_GUID(MSNdis_PortStateData_GUID, 0x8feae2c6,0xee28,0x469f,0x8b,0x5d,0x9f,0x74,0x3b,0xab,0x21,0xaa);
+DEFINE_GUID(MSNdis_QueryInterruptModeration_GUID, 0xd9c8eea5,0xf16e,0x467c,0x84,0xd5,0x63,0x45,0xa2,0x2c,0xe2,0x13);
+DEFINE_GUID(MSNdis_QueryNicSwitchCurrentCapabilities_GUID, 0xe76fdaf3,0x0be7,0x4d95,0x87,0xe9,0x5a,0xea,0xd4,0xb5,0x90,0xe9);
+DEFINE_GUID(MSNdis_QueryNicSwitchHardwareCapabilities_GUID, 0x37cab40c,0xd1e8,0x4301,0x8c,0x1d,0x58,0x46,0x5e,0x0c,0x4c,0x0f);
+DEFINE_GUID(MSNdis_QueryPciDeviceCustomProperty_GUID, 0xaa39f5ab,0xe260,0x4d01,0x82,0xb0,0xb7,0x37,0xc8,0x80,0xea,0x05);
+DEFINE_GUID(MSNdis_QueryPhysicalMediumTypeEx_GUID, 0x899e7782,0x035b,0x43f9,0x8b,0xb6,0x2b,0x58,0x97,0x16,0x12,0xe5);
+DEFINE_GUID(MSNdis_QueryPortState_GUID, 0x6fbf2a5f,0x8b8f,0x4920,0x81,0x43,0xe6,0xc4,0x60,0xf5,0x25,0x24);
+DEFINE_GUID(MSNdis_QueryReceiveFilterCurrentCapabilities_GUID, 0x4054e80f,0x2bc1,0x4ccc,0xb0,0x33,0x4a,0xbc,0x0c,0x4a,0x1e,0x8c);
+DEFINE_GUID(MSNdis_QueryReceiveFilterGlobalParameters_GUID, 0x3f2c141a,0x83bc,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_QueryReceiveFilterHardwareCapabilities_GUID, 0x3f2c1419,0x83bc,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_QueryReceiveFilterParameters_GUID, 0x3f2c141e,0x83bc,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_QueryReceiveQueueParameters_GUID, 0x3f2c141c,0x83bc,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_QueryStatisticsInfo_GUID, 0x368c45b5,0xc129,0x43c1,0x93,0x9e,0x7e,0xdc,0x2d,0x7f,0xe6,0x21);
+DEFINE_GUID(MSNdis_RSSEnabled_GUID, 0x9565cd55,0x3402,0x4e32,0xa5,0xb6,0x2f,0x14,0x3f,0x2f,0x2c,0x30);
+DEFINE_GUID(MSNdis_ReceiveBlockSize_GUID, 0x5ec1035d,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_ReceiveBufferSpace_GUID, 0x5ec1035b,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_ReceiveError_GUID, 0x447956fd,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_ReceiveFilterCapabilities_GUID, 0x146360a3,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveFilterFieldParameters_GUID, 0x146360ab,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveFilterGlobalParameters_GUID, 0x146360a4,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveFilterInfoArray_GUID, 0x146360aa,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveFilterInfo_GUID, 0x146360a9,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveFilterParameters_GUID, 0x146360ac,0x88dd,0x11dd,0x94,0xb8,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveNoBuffer_GUID, 0x447956fe,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_ReceiveQueueInfoArray_GUID, 0xf786fbd8,0xc049,0x11dd,0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveQueueInfo_GUID, 0xf786fbd7,0xc049,0x11dd,0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveQueueParameters_GUID, 0xf786fbd6,0xc049,0x11dd,0xb8,0x85,0x00,0x1d,0x09,0x16,0x2b,0xc3);
+DEFINE_GUID(MSNdis_ReceiveScaleCapabilities_GUID, 0x26c28774,0x4252,0x48fe,0xa6,0x10,0xa5,0x8a,0x39,0x8c,0x0e,0xb1);
+DEFINE_GUID(MSNdis_ReceivesOk_GUID, 0x447956fb,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_SetHDSplitParameters_GUID, 0x8c048bea,0x2913,0x4458,0xb6,0x8e,0x17,0xf6,0xc1,0xe5,0xc6,0x0e);
+DEFINE_GUID(MSNdis_SetInterruptModeration_GUID, 0xd789adfa,0x9c56,0x433b,0xad,0x01,0x75,0x74,0xf3,0xce,0xdb,0xe9);
+DEFINE_GUID(MSNdis_SetLinkParameters_GUID, 0x8c7d3579,0x252b,0x4614,0x82,0xc5,0xa6,0x50,0xda,0xa1,0x50,0x49);
+DEFINE_GUID(MSNdis_SetPortParameters_GUID, 0xaab6ac31,0x86fb,0x48fb,0x8b,0x48,0x63,0xdb,0x23,0x5a,0xce,0x16);
+DEFINE_GUID(MSNdis_SetTcpOffloadParameters_GUID, 0x8ead9a22,0x7f69,0x4bc6,0x94,0x9a,0xc8,0x18,0x7b,0x07,0x4e,0x61);
+DEFINE_GUID(MSNdis_StatisticsInfo_GUID, 0x8ecc74e1,0xba85,0x482e,0xaf,0xaf,0xb4,0xf8,0xb0,0x87,0xc0,0x6b);
+DEFINE_GUID(MSNdis_StatusDevicePowerOffEx_GUID, 0x4159353c,0x5cd7,0x42ce,0x8f,0xe4,0xa4,0x5a,0x23,0x80,0xcc,0x4f);
+DEFINE_GUID(MSNdis_StatusDevicePowerOff_GUID, 0x81bc8189,0xb026,0x46ab,0x64,0xb9,0xf1,0x82,0xe3,0x42,0x93,0x4e);
+DEFINE_GUID(MSNdis_StatusDevicePowerOnEx_GUID, 0x2b440188,0x92ac,0x4f60,0x9b,0x2d,0x20,0xa3,0x0c,0xbb,0x6b,0xbe);
+DEFINE_GUID(MSNdis_StatusDevicePowerOn_GUID, 0x5f81cfd0,0xf046,0x4342,0x61,0xaf,0x89,0x5a,0xce,0xda,0xef,0xd9);
+DEFINE_GUID(MSNdis_StatusDot11AssociationCompletion_GUID, 0x458bbea7,0x45a4,0x4ae2,0xb1,0x76,0xe5,0x1f,0x96,0xfc,0x05,0x68);
+DEFINE_GUID(MSNdis_StatusDot11AssociationStart_GUID, 0x3927843b,0x6980,0x4b48,0xb1,0x5b,0x4d,0xe5,0x09,0x77,0xac,0x40);
+DEFINE_GUID(MSNdis_StatusDot11ConnectionCompletion_GUID, 0x96efd9c9,0x7f1b,0x4a89,0xbc,0x04,0x3e,0x9e,0x27,0x17,0x65,0xf1);
+DEFINE_GUID(MSNdis_StatusDot11ConnectionStart_GUID, 0x7b74299d,0x998f,0x4454,0xad,0x08,0xc5,0xaf,0x28,0x57,0x6d,0x1b);
+DEFINE_GUID(MSNdis_StatusDot11Disassociation_GUID, 0x3fbeb6fc,0x0fe2,0x43fd,0xb2,0xad,0xbd,0x99,0xb5,0xf9,0x3e,0x13);
+DEFINE_GUID(MSNdis_StatusDot11LinkQuality_GUID, 0xa3285184,0xea99,0x48ed,0x82,0x5e,0xa4,0x26,0xb1,0x1c,0x27,0x54);
+DEFINE_GUID(MSNdis_StatusDot11MPDUMaxLengthChange_GUID, 0x1d6560ec,0x8e48,0x4a3e,0x9f,0xd5,0xa0,0x1b,0x69,0x8d,0xb6,0xc5);
+DEFINE_GUID(MSNdis_StatusDot11PhyStateChange_GUID, 0xdeb45316,0x71b5,0x4736,0xbd,0xef,0x0a,0x9e,0x9f,0x4e,0x62,0xdc);
+DEFINE_GUID(MSNdis_StatusDot11PmkidCandidateList_GUID, 0x26d8b8f6,0xdb82,0x49eb,0x8b,0xf3,0x4c,0x13,0x0e,0xf0,0x69,0x50);
+DEFINE_GUID(MSNdis_StatusDot11RoamingCompletion_GUID, 0xdd9d47d1,0x282b,0x41e4,0xb9,0x24,0x66,0x36,0x88,0x17,0xfc,0xd3);
+DEFINE_GUID(MSNdis_StatusDot11RoamingStart_GUID, 0xb2412d0d,0x26c8,0x4f4e,0x93,0xdf,0xf7,0xb7,0x05,0xa0,0xb4,0x33);
+DEFINE_GUID(MSNdis_StatusDot11ScanConfirm_GUID, 0x8500591e,0xa0c7,0x4efb,0x93,0x42,0xb6,0x74,0xb0,0x02,0xcb,0xe6);
+DEFINE_GUID(MSNdis_StatusDot11TkipmicFailure_GUID, 0x442c2ae4,0x9bc5,0x4b90,0xa8,0x89,0x45,0x5e,0xf2,0x20,0xf4,0xee);
+DEFINE_GUID(MSNdis_StatusHDSplitCurrentConfig_GUID, 0x6c744b0e,0xee9c,0x4205,0x90,0xa2,0x01,0x5f,0x6d,0x65,0xf4,0x03);
+DEFINE_GUID(MSNdis_StatusLinkSpeedChange_GUID, 0x981f2d85,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusLinkState_GUID, 0x64c6f797,0x878c,0x4311,0x92,0x46,0x65,0xdb,0xa8,0x9c,0x3a,0x61);
+DEFINE_GUID(MSNdis_StatusMediaConnect_GUID, 0x981f2d7d,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusMediaDisconnect_GUID, 0x981f2d7e,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusMediaSpecificIndicationEx_GUID, 0xaaacfca7,0x954a,0x4632,0xa1,0x6e,0xa8,0xa6,0x37,0x93,0xa9,0xe5);
+DEFINE_GUID(MSNdis_StatusMediaSpecificIndication_GUID, 0x981f2d84,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusNetworkChange_GUID, 0xca8a56f9,0xce81,0x40e6,0xa7,0x0f,0xa0,0x67,0xa4,0x76,0xe9,0xe9);
+DEFINE_GUID(MSNdis_StatusOperationalStatus_GUID, 0xf917b663,0x845e,0x4d3d,0xb6,0xd4,0x15,0xeb,0x27,0xaf,0x81,0xc5);
+DEFINE_GUID(MSNdis_StatusPacketFilterChange_GUID, 0xd47c5407,0x2e75,0x46dd,0x81,0x46,0x1d,0x7e,0xd2,0xd6,0xab,0x1d);
+DEFINE_GUID(MSNdis_StatusPortState_GUID, 0x1dac0dfe,0x43e5,0x44b7,0xb7,0x59,0x7b,0xf4,0x6d,0xe3,0x2e,0x81);
+DEFINE_GUID(MSNdis_StatusProtocolBind_GUID, 0x5413531c,0xb1f3,0x11d0,0xd7,0x8d,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusProtocolUnbind_GUID, 0x6e3ce1ec,0xb1f3,0x11d0,0xd7,0x8d,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusResetEnd_GUID, 0x981f2d77,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusResetStart_GUID, 0x981f2d76,0xb1f3,0x11d0,0x8d,0xd7,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_StatusTaskOffloadChange_GUID, 0x45049fc6,0x54d8,0x40c8,0x9c,0x3d,0xb0,0x11,0xc4,0xe7,0x15,0xbc);
+DEFINE_GUID(MSNdis_TcpConnectionOffloadCurrentConfig_GUID, 0x2ee6aef1,0x0851,0x458b,0xbf,0x0d,0x79,0x23,0x43,0xd1,0xcd,0xe1);
+DEFINE_GUID(MSNdis_TcpConnectionOffloadHardwareConfig_GUID, 0x8ce71f2c,0xd63a,0x4390,0xa4,0x87,0x18,0xfa,0x47,0x26,0x2c,0xeb);
+DEFINE_GUID(MSNdis_TcpOffloadCurrentConfig_GUID, 0x68542fed,0x5c74,0x461e,0x89,0x34,0x91,0xc6,0xf9,0xc6,0x09,0x60);
+DEFINE_GUID(MSNdis_TcpOffloadHardwareConfig_GUID, 0xcd5f1102,0x590f,0x4ada,0xab,0x65,0x5b,0x31,0xb1,0xdc,0x01,0x72);
+DEFINE_GUID(MSNdis_TcpOffloadParameters_GUID, 0x43fe82d8,0x3468,0x497e,0x9d,0xcf,0xf8,0xff,0xc0,0x13,0x37,0x44);
+DEFINE_GUID(MSNdis_TokenRingCurrentAddress_GUID, 0x44795708,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingCurrentFunctional_GUID, 0x44795709,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingCurrentGroup_GUID, 0x4479570a,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingCurrentRingState_GUID, 0xacf14032,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingCurrentRingStatus_GUID, 0x890a36ec,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingLastOpenStatus_GUID, 0x4479570b,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingLineErrors_GUID, 0xacf14033,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingLostFrames_GUID, 0xacf14034,0xa61c,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TokenRingPermanentAddress_GUID, 0x44795707,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TransmitBlockSize_GUID, 0x5ec1035c,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TransmitBufferSpace_GUID, 0x5ec1035a,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TransmitsError_GUID, 0x447956fc,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_TransmitsOk_GUID, 0x447956fa,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_VendorDescription_GUID, 0x5ec1035f,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_VendorDriverVersion_GUID, 0x447956f9,0xa61b,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_VendorID_GUID, 0x5ec1035e,0xa61a,0x11d0,0x8d,0xd4,0x00,0xc0,0x4f,0xc3,0x35,0x8c);
+DEFINE_GUID(MSNdis_VlanIdentifier_GUID, 0x765dc702,0xc5e8,0x4b67,0x84,0x3b,0x3f,0x5a,0x4f,0xf2,0x64,0x8b);
+DEFINE_GUID(MSNdis_WmiEnumAdapter_GUID, 0xe7001b59,0xc3d6,0x4537,0xb4,0x0e,0xa1,0x63,0xd5,0x16,0xe4,0xa3);
+DEFINE_GUID(MSNdis_WmiHDSplitCurrentConfig_GUID, 0x34ff16bf,0x30ca,0x4a2a,0xa4,0x6d,0xc7,0xee,0x74,0xbc,0x35,0x82);
+DEFINE_GUID(MSNdis_WmiIPSecOffloadV1_GUID, 0x4ec63447,0x2238,0x43a7,0xac,0x33,0x11,0xc7,0xcc,0x7d,0x86,0x65);
+DEFINE_GUID(MSNdis_WmiIPSecOffloadV1_IPv4AH_GUID, 0x29bacfdd,0xf063,0x48d8,0x95,0x2c,0xd3,0xdc,0x93,0x30,0x0f,0x15);
+DEFINE_GUID(MSNdis_WmiIPSecOffloadV1_IPv4ESP_GUID, 0x86522023,0x4536,0x4b58,0xa1,0xf4,0x25,0x38,0x94,0x1a,0xce,0x43);
+DEFINE_GUID(MSNdis_WmiIPSecOffloadV1_Supported_GUID, 0xf86676b9,0xd9fa,0x4d26,0x95,0xce,0xbf,0xbc,0x77,0xd8,0x05,0x96);
+DEFINE_GUID(MSNdis_WmiMethodHeader_GUID, 0xe3eac9dd,0x2fd3,0x4963,0xbf,0xfd,0xb4,0x69,0x28,0x88,0xc0,0xd4);
+DEFINE_GUID(MSNdis_WmiOffload_GUID, 0x7a877086,0x2204,0x4a8a,0x92,0xa4,0xe3,0xe8,0xab,0x62,0x66,0x29);
+DEFINE_GUID(MSNdis_WmiOutputInfo_GUID, 0x7510bb9d,0xdf70,0x4f7e,0xba,0x07,0xe2,0x9d,0x33,0x0b,0x3c,0xc5);
+DEFINE_GUID(MSNdis_WmiReceiveScaleCapabilities_GUID, 0xf7a4960a,0xace3,0x44dc,0xb5,0x1e,0x72,0xe0,0x5c,0x5e,0xaf,0xa8);
+DEFINE_GUID(MSNdis_WmiSetHeader_GUID, 0x3b5605d8,0x1aaf,0x4ff6,0x85,0xb9,0xbc,0x5f,0xb9,0x73,0xdc,0x54);
+DEFINE_GUID(MSNdis_WmiTcpConnectionOffload_GUID, 0x93cfcd3f,0x6228,0x455c,0x90,0x5e,0x3a,0xb8,0x0a,0x2f,0xf0,0x90);
+DEFINE_GUID(MSNdis_WmiTcpIpChecksumOffload_GUID, 0x189d4015,0x1b25,0x4d8e,0xa4,0xa9,0xf9,0xeb,0xa8,0x21,0x97,0xc7);
+DEFINE_GUID(MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_GUID, 0xd63d537a,0x59c1,0x4fae,0x8f,0x9b,0xcd,0x9f,0xbb,0xec,0xb8,0x5a);
+DEFINE_GUID(MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_GUID, 0xb9760e75,0x6662,0x49e4,0xaa,0x6c,0xf0,0x28,0xbe,0xfe,0xc8,0xee);
+DEFINE_GUID(MSNdis_WmiTcpLargeSendOffloadV1_GUID, 0xb9e4e2f9,0xee89,0x4756,0xb0,0x57,0x38,0xf9,0xd9,0xb5,0x9a,0x92);
+DEFINE_GUID(MSNdis_WmiTcpLargeSendOffloadV1_IPv4_GUID, 0xd7673b11,0xe892,0x4a9d,0x8b,0xd8,0x76,0x1f,0xf2,0x56,0xed,0xd9);
+DEFINE_GUID(MSNdis_WmiTcpLargeSendOffloadV2_GUID, 0x592977c2,0xcfbe,0x462c,0xb5,0xcf,0x1a,0x76,0x79,0xfe,0x1c,0xba);
+DEFINE_GUID(MSNdis_WmiTcpLargeSendOffloadV2_IPv4_GUID, 0x8823d030,0xfa30,0x4b73,0xb3,0x39,0xdb,0x19,0x20,0x7f,0x0d,0x81);
+DEFINE_GUID(MSNdis_WmiTcpLargeSendOffloadV2_IPv6_GUID, 0xa7a9597c,0x2f8e,0x410b,0x9b,0xb3,0x5c,0x3a,0x50,0x79,0x2b,0xfc);
+DEFINE_GUID(MSParallel_AllocFreeCounts_GUID, 0x4bbb69ea,0x6853,0x11d2,0x8e,0xce,0x00,0xc0,0x4f,0x8e,0xf4,0x81);
+DEFINE_GUID(MSParallel_DeviceBytesTransferred_GUID, 0x89fef2d6,0x654b,0x11d2,0x9e,0x15,0x00,0xc0,0x4f,0x8e,0xf4,0x81);
+DEFINE_GUID(MSPower_DeviceEnable_GUID, 0x827c0a6f,0xfeb0,0x11d0,0xbd,0x26,0x00,0xaa,0x00,0xb7,0xb3,0x2a);
+DEFINE_GUID(MSPower_DeviceWakeEnable_GUID, 0xa9546a82,0xfeb0,0x11d0,0xbd,0x26,0x00,0xaa,0x00,0xb7,0xb3,0x2a);
+DEFINE_GUID(MSRedbook_DriverInformationGuid, 0xb90550e7,0xae0a,0x11d1,0xa5,0x71,0x00,0xc0,0x4f,0xa3,0x47,0x30);
+DEFINE_GUID(MSRedbook_PerformanceGuid, 0xb90550e8,0xae0a,0x11d1,0xa5,0x71,0x00,0xc0,0x4f,0xa3,0x47,0x30);
+DEFINE_GUID(MSSerial_CommInfo_GUID, 0xedb16a62,0xb16c,0x11d1,0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d);
+DEFINE_GUID(MSSerial_CommProperties_GUID, 0x8209ec2a,0x2d6b,0x11d2,0xba,0x49,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSSerial_HardwareConfiguration_GUID, 0x270b9b86,0xb16d,0x11d1,0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d);
+DEFINE_GUID(MSSerial_PerformanceInformation_GUID, 0x56415acc,0xb16d,0x11d1,0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d);
+DEFINE_GUID(MSSerial_PortName_GUID, 0xa0ec11a8,0xb16c,0x11d1,0xbd,0x98,0x00,0xa0,0xc9,0x06,0xbe,0x2d);
+DEFINE_GUID(MSSmBios_RawSMBiosTables_GUID, 0x8f680850,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSSmBios_SMBiosEventlog_GUID, 0x8f680851,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSSmBios_Sysid1394List_GUID, 0x8f680855,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSSmBios_Sysid1394_GUID, 0x8f680854,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSSmBios_SysidUUIDList_GUID, 0x8f680853,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSSmBios_SysidUUID_GUID, 0x8f680852,0xa584,0x11d1,0xbf,0x38,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSStorageDriver_ATAPISmartData_GUID, 0x78ebc103,0x4cf9,0x11d2,0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSStorageDriver_FailurePredictData_GUID, 0x78ebc103,0x4cf9,0x11d2,0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSStorageDriver_FailurePredictEvent_GUID, 0x78ebc104,0x4cf9,0x11d2,0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSStorageDriver_FailurePredictFunction_GUID, 0x78ebc105,0x4cf9,0x11d2,0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSStorageDriver_FailurePredictStatus_GUID, 0x78ebc102,0x4cf9,0x11d2,0xba,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSStorageDriver_FailurePredictThresholds_GUID, 0xdae10783,0xcc31,0x4d2a,0x8a,0x0f,0x86,0x1c,0x04,0x07,0x7a,0x95);
+DEFINE_GUID(MSStorageDriver_ScsiInfoExceptions_GUID, 0x1101d829,0x167b,0x4ebf,0xac,0xae,0x28,0xca,0xb7,0xc3,0x48,0x02);
+DEFINE_GUID(MSTapeDriveParam_GUID, 0xb9a8cfd5,0x8d72,0x47a4,0xac,0x0e,0x28,0x4a,0x32,0x00,0xf4,0xfb);
+DEFINE_GUID(MSTapeDriveProblemEvent_GUID, 0xbc4dd36c,0xfa66,0x4080,0x87,0xa0,0x0c,0x59,0x22,0xeb,0x78,0x87);
+DEFINE_GUID(MSTapeMediaCapacity_GUID, 0x8c2147a4,0xff29,0x4336,0xb8,0xa4,0x22,0x7b,0x54,0xcc,0x09,0x66);
+DEFINE_GUID(MSTapeProblemDeviceError_GUID, 0x43ec6b13,0x10bb,0x4bf6,0xb7,0x16,0x1c,0x1e,0x2f,0x10,0xbb,0x5f);
+DEFINE_GUID(MSTapeProblemIoError_GUID, 0x58fd29f9,0xb516,0x40fd,0x87,0x1a,0x7e,0xe7,0x6d,0x5b,0xb5,0x3e);
+DEFINE_GUID(MSTapeSymbolicName_GUID, 0x3fb828f7,0xf119,0x4066,0xb1,0xe6,0xdb,0x40,0x7c,0xe9,0xde,0x91);
+DEFINE_GUID(MSVerifierIrpLogEntry_GUID, 0x45068237,0x595d,0x4c7d,0xbd,0x80,0xf8,0x4a,0xdc,0x02,0x57,0xf8);
+DEFINE_GUID(MSVerifierIrpLogInformation_GUID, 0x1e2c2980,0xf7db,0x46aa,0x82,0x0e,0x87,0x34,0xfc,0xc2,0x1f,0x4c);
+DEFINE_GUID(MSWmi_GuidRegistrationInfo_GUID, 0xb48d49a1,0xe777,0x11d0,0xa5,0x0c,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSWmi_Guid_GUID, 0xf8c60aed,0xef8d,0x4f95,0x9e,0xa8,0xf0,0x43,0x18,0xa0,0x0f,0x30);
+DEFINE_GUID(MSWmi_MofData_GUID, 0x05901221,0xd566,0x11d1,0xb2,0xf0,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSWmi_PnPDeviceId_GUID, 0xc7bf35d2,0xaadb,0x11d1,0xbf,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSWmi_PnPInstanceNames_GUID, 0xc7bf35d3,0xaadb,0x11d1,0xbf,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(MSWmi_ProviderInfo_GUID, 0xc7bf35d0,0xaadb,0x11d1,0xbf,0x4a,0x00,0xa0,0xc9,0x06,0x29,0x10);
+DEFINE_GUID(ProcessorPerformance_GUID, 0x7fd18652,0x0cfe,0x40d2,0xb0,0xa1,0x0b,0x06,0x6a,0x87,0x75,0x9e);
+DEFINE_GUID(RegisteredGuids_GUID, 0xe3dff7bd,0x3915,0x11d2,0x91,0x03,0x00,0xc0,0x4f,0xb9,0x98,0xa2);
+DEFINE_GUID(VideoModeDescriptor_GUID, 0x4a97ed30,0xbfaa,0x491a,0x9d,0xfd,0xb4,0x3a,0xde,0xdb,0xf8,0xe3);
+DEFINE_GUID(WHEAErrorInjectionMethods_GUID, 0xe808ff73,0x2093,0x472a,0xa5,0xcc,0xdf,0x24,0xf0,0x31,0xb0,0x35);
+DEFINE_GUID(WHEAErrorSourceMethods_GUID, 0x91c3c007,0x185d,0x4d78,0xa7,0x51,0xbf,0xcb,0x31,0xc2,0xc6,0x4d);
+DEFINE_GUID(WmiMonitorAnalogVideoInputParams_GUID, 0xa56dbcf9,0xc4f0,0x44a8,0x9c,0x1b,0xbb,0x3b,0x3f,0x77,0x4b,0x4d);
+DEFINE_GUID(WmiMonitorBasicDisplayParams_GUID, 0x9831b7e6,0x09ac,0x491f,0x8d,0x07,0x3c,0x3d,0x64,0x9d,0x82,0x40);
+DEFINE_GUID(WmiMonitorBrightnessEvent_GUID, 0x123c80d2,0x937f,0x4cfe,0x80,0xf4,0xc4,0x0d,0x59,0x6e,0x48,0xb7);
+DEFINE_GUID(WmiMonitorBrightnessMethods_GUID, 0x479b20b4,0x5559,0x46fe,0xbe,0x97,0x7d,0x22,0x21,0x54,0x42,0x1f);
+DEFINE_GUID(WmiMonitorBrightness_GUID, 0xd43412ac,0x67f9,0x4fbb,0xa0,0x81,0x17,0x52,0xa2,0xc3,0x3e,0x84);
+DEFINE_GUID(WmiMonitorColorCharacteristics_GUID, 0xea324793,0x51bb,0x486a,0xaa,0x9d,0x0f,0x55,0x52,0x35,0x34,0x13);
+DEFINE_GUID(WmiMonitorColorXYZinCIE_GUID, 0x01faf041,0x842c,0x4230,0xa3,0x1e,0x13,0x35,0x42,0x8c,0xd8,0xf0);
+DEFINE_GUID(WmiMonitorConnectionParams_GUID, 0x2e2d2463,0xb537,0x4da7,0x8e,0xee,0x51,0x30,0x6f,0x1f,0x48,0x2f);
+DEFINE_GUID(WmiMonitorDescriptorMethods_GUID, 0x5341576e,0x75c4,0x4aeb,0xa8,0x2b,0x87,0x3c,0xd3,0xc6,0xb3,0x84);
+DEFINE_GUID(WmiMonitorDigitalVideoInputParams_GUID, 0x51565945,0x498a,0x4a77,0xac,0xc6,0x15,0x1b,0xec,0xc8,0x05,0xca);
+DEFINE_GUID(WmiMonitorID_GUID, 0x671a8285,0x4edb,0x4cae,0x99,0xfe,0x69,0xa1,0x5c,0x48,0xc0,0xbc);
+DEFINE_GUID(WmiMonitorListedFrequencyRanges_GUID, 0xe86e9525,0x65b6,0x4b85,0x95,0xc5,0x00,0xbe,0xac,0xc9,0x75,0xed);
+DEFINE_GUID(WmiMonitorListedSupportedSourceModes_GUID, 0x6dc76655,0x063c,0x4524,0xa8,0x62,0xb8,0x41,0x0c,0x26,0x28,0x1b);
+DEFINE_GUID(WmiMonitorRawEEdidV1Block_GUID, 0xfaee1471,0x5149,0x4a68,0xac,0x2c,0xbf,0x96,0xec,0x09,0xf0,0x04);
+DEFINE_GUID(WmiMonitorSupportedDisplayFeatures_GUID, 0x9fa9c28b,0x5e5c,0x4035,0xa5,0xf8,0x67,0xd4,0x55,0x4f,0x8d,0x04);
+
+#endif /* !(defined(MIDL_PASS)) */
+
+#define MSWmi_MofData_Unused1_SIZE sizeof(ULONG)
+#define MSWmi_MofData_Unused1_ID 1
+#define MSWmi_MofData_Unused2_SIZE sizeof(ULONG)
+#define MSWmi_MofData_Unused2_ID 2
+#define MSWmi_MofData_Size_SIZE sizeof(ULONG)
+#define MSWmi_MofData_Size_ID 3
+#define MSWmi_MofData_Unused4_SIZE sizeof(ULONG)
+#define MSWmi_MofData_Unused4_ID 4
+#define MSWmi_MofData_BinaryMofData_ID 5
+
+#define MSWmi_PnPDeviceId_PnPDeviceId_ID 1
+#define MSWmi_PnPInstanceNames_Count_SIZE sizeof(ULONG)
+#define MSWmi_PnPInstanceNames_Count_ID 1
+#define MSWmi_PnPInstanceNames_InstanceNameList_ID 2
+
+#define MSWmi_Guid_Guid_SIZE sizeof(UCHAR[16])
+#define MSWmi_Guid_Guid_ID 1
+#define MSWmi_Guid_SIZE (FIELD_OFFSET(MSWmi_Guid, Guid) + MSWmi_Guid_Guid_SIZE)
+
+#define MSWmi_GuidRegistrationInfo_Operation_SIZE sizeof(ULONG)
+#define MSWmi_GuidRegistrationInfo_Operation_ID 1
+#define MSWmi_GuidRegistrationInfo_GuidCount_SIZE sizeof(ULONG)
+#define MSWmi_GuidRegistrationInfo_GuidCount_ID 2
+#define MSWmi_GuidRegistrationInfo_GuidList_ID 3
+
+#define MSAcpiInfo_BootArchitecture_SIZE sizeof(ULONG)
+#define MSAcpiInfo_BootArchitecture_ID 1
+#define MSAcpiInfo_PreferredProfile_SIZE sizeof(ULONG)
+#define MSAcpiInfo_PreferredProfile_ID 2
+#define MSAcpiInfo_Capabilities_SIZE sizeof(ULONG)
+#define MSAcpiInfo_Capabilities_ID 3
+#define MSAcpiInfo_SIZE (FIELD_OFFSET(MSAcpiInfo, Capabilities) + MSAcpiInfo_Capabilities_SIZE)
+
+#define GetErrorInjectionCapabilitiesRtn 1
+
+#define GET_INJECTION_CAPABILITIES_OUT_Status_SIZE sizeof(ULONG)
+#define GET_INJECTION_CAPABILITIES_OUT_Status_ID 1
+#define GET_INJECTION_CAPABILITIES_OUT_Capabilities_SIZE sizeof(ULONG)
+#define GET_INJECTION_CAPABILITIES_OUT_Capabilities_ID 2
+
+#define GET_INJECTION_CAPABILITIES_OUT_SIZE (FIELD_OFFSET(GET_INJECTION_CAPABILITIES_OUT, Capabilities) + GET_INJECTION_CAPABILITIES_OUT_Capabilities_SIZE)
+
+#define InjectErrorRtn 2
+
+#define INJECT_HARDWARE_ERROR_IN_ErrorType_SIZE sizeof(ULONG)
+#define INJECT_HARDWARE_ERROR_IN_ErrorType_ID 1
+#define INJECT_HARDWARE_ERROR_IN_Parameter1_SIZE sizeof(ULONGLONG)
+#define INJECT_HARDWARE_ERROR_IN_Parameter1_ID 2
+#define INJECT_HARDWARE_ERROR_IN_Parameter2_SIZE sizeof(ULONGLONG)
+#define INJECT_HARDWARE_ERROR_IN_Parameter2_ID 3
+#define INJECT_HARDWARE_ERROR_IN_Parameter3_SIZE sizeof(ULONGLONG)
+#define INJECT_HARDWARE_ERROR_IN_Parameter3_ID 4
+#define INJECT_HARDWARE_ERROR_IN_Parameter4_SIZE sizeof(ULONGLONG)
+#define INJECT_HARDWARE_ERROR_IN_Parameter4_ID 5
+
+#define INJECT_HARDWARE_ERROR_IN_SIZE (FIELD_OFFSET(INJECT_HARDWARE_ERROR_IN, Parameter4) + INJECT_HARDWARE_ERROR_IN_Parameter4_SIZE)
+
+#define INJECT_HARDWARE_ERROR_OUT_Status_SIZE sizeof(ULONG)
+#define INJECT_HARDWARE_ERROR_OUT_Status_ID 6
+
+#define INJECT_HARDWARE_ERROR_OUT_SIZE (FIELD_OFFSET(INJECT_HARDWARE_ERROR_OUT, Status) + INJECT_HARDWARE_ERROR_OUT_Status_SIZE)
+
+#define GetAllErrorSourcesRtn 1
+
+#define GET_ALL_ERROR_SOURCES_OUT_Status_SIZE sizeof(ULONG)
+#define GET_ALL_ERROR_SOURCES_OUT_Status_ID 1
+#define GET_ALL_ERROR_SOURCES_OUT_Count_SIZE sizeof(ULONG)
+#define GET_ALL_ERROR_SOURCES_OUT_Count_ID 2
+#define GET_ALL_ERROR_SOURCES_OUT_Length_SIZE sizeof(ULONG)
+#define GET_ALL_ERROR_SOURCES_OUT_Length_ID 3
+#define GET_ALL_ERROR_SOURCES_OUT_ErrorSourceArray_ID 4
+
+#define GetErrorSourceInfoRtn 2
+
+#define GET_ERROR_SOURCE_INFO_IN_ErrorSourceId_SIZE sizeof(ULONG)
+#define GET_ERROR_SOURCE_INFO_IN_ErrorSourceId_ID 2
+
+#define GET_ERROR_SOURCE_INFO_IN_SIZE (FIELD_OFFSET(GET_ERROR_SOURCE_INFO_IN, ErrorSourceId) + GET_ERROR_SOURCE_INFO_IN_ErrorSourceId_SIZE)
+
+#define GET_ERROR_SOURCE_INFO_OUT_Status_SIZE sizeof(ULONG)
+#define GET_ERROR_SOURCE_INFO_OUT_Status_ID 1
+#define GET_ERROR_SOURCE_INFO_OUT_Length_SIZE sizeof(ULONG)
+#define GET_ERROR_SOURCE_INFO_OUT_Length_ID 3
+#define GET_ERROR_SOURCE_INFO_OUT_ErrorSourceInfo_ID 4
+
+#define SetErrorSourceInfoRtn 3
+
+#define SET_ERROR_SOURCE_INFO_IN_Length_SIZE sizeof(ULONG)
+#define SET_ERROR_SOURCE_INFO_IN_Length_ID 2
+#define SET_ERROR_SOURCE_INFO_IN_ErrorSourceInfo_ID 3
+
+#define SET_ERROR_SOURCE_INFO_OUT_Status_SIZE sizeof(ULONG)
+#define SET_ERROR_SOURCE_INFO_OUT_Status_ID 1
+
+#define SET_ERROR_SOURCE_INFO_OUT_SIZE (FIELD_OFFSET(SET_ERROR_SOURCE_INFO_OUT, Status) + SET_ERROR_SOURCE_INFO_OUT_Status_SIZE)
+
+#define EnableErrorSourceRtn 4
+
+#define ENABLE_ERROR_SOURCE_IN_ErrorSourceId_SIZE sizeof(ULONG)
+#define ENABLE_ERROR_SOURCE_IN_ErrorSourceId_ID 2
+
+#define ENABLE_ERROR_SOURCE_IN_SIZE (FIELD_OFFSET(ENABLE_ERROR_SOURCE_IN, ErrorSourceId) + ENABLE_ERROR_SOURCE_IN_ErrorSourceId_SIZE)
+
+#define ENABLE_ERROR_SOURCE_OUT_Status_SIZE sizeof(ULONG)
+#define ENABLE_ERROR_SOURCE_OUT_Status_ID 1
+
+#define ENABLE_ERROR_SOURCE_OUT_SIZE (FIELD_OFFSET(ENABLE_ERROR_SOURCE_OUT, Status) + ENABLE_ERROR_SOURCE_OUT_Status_SIZE)
+
+#define DisableErrorSourceRtn 5
+
+#define DISABLE_ERROR_SOURCE_IN_ErrorSourceId_SIZE sizeof(ULONG)
+#define DISABLE_ERROR_SOURCE_IN_ErrorSourceId_ID 2
+
+#define DISABLE_ERROR_SOURCE_IN_SIZE (FIELD_OFFSET(DISABLE_ERROR_SOURCE_IN, ErrorSourceId) + DISABLE_ERROR_SOURCE_IN_ErrorSourceId_SIZE)
+
+#define DISABLE_ERROR_SOURCE_OUT_Status_SIZE sizeof(ULONG)
+#define DISABLE_ERROR_SOURCE_OUT_Status_ID 1
+
+#define DISABLE_ERROR_SOURCE_OUT_SIZE (FIELD_OFFSET(DISABLE_ERROR_SOURCE_OUT, Status) + DISABLE_ERROR_SOURCE_OUT_Status_SIZE)
+
+#define MSSmBios_RawSMBiosTables_Used20CallingMethod_SIZE sizeof(BOOLEAN)
+#define MSSmBios_RawSMBiosTables_Used20CallingMethod_ID 1
+#define MSSmBios_RawSMBiosTables_SmbiosMajorVersion_SIZE sizeof(UCHAR)
+#define MSSmBios_RawSMBiosTables_SmbiosMajorVersion_ID 2
+#define MSSmBios_RawSMBiosTables_SmbiosMinorVersion_SIZE sizeof(UCHAR)
+#define MSSmBios_RawSMBiosTables_SmbiosMinorVersion_ID 3
+#define MSSmBios_RawSMBiosTables_DmiRevision_SIZE sizeof(UCHAR)
+#define MSSmBios_RawSMBiosTables_DmiRevision_ID 4
+#define MSSmBios_RawSMBiosTables_Size_SIZE sizeof(ULONG)
+#define MSSmBios_RawSMBiosTables_Size_ID 5
+#define MSSmBios_RawSMBiosTables_SMBiosData_ID 6
+
+#define MSMCAEvent_Header_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_Header_RecordId_ID 1
+#define MSMCAEvent_Header_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_Header_ErrorSeverity_ID 2
+#define MSMCAEvent_Header_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_Header_Type_ID 3
+#define MSMCAEvent_Header_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_Header_Cpu_ID 4
+#define MSMCAEvent_Header_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_Header_AdditionalErrors_ID 5
+#define MSMCAEvent_Header_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_Header_LogToEventlog_ID 6
+
+#define MSMCAEvent_Header_SIZE (FIELD_OFFSET(MSMCAEvent_Header, LogToEventlog) + MSMCAEvent_Header_LogToEventlog_SIZE)
+
+#define MSMCAEvent_BusError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_BusError_RecordId_ID 1
+#define MSMCAEvent_BusError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_BusError_ErrorSeverity_ID 2
+#define MSMCAEvent_BusError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_Type_ID 3
+#define MSMCAEvent_BusError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_Cpu_ID 4
+#define MSMCAEvent_BusError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_AdditionalErrors_ID 5
+#define MSMCAEvent_BusError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_LogToEventlog_ID 6
+#define MSMCAEvent_BusError_Participation_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_Participation_ID 7
+#define MSMCAEvent_BusError_MemoryHierarchyLevel_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_MemoryHierarchyLevel_ID 8
+#define MSMCAEvent_BusError_RequestType_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_RequestType_ID 9
+#define MSMCAEvent_BusError_MemOrIo_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_MemOrIo_ID 10
+#define MSMCAEvent_BusError_Address_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_BusError_Address_ID 11
+#define MSMCAEvent_BusError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_BusError_Size_ID 12
+#define MSMCAEvent_BusError_RawRecord_ID 13
+
+#define MSMCAEvent_TLBError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_TLBError_RecordId_ID 1
+#define MSMCAEvent_TLBError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_TLBError_ErrorSeverity_ID 2
+#define MSMCAEvent_TLBError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_Type_ID 3
+#define MSMCAEvent_TLBError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_Cpu_ID 4
+#define MSMCAEvent_TLBError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_AdditionalErrors_ID 5
+#define MSMCAEvent_TLBError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_LogToEventlog_ID 6
+#define MSMCAEvent_TLBError_TransactionType_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_TransactionType_ID 7
+#define MSMCAEvent_TLBError_MemoryHierarchyLevel_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_MemoryHierarchyLevel_ID 8
+#define MSMCAEvent_TLBError_Address_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_TLBError_Address_ID 9
+#define MSMCAEvent_TLBError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_TLBError_Size_ID 10
+#define MSMCAEvent_TLBError_RawRecord_ID 11
+
+#define MSMCAEvent_MemoryHierarchyError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryHierarchyError_RecordId_ID 1
+#define MSMCAEvent_MemoryHierarchyError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_MemoryHierarchyError_ErrorSeverity_ID 2
+#define MSMCAEvent_MemoryHierarchyError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_Type_ID 3
+#define MSMCAEvent_MemoryHierarchyError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_Cpu_ID 4
+#define MSMCAEvent_MemoryHierarchyError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_AdditionalErrors_ID 5
+#define MSMCAEvent_MemoryHierarchyError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_LogToEventlog_ID 6
+#define MSMCAEvent_MemoryHierarchyError_TransactionType_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_TransactionType_ID 7
+#define MSMCAEvent_MemoryHierarchyError_MemoryHierarchyLevel_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_MemoryHierarchyLevel_ID 8
+#define MSMCAEvent_MemoryHierarchyError_RequestType_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_RequestType_ID 9
+#define MSMCAEvent_MemoryHierarchyError_Address_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryHierarchyError_Address_ID 10
+#define MSMCAEvent_MemoryHierarchyError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryHierarchyError_Size_ID 11
+#define MSMCAEvent_MemoryHierarchyError_RawRecord_ID 12
+
+#define MSMCAEvent_CPUError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_CPUError_RecordId_ID 1
+#define MSMCAEvent_CPUError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_CPUError_ErrorSeverity_ID 2
+#define MSMCAEvent_CPUError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_Type_ID 3
+#define MSMCAEvent_CPUError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_Cpu_ID 4
+#define MSMCAEvent_CPUError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_AdditionalErrors_ID 5
+#define MSMCAEvent_CPUError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_LogToEventlog_ID 6
+#define MCACpuCacheError 0
+#define MCACpuTlbError 1
+#define MCACpuBusError 2
+#define MCACpuRegFileError 3
+#define MCACpuMSError 4
+#define MSMCAEvent_CPUError_MajorErrorType_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_MajorErrorType_ID 7
+#define MSMCAEvent_CPUError_Level_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_Level_ID 8
+#define MSMCAEvent_CPUError_CacheOp_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_CacheOp_ID 9
+#define MSMCAEvent_CPUError_CacheMesi_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_CacheMesi_ID 10
+#define MSMCAEvent_CPUError_TLBOp_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_TLBOp_ID 11
+#define MSMCAEvent_CPUError_BusType_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_BusType_ID 12
+#define MSMCAEvent_CPUError_BusSev_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_BusSev_ID 13
+#define MSMCAEvent_CPUError_RegFileId_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_RegFileId_ID 14
+#define MSMCAEvent_CPUError_RegFileOp_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_RegFileOp_ID 15
+#define MSMCAEvent_CPUError_MSSid_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_MSSid_ID 16
+#define MSMCAEvent_CPUError_MSOp_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_MSOp_ID 17
+#define MSMCAEvent_CPUError_MSArrayId_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_MSArrayId_ID 18
+#define MSMCAEvent_CPUError_MSIndex_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_MSIndex_ID 19
+#define MSMCAEvent_CPUError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_CPUError_Size_ID 20
+#define MSMCAEvent_CPUError_RawRecord_ID 21
+
+#define MSMCAEvent_MemoryError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_RecordId_ID 1
+#define MSMCAEvent_MemoryError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_MemoryError_ErrorSeverity_ID 2
+#define MSMCAEvent_MemoryError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryError_Type_ID 3
+#define MSMCAEvent_MemoryError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryError_Cpu_ID 4
+#define MSMCAEvent_MemoryError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryError_AdditionalErrors_ID 5
+#define MSMCAEvent_MemoryError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryError_LogToEventlog_ID 6
+#define MSMCAEvent_MemoryError_VALIDATION_BITS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_VALIDATION_BITS_ID 7
+#define MSMCAEvent_MemoryError_MEM_ERROR_STATUS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_MEM_ERROR_STATUS_ID 8
+#define MSMCAEvent_MemoryError_MEM_PHYSICAL_ADDR_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_MEM_PHYSICAL_ADDR_ID 9
+#define MSMCAEvent_MemoryError_MEM_PHYSICAL_MASK_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_MEM_PHYSICAL_MASK_ID 10
+#define MSMCAEvent_MemoryError_RESPONDER_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_RESPONDER_ID_ID 11
+#define MSMCAEvent_MemoryError_TARGET_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_TARGET_ID_ID 12
+#define MSMCAEvent_MemoryError_REQUESTOR_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_REQUESTOR_ID_ID 13
+#define MSMCAEvent_MemoryError_BUS_SPECIFIC_DATA_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryError_BUS_SPECIFIC_DATA_ID 14
+#define MSMCAEvent_MemoryError_MEM_NODE_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_NODE_ID 15
+#define MSMCAEvent_MemoryError_MEM_CARD_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_CARD_ID 16
+#define MSMCAEvent_MemoryError_MEM_BANK_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_BANK_ID 17
+#define MSMCAEvent_MemoryError_xMEM_DEVICE_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_xMEM_DEVICE_ID 18
+#define MSMCAEvent_MemoryError_MEM_MODULE_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_MODULE_ID 19
+#define MSMCAEvent_MemoryError_MEM_ROW_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_ROW_ID 20
+#define MSMCAEvent_MemoryError_MEM_COLUMN_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_COLUMN_ID 21
+#define MSMCAEvent_MemoryError_MEM_BIT_POSITION_SIZE sizeof(USHORT)
+#define MSMCAEvent_MemoryError_MEM_BIT_POSITION_ID 22
+#define MSMCAEvent_MemoryError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_MemoryError_Size_ID 23
+#define MSMCAEvent_MemoryError_RawRecord_ID 24
+
+#define MSMCAEvent_PCIBusError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_RecordId_ID 1
+#define MSMCAEvent_PCIBusError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIBusError_ErrorSeverity_ID 2
+#define MSMCAEvent_PCIBusError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIBusError_Type_ID 3
+#define MSMCAEvent_PCIBusError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIBusError_Cpu_ID 4
+#define MSMCAEvent_PCIBusError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIBusError_AdditionalErrors_ID 5
+#define MSMCAEvent_PCIBusError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIBusError_LogToEventlog_ID 6
+#define MSMCAEvent_PCIBusError_VALIDATION_BITS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_VALIDATION_BITS_ID 7
+#define MSMCAEvent_PCIBusError_PCI_BUS_ERROR_STATUS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_ERROR_STATUS_ID 8
+#define MSMCAEvent_PCIBusError_PCI_BUS_ADDRESS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_ADDRESS_ID 9
+#define MSMCAEvent_PCIBusError_PCI_BUS_DATA_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_DATA_ID 10
+#define MSMCAEvent_PCIBusError_PCI_BUS_CMD_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_CMD_ID 11
+#define MSMCAEvent_PCIBusError_PCI_BUS_REQUESTOR_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_REQUESTOR_ID_ID 12
+#define MSMCAEvent_PCIBusError_PCI_BUS_RESPONDER_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_RESPONDER_ID_ID 13
+#define MSMCAEvent_PCIBusError_PCI_BUS_TARGET_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIBusError_PCI_BUS_TARGET_ID_ID 14
+#define MSMCAEvent_PCIBusError_PCI_BUS_ERROR_TYPE_SIZE sizeof(USHORT)
+#define MSMCAEvent_PCIBusError_PCI_BUS_ERROR_TYPE_ID 15
+#define MSMCAEvent_PCIBusError_PCI_BUS_ID_BusNumber_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIBusError_PCI_BUS_ID_BusNumber_ID 16
+#define MSMCAEvent_PCIBusError_PCI_BUS_ID_SegmentNumber_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIBusError_PCI_BUS_ID_SegmentNumber_ID 17
+#define MSMCAEvent_PCIBusError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIBusError_Size_ID 18
+#define MSMCAEvent_PCIBusError_RawRecord_ID 19
+
+#define SYSID_UUID_Uuid_SIZE sizeof(UCHAR[16])
+#define SYSID_UUID_Uuid_ID 1
+
+#define SYSID_UUID_SIZE (FIELD_OFFSET(SYSID_UUID, Uuid) + SYSID_UUID_Uuid_SIZE)
+
+#define MSSmBios_SysidUUIDList_Count_SIZE sizeof(ULONG)
+#define MSSmBios_SysidUUIDList_Count_ID 1
+#define MSSmBios_SysidUUIDList_List_ID 2
+
+#define SYSID_1394_x1394_SIZE sizeof(UCHAR[8])
+#define SYSID_1394_x1394_ID 1
+
+#define SYSID_1394_SIZE (FIELD_OFFSET(SYSID_1394, x1394) + SYSID_1394_x1394_SIZE)
+
+#define MSSmBios_Sysid1394List_Count_SIZE sizeof(ULONG)
+#define MSSmBios_Sysid1394List_Count_ID 1
+#define MSSmBios_Sysid1394List_List_ID 2
+
+#define MSMCAEvent_PCIComponentError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIComponentError_RecordId_ID 1
+#define MSMCAEvent_PCIComponentError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_ErrorSeverity_ID 2
+#define MSMCAEvent_PCIComponentError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIComponentError_Type_ID 3
+#define MSMCAEvent_PCIComponentError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIComponentError_Cpu_ID 4
+#define MSMCAEvent_PCIComponentError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIComponentError_AdditionalErrors_ID 5
+#define MSMCAEvent_PCIComponentError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIComponentError_LogToEventlog_ID 6
+#define MSMCAEvent_PCIComponentError_VALIDATION_BITS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIComponentError_VALIDATION_BITS_ID 7
+#define MSMCAEvent_PCIComponentError_PCI_COMP_ERROR_STATUS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_ERROR_STATUS_ID 8
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_VendorId_SIZE sizeof(USHORT)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_VendorId_ID 9
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_DeviceId_SIZE sizeof(USHORT)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_DeviceId_ID 10
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_ClassCodeInterface_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_ClassCodeInterface_ID 11
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_ClassCodeSubClass_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_ClassCodeSubClass_ID 12
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_ClassCodeBaseClass_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_ClassCodeBaseClass_ID 13
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_FunctionNumber_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_FunctionNumber_ID 14
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_DeviceNumber_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_DeviceNumber_ID 15
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_BusNumber_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_BusNumber_ID 16
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_SegmentNumber_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PCIComponentError_PCI_COMP_INFO_SegmentNumber_ID 17
+#define MSMCAEvent_PCIComponentError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_PCIComponentError_Size_ID 18
+#define MSMCAEvent_PCIComponentError_RawRecord_ID 19
+
+#define MSMCAEvent_SystemEventError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_SystemEventError_RecordId_ID 1
+#define MSMCAEvent_SystemEventError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_ErrorSeverity_ID 2
+#define MSMCAEvent_SystemEventError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_SystemEventError_Type_ID 3
+#define MSMCAEvent_SystemEventError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_SystemEventError_Cpu_ID 4
+#define MSMCAEvent_SystemEventError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_SystemEventError_AdditionalErrors_ID 5
+#define MSMCAEvent_SystemEventError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_SystemEventError_LogToEventlog_ID 6
+#define MSMCAEvent_SystemEventError_VALIDATION_BITS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_SystemEventError_VALIDATION_BITS_ID 7
+#define MSMCAEvent_SystemEventError_SEL_TIME_STAMP_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_SystemEventError_SEL_TIME_STAMP_ID 8
+#define MSMCAEvent_SystemEventError_SEL_RECORD_ID_SIZE sizeof(USHORT)
+#define MSMCAEvent_SystemEventError_SEL_RECORD_ID_ID 9
+#define MSMCAEvent_SystemEventError_SEL_GENERATOR_ID_SIZE sizeof(USHORT)
+#define MSMCAEvent_SystemEventError_SEL_GENERATOR_ID_ID 10
+#define MSMCAEvent_SystemEventError_SEL_RECORD_TYPE_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_RECORD_TYPE_ID 11
+#define MSMCAEvent_SystemEventError_SEL_EVM_REV_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_EVM_REV_ID 12
+#define MSMCAEvent_SystemEventError_SEL_SENSOR_TYPE_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_SENSOR_TYPE_ID 13
+#define MSMCAEvent_SystemEventError_SEL_SENSOR_NUM_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_SENSOR_NUM_ID 14
+#define MSMCAEvent_SystemEventError_SEL_EVENT_DIR_TYPE_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_EVENT_DIR_TYPE_ID 15
+#define MSMCAEvent_SystemEventError_SEL_DATA1_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_DATA1_ID 16
+#define MSMCAEvent_SystemEventError_SEL_DATA2_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_DATA2_ID 17
+#define MSMCAEvent_SystemEventError_SEL_DATA3_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SystemEventError_SEL_DATA3_ID 18
+#define MSMCAEvent_SystemEventError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_SystemEventError_Size_ID 19
+#define MSMCAEvent_SystemEventError_RawRecord_ID 20
+
+#define MSMCAEvent_SMBIOSError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_SMBIOSError_RecordId_ID 1
+#define MSMCAEvent_SMBIOSError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SMBIOSError_ErrorSeverity_ID 2
+#define MSMCAEvent_SMBIOSError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_SMBIOSError_Type_ID 3
+#define MSMCAEvent_SMBIOSError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_SMBIOSError_Cpu_ID 4
+#define MSMCAEvent_SMBIOSError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_SMBIOSError_AdditionalErrors_ID 5
+#define MSMCAEvent_SMBIOSError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_SMBIOSError_LogToEventlog_ID 6
+#define MSMCAEvent_SMBIOSError_VALIDATION_BITS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_SMBIOSError_VALIDATION_BITS_ID 7
+#define MSMCAEvent_SMBIOSError_SMBIOS_EVENT_TYPE_SIZE sizeof(UCHAR)
+#define MSMCAEvent_SMBIOSError_SMBIOS_EVENT_TYPE_ID 8
+#define MSMCAEvent_SMBIOSError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_SMBIOSError_Size_ID 9
+#define MSMCAEvent_SMBIOSError_RawRecord_ID 10
+
+#define MSMCAEvent_PlatformSpecificError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_RecordId_ID 1
+#define MSMCAEvent_PlatformSpecificError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_PlatformSpecificError_ErrorSeverity_ID 2
+#define MSMCAEvent_PlatformSpecificError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_PlatformSpecificError_Type_ID 3
+#define MSMCAEvent_PlatformSpecificError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_PlatformSpecificError_Cpu_ID 4
+#define MSMCAEvent_PlatformSpecificError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_PlatformSpecificError_AdditionalErrors_ID 5
+#define MSMCAEvent_PlatformSpecificError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_PlatformSpecificError_LogToEventlog_ID 6
+#define MSMCAEvent_PlatformSpecificError_VALIDATION_BITS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_VALIDATION_BITS_ID 7
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_ERROR_STATUS_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_ERROR_STATUS_ID 8
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_REQUESTOR_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_REQUESTOR_ID_ID 9
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_RESPONDER_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_RESPONDER_ID_ID 10
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_TARGET_ID_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_TARGET_ID_ID 11
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_BUS_SPECIFIC_DATA_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_PlatformSpecificError_PLATFORM_BUS_SPECIFIC_DATA_ID 12
+#define MSMCAEvent_PlatformSpecificError_OEM_COMPONENT_ID_SIZE sizeof(UCHAR[16])
+#define MSMCAEvent_PlatformSpecificError_OEM_COMPONENT_ID_ID 13
+#define MSMCAEvent_PlatformSpecificError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_PlatformSpecificError_Size_ID 14
+#define MSMCAEvent_PlatformSpecificError_RawRecord_ID 15
+
+#define MSMCAEvent_InvalidError_RecordId_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_InvalidError_RecordId_ID 1
+#define MSMCAEvent_InvalidError_ErrorSeverity_SIZE sizeof(UCHAR)
+#define MSMCAEvent_InvalidError_ErrorSeverity_ID 2
+#define MSMCAEvent_InvalidError_Type_SIZE sizeof(ULONG)
+#define MSMCAEvent_InvalidError_Type_ID 3
+#define MSMCAEvent_InvalidError_Cpu_SIZE sizeof(ULONG)
+#define MSMCAEvent_InvalidError_Cpu_ID 4
+#define MSMCAEvent_InvalidError_AdditionalErrors_SIZE sizeof(ULONG)
+#define MSMCAEvent_InvalidError_AdditionalErrors_ID 5
+#define MSMCAEvent_InvalidError_LogToEventlog_SIZE sizeof(ULONG)
+#define MSMCAEvent_InvalidError_LogToEventlog_ID 6
+#define MSMCAEvent_InvalidError_Size_SIZE sizeof(ULONG)
+#define MSMCAEvent_InvalidError_Size_ID 7
+#define MSMCAEvent_InvalidError_RawRecord_ID 8
+
+#define MSMCAEvent_MemoryPageRemoved_PhysicalAddress_SIZE sizeof(ULONGLONG)
+#define MSMCAEvent_MemoryPageRemoved_PhysicalAddress_ID 1
+
+#define MSMCAEvent_MemoryPageRemoved_SIZE (FIELD_OFFSET(MSMCAEvent_MemoryPageRemoved, PhysicalAddress) + MSMCAEvent_MemoryPageRemoved_PhysicalAddress_SIZE)
+
+#define MSMCAInfo_Entry_Length_SIZE sizeof(ULONG)
+#define MSMCAInfo_Entry_Length_ID 1
+#define MSMCAInfo_Entry_Data_ID 2
+
+#define MSMCAInfo_RawMCAData_Count_SIZE sizeof(ULONG)
+#define MSMCAInfo_RawMCAData_Count_ID 1
+#define MSMCAInfo_RawMCAData_Records_ID 2
+
+#define MSMCAInfo_RawCMCEvent_Count_SIZE sizeof(ULONG)
+#define MSMCAInfo_RawCMCEvent_Count_ID 1
+#define MSMCAInfo_RawCMCEvent_Records_ID 2
+
+#define MSMCAInfo_RawMCAEvent_Count_SIZE sizeof(ULONG)
+#define MSMCAInfo_RawMCAEvent_Count_ID 1
+#define MSMCAInfo_RawMCAEvent_Records_ID 2
+
+#define MSMCAInfo_RawCorrectedPlatformEvent_Count_SIZE sizeof(ULONG)
+#define MSMCAInfo_RawCorrectedPlatformEvent_Count_ID 1
+#define MSMCAInfo_RawCorrectedPlatformEvent_Records_ID 2
+
+#define MSPower_DeviceEnable_Enable_SIZE sizeof(BOOLEAN)
+#define MSPower_DeviceEnable_Enable_ID 1
+
+#define MSPower_DeviceEnable_SIZE (FIELD_OFFSET(MSPower_DeviceEnable, Enable) + MSPower_DeviceEnable_Enable_SIZE)
+
+#define MSPower_DeviceWakeEnable_Enable_SIZE sizeof(BOOLEAN)
+#define MSPower_DeviceWakeEnable_Enable_ID 1
+
+#define MSPower_DeviceWakeEnable_SIZE (FIELD_OFFSET(MSPower_DeviceWakeEnable, Enable) + MSPower_DeviceWakeEnable_Enable_SIZE)
+
+#define MSNdis_NetworkAddress_Address_SIZE sizeof(UCHAR[6])
+#define MSNdis_NetworkAddress_Address_ID 1
+
+#define MSNdis_NetworkAddress_SIZE (FIELD_OFFSET(MSNdis_NetworkAddress, Address) + MSNdis_NetworkAddress_Address_SIZE)
+
+#define MSNdis_NetworkShortAddress_Address_SIZE sizeof(UCHAR[2])
+#define MSNdis_NetworkShortAddress_Address_ID 1
+
+#define MSNdis_NetworkShortAddress_SIZE (FIELD_OFFSET(MSNdis_NetworkShortAddress, Address) + MSNdis_NetworkShortAddress_Address_SIZE)
+
+#define MSNdis_NetworkLinkSpeed_Outbound_SIZE sizeof(ULONG)
+#define MSNdis_NetworkLinkSpeed_Outbound_ID 1
+#define MSNdis_NetworkLinkSpeed_Inbound_SIZE sizeof(ULONG)
+#define MSNdis_NetworkLinkSpeed_Inbound_ID 2
+
+#define MSNdis_NetworkLinkSpeed_SIZE (FIELD_OFFSET(MSNdis_NetworkLinkSpeed, Inbound) + MSNdis_NetworkLinkSpeed_Inbound_SIZE)
+
+#define MSNdis_EnumerateAdapter_DeviceName_ID 1
+#define MSNdis_NotifyAdapterRemoval_DeviceName_ID 1
+#define MSNdis_NotifyAdapterArrival_DeviceName_ID 1
+
+#define MSNdis_DeviceWakeOnMagicPacketOnly_EnableWakeOnMagicPacketOnly_SIZE sizeof(BOOLEAN)
+#define MSNdis_DeviceWakeOnMagicPacketOnly_EnableWakeOnMagicPacketOnly_ID 1
+
+#define MSNdis_DeviceWakeOnMagicPacketOnly_SIZE (FIELD_OFFSET(MSNdis_DeviceWakeOnMagicPacketOnly, EnableWakeOnMagicPacketOnly) + MSNdis_DeviceWakeOnMagicPacketOnly_EnableWakeOnMagicPacketOnly_SIZE)
+
+#define MSNdis_RSSEnabled_RSSEnabled_SIZE sizeof(BOOLEAN)
+#define MSNdis_RSSEnabled_RSSEnabled_ID 1
+
+#define MSNdis_RSSEnabled_SIZE (FIELD_OFFSET(MSNdis_RSSEnabled, RSSEnabled) + MSNdis_RSSEnabled_RSSEnabled_SIZE)
+
+#define MSNdis_HardwareStatus_NdisHardwareStatus_SIZE sizeof(ULONG)
+#define MSNdis_HardwareStatus_NdisHardwareStatus_ID 1
+
+#define MSNdis_HardwareStatus_SIZE (FIELD_OFFSET(MSNdis_HardwareStatus, NdisHardwareStatus) + MSNdis_HardwareStatus_NdisHardwareStatus_SIZE)
+
+#define MSNdis_MediaSupported_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_MediaSupported_NumberElements_ID 1
+#define MSNdis_MediaSupported_NdisMediaSupported_ID 2
+
+#define MSNdis_MediaInUse_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_MediaInUse_NumberElements_ID 1
+#define MSNdis_MediaInUse_NdisMediaInUse_ID 2
+
+#define MSNdis_MaximumLookahead_NdisMaximumLookahead_SIZE sizeof(ULONG)
+#define MSNdis_MaximumLookahead_NdisMaximumLookahead_ID 1
+
+#define MSNdis_MaximumLookahead_SIZE (FIELD_OFFSET(MSNdis_MaximumLookahead, NdisMaximumLookahead) + MSNdis_MaximumLookahead_NdisMaximumLookahead_SIZE)
+
+#define MSNdis_MaximumFrameSize_NdisMaximumFrameSize_SIZE sizeof(ULONG)
+#define MSNdis_MaximumFrameSize_NdisMaximumFrameSize_ID 1
+
+#define MSNdis_MaximumFrameSize_SIZE (FIELD_OFFSET(MSNdis_MaximumFrameSize, NdisMaximumFrameSize) + MSNdis_MaximumFrameSize_NdisMaximumFrameSize_SIZE)
+
+#define MSNdis_LinkSpeed_NdisLinkSpeed_SIZE sizeof(ULONG)
+#define MSNdis_LinkSpeed_NdisLinkSpeed_ID 1
+
+#define MSNdis_LinkSpeed_SIZE (FIELD_OFFSET(MSNdis_LinkSpeed, NdisLinkSpeed) + MSNdis_LinkSpeed_NdisLinkSpeed_SIZE)
+
+#define MSNdis_TransmitBufferSpace_NdisTransmitBufferSpace_SIZE sizeof(ULONG)
+#define MSNdis_TransmitBufferSpace_NdisTransmitBufferSpace_ID 1
+
+#define MSNdis_TransmitBufferSpace_SIZE (FIELD_OFFSET(MSNdis_TransmitBufferSpace, NdisTransmitBufferSpace) + MSNdis_TransmitBufferSpace_NdisTransmitBufferSpace_SIZE)
+
+#define MSNdis_ReceiveBufferSpace_NdisReceiveBufferSpace_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveBufferSpace_NdisReceiveBufferSpace_ID 1
+
+#define MSNdis_ReceiveBufferSpace_SIZE (FIELD_OFFSET(MSNdis_ReceiveBufferSpace, NdisReceiveBufferSpace) + MSNdis_ReceiveBufferSpace_NdisReceiveBufferSpace_SIZE)
+
+#define MSNdis_TransmitBlockSize_NdisTransmitBlockSize_SIZE sizeof(ULONG)
+#define MSNdis_TransmitBlockSize_NdisTransmitBlockSize_ID 1
+
+#define MSNdis_TransmitBlockSize_SIZE (FIELD_OFFSET(MSNdis_TransmitBlockSize, NdisTransmitBlockSize) + MSNdis_TransmitBlockSize_NdisTransmitBlockSize_SIZE)
+
+#define MSNdis_ReceiveBlockSize_NdisReceiveBlockSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveBlockSize_NdisReceiveBlockSize_ID 1
+
+#define MSNdis_ReceiveBlockSize_SIZE (FIELD_OFFSET(MSNdis_ReceiveBlockSize, NdisReceiveBlockSize) + MSNdis_ReceiveBlockSize_NdisReceiveBlockSize_SIZE)
+
+#define MSNdis_VendorID_NdisVendorID_SIZE sizeof(ULONG)
+#define MSNdis_VendorID_NdisVendorID_ID 1
+
+#define MSNdis_VendorID_SIZE (FIELD_OFFSET(MSNdis_VendorID, NdisVendorID) + MSNdis_VendorID_NdisVendorID_SIZE)
+
+#define MSNdis_VendorDescription_NdisVendorDescription_ID 1
+
+#define MSNdis_CurrentPacketFilter_NdisCurrentPacketFilter_SIZE sizeof(ULONG)
+#define MSNdis_CurrentPacketFilter_NdisCurrentPacketFilter_ID 1
+
+#define MSNdis_CurrentPacketFilter_SIZE (FIELD_OFFSET(MSNdis_CurrentPacketFilter, NdisCurrentPacketFilter) + MSNdis_CurrentPacketFilter_NdisCurrentPacketFilter_SIZE)
+
+#define MSNdis_CurrentLookahead_NdisCurrentLookahead_SIZE sizeof(ULONG)
+#define MSNdis_CurrentLookahead_NdisCurrentLookahead_ID 1
+
+#define MSNdis_CurrentLookahead_SIZE (FIELD_OFFSET(MSNdis_CurrentLookahead, NdisCurrentLookahead) + MSNdis_CurrentLookahead_NdisCurrentLookahead_SIZE)
+
+#define MSNdis_DriverVersion_NdisDriverVersion_SIZE sizeof(USHORT)
+#define MSNdis_DriverVersion_NdisDriverVersion_ID 1
+
+#define MSNdis_DriverVersion_SIZE (FIELD_OFFSET(MSNdis_DriverVersion, NdisDriverVersion) + MSNdis_DriverVersion_NdisDriverVersion_SIZE)
+
+#define MSNdis_MaximumTotalSize_NdisMaximumTotalSize_SIZE sizeof(ULONG)
+#define MSNdis_MaximumTotalSize_NdisMaximumTotalSize_ID 1
+
+#define MSNdis_MaximumTotalSize_SIZE (FIELD_OFFSET(MSNdis_MaximumTotalSize, NdisMaximumTotalSize) + MSNdis_MaximumTotalSize_NdisMaximumTotalSize_SIZE)
+
+#define MSNdis_MacOptions_NdisMacOptions_SIZE sizeof(ULONG)
+#define MSNdis_MacOptions_NdisMacOptions_ID 1
+
+#define MSNdis_MacOptions_SIZE (FIELD_OFFSET(MSNdis_MacOptions, NdisMacOptions) + MSNdis_MacOptions_NdisMacOptions_SIZE)
+
+#define MSNdis_MediaConnectStatus_NdisMediaConnectStatus_SIZE sizeof(ULONG)
+#define MSNdis_MediaConnectStatus_NdisMediaConnectStatus_ID 1
+
+#define MSNdis_MediaConnectStatus_SIZE (FIELD_OFFSET(MSNdis_MediaConnectStatus, NdisMediaConnectStatus) + MSNdis_MediaConnectStatus_NdisMediaConnectStatus_SIZE)
+
+#define MSNdis_MaximumSendPackets_NdisMaximumSendPackets_SIZE sizeof(ULONG)
+#define MSNdis_MaximumSendPackets_NdisMaximumSendPackets_ID 1
+
+#define MSNdis_MaximumSendPackets_SIZE (FIELD_OFFSET(MSNdis_MaximumSendPackets, NdisMaximumSendPackets) + MSNdis_MaximumSendPackets_NdisMaximumSendPackets_SIZE)
+
+#define MSNdis_VendorDriverVersion_NdisVendorDriverVersion_SIZE sizeof(ULONG)
+#define MSNdis_VendorDriverVersion_NdisVendorDriverVersion_ID 1
+
+#define MSNdis_VendorDriverVersion_SIZE (FIELD_OFFSET(MSNdis_VendorDriverVersion, NdisVendorDriverVersion) + MSNdis_VendorDriverVersion_NdisVendorDriverVersion_SIZE)
+
+#define MSNdis_VlanIdentifier_NdisVlanId_SIZE sizeof(ULONG)
+#define MSNdis_VlanIdentifier_NdisVlanId_ID 1
+
+#define MSNdis_VlanIdentifier_SIZE (FIELD_OFFSET(MSNdis_VlanIdentifier, NdisVlanId) + MSNdis_VlanIdentifier_NdisVlanId_SIZE)
+
+#define MSNdis_PhysicalMediumType_NdisPhysicalMediumType_SIZE sizeof(ULONG)
+#define MSNdis_PhysicalMediumType_NdisPhysicalMediumType_ID 1
+
+#define MSNdis_PhysicalMediumType_SIZE (FIELD_OFFSET(MSNdis_PhysicalMediumType, NdisPhysicalMediumType) + MSNdis_PhysicalMediumType_NdisPhysicalMediumType_SIZE)
+
+#define MSNdis_TransmitsOk_NdisTransmitsOk_SIZE sizeof(ULONGLONG)
+#define MSNdis_TransmitsOk_NdisTransmitsOk_ID 1
+
+#define MSNdis_TransmitsOk_SIZE (FIELD_OFFSET(MSNdis_TransmitsOk, NdisTransmitsOk) + MSNdis_TransmitsOk_NdisTransmitsOk_SIZE)
+
+#define MSNdis_ReceivesOk_NdisReceivesOk_SIZE sizeof(ULONGLONG)
+#define MSNdis_ReceivesOk_NdisReceivesOk_ID 1
+
+#define MSNdis_ReceivesOk_SIZE (FIELD_OFFSET(MSNdis_ReceivesOk, NdisReceivesOk) + MSNdis_ReceivesOk_NdisReceivesOk_SIZE)
+
+#define MSNdis_TransmitsError_NdisTransmitsError_SIZE sizeof(ULONG)
+#define MSNdis_TransmitsError_NdisTransmitsError_ID 1
+
+#define MSNdis_TransmitsError_SIZE (FIELD_OFFSET(MSNdis_TransmitsError, NdisTransmitsError) + MSNdis_TransmitsError_NdisTransmitsError_SIZE)
+
+#define MSNdis_ReceiveError_NdisReceiveError_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveError_NdisReceiveError_ID 1
+
+#define MSNdis_ReceiveError_SIZE (FIELD_OFFSET(MSNdis_ReceiveError, NdisReceiveError) + MSNdis_ReceiveError_NdisReceiveError_SIZE)
+
+#define MSNdis_ReceiveNoBuffer_NdisReceiveNoBuffer_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveNoBuffer_NdisReceiveNoBuffer_ID 1
+
+#define MSNdis_ReceiveNoBuffer_SIZE (FIELD_OFFSET(MSNdis_ReceiveNoBuffer, NdisReceiveNoBuffer) + MSNdis_ReceiveNoBuffer_NdisReceiveNoBuffer_SIZE)
+
+#define MSNdis_CoHardwareStatus_NdisCoHardwareStatus_SIZE sizeof(ULONG)
+#define MSNdis_CoHardwareStatus_NdisCoHardwareStatus_ID 1
+
+#define MSNdis_CoHardwareStatus_SIZE (FIELD_OFFSET(MSNdis_CoHardwareStatus, NdisCoHardwareStatus) + MSNdis_CoHardwareStatus_NdisCoHardwareStatus_SIZE)
+
+#define MSNdis_CoMediaSupported_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_CoMediaSupported_NumberElements_ID 1
+#define MSNdis_CoMediaSupported_NdisCoMediaSupported_ID 2
+
+#define MSNdis_CoMediaInUse_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_CoMediaInUse_NumberElements_ID 1
+#define MSNdis_CoMediaInUse_NdisCoMediaInUse_ID 2
+
+#define MSNdis_CoLinkSpeed_NdisCoLinkSpeed_SIZE sizeof(MSNdis_NetworkLinkSpeed)
+#define MSNdis_CoLinkSpeed_NdisCoLinkSpeed_ID 1
+
+#define MSNdis_CoLinkSpeed_SIZE (FIELD_OFFSET(MSNdis_CoLinkSpeed, NdisCoLinkSpeed) + MSNdis_CoLinkSpeed_NdisCoLinkSpeed_SIZE)
+
+#define MSNdis_CoVendorId_NdisCoVendorID_SIZE sizeof(ULONG)
+#define MSNdis_CoVendorId_NdisCoVendorID_ID 1
+
+#define MSNdis_CoVendorId_SIZE (FIELD_OFFSET(MSNdis_CoVendorId, NdisCoVendorID) + MSNdis_CoVendorId_NdisCoVendorID_SIZE)
+
+#define MSNdis_CoVendorDescription_NdisCoVendorDescription_ID 1
+
+#define MSNdis_CoDriverVersion_NdisCoDriverVersion_SIZE sizeof(USHORT)
+#define MSNdis_CoDriverVersion_NdisCoDriverVersion_ID 1
+
+#define MSNdis_CoDriverVersion_SIZE (FIELD_OFFSET(MSNdis_CoDriverVersion, NdisCoDriverVersion) + MSNdis_CoDriverVersion_NdisCoDriverVersion_SIZE)
+
+#define MSNdis_CoMacOptions_NdisCoMacOptions_SIZE sizeof(ULONG)
+#define MSNdis_CoMacOptions_NdisCoMacOptions_ID 1
+
+#define MSNdis_CoMacOptions_SIZE (FIELD_OFFSET(MSNdis_CoMacOptions, NdisCoMacOptions) + MSNdis_CoMacOptions_NdisCoMacOptions_SIZE)
+
+#define MSNdis_CoMediaConnectStatus_NdisCoMediaConnectStatus_SIZE sizeof(ULONG)
+#define MSNdis_CoMediaConnectStatus_NdisCoMediaConnectStatus_ID 1
+
+#define MSNdis_CoMediaConnectStatus_SIZE (FIELD_OFFSET(MSNdis_CoMediaConnectStatus, NdisCoMediaConnectStatus) + MSNdis_CoMediaConnectStatus_NdisCoMediaConnectStatus_SIZE)
+
+#define MSNdis_CoVendorDriverVersion_NdisCoVendorDriverVersion_SIZE sizeof(ULONG)
+#define MSNdis_CoVendorDriverVersion_NdisCoVendorDriverVersion_ID 1
+
+#define MSNdis_CoVendorDriverVersion_SIZE (FIELD_OFFSET(MSNdis_CoVendorDriverVersion, NdisCoVendorDriverVersion) + MSNdis_CoVendorDriverVersion_NdisCoVendorDriverVersion_SIZE)
+
+#define MSNdis_CoMinimumLinkSpeed_NdisCoMinimumLinkSpeed_SIZE sizeof(MSNdis_NetworkLinkSpeed)
+#define MSNdis_CoMinimumLinkSpeed_NdisCoMinimumLinkSpeed_ID 1
+
+#define MSNdis_CoMinimumLinkSpeed_SIZE (FIELD_OFFSET(MSNdis_CoMinimumLinkSpeed, NdisCoMinimumLinkSpeed) + MSNdis_CoMinimumLinkSpeed_NdisCoMinimumLinkSpeed_SIZE)
+
+#define MSNdis_CoTransmitPdusOk_NdisCoTransmitPdusOk_SIZE sizeof(ULONGLONG)
+#define MSNdis_CoTransmitPdusOk_NdisCoTransmitPdusOk_ID 1
+
+#define MSNdis_CoTransmitPdusOk_SIZE (FIELD_OFFSET(MSNdis_CoTransmitPdusOk, NdisCoTransmitPdusOk) + MSNdis_CoTransmitPdusOk_NdisCoTransmitPdusOk_SIZE)
+
+#define MSNdis_CoReceivePdusOk_NdisCoReceivePdusOk_SIZE sizeof(ULONGLONG)
+#define MSNdis_CoReceivePdusOk_NdisCoReceivePdusOk_ID 1
+
+#define MSNdis_CoReceivePdusOk_SIZE (FIELD_OFFSET(MSNdis_CoReceivePdusOk, NdisCoReceivePdusOk) + MSNdis_CoReceivePdusOk_NdisCoReceivePdusOk_SIZE)
+
+#define MSNdis_CoTransmitPduErrors_NdisCoTransmitPduErrors_SIZE sizeof(ULONG)
+#define MSNdis_CoTransmitPduErrors_NdisCoTransmitPduErrors_ID 1
+
+#define MSNdis_CoTransmitPduErrors_SIZE (FIELD_OFFSET(MSNdis_CoTransmitPduErrors, NdisCoTransmitPduErrors) + MSNdis_CoTransmitPduErrors_NdisCoTransmitPduErrors_SIZE)
+
+#define MSNdis_CoReceivePduErrors_NdisCoReceivePduErrors_SIZE sizeof(ULONG)
+#define MSNdis_CoReceivePduErrors_NdisCoReceivePduErrors_ID 1
+
+#define MSNdis_CoReceivePduErrors_SIZE (FIELD_OFFSET(MSNdis_CoReceivePduErrors, NdisCoReceivePduErrors) + MSNdis_CoReceivePduErrors_NdisCoReceivePduErrors_SIZE)
+
+#define MSNdis_CoReceivePdusNoBuffer_NdisCoReceivePdusNoBuffer_SIZE sizeof(ULONG)
+#define MSNdis_CoReceivePdusNoBuffer_NdisCoReceivePdusNoBuffer_ID 1
+
+#define MSNdis_CoReceivePdusNoBuffer_SIZE (FIELD_OFFSET(MSNdis_CoReceivePdusNoBuffer, NdisCoReceivePdusNoBuffer) + MSNdis_CoReceivePdusNoBuffer_NdisCoReceivePdusNoBuffer_SIZE)
+
+#define MSNdis_AtmSupportedVcRates_MinCellRate_SIZE sizeof(ULONG)
+#define MSNdis_AtmSupportedVcRates_MinCellRate_ID 1
+#define MSNdis_AtmSupportedVcRates_MaxCellRate_SIZE sizeof(ULONG)
+#define MSNdis_AtmSupportedVcRates_MaxCellRate_ID 2
+
+#define MSNdis_AtmSupportedVcRates_SIZE (FIELD_OFFSET(MSNdis_AtmSupportedVcRates, MaxCellRate) + MSNdis_AtmSupportedVcRates_MaxCellRate_SIZE)
+
+#define MSNdis_AtmSupportedServiceCategory_NdisAtmSupportedServiceCategory_SIZE sizeof(ULONG)
+#define MSNdis_AtmSupportedServiceCategory_NdisAtmSupportedServiceCategory_ID 1
+
+#define MSNdis_AtmSupportedServiceCategory_SIZE (FIELD_OFFSET(MSNdis_AtmSupportedServiceCategory, NdisAtmSupportedServiceCategory) + MSNdis_AtmSupportedServiceCategory_NdisAtmSupportedServiceCategory_SIZE)
+
+#define MSNdis_AtmSupportedAalTypes_NdisAtmSupportedAalTypes_SIZE sizeof(ULONG)
+#define MSNdis_AtmSupportedAalTypes_NdisAtmSupportedAalTypes_ID 1
+
+#define MSNdis_AtmSupportedAalTypes_SIZE (FIELD_OFFSET(MSNdis_AtmSupportedAalTypes, NdisAtmSupportedAalTypes) + MSNdis_AtmSupportedAalTypes_NdisAtmSupportedAalTypes_SIZE)
+
+#define MSNdis_AtmHardwareCurrentAddress_NdisAtmHardwareCurrentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_AtmHardwareCurrentAddress_NdisAtmHardwareCurrentAddress_ID 1
+
+#define MSNdis_AtmHardwareCurrentAddress_SIZE (FIELD_OFFSET(MSNdis_AtmHardwareCurrentAddress, NdisAtmHardwareCurrentAddress) + MSNdis_AtmHardwareCurrentAddress_NdisAtmHardwareCurrentAddress_SIZE)
+
+#define MSNdis_AtmMaxActiveVcs_NdisAtmMaxActiveVcs_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxActiveVcs_NdisAtmMaxActiveVcs_ID 1
+
+#define MSNdis_AtmMaxActiveVcs_SIZE (FIELD_OFFSET(MSNdis_AtmMaxActiveVcs, NdisAtmMaxActiveVcs) + MSNdis_AtmMaxActiveVcs_NdisAtmMaxActiveVcs_SIZE)
+
+#define MSNdis_AtmMaxActiveVciBits_NdisAtmMaxActiveVciBits_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxActiveVciBits_NdisAtmMaxActiveVciBits_ID 1
+
+#define MSNdis_AtmMaxActiveVciBits_SIZE (FIELD_OFFSET(MSNdis_AtmMaxActiveVciBits, NdisAtmMaxActiveVciBits) + MSNdis_AtmMaxActiveVciBits_NdisAtmMaxActiveVciBits_SIZE)
+
+#define MSNdis_AtmMaxActiveVpiBits_NdisAtmMaxActiveVpiBits_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxActiveVpiBits_NdisAtmMaxActiveVpiBits_ID 1
+
+#define MSNdis_AtmMaxActiveVpiBits_SIZE (FIELD_OFFSET(MSNdis_AtmMaxActiveVpiBits, NdisAtmMaxActiveVpiBits) + MSNdis_AtmMaxActiveVpiBits_NdisAtmMaxActiveVpiBits_SIZE)
+
+#define MSNdis_AtmMaxAal0PacketSize_NdisAtmMaxAal0PacketSize_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxAal0PacketSize_NdisAtmMaxAal0PacketSize_ID 1
+
+#define MSNdis_AtmMaxAal0PacketSize_SIZE (FIELD_OFFSET(MSNdis_AtmMaxAal0PacketSize, NdisAtmMaxAal0PacketSize) + MSNdis_AtmMaxAal0PacketSize_NdisAtmMaxAal0PacketSize_SIZE)
+
+#define MSNdis_AtmMaxAal1PacketSize_NdisAtmMaxAal1PacketSize_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxAal1PacketSize_NdisAtmMaxAal1PacketSize_ID 1
+
+#define MSNdis_AtmMaxAal1PacketSize_SIZE (FIELD_OFFSET(MSNdis_AtmMaxAal1PacketSize, NdisAtmMaxAal1PacketSize) + MSNdis_AtmMaxAal1PacketSize_NdisAtmMaxAal1PacketSize_SIZE)
+
+#define MSNdis_AtmMaxAal34PacketSize_NdisAtmMaxAal34PacketSize_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxAal34PacketSize_NdisAtmMaxAal34PacketSize_ID 1
+
+#define MSNdis_AtmMaxAal34PacketSize_SIZE (FIELD_OFFSET(MSNdis_AtmMaxAal34PacketSize, NdisAtmMaxAal34PacketSize) + MSNdis_AtmMaxAal34PacketSize_NdisAtmMaxAal34PacketSize_SIZE)
+
+#define MSNdis_AtmMaxAal5PacketSize_NdisAtmMaxAal5PacketSize_SIZE sizeof(ULONG)
+#define MSNdis_AtmMaxAal5PacketSize_NdisAtmMaxAal5PacketSize_ID 1
+
+#define MSNdis_AtmMaxAal5PacketSize_SIZE (FIELD_OFFSET(MSNdis_AtmMaxAal5PacketSize, NdisAtmMaxAal5PacketSize) + MSNdis_AtmMaxAal5PacketSize_NdisAtmMaxAal5PacketSize_SIZE)
+
+#define MSNdis_AtmReceiveCellsOk_NdisAtmReceiveCellsOk_SIZE sizeof(ULONGLONG)
+#define MSNdis_AtmReceiveCellsOk_NdisAtmReceiveCellsOk_ID 1
+
+#define MSNdis_AtmReceiveCellsOk_SIZE (FIELD_OFFSET(MSNdis_AtmReceiveCellsOk, NdisAtmReceiveCellsOk) + MSNdis_AtmReceiveCellsOk_NdisAtmReceiveCellsOk_SIZE)
+
+#define MSNdis_AtmTransmitCellsOk_NdisAtmTransmitCellsOk_SIZE sizeof(ULONGLONG)
+#define MSNdis_AtmTransmitCellsOk_NdisAtmTransmitCellsOk_ID 1
+
+#define MSNdis_AtmTransmitCellsOk_SIZE (FIELD_OFFSET(MSNdis_AtmTransmitCellsOk, NdisAtmTransmitCellsOk) + MSNdis_AtmTransmitCellsOk_NdisAtmTransmitCellsOk_SIZE)
+
+#define MSNdis_AtmReceiveCellsDropped_NdisAtmReceiveCellsDropped_SIZE sizeof(ULONGLONG)
+#define MSNdis_AtmReceiveCellsDropped_NdisAtmReceiveCellsDropped_ID 1
+
+#define MSNdis_AtmReceiveCellsDropped_SIZE (FIELD_OFFSET(MSNdis_AtmReceiveCellsDropped, NdisAtmReceiveCellsDropped) + MSNdis_AtmReceiveCellsDropped_NdisAtmReceiveCellsDropped_SIZE)
+
+#define MSNdis_EthernetPermanentAddress_NdisPermanentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_EthernetPermanentAddress_NdisPermanentAddress_ID 1
+
+#define MSNdis_EthernetPermanentAddress_SIZE (FIELD_OFFSET(MSNdis_EthernetPermanentAddress, NdisPermanentAddress) + MSNdis_EthernetPermanentAddress_NdisPermanentAddress_SIZE)
+
+#define MSNdis_EthernetCurrentAddress_NdisCurrentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_EthernetCurrentAddress_NdisCurrentAddress_ID 1
+
+#define MSNdis_EthernetCurrentAddress_SIZE (FIELD_OFFSET(MSNdis_EthernetCurrentAddress, NdisCurrentAddress) + MSNdis_EthernetCurrentAddress_NdisCurrentAddress_SIZE)
+
+#define MSNdis_EthernetMulticastList_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_EthernetMulticastList_NumberElements_ID 1
+#define MSNdis_EthernetMulticastList_NdisMulticastList_ID 2
+
+#define MSNdis_EthernetMaximumMulticastListSize_NdisEthernetMaximumMulticastListSize_SIZE sizeof(ULONG)
+#define MSNdis_EthernetMaximumMulticastListSize_NdisEthernetMaximumMulticastListSize_ID 1
+
+#define MSNdis_EthernetMaximumMulticastListSize_SIZE (FIELD_OFFSET(MSNdis_EthernetMaximumMulticastListSize, NdisEthernetMaximumMulticastListSize) + MSNdis_EthernetMaximumMulticastListSize_NdisEthernetMaximumMulticastListSize_SIZE)
+
+#define MSNdis_EthernetMacOptions_NdisEthernetMacOptions_SIZE sizeof(ULONG)
+#define MSNdis_EthernetMacOptions_NdisEthernetMacOptions_ID 1
+
+#define MSNdis_EthernetMacOptions_SIZE (FIELD_OFFSET(MSNdis_EthernetMacOptions, NdisEthernetMacOptions) + MSNdis_EthernetMacOptions_NdisEthernetMacOptions_SIZE)
+
+#define MSNdis_EthernetReceiveErrorAlignment_NdisEthernetReceiveErrorAlignment_SIZE sizeof(ULONG)
+#define MSNdis_EthernetReceiveErrorAlignment_NdisEthernetReceiveErrorAlignment_ID 1
+
+#define MSNdis_EthernetReceiveErrorAlignment_SIZE (FIELD_OFFSET(MSNdis_EthernetReceiveErrorAlignment, NdisEthernetReceiveErrorAlignment) + MSNdis_EthernetReceiveErrorAlignment_NdisEthernetReceiveErrorAlignment_SIZE)
+
+#define MSNdis_EthernetOneTransmitCollision_NdisEthernetOneTransmitCollision_SIZE sizeof(ULONG)
+#define MSNdis_EthernetOneTransmitCollision_NdisEthernetOneTransmitCollision_ID 1
+
+#define MSNdis_EthernetOneTransmitCollision_SIZE (FIELD_OFFSET(MSNdis_EthernetOneTransmitCollision, NdisEthernetOneTransmitCollision) + MSNdis_EthernetOneTransmitCollision_NdisEthernetOneTransmitCollision_SIZE)
+
+#define MSNdis_EthernetMoreTransmitCollisions_NdisEthernetMoreTransmitCollisions_SIZE sizeof(ULONG)
+#define MSNdis_EthernetMoreTransmitCollisions_NdisEthernetMoreTransmitCollisions_ID 1
+
+#define MSNdis_EthernetMoreTransmitCollisions_SIZE (FIELD_OFFSET(MSNdis_EthernetMoreTransmitCollisions, NdisEthernetMoreTransmitCollisions) + MSNdis_EthernetMoreTransmitCollisions_NdisEthernetMoreTransmitCollisions_SIZE)
+
+#define MSNdis_TokenRingPermanentAddress_NdisPermanentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_TokenRingPermanentAddress_NdisPermanentAddress_ID 1
+
+#define MSNdis_TokenRingPermanentAddress_SIZE (FIELD_OFFSET(MSNdis_TokenRingPermanentAddress, NdisPermanentAddress) + MSNdis_TokenRingPermanentAddress_NdisPermanentAddress_SIZE)
+
+#define MSNdis_TokenRingCurrentAddress_NdisCurrentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_TokenRingCurrentAddress_NdisCurrentAddress_ID 1
+
+#define MSNdis_TokenRingCurrentAddress_SIZE (FIELD_OFFSET(MSNdis_TokenRingCurrentAddress, NdisCurrentAddress) + MSNdis_TokenRingCurrentAddress_NdisCurrentAddress_SIZE)
+
+#define MSNdis_TokenRingCurrentFunctional_NdisTokenRingCurrentFunctional_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingCurrentFunctional_NdisTokenRingCurrentFunctional_ID 1
+
+#define MSNdis_TokenRingCurrentFunctional_SIZE (FIELD_OFFSET(MSNdis_TokenRingCurrentFunctional, NdisTokenRingCurrentFunctional) + MSNdis_TokenRingCurrentFunctional_NdisTokenRingCurrentFunctional_SIZE)
+
+#define MSNdis_TokenRingCurrentGroup_NdisTokenRingCurrentGroup_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingCurrentGroup_NdisTokenRingCurrentGroup_ID 1
+
+#define MSNdis_TokenRingCurrentGroup_SIZE (FIELD_OFFSET(MSNdis_TokenRingCurrentGroup, NdisTokenRingCurrentGroup) + MSNdis_TokenRingCurrentGroup_NdisTokenRingCurrentGroup_SIZE)
+
+#define MSNdis_TokenRingLastOpenStatus_NdisTokenRingLastOpenStatus_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingLastOpenStatus_NdisTokenRingLastOpenStatus_ID 1
+
+#define MSNdis_TokenRingLastOpenStatus_SIZE (FIELD_OFFSET(MSNdis_TokenRingLastOpenStatus, NdisTokenRingLastOpenStatus) + MSNdis_TokenRingLastOpenStatus_NdisTokenRingLastOpenStatus_SIZE)
+
+#define MSNdis_TokenRingCurrentRingStatus_NdisTokenRingCurrentRingStatus_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingCurrentRingStatus_NdisTokenRingCurrentRingStatus_ID 1
+
+#define MSNdis_TokenRingCurrentRingStatus_SIZE (FIELD_OFFSET(MSNdis_TokenRingCurrentRingStatus, NdisTokenRingCurrentRingStatus) + MSNdis_TokenRingCurrentRingStatus_NdisTokenRingCurrentRingStatus_SIZE)
+
+#define MSNdis_TokenRingCurrentRingState_NdisTokenRingCurrentRingState_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingCurrentRingState_NdisTokenRingCurrentRingState_ID 1
+
+#define MSNdis_TokenRingCurrentRingState_SIZE (FIELD_OFFSET(MSNdis_TokenRingCurrentRingState, NdisTokenRingCurrentRingState) + MSNdis_TokenRingCurrentRingState_NdisTokenRingCurrentRingState_SIZE)
+
+#define MSNdis_TokenRingLineErrors_NdisTokenRingLineErrors_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingLineErrors_NdisTokenRingLineErrors_ID 1
+
+#define MSNdis_TokenRingLineErrors_SIZE (FIELD_OFFSET(MSNdis_TokenRingLineErrors, NdisTokenRingLineErrors) + MSNdis_TokenRingLineErrors_NdisTokenRingLineErrors_SIZE)
+
+#define MSNdis_TokenRingLostFrames_NdisTokenRingLostFrames_SIZE sizeof(ULONG)
+#define MSNdis_TokenRingLostFrames_NdisTokenRingLostFrames_ID 1
+
+#define MSNdis_TokenRingLostFrames_SIZE (FIELD_OFFSET(MSNdis_TokenRingLostFrames, NdisTokenRingLostFrames) + MSNdis_TokenRingLostFrames_NdisTokenRingLostFrames_SIZE)
+
+#define MSNdis_FddiLongPermanentAddress_NdisPermanentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_FddiLongPermanentAddress_NdisPermanentAddress_ID 1
+
+#define MSNdis_FddiLongPermanentAddress_SIZE (FIELD_OFFSET(MSNdis_FddiLongPermanentAddress, NdisPermanentAddress) + MSNdis_FddiLongPermanentAddress_NdisPermanentAddress_SIZE)
+
+#define MSNdis_FddiLongCurrentAddress_NdisCurrentAddress_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_FddiLongCurrentAddress_NdisCurrentAddress_ID 1
+
+#define MSNdis_FddiLongCurrentAddress_SIZE (FIELD_OFFSET(MSNdis_FddiLongCurrentAddress, NdisCurrentAddress) + MSNdis_FddiLongCurrentAddress_NdisCurrentAddress_SIZE)
+
+#define MSNdis_FddiLongMulticastList_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_FddiLongMulticastList_NumberElements_ID 1
+#define MSNdis_FddiLongMulticastList_NdisMulticastList_ID 2
+
+#define MSNdis_FddiLongMaximumListSize_NdisFddiLongMaximumListSize_SIZE sizeof(ULONG)
+#define MSNdis_FddiLongMaximumListSize_NdisFddiLongMaximumListSize_ID 1
+
+#define MSNdis_FddiLongMaximumListSize_SIZE (FIELD_OFFSET(MSNdis_FddiLongMaximumListSize, NdisFddiLongMaximumListSize) + MSNdis_FddiLongMaximumListSize_NdisFddiLongMaximumListSize_SIZE)
+
+#define MSNdis_FddiShortPermanentAddress_NdisPermanentAddress_SIZE sizeof(MSNdis_NetworkShortAddress)
+#define MSNdis_FddiShortPermanentAddress_NdisPermanentAddress_ID 1
+
+#define MSNdis_FddiShortPermanentAddress_SIZE (FIELD_OFFSET(MSNdis_FddiShortPermanentAddress, NdisPermanentAddress) + MSNdis_FddiShortPermanentAddress_NdisPermanentAddress_SIZE)
+
+#define MSNdis_FddiShortCurrentAddress_NdisCurrentAddress_SIZE sizeof(MSNdis_NetworkShortAddress)
+#define MSNdis_FddiShortCurrentAddress_NdisCurrentAddress_ID 1
+
+#define MSNdis_FddiShortCurrentAddress_SIZE (FIELD_OFFSET(MSNdis_FddiShortCurrentAddress, NdisCurrentAddress) + MSNdis_FddiShortCurrentAddress_NdisCurrentAddress_SIZE)
+
+#define MSNdis_FddiShortMulticastList_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_FddiShortMulticastList_NumberElements_ID 1
+#define MSNdis_FddiShortMulticastList_NdisMulticastList_ID 2
+
+#define MSNdis_FddiShortMaximumListSize_NdisFddiShortMaximumListSize_SIZE sizeof(ULONG)
+#define MSNdis_FddiShortMaximumListSize_NdisFddiShortMaximumListSize_ID 1
+
+#define MSNdis_FddiShortMaximumListSize_SIZE (FIELD_OFFSET(MSNdis_FddiShortMaximumListSize, NdisFddiShortMaximumListSize) + MSNdis_FddiShortMaximumListSize_NdisFddiShortMaximumListSize_SIZE)
+
+#define MSNdis_FddiAttachmentType_NdisFddiAttachmentType_SIZE sizeof(ULONG)
+#define MSNdis_FddiAttachmentType_NdisFddiAttachmentType_ID 1
+
+#define MSNdis_FddiAttachmentType_SIZE (FIELD_OFFSET(MSNdis_FddiAttachmentType, NdisFddiAttachmentType) + MSNdis_FddiAttachmentType_NdisFddiAttachmentType_SIZE)
+
+#define MSNdis_FddiUpstreamNodeLong_NdisFddiUpstreamNodeLong_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_FddiUpstreamNodeLong_NdisFddiUpstreamNodeLong_ID 1
+
+#define MSNdis_FddiUpstreamNodeLong_SIZE (FIELD_OFFSET(MSNdis_FddiUpstreamNodeLong, NdisFddiUpstreamNodeLong) + MSNdis_FddiUpstreamNodeLong_NdisFddiUpstreamNodeLong_SIZE)
+
+#define MSNdis_FddiDownstreamNodeLong_NdisFddiDownstreamNodeLong_SIZE sizeof(MSNdis_NetworkAddress)
+#define MSNdis_FddiDownstreamNodeLong_NdisFddiDownstreamNodeLong_ID 1
+
+#define MSNdis_FddiDownstreamNodeLong_SIZE (FIELD_OFFSET(MSNdis_FddiDownstreamNodeLong, NdisFddiDownstreamNodeLong) + MSNdis_FddiDownstreamNodeLong_NdisFddiDownstreamNodeLong_SIZE)
+
+#define MSNdis_FddiFrameErrors_NdisFddiFrameErrors_SIZE sizeof(ULONG)
+#define MSNdis_FddiFrameErrors_NdisFddiFrameErrors_ID 1
+
+#define MSNdis_FddiFrameErrors_SIZE (FIELD_OFFSET(MSNdis_FddiFrameErrors, NdisFddiFrameErrors) + MSNdis_FddiFrameErrors_NdisFddiFrameErrors_SIZE)
+
+#define MSNdis_FddiFramesLost_NdisFddiFramesLost_SIZE sizeof(ULONG)
+#define MSNdis_FddiFramesLost_NdisFddiFramesLost_ID 1
+
+#define MSNdis_FddiFramesLost_SIZE (FIELD_OFFSET(MSNdis_FddiFramesLost, NdisFddiFramesLost) + MSNdis_FddiFramesLost_NdisFddiFramesLost_SIZE)
+
+#define MSNdis_FddiRingManagmentState_NdisFddiRingManagmentState_SIZE sizeof(ULONG)
+#define MSNdis_FddiRingManagmentState_NdisFddiRingManagmentState_ID 1
+
+#define MSNdis_FddiRingManagmentState_SIZE (FIELD_OFFSET(MSNdis_FddiRingManagmentState, NdisFddiRingManagmentState) + MSNdis_FddiRingManagmentState_NdisFddiRingManagmentState_SIZE)
+
+#define MSNdis_FddiLctFailures_NdisFddiLctFailures_SIZE sizeof(ULONG)
+#define MSNdis_FddiLctFailures_NdisFddiLctFailures_ID 1
+
+#define MSNdis_FddiLctFailures_SIZE (FIELD_OFFSET(MSNdis_FddiLctFailures, NdisFddiLctFailures) + MSNdis_FddiLctFailures_NdisFddiLctFailures_SIZE)
+
+#define MSNdis_FddiLemRejects_NdisFddiLemRejects_SIZE sizeof(ULONG)
+#define MSNdis_FddiLemRejects_NdisFddiLemRejects_ID 1
+
+#define MSNdis_FddiLemRejects_SIZE (FIELD_OFFSET(MSNdis_FddiLemRejects, NdisFddiLemRejects) + MSNdis_FddiLemRejects_NdisFddiLemRejects_SIZE)
+
+#define MSNdis_FddiLConnectionState_NdisFddiLConnectionState_SIZE sizeof(ULONG)
+#define MSNdis_FddiLConnectionState_NdisFddiLConnectionState_ID 1
+
+#define MSNdis_FddiLConnectionState_SIZE (FIELD_OFFSET(MSNdis_FddiLConnectionState, NdisFddiLConnectionState) + MSNdis_FddiLConnectionState_NdisFddiLConnectionState_SIZE)
+
+#define MSNdis_ObjectHeader_Type_SIZE sizeof(UCHAR)
+#define MSNdis_ObjectHeader_Type_ID 1
+#define MSNdis_ObjectHeader_Revision_SIZE sizeof(UCHAR)
+#define MSNdis_ObjectHeader_Revision_ID 2
+#define MSNdis_ObjectHeader_Size_SIZE sizeof(USHORT)
+#define MSNdis_ObjectHeader_Size_ID 3
+
+#define MSNdis_ObjectHeader_SIZE (FIELD_OFFSET(MSNdis_ObjectHeader, Size) + MSNdis_ObjectHeader_Size_SIZE)
+
+#define MSNdis_WmiMethodHeader_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiMethodHeader_Header_ID 1
+#define MSNdis_WmiMethodHeader_PortNumber_SIZE sizeof(ULONG)
+#define MSNdis_WmiMethodHeader_PortNumber_ID 2
+#define MSNdis_WmiMethodHeader_NetLuid_SIZE sizeof(ULONGLONG)
+#define MSNdis_WmiMethodHeader_NetLuid_ID 3
+#define MSNdis_WmiMethodHeader_RequestId_SIZE sizeof(ULONGLONG)
+#define MSNdis_WmiMethodHeader_RequestId_ID 4
+#define MSNdis_WmiMethodHeader_Timeout_SIZE sizeof(ULONG)
+#define MSNdis_WmiMethodHeader_Timeout_ID 5
+#define MSNdis_WmiMethodHeader_Padding_SIZE sizeof(ULONG)
+#define MSNdis_WmiMethodHeader_Padding_ID 6
+
+#define MSNdis_WmiMethodHeader_SIZE (FIELD_OFFSET(MSNdis_WmiMethodHeader, Padding) + MSNdis_WmiMethodHeader_Padding_SIZE)
+
+#define MSNdis_WmiSetHeader_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiSetHeader_Header_ID 1
+#define MSNdis_WmiSetHeader_PortNumber_SIZE sizeof(ULONG)
+#define MSNdis_WmiSetHeader_PortNumber_ID 2
+#define MSNdis_WmiSetHeader_NetLuid_SIZE sizeof(ULONGLONG)
+#define MSNdis_WmiSetHeader_NetLuid_ID 3
+#define MSNdis_WmiSetHeader_RequestId_SIZE sizeof(ULONGLONG)
+#define MSNdis_WmiSetHeader_RequestId_ID 4
+#define MSNdis_WmiSetHeader_Timeout_SIZE sizeof(ULONG)
+#define MSNdis_WmiSetHeader_Timeout_ID 5
+#define MSNdis_WmiSetHeader_Padding_SIZE sizeof(ULONG)
+#define MSNdis_WmiSetHeader_Padding_ID 6
+
+#define MSNdis_WmiSetHeader_SIZE (FIELD_OFFSET(MSNdis_WmiSetHeader, Padding) + MSNdis_WmiSetHeader_Padding_SIZE)
+
+#define MSNdis_WmiOutputInfo_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiOutputInfo_Header_ID 1
+#define MSNdis_WmiOutputInfo_Flags_SIZE sizeof(ULONG)
+#define MSNdis_WmiOutputInfo_Flags_ID 2
+#define MSNdis_WmiOutputInfo_SupportedRevision_SIZE sizeof(UCHAR)
+#define MSNdis_WmiOutputInfo_SupportedRevision_ID 3
+#define MSNdis_WmiOutputInfo_Padding1_SIZE sizeof(UCHAR)
+#define MSNdis_WmiOutputInfo_Padding1_ID 4
+#define MSNdis_WmiOutputInfo_Padding2_SIZE sizeof(USHORT)
+#define MSNdis_WmiOutputInfo_Padding2_ID 5
+#define MSNdis_WmiOutputInfo_DataOffset_SIZE sizeof(ULONG)
+#define MSNdis_WmiOutputInfo_DataOffset_ID 6
+
+#define MSNdis_WmiOutputInfo_SIZE (FIELD_OFFSET(MSNdis_WmiOutputInfo, DataOffset) + MSNdis_WmiOutputInfo_DataOffset_SIZE)
+
+#define MSNdis_WmiEnumAdapter_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiEnumAdapter_Header_ID 1
+#define MSNdis_WmiEnumAdapter_IfIndex_SIZE sizeof(ULONG)
+#define MSNdis_WmiEnumAdapter_IfIndex_ID 2
+#define MSNdis_WmiEnumAdapter_NetLuid_SIZE sizeof(ULONGLONG)
+#define MSNdis_WmiEnumAdapter_NetLuid_ID 3
+#define MSNdis_WmiEnumAdapter_DeviceName_ID 4
+
+#define MSNdis_LinkStateData_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_LinkStateData_Header_ID 1
+#define MSNdis_LinkStateData_MediaConnectState_SIZE sizeof(ULONG)
+#define MSNdis_LinkStateData_MediaConnectState_ID 2
+#define MSNdis_LinkStateData_MediaDuplexState_SIZE sizeof(ULONG)
+#define MSNdis_LinkStateData_MediaDuplexState_ID 3
+#define MSNdis_LinkStateData_XmitLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_LinkStateData_XmitLinkSpeed_ID 4
+#define MSNdis_LinkStateData_RcvLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_LinkStateData_RcvLinkSpeed_ID 5
+#define MSNdis_LinkStateData_PauseFunctions_SIZE sizeof(ULONG)
+#define MSNdis_LinkStateData_PauseFunctions_ID 6
+#define MSNdis_LinkStateData_AutoNegotiationFlags_SIZE sizeof(ULONG)
+#define MSNdis_LinkStateData_AutoNegotiationFlags_ID 7
+
+#define MSNdis_LinkStateData_SIZE (FIELD_OFFSET(MSNdis_LinkStateData, AutoNegotiationFlags) + MSNdis_LinkStateData_AutoNegotiationFlags_SIZE)
+
+#define MSNdis_LinkParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_LinkParameters_Header_ID 1
+#define MSNdis_LinkParameters_MediaDuplexState_SIZE sizeof(ULONG)
+#define MSNdis_LinkParameters_MediaDuplexState_ID 2
+#define MSNdis_LinkParameters_XmitLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_LinkParameters_XmitLinkSpeed_ID 3
+#define MSNdis_LinkParameters_RcvLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_LinkParameters_RcvLinkSpeed_ID 4
+#define MSNdis_LinkParameters_PauseFunctions_SIZE sizeof(ULONG)
+#define MSNdis_LinkParameters_PauseFunctions_ID 5
+#define MSNdis_LinkParameters_AutoNegotiationFlags_SIZE sizeof(ULONG)
+#define MSNdis_LinkParameters_AutoNegotiationFlags_ID 6
+
+#define MSNdis_LinkParameters_SIZE (FIELD_OFFSET(MSNdis_LinkParameters, AutoNegotiationFlags) + MSNdis_LinkParameters_AutoNegotiationFlags_SIZE)
+
+#define MSNdis_InterruptModerationParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_InterruptModerationParameters_Header_ID 1
+#define MSNdis_InterruptModerationParameters_Flags_SIZE sizeof(ULONG)
+#define MSNdis_InterruptModerationParameters_Flags_ID 2
+#define MSNdis_InterruptModerationParameters_InterruptModeration_SIZE sizeof(ULONG)
+#define MSNdis_InterruptModerationParameters_InterruptModeration_ID 3
+
+#define MSNdis_InterruptModerationParameters_SIZE (FIELD_OFFSET(MSNdis_InterruptModerationParameters, InterruptModeration) + MSNdis_InterruptModerationParameters_InterruptModeration_SIZE)
+
+#define MSNdis_StatisticsInfo_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_StatisticsInfo_Header_ID 1
+#define MSNdis_StatisticsInfo_SupportedStatistics_SIZE sizeof(ULONG)
+#define MSNdis_StatisticsInfo_SupportedStatistics_ID 2
+#define MSNdis_StatisticsInfo_ifInDiscards_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifInDiscards_ID 3
+#define MSNdis_StatisticsInfo_ifInErrors_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifInErrors_ID 4
+#define MSNdis_StatisticsInfo_ifHCInOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInOctets_ID 5
+#define MSNdis_StatisticsInfo_ifHCInUcastPkts_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInUcastPkts_ID 6
+#define MSNdis_StatisticsInfo_ifHCInMulticastPkts_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInMulticastPkts_ID 7
+#define MSNdis_StatisticsInfo_ifHCInBroadcastPkts_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInBroadcastPkts_ID 8
+#define MSNdis_StatisticsInfo_ifHCOutOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutOctets_ID 9
+#define MSNdis_StatisticsInfo_ifHCOutUcastPkts_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutUcastPkts_ID 10
+#define MSNdis_StatisticsInfo_ifHCOutMulticastPkts_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutMulticastPkts_ID 11
+#define MSNdis_StatisticsInfo_ifHCOutBroadcastPkts_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutBroadcastPkts_ID 12
+#define MSNdis_StatisticsInfo_ifOutErrors_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifOutErrors_ID 13
+#define MSNdis_StatisticsInfo_ifOutDiscards_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifOutDiscards_ID 14
+#define MSNdis_StatisticsInfo_ifHCInUcastOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInUcastOctets_ID 15
+#define MSNdis_StatisticsInfo_ifHCInMulticastOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInMulticastOctets_ID 16
+#define MSNdis_StatisticsInfo_ifHCInBroadcastOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCInBroadcastOctets_ID 17
+#define MSNdis_StatisticsInfo_ifHCOutUcastOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutUcastOctets_ID 18
+#define MSNdis_StatisticsInfo_ifHCOutMulticastOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutMulticastOctets_ID 19
+#define MSNdis_StatisticsInfo_ifHCOutBroadcastOctets_SIZE sizeof(ULONGLONG)
+#define MSNdis_StatisticsInfo_ifHCOutBroadcastOctets_ID 20
+
+#define MSNdis_StatisticsInfo_SIZE (FIELD_OFFSET(MSNdis_StatisticsInfo, ifHCOutBroadcastOctets) + MSNdis_StatisticsInfo_ifHCOutBroadcastOctets_SIZE)
+
+#define MSNdis_PortStateData_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PortStateData_Header_ID 1
+#define MSNdis_PortStateData_MediaConnectState_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_MediaConnectState_ID 2
+#define MSNdis_PortStateData_XmitLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_PortStateData_XmitLinkSpeed_ID 3
+#define MSNdis_PortStateData_RcvLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_PortStateData_RcvLinkSpeed_ID 4
+#define MSNdis_PortStateData_Direction_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_Direction_ID 5
+#define MSNdis_PortStateData_SendControlState_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_SendControlState_ID 6
+#define MSNdis_PortStateData_RcvControlState_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_RcvControlState_ID 7
+#define MSNdis_PortStateData_SendAuthorizationState_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_SendAuthorizationState_ID 8
+#define MSNdis_PortStateData_RcvAuthorizationState_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_RcvAuthorizationState_ID 9
+#define MSNdis_PortStateData_Flags_SIZE sizeof(ULONG)
+#define MSNdis_PortStateData_Flags_ID 10
+
+#define MSNdis_PortStateData_SIZE (FIELD_OFFSET(MSNdis_PortStateData, Flags) + MSNdis_PortStateData_Flags_SIZE)
+
+#define MSNdis_PortAuthParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PortAuthParameters_Header_ID 1
+#define MSNdis_PortAuthParameters_SendControlState_SIZE sizeof(ULONG)
+#define MSNdis_PortAuthParameters_SendControlState_ID 2
+#define MSNdis_PortAuthParameters_RcvControlState_SIZE sizeof(ULONG)
+#define MSNdis_PortAuthParameters_RcvControlState_ID 3
+#define MSNdis_PortAuthParameters_SendAuthorizationState_SIZE sizeof(ULONG)
+#define MSNdis_PortAuthParameters_SendAuthorizationState_ID 4
+#define MSNdis_PortAuthParameters_RcvAuthorizationState_SIZE sizeof(ULONG)
+#define MSNdis_PortAuthParameters_RcvAuthorizationState_ID 5
+
+#define MSNdis_PortAuthParameters_SIZE (FIELD_OFFSET(MSNdis_PortAuthParameters, RcvAuthorizationState) + MSNdis_PortAuthParameters_RcvAuthorizationState_SIZE)
+
+#define MSNdis_PortChar_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PortChar_Header_ID 1
+#define MSNdis_PortChar_PortNumber_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_PortNumber_ID 2
+#define MSNdis_PortChar_Flags_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_Flags_ID 3
+#define MSNdis_PortChar_Type_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_Type_ID 4
+#define MSNdis_PortChar_MediaConnectState_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_MediaConnectState_ID 5
+#define MSNdis_PortChar_XmitLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_PortChar_XmitLinkSpeed_ID 6
+#define MSNdis_PortChar_RcvLinkSpeed_SIZE sizeof(ULONGLONG)
+#define MSNdis_PortChar_RcvLinkSpeed_ID 7
+#define MSNdis_PortChar_Direction_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_Direction_ID 8
+#define MSNdis_PortChar_SendControlState_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_SendControlState_ID 9
+#define MSNdis_PortChar_RcvControlState_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_RcvControlState_ID 10
+#define MSNdis_PortChar_SendAuthorizationState_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_SendAuthorizationState_ID 11
+#define MSNdis_PortChar_RcvAuthorizationState_SIZE sizeof(ULONG)
+#define MSNdis_PortChar_RcvAuthorizationState_ID 12
+
+#define MSNdis_PortChar_SIZE (FIELD_OFFSET(MSNdis_PortChar, RcvAuthorizationState) + MSNdis_PortChar_RcvAuthorizationState_SIZE)
+
+#define MSNdis_PortArray_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PortArray_Header_ID 1
+#define MSNdis_PortArray_NumberOfPorts_SIZE sizeof(ULONG)
+#define MSNdis_PortArray_NumberOfPorts_ID 2
+#define MSNdis_PortArray_OffsetFirstPort_SIZE sizeof(ULONG)
+#define MSNdis_PortArray_OffsetFirstPort_ID 3
+#define MSNdis_PortArray_ElementSize_SIZE sizeof(ULONG)
+#define MSNdis_PortArray_ElementSize_ID 4
+#define MSNdis_PortArray_Port_ID 5
+
+#define MSNdis_PciDeviceProperty_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PciDeviceProperty_Header_ID 1
+#define MSNdis_PciDeviceProperty_DeviceType_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_DeviceType_ID 2
+#define MSNdis_PciDeviceProperty_CurrentSpeedAndMode_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_CurrentSpeedAndMode_ID 3
+#define MSNdis_PciDeviceProperty_CurrentPayloadSize_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_CurrentPayloadSize_ID 4
+#define MSNdis_PciDeviceProperty_MaxPayloadSize_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_MaxPayloadSize_ID 5
+#define MSNdis_PciDeviceProperty_MaxReadRequestSize_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_MaxReadRequestSize_ID 6
+#define MSNdis_PciDeviceProperty_CurrentLinkSpeed_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_CurrentLinkSpeed_ID 7
+#define MSNdis_PciDeviceProperty_CurrentLinkWidth_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_CurrentLinkWidth_ID 8
+#define MSNdis_PciDeviceProperty_MaxLinkSpeed_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_MaxLinkSpeed_ID 9
+#define MSNdis_PciDeviceProperty_MaxLinkWidth_SIZE sizeof(ULONG)
+#define MSNdis_PciDeviceProperty_MaxLinkWidth_ID 10
+
+#define MSNdis_PciDeviceProperty_SIZE (FIELD_OFFSET(MSNdis_PciDeviceProperty, MaxLinkWidth) + MSNdis_PciDeviceProperty_MaxLinkWidth_SIZE)
+
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_Encapsulation_ID 1
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_MaxOffLoadSize_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_MaxOffLoadSize_ID 2
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_MinSegmentCount_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_MinSegmentCount_ID 3
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_TcpOptions_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_TcpOptions_ID 4
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_IpOptions_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_IpOptions_ID 5
+
+#define MSNdis_WmiTcpLargeSendOffloadV1_IPv4_SIZE (FIELD_OFFSET(MSNdis_WmiTcpLargeSendOffloadV1_IPv4, IpOptions) + MSNdis_WmiTcpLargeSendOffloadV1_IPv4_IpOptions_SIZE)
+
+#define MSNdis_WmiTcpLargeSendOffloadV1_WmiIPv4_SIZE sizeof(MSNdis_WmiTcpLargeSendOffloadV1_IPv4)
+#define MSNdis_WmiTcpLargeSendOffloadV1_WmiIPv4_ID 1
+
+#define MSNdis_WmiTcpLargeSendOffloadV1_SIZE (FIELD_OFFSET(MSNdis_WmiTcpLargeSendOffloadV1, WmiIPv4) + MSNdis_WmiTcpLargeSendOffloadV1_WmiIPv4_SIZE)
+
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_Encapsulation_ID 1
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_IpOptionsSupported_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_IpOptionsSupported_ID 2
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_TcpOptionsSupported_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_TcpOptionsSupported_ID 3
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_TcpChecksum_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_TcpChecksum_ID 4
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_UdpChecksum_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_UdpChecksum_ID 5
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_IpChecksum_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_IpChecksum_ID 6
+
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_SIZE (FIELD_OFFSET(MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive, IpChecksum) + MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive_IpChecksum_SIZE)
+
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_Encapsulation_ID 1
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_IpExtensionHeadersSupported_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_IpExtensionHeadersSupported_ID 2
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_TcpOptionsSupported_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_TcpOptionsSupported_ID 3
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_TcpChecksum_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_TcpChecksum_ID 4
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_UdpChecksum_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_UdpChecksum_ID 5
+
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_SIZE (FIELD_OFFSET(MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive, UdpChecksum) + MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive_UdpChecksum_SIZE)
+
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4Transmit_SIZE sizeof(MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4Transmit_ID 1
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4Receive_SIZE sizeof(MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv4Receive_ID 2
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6Transmit_SIZE sizeof(MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6Transmit_ID 3
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6Receive_SIZE sizeof(MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive)
+#define MSNdis_WmiTcpIpChecksumOffload_IPv6Receive_ID 4
+
+#define MSNdis_WmiTcpIpChecksumOffload_SIZE (FIELD_OFFSET(MSNdis_WmiTcpIpChecksumOffload, IPv6Receive) + MSNdis_WmiTcpIpChecksumOffload_IPv6Receive_SIZE)
+
+#define MSNdis_WmiIPSecOffloadV1_Supported_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_Supported_Encapsulation_ID 1
+#define MSNdis_WmiIPSecOffloadV1_Supported_AhEspCombined_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_Supported_AhEspCombined_ID 2
+#define MSNdis_WmiIPSecOffloadV1_Supported_TransportTunnelCombined_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_Supported_TransportTunnelCombined_ID 3
+#define MSNdis_WmiIPSecOffloadV1_Supported_IPv4Options_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_Supported_IPv4Options_ID 4
+#define MSNdis_WmiIPSecOffloadV1_Supported_Flags_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_Supported_Flags_ID 5
+
+#define MSNdis_WmiIPSecOffloadV1_Supported_SIZE (FIELD_OFFSET(MSNdis_WmiIPSecOffloadV1_Supported, Flags) + MSNdis_WmiIPSecOffloadV1_Supported_Flags_SIZE)
+
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Md5_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Md5_ID 1
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Sha_1_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Sha_1_ID 2
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Transport_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Transport_ID 3
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Tunnel_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Tunnel_ID 4
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Send_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Send_ID 5
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Receive_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_Receive_ID 6
+
+#define MSNdis_WmiIPSecOffloadV1_IPv4AH_SIZE (FIELD_OFFSET(MSNdis_WmiIPSecOffloadV1_IPv4AH, Receive) + MSNdis_WmiIPSecOffloadV1_IPv4AH_Receive_SIZE)
+
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Des_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Des_ID 1
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Reserved_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Reserved_ID 2
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_TripleDes_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_TripleDes_ID 3
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_NullEsp_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_NullEsp_ID 4
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Transport_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Transport_ID 5
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Tunnel_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Tunnel_ID 6
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Send_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Send_ID 7
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Receive_SIZE sizeof(ULONG)
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_Receive_ID 8
+
+#define MSNdis_WmiIPSecOffloadV1_IPv4ESP_SIZE (FIELD_OFFSET(MSNdis_WmiIPSecOffloadV1_IPv4ESP, Receive) + MSNdis_WmiIPSecOffloadV1_IPv4ESP_Receive_SIZE)
+
+#define MSNdis_WmiIPSecOffloadV1_WmiSupported_SIZE sizeof(MSNdis_WmiIPSecOffloadV1_Supported)
+#define MSNdis_WmiIPSecOffloadV1_WmiSupported_ID 1
+#define MSNdis_WmiIPSecOffloadV1_WmiIPv4AH_SIZE sizeof(MSNdis_WmiIPSecOffloadV1_IPv4AH)
+#define MSNdis_WmiIPSecOffloadV1_WmiIPv4AH_ID 2
+#define MSNdis_WmiIPSecOffloadV1_WmiIPv4ESP_SIZE sizeof(MSNdis_WmiIPSecOffloadV1_IPv4ESP)
+#define MSNdis_WmiIPSecOffloadV1_WmiIPv4ESP_ID 3
+
+#define MSNdis_WmiIPSecOffloadV1_SIZE (FIELD_OFFSET(MSNdis_WmiIPSecOffloadV1, WmiIPv4ESP) + MSNdis_WmiIPSecOffloadV1_WmiIPv4ESP_SIZE)
+
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_Encapsulation_ID 1
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_MaxOffLoadSize_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_MaxOffLoadSize_ID 2
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_MinSegmentCount_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_MinSegmentCount_ID 3
+
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv4_SIZE (FIELD_OFFSET(MSNdis_WmiTcpLargeSendOffloadV2_IPv4, MinSegmentCount) + MSNdis_WmiTcpLargeSendOffloadV2_IPv4_MinSegmentCount_SIZE)
+
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_Encapsulation_ID 1
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_MaxOffLoadSize_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_MaxOffLoadSize_ID 2
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_MinSegmentCount_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_MinSegmentCount_ID 3
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_IpExtensionHeadersSupported_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_IpExtensionHeadersSupported_ID 4
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_TcpOptionsSupported_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_TcpOptionsSupported_ID 5
+
+#define MSNdis_WmiTcpLargeSendOffloadV2_IPv6_SIZE (FIELD_OFFSET(MSNdis_WmiTcpLargeSendOffloadV2_IPv6, TcpOptionsSupported) + MSNdis_WmiTcpLargeSendOffloadV2_IPv6_TcpOptionsSupported_SIZE)
+
+#define MSNdis_WmiTcpLargeSendOffloadV2_WmiIPv4_SIZE sizeof(MSNdis_WmiTcpLargeSendOffloadV2_IPv4)
+#define MSNdis_WmiTcpLargeSendOffloadV2_WmiIPv4_ID 1
+#define MSNdis_WmiTcpLargeSendOffloadV2_WmiIPv6_SIZE sizeof(MSNdis_WmiTcpLargeSendOffloadV2_IPv6)
+#define MSNdis_WmiTcpLargeSendOffloadV2_WmiIPv6_ID 2
+
+#define MSNdis_WmiTcpLargeSendOffloadV2_SIZE (FIELD_OFFSET(MSNdis_WmiTcpLargeSendOffloadV2, WmiIPv6) + MSNdis_WmiTcpLargeSendOffloadV2_WmiIPv6_SIZE)
+
+#define MSNdis_WmiOffload_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiOffload_Header_ID 1
+#define MSNdis_WmiOffload_Checksum_SIZE sizeof(MSNdis_WmiTcpIpChecksumOffload)
+#define MSNdis_WmiOffload_Checksum_ID 2
+#define MSNdis_WmiOffload_LsoV1_SIZE sizeof(MSNdis_WmiTcpLargeSendOffloadV1)
+#define MSNdis_WmiOffload_LsoV1_ID 3
+#define MSNdis_WmiOffload_IPsecV1_SIZE sizeof(MSNdis_WmiIPSecOffloadV1)
+#define MSNdis_WmiOffload_IPsecV1_ID 4
+#define MSNdis_WmiOffload_LsoV2_SIZE sizeof(MSNdis_WmiTcpLargeSendOffloadV2)
+#define MSNdis_WmiOffload_LsoV2_ID 5
+#define MSNdis_WmiOffload_Flags_SIZE sizeof(ULONG)
+#define MSNdis_WmiOffload_Flags_ID 6
+
+#define MSNdis_WmiOffload_SIZE (FIELD_OFFSET(MSNdis_WmiOffload, Flags) + MSNdis_WmiOffload_Flags_SIZE)
+
+#define MSNdis_TcpOffloadParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_TcpOffloadParameters_Header_ID 1
+#define MSNdis_TcpOffloadParameters_IPv4Checksum_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_IPv4Checksum_ID 2
+#define MSNdis_TcpOffloadParameters_TCPIPv4Checksum_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_TCPIPv4Checksum_ID 3
+#define MSNdis_TcpOffloadParameters_UDPIPv4Checksum_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_UDPIPv4Checksum_ID 4
+#define MSNdis_TcpOffloadParameters_TCPIPv6Checksum_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_TCPIPv6Checksum_ID 5
+#define MSNdis_TcpOffloadParameters_UDPIPv6Checksum_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_UDPIPv6Checksum_ID 6
+#define MSNdis_TcpOffloadParameters_LsoV1_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_LsoV1_ID 7
+#define MSNdis_TcpOffloadParameters_IPsec_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_IPsec_ID 8
+#define MSNdis_TcpOffloadParameters_LsoV2IPv4_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_LsoV2IPv4_ID 9
+#define MSNdis_TcpOffloadParameters_LsoV2IPv6_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_LsoV2IPv6_ID 10
+#define MSNdis_TcpOffloadParameters_TcpConnectionIPv4_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_TcpConnectionIPv4_ID 11
+#define MSNdis_TcpOffloadParameters_TcpConnectionIPv6_SIZE sizeof(UCHAR)
+#define MSNdis_TcpOffloadParameters_TcpConnectionIPv6_ID 12
+#define MSNdis_TcpOffloadParameters_Flags_SIZE sizeof(ULONG)
+#define MSNdis_TcpOffloadParameters_Flags_ID 13
+
+#define MSNdis_TcpOffloadParameters_SIZE (FIELD_OFFSET(MSNdis_TcpOffloadParameters, Flags) + MSNdis_TcpOffloadParameters_Flags_SIZE)
+
+#define MSNdis_WmiTcpConnectionOffload_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiTcpConnectionOffload_Header_ID 1
+#define MSNdis_WmiTcpConnectionOffload_Encapsulation_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_Encapsulation_ID 2
+#define MSNdis_WmiTcpConnectionOffload_SupportIp4_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_SupportIp4_ID 3
+#define MSNdis_WmiTcpConnectionOffload_SupportIp6_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_SupportIp6_ID 4
+#define MSNdis_WmiTcpConnectionOffload_SupportIp6ExtensionHeaders_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_SupportIp6ExtensionHeaders_ID 5
+#define MSNdis_WmiTcpConnectionOffload_SupportSack_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_SupportSack_ID 6
+#define MSNdis_WmiTcpConnectionOffload_TcpConnectionOffloadCapacity_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_TcpConnectionOffloadCapacity_ID 7
+#define MSNdis_WmiTcpConnectionOffload_Flags_SIZE sizeof(ULONG)
+#define MSNdis_WmiTcpConnectionOffload_Flags_ID 8
+
+#define MSNdis_WmiTcpConnectionOffload_SIZE (FIELD_OFFSET(MSNdis_WmiTcpConnectionOffload, Flags) + MSNdis_WmiTcpConnectionOffload_Flags_SIZE)
+
+#define MSNdis_WmiHDSplitCurrentConfig_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiHDSplitCurrentConfig_Header_ID 1
+#define MSNdis_WmiHDSplitCurrentConfig_HardwareCapabilities_SIZE sizeof(ULONG)
+#define MSNdis_WmiHDSplitCurrentConfig_HardwareCapabilities_ID 2
+#define MSNdis_WmiHDSplitCurrentConfig_CurrentCapabilities_SIZE sizeof(ULONG)
+#define MSNdis_WmiHDSplitCurrentConfig_CurrentCapabilities_ID 3
+#define MSNdis_WmiHDSplitCurrentConfig_HDSplitFlags_SIZE sizeof(ULONG)
+#define MSNdis_WmiHDSplitCurrentConfig_HDSplitFlags_ID 4
+#define MSNdis_WmiHDSplitCurrentConfig_HDSplitCombineFlags_SIZE sizeof(ULONG)
+#define MSNdis_WmiHDSplitCurrentConfig_HDSplitCombineFlags_ID 5
+#define MSNdis_WmiHDSplitCurrentConfig_BackfillSize_SIZE sizeof(ULONG)
+#define MSNdis_WmiHDSplitCurrentConfig_BackfillSize_ID 6
+#define MSNdis_WmiHDSplitCurrentConfig_MaxHeaderSize_SIZE sizeof(ULONG)
+#define MSNdis_WmiHDSplitCurrentConfig_MaxHeaderSize_ID 7
+
+#define MSNdis_WmiHDSplitCurrentConfig_SIZE (FIELD_OFFSET(MSNdis_WmiHDSplitCurrentConfig, MaxHeaderSize) + MSNdis_WmiHDSplitCurrentConfig_MaxHeaderSize_SIZE)
+
+#define MSNdis_HDSplitParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_HDSplitParameters_Header_ID 1
+#define MSNdis_HDSplitParameters_HDSplitCombineFlags_SIZE sizeof(ULONG)
+#define MSNdis_HDSplitParameters_HDSplitCombineFlags_ID 2
+
+#define MSNdis_HDSplitParameters_SIZE (FIELD_OFFSET(MSNdis_HDSplitParameters, HDSplitCombineFlags) + MSNdis_HDSplitParameters_HDSplitCombineFlags_SIZE)
+
+#define MSNdis_WmiReceiveScaleCapabilities_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_WmiReceiveScaleCapabilities_Header_ID 1
+#define MSNdis_WmiReceiveScaleCapabilities_CapabilitiesFlags_SIZE sizeof(ULONG)
+#define MSNdis_WmiReceiveScaleCapabilities_CapabilitiesFlags_ID 2
+#define MSNdis_WmiReceiveScaleCapabilities_NumberOfInterruptMessages_SIZE sizeof(ULONG)
+#define MSNdis_WmiReceiveScaleCapabilities_NumberOfInterruptMessages_ID 3
+#define MSNdis_WmiReceiveScaleCapabilities_NumberOfReceiveQueues_SIZE sizeof(ULONG)
+#define MSNdis_WmiReceiveScaleCapabilities_NumberOfReceiveQueues_ID 4
+
+#define MSNdis_WmiReceiveScaleCapabilities_SIZE (FIELD_OFFSET(MSNdis_WmiReceiveScaleCapabilities, NumberOfReceiveQueues) + MSNdis_WmiReceiveScaleCapabilities_NumberOfReceiveQueues_SIZE)
+
+#define MSNdis_ReceiveFilterCapabilities_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveFilterCapabilities_Header_ID 1
+#define MSNdis_ReceiveFilterCapabilities_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_Flags_ID 2
+#define MSNdis_ReceiveFilterCapabilities_EnabledFilterTypes_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_EnabledFilterTypes_ID 3
+#define MSNdis_ReceiveFilterCapabilities_EnabledQueueTypes_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_EnabledQueueTypes_ID 4
+#define MSNdis_ReceiveFilterCapabilities_NumQueues_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_NumQueues_ID 5
+#define MSNdis_ReceiveFilterCapabilities_SupportedQueueProperties_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_SupportedQueueProperties_ID 6
+#define MSNdis_ReceiveFilterCapabilities_SupportedFilterTests_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_SupportedFilterTests_ID 7
+#define MSNdis_ReceiveFilterCapabilities_SupportedHeaders_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_SupportedHeaders_ID 8
+#define MSNdis_ReceiveFilterCapabilities_SupportedMacHeaderFields_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_SupportedMacHeaderFields_ID 9
+#define MSNdis_ReceiveFilterCapabilities_MaxMacHeaderFilters_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_MaxMacHeaderFilters_ID 10
+#define MSNdis_ReceiveFilterCapabilities_MaxQueueGroups_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_MaxQueueGroups_ID 11
+#define MSNdis_ReceiveFilterCapabilities_MaxQueuesPerQueueGroup_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_MaxQueuesPerQueueGroup_ID 12
+#define MSNdis_ReceiveFilterCapabilities_MinLookaheadSplitSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_MinLookaheadSplitSize_ID 13
+#define MSNdis_ReceiveFilterCapabilities_MaxLookaheadSplitSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterCapabilities_MaxLookaheadSplitSize_ID 14
+
+#define MSNdis_ReceiveFilterCapabilities_SIZE (FIELD_OFFSET(MSNdis_ReceiveFilterCapabilities, MaxLookaheadSplitSize) + MSNdis_ReceiveFilterCapabilities_MaxLookaheadSplitSize_SIZE)
+
+#define MSNdis_ReceiveFilterGlobalParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveFilterGlobalParameters_Header_ID 1
+#define MSNdis_ReceiveFilterGlobalParameters_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterGlobalParameters_Flags_ID 2
+#define MSNdis_ReceiveFilterGlobalParameters_EnabledFilterTypes_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterGlobalParameters_EnabledFilterTypes_ID 3
+#define MSNdis_ReceiveFilterGlobalParameters_EnabledQueueTypes_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterGlobalParameters_EnabledQueueTypes_ID 4
+
+#define MSNdis_ReceiveFilterGlobalParameters_SIZE (FIELD_OFFSET(MSNdis_ReceiveFilterGlobalParameters, EnabledQueueTypes) + MSNdis_ReceiveFilterGlobalParameters_EnabledQueueTypes_SIZE)
+
+#define MSNdis_CountedString_Length_SIZE sizeof(USHORT)
+#define MSNdis_CountedString_Length_ID 1
+#define MSNdis_CountedString_String_SIZE sizeof(SHORT[257])
+#define MSNdis_CountedString_String_ID 2
+
+#define MSNdis_CountedString_SIZE (FIELD_OFFSET(MSNdis_CountedString, String) + MSNdis_CountedString_String_SIZE)
+
+#define MSNdis_ReceiveFilterInfo_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveFilterInfo_Header_ID 1
+#define MSNdis_ReceiveFilterInfo_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfo_Flags_ID 2
+#define MSNdis_ReceiveFilterInfo_FilterType_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfo_FilterType_ID 3
+#define MSNdis_ReceiveFilterInfo_FilterId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfo_FilterId_ID 4
+
+#define MSNdis_ReceiveFilterInfo_SIZE (FIELD_OFFSET(MSNdis_ReceiveFilterInfo, FilterId) + MSNdis_ReceiveFilterInfo_FilterId_SIZE)
+
+#define MSNdis_ReceiveFilterInfoArray_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveFilterInfoArray_Header_ID 1
+#define MSNdis_ReceiveFilterInfoArray_QueueId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfoArray_QueueId_ID 2
+#define MSNdis_ReceiveFilterInfoArray_FirstElementOffset_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfoArray_FirstElementOffset_ID 3
+#define MSNdis_ReceiveFilterInfoArray_NumElements_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfoArray_NumElements_ID 4
+#define MSNdis_ReceiveFilterInfoArray_ElementSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterInfoArray_ElementSize_ID 5
+#define MSNdis_ReceiveFilterInfoArray_Filter_ID 6
+
+#define MSNdis_ReceiveFilterFieldParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveFilterFieldParameters_Header_ID 1
+#define MSNdis_ReceiveFilterFieldParameters_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterFieldParameters_Flags_ID 2
+#define MSNdis_ReceiveFilterFieldParameters_FrameHeader_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterFieldParameters_FrameHeader_ID 3
+#define MSNdis_ReceiveFilterFieldParameters_ReceiveFilterTest_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterFieldParameters_ReceiveFilterTest_ID 4
+#define MSNdis_ReceiveFilterFieldParameters_MacHeaderField_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterFieldParameters_MacHeaderField_ID 5
+#define MSNdis_ReceiveFilterFieldParameters_FieldByteArrayValue_SIZE sizeof(UCHAR[16])
+#define MSNdis_ReceiveFilterFieldParameters_FieldByteArrayValue_ID 6
+#define MSNdis_ReceiveFilterFieldParameters_ResultByteArrayValue_SIZE sizeof(UCHAR[16])
+#define MSNdis_ReceiveFilterFieldParameters_ResultByteArrayValue_ID 7
+
+#define MSNdis_ReceiveFilterFieldParameters_SIZE (FIELD_OFFSET(MSNdis_ReceiveFilterFieldParameters, ResultByteArrayValue) + MSNdis_ReceiveFilterFieldParameters_ResultByteArrayValue_SIZE)
+
+#define MSNdis_ReceiveFilterParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveFilterParameters_Header_ID 1
+#define MSNdis_ReceiveFilterParameters_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_Flags_ID 2
+#define MSNdis_ReceiveFilterParameters_FilterType_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_FilterType_ID 3
+#define MSNdis_ReceiveFilterParameters_QueueId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_QueueId_ID 4
+#define MSNdis_ReceiveFilterParameters_FilterId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_FilterId_ID 5
+#define MSNdis_ReceiveFilterParameters_FieldParametersArrayOffset_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_FieldParametersArrayOffset_ID 6
+#define MSNdis_ReceiveFilterParameters_FieldParametersArrayNumElements_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_FieldParametersArrayNumElements_ID 7
+#define MSNdis_ReceiveFilterParameters_FieldParametersArrayElementSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_FieldParametersArrayElementSize_ID 8
+#define MSNdis_ReceiveFilterParameters_RequestedFilterIdBitCount_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveFilterParameters_RequestedFilterIdBitCount_ID 9
+#define MSNdis_ReceiveFilterParameters_FieldParameters_ID 10
+
+#define MSNdis_NicSwitchCapabilities_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_NicSwitchCapabilities_Header_ID 1
+#define MSNdis_NicSwitchCapabilities_Flags_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_Flags_ID 2
+#define MSNdis_NicSwitchCapabilities_NdisReserved1_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_NdisReserved1_ID 3
+#define MSNdis_NicSwitchCapabilities_NumTotalMacAddresses_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_NumTotalMacAddresses_ID 4
+#define MSNdis_NicSwitchCapabilities_NumMacAddressesPerPort_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_NumMacAddressesPerPort_ID 5
+#define MSNdis_NicSwitchCapabilities_NumVlansPerPort_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_NumVlansPerPort_ID 6
+#define MSNdis_NicSwitchCapabilities_NdisReserved2_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_NdisReserved2_ID 7
+#define MSNdis_NicSwitchCapabilities_NdisReserved3_SIZE sizeof(ULONG)
+#define MSNdis_NicSwitchCapabilities_NdisReserved3_ID 8
+
+#define MSNdis_NicSwitchCapabilities_SIZE (FIELD_OFFSET(MSNdis_NicSwitchCapabilities, NdisReserved3) + MSNdis_NicSwitchCapabilities_NdisReserved3_SIZE)
+
+#define MSNdis_GroupAffinity_Mask_SIZE sizeof(ULONGLONG)
+#define MSNdis_GroupAffinity_Mask_ID 1
+#define MSNdis_GroupAffinity_Group_SIZE sizeof(USHORT)
+#define MSNdis_GroupAffinity_Group_ID 2
+#define MSNdis_GroupAffinity_Reserved_SIZE sizeof(USHORT[3])
+#define MSNdis_GroupAffinity_Reserved_ID 3
+
+#define MSNdis_GroupAffinity_SIZE (FIELD_OFFSET(MSNdis_GroupAffinity, Reserved) + MSNdis_GroupAffinity_Reserved_SIZE)
+
+#define MSNdis_ReceiveQueueParameters_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveQueueParameters_Header_ID 1
+#define MSNdis_ReceiveQueueParameters_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_Flags_ID 2
+#define MSNdis_ReceiveQueueParameters_QueueType_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_QueueType_ID 3
+#define MSNdis_ReceiveQueueParameters_QueueId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_QueueId_ID 4
+#define MSNdis_ReceiveQueueParameters_QueueGroupId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_QueueGroupId_ID 5
+#define MSNdis_ReceiveQueueParameters_ProcessorAffinity_SIZE sizeof(MSNdis_GroupAffinity)
+#define MSNdis_ReceiveQueueParameters_ProcessorAffinity_ID 6
+#define MSNdis_ReceiveQueueParameters_NumSuggestedReceiveBuffers_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_NumSuggestedReceiveBuffers_ID 7
+#define MSNdis_ReceiveQueueParameters_MSIXTableEntry_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_MSIXTableEntry_ID 8
+#define MSNdis_ReceiveQueueParameters_LookaheadSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueParameters_LookaheadSize_ID 9
+#define MSNdis_ReceiveQueueParameters_VmName_SIZE sizeof(MSNdis_CountedString)
+#define MSNdis_ReceiveQueueParameters_VmName_ID 10
+#define MSNdis_ReceiveQueueParameters_QueueName_SIZE sizeof(MSNdis_CountedString)
+#define MSNdis_ReceiveQueueParameters_QueueName_ID 11
+
+#define MSNdis_ReceiveQueueParameters_SIZE (FIELD_OFFSET(MSNdis_ReceiveQueueParameters, QueueName) + MSNdis_ReceiveQueueParameters_QueueName_SIZE)
+
+#define MSNdis_ReceiveQueueInfo_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveQueueInfo_Header_ID 1
+#define MSNdis_ReceiveQueueInfo_Flags_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_Flags_ID 2
+#define MSNdis_ReceiveQueueInfo_QueueType_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_QueueType_ID 3
+#define MSNdis_ReceiveQueueInfo_QueueId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_QueueId_ID 4
+#define MSNdis_ReceiveQueueInfo_QueueGroupId_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_QueueGroupId_ID 5
+#define MSNdis_ReceiveQueueInfo_QueueState_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_QueueState_ID 6
+#define MSNdis_ReceiveQueueInfo_ProcessorAffinity_SIZE sizeof(MSNdis_GroupAffinity)
+#define MSNdis_ReceiveQueueInfo_ProcessorAffinity_ID 7
+#define MSNdis_ReceiveQueueInfo_NumSuggestedReceiveBuffers_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_NumSuggestedReceiveBuffers_ID 8
+#define MSNdis_ReceiveQueueInfo_MSIXTableEntry_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_MSIXTableEntry_ID 9
+#define MSNdis_ReceiveQueueInfo_LookaheadSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfo_LookaheadSize_ID 10
+#define MSNdis_ReceiveQueueInfo_VmName_SIZE sizeof(MSNdis_CountedString)
+#define MSNdis_ReceiveQueueInfo_VmName_ID 11
+#define MSNdis_ReceiveQueueInfo_QueueName_SIZE sizeof(MSNdis_CountedString)
+#define MSNdis_ReceiveQueueInfo_QueueName_ID 12
+
+#define MSNdis_ReceiveQueueInfo_SIZE (FIELD_OFFSET(MSNdis_ReceiveQueueInfo, QueueName) + MSNdis_ReceiveQueueInfo_QueueName_SIZE)
+
+#define MSNdis_ReceiveQueueInfoArray_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_ReceiveQueueInfoArray_Header_ID 1
+#define MSNdis_ReceiveQueueInfoArray_FirstElementOffset_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfoArray_FirstElementOffset_ID 2
+#define MSNdis_ReceiveQueueInfoArray_NumElements_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfoArray_NumElements_ID 3
+#define MSNdis_ReceiveQueueInfoArray_ElementSize_SIZE sizeof(ULONG)
+#define MSNdis_ReceiveQueueInfoArray_ElementSize_ID 4
+#define MSNdis_ReceiveQueueInfoArray_Queue_ID 5
+
+#define WmiQueryLinkState 1
+
+#define WmiQueryLinkState_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryLinkState_IN_Header_ID 1
+
+#define WmiQueryLinkState_IN_SIZE (FIELD_OFFSET(WmiQueryLinkState_IN, Header) + WmiQueryLinkState_IN_Header_SIZE)
+
+#define WmiQueryLinkState_OUT_LinkState_SIZE sizeof(MSNdis_LinkStateData)
+#define WmiQueryLinkState_OUT_LinkState_ID 2
+
+#define WmiQueryLinkState_OUT_SIZE (FIELD_OFFSET(WmiQueryLinkState_OUT, LinkState) + WmiQueryLinkState_OUT_LinkState_SIZE)
+
+#define WmiQueryInterruptModeration 1
+
+#define WmiQueryInterruptModeration_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryInterruptModeration_IN_Header_ID 1
+
+#define WmiQueryInterruptModeration_IN_SIZE (FIELD_OFFSET(WmiQueryInterruptModeration_IN, Header) + WmiQueryInterruptModeration_IN_Header_SIZE)
+
+#define WmiQueryInterruptModeration_OUT_InterruptModeration_SIZE sizeof(MSNdis_InterruptModerationParameters)
+#define WmiQueryInterruptModeration_OUT_InterruptModeration_ID 2
+
+#define WmiQueryInterruptModeration_OUT_SIZE (FIELD_OFFSET(WmiQueryInterruptModeration_OUT, InterruptModeration) + WmiQueryInterruptModeration_OUT_InterruptModeration_SIZE)
+
+#define WmiSetInterruptModeration 1
+
+#define WmiSetInterruptModeration_IN_MethodHeader_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiSetInterruptModeration_IN_MethodHeader_ID 1
+#define WmiSetInterruptModeration_IN_InterruptModeration_SIZE sizeof(MSNdis_InterruptModerationParameters)
+#define WmiSetInterruptModeration_IN_InterruptModeration_ID 2
+
+#define WmiSetInterruptModeration_IN_SIZE (FIELD_OFFSET(WmiSetInterruptModeration_IN, InterruptModeration) + WmiSetInterruptModeration_IN_InterruptModeration_SIZE)
+
+#define WmiSetInterruptModeration_OUT_OutputInfo_SIZE sizeof(MSNdis_WmiOutputInfo)
+#define WmiSetInterruptModeration_OUT_OutputInfo_ID 3
+
+#define WmiSetInterruptModeration_OUT_SIZE (FIELD_OFFSET(WmiSetInterruptModeration_OUT, OutputInfo) + WmiSetInterruptModeration_OUT_OutputInfo_SIZE)
+
+#define WmiSetLinkParameters 1
+
+#define WmiSetLinkParameters_IN_MethodHeader_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiSetLinkParameters_IN_MethodHeader_ID 1
+#define WmiSetLinkParameters_IN_LinkParameters_SIZE sizeof(MSNdis_LinkParameters)
+#define WmiSetLinkParameters_IN_LinkParameters_ID 2
+
+#define WmiSetLinkParameters_IN_SIZE (FIELD_OFFSET(WmiSetLinkParameters_IN, LinkParameters) + WmiSetLinkParameters_IN_LinkParameters_SIZE)
+
+#define WmiSetLinkParameters_OUT_OutputInfo_SIZE sizeof(MSNdis_WmiOutputInfo)
+#define WmiSetLinkParameters_OUT_OutputInfo_ID 3
+
+#define WmiSetLinkParameters_OUT_SIZE (FIELD_OFFSET(WmiSetLinkParameters_OUT, OutputInfo) + WmiSetLinkParameters_OUT_OutputInfo_SIZE)
+
+#define WmiQueryStatisticsInfo 1
+
+#define WmiQueryStatisticsInfo_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryStatisticsInfo_IN_Header_ID 1
+
+#define WmiQueryStatisticsInfo_IN_SIZE (FIELD_OFFSET(WmiQueryStatisticsInfo_IN, Header) + WmiQueryStatisticsInfo_IN_Header_SIZE)
+
+#define WmiQueryStatisticsInfo_OUT_StatisticsInfo_SIZE sizeof(MSNdis_StatisticsInfo)
+#define WmiQueryStatisticsInfo_OUT_StatisticsInfo_ID 2
+
+#define WmiQueryStatisticsInfo_OUT_SIZE (FIELD_OFFSET(WmiQueryStatisticsInfo_OUT, StatisticsInfo) + WmiQueryStatisticsInfo_OUT_StatisticsInfo_SIZE)
+
+#define WmiQueryPortState 1
+
+#define WmiQueryPortState_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryPortState_IN_Header_ID 1
+
+#define WmiQueryPortState_IN_SIZE (FIELD_OFFSET(WmiQueryPortState_IN, Header) + WmiQueryPortState_IN_Header_SIZE)
+
+#define WmiQueryPortState_OUT_PortState_SIZE sizeof(MSNdis_PortStateData)
+#define WmiQueryPortState_OUT_PortState_ID 2
+
+#define WmiQueryPortState_OUT_SIZE (FIELD_OFFSET(WmiQueryPortState_OUT, PortState) + WmiQueryPortState_OUT_PortState_SIZE)
+
+#define WmiEnumeratePorts 1
+
+#define WmiEnumeratePorts_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiEnumeratePorts_IN_Header_ID 1
+
+#define WmiEnumeratePorts_IN_SIZE (FIELD_OFFSET(WmiEnumeratePorts_IN, Header) + WmiEnumeratePorts_IN_Header_SIZE)
+
+#define WmiEnumeratePorts_OUT_Ports_SIZE sizeof(MSNdis_PortArray)
+#define WmiEnumeratePorts_OUT_Ports_ID 2
+
+#define WmiEnumeratePorts_OUT_SIZE (FIELD_OFFSET(WmiEnumeratePorts_OUT, Ports) + WmiEnumeratePorts_OUT_Ports_SIZE)
+
+#define WmiSetPortParameters 1
+
+#define WmiSetPortParameters_IN_MethodHeader_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiSetPortParameters_IN_MethodHeader_ID 1
+#define WmiSetPortParameters_IN_PortParameters_SIZE sizeof(MSNdis_PortAuthParameters)
+#define WmiSetPortParameters_IN_PortParameters_ID 2
+
+#define WmiSetPortParameters_IN_SIZE (FIELD_OFFSET(WmiSetPortParameters_IN, PortParameters) + WmiSetPortParameters_IN_PortParameters_SIZE)
+
+#define WmiSetPortParameters_OUT_OutputInfo_SIZE sizeof(MSNdis_WmiOutputInfo)
+#define WmiSetPortParameters_OUT_OutputInfo_ID 3
+
+#define WmiSetPortParameters_OUT_SIZE (FIELD_OFFSET(WmiSetPortParameters_OUT, OutputInfo) + WmiSetPortParameters_OUT_OutputInfo_SIZE)
+
+#define WmiQueryPciDeviceCustomProperty 1
+
+#define WmiQueryPciDeviceCustomProperty_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryPciDeviceCustomProperty_IN_Header_ID 1
+
+#define WmiQueryPciDeviceCustomProperty_IN_SIZE (FIELD_OFFSET(WmiQueryPciDeviceCustomProperty_IN, Header) + WmiQueryPciDeviceCustomProperty_IN_Header_SIZE)
+
+#define WmiQueryPciDeviceCustomProperty_OUT_PciDeviceProperty_SIZE sizeof(MSNdis_PciDeviceProperty)
+#define WmiQueryPciDeviceCustomProperty_OUT_PciDeviceProperty_ID 2
+
+#define WmiQueryPciDeviceCustomProperty_OUT_SIZE (FIELD_OFFSET(WmiQueryPciDeviceCustomProperty_OUT, PciDeviceProperty) + WmiQueryPciDeviceCustomProperty_OUT_PciDeviceProperty_SIZE)
+
+#define MSNdis_EnumerateAdapterEx_EnumerateAdapter_SIZE sizeof(MSNdis_WmiEnumAdapter)
+#define MSNdis_EnumerateAdapterEx_EnumerateAdapter_ID 1
+
+#define MSNdis_EnumerateAdapterEx_SIZE (FIELD_OFFSET(MSNdis_EnumerateAdapterEx, EnumerateAdapter) + MSNdis_EnumerateAdapterEx_EnumerateAdapter_SIZE)
+
+#define WmiQueryCurrentOffloadConfig 1
+
+#define WmiQueryCurrentOffloadConfig_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryCurrentOffloadConfig_IN_Header_ID 1
+
+#define WmiQueryCurrentOffloadConfig_IN_SIZE (FIELD_OFFSET(WmiQueryCurrentOffloadConfig_IN, Header) + WmiQueryCurrentOffloadConfig_IN_Header_SIZE)
+
+#define WmiQueryCurrentOffloadConfig_OUT_Offload_SIZE sizeof(MSNdis_WmiOffload)
+#define WmiQueryCurrentOffloadConfig_OUT_Offload_ID 2
+
+#define WmiQueryCurrentOffloadConfig_OUT_SIZE (FIELD_OFFSET(WmiQueryCurrentOffloadConfig_OUT, Offload) + WmiQueryCurrentOffloadConfig_OUT_Offload_SIZE)
+
+#define WmiQueryHardwareOffloadConfig 1
+
+#define WmiQueryHardwareOffloadConfig_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryHardwareOffloadConfig_IN_Header_ID 1
+
+#define WmiQueryHardwareOffloadConfig_IN_SIZE (FIELD_OFFSET(WmiQueryHardwareOffloadConfig_IN, Header) + WmiQueryHardwareOffloadConfig_IN_Header_SIZE)
+
+#define WmiQueryHardwareOffloadConfig_OUT_Offload_SIZE sizeof(MSNdis_WmiOffload)
+#define WmiQueryHardwareOffloadConfig_OUT_Offload_ID 2
+
+#define WmiQueryHardwareOffloadConfig_OUT_SIZE (FIELD_OFFSET(WmiQueryHardwareOffloadConfig_OUT, Offload) + WmiQueryHardwareOffloadConfig_OUT_Offload_SIZE)
+
+#define WmiSetTcpOffloadParameters 1
+
+#define WmiSetTcpOffloadParameters_IN_MethodHeader_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiSetTcpOffloadParameters_IN_MethodHeader_ID 1
+#define WmiSetTcpOffloadParameters_IN_TcpOffloadParameters_SIZE sizeof(MSNdis_TcpOffloadParameters)
+#define WmiSetTcpOffloadParameters_IN_TcpOffloadParameters_ID 2
+
+#define WmiSetTcpOffloadParameters_IN_SIZE (FIELD_OFFSET(WmiSetTcpOffloadParameters_IN, TcpOffloadParameters) + WmiSetTcpOffloadParameters_IN_TcpOffloadParameters_SIZE)
+
+#define WmiSetTcpOffloadParameters_OUT_OutputInfo_SIZE sizeof(MSNdis_WmiOutputInfo)
+#define WmiSetTcpOffloadParameters_OUT_OutputInfo_ID 3
+
+#define WmiSetTcpOffloadParameters_OUT_SIZE (FIELD_OFFSET(WmiSetTcpOffloadParameters_OUT, OutputInfo) + WmiSetTcpOffloadParameters_OUT_OutputInfo_SIZE)
+
+#define WmiQueryTcpConnectionOffloadCurrentConfig 1
+
+#define WmiQueryTcpConnectionOffloadCurrentConfig_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryTcpConnectionOffloadCurrentConfig_IN_Header_ID 1
+
+#define WmiQueryTcpConnectionOffloadCurrentConfig_IN_SIZE (FIELD_OFFSET(WmiQueryTcpConnectionOffloadCurrentConfig_IN, Header) + WmiQueryTcpConnectionOffloadCurrentConfig_IN_Header_SIZE)
+
+#define WmiQueryTcpConnectionOffloadCurrentConfig_OUT_Offload_SIZE sizeof(MSNdis_WmiTcpConnectionOffload)
+#define WmiQueryTcpConnectionOffloadCurrentConfig_OUT_Offload_ID 2
+
+#define WmiQueryTcpConnectionOffloadCurrentConfig_OUT_SIZE (FIELD_OFFSET(WmiQueryTcpConnectionOffloadCurrentConfig_OUT, Offload) + WmiQueryTcpConnectionOffloadCurrentConfig_OUT_Offload_SIZE)
+
+#define WmiQueryTcpConnectionOffloadHardwareConfig 1
+
+#define WmiQueryTcpConnectionOffloadHardwareConfig_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryTcpConnectionOffloadHardwareConfig_IN_Header_ID 1
+
+#define WmiQueryTcpConnectionOffloadHardwareConfig_IN_SIZE (FIELD_OFFSET(WmiQueryTcpConnectionOffloadHardwareConfig_IN, Header) + WmiQueryTcpConnectionOffloadHardwareConfig_IN_Header_SIZE)
+
+#define WmiQueryTcpConnectionOffloadHardwareConfig_OUT_Offload_SIZE sizeof(MSNdis_WmiTcpConnectionOffload)
+#define WmiQueryTcpConnectionOffloadHardwareConfig_OUT_Offload_ID 2
+
+#define WmiQueryTcpConnectionOffloadHardwareConfig_OUT_SIZE (FIELD_OFFSET(WmiQueryTcpConnectionOffloadHardwareConfig_OUT, Offload) + WmiQueryTcpConnectionOffloadHardwareConfig_OUT_Offload_SIZE)
+
+#define WmiQueryReceiveScaleCapabilities 1
+
+#define WmiQueryReceiveScaleCapabilities_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryReceiveScaleCapabilities_IN_Header_ID 1
+
+#define WmiQueryReceiveScaleCapabilities_IN_SIZE (FIELD_OFFSET(WmiQueryReceiveScaleCapabilities_IN, Header) + WmiQueryReceiveScaleCapabilities_IN_Header_SIZE)
+
+#define WmiQueryReceiveScaleCapabilities_OUT_RssCaps_SIZE sizeof(MSNdis_WmiReceiveScaleCapabilities)
+#define WmiQueryReceiveScaleCapabilities_OUT_RssCaps_ID 2
+
+#define WmiQueryReceiveScaleCapabilities_OUT_SIZE (FIELD_OFFSET(WmiQueryReceiveScaleCapabilities_OUT, RssCaps) + WmiQueryReceiveScaleCapabilities_OUT_RssCaps_SIZE)
+
+#define WmiQueryHDSplitCurrentConfig 1
+
+#define WmiQueryHDSplitCurrentConfig_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryHDSplitCurrentConfig_IN_Header_ID 1
+
+#define WmiQueryHDSplitCurrentConfig_IN_SIZE (FIELD_OFFSET(WmiQueryHDSplitCurrentConfig_IN, Header) + WmiQueryHDSplitCurrentConfig_IN_Header_SIZE)
+
+#define WmiQueryHDSplitCurrentConfig_OUT_HdSplitCurrentConfig_SIZE sizeof(MSNdis_WmiHDSplitCurrentConfig)
+#define WmiQueryHDSplitCurrentConfig_OUT_HdSplitCurrentConfig_ID 2
+
+#define WmiQueryHDSplitCurrentConfig_OUT_SIZE (FIELD_OFFSET(WmiQueryHDSplitCurrentConfig_OUT, HdSplitCurrentConfig) + WmiQueryHDSplitCurrentConfig_OUT_HdSplitCurrentConfig_SIZE)
+
+#define WmiSetHDSplitParameters 1
+
+#define WmiSetHDSplitParameters_IN_MethodHeader_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiSetHDSplitParameters_IN_MethodHeader_ID 1
+#define WmiSetHDSplitParameters_IN_HDSplitParameters_SIZE sizeof(MSNdis_HDSplitParameters)
+#define WmiSetHDSplitParameters_IN_HDSplitParameters_ID 2
+
+#define WmiSetHDSplitParameters_IN_SIZE (FIELD_OFFSET(WmiSetHDSplitParameters_IN, HDSplitParameters) + WmiSetHDSplitParameters_IN_HDSplitParameters_SIZE)
+
+#define WmiSetHDSplitParameters_OUT_OutputInfo_SIZE sizeof(MSNdis_WmiOutputInfo)
+#define WmiSetHDSplitParameters_OUT_OutputInfo_ID 3
+
+#define WmiSetHDSplitParameters_OUT_SIZE (FIELD_OFFSET(WmiSetHDSplitParameters_OUT, OutputInfo) + WmiSetHDSplitParameters_OUT_OutputInfo_SIZE)
+
+#define WmiQueryPhysicalMediumTypeEx 1
+
+#define WmiQueryPhysicalMediumTypeEx_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryPhysicalMediumTypeEx_IN_Header_ID 1
+
+#define WmiQueryPhysicalMediumTypeEx_IN_SIZE (FIELD_OFFSET(WmiQueryPhysicalMediumTypeEx_IN, Header) + WmiQueryPhysicalMediumTypeEx_IN_Header_SIZE)
+
+#define WmiQueryPhysicalMediumTypeEx_OUT_NdisPhysicalMediumTypeEx_SIZE sizeof(ULONG)
+#define WmiQueryPhysicalMediumTypeEx_OUT_NdisPhysicalMediumTypeEx_ID 2
+
+#define WmiQueryPhysicalMediumTypeEx_OUT_SIZE (FIELD_OFFSET(WmiQueryPhysicalMediumTypeEx_OUT, NdisPhysicalMediumTypeEx) + WmiQueryPhysicalMediumTypeEx_OUT_NdisPhysicalMediumTypeEx_SIZE)
+
+#define WmiQueryReceiveFilterHardwareCapabilities 1
+
+#define WmiQueryReceiveFilterHardwareCapabilities_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryReceiveFilterHardwareCapabilities_IN_Header_ID 1
+
+#define WmiQueryReceiveFilterHardwareCapabilities_IN_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterHardwareCapabilities_IN, Header) + WmiQueryReceiveFilterHardwareCapabilities_IN_Header_SIZE)
+
+#define WmiQueryReceiveFilterHardwareCapabilities_OUT_ReceiveFilterHardwareCapabilities_SIZE sizeof(MSNdis_ReceiveFilterCapabilities)
+#define WmiQueryReceiveFilterHardwareCapabilities_OUT_ReceiveFilterHardwareCapabilities_ID 2
+
+#define WmiQueryReceiveFilterHardwareCapabilities_OUT_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterHardwareCapabilities_OUT, ReceiveFilterHardwareCapabilities) + WmiQueryReceiveFilterHardwareCapabilities_OUT_ReceiveFilterHardwareCapabilities_SIZE)
+
+#define WmiQueryReceiveFilterGlobalParameters 1
+
+#define WmiQueryReceiveFilterGlobalParameters_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryReceiveFilterGlobalParameters_IN_Header_ID 1
+
+#define WmiQueryReceiveFilterGlobalParameters_IN_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterGlobalParameters_IN, Header) + WmiQueryReceiveFilterGlobalParameters_IN_Header_SIZE)
+
+#define WmiQueryReceiveFilterGlobalParameters_OUT_ReceiveFilterGlobalParameters_SIZE sizeof(MSNdis_ReceiveFilterGlobalParameters)
+#define WmiQueryReceiveFilterGlobalParameters_OUT_ReceiveFilterGlobalParameters_ID 2
+
+#define WmiQueryReceiveFilterGlobalParameters_OUT_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterGlobalParameters_OUT, ReceiveFilterGlobalParameters) + WmiQueryReceiveFilterGlobalParameters_OUT_ReceiveFilterGlobalParameters_SIZE)
+
+#define WmiEnumReceiveFilters 1
+
+#define WmiEnumReceiveFilters_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiEnumReceiveFilters_IN_Header_ID 1
+#define WmiEnumReceiveFilters_IN_ReceiveFilterInfoArray_SIZE sizeof(MSNdis_ReceiveFilterInfoArray)
+#define WmiEnumReceiveFilters_IN_ReceiveFilterInfoArray_ID 2
+
+#define WmiEnumReceiveFilters_IN_SIZE (FIELD_OFFSET(WmiEnumReceiveFilters_IN, ReceiveFilterInfoArray) + WmiEnumReceiveFilters_IN_ReceiveFilterInfoArray_SIZE)
+
+#define WmiEnumReceiveFilters_OUT_ReceiveFilterInfoArray_SIZE sizeof(MSNdis_ReceiveFilterInfoArray)
+#define WmiEnumReceiveFilters_OUT_ReceiveFilterInfoArray_ID 2
+
+#define WmiEnumReceiveFilters_OUT_SIZE (FIELD_OFFSET(WmiEnumReceiveFilters_OUT, ReceiveFilterInfoArray) + WmiEnumReceiveFilters_OUT_ReceiveFilterInfoArray_SIZE)
+
+#define WmiQueryReceiveFilterParameters 1
+
+#define WmiQueryReceiveFilterParameters_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryReceiveFilterParameters_IN_Header_ID 1
+#define WmiQueryReceiveFilterParameters_IN_ReceiveFilterParameters_SIZE sizeof(MSNdis_ReceiveFilterParameters)
+#define WmiQueryReceiveFilterParameters_IN_ReceiveFilterParameters_ID 2
+
+#define WmiQueryReceiveFilterParameters_IN_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterParameters_IN, ReceiveFilterParameters) + WmiQueryReceiveFilterParameters_IN_ReceiveFilterParameters_SIZE)
+
+#define WmiQueryReceiveFilterParameters_OUT_ReceiveFilterParameters_SIZE sizeof(MSNdis_ReceiveFilterParameters)
+#define WmiQueryReceiveFilterParameters_OUT_ReceiveFilterParameters_ID 2
+
+#define WmiQueryReceiveFilterParameters_OUT_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterParameters_OUT, ReceiveFilterParameters) + WmiQueryReceiveFilterParameters_OUT_ReceiveFilterParameters_SIZE)
+
+#define WmiQueryReceiveFilterCurrentCapabilities 1
+
+#define WmiQueryReceiveFilterCurrentCapabilities_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryReceiveFilterCurrentCapabilities_IN_Header_ID 1
+
+#define WmiQueryReceiveFilterCurrentCapabilities_IN_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterCurrentCapabilities_IN, Header) + WmiQueryReceiveFilterCurrentCapabilities_IN_Header_SIZE)
+
+#define WmiQueryReceiveFilterCurrentCapabilities_OUT_ReceiveFilterCurrentCapabilities_SIZE sizeof(MSNdis_ReceiveFilterCapabilities)
+#define WmiQueryReceiveFilterCurrentCapabilities_OUT_ReceiveFilterCurrentCapabilities_ID 2
+
+#define WmiQueryReceiveFilterCurrentCapabilities_OUT_SIZE (FIELD_OFFSET(WmiQueryReceiveFilterCurrentCapabilities_OUT, ReceiveFilterCurrentCapabilities) + WmiQueryReceiveFilterCurrentCapabilities_OUT_ReceiveFilterCurrentCapabilities_SIZE)
+
+#define WmiQueryNICSwitchHardwareCapabilities 1
+
+#define WmiQueryNICSwitchHardwareCapabilities_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryNICSwitchHardwareCapabilities_IN_Header_ID 1
+
+#define WmiQueryNICSwitchHardwareCapabilities_IN_SIZE (FIELD_OFFSET(WmiQueryNICSwitchHardwareCapabilities_IN, Header) + WmiQueryNICSwitchHardwareCapabilities_IN_Header_SIZE)
+
+#define WmiQueryNICSwitchHardwareCapabilities_OUT_NicSwitchHardwareCapabilities_SIZE sizeof(MSNdis_NicSwitchCapabilities)
+#define WmiQueryNICSwitchHardwareCapabilities_OUT_NicSwitchHardwareCapabilities_ID 2
+
+#define WmiQueryNICSwitchHardwareCapabilities_OUT_SIZE (FIELD_OFFSET(WmiQueryNICSwitchHardwareCapabilities_OUT, NicSwitchHardwareCapabilities) + WmiQueryNICSwitchHardwareCapabilities_OUT_NicSwitchHardwareCapabilities_SIZE)
+
+#define WmiQueryNICSwitchCurrentCapabilities 1
+
+#define WmiQueryNICSwitchCurrentCapabilities_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryNICSwitchCurrentCapabilities_IN_Header_ID 1
+
+#define WmiQueryNICSwitchCurrentCapabilities_IN_SIZE (FIELD_OFFSET(WmiQueryNICSwitchCurrentCapabilities_IN, Header) + WmiQueryNICSwitchCurrentCapabilities_IN_Header_SIZE)
+
+#define WmiQueryNICSwitchCurrentCapabilities_OUT_NicSwitchCurrentCapabilities_SIZE sizeof(MSNdis_NicSwitchCapabilities)
+#define WmiQueryNICSwitchCurrentCapabilities_OUT_NicSwitchCurrentCapabilities_ID 2
+
+#define WmiQueryNICSwitchCurrentCapabilities_OUT_SIZE (FIELD_OFFSET(WmiQueryNICSwitchCurrentCapabilities_OUT, NicSwitchCurrentCapabilities) + WmiQueryNICSwitchCurrentCapabilities_OUT_NicSwitchCurrentCapabilities_SIZE)
+
+#define WmiQueryReceiveQueueParameters 1
+
+#define WmiQueryReceiveQueueParameters_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiQueryReceiveQueueParameters_IN_Header_ID 1
+#define WmiQueryReceiveQueueParameters_IN_ReceiveQueueParameters_SIZE sizeof(MSNdis_ReceiveQueueParameters)
+#define WmiQueryReceiveQueueParameters_IN_ReceiveQueueParameters_ID 2
+
+#define WmiQueryReceiveQueueParameters_IN_SIZE (FIELD_OFFSET(WmiQueryReceiveQueueParameters_IN, ReceiveQueueParameters) + WmiQueryReceiveQueueParameters_IN_ReceiveQueueParameters_SIZE)
+
+#define WmiQueryReceiveQueueParameters_OUT_ReceiveQueueParameters_SIZE sizeof(MSNdis_ReceiveQueueParameters)
+#define WmiQueryReceiveQueueParameters_OUT_ReceiveQueueParameters_ID 2
+
+#define WmiQueryReceiveQueueParameters_OUT_SIZE (FIELD_OFFSET(WmiQueryReceiveQueueParameters_OUT, ReceiveQueueParameters) + WmiQueryReceiveQueueParameters_OUT_ReceiveQueueParameters_SIZE)
+
+#define WmiEnumReceiveQueues 1
+
+#define WmiEnumReceiveQueues_IN_Header_SIZE sizeof(MSNdis_WmiMethodHeader)
+#define WmiEnumReceiveQueues_IN_Header_ID 1
+#define WmiEnumReceiveQueues_IN_ReceiveQueueInfoArray_SIZE sizeof(MSNdis_ReceiveQueueInfoArray)
+#define WmiEnumReceiveQueues_IN_ReceiveQueueInfoArray_ID 2
+
+#define WmiEnumReceiveQueues_IN_SIZE (FIELD_OFFSET(WmiEnumReceiveQueues_IN, ReceiveQueueInfoArray) + WmiEnumReceiveQueues_IN_ReceiveQueueInfoArray_SIZE)
+
+#define WmiEnumReceiveQueues_OUT_ReceiveQueueInfoArray_SIZE sizeof(MSNdis_ReceiveQueueInfoArray)
+#define WmiEnumReceiveQueues_OUT_ReceiveQueueInfoArray_ID 2
+
+#define WmiEnumReceiveQueues_OUT_SIZE (FIELD_OFFSET(WmiEnumReceiveQueues_OUT, ReceiveQueueInfoArray) + WmiEnumReceiveQueues_OUT_ReceiveQueueInfoArray_SIZE)
+
+#define MSNdis_80211_BaseServiceSetIdentifier_Ndis80211MacAddress_SIZE sizeof(UCHAR[6])
+#define MSNdis_80211_BaseServiceSetIdentifier_Ndis80211MacAddress_ID 1
+
+#define MSNdis_80211_BaseServiceSetIdentifier_SIZE (FIELD_OFFSET(MSNdis_80211_BaseServiceSetIdentifier, Ndis80211MacAddress) + MSNdis_80211_BaseServiceSetIdentifier_Ndis80211MacAddress_SIZE)
+
+#define MSNdis_80211_ServiceSetIdentifier_Ndis80211SsId_SIZE sizeof(UCHAR[33])
+#define MSNdis_80211_ServiceSetIdentifier_Ndis80211SsId_ID 1
+
+#define MSNdis_80211_ServiceSetIdentifier_SIZE (FIELD_OFFSET(MSNdis_80211_ServiceSetIdentifier, Ndis80211SsId) + MSNdis_80211_ServiceSetIdentifier_Ndis80211SsId_SIZE)
+
+#define MSNdis_80211_NetworkType_Ndis80211NetworkType_SIZE sizeof(ULONG)
+#define MSNdis_80211_NetworkType_Ndis80211NetworkType_ID 1
+
+#define MSNdis_80211_NetworkType_SIZE (FIELD_OFFSET(MSNdis_80211_NetworkType, Ndis80211NetworkType) + MSNdis_80211_NetworkType_Ndis80211NetworkType_SIZE)
+
+#define MSNdis_80211_NetworkTypesSupported_NumberOfItems_SIZE sizeof(ULONG)
+#define MSNdis_80211_NetworkTypesSupported_NumberOfItems_ID 1
+#define MSNdis_80211_NetworkTypesSupported_Ndis80211NetworkTypes_ID 2
+
+#define MSNdis_80211_NetworkTypeInUse_Ndis80211NetworkTypeInUse_SIZE sizeof(MSNdis_80211_NetworkType)
+#define MSNdis_80211_NetworkTypeInUse_Ndis80211NetworkTypeInUse_ID 1
+
+#define MSNdis_80211_NetworkTypeInUse_SIZE (FIELD_OFFSET(MSNdis_80211_NetworkTypeInUse, Ndis80211NetworkTypeInUse) + MSNdis_80211_NetworkTypeInUse_Ndis80211NetworkTypeInUse_SIZE)
+
+#define MSNdis_80211_PowerMode_Ndis80211PowerMode_SIZE sizeof(ULONG)
+#define MSNdis_80211_PowerMode_Ndis80211PowerMode_ID 1
+
+#define MSNdis_80211_PowerMode_SIZE (FIELD_OFFSET(MSNdis_80211_PowerMode, Ndis80211PowerMode) + MSNdis_80211_PowerMode_Ndis80211PowerMode_SIZE)
+
+#define MSNdis_80211_TransmitPowerLevel_Ndis80211TransmitPowerLevel_SIZE sizeof(ULONG)
+#define MSNdis_80211_TransmitPowerLevel_Ndis80211TransmitPowerLevel_ID 1
+
+#define MSNdis_80211_TransmitPowerLevel_SIZE (FIELD_OFFSET(MSNdis_80211_TransmitPowerLevel, Ndis80211TransmitPowerLevel) + MSNdis_80211_TransmitPowerLevel_Ndis80211TransmitPowerLevel_SIZE)
+
+#define MSNdis_80211_ReceivedSignalStrength_Ndis80211ReceivedSignalStrength_SIZE sizeof(LONG)
+#define MSNdis_80211_ReceivedSignalStrength_Ndis80211ReceivedSignalStrength_ID 1
+
+#define MSNdis_80211_ReceivedSignalStrength_SIZE (FIELD_OFFSET(MSNdis_80211_ReceivedSignalStrength, Ndis80211ReceivedSignalStrength) + MSNdis_80211_ReceivedSignalStrength_Ndis80211ReceivedSignalStrength_SIZE)
+
+#define MSNdis_80211_ReceivedSignalStrengthEventTrigger_Ndis80211ReceivedSignalStrengthTrigger_SIZE sizeof(LONG)
+#define MSNdis_80211_ReceivedSignalStrengthEventTrigger_Ndis80211ReceivedSignalStrengthTrigger_ID 1
+
+#define MSNdis_80211_ReceivedSignalStrengthEventTrigger_SIZE (FIELD_OFFSET(MSNdis_80211_ReceivedSignalStrengthEventTrigger, Ndis80211ReceivedSignalStrengthTrigger) + MSNdis_80211_ReceivedSignalStrengthEventTrigger_Ndis80211ReceivedSignalStrengthTrigger_SIZE)
+
+#define MSNdis_80211_NetworkInfrastructure_Ndis80211NetworkInfrastructure_SIZE sizeof(ULONG)
+#define MSNdis_80211_NetworkInfrastructure_Ndis80211NetworkInfrastructure_ID 1
+
+#define MSNdis_80211_NetworkInfrastructure_SIZE (FIELD_OFFSET(MSNdis_80211_NetworkInfrastructure, Ndis80211NetworkInfrastructure) + MSNdis_80211_NetworkInfrastructure_Ndis80211NetworkInfrastructure_SIZE)
+
+#define MSNdis_80211_ConfigurationFH_FHLength_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationFH_FHLength_ID 1
+#define MSNdis_80211_ConfigurationFH_HopPattern_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationFH_HopPattern_ID 2
+#define MSNdis_80211_ConfigurationFH_HopSet_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationFH_HopSet_ID 3
+#define MSNdis_80211_ConfigurationFH_DwellTime_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationFH_DwellTime_ID 4
+
+#define MSNdis_80211_ConfigurationFH_SIZE (FIELD_OFFSET(MSNdis_80211_ConfigurationFH, DwellTime) + MSNdis_80211_ConfigurationFH_DwellTime_SIZE)
+
+#define MSNdis_80211_ConfigurationInfo_ConfigLength_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationInfo_ConfigLength_ID 1
+#define MSNdis_80211_ConfigurationInfo_BeaconPeriod_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationInfo_BeaconPeriod_ID 2
+#define MSNdis_80211_ConfigurationInfo_ATIMWindow_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationInfo_ATIMWindow_ID 3
+#define MSNdis_80211_ConfigurationInfo_DSConfig_SIZE sizeof(ULONG)
+#define MSNdis_80211_ConfigurationInfo_DSConfig_ID 4
+#define MSNdis_80211_ConfigurationInfo_FHConfig_SIZE sizeof(MSNdis_80211_ConfigurationFH)
+#define MSNdis_80211_ConfigurationInfo_FHConfig_ID 5
+
+#define MSNdis_80211_ConfigurationInfo_SIZE (FIELD_OFFSET(MSNdis_80211_ConfigurationInfo, FHConfig) + MSNdis_80211_ConfigurationInfo_FHConfig_SIZE)
+
+#define MSNdis_80211_WLanBssId_Ndis80211WLanBssIdLength_SIZE sizeof(ULONG)
+#define MSNdis_80211_WLanBssId_Ndis80211WLanBssIdLength_ID 1
+#define MSNdis_80211_WLanBssId_Ndis80211MacAddress_SIZE sizeof(UCHAR[6])
+#define MSNdis_80211_WLanBssId_Ndis80211MacAddress_ID 2
+#define MSNdis_80211_WLanBssId_Reserved_SIZE sizeof(USHORT)
+#define MSNdis_80211_WLanBssId_Reserved_ID 3
+#define MSNdis_80211_WLanBssId_Ndis80211SsIdLength_SIZE sizeof(ULONG)
+#define MSNdis_80211_WLanBssId_Ndis80211SsIdLength_ID 4
+#define MSNdis_80211_WLanBssId_Ndis80211SsId_SIZE sizeof(UCHAR[32])
+#define MSNdis_80211_WLanBssId_Ndis80211SsId_ID 5
+#define MSNdis_80211_WLanBssId_Ndis80211Privacy_SIZE sizeof(ULONG)
+#define MSNdis_80211_WLanBssId_Ndis80211Privacy_ID 6
+#define MSNdis_80211_WLanBssId_Ndis80211Rssi_SIZE sizeof(ULONG)
+#define MSNdis_80211_WLanBssId_Ndis80211Rssi_ID 7
+#define MSNdis_80211_WLanBssId_Ndis80211NetworkTypeInUse_SIZE sizeof(MSNdis_80211_NetworkType)
+#define MSNdis_80211_WLanBssId_Ndis80211NetworkTypeInUse_ID 8
+#define MSNdis_80211_WLanBssId_Ndis80211Configuration_SIZE sizeof(MSNdis_80211_ConfigurationInfo)
+#define MSNdis_80211_WLanBssId_Ndis80211Configuration_ID 9
+#define MSNdis_80211_WLanBssId_Ndis80211InfrastructureMode_SIZE sizeof(MSNdis_80211_NetworkInfrastructure)
+#define MSNdis_80211_WLanBssId_Ndis80211InfrastructureMode_ID 10
+#define MSNdis_80211_WLanBssId_Ndis80211SupportedRate_SIZE sizeof(UCHAR[8])
+#define MSNdis_80211_WLanBssId_Ndis80211SupportedRate_ID 11
+
+#define MSNdis_80211_WLanBssId_SIZE (FIELD_OFFSET(MSNdis_80211_WLanBssId, Ndis80211SupportedRate) + MSNdis_80211_WLanBssId_Ndis80211SupportedRate_SIZE)
+
+#define MSNdis_80211_BSSIList_NumberOfItems_SIZE sizeof(ULONG)
+#define MSNdis_80211_BSSIList_NumberOfItems_ID 1
+#define MSNdis_80211_BSSIList_Ndis80211BSSIList_ID 2
+
+#define MSNdis_80211_InfrastructureMode_Ndis80211InfrastructureMode_SIZE sizeof(MSNdis_80211_NetworkInfrastructure)
+#define MSNdis_80211_InfrastructureMode_Ndis80211InfrastructureMode_ID 1
+
+#define MSNdis_80211_InfrastructureMode_SIZE (FIELD_OFFSET(MSNdis_80211_InfrastructureMode, Ndis80211InfrastructureMode) + MSNdis_80211_InfrastructureMode_Ndis80211InfrastructureMode_SIZE)
+
+#define MSNdis_80211_FragmentationThreshold_Ndis80211FragmentationThreshold_SIZE sizeof(ULONG)
+#define MSNdis_80211_FragmentationThreshold_Ndis80211FragmentationThreshold_ID 1
+
+#define MSNdis_80211_FragmentationThreshold_SIZE (FIELD_OFFSET(MSNdis_80211_FragmentationThreshold, Ndis80211FragmentationThreshold) + MSNdis_80211_FragmentationThreshold_Ndis80211FragmentationThreshold_SIZE)
+
+#define MSNdis_80211_RTSThreshold_Ndis80211RTSThreshold_SIZE sizeof(ULONG)
+#define MSNdis_80211_RTSThreshold_Ndis80211RTSThreshold_ID 1
+
+#define MSNdis_80211_RTSThreshold_SIZE (FIELD_OFFSET(MSNdis_80211_RTSThreshold, Ndis80211RTSThreshold) + MSNdis_80211_RTSThreshold_Ndis80211RTSThreshold_SIZE)
+
+#define MSNdis_80211_NumberOfAntennas_Ndis80211NumberOfAntennas_SIZE sizeof(ULONG)
+#define MSNdis_80211_NumberOfAntennas_Ndis80211NumberOfAntennas_ID 1
+
+#define MSNdis_80211_NumberOfAntennas_SIZE (FIELD_OFFSET(MSNdis_80211_NumberOfAntennas, Ndis80211NumberOfAntennas) + MSNdis_80211_NumberOfAntennas_Ndis80211NumberOfAntennas_SIZE)
+
+#define MSNdis_80211_ReceiveAntennaSelected_Ndis80211ReceiveAntennaSelected_SIZE sizeof(ULONG)
+#define MSNdis_80211_ReceiveAntennaSelected_Ndis80211ReceiveAntennaSelected_ID 1
+
+#define MSNdis_80211_ReceiveAntennaSelected_SIZE (FIELD_OFFSET(MSNdis_80211_ReceiveAntennaSelected, Ndis80211ReceiveAntennaSelected) + MSNdis_80211_ReceiveAntennaSelected_Ndis80211ReceiveAntennaSelected_SIZE)
+
+#define MSNdis_80211_TransmitAntennaSelected_Ndis80211TransmitAntennaSelected_SIZE sizeof(ULONG)
+#define MSNdis_80211_TransmitAntennaSelected_Ndis80211TransmitAntennaSelected_ID 1
+
+#define MSNdis_80211_TransmitAntennaSelected_SIZE (FIELD_OFFSET(MSNdis_80211_TransmitAntennaSelected, Ndis80211TransmitAntennaSelected) + MSNdis_80211_TransmitAntennaSelected_Ndis80211TransmitAntennaSelected_SIZE)
+
+#define MSNdis_80211_DataRates_Ndis80211DataRate_SIZE sizeof(UCHAR[8])
+#define MSNdis_80211_DataRates_Ndis80211DataRate_ID 1
+
+#define MSNdis_80211_DataRates_SIZE (FIELD_OFFSET(MSNdis_80211_DataRates, Ndis80211DataRate) + MSNdis_80211_DataRates_Ndis80211DataRate_SIZE)
+
+#define MSNdis_80211_DesiredDataRates_Ndis80211DesiredRate_SIZE sizeof(UCHAR[8])
+#define MSNdis_80211_DesiredDataRates_Ndis80211DesiredRate_ID 1
+
+#define MSNdis_80211_DesiredDataRates_SIZE (FIELD_OFFSET(MSNdis_80211_DesiredDataRates, Ndis80211DesiredRate) + MSNdis_80211_DesiredDataRates_Ndis80211DesiredRate_SIZE)
+
+#define MSNdis_80211_Configuration_Ndis80211Config_SIZE sizeof(MSNdis_80211_ConfigurationInfo)
+#define MSNdis_80211_Configuration_Ndis80211Config_ID 1
+
+#define MSNdis_80211_Configuration_SIZE (FIELD_OFFSET(MSNdis_80211_Configuration, Ndis80211Config) + MSNdis_80211_Configuration_Ndis80211Config_SIZE)
+
+#define MSNdis_80211_Statistics_StatisticsLength_SIZE sizeof(ULONG)
+#define MSNdis_80211_Statistics_StatisticsLength_ID 1
+#define MSNdis_80211_Statistics_TransmittedFragmentCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_TransmittedFragmentCount_ID 2
+#define MSNdis_80211_Statistics_MulticastTransmittedFrameCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_MulticastTransmittedFrameCount_ID 3
+#define MSNdis_80211_Statistics_FailedCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_FailedCount_ID 4
+#define MSNdis_80211_Statistics_RetryCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_RetryCount_ID 5
+#define MSNdis_80211_Statistics_MultipleRetryCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_MultipleRetryCount_ID 6
+#define MSNdis_80211_Statistics_RTSSuccessCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_RTSSuccessCount_ID 7
+#define MSNdis_80211_Statistics_RTSFailureCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_RTSFailureCount_ID 8
+#define MSNdis_80211_Statistics_ACKFailureCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_ACKFailureCount_ID 9
+#define MSNdis_80211_Statistics_FrameDuplicateCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_FrameDuplicateCount_ID 10
+#define MSNdis_80211_Statistics_ReceivedFragmentCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_ReceivedFragmentCount_ID 11
+#define MSNdis_80211_Statistics_MulticastReceivedFrameCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_MulticastReceivedFrameCount_ID 12
+#define MSNdis_80211_Statistics_FCSErrorCount_SIZE sizeof(ULONGLONG)
+#define MSNdis_80211_Statistics_FCSErrorCount_ID 13
+
+#define MSNdis_80211_Statistics_SIZE (FIELD_OFFSET(MSNdis_80211_Statistics, FCSErrorCount) + MSNdis_80211_Statistics_FCSErrorCount_SIZE)
+
+#define MSNdis_80211_AddWEP_Length_SIZE sizeof(ULONG)
+#define MSNdis_80211_AddWEP_Length_ID 1
+#define MSNdis_80211_AddWEP_KeyIndex_SIZE sizeof(ULONG)
+#define MSNdis_80211_AddWEP_KeyIndex_ID 2
+#define MSNdis_80211_AddWEP_KeyLength_SIZE sizeof(ULONG)
+#define MSNdis_80211_AddWEP_KeyLength_ID 3
+#define MSNdis_80211_AddWEP_KeyMaterial_ID 4
+
+#define MSNdis_80211_RemoveWEP_Ndis80211KeyIndex_SIZE sizeof(ULONG)
+#define MSNdis_80211_RemoveWEP_Ndis80211KeyIndex_ID 1
+
+#define MSNdis_80211_RemoveWEP_SIZE (FIELD_OFFSET(MSNdis_80211_RemoveWEP, Ndis80211KeyIndex) + MSNdis_80211_RemoveWEP_Ndis80211KeyIndex_SIZE)
+
+#define MSNdis_80211_Disassociate_UnusedParameter_SIZE sizeof(ULONG)
+#define MSNdis_80211_Disassociate_UnusedParameter_ID 1
+
+#define MSNdis_80211_Disassociate_SIZE (FIELD_OFFSET(MSNdis_80211_Disassociate, UnusedParameter) + MSNdis_80211_Disassociate_UnusedParameter_SIZE)
+
+#define MSNdis_80211_BssIdListScan_UnusedParameter_SIZE sizeof(ULONG)
+#define MSNdis_80211_BssIdListScan_UnusedParameter_ID 1
+
+#define MSNdis_80211_BssIdListScan_SIZE (FIELD_OFFSET(MSNdis_80211_BssIdListScan, UnusedParameter) + MSNdis_80211_BssIdListScan_UnusedParameter_SIZE)
+
+#define MSNdis_80211_AuthenticationMode_Ndis80211AuthenticationMode_SIZE sizeof(ULONG)
+#define MSNdis_80211_AuthenticationMode_Ndis80211AuthenticationMode_ID 1
+
+#define MSNdis_80211_AuthenticationMode_SIZE (FIELD_OFFSET(MSNdis_80211_AuthenticationMode, Ndis80211AuthenticationMode) + MSNdis_80211_AuthenticationMode_Ndis80211AuthenticationMode_SIZE)
+
+#define MSNdis_80211_PrivacyFilter_Ndis80211PrivacyFilter_SIZE sizeof(ULONG)
+#define MSNdis_80211_PrivacyFilter_Ndis80211PrivacyFilter_ID 1
+
+#define MSNdis_80211_PrivacyFilter_SIZE (FIELD_OFFSET(MSNdis_80211_PrivacyFilter, Ndis80211PrivacyFilter) + MSNdis_80211_PrivacyFilter_Ndis80211PrivacyFilter_SIZE)
+
+#define MSNdis_80211_WEPStatus_Ndis80211WEPStatus_SIZE sizeof(ULONG)
+#define MSNdis_80211_WEPStatus_Ndis80211WEPStatus_ID 1
+
+#define MSNdis_80211_WEPStatus_SIZE (FIELD_OFFSET(MSNdis_80211_WEPStatus, Ndis80211WEPStatus) + MSNdis_80211_WEPStatus_Ndis80211WEPStatus_SIZE)
+
+#define MSNdis_80211_ReloadDefaults_Ndis80211ReloadDefaults_SIZE sizeof(ULONG)
+#define MSNdis_80211_ReloadDefaults_Ndis80211ReloadDefaults_ID 1
+
+#define MSNdis_80211_ReloadDefaults_SIZE (FIELD_OFFSET(MSNdis_80211_ReloadDefaults, Ndis80211ReloadDefaults) + MSNdis_80211_ReloadDefaults_Ndis80211ReloadDefaults_SIZE)
+
+#define MSNdis_PMAdminConfigState_NdisPMAdminConfigState_SIZE sizeof(ULONG)
+#define MSNdis_PMAdminConfigState_NdisPMAdminConfigState_ID 1
+
+#define MSNdis_PMAdminConfigState_SIZE (FIELD_OFFSET(MSNdis_PMAdminConfigState, NdisPMAdminConfigState) + MSNdis_PMAdminConfigState_NdisPMAdminConfigState_SIZE)
+
+#define MSNdis_PMAdminConfigParam_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PMAdminConfigParam_Header_ID 1
+#define MSNdis_PMAdminConfigParam_WakeOnPattern_SIZE sizeof(MSNdis_PMAdminConfigState)
+#define MSNdis_PMAdminConfigParam_WakeOnPattern_ID 2
+#define MSNdis_PMAdminConfigParam_WakeOnMagicPacket_SIZE sizeof(MSNdis_PMAdminConfigState)
+#define MSNdis_PMAdminConfigParam_WakeOnMagicPacket_ID 3
+#define MSNdis_PMAdminConfigParam_DeviceSleepOnDisconnect_SIZE sizeof(MSNdis_PMAdminConfigState)
+#define MSNdis_PMAdminConfigParam_DeviceSleepOnDisconnect_ID 4
+#define MSNdis_PMAdminConfigParam_PMARPOffload_SIZE sizeof(MSNdis_PMAdminConfigState)
+#define MSNdis_PMAdminConfigParam_PMARPOffload_ID 5
+#define MSNdis_PMAdminConfigParam_PMNDOffload_SIZE sizeof(MSNdis_PMAdminConfigState)
+#define MSNdis_PMAdminConfigParam_PMNDOffload_ID 6
+#define MSNdis_PMAdminConfigParam_PMWiFiRekeyOffload_SIZE sizeof(MSNdis_PMAdminConfigState)
+#define MSNdis_PMAdminConfigParam_PMWiFiRekeyOffload_ID 7
+
+#define MSNdis_PMAdminConfigParam_SIZE (FIELD_OFFSET(MSNdis_PMAdminConfigParam, PMWiFiRekeyOffload) + MSNdis_PMAdminConfigParam_PMWiFiRekeyOffload_SIZE)
+
+#define MSNdis_PMAdminConfig_PMAdminConfigParam_SIZE sizeof(MSNdis_PMAdminConfigParam)
+#define MSNdis_PMAdminConfig_PMAdminConfigParam_ID 1
+
+#define MSNdis_PMAdminConfig_SIZE (FIELD_OFFSET(MSNdis_PMAdminConfig, PMAdminConfigParam) + MSNdis_PMAdminConfig_PMAdminConfigParam_SIZE)
+
+#define MSNdis_PMCapabilityState_NdisPMCapabilityState_SIZE sizeof(ULONG)
+#define MSNdis_PMCapabilityState_NdisPMCapabilityState_ID 1
+
+#define MSNdis_PMCapabilityState_SIZE (FIELD_OFFSET(MSNdis_PMCapabilityState, NdisPMCapabilityState) + MSNdis_PMCapabilityState_NdisPMCapabilityState_SIZE)
+
+#define MSNdis_PMCapabilitiesParam_Header_SIZE sizeof(MSNdis_ObjectHeader)
+#define MSNdis_PMCapabilitiesParam_Header_ID 1
+#define MSNdis_PMCapabilitiesParam_WakeOnPattern_SIZE sizeof(MSNdis_PMCapabilityState)
+#define MSNdis_PMCapabilitiesParam_WakeOnPattern_ID 2
+#define MSNdis_PMCapabilitiesParam_WakeOnMagicPacket_SIZE sizeof(MSNdis_PMCapabilityState)
+#define MSNdis_PMCapabilitiesParam_WakeOnMagicPacket_ID 3
+#define MSNdis_PMCapabilitiesParam_DeviceSleepOnDisconnect_SIZE sizeof(MSNdis_PMCapabilityState)
+#define MSNdis_PMCapabilitiesParam_DeviceSleepOnDisconnect_ID 4
+#define MSNdis_PMCapabilitiesParam_PMARPOffload_SIZE sizeof(MSNdis_PMCapabilityState)
+#define MSNdis_PMCapabilitiesParam_PMARPOffload_ID 5
+#define MSNdis_PMCapabilitiesParam_PMNDOffload_SIZE sizeof(MSNdis_PMCapabilityState)
+#define MSNdis_PMCapabilitiesParam_PMNDOffload_ID 6
+#define MSNdis_PMCapabilitiesParam_PMWiFiRekeyOffload_SIZE sizeof(MSNdis_PMCapabilityState)
+#define MSNdis_PMCapabilitiesParam_PMWiFiRekeyOffload_ID 7
+
+#define MSNdis_PMCapabilitiesParam_SIZE (FIELD_OFFSET(MSNdis_PMCapabilitiesParam, PMWiFiRekeyOffload) + MSNdis_PMCapabilitiesParam_PMWiFiRekeyOffload_SIZE)
+
+#define MSNdis_PMCapabilities_PMCapabilitiesParam_SIZE sizeof(MSNdis_PMCapabilitiesParam)
+#define MSNdis_PMCapabilities_PMCapabilitiesParam_ID 1
+
+#define MSNdis_PMCapabilities_SIZE (FIELD_OFFSET(MSNdis_PMCapabilities, PMCapabilitiesParam) + MSNdis_PMCapabilities_PMCapabilitiesParam_SIZE)
+
+#define MSNdis_StatusMediaSpecificIndication_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusMediaSpecificIndication_NumberElements_ID 1
+#define MSNdis_StatusMediaSpecificIndication_NdisStatusMediaSpecificIndication_ID 2
+
+#define MSNdis_StatusLinkSpeedChange_NdisStatusLinkSpeedChange_SIZE sizeof(MSNdis_NetworkLinkSpeed)
+#define MSNdis_StatusLinkSpeedChange_NdisStatusLinkSpeedChange_ID 1
+
+#define MSNdis_StatusLinkSpeedChange_SIZE (FIELD_OFFSET(MSNdis_StatusLinkSpeedChange, NdisStatusLinkSpeedChange) + MSNdis_StatusLinkSpeedChange_NdisStatusLinkSpeedChange_SIZE)
+
+#define MSNdis_StatusProtocolBind_Transport_ID 1
+#define MSNdis_StatusProtocolUnbind_Transport_ID 1
+#define MSNdis_StatusDevicePowerOn_Device_ID 1
+#define MSNdis_StatusDevicePowerOff_Device_ID 1
+#define MSNdis_StatusDevicePowerOnEx_Device_ID 1
+#define MSNdis_StatusDevicePowerOffEx_Device_ID 1
+
+#define MSNdis_StatusTaskOffloadChange_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusTaskOffloadChange_NumberElements_ID 1
+#define MSNdis_StatusTaskOffloadChange_TaskOffloadCapabilities_ID 2
+
+#define MSNdis_StatusPacketFilterChange_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusPacketFilterChange_NumberElements_ID 1
+#define MSNdis_StatusPacketFilterChange_NdisPacketFilterStatusIndication_ID 2
+
+#define MSNdis_StatusNetworkChange_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusNetworkChange_NumberElements_ID 1
+#define MSNdis_StatusNetworkChange_NdisNetworkChangeStatusIndication_ID 2
+
+#define MSNdis_StatusOperationalStatus_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusOperationalStatus_NumberElements_ID 1
+#define MSNdis_StatusOperationalStatus_NdisOperationalStatusStatusIndication_ID 2
+
+#define MSNdis_StatusLinkState_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusLinkState_NumberElements_ID 1
+#define MSNdis_StatusLinkState_NdisLinkStateStatusIndication_ID 2
+
+#define MSNdis_StatusPortState_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusPortState_NumberElements_ID 1
+#define MSNdis_StatusPortState_NdisPortStateStatusIndication_ID 2
+
+#define MSNdis_StatusMediaSpecificIndicationEx_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusMediaSpecificIndicationEx_NumberElements_ID 1
+#define MSNdis_StatusMediaSpecificIndicationEx_NdisStatusMediaSpecificIndication_ID 2
+
+#define MSNdis_StatusHDSplitCurrentConfig_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusHDSplitCurrentConfig_NumberElements_ID 1
+#define MSNdis_StatusHDSplitCurrentConfig_HDSplitCurrentConfig_ID 2
+
+#define MSNdis_StatusDot11ScanConfirm_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11ScanConfirm_NumberElements_ID 1
+#define MSNdis_StatusDot11ScanConfirm_NdisStatusDot11ScanConfirmIndication_ID 2
+
+#define MSNdis_StatusDot11MPDUMaxLengthChange_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11MPDUMaxLengthChange_NumberElements_ID 1
+#define MSNdis_StatusDot11MPDUMaxLengthChange_NdisStatusDot11MPDUMaxLengthChangeIndication_ID 2
+
+#define MSNdis_StatusDot11AssociationStart_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11AssociationStart_NumberElements_ID 1
+#define MSNdis_StatusDot11AssociationStart_NdisStatusDot11AssociationStartIndication_ID 2
+
+#define MSNdis_StatusDot11AssociationCompletion_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11AssociationCompletion_NumberElements_ID 1
+#define MSNdis_StatusDot11AssociationCompletion_NdisStatusDot11AssociationCompletionIndication_ID 2
+
+#define MSNdis_StatusDot11ConnectionStart_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11ConnectionStart_NumberElements_ID 1
+#define MSNdis_StatusDot11ConnectionStart_NdisStatusDot11ConnectionStartIndication_ID 2
+
+#define MSNdis_StatusDot11ConnectionCompletion_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11ConnectionCompletion_NumberElements_ID 1
+#define MSNdis_StatusDot11ConnectionCompletion_NdisStatusDot11ConnectionCompletionIndication_ID 2
+
+#define MSNdis_StatusDot11RoamingStart_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11RoamingStart_NumberElements_ID 1
+#define MSNdis_StatusDot11RoamingStart_NdisStatusDot11RoamingStartIndication_ID 2
+
+#define MSNdis_StatusDot11RoamingCompletion_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11RoamingCompletion_NumberElements_ID 1
+#define MSNdis_StatusDot11RoamingCompletion_NdisStatusDot11RoamingCompletionIndication_ID 2
+
+#define MSNdis_StatusDot11Disassociation_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11Disassociation_NumberElements_ID 1
+#define MSNdis_StatusDot11Disassociation_NdisStatusDot11DisassociationIndication_ID 2
+
+#define MSNdis_StatusDot11TkipmicFailure_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11TkipmicFailure_NumberElements_ID 1
+#define MSNdis_StatusDot11TkipmicFailure_NdisStatusDot11TkipmicFailureIndication_ID 2
+
+#define MSNdis_StatusDot11PmkidCandidateList_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11PmkidCandidateList_NumberElements_ID 1
+#define MSNdis_StatusDot11PmkidCandidateList_NdisStatusDot11PmkidCandidateListIndication_ID 2
+
+#define MSNdis_StatusDot11PhyStateChange_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11PhyStateChange_NumberElements_ID 1
+#define MSNdis_StatusDot11PhyStateChange_NdisStatusDot11PhyStateChangeIndication_ID 2
+
+#define MSNdis_StatusDot11LinkQuality_NumberElements_SIZE sizeof(ULONG)
+#define MSNdis_StatusDot11LinkQuality_NumberElements_ID 1
+#define MSNdis_StatusDot11LinkQuality_NdisStatusDot11LinkQualityIndication_ID 2
+
+#define KEYBOARD_PORT_WMI_STD_I8042 0
+#define KEYBOARD_PORT_WMI_STD_SERIAL 1
+#define KEYBOARD_PORT_WMI_STD_USB 2
+#define KEYBOARD_PORT_WMI_STD_DATA_ConnectorType_SIZE sizeof(ULONG)
+#define KEYBOARD_PORT_WMI_STD_DATA_ConnectorType_ID 1
+#define KEYBOARD_PORT_WMI_STD_DATA_DataQueueSize_SIZE sizeof(ULONG)
+#define KEYBOARD_PORT_WMI_STD_DATA_DataQueueSize_ID 2
+#define KEYBOARD_PORT_WMI_STD_DATA_ErrorCount_SIZE sizeof(ULONG)
+#define KEYBOARD_PORT_WMI_STD_DATA_ErrorCount_ID 3
+#define KEYBOARD_PORT_WMI_STD_DATA_FunctionKeys_SIZE sizeof(ULONG)
+#define KEYBOARD_PORT_WMI_STD_DATA_FunctionKeys_ID 4
+#define KEYBOARD_PORT_WMI_STD_DATA_Indicators_SIZE sizeof(ULONG)
+#define KEYBOARD_PORT_WMI_STD_DATA_Indicators_ID 5
+
+#define KEYBOARD_PORT_WMI_STD_DATA_SIZE (FIELD_OFFSET(KEYBOARD_PORT_WMI_STD_DATA, Indicators) + KEYBOARD_PORT_WMI_STD_DATA_Indicators_SIZE)
+
+#define KEYBOARD_ID_EX_Type_SIZE sizeof(ULONG)
+#define KEYBOARD_ID_EX_Type_ID 1
+#define KEYBOARD_ID_EX_Subtype_SIZE sizeof(ULONG)
+#define KEYBOARD_ID_EX_Subtype_ID 2
+
+#define KEYBOARD_ID_EX_SIZE (FIELD_OFFSET(KEYBOARD_ID_EX, Subtype) + KEYBOARD_ID_EX_Subtype_SIZE)
+
+#define POINTER_PORT_WMI_STD_I8042 0
+#define POINTER_PORT_WMI_STD_SERIAL 1
+#define POINTER_PORT_WMI_STD_USB 2
+#define POINTER_PORT_WMI_STD_DATA_ConnectorType_SIZE sizeof(ULONG)
+#define POINTER_PORT_WMI_STD_DATA_ConnectorType_ID 1
+#define POINTER_PORT_WMI_STD_DATA_DataQueueSize_SIZE sizeof(ULONG)
+#define POINTER_PORT_WMI_STD_DATA_DataQueueSize_ID 2
+#define POINTER_PORT_WMI_STD_DATA_ErrorCount_SIZE sizeof(ULONG)
+#define POINTER_PORT_WMI_STD_DATA_ErrorCount_ID 3
+#define POINTER_PORT_WMI_STD_DATA_Buttons_SIZE sizeof(ULONG)
+#define POINTER_PORT_WMI_STD_DATA_Buttons_ID 4
+#define POINTER_PORT_WMI_STD_MOUSE 0
+#define POINTER_PORT_WMI_STD_POINTER 1
+#define POINTER_PORT_WMI_ABSOLUTE_POINTER 2
+#define POINTER_PORT_WMI_TABLET 3
+#define POINTER_PORT_WMI_TOUCH_SCRENE 4
+#define POINTER_PORT_WMI_PEN 5
+#define POINTER_PORT_WMI_TRACK_BALL 6
+#define POINTER_PORT_WMI_OTHER 256
+#define POINTER_PORT_WMI_STD_DATA_HardwareType_SIZE sizeof(ULONG)
+#define POINTER_PORT_WMI_STD_DATA_HardwareType_ID 5
+
+#define POINTER_PORT_WMI_STD_DATA_SIZE (FIELD_OFFSET(POINTER_PORT_WMI_STD_DATA, HardwareType) + POINTER_PORT_WMI_STD_DATA_HardwareType_SIZE)
+
+#define MSMouse_ClassInformation_DeviceId_SIZE sizeof(ULONGLONG)
+#define MSMouse_ClassInformation_DeviceId_ID 1
+
+#define MSMouse_ClassInformation_SIZE (FIELD_OFFSET(MSMouse_ClassInformation, DeviceId) + MSMouse_ClassInformation_DeviceId_SIZE)
+
+#define MSKeyboard_ClassInformation_DeviceId_SIZE sizeof(ULONGLONG)
+#define MSKeyboard_ClassInformation_DeviceId_ID 1
+
+#define MSKeyboard_ClassInformation_SIZE (FIELD_OFFSET(MSKeyboard_ClassInformation, DeviceId) + MSKeyboard_ClassInformation_DeviceId_SIZE)
+
+#define AGP_STD_DATA_ApertureBase_SIZE sizeof(ULONGLONG)
+#define AGP_STD_DATA_ApertureBase_ID 1
+#define AGP_STD_DATA_ApertureLength_SIZE sizeof(ULONG)
+#define AGP_STD_DATA_ApertureLength_ID 2
+#define AGP_STD_DATA_AgpStatus_SIZE sizeof(ULONG)
+#define AGP_STD_DATA_AgpStatus_ID 3
+#define AGP_STD_DATA_AgpCommand_SIZE sizeof(ULONG)
+#define AGP_STD_DATA_AgpCommand_ID 4
+
+#define AGP_STD_DATA_SIZE (FIELD_OFFSET(AGP_STD_DATA, AgpCommand) + AGP_STD_DATA_AgpCommand_SIZE)
+
+#define MSAcpi_ThermalZoneTemperature_ThermalStamp_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_ThermalStamp_ID 1
+#define MSAcpi_ThermalZoneTemperature_ThermalConstant1_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_ThermalConstant1_ID 2
+#define MSAcpi_ThermalZoneTemperature_ThermalConstant2_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_ThermalConstant2_ID 3
+#define MSAcpi_ThermalZoneTemperature_Reserved_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_Reserved_ID 4
+#define MSAcpi_ThermalZoneTemperature_SamplingPeriod_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_SamplingPeriod_ID 5
+#define MSAcpi_ThermalZoneTemperature_CurrentTemperature_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_CurrentTemperature_ID 6
+#define MSAcpi_ThermalZoneTemperature_PassiveTripPoint_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_PassiveTripPoint_ID 7
+#define MSAcpi_ThermalZoneTemperature_CriticalTripPoint_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_CriticalTripPoint_ID 8
+#define MSAcpi_ThermalZoneTemperature_ActiveTripPointCount_SIZE sizeof(ULONG)
+#define MSAcpi_ThermalZoneTemperature_ActiveTripPointCount_ID 9
+#define MSAcpi_ThermalZoneTemperature_ActiveTripPoint_SIZE sizeof(ULONG[10])
+#define MSAcpi_ThermalZoneTemperature_ActiveTripPoint_ID 10
+
+#define MSAcpi_ThermalZoneTemperature_SIZE (FIELD_OFFSET(MSAcpi_ThermalZoneTemperature, ActiveTripPoint) + MSAcpi_ThermalZoneTemperature_ActiveTripPoint_SIZE)
+
+#define WMI_DISK_GEOMETRY_Cylinders_SIZE sizeof(LONGLONG)
+#define WMI_DISK_GEOMETRY_Cylinders_ID 1
+#define WMI_DISK_GEOMETRY_MediaType_SIZE sizeof(ULONG)
+#define WMI_DISK_GEOMETRY_MediaType_ID 2
+#define WMI_DISK_GEOMETRY_TracksPerCylinder_SIZE sizeof(ULONG)
+#define WMI_DISK_GEOMETRY_TracksPerCylinder_ID 3
+#define WMI_DISK_GEOMETRY_SectorsPerTrack_SIZE sizeof(ULONG)
+#define WMI_DISK_GEOMETRY_SectorsPerTrack_ID 4
+#define WMI_DISK_GEOMETRY_BytesPerSector_SIZE sizeof(ULONG)
+#define WMI_DISK_GEOMETRY_BytesPerSector_ID 5
+
+#define WMI_DISK_GEOMETRY_SIZE (FIELD_OFFSET(WMI_DISK_GEOMETRY, BytesPerSector) + WMI_DISK_GEOMETRY_BytesPerSector_SIZE)
+
+#define WMI_DISK_PERFORMANCE_BytesRead_SIZE sizeof(LONGLONG)
+#define WMI_DISK_PERFORMANCE_BytesRead_ID 1
+#define WMI_DISK_PERFORMANCE_BytesWritten_SIZE sizeof(LONGLONG)
+#define WMI_DISK_PERFORMANCE_BytesWritten_ID 2
+#define WMI_DISK_PERFORMANCE_ReadTime_SIZE sizeof(LONGLONG)
+#define WMI_DISK_PERFORMANCE_ReadTime_ID 3
+#define WMI_DISK_PERFORMANCE_WriteTime_SIZE sizeof(LONGLONG)
+#define WMI_DISK_PERFORMANCE_WriteTime_ID 4
+#define WMI_DISK_PERFORMANCE_IdleTime_SIZE sizeof(LONGLONG)
+#define WMI_DISK_PERFORMANCE_IdleTime_ID 5
+#define WMI_DISK_PERFORMANCE_ReadCount_SIZE sizeof(ULONG)
+#define WMI_DISK_PERFORMANCE_ReadCount_ID 6
+#define WMI_DISK_PERFORMANCE_WriteCount_SIZE sizeof(ULONG)
+#define WMI_DISK_PERFORMANCE_WriteCount_ID 7
+#define WMI_DISK_PERFORMANCE_QueueDepth_SIZE sizeof(ULONG)
+#define WMI_DISK_PERFORMANCE_QueueDepth_ID 8
+#define WMI_DISK_PERFORMANCE_SplitCount_SIZE sizeof(ULONG)
+#define WMI_DISK_PERFORMANCE_SplitCount_ID 9
+#define WMI_DISK_PERFORMANCE_QueryTime_SIZE sizeof(LONGLONG)
+#define WMI_DISK_PERFORMANCE_QueryTime_ID 10
+#define WMI_DISK_PERFORMANCE_StorageDeviceNumber_SIZE sizeof(ULONG)
+#define WMI_DISK_PERFORMANCE_StorageDeviceNumber_ID 11
+#define WMI_DISK_PERFORMANCE_StorageManagerName_SIZE sizeof(USHORT[8])
+#define WMI_DISK_PERFORMANCE_StorageManagerName_ID 12
+
+#define WMI_DISK_PERFORMANCE_SIZE (FIELD_OFFSET(WMI_DISK_PERFORMANCE, StorageManagerName) + WMI_DISK_PERFORMANCE_StorageManagerName_SIZE)
+
+#define MSDiskDriver_Performance_PerfData_SIZE sizeof(WMI_DISK_PERFORMANCE)
+#define MSDiskDriver_Performance_PerfData_ID 1
+#define MSDiskDriver_Performance_DeviceName_ID 2
+
+#define STORAGE_FAILURE_PREDICT_STATUS_Reason_SIZE sizeof(ULONG)
+#define STORAGE_FAILURE_PREDICT_STATUS_Reason_ID 1
+#define STORAGE_FAILURE_PREDICT_STATUS_PredictFailure_SIZE sizeof(BOOLEAN)
+#define STORAGE_FAILURE_PREDICT_STATUS_PredictFailure_ID 2
+
+#define STORAGE_FAILURE_PREDICT_STATUS_SIZE (FIELD_OFFSET(STORAGE_FAILURE_PREDICT_STATUS, PredictFailure) + STORAGE_FAILURE_PREDICT_STATUS_PredictFailure_SIZE)
+
+#define STORAGE_FAILURE_PREDICT_DATA_Length_SIZE sizeof(ULONG)
+#define STORAGE_FAILURE_PREDICT_DATA_Length_ID 1
+#define STORAGE_FAILURE_PREDICT_DATA_VendorSpecific_SIZE sizeof(UCHAR[512])
+#define STORAGE_FAILURE_PREDICT_DATA_VendorSpecific_ID 2
+
+#define STORAGE_FAILURE_PREDICT_DATA_SIZE (FIELD_OFFSET(STORAGE_FAILURE_PREDICT_DATA, VendorSpecific) + STORAGE_FAILURE_PREDICT_DATA_VendorSpecific_SIZE)
+
+#define ATAPI_FAILURE_PREDICT_DATA_Length_SIZE sizeof(ULONG)
+#define ATAPI_FAILURE_PREDICT_DATA_Length_ID 1
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific_SIZE sizeof(UCHAR[362])
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific_ID 2
+#define ATAPI_FAILURE_PREDICT_DATA_OfflineCollectionStatus_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_OfflineCollectionStatus_ID 3
+#define ATAPI_FAILURE_PREDICT_DATA_SelfTestStatus_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_SelfTestStatus_ID 4
+#define ATAPI_FAILURE_PREDICT_DATA_TotalTime_SIZE sizeof(USHORT)
+#define ATAPI_FAILURE_PREDICT_DATA_TotalTime_ID 5
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific2_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific2_ID 6
+#define ATAPI_FAILURE_PREDICT_DATA_OfflineCollectCapability_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_OfflineCollectCapability_ID 7
+#define ATAPI_FAILURE_PREDICT_DATA_SmartCapability_SIZE sizeof(USHORT)
+#define ATAPI_FAILURE_PREDICT_DATA_SmartCapability_ID 8
+#define ATAPI_FAILURE_PREDICT_DATA_ErrorLogCapability_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_ErrorLogCapability_ID 9
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific3_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific3_ID 10
+#define ATAPI_FAILURE_PREDICT_DATA_ShortPollTimeInMinutes_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_ShortPollTimeInMinutes_ID 11
+#define ATAPI_FAILURE_PREDICT_DATA_ExtendedPollTimeInMinutes_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_ExtendedPollTimeInMinutes_ID 12
+#define ATAPI_FAILURE_PREDICT_DATA_Reserved_SIZE sizeof(UCHAR[12])
+#define ATAPI_FAILURE_PREDICT_DATA_Reserved_ID 13
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific4_SIZE sizeof(UCHAR[125])
+#define ATAPI_FAILURE_PREDICT_DATA_VendorSpecific4_ID 14
+#define ATAPI_FAILURE_PREDICT_DATA_Checksum_SIZE sizeof(UCHAR)
+#define ATAPI_FAILURE_PREDICT_DATA_Checksum_ID 15
+
+#define ATAPI_FAILURE_PREDICT_DATA_SIZE (FIELD_OFFSET(ATAPI_FAILURE_PREDICT_DATA, Checksum) + ATAPI_FAILURE_PREDICT_DATA_Checksum_SIZE)
+
+#define STORAGE_FAILURE_PREDICT_THRESHOLDS_VendorSpecific_SIZE sizeof(UCHAR[512])
+#define STORAGE_FAILURE_PREDICT_THRESHOLDS_VendorSpecific_ID 1
+
+#define STORAGE_FAILURE_PREDICT_THRESHOLDS_SIZE (FIELD_OFFSET(STORAGE_FAILURE_PREDICT_THRESHOLDS, VendorSpecific) + STORAGE_FAILURE_PREDICT_THRESHOLDS_VendorSpecific_SIZE)
+
+#define STORAGE_FAILURE_PREDICT_EVENT_Length_SIZE sizeof(ULONG)
+#define STORAGE_FAILURE_PREDICT_EVENT_Length_ID 1
+#define STORAGE_FAILURE_PREDICT_EVENT_VendorSpecific_ID 2
+
+#define AllowPerformanceHit 1
+
+#define ALLOW_PERFORMANCE_HIT_IN_Allow_SIZE sizeof(BOOLEAN)
+#define ALLOW_PERFORMANCE_HIT_IN_Allow_ID 1
+
+#define ALLOW_PERFORMANCE_HIT_IN_SIZE (FIELD_OFFSET(ALLOW_PERFORMANCE_HIT_IN, Allow) + ALLOW_PERFORMANCE_HIT_IN_Allow_SIZE)
+
+#define EnableDisableHardwareFailurePrediction 2
+
+#define ENABLE_DISABLE_FP_IN_Enable_SIZE sizeof(BOOLEAN)
+#define ENABLE_DISABLE_FP_IN_Enable_ID 1
+
+#define ENABLE_DISABLE_FP_IN_SIZE (FIELD_OFFSET(ENABLE_DISABLE_FP_IN, Enable) + ENABLE_DISABLE_FP_IN_Enable_SIZE)
+
+#define EnableDisableFailurePredictionPolling 3
+
+#define ENABLE_DISABLE_FP_POLLING_IN_Period_SIZE sizeof(ULONG)
+#define ENABLE_DISABLE_FP_POLLING_IN_Period_ID 1
+#define ENABLE_DISABLE_FP_POLLING_IN_Enable_SIZE sizeof(BOOLEAN)
+#define ENABLE_DISABLE_FP_POLLING_IN_Enable_ID 2
+
+#define ENABLE_DISABLE_FP_POLLING_IN_SIZE (FIELD_OFFSET(ENABLE_DISABLE_FP_POLLING_IN, Enable) + ENABLE_DISABLE_FP_POLLING_IN_Enable_SIZE)
+
+#define GetFailurePredictionCapability 4
+
+#define GET_FP_CAPABILITY_OUT_Capability_SIZE sizeof(ULONG)
+#define GET_FP_CAPABILITY_OUT_Capability_ID 1
+
+#define GET_FP_CAPABILITY_OUT_SIZE (FIELD_OFFSET(GET_FP_CAPABILITY_OUT, Capability) + GET_FP_CAPABILITY_OUT_Capability_SIZE)
+
+#define EnableOfflineDiags 5
+
+#define ENABLE_OFFLINE_DIAGS_OUT_Success_SIZE sizeof(BOOLEAN)
+#define ENABLE_OFFLINE_DIAGS_OUT_Success_ID 1
+
+#define ENABLE_OFFLINE_DIAGS_OUT_SIZE (FIELD_OFFSET(ENABLE_OFFLINE_DIAGS_OUT, Success) + ENABLE_OFFLINE_DIAGS_OUT_Success_SIZE)
+
+#define ReadLogSectors 6
+
+#define READ_LOG_SECTORS_IN_LogAddress_SIZE sizeof(UCHAR)
+#define READ_LOG_SECTORS_IN_LogAddress_ID 1
+#define READ_LOG_SECTORS_IN_SectorCount_SIZE sizeof(UCHAR)
+#define READ_LOG_SECTORS_IN_SectorCount_ID 2
+
+#define READ_LOG_SECTORS_IN_SIZE (FIELD_OFFSET(READ_LOG_SECTORS_IN, SectorCount) + READ_LOG_SECTORS_IN_SectorCount_SIZE)
+
+#define READ_LOG_SECTORS_OUT_Length_SIZE sizeof(ULONG)
+#define READ_LOG_SECTORS_OUT_Length_ID 3
+#define READ_LOG_SECTORS_OUT_LogSectors_ID 4
+
+#define WriteLogSectors 7
+
+#define WRITE_LOG_SECTORS_IN_LogAddress_SIZE sizeof(UCHAR)
+#define WRITE_LOG_SECTORS_IN_LogAddress_ID 1
+#define WRITE_LOG_SECTORS_IN_SectorCount_SIZE sizeof(UCHAR)
+#define WRITE_LOG_SECTORS_IN_SectorCount_ID 2
+#define WRITE_LOG_SECTORS_IN_Length_SIZE sizeof(ULONG)
+#define WRITE_LOG_SECTORS_IN_Length_ID 3
+#define WRITE_LOG_SECTORS_IN_LogSectors_ID 4
+
+#define WRITE_LOG_SECTORS_OUT_Success_SIZE sizeof(BOOLEAN)
+#define WRITE_LOG_SECTORS_OUT_Success_ID 5
+
+#define WRITE_LOG_SECTORS_OUT_SIZE (FIELD_OFFSET(WRITE_LOG_SECTORS_OUT, Success) + WRITE_LOG_SECTORS_OUT_Success_SIZE)
+
+#define EXECUTE_SELF_TEST_IN_Subcommand_SIZE sizeof(UCHAR)
+#define EXECUTE_SELF_TEST_IN_Subcommand_ID 1
+
+#define EXECUTE_SELF_TEST_IN_SIZE (FIELD_OFFSET(EXECUTE_SELF_TEST_IN, Subcommand) + EXECUTE_SELF_TEST_IN_Subcommand_SIZE)
+
+#define ExecuteSelfTest 8
+
+#define EXECUTE_SELF_TEST_OUT_ReturnCode_SIZE sizeof(ULONG)
+#define EXECUTE_SELF_TEST_OUT_ReturnCode_ID 2
+
+#define EXECUTE_SELF_TEST_OUT_SIZE (FIELD_OFFSET(EXECUTE_SELF_TEST_OUT, ReturnCode) + EXECUTE_SELF_TEST_OUT_ReturnCode_SIZE)
+
+#define STORAGE_SCSI_INFO_EXCEPTIONS_PageSavable_SIZE sizeof(BOOLEAN)
+#define STORAGE_SCSI_INFO_EXCEPTIONS_PageSavable_ID 1
+#define STORAGE_SCSI_INFO_EXCEPTIONS_Flags_SIZE sizeof(UCHAR)
+#define STORAGE_SCSI_INFO_EXCEPTIONS_Flags_ID 2
+#define STORAGE_SCSI_INFO_EXCEPTIONS_MRIE_SIZE sizeof(UCHAR)
+#define STORAGE_SCSI_INFO_EXCEPTIONS_MRIE_ID 3
+#define STORAGE_SCSI_INFO_EXCEPTIONS_Padding_SIZE sizeof(UCHAR)
+#define STORAGE_SCSI_INFO_EXCEPTIONS_Padding_ID 4
+#define STORAGE_SCSI_INFO_EXCEPTIONS_IntervalTimer_SIZE sizeof(ULONG)
+#define STORAGE_SCSI_INFO_EXCEPTIONS_IntervalTimer_ID 5
+#define STORAGE_SCSI_INFO_EXCEPTIONS_ReportCount_SIZE sizeof(ULONG)
+#define STORAGE_SCSI_INFO_EXCEPTIONS_ReportCount_ID 6
+
+#define STORAGE_SCSI_INFO_EXCEPTIONS_SIZE (FIELD_OFFSET(STORAGE_SCSI_INFO_EXCEPTIONS, ReportCount) + STORAGE_SCSI_INFO_EXCEPTIONS_ReportCount_SIZE)
+
+#define MSIde_PortDeviceInfo_Bus_SIZE sizeof(UCHAR)
+#define MSIde_PortDeviceInfo_Bus_ID 1
+#define MSIde_PortDeviceInfo_Target_SIZE sizeof(UCHAR)
+#define MSIde_PortDeviceInfo_Target_ID 2
+#define MSIde_PortDeviceInfo_Lun_SIZE sizeof(UCHAR)
+#define MSIde_PortDeviceInfo_Lun_ID 3
+
+#define MSIde_PortDeviceInfo_SIZE (FIELD_OFFSET(MSIde_PortDeviceInfo, Lun) + MSIde_PortDeviceInfo_Lun_SIZE)
+
+#define MSSerial_PortName_PortName_ID 1
+
+#define SERIAL_WMI_COMM_DATA_BaudRate_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_BaudRate_ID 1
+#define SERIAL_WMI_COMM_DATA_BitsPerByte_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_BitsPerByte_ID 2
+#define SERIAL_WMI_PARITY_NONE 0
+#define SERIAL_WMI_PARITY_ODD 1
+#define SERIAL_WMI_PARITY_EVEN 2
+#define SERIAL_WMI_PARITY_SPACE 3
+#define SERIAL_WMI_PARITY_MARK 4
+#define SERIAL_WMI_COMM_DATA_Parity_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_Parity_ID 3
+#define SERIAL_WMI_COMM_DATA_ParityCheckEnable_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_ParityCheckEnable_ID 4
+#define SERIAL_WMI_STOP_1 0
+#define SERIAL_WMI_STOP_1_5 1
+#define SERIAL_WMI_STOP_2 2
+#define SERIAL_WMI_COMM_DATA_StopBits_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_StopBits_ID 5
+#define SERIAL_WMI_COMM_DATA_XoffCharacter_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_XoffCharacter_ID 6
+#define SERIAL_WMI_COMM_DATA_XoffXmitThreshold_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_XoffXmitThreshold_ID 7
+#define SERIAL_WMI_COMM_DATA_XonCharacter_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_XonCharacter_ID 8
+#define SERIAL_WMI_COMM_DATA_XonXmitThreshold_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_XonXmitThreshold_ID 9
+#define SERIAL_WMI_COMM_DATA_MaximumBaudRate_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_MaximumBaudRate_ID 10
+#define SERIAL_WMI_COMM_DATA_MaximumOutputBufferSize_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_MaximumOutputBufferSize_ID 11
+#define SERIAL_WMI_COMM_DATA_MaximumInputBufferSize_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMM_DATA_MaximumInputBufferSize_ID 12
+#define SERIAL_WMI_COMM_DATA_Support16BitMode_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_Support16BitMode_ID 13
+#define SERIAL_WMI_COMM_DATA_SupportDTRDSR_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SupportDTRDSR_ID 14
+#define SERIAL_WMI_COMM_DATA_SupportIntervalTimeouts_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SupportIntervalTimeouts_ID 15
+#define SERIAL_WMI_COMM_DATA_SupportParityCheck_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SupportParityCheck_ID 16
+#define SERIAL_WMI_COMM_DATA_SupportRTSCTS_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SupportRTSCTS_ID 17
+#define SERIAL_WMI_COMM_DATA_SupportXonXoff_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SupportXonXoff_ID 18
+#define SERIAL_WMI_COMM_DATA_SettableBaudRate_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SettableBaudRate_ID 19
+#define SERIAL_WMI_COMM_DATA_SettableDataBits_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SettableDataBits_ID 20
+#define SERIAL_WMI_COMM_DATA_SettableFlowControl_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SettableFlowControl_ID 21
+#define SERIAL_WMI_COMM_DATA_SettableParity_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SettableParity_ID 22
+#define SERIAL_WMI_COMM_DATA_SettableParityCheck_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SettableParityCheck_ID 23
+#define SERIAL_WMI_COMM_DATA_SettableStopBits_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_SettableStopBits_ID 24
+#define SERIAL_WMI_COMM_DATA_IsBusy_SIZE sizeof(BOOLEAN)
+#define SERIAL_WMI_COMM_DATA_IsBusy_ID 25
+
+#define SERIAL_WMI_COMM_DATA_SIZE (FIELD_OFFSET(SERIAL_WMI_COMM_DATA, IsBusy) + SERIAL_WMI_COMM_DATA_IsBusy_SIZE)
+
+#define SERIAL_WMI_HW_DATA_IrqNumber_SIZE sizeof(ULONG)
+#define SERIAL_WMI_HW_DATA_IrqNumber_ID 1
+#define SERIAL_WMI_HW_DATA_IrqVector_SIZE sizeof(ULONG)
+#define SERIAL_WMI_HW_DATA_IrqVector_ID 2
+#define SERIAL_WMI_HW_DATA_IrqLevel_SIZE sizeof(ULONG)
+#define SERIAL_WMI_HW_DATA_IrqLevel_ID 3
+#define SERIAL_WMI_HW_DATA_IrqAffinityMask_SIZE sizeof(ULONGLONG)
+#define SERIAL_WMI_HW_DATA_IrqAffinityMask_ID 4
+#define SERIAL_WMI_INTTYPE_LATCHED 0
+#define SERIAL_WMI_INTTYPE_LEVEL 1
+#define SERIAL_WMI_HW_DATA_InterruptType_SIZE sizeof(ULONG)
+#define SERIAL_WMI_HW_DATA_InterruptType_ID 5
+#define SERIAL_WMI_HW_DATA_BaseIOAddress_SIZE sizeof(ULONGLONG)
+#define SERIAL_WMI_HW_DATA_BaseIOAddress_ID 6
+
+#define SERIAL_WMI_HW_DATA_SIZE (FIELD_OFFSET(SERIAL_WMI_HW_DATA, BaseIOAddress) + SERIAL_WMI_HW_DATA_BaseIOAddress_SIZE)
+
+#define SERIAL_WMI_PERF_DATA_ReceivedCount_SIZE sizeof(ULONG)
+#define SERIAL_WMI_PERF_DATA_ReceivedCount_ID 1
+#define SERIAL_WMI_PERF_DATA_TransmittedCount_SIZE sizeof(ULONG)
+#define SERIAL_WMI_PERF_DATA_TransmittedCount_ID 2
+#define SERIAL_WMI_PERF_DATA_FrameErrorCount_SIZE sizeof(ULONG)
+#define SERIAL_WMI_PERF_DATA_FrameErrorCount_ID 3
+#define SERIAL_WMI_PERF_DATA_SerialOverrunErrorCount_SIZE sizeof(ULONG)
+#define SERIAL_WMI_PERF_DATA_SerialOverrunErrorCount_ID 4
+#define SERIAL_WMI_PERF_DATA_BufferOverrunErrorCount_SIZE sizeof(ULONG)
+#define SERIAL_WMI_PERF_DATA_BufferOverrunErrorCount_ID 5
+#define SERIAL_WMI_PERF_DATA_ParityErrorCount_SIZE sizeof(ULONG)
+#define SERIAL_WMI_PERF_DATA_ParityErrorCount_ID 6
+
+#define SERIAL_WMI_PERF_DATA_SIZE (FIELD_OFFSET(SERIAL_WMI_PERF_DATA, ParityErrorCount) + SERIAL_WMI_PERF_DATA_ParityErrorCount_SIZE)
+
+#define SERIAL_WMI_COMMPROP_wPacketLength_SIZE sizeof(USHORT)
+#define SERIAL_WMI_COMMPROP_wPacketLength_ID 1
+#define SERIAL_WMI_COMMPROP_wPacketVersion_SIZE sizeof(USHORT)
+#define SERIAL_WMI_COMMPROP_wPacketVersion_ID 2
+#define SERIAL_WMI_COMMPROP_dwServiceMask_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwServiceMask_ID 3
+#define SERIAL_WMI_COMMPROP_dwReserved1_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwReserved1_ID 4
+#define SERIAL_WMI_COMMPROP_dwMaxTxQueue_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwMaxTxQueue_ID 5
+#define SERIAL_WMI_COMMPROP_dwMaxRxQueue_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwMaxRxQueue_ID 6
+#define SERIAL_WMI_COMMPROP_dwMaxBaud_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwMaxBaud_ID 7
+#define SERIAL_WMI_COMMPROP_dwProvSubType_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwProvSubType_ID 8
+#define SERIAL_WMI_COMMPROP_dwProvCapabilities_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwProvCapabilities_ID 9
+#define SERIAL_WMI_COMMPROP_dwSettableParams_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwSettableParams_ID 10
+#define SERIAL_WMI_COMMPROP_dwSettableBaud_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwSettableBaud_ID 11
+#define SERIAL_WMI_COMMPROP_wSettableData_SIZE sizeof(USHORT)
+#define SERIAL_WMI_COMMPROP_wSettableData_ID 12
+#define SERIAL_WMI_COMMPROP_wSettableStopParity_SIZE sizeof(USHORT)
+#define SERIAL_WMI_COMMPROP_wSettableStopParity_ID 13
+#define SERIAL_WMI_COMMPROP_dwCurrentTxQueue_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwCurrentTxQueue_ID 14
+#define SERIAL_WMI_COMMPROP_dwCurrentRxQueue_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwCurrentRxQueue_ID 15
+#define SERIAL_WMI_COMMPROP_dwProvSpec1_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwProvSpec1_ID 16
+#define SERIAL_WMI_COMMPROP_dwProvSpec2_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwProvSpec2_ID 17
+#define SERIAL_WMI_COMMPROP_dwProvCharSize_SIZE sizeof(ULONG)
+#define SERIAL_WMI_COMMPROP_dwProvCharSize_ID 18
+#define SERIAL_WMI_COMMPROP_wcProvChar_ID 19
+
+#define PARPORT_WMI_ALLOC_FREE_COUNTS_PortAllocates_SIZE sizeof(ULONG)
+#define PARPORT_WMI_ALLOC_FREE_COUNTS_PortAllocates_ID 1
+#define PARPORT_WMI_ALLOC_FREE_COUNTS_PortFrees_SIZE sizeof(ULONG)
+#define PARPORT_WMI_ALLOC_FREE_COUNTS_PortFrees_ID 2
+
+#define PARPORT_WMI_ALLOC_FREE_COUNTS_SIZE (FIELD_OFFSET(PARPORT_WMI_ALLOC_FREE_COUNTS, PortFrees) + PARPORT_WMI_ALLOC_FREE_COUNTS_PortFrees_SIZE)
+
+#define PARALLEL_WMI_LOG_INFO_Flags1_SIZE sizeof(ULONG)
+#define PARALLEL_WMI_LOG_INFO_Flags1_ID 1
+#define PARALLEL_WMI_LOG_INFO_Flags2_SIZE sizeof(ULONG)
+#define PARALLEL_WMI_LOG_INFO_Flags2_ID 2
+#define PARALLEL_WMI_LOG_INFO_spare_SIZE sizeof(ULONG[2])
+#define PARALLEL_WMI_LOG_INFO_spare_ID 3
+#define PARALLEL_WMI_LOG_INFO_SppWriteCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_SppWriteCount_ID 4
+#define PARALLEL_WMI_LOG_INFO_NibbleReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_NibbleReadCount_ID 5
+#define PARALLEL_WMI_LOG_INFO_BoundedEcpWriteCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_BoundedEcpWriteCount_ID 6
+#define PARALLEL_WMI_LOG_INFO_BoundedEcpReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_BoundedEcpReadCount_ID 7
+#define PARALLEL_WMI_LOG_INFO_HwEcpWriteCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_HwEcpWriteCount_ID 8
+#define PARALLEL_WMI_LOG_INFO_HwEcpReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_HwEcpReadCount_ID 9
+#define PARALLEL_WMI_LOG_INFO_SwEcpWriteCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_SwEcpWriteCount_ID 10
+#define PARALLEL_WMI_LOG_INFO_SwEcpReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_SwEcpReadCount_ID 11
+#define PARALLEL_WMI_LOG_INFO_HwEppWriteCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_HwEppWriteCount_ID 12
+#define PARALLEL_WMI_LOG_INFO_HwEppReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_HwEppReadCount_ID 13
+#define PARALLEL_WMI_LOG_INFO_SwEppWriteCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_SwEppWriteCount_ID 14
+#define PARALLEL_WMI_LOG_INFO_SwEppReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_SwEppReadCount_ID 15
+#define PARALLEL_WMI_LOG_INFO_ByteReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_ByteReadCount_ID 16
+#define PARALLEL_WMI_LOG_INFO_ChannelNibbleReadCount_SIZE sizeof(LONGLONG)
+#define PARALLEL_WMI_LOG_INFO_ChannelNibbleReadCount_ID 17
+
+#define PARALLEL_WMI_LOG_INFO_SIZE (FIELD_OFFSET(PARALLEL_WMI_LOG_INFO, ChannelNibbleReadCount) + PARALLEL_WMI_LOG_INFO_ChannelNibbleReadCount_SIZE)
+
+#define REDBOOK_WMI_NUMBER_OF_BUFFERS_SIZE sizeof(ULONG)
+#define REDBOOK_WMI_NUMBER_OF_BUFFERS_ID 1
+#define REDBOOK_WMI_SECTORS_PER_READ_SIZE sizeof(ULONG)
+#define REDBOOK_WMI_SECTORS_PER_READ_ID 2
+#define REDBOOK_WMI_SECTORS_PER_READ_MASK_SIZE sizeof(ULONG)
+#define REDBOOK_WMI_SECTORS_PER_READ_MASK_ID 3
+#define REDBOOK_WMI_MAX_SECTORS_PER_READ_SIZE sizeof(ULONG)
+#define REDBOOK_WMI_MAX_SECTORS_PER_READ_ID 4
+#define REDBOOK_WMI_PLAY_ENABLED_SIZE sizeof(BOOLEAN)
+#define REDBOOK_WMI_PLAY_ENABLED_ID 5
+#define REDBOOK_WMI_CDDA_SUPPORTED_SIZE sizeof(BOOLEAN)
+#define REDBOOK_WMI_CDDA_SUPPORTED_ID 6
+#define REDBOOK_WMI_CDDA_ACCURATE_SIZE sizeof(BOOLEAN)
+#define REDBOOK_WMI_CDDA_ACCURATE_ID 7
+#define REDBOOK_WMI_STD_DATA_Reserved1_SIZE sizeof(BOOLEAN)
+#define REDBOOK_WMI_STD_DATA_Reserved1_ID 8
+
+#define REDBOOK_WMI_STD_DATA_SIZE (FIELD_OFFSET(REDBOOK_WMI_STD_DATA, Reserved1) + REDBOOK_WMI_STD_DATA_Reserved1_SIZE)
+
+#define REDBOOK_WMI_PERF_TIME_READING_DELAY_SIZE sizeof(LONGLONG)
+#define REDBOOK_WMI_PERF_TIME_READING_DELAY_ID 1
+#define REDBOOK_WMI_PERF_TIME_READING_SIZE sizeof(LONGLONG)
+#define REDBOOK_WMI_PERF_TIME_READING_ID 2
+#define REDBOOK_WMI_PERF_TIME_STREAMING_DELAY_SIZE sizeof(LONGLONG)
+#define REDBOOK_WMI_PERF_TIME_STREAMING_DELAY_ID 3
+#define REDBOOK_WMI_PERF_TIME_STREAMING_SIZE sizeof(LONGLONG)
+#define REDBOOK_WMI_PERF_TIME_STREAMING_ID 4
+#define REDBOOK_WMI_PERF_DATA_PROCESSED_SIZE sizeof(LONGLONG)
+#define REDBOOK_WMI_PERF_DATA_PROCESSED_ID 5
+#define REDBOOK_WMI_PERF_STREAM_PAUSED_COUNT_SIZE sizeof(ULONG)
+#define REDBOOK_WMI_PERF_STREAM_PAUSED_COUNT_ID 6
+
+#define REDBOOK_WMI_PERF_DATA_SIZE (FIELD_OFFSET(REDBOOK_WMI_PERF_DATA, StreamPausedCount) + REDBOOK_WMI_PERF_DATA_StreamPausedCount_SIZE)
+
+#define RegisteredGuids_GuidType_SIZE sizeof(ULONG)
+#define RegisteredGuids_GuidType_ID 1
+#define RegisteredGuids_LoggerId_SIZE sizeof(ULONG)
+#define RegisteredGuids_LoggerId_ID 2
+#define RegisteredGuids_EnableLevel_SIZE sizeof(ULONG)
+#define RegisteredGuids_EnableLevel_ID 3
+#define RegisteredGuids_EnableFlags_SIZE sizeof(ULONG)
+#define RegisteredGuids_EnableFlags_ID 4
+#define RegisteredGuids_IsEnabled_SIZE sizeof(BOOLEAN)
+#define RegisteredGuids_IsEnabled_ID 5
+
+#define RegisteredGuids_SIZE (FIELD_OFFSET(RegisteredGuids, IsEnabled) + RegisteredGuids_IsEnabled_SIZE)
+
+#define WMI_TAPE_DRIVE_PARAMETERS_MaximumBlockSize_SIZE sizeof(ULONG)
+#define WMI_TAPE_DRIVE_PARAMETERS_MaximumBlockSize_ID 1
+#define WMI_TAPE_DRIVE_PARAMETERS_MinimumBlockSize_SIZE sizeof(ULONG)
+#define WMI_TAPE_DRIVE_PARAMETERS_MinimumBlockSize_ID 2
+#define WMI_TAPE_DRIVE_PARAMETERS_DefaultBlockSize_SIZE sizeof(ULONG)
+#define WMI_TAPE_DRIVE_PARAMETERS_DefaultBlockSize_ID 3
+#define WMI_TAPE_DRIVE_PARAMETERS_MaximumPartitionCount_SIZE sizeof(ULONG)
+#define WMI_TAPE_DRIVE_PARAMETERS_MaximumPartitionCount_ID 4
+#define WMI_TAPE_DRIVE_PARAMETERS_CompressionCapable_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_DRIVE_PARAMETERS_CompressionCapable_ID 5
+#define WMI_TAPE_DRIVE_PARAMETERS_CompressionEnabled_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_DRIVE_PARAMETERS_CompressionEnabled_ID 6
+#define WMI_TAPE_DRIVE_PARAMETERS_ReportSetmarks_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_DRIVE_PARAMETERS_ReportSetmarks_ID 7
+#define WMI_TAPE_DRIVE_PARAMETERS_HardwareErrorCorrection_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_DRIVE_PARAMETERS_HardwareErrorCorrection_ID 8
+
+#define WMI_TAPE_DRIVE_PARAMETERS_SIZE (FIELD_OFFSET(WMI_TAPE_DRIVE_PARAMETERS, HardwareErrorCorrection) + WMI_TAPE_DRIVE_PARAMETERS_HardwareErrorCorrection_SIZE)
+
+#define WMI_TAPE_MEDIA_PARAMETERS_MaximumCapacity_SIZE sizeof(ULONGLONG)
+#define WMI_TAPE_MEDIA_PARAMETERS_MaximumCapacity_ID 1
+#define WMI_TAPE_MEDIA_PARAMETERS_AvailableCapacity_SIZE sizeof(ULONGLONG)
+#define WMI_TAPE_MEDIA_PARAMETERS_AvailableCapacity_ID 2
+#define WMI_TAPE_MEDIA_PARAMETERS_BlockSize_SIZE sizeof(ULONG)
+#define WMI_TAPE_MEDIA_PARAMETERS_BlockSize_ID 3
+#define WMI_TAPE_MEDIA_PARAMETERS_PartitionCount_SIZE sizeof(ULONG)
+#define WMI_TAPE_MEDIA_PARAMETERS_PartitionCount_ID 4
+#define WMI_TAPE_MEDIA_PARAMETERS_MediaWriteProtected_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_MEDIA_PARAMETERS_MediaWriteProtected_ID 5
+
+#define WMI_TAPE_MEDIA_PARAMETERS_SIZE (FIELD_OFFSET(WMI_TAPE_MEDIA_PARAMETERS, MediaWriteProtected) + WMI_TAPE_MEDIA_PARAMETERS_MediaWriteProtected_SIZE)
+
+#define WMI_TAPE_SYMBOLIC_NAME_TapeSymbolicName_ID 1
+
+#define WMI_TAPE_PROBLEM_WARNING_DriveProblemType_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_WARNING_DriveProblemType_ID 1
+#define WMI_TAPE_PROBLEM_WARNING_TapeData_SIZE sizeof(UCHAR[512])
+#define WMI_TAPE_PROBLEM_WARNING_TapeData_ID 2
+
+#define WMI_TAPE_PROBLEM_WARNING_SIZE (FIELD_OFFSET(WMI_TAPE_PROBLEM_WARNING, TapeData) + WMI_TAPE_PROBLEM_WARNING_TapeData_SIZE)
+
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadCorrectedWithoutDelay_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadCorrectedWithoutDelay_ID 1
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadCorrectedWithDelay_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadCorrectedWithDelay_ID 2
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadTotalErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadTotalErrors_ID 3
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadTotalCorrectedErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadTotalCorrectedErrors_ID 4
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadTotalUncorrectedErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadTotalUncorrectedErrors_ID 5
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadCorrectionAlgorithmProcessed_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_ReadCorrectionAlgorithmProcessed_ID 6
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteCorrectedWithoutDelay_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteCorrectedWithoutDelay_ID 7
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteCorrectedWithDelay_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteCorrectedWithDelay_ID 8
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteTotalErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteTotalErrors_ID 9
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteTotalCorrectedErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteTotalCorrectedErrors_ID 10
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteTotalUncorrectedErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteTotalUncorrectedErrors_ID 11
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteCorrectionAlgorithmProcessed_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_WriteCorrectionAlgorithmProcessed_ID 12
+#define WMI_TAPE_PROBLEM_IO_ERROR_NonMediumErrors_SIZE sizeof(ULONG)
+#define WMI_TAPE_PROBLEM_IO_ERROR_NonMediumErrors_ID 13
+
+#define WMI_TAPE_PROBLEM_IO_ERROR_SIZE (FIELD_OFFSET(WMI_TAPE_PROBLEM_IO_ERROR, NonMediumErrors) + WMI_TAPE_PROBLEM_IO_ERROR_NonMediumErrors_SIZE)
+
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_ReadWarning_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_ReadWarning_ID 1
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_WriteWarning_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_WriteWarning_ID 2
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_HardError_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_HardError_ID 3
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_ReadFailure_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_ReadFailure_ID 4
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_WriteFailure_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_WriteFailure_ID 5
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_UnsupportedFormat_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_UnsupportedFormat_ID 6
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_TapeSnapped_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_TapeSnapped_ID 7
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_DriveRequiresCleaning_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_DriveRequiresCleaning_ID 8
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_TimetoCleanDrive_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_TimetoCleanDrive_ID 9
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_DriveHardwareError_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_DriveHardwareError_ID 10
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_ScsiInterfaceError_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_ScsiInterfaceError_ID 11
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_MediaLife_SIZE sizeof(BOOLEAN)
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_MediaLife_ID 12
+
+#define WMI_TAPE_PROBLEM_DEVICE_ERROR_SIZE (FIELD_OFFSET(WMI_TAPE_PROBLEM_DEVICE_ERROR, MediaLife) + WMI_TAPE_PROBLEM_DEVICE_ERROR_MediaLife_SIZE)
+
+#define WMI_CHANGER_PARAMETERS_NumberOfSlots_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_NumberOfSlots_ID 1
+#define WMI_CHANGER_PARAMETERS_NumberOfDrives_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_NumberOfDrives_ID 2
+#define WMI_CHANGER_PARAMETERS_NumberOfIEPorts_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_NumberOfIEPorts_ID 3
+#define WMI_CHANGER_PARAMETERS_NumberOfTransports_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_NumberOfTransports_ID 4
+#define WMI_CHANGER_PARAMETERS_NumberOfDoors_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_NumberOfDoors_ID 5
+#define WMI_CHANGER_PARAMETERS_NumberOfCleanerSlots_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_NumberOfCleanerSlots_ID 6
+#define WMI_CHANGER_PARAMETERS_MagazineSize_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PARAMETERS_MagazineSize_ID 7
+
+#define WMI_CHANGER_PARAMETERS_SIZE (FIELD_OFFSET(WMI_CHANGER_PARAMETERS, MagazineSize) + WMI_CHANGER_PARAMETERS_MagazineSize_SIZE)
+
+#define WMI_CHANGER_PROBLEM_WARNING_ChangerProblemType_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PROBLEM_WARNING_ChangerProblemType_ID 1
+#define WMI_CHANGER_PROBLEM_WARNING_ChangerData_SIZE sizeof(UCHAR[512])
+#define WMI_CHANGER_PROBLEM_WARNING_ChangerData_ID 2
+
+#define WMI_CHANGER_PROBLEM_WARNING_SIZE (FIELD_OFFSET(WMI_CHANGER_PROBLEM_WARNING, ChangerData) + WMI_CHANGER_PROBLEM_WARNING_ChangerData_SIZE)
+
+#define WMI_CHANGER_PROBLEM_DEVICE_ERROR_ChangerProblemType_SIZE sizeof(ULONG)
+#define WMI_CHANGER_PROBLEM_DEVICE_ERROR_ChangerProblemType_ID 1
+
+#define WMI_CHANGER_PROBLEM_DEVICE_ERROR_SIZE (FIELD_OFFSET(WMI_CHANGER_PROBLEM_DEVICE_ERROR, ChangerProblemType) + WMI_CHANGER_PROBLEM_DEVICE_ERROR_ChangerProblemType_SIZE)
+
+#define DEVICE_UI_FIRMWARE_REVISION_FirmwareRevision_ID 1
+
+#define MSVerifierIrpLogEntry_Count_SIZE sizeof(ULONG)
+#define MSVerifierIrpLogEntry_Count_ID 1
+#define MSVerifierIrpLogEntry_Major_SIZE sizeof(UCHAR)
+#define MSVerifierIrpLogEntry_Major_ID 2
+#define MSVerifierIrpLogEntry_Minor_SIZE sizeof(UCHAR)
+#define MSVerifierIrpLogEntry_Minor_ID 3
+#define MSVerifierIrpLogEntry_Flags_SIZE sizeof(UCHAR)
+#define MSVerifierIrpLogEntry_Flags_ID 4
+#define MSVerifierIrpLogEntry_Control_SIZE sizeof(UCHAR)
+#define MSVerifierIrpLogEntry_Control_ID 5
+#define MSVerifierIrpLogEntry_Arg1_SIZE sizeof(ULONGLONG)
+#define MSVerifierIrpLogEntry_Arg1_ID 6
+#define MSVerifierIrpLogEntry_Arg2_SIZE sizeof(ULONGLONG)
+#define MSVerifierIrpLogEntry_Arg2_ID 7
+#define MSVerifierIrpLogEntry_Arg3_SIZE sizeof(ULONGLONG)
+#define MSVerifierIrpLogEntry_Arg3_ID 8
+#define MSVerifierIrpLogEntry_Arg4_SIZE sizeof(ULONGLONG)
+#define MSVerifierIrpLogEntry_Arg4_ID 9
+
+#define MSVerifierIrpLogEntry_SIZE (FIELD_OFFSET(MSVerifierIrpLogEntry, Arg4) + MSVerifierIrpLogEntry_Arg4_SIZE)
+
+#define MSVerifierIrpLogInformation_DeviceType_SIZE sizeof(ULONG)
+#define MSVerifierIrpLogInformation_DeviceType_ID 1
+#define MSVerifierIrpLogInformation_EntryCount_SIZE sizeof(ULONG)
+#define MSVerifierIrpLogInformation_EntryCount_ID 2
+#define MSVerifierIrpLogInformation_Entries_ID 3
+
+#define WmiMonitorBrightness_CurrentBrightness_SIZE sizeof(UCHAR)
+#define WmiMonitorBrightness_CurrentBrightness_ID 1
+#define WmiMonitorBrightness_Levels_SIZE sizeof(ULONG)
+#define WmiMonitorBrightness_Levels_ID 2
+#define WmiMonitorBrightness_Level_ID 3
+
+#define WmiSetBrightness 1
+
+#define WmiSetBrightness_IN_Timeout_SIZE sizeof(ULONG)
+#define WmiSetBrightness_IN_Timeout_ID 1
+#define WmiSetBrightness_IN_Brightness_SIZE sizeof(UCHAR)
+#define WmiSetBrightness_IN_Brightness_ID 2
+
+#define WmiSetBrightness_IN_SIZE (FIELD_OFFSET(WmiSetBrightness_IN, Brightness) + WmiSetBrightness_IN_Brightness_SIZE)
+
+#define WmiRevertToPolicyBrightness 2
+#define WmiSetALSBrightnessState 3
+
+#define WmiSetALSBrightnessState_IN_State_SIZE sizeof(BOOLEAN)
+#define WmiSetALSBrightnessState_IN_State_ID 1
+
+#define WmiSetALSBrightnessState_IN_SIZE (FIELD_OFFSET(WmiSetALSBrightnessState_IN, State) + WmiSetALSBrightnessState_IN_State_SIZE)
+
+#define WmiSetALSBrightness 4
+
+#define WmiSetALSBrightness_IN_Brightness_SIZE sizeof(UCHAR)
+#define WmiSetALSBrightness_IN_Brightness_ID 1
+
+#define WmiSetALSBrightness_IN_SIZE (FIELD_OFFSET(WmiSetALSBrightness_IN, Brightness) + WmiSetALSBrightness_IN_Brightness_SIZE)
+
+#define WmiMonitorBrightnessEvent_Brightness_SIZE sizeof(UCHAR)
+#define WmiMonitorBrightnessEvent_Brightness_ID 1
+
+#define WmiMonitorBrightnessEvent_SIZE (FIELD_OFFSET(WmiMonitorBrightnessEvent, Brightness) + WmiMonitorBrightnessEvent_Brightness_SIZE)
+
+#define WmiMonitorRawEEdidV1Block_Id_SIZE sizeof(UCHAR)
+#define WmiMonitorRawEEdidV1Block_Id_ID 1
+#define WmiMonitorRawEEdidV1Block_Type_SIZE sizeof(UCHAR)
+#define WmiMonitorRawEEdidV1Block_Type_ID 2
+#define WmiMonitorRawEEdidV1Block_Content_SIZE sizeof(UCHAR[128])
+#define WmiMonitorRawEEdidV1Block_Content_ID 3
+
+#define WmiMonitorRawEEdidV1Block_SIZE (FIELD_OFFSET(WmiMonitorRawEEdidV1Block, Content) + WmiMonitorRawEEdidV1Block_Content_SIZE)
+
+#define WmiGetMonitorRawEEdidV1Block 1
+
+#define WmiGetMonitorRawEEdidV1Block_IN_BlockId_SIZE sizeof(UCHAR)
+#define WmiGetMonitorRawEEdidV1Block_IN_BlockId_ID 1
+
+#define WmiGetMonitorRawEEdidV1Block_IN_SIZE (FIELD_OFFSET(WmiGetMonitorRawEEdidV1Block_IN, BlockId) + WmiGetMonitorRawEEdidV1Block_IN_BlockId_SIZE)
+
+#define WmiGetMonitorRawEEdidV1Block_OUT_BlockType_SIZE sizeof(UCHAR)
+#define WmiGetMonitorRawEEdidV1Block_OUT_BlockType_ID 2
+#define WmiGetMonitorRawEEdidV1Block_OUT_BlockContent_SIZE sizeof(UCHAR[128])
+#define WmiGetMonitorRawEEdidV1Block_OUT_BlockContent_ID 3
+
+#define WmiGetMonitorRawEEdidV1Block_OUT_SIZE (FIELD_OFFSET(WmiGetMonitorRawEEdidV1Block_OUT, BlockContent) + WmiGetMonitorRawEEdidV1Block_OUT_BlockContent_SIZE)
+
+#define WmiMonitorID_ProductCodeID_SIZE sizeof(USHORT[16])
+#define WmiMonitorID_ProductCodeID_ID 1
+#define WmiMonitorID_SerialNumberID_SIZE sizeof(USHORT[16])
+#define WmiMonitorID_SerialNumberID_ID 2
+#define WmiMonitorID_ManufacturerName_SIZE sizeof(USHORT[16])
+#define WmiMonitorID_ManufacturerName_ID 3
+#define WmiMonitorID_WeekOfManufacture_SIZE sizeof(UCHAR)
+#define WmiMonitorID_WeekOfManufacture_ID 4
+#define WmiMonitorID_YearOfManufacture_SIZE sizeof(USHORT)
+#define WmiMonitorID_YearOfManufacture_ID 5
+#define WmiMonitorID_UserFriendlyNameLength_SIZE sizeof(USHORT)
+#define WmiMonitorID_UserFriendlyNameLength_ID 6
+#define WmiMonitorID_UserFriendlyName_ID 7
+
+#define WmiMonitorSupportedDisplayFeatures_StandbySupported_SIZE sizeof(BOOLEAN)
+#define WmiMonitorSupportedDisplayFeatures_StandbySupported_ID 1
+#define WmiMonitorSupportedDisplayFeatures_SuspendSupported_SIZE sizeof(BOOLEAN)
+#define WmiMonitorSupportedDisplayFeatures_SuspendSupported_ID 2
+#define WmiMonitorSupportedDisplayFeatures_ActiveOffSupported_SIZE sizeof(BOOLEAN)
+#define WmiMonitorSupportedDisplayFeatures_ActiveOffSupported_ID 3
+#define WmiMonitorSupportedDisplayFeatures_DisplayType_SIZE sizeof(UCHAR)
+#define WmiMonitorSupportedDisplayFeatures_DisplayType_ID 4
+#define WmiMonitorSupportedDisplayFeatures_sRGBSupported_SIZE sizeof(BOOLEAN)
+#define WmiMonitorSupportedDisplayFeatures_sRGBSupported_ID 5
+#define WmiMonitorSupportedDisplayFeatures_HasPreferredTimingMode_SIZE sizeof(BOOLEAN)
+#define WmiMonitorSupportedDisplayFeatures_HasPreferredTimingMode_ID 6
+#define WmiMonitorSupportedDisplayFeatures_GTFSupported_SIZE sizeof(BOOLEAN)
+#define WmiMonitorSupportedDisplayFeatures_GTFSupported_ID 7
+
+#define WmiMonitorSupportedDisplayFeatures_SIZE (FIELD_OFFSET(WmiMonitorSupportedDisplayFeatures, GTFSupported) + WmiMonitorSupportedDisplayFeatures_GTFSupported_SIZE)
+
+#define WmiMonitorBasicDisplayParams_VideoInputType_SIZE sizeof(UCHAR)
+#define WmiMonitorBasicDisplayParams_VideoInputType_ID 1
+#define WmiMonitorBasicDisplayParams_MaxHorizontalImageSize_SIZE sizeof(UCHAR)
+#define WmiMonitorBasicDisplayParams_MaxHorizontalImageSize_ID 2
+#define WmiMonitorBasicDisplayParams_MaxVerticalImageSize_SIZE sizeof(UCHAR)
+#define WmiMonitorBasicDisplayParams_MaxVerticalImageSize_ID 3
+#define WmiMonitorBasicDisplayParams_DisplayTransferCharacteristic_SIZE sizeof(UCHAR)
+#define WmiMonitorBasicDisplayParams_DisplayTransferCharacteristic_ID 4
+#define WmiMonitorBasicDisplayParams_SupportedDisplayFeatures_SIZE sizeof(WmiMonitorSupportedDisplayFeatures)
+#define WmiMonitorBasicDisplayParams_SupportedDisplayFeatures_ID 5
+
+#define WmiMonitorBasicDisplayParams_SIZE (FIELD_OFFSET(WmiMonitorBasicDisplayParams, SupportedDisplayFeatures) + WmiMonitorBasicDisplayParams_SupportedDisplayFeatures_SIZE)
+
+#define WmiMonitorConnectionParams_VideoOutputTechnology_SIZE sizeof(ULONG)
+#define WmiMonitorConnectionParams_VideoOutputTechnology_ID 1
+
+#define WmiMonitorConnectionParams_SIZE (FIELD_OFFSET(WmiMonitorConnectionParams, VideoOutputTechnology) + WmiMonitorConnectionParams_VideoOutputTechnology_SIZE)
+
+#define WmiMonitorAnalogVideoInputParams_SignalLevelStandard_SIZE sizeof(UCHAR)
+#define WmiMonitorAnalogVideoInputParams_SignalLevelStandard_ID 1
+#define WmiMonitorAnalogVideoInputParams_SetupExpected_SIZE sizeof(UCHAR)
+#define WmiMonitorAnalogVideoInputParams_SetupExpected_ID 2
+#define WmiMonitorAnalogVideoInputParams_SeparateSyncsSupported_SIZE sizeof(UCHAR)
+#define WmiMonitorAnalogVideoInputParams_SeparateSyncsSupported_ID 3
+#define WmiMonitorAnalogVideoInputParams_CompositeSyncSupported_SIZE sizeof(UCHAR)
+#define WmiMonitorAnalogVideoInputParams_CompositeSyncSupported_ID 4
+#define WmiMonitorAnalogVideoInputParams_SyncOnGreenVideoSupported_SIZE sizeof(UCHAR)
+#define WmiMonitorAnalogVideoInputParams_SyncOnGreenVideoSupported_ID 5
+#define WmiMonitorAnalogVideoInputParams_SerrationOfVsyncRequired_SIZE sizeof(UCHAR)
+#define WmiMonitorAnalogVideoInputParams_SerrationOfVsyncRequired_ID 6
+
+#define WmiMonitorAnalogVideoInputParams_SIZE (FIELD_OFFSET(WmiMonitorAnalogVideoInputParams, SerrationOfVsyncRequired) + WmiMonitorAnalogVideoInputParams_SerrationOfVsyncRequired_SIZE)
+
+#define WmiMonitorDigitalVideoInputParams_IsDFP1xCompatible_SIZE sizeof(BOOLEAN)
+#define WmiMonitorDigitalVideoInputParams_IsDFP1xCompatible_ID 1
+
+#define WmiMonitorDigitalVideoInputParams_SIZE (FIELD_OFFSET(WmiMonitorDigitalVideoInputParams, IsDFP1xCompatible) + WmiMonitorDigitalVideoInputParams_IsDFP1xCompatible_SIZE)
+
+#define WmiMonitorColorXYZinCIE_X_SIZE sizeof(USHORT)
+#define WmiMonitorColorXYZinCIE_X_ID 1
+#define WmiMonitorColorXYZinCIE_Y_SIZE sizeof(USHORT)
+#define WmiMonitorColorXYZinCIE_Y_ID 2
+
+#define WmiMonitorColorXYZinCIE_SIZE (FIELD_OFFSET(WmiMonitorColorXYZinCIE, Y) + WmiMonitorColorXYZinCIE_Y_SIZE)
+
+#define WmiMonitorColorCharacteristics_Red_SIZE sizeof(WmiMonitorColorXYZinCIE)
+#define WmiMonitorColorCharacteristics_Red_ID 1
+#define WmiMonitorColorCharacteristics_Blue_SIZE sizeof(WmiMonitorColorXYZinCIE)
+#define WmiMonitorColorCharacteristics_Blue_ID 2
+#define WmiMonitorColorCharacteristics_Green_SIZE sizeof(WmiMonitorColorXYZinCIE)
+#define WmiMonitorColorCharacteristics_Green_ID 3
+#define WmiMonitorColorCharacteristics_DefaultWhite_SIZE sizeof(WmiMonitorColorXYZinCIE)
+#define WmiMonitorColorCharacteristics_DefaultWhite_ID 4
+
+#define WmiMonitorColorCharacteristics_SIZE (FIELD_OFFSET(WmiMonitorColorCharacteristics, DefaultWhite) + WmiMonitorColorCharacteristics_DefaultWhite_SIZE)
+
+#define VideoModeDescriptor_PixelClockRate_SIZE sizeof(ULONG)
+#define VideoModeDescriptor_PixelClockRate_ID 1
+#define VideoModeDescriptor_VerticalRefreshRateNumerator_SIZE sizeof(ULONG)
+#define VideoModeDescriptor_VerticalRefreshRateNumerator_ID 2
+#define VideoModeDescriptor_VerticalRefreshRateDenominator_SIZE sizeof(ULONG)
+#define VideoModeDescriptor_VerticalRefreshRateDenominator_ID 3
+#define VideoModeDescriptor_HorizontalRefreshRateNumerator_SIZE sizeof(ULONG)
+#define VideoModeDescriptor_HorizontalRefreshRateNumerator_ID 4
+#define VideoModeDescriptor_HorizontalRefreshRateDenominator_SIZE sizeof(ULONG)
+#define VideoModeDescriptor_HorizontalRefreshRateDenominator_ID 5
+#define VideoModeDescriptor_HorizontalActivePixels_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_HorizontalActivePixels_ID 6
+#define VideoModeDescriptor_VerticalActivePixels_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_VerticalActivePixels_ID 7
+#define VideoModeDescriptor_HorizontalBlankingPixels_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_HorizontalBlankingPixels_ID 8
+#define VideoModeDescriptor_VerticalBlankingPixels_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_VerticalBlankingPixels_ID 9
+#define VideoModeDescriptor_HorizontalSyncOffset_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_HorizontalSyncOffset_ID 10
+#define VideoModeDescriptor_VerticalSyncOffset_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_VerticalSyncOffset_ID 11
+#define VideoModeDescriptor_HorizontalSyncPulseWidth_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_HorizontalSyncPulseWidth_ID 12
+#define VideoModeDescriptor_VerticalSyncPulseWidth_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_VerticalSyncPulseWidth_ID 13
+#define VideoModeDescriptor_HorizontalImageSize_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_HorizontalImageSize_ID 14
+#define VideoModeDescriptor_VerticalImageSize_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_VerticalImageSize_ID 15
+#define VideoModeDescriptor_HorizontalBorder_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_HorizontalBorder_ID 16
+#define VideoModeDescriptor_VerticalBorder_SIZE sizeof(USHORT)
+#define VideoModeDescriptor_VerticalBorder_ID 17
+#define VideoModeDescriptor_IsInterlaced_SIZE sizeof(BOOLEAN)
+#define VideoModeDescriptor_IsInterlaced_ID 18
+#define VideoModeDescriptor_StereoModeType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_StereoModeType_ID 19
+#define VideoModeDescriptor_SyncSignalType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_SyncSignalType_ID 20
+#define VideoModeDescriptor_IsSerrationRequired_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_IsSerrationRequired_ID 21
+#define VideoModeDescriptor_IsSyncOnRGB_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_IsSyncOnRGB_ID 22
+#define VideoModeDescriptor_CompositePolarityType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_CompositePolarityType_ID 23
+#define VideoModeDescriptor_VerticalPolarityType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_VerticalPolarityType_ID 24
+#define VideoModeDescriptor_HorizontalPolarityType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_HorizontalPolarityType_ID 25
+#define VideoModeDescriptor_VideoStandardType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_VideoStandardType_ID 26
+#define VideoModeDescriptor_Origin_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_Origin_ID 27
+#define VideoModeDescriptor_TimingType_SIZE sizeof(UCHAR)
+#define VideoModeDescriptor_TimingType_ID 28
+
+#define VideoModeDescriptor_SIZE (FIELD_OFFSET(VideoModeDescriptor, TimingType) + VideoModeDescriptor_TimingType_SIZE)
+
+#define WmiMonitorListedSupportedSourceModes_NumOfMonitorSourceModes_SIZE sizeof(USHORT)
+#define WmiMonitorListedSupportedSourceModes_NumOfMonitorSourceModes_ID 1
+#define WmiMonitorListedSupportedSourceModes_PreferredMonitorSourceModeIndex_SIZE sizeof(USHORT)
+#define WmiMonitorListedSupportedSourceModes_PreferredMonitorSourceModeIndex_ID 2
+#define WmiMonitorListedSupportedSourceModes_MonitorSourceModes_ID 3
+
+#define FrequencyRangeDescriptor_Origin_SIZE sizeof(UCHAR)
+#define FrequencyRangeDescriptor_Origin_ID 1
+#define FrequencyRangeDescriptor_MinVSyncNumerator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MinVSyncNumerator_ID 2
+#define FrequencyRangeDescriptor_MinVSyncDenominator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MinVSyncDenominator_ID 3
+#define FrequencyRangeDescriptor_MaxVSyncNumerator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MaxVSyncNumerator_ID 4
+#define FrequencyRangeDescriptor_MaxVSyncDenominator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MaxVSyncDenominator_ID 5
+#define FrequencyRangeDescriptor_MinHSyncNumerator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MinHSyncNumerator_ID 6
+#define FrequencyRangeDescriptor_MinHSyncDenominator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MinHSyncDenominator_ID 7
+#define FrequencyRangeDescriptor_MaxHSyncNumerator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MaxHSyncNumerator_ID 8
+#define FrequencyRangeDescriptor_MaxHSyncDenominator_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MaxHSyncDenominator_ID 9
+#define FrequencyRangeDescriptor_ConstraintType_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_ConstraintType_ID 10
+#define FrequencyRangeDescriptor_ActiveWidth_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_ActiveWidth_ID 11
+#define FrequencyRangeDescriptor_ActiveHeight_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_ActiveHeight_ID 12
+#define FrequencyRangeDescriptor_MaxPixelRate_SIZE sizeof(ULONG)
+#define FrequencyRangeDescriptor_MaxPixelRate_ID 13
+
+#define FrequencyRangeDescriptor_SIZE (FIELD_OFFSET(FrequencyRangeDescriptor, MaxPixelRate) + FrequencyRangeDescriptor_MaxPixelRate_SIZE)
+
+#define WmiMonitorListedFrequencyRanges_NumOfMonitorFreqRanges_SIZE sizeof(USHORT)
+#define WmiMonitorListedFrequencyRanges_NumOfMonitorFreqRanges_ID 1
+#define WmiMonitorListedFrequencyRanges_MonitorFreqRanges_ID 2
+
+#define KernelPerfState_Frequency_SIZE sizeof(ULONG)
+#define KernelPerfState_Frequency_ID 1
+#define KernelPerfState_Power_SIZE sizeof(ULONG)
+#define KernelPerfState_Power_ID 2
+#define KernelPerfState_PercentFrequency_SIZE sizeof(UCHAR)
+#define KernelPerfState_PercentFrequency_ID 3
+#define KernelPerfState_IncreaseLevel_SIZE sizeof(UCHAR)
+#define KernelPerfState_IncreaseLevel_ID 4
+#define KernelPerfState_DecreaseLevel_SIZE sizeof(UCHAR)
+#define KernelPerfState_DecreaseLevel_ID 5
+#define KernelPerfState_Type_SIZE sizeof(UCHAR)
+#define KernelPerfState_Type_ID 6
+#define KernelPerfState_IncreaseTime_SIZE sizeof(ULONG)
+#define KernelPerfState_IncreaseTime_ID 7
+#define KernelPerfState_DecreaseTime_SIZE sizeof(ULONG)
+#define KernelPerfState_DecreaseTime_ID 8
+#define KernelPerfState_Control_SIZE sizeof(ULONGLONG)
+#define KernelPerfState_Control_ID 9
+#define KernelPerfState_Status_SIZE sizeof(ULONGLONG)
+#define KernelPerfState_Status_ID 10
+#define KernelPerfState_HitCount_SIZE sizeof(ULONG)
+#define KernelPerfState_HitCount_ID 11
+#define KernelPerfState_Reserved1_SIZE sizeof(ULONG)
+#define KernelPerfState_Reserved1_ID 12
+#define KernelPerfState_Reserved2_SIZE sizeof(ULONGLONG)
+#define KernelPerfState_Reserved2_ID 13
+#define KernelPerfState_Reserved3_SIZE sizeof(ULONGLONG)
+#define KernelPerfState_Reserved3_ID 14
+
+#define KernelPerfState_SIZE (FIELD_OFFSET(KernelPerfState, Reserved3) + KernelPerfState_Reserved3_SIZE)
+
+#define KernelPerfStates_Count_SIZE sizeof(ULONG)
+#define KernelPerfStates_Count_ID 1
+#define KernelPerfStates_MaxFrequency_SIZE sizeof(ULONG)
+#define KernelPerfStates_MaxFrequency_ID 2
+#define KernelPerfStates_CurrentState_SIZE sizeof(ULONG)
+#define KernelPerfStates_CurrentState_ID 3
+#define KernelPerfStates_MaxPerfState_SIZE sizeof(ULONG)
+#define KernelPerfStates_MaxPerfState_ID 4
+#define KernelPerfStates_MinPerfState_SIZE sizeof(ULONG)
+#define KernelPerfStates_MinPerfState_ID 5
+#define KernelPerfStates_LowestPerfState_SIZE sizeof(ULONG)
+#define KernelPerfStates_LowestPerfState_ID 6
+#define KernelPerfStates_ThermalConstraint_SIZE sizeof(ULONG)
+#define KernelPerfStates_ThermalConstraint_ID 7
+#define KernelPerfStates_BusyAdjThreshold_SIZE sizeof(UCHAR)
+#define KernelPerfStates_BusyAdjThreshold_ID 8
+#define KernelPerfStates_PolicyType_SIZE sizeof(UCHAR)
+#define KernelPerfStates_PolicyType_ID 9
+#define KernelPerfStates_Type_SIZE sizeof(UCHAR)
+#define KernelPerfStates_Type_ID 10
+#define KernelPerfStates_Reserved_SIZE sizeof(UCHAR)
+#define KernelPerfStates_Reserved_ID 11
+#define KernelPerfStates_TimerInterval_SIZE sizeof(ULONG)
+#define KernelPerfStates_TimerInterval_ID 12
+#define KernelPerfStates_TargetProcessors_SIZE sizeof(ULONGLONG)
+#define KernelPerfStates_TargetProcessors_ID 13
+#define KernelPerfStates_PStateHandler_SIZE sizeof(ULONG)
+#define KernelPerfStates_PStateHandler_ID 14
+#define KernelPerfStates_PStateContext_SIZE sizeof(ULONG)
+#define KernelPerfStates_PStateContext_ID 15
+#define KernelPerfStates_TStateHandler_SIZE sizeof(ULONG)
+#define KernelPerfStates_TStateHandler_ID 16
+#define KernelPerfStates_TStateContext_SIZE sizeof(ULONG)
+#define KernelPerfStates_TStateContext_ID 17
+#define KernelPerfStates_FeedbackHandler_SIZE sizeof(ULONG)
+#define KernelPerfStates_FeedbackHandler_ID 18
+#define KernelPerfStates_Reserved1_SIZE sizeof(ULONG)
+#define KernelPerfStates_Reserved1_ID 19
+#define KernelPerfStates_Reserved2_SIZE sizeof(ULONGLONG)
+#define KernelPerfStates_Reserved2_ID 20
+#define KernelPerfStates_State_ID 21
+
+#define KernelIdleState_Latency_SIZE sizeof(ULONG)
+#define KernelIdleState_Latency_ID 1
+#define KernelIdleState_Power_SIZE sizeof(ULONG)
+#define KernelIdleState_Power_ID 2
+#define KernelIdleState_TimeCheck_SIZE sizeof(ULONG)
+#define KernelIdleState_TimeCheck_ID 3
+#define KernelIdleState_PromotePercent_SIZE sizeof(UCHAR)
+#define KernelIdleState_PromotePercent_ID 4
+#define KernelIdleState_DemotePercent_SIZE sizeof(UCHAR)
+#define KernelIdleState_DemotePercent_ID 5
+#define KernelIdleState_StateType_SIZE sizeof(UCHAR)
+#define KernelIdleState_StateType_ID 6
+#define KernelIdleState_Reserved_SIZE sizeof(UCHAR)
+#define KernelIdleState_Reserved_ID 7
+#define KernelIdleState_StateFlags_SIZE sizeof(ULONG)
+#define KernelIdleState_StateFlags_ID 8
+#define KernelIdleState_Context_SIZE sizeof(ULONG)
+#define KernelIdleState_Context_ID 9
+#define KernelIdleState_IdleHandler_SIZE sizeof(ULONG)
+#define KernelIdleState_IdleHandler_ID 10
+#define KernelIdleState_Reserved1_SIZE sizeof(ULONG)
+#define KernelIdleState_Reserved1_ID 11
+
+#define KernelIdleState_SIZE (FIELD_OFFSET(KernelIdleState, Reserved1) + KernelIdleState_Reserved1_SIZE)
+
+#define KernelIdleStates_Type_SIZE sizeof(ULONG)
+#define KernelIdleStates_Type_ID 1
+#define KernelIdleStates_Count_SIZE sizeof(ULONG)
+#define KernelIdleStates_Count_ID 2
+#define KernelIdleStates_TargetState_SIZE sizeof(ULONG)
+#define KernelIdleStates_TargetState_ID 3
+#define KernelIdleStates_OldState_SIZE sizeof(ULONG)
+#define KernelIdleStates_OldState_ID 4
+#define KernelIdleStates_TargetProcessors_SIZE sizeof(ULONGLONG)
+#define KernelIdleStates_TargetProcessors_ID 5
+#define KernelIdleStates_State_ID 6
+
+#define KernelPerfStateChange_State_SIZE sizeof(ULONG)
+#define KernelPerfStateChange_State_ID 1
+#define KernelPerfStateChange_Status_SIZE sizeof(ULONG)
+#define KernelPerfStateChange_Status_ID 2
+#define KernelPerfStateChange_Latency_SIZE sizeof(ULONG)
+#define KernelPerfStateChange_Latency_ID 3
+#define KernelPerfStateChange_Speed_SIZE sizeof(ULONG)
+#define KernelPerfStateChange_Speed_ID 4
+#define KernelPerfStateChange_Processor_SIZE sizeof(ULONG)
+#define KernelPerfStateChange_Processor_ID 5
+
+#define KernelPerfStateChange_SIZE (FIELD_OFFSET(KernelPerfStateChange, Processor) + KernelPerfStateChange_Processor_SIZE)
+
+#define KernelPerfStateDomainChange_State_SIZE sizeof(ULONG)
+#define KernelPerfStateDomainChange_State_ID 1
+#define KernelPerfStateDomainChange_Latency_SIZE sizeof(ULONG)
+#define KernelPerfStateDomainChange_Latency_ID 2
+#define KernelPerfStateDomainChange_Speed_SIZE sizeof(ULONG)
+#define KernelPerfStateDomainChange_Speed_ID 3
+#define KernelPerfStateDomainChange_Processors_SIZE sizeof(ULONGLONG)
+#define KernelPerfStateDomainChange_Processors_ID 4
+
+#define KernelPerfStateDomainChange_SIZE (FIELD_OFFSET(KernelPerfStateDomainChange, Processors) + KernelPerfStateDomainChange_Processors_SIZE)
+
+#define KernelIdleStateChange_NewState_SIZE sizeof(ULONG)
+#define KernelIdleStateChange_NewState_ID 1
+#define KernelIdleStateChange_OldState_SIZE sizeof(ULONG)
+#define KernelIdleStateChange_OldState_ID 2
+#define KernelIdleStateChange_Processors_SIZE sizeof(ULONGLONG)
+#define KernelIdleStateChange_Processors_ID 3
+
+#define KernelIdleStateChange_SIZE (FIELD_OFFSET(KernelIdleStateChange, Processors) + KernelIdleStateChange_Processors_SIZE)
+
+#define KernelThermalConstraintChange_ThermalConstraint_SIZE sizeof(ULONG)
+#define KernelThermalConstraintChange_ThermalConstraint_ID 1
+#define KernelThermalConstraintChange_Processors_SIZE sizeof(ULONGLONG)
+#define KernelThermalConstraintChange_Processors_ID 2
+
+#define KernelThermalConstraintChange_SIZE (FIELD_OFFSET(KernelThermalConstraintChange, Processors) + KernelThermalConstraintChange_Processors_SIZE)
+
+#define IdleStateAccounting_IdleTransitions_SIZE sizeof(ULONG)
+#define IdleStateAccounting_IdleTransitions_ID 1
+#define IdleStateAccounting_FailedTransitions_SIZE sizeof(ULONG)
+#define IdleStateAccounting_FailedTransitions_ID 2
+#define IdleStateAccounting_InvalidBucketIndex_SIZE sizeof(ULONG)
+#define IdleStateAccounting_InvalidBucketIndex_ID 3
+#define IdleStateAccounting_TotalTime_SIZE sizeof(ULONGLONG)
+#define IdleStateAccounting_TotalTime_ID 4
+#define IdleStateAccounting_IdleTimeBuckets_SIZE sizeof(ULONG[6])
+#define IdleStateAccounting_IdleTimeBuckets_ID 5
+
+#define IdleStateAccounting_SIZE (FIELD_OFFSET(IdleStateAccounting, IdleTimeBuckets) + IdleStateAccounting_IdleTimeBuckets_SIZE)
+
+#define IdleAccounting_StateCount_SIZE sizeof(ULONG)
+#define IdleAccounting_StateCount_ID 1
+#define IdleAccounting_TotalTransitions_SIZE sizeof(ULONG)
+#define IdleAccounting_TotalTransitions_ID 2
+#define IdleAccounting_ResetCount_SIZE sizeof(ULONG)
+#define IdleAccounting_ResetCount_ID 3
+#define IdleAccounting_StartTime_SIZE sizeof(ULONGLONG)
+#define IdleAccounting_StartTime_ID 4
+#define IdleAccounting_State_ID 5
+
+#define IdleStateBucketEx_TotalTimeUs_SIZE sizeof(ULONGLONG)
+#define IdleStateBucketEx_TotalTimeUs_ID 1
+#define IdleStateBucketEx_MinTimeUs_SIZE sizeof(ULONG)
+#define IdleStateBucketEx_MinTimeUs_ID 2
+#define IdleStateBucketEx_MaxTimeUs_SIZE sizeof(ULONG)
+#define IdleStateBucketEx_MaxTimeUs_ID 3
+#define IdleStateBucketEx_Count_SIZE sizeof(ULONG)
+#define IdleStateBucketEx_Count_ID 4
+
+#define IdleStateBucketEx_SIZE (FIELD_OFFSET(IdleStateBucketEx, Count) + IdleStateBucketEx_Count_SIZE)
+
+#define IdleStateAccountingEx_TotalTime_SIZE sizeof(ULONGLONG)
+#define IdleStateAccountingEx_TotalTime_ID 1
+#define IdleStateAccountingEx_IdleTransitions_SIZE sizeof(ULONG)
+#define IdleStateAccountingEx_IdleTransitions_ID 2
+#define IdleStateAccountingEx_FailedTransitions_SIZE sizeof(ULONG)
+#define IdleStateAccountingEx_FailedTransitions_ID 3
+#define IdleStateAccountingEx_InvalidBucketIndex_SIZE sizeof(ULONG)
+#define IdleStateAccountingEx_InvalidBucketIndex_ID 4
+#define IdleStateAccountingEx_MinTimeUs_SIZE sizeof(ULONG)
+#define IdleStateAccountingEx_MinTimeUs_ID 5
+#define IdleStateAccountingEx_MaxTimeUs_SIZE sizeof(ULONG)
+#define IdleStateAccountingEx_MaxTimeUs_ID 6
+#define IdleStateAccountingEx_IdleTimeBuckets_SIZE sizeof(IdleStateBucketEx[16])
+#define IdleStateAccountingEx_IdleTimeBuckets_ID 7
+
+#define IdleStateAccountingEx_SIZE (FIELD_OFFSET(IdleStateAccountingEx, IdleTimeBuckets) + IdleStateAccountingEx_IdleTimeBuckets_SIZE)
+
+#define IdleAccountingEx_StateCount_SIZE sizeof(ULONG)
+#define IdleAccountingEx_StateCount_ID 1
+#define IdleAccountingEx_TotalTransitions_SIZE sizeof(ULONG)
+#define IdleAccountingEx_TotalTransitions_ID 2
+#define IdleAccountingEx_ResetCount_SIZE sizeof(ULONG)
+#define IdleAccountingEx_ResetCount_ID 3
+#define IdleAccountingEx_StartTime_SIZE sizeof(ULONGLONG)
+#define IdleAccountingEx_StartTime_ID 4
+#define IdleAccountingEx_State_ID 5
+
+#define KernelThermalPolicyChange_CoolingMode_SIZE sizeof(UCHAR)
+#define KernelThermalPolicyChange_CoolingMode_ID 1
+#define KernelThermalPolicyChange_Processors_SIZE sizeof(ULONGLONG)
+#define KernelThermalPolicyChange_Processors_ID 2
+
+#define KernelThermalPolicyChange_SIZE (FIELD_OFFSET(KernelThermalPolicyChange, Processors) + KernelThermalPolicyChange_Processors_SIZE)
+
+#define ProcessorPerformance_frequency_SIZE sizeof(ULONG)
+#define ProcessorPerformance_frequency_ID 1
+#define ProcessorPerformance_power_SIZE sizeof(ULONG)
+#define ProcessorPerformance_power_ID 2
+#define ProcessorPerformance_percentage_SIZE sizeof(ULONG)
+#define ProcessorPerformance_percentage_ID 3
+
+#define ProcessorPerformance_SIZE (FIELD_OFFSET(ProcessorPerformance, percentage) + ProcessorPerformance_percentage_SIZE)
+
+typedef struct _MSWmi_MofData {
+ ULONG Unused1;
+ ULONG Unused2;
+ ULONG Size;
+ ULONG Unused4;
+ UCHAR BinaryMofData[1];
+} MSWmi_MofData, *PMSWmi_MofData;
+
+typedef struct _MSWmi_ProviderInfo {
+ char VariableData[1];
+} MSWmi_ProviderInfo, *PMSWmi_ProviderInfo;
+
+typedef struct _MSWmi_PnPDeviceId {
+ CHAR VariableData[1];
+} MSWmi_PnPDeviceId, *PMSWmi_PnPDeviceId;
+
+typedef struct _MSWmi_PnPInstanceNames {
+ ULONG Count;
+ WCHAR InstanceNameList[1];
+} MSWmi_PnPInstanceNames, *PMSWmi_PnPInstanceNames;
+
+typedef struct _MSWmi_Guid {
+ UCHAR Guid[16];
+} MSWmi_Guid, *PMSWmi_Guid;
+
+typedef struct _MSWmi_GuidRegistrationInfo {
+ ULONG Operation;
+ ULONG GuidCount;
+ MSWmi_Guid GuidList[1];
+} MSWmi_GuidRegistrationInfo, *PMSWmi_GuidRegistrationInfo;
+
+typedef struct _MSAcpiInfo {
+ ULONG BootArchitecture;
+ ULONG PreferredProfile;
+ ULONG Capabilities;
+} MSAcpiInfo, *PMSAcpiInfo;
+
+typedef struct _GET_INJECTION_CAPABILITIES_OUT {
+ ULONG Status;
+ ULONG Capabilities;
+} GET_INJECTION_CAPABILITIES_OUT, *PGET_INJECTION_CAPABILITIES_OUT;
+
+typedef struct _INJECT_HARDWARE_ERROR_IN {
+ ULONG ErrorType;
+ ULONGLONG Parameter1;
+ ULONGLONG Parameter2;
+ ULONGLONG Parameter3;
+ ULONGLONG Parameter4;
+} INJECT_HARDWARE_ERROR_IN, *PINJECT_HARDWARE_ERROR_IN;
+
+typedef struct _INJECT_HARDWARE_ERROR_OUT {
+ ULONG Status;
+} INJECT_HARDWARE_ERROR_OUT, *PINJECT_HARDWARE_ERROR_OUT;
+
+typedef struct _GET_ALL_ERROR_SOURCES_OUT {
+ ULONG Status;
+ ULONG Count;
+ ULONG Length;
+ UCHAR ErrorSourceArray[1];
+} GET_ALL_ERROR_SOURCES_OUT, *PGET_ALL_ERROR_SOURCES_OUT;
+
+typedef struct _GET_ERROR_SOURCE_INFO_IN {
+ ULONG ErrorSourceId;
+} GET_ERROR_SOURCE_INFO_IN, *PGET_ERROR_SOURCE_INFO_IN;
+
+typedef struct _GET_ERROR_SOURCE_INFO_OUT {
+ ULONG Status;
+ ULONG Length;
+ UCHAR ErrorSourceInfo[1];
+} GET_ERROR_SOURCE_INFO_OUT, *PGET_ERROR_SOURCE_INFO_OUT;
+
+typedef struct _SET_ERROR_SOURCE_INFO_IN {
+ ULONG Length;
+ UCHAR ErrorSourceInfo[1];
+} SET_ERROR_SOURCE_INFO_IN, *PSET_ERROR_SOURCE_INFO_IN;
+
+typedef struct _SET_ERROR_SOURCE_INFO_OUT {
+ ULONG Status;
+} SET_ERROR_SOURCE_INFO_OUT, *PSET_ERROR_SOURCE_INFO_OUT;
+
+typedef struct _ENABLE_ERROR_SOURCE_IN {
+ ULONG ErrorSourceId;
+} ENABLE_ERROR_SOURCE_IN, *PENABLE_ERROR_SOURCE_IN;
+
+typedef struct _ENABLE_ERROR_SOURCE_OUT {
+ ULONG Status;
+} ENABLE_ERROR_SOURCE_OUT, *PENABLE_ERROR_SOURCE_OUT;
+
+typedef struct _DISABLE_ERROR_SOURCE_IN {
+ ULONG ErrorSourceId;
+} DISABLE_ERROR_SOURCE_IN, *PDISABLE_ERROR_SOURCE_IN;
+
+typedef struct _DISABLE_ERROR_SOURCE_OUT {
+ ULONG Status;
+} DISABLE_ERROR_SOURCE_OUT, *PDISABLE_ERROR_SOURCE_OUT;
+
+typedef struct _MSSmBios_RawSMBiosTables {
+ BOOLEAN Used20CallingMethod;
+ UCHAR SmbiosMajorVersion;
+ UCHAR SmbiosMinorVersion;
+ UCHAR DmiRevision;
+ ULONG Size;
+ UCHAR SMBiosData[1];
+} MSSmBios_RawSMBiosTables, *PMSSmBios_RawSMBiosTables;
+
+typedef struct _MSSmBios_SMBiosEventlog {
+ char VariableData[1];
+} MSSmBios_SMBiosEventlog, *PMSSmBios_SMBiosEventlog;
+
+typedef struct _SYSID_UUID {
+ UCHAR Uuid[16];
+} SYSID_UUID, *PSYSID_UUID;
+
+typedef struct _MSSmBios_SysidUUIDList {
+ ULONG Count;
+ SYSID_UUID List[1];
+} MSSmBios_SysidUUIDList, *PMSSmBios_SysidUUIDList;
+
+typedef struct _SYSID_1394 {
+ UCHAR x1394[8];
+} SYSID_1394, *PSYSID_1394;
+
+typedef struct _MSSmBios_Sysid1394List {
+ ULONG Count;
+ SYSID_1394 List[1];
+} MSSmBios_Sysid1394List, *PMSSmBios_Sysid1394List;
+
+typedef struct _MSMCAEvent_Header {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+} MSMCAEvent_Header, *PMSMCAEvent_Header;
+
+typedef struct _MSMCAEvent_BusError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONG Participation;
+ ULONG MemoryHierarchyLevel;
+ ULONG RequestType;
+ ULONG MemOrIo;
+ ULONGLONG Address;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_BusError, *PMSMCAEvent_BusError;
+
+typedef struct _MSMCAEvent_TLBError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONG TransactionType;
+ ULONG MemoryHierarchyLevel;
+ ULONGLONG Address;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_TLBError, *PMSMCAEvent_TLBError;
+
+typedef struct _MSMCAEvent_MemoryHierarchyError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONG TransactionType;
+ ULONG MemoryHierarchyLevel;
+ ULONG RequestType;
+ ULONGLONG Address;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_MemoryHierarchyError, *PMSMCAEvent_MemoryHierarchyError;
+
+typedef struct _MSMCAEvent_CPUError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONG MajorErrorType;
+ ULONG Level;
+ ULONG CacheOp;
+ ULONG CacheMesi;
+ ULONG TLBOp;
+ ULONG BusType;
+ ULONG BusSev;
+ ULONG RegFileId;
+ ULONG RegFileOp;
+ ULONG MSSid;
+ ULONG MSOp;
+ ULONG MSArrayId;
+ ULONG MSIndex;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_CPUError, *PMSMCAEvent_CPUError;
+
+typedef struct _MSMCAEvent_MemoryError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONGLONG VALIDATION_BITS;
+ ULONGLONG MEM_ERROR_STATUS;
+ ULONGLONG MEM_PHYSICAL_ADDR;
+ ULONGLONG MEM_PHYSICAL_MASK;
+ ULONGLONG RESPONDER_ID;
+ ULONGLONG TARGET_ID;
+ ULONGLONG REQUESTOR_ID;
+ ULONGLONG BUS_SPECIFIC_DATA;
+ USHORT MEM_NODE;
+ USHORT MEM_CARD;
+ USHORT MEM_BANK;
+ USHORT xMEM_DEVICE;
+ USHORT MEM_MODULE;
+ USHORT MEM_ROW;
+ USHORT MEM_COLUMN;
+ USHORT MEM_BIT_POSITION;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_MemoryError, *PMSMCAEvent_MemoryError;
+
+typedef struct _MSMCAEvent_PCIBusError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONGLONG VALIDATION_BITS;
+ ULONGLONG PCI_BUS_ERROR_STATUS;
+ ULONGLONG PCI_BUS_ADDRESS;
+ ULONGLONG PCI_BUS_DATA;
+ ULONGLONG PCI_BUS_CMD;
+ ULONGLONG PCI_BUS_REQUESTOR_ID;
+ ULONGLONG PCI_BUS_RESPONDER_ID;
+ ULONGLONG PCI_BUS_TARGET_ID;
+ USHORT PCI_BUS_ERROR_TYPE;
+ UCHAR PCI_BUS_ID_BusNumber;
+ UCHAR PCI_BUS_ID_SegmentNumber;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_PCIBusError, *PMSMCAEvent_PCIBusError;
+
+typedef struct _MSMCAEvent_PCIComponentError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONGLONG VALIDATION_BITS;
+ ULONGLONG PCI_COMP_ERROR_STATUS;
+ USHORT PCI_COMP_INFO_VendorId;
+ USHORT PCI_COMP_INFO_DeviceId;
+ UCHAR PCI_COMP_INFO_ClassCodeInterface;
+ UCHAR PCI_COMP_INFO_ClassCodeSubClass;
+ UCHAR PCI_COMP_INFO_ClassCodeBaseClass;
+ UCHAR PCI_COMP_INFO_FunctionNumber;
+ UCHAR PCI_COMP_INFO_DeviceNumber;
+ UCHAR PCI_COMP_INFO_BusNumber;
+ UCHAR PCI_COMP_INFO_SegmentNumber;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_PCIComponentError, *PMSMCAEvent_PCIComponentError;
+
+typedef struct _MSMCAEvent_SystemEventError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONGLONG VALIDATION_BITS;
+ ULONGLONG SEL_TIME_STAMP;
+ USHORT SEL_RECORD_ID;
+ USHORT SEL_GENERATOR_ID;
+ UCHAR SEL_RECORD_TYPE;
+ UCHAR SEL_EVM_REV;
+ UCHAR SEL_SENSOR_TYPE;
+ UCHAR SEL_SENSOR_NUM;
+ UCHAR SEL_EVENT_DIR_TYPE;
+ UCHAR SEL_DATA1;
+ UCHAR SEL_DATA2;
+ UCHAR SEL_DATA3;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_SystemEventError, *PMSMCAEvent_SystemEventError;
+
+typedef struct _MSMCAEvent_SMBIOSError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONGLONG VALIDATION_BITS;
+ UCHAR SMBIOS_EVENT_TYPE;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_SMBIOSError, *PMSMCAEvent_SMBIOSError;
+
+typedef struct _MSMCAEvent_PlatformSpecificError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONGLONG VALIDATION_BITS;
+ ULONGLONG PLATFORM_ERROR_STATUS;
+ ULONGLONG PLATFORM_REQUESTOR_ID;
+ ULONGLONG PLATFORM_RESPONDER_ID;
+ ULONGLONG PLATFORM_TARGET_ID;
+ ULONGLONG PLATFORM_BUS_SPECIFIC_DATA;
+ UCHAR OEM_COMPONENT_ID[16];
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_PlatformSpecificError, *PMSMCAEvent_PlatformSpecificError;
+
+typedef struct _MSMCAEvent_InvalidError {
+ ULONGLONG RecordId;
+ UCHAR ErrorSeverity;
+ ULONG Type;
+ ULONG Cpu;
+ ULONG AdditionalErrors;
+ ULONG LogToEventlog;
+ ULONG Size;
+ UCHAR RawRecord[1];
+} MSMCAEvent_InvalidError, *PMSMCAEvent_InvalidError;
+
+typedef struct _MSMCAEvent_MemoryPageRemoved {
+ ULONGLONG PhysicalAddress;
+} MSMCAEvent_MemoryPageRemoved, *PMSMCAEvent_MemoryPageRemoved;
+
+typedef struct _MSMCAInfo_Entry {
+ ULONG Length;
+ UCHAR Data[1];
+} MSMCAInfo_Entry, *PMSMCAInfo_Entry;
+
+typedef struct _MSMCAInfo_RawMCAData {
+ ULONG Count;
+ MSMCAInfo_Entry Records[1];
+} MSMCAInfo_RawMCAData, *PMSMCAInfo_RawMCAData;
+
+typedef struct _MSMCAInfo_RawCMCEvent {
+ ULONG Count;
+ MSMCAInfo_Entry Records[1];
+} MSMCAInfo_RawCMCEvent, *PMSMCAInfo_RawCMCEvent;
+
+typedef struct _MSMCAInfo_RawMCAEvent {
+ ULONG Count;
+ MSMCAInfo_Entry Records[1];
+} MSMCAInfo_RawMCAEvent, *PMSMCAInfo_RawMCAEvent;
+
+typedef struct _MSMCAInfo_RawCorrectedPlatformEvent {
+ ULONG Count;
+ MSMCAInfo_Entry Records[1];
+} MSMCAInfo_RawCorrectedPlatformEvent, *PMSMCAInfo_RawCorrectedPlatformEvent;
+
+typedef struct _MSPower_DeviceEnable {
+ BOOLEAN Enable;
+} MSPower_DeviceEnable, *PMSPower_DeviceEnable;
+
+typedef struct _MSPower_DeviceWakeEnable {
+ BOOLEAN Enable;
+} MSPower_DeviceWakeEnable, *PMSPower_DeviceWakeEnable;
+
+typedef struct _MSNdis_NetworkAddress {
+ UCHAR Address[6];
+} MSNdis_NetworkAddress, *PMSNdis_NetworkAddress;
+
+typedef struct _MSNdis_NetworkShortAddress {
+ UCHAR Address[2];
+} MSNdis_NetworkShortAddress, *PMSNdis_NetworkShortAddress;
+
+typedef struct _MSNdis_NetworkLinkSpeed {
+ ULONG Outbound;
+ ULONG Inbound;
+} MSNdis_NetworkLinkSpeed, *PMSNdis_NetworkLinkSpeed;
+
+typedef struct _MSNdis_EnumerateAdapter {
+ CHAR VariableData[1];
+} MSNdis_EnumerateAdapter, *PMSNdis_EnumerateAdapter;
+
+typedef struct _MSNdis_NotifyAdapterRemoval {
+ CHAR VariableData[1];
+} MSNdis_NotifyAdapterRemoval, *PMSNdis_NotifyAdapterRemoval;
+
+typedef struct _MSNdis_NotifyAdapterArrival {
+ CHAR VariableData[1];
+} MSNdis_NotifyAdapterArrival, *PMSNdis_NotifyAdapterArrival;
+
+typedef struct _MSNdis_DeviceWakeOnMagicPacketOnly {
+ BOOLEAN EnableWakeOnMagicPacketOnly;
+} MSNdis_DeviceWakeOnMagicPacketOnly, *PMSNdis_DeviceWakeOnMagicPacketOnly;
+
+typedef struct _MSNdis_RSSEnabled {
+ BOOLEAN RSSEnabled;
+} MSNdis_RSSEnabled, *PMSNdis_RSSEnabled;
+
+typedef struct _MSNdis_HardwareStatus {
+ ULONG NdisHardwareStatus;
+} MSNdis_HardwareStatus, *PMSNdis_HardwareStatus;
+
+typedef struct _MSNdis_MediaSupported {
+ ULONG NumberElements;
+ ULONG NdisMediaSupported[1];
+} MSNdis_MediaSupported, *PMSNdis_MediaSupported;
+
+typedef struct _MSNdis_MediaInUse {
+ ULONG NumberElements;
+ ULONG NdisMediaInUse[1];
+} MSNdis_MediaInUse, *PMSNdis_MediaInUse;
+
+typedef struct _MSNdis_MaximumLookahead {
+ ULONG NdisMaximumLookahead;
+} MSNdis_MaximumLookahead, *PMSNdis_MaximumLookahead;
+
+typedef struct _MSNdis_MaximumFrameSize {
+ ULONG NdisMaximumFrameSize;
+} MSNdis_MaximumFrameSize, *PMSNdis_MaximumFrameSize;
+
+typedef struct _MSNdis_LinkSpeed {
+ ULONG NdisLinkSpeed;
+} MSNdis_LinkSpeed, *PMSNdis_LinkSpeed;
+
+typedef struct _MSNdis_TransmitBufferSpace {
+ ULONG NdisTransmitBufferSpace;
+} MSNdis_TransmitBufferSpace, *PMSNdis_TransmitBufferSpace;
+
+typedef struct _MSNdis_ReceiveBufferSpace {
+ ULONG NdisReceiveBufferSpace;
+} MSNdis_ReceiveBufferSpace, *PMSNdis_ReceiveBufferSpace;
+
+typedef struct _MSNdis_TransmitBlockSize {
+ ULONG NdisTransmitBlockSize;
+} MSNdis_TransmitBlockSize, *PMSNdis_TransmitBlockSize;
+
+typedef struct _MSNdis_ReceiveBlockSize {
+ ULONG NdisReceiveBlockSize;
+} MSNdis_ReceiveBlockSize, *PMSNdis_ReceiveBlockSize;
+
+typedef struct _MSNdis_VendorID {
+ ULONG NdisVendorID;
+} MSNdis_VendorID, *PMSNdis_VendorID;
+
+typedef struct _MSNdis_VendorDescription {
+ CHAR VariableData[1];
+} MSNdis_VendorDescription, *PMSNdis_VendorDescription;
+
+typedef struct _MSNdis_CurrentPacketFilter {
+ ULONG NdisCurrentPacketFilter;
+} MSNdis_CurrentPacketFilter, *PMSNdis_CurrentPacketFilter;
+
+typedef struct _MSNdis_CurrentLookahead {
+ ULONG NdisCurrentLookahead;
+} MSNdis_CurrentLookahead, *PMSNdis_CurrentLookahead;
+
+typedef struct _MSNdis_DriverVersion {
+ USHORT NdisDriverVersion;
+} MSNdis_DriverVersion, *PMSNdis_DriverVersion;
+
+typedef struct _MSNdis_MaximumTotalSize {
+ ULONG NdisMaximumTotalSize;
+} MSNdis_MaximumTotalSize, *PMSNdis_MaximumTotalSize;
+
+typedef struct _MSNdis_MacOptions {
+ ULONG NdisMacOptions;
+} MSNdis_MacOptions, *PMSNdis_MacOptions;
+
+typedef struct _MSNdis_MediaConnectStatus {
+ ULONG NdisMediaConnectStatus;
+} MSNdis_MediaConnectStatus, *PMSNdis_MediaConnectStatus;
+
+typedef struct _MSNdis_MaximumSendPackets {
+ ULONG NdisMaximumSendPackets;
+} MSNdis_MaximumSendPackets, *PMSNdis_MaximumSendPackets;
+
+typedef struct _MSNdis_VendorDriverVersion {
+ ULONG NdisVendorDriverVersion;
+} MSNdis_VendorDriverVersion, *PMSNdis_VendorDriverVersion;
+
+typedef struct _MSNdis_VlanIdentifier {
+ ULONG NdisVlanId;
+} MSNdis_VlanIdentifier, *PMSNdis_VlanIdentifier;
+
+typedef struct _MSNdis_PhysicalMediumType {
+ ULONG NdisPhysicalMediumType;
+} MSNdis_PhysicalMediumType, *PMSNdis_PhysicalMediumType;
+
+typedef struct _MSNdis_TransmitsOk {
+ ULONGLONG NdisTransmitsOk;
+} MSNdis_TransmitsOk, *PMSNdis_TransmitsOk;
+
+typedef struct _MSNdis_ReceivesOk {
+ ULONGLONG NdisReceivesOk;
+} MSNdis_ReceivesOk, *PMSNdis_ReceivesOk;
+
+typedef struct _MSNdis_TransmitsError {
+ ULONG NdisTransmitsError;
+} MSNdis_TransmitsError, *PMSNdis_TransmitsError;
+
+typedef struct _MSNdis_ReceiveError {
+ ULONG NdisReceiveError;
+} MSNdis_ReceiveError, *PMSNdis_ReceiveError;
+
+typedef struct _MSNdis_ReceiveNoBuffer {
+ ULONG NdisReceiveNoBuffer;
+} MSNdis_ReceiveNoBuffer, *PMSNdis_ReceiveNoBuffer;
+
+typedef struct _MSNdis_CoHardwareStatus {
+ ULONG NdisCoHardwareStatus;
+} MSNdis_CoHardwareStatus, *PMSNdis_CoHardwareStatus;
+
+typedef struct _MSNdis_CoMediaSupported {
+ ULONG NumberElements;
+ ULONG NdisCoMediaSupported[1];
+} MSNdis_CoMediaSupported, *PMSNdis_CoMediaSupported;
+
+typedef struct _MSNdis_CoMediaInUse {
+ ULONG NumberElements;
+ ULONG NdisCoMediaInUse[1];
+} MSNdis_CoMediaInUse, *PMSNdis_CoMediaInUse;
+
+typedef struct _MSNdis_CoLinkSpeed {
+ MSNdis_NetworkLinkSpeed NdisCoLinkSpeed;
+} MSNdis_CoLinkSpeed, *PMSNdis_CoLinkSpeed;
+
+typedef struct _MSNdis_CoVendorId {
+ ULONG NdisCoVendorID;
+} MSNdis_CoVendorId, *PMSNdis_CoVendorId;
+
+typedef struct _MSNdis_CoVendorDescription {
+ CHAR VariableData[1];
+} MSNdis_CoVendorDescription, *PMSNdis_CoVendorDescription;
+
+typedef struct _MSNdis_CoDriverVersion {
+ USHORT NdisCoDriverVersion;
+} MSNdis_CoDriverVersion, *PMSNdis_CoDriverVersion;
+
+typedef struct _MSNdis_CoMacOptions {
+ ULONG NdisCoMacOptions;
+} MSNdis_CoMacOptions, *PMSNdis_CoMacOptions;
+
+typedef struct _MSNdis_CoMediaConnectStatus {
+ ULONG NdisCoMediaConnectStatus;
+} MSNdis_CoMediaConnectStatus, *PMSNdis_CoMediaConnectStatus;
+
+typedef struct _MSNdis_CoVendorDriverVersion {
+ ULONG NdisCoVendorDriverVersion;
+} MSNdis_CoVendorDriverVersion, *PMSNdis_CoVendorDriverVersion;
+
+typedef struct _MSNdis_CoMinimumLinkSpeed {
+ MSNdis_NetworkLinkSpeed NdisCoMinimumLinkSpeed;
+} MSNdis_CoMinimumLinkSpeed, *PMSNdis_CoMinimumLinkSpeed;
+
+typedef struct _MSNdis_CoTransmitPdusOk {
+ ULONGLONG NdisCoTransmitPdusOk;
+} MSNdis_CoTransmitPdusOk, *PMSNdis_CoTransmitPdusOk;
+
+typedef struct _MSNdis_CoReceivePdusOk {
+ ULONGLONG NdisCoReceivePdusOk;
+} MSNdis_CoReceivePdusOk, *PMSNdis_CoReceivePdusOk;
+
+typedef struct _MSNdis_CoTransmitPduErrors {
+ ULONG NdisCoTransmitPduErrors;
+} MSNdis_CoTransmitPduErrors, *PMSNdis_CoTransmitPduErrors;
+
+typedef struct _MSNdis_CoReceivePduErrors {
+ ULONG NdisCoReceivePduErrors;
+} MSNdis_CoReceivePduErrors, *PMSNdis_CoReceivePduErrors;
+
+typedef struct _MSNdis_CoReceivePdusNoBuffer {
+ ULONG NdisCoReceivePdusNoBuffer;
+} MSNdis_CoReceivePdusNoBuffer, *PMSNdis_CoReceivePdusNoBuffer;
+
+typedef struct _MSNdis_AtmSupportedVcRates {
+ ULONG MinCellRate;
+ ULONG MaxCellRate;
+} MSNdis_AtmSupportedVcRates, *PMSNdis_AtmSupportedVcRates;
+
+typedef struct _MSNdis_AtmSupportedServiceCategory {
+ ULONG NdisAtmSupportedServiceCategory;
+} MSNdis_AtmSupportedServiceCategory, *PMSNdis_AtmSupportedServiceCategory;
+
+typedef struct _MSNdis_AtmSupportedAalTypes {
+ ULONG NdisAtmSupportedAalTypes;
+} MSNdis_AtmSupportedAalTypes, *PMSNdis_AtmSupportedAalTypes;
+
+typedef struct _MSNdis_AtmHardwareCurrentAddress {
+ MSNdis_NetworkAddress NdisAtmHardwareCurrentAddress;
+} MSNdis_AtmHardwareCurrentAddress, *PMSNdis_AtmHardwareCurrentAddress;
+
+typedef struct _MSNdis_AtmMaxActiveVcs {
+ ULONG NdisAtmMaxActiveVcs;
+} MSNdis_AtmMaxActiveVcs, *PMSNdis_AtmMaxActiveVcs;
+
+typedef struct _MSNdis_AtmMaxActiveVciBits {
+ ULONG NdisAtmMaxActiveVciBits;
+} MSNdis_AtmMaxActiveVciBits, *PMSNdis_AtmMaxActiveVciBits;
+
+typedef struct _MSNdis_AtmMaxActiveVpiBits {
+ ULONG NdisAtmMaxActiveVpiBits;
+} MSNdis_AtmMaxActiveVpiBits, *PMSNdis_AtmMaxActiveVpiBits;
+
+typedef struct _MSNdis_AtmMaxAal0PacketSize {
+ ULONG NdisAtmMaxAal0PacketSize;
+} MSNdis_AtmMaxAal0PacketSize, *PMSNdis_AtmMaxAal0PacketSize;
+
+typedef struct _MSNdis_AtmMaxAal1PacketSize {
+ ULONG NdisAtmMaxAal1PacketSize;
+} MSNdis_AtmMaxAal1PacketSize, *PMSNdis_AtmMaxAal1PacketSize;
+
+typedef struct _MSNdis_AtmMaxAal34PacketSize {
+ ULONG NdisAtmMaxAal34PacketSize;
+} MSNdis_AtmMaxAal34PacketSize, *PMSNdis_AtmMaxAal34PacketSize;
+
+typedef struct _MSNdis_AtmMaxAal5PacketSize {
+ ULONG NdisAtmMaxAal5PacketSize;
+} MSNdis_AtmMaxAal5PacketSize, *PMSNdis_AtmMaxAal5PacketSize;
+
+typedef struct _MSNdis_AtmReceiveCellsOk {
+ ULONGLONG NdisAtmReceiveCellsOk;
+} MSNdis_AtmReceiveCellsOk, *PMSNdis_AtmReceiveCellsOk;
+
+typedef struct _MSNdis_AtmTransmitCellsOk {
+ ULONGLONG NdisAtmTransmitCellsOk;
+} MSNdis_AtmTransmitCellsOk, *PMSNdis_AtmTransmitCellsOk;
+
+typedef struct _MSNdis_AtmReceiveCellsDropped {
+ ULONGLONG NdisAtmReceiveCellsDropped;
+} MSNdis_AtmReceiveCellsDropped, *PMSNdis_AtmReceiveCellsDropped;
+
+typedef struct _MSNdis_EthernetPermanentAddress {
+ MSNdis_NetworkAddress NdisPermanentAddress;
+} MSNdis_EthernetPermanentAddress, *PMSNdis_EthernetPermanentAddress;
+
+typedef struct _MSNdis_EthernetCurrentAddress {
+ MSNdis_NetworkAddress NdisCurrentAddress;
+} MSNdis_EthernetCurrentAddress, *PMSNdis_EthernetCurrentAddress;
+
+typedef struct _MSNdis_EthernetMulticastList {
+ ULONG NumberElements;
+ MSNdis_NetworkAddress NdisMulticastList[1];
+} MSNdis_EthernetMulticastList, *PMSNdis_EthernetMulticastList;
+
+typedef struct _MSNdis_EthernetMaximumMulticastListSize {
+ ULONG NdisEthernetMaximumMulticastListSize;
+} MSNdis_EthernetMaximumMulticastListSize, *PMSNdis_EthernetMaximumMulticastListSize;
+
+typedef struct _MSNdis_EthernetMacOptions {
+ ULONG NdisEthernetMacOptions;
+} MSNdis_EthernetMacOptions, *PMSNdis_EthernetMacOptions;
+
+typedef struct _MSNdis_EthernetReceiveErrorAlignment {
+ ULONG NdisEthernetReceiveErrorAlignment;
+} MSNdis_EthernetReceiveErrorAlignment, *PMSNdis_EthernetReceiveErrorAlignment;
+
+typedef struct _MSNdis_EthernetOneTransmitCollision {
+ ULONG NdisEthernetOneTransmitCollision;
+} MSNdis_EthernetOneTransmitCollision, *PMSNdis_EthernetOneTransmitCollision;
+
+typedef struct _MSNdis_EthernetMoreTransmitCollisions {
+ ULONG NdisEthernetMoreTransmitCollisions;
+} MSNdis_EthernetMoreTransmitCollisions, *PMSNdis_EthernetMoreTransmitCollisions;
+
+typedef struct _MSNdis_TokenRingPermanentAddress {
+ MSNdis_NetworkAddress NdisPermanentAddress;
+} MSNdis_TokenRingPermanentAddress, *PMSNdis_TokenRingPermanentAddress;
+
+typedef struct _MSNdis_TokenRingCurrentAddress {
+ MSNdis_NetworkAddress NdisCurrentAddress;
+} MSNdis_TokenRingCurrentAddress, *PMSNdis_TokenRingCurrentAddress;
+
+typedef struct _MSNdis_TokenRingCurrentFunctional {
+ ULONG NdisTokenRingCurrentFunctional;
+} MSNdis_TokenRingCurrentFunctional, *PMSNdis_TokenRingCurrentFunctional;
+
+typedef struct _MSNdis_TokenRingCurrentGroup {
+ ULONG NdisTokenRingCurrentGroup;
+} MSNdis_TokenRingCurrentGroup, *PMSNdis_TokenRingCurrentGroup;
+
+typedef struct _MSNdis_TokenRingLastOpenStatus {
+ ULONG NdisTokenRingLastOpenStatus;
+} MSNdis_TokenRingLastOpenStatus, *PMSNdis_TokenRingLastOpenStatus;
+
+typedef struct _MSNdis_TokenRingCurrentRingStatus {
+ ULONG NdisTokenRingCurrentRingStatus;
+} MSNdis_TokenRingCurrentRingStatus, *PMSNdis_TokenRingCurrentRingStatus;
+
+typedef struct _MSNdis_TokenRingCurrentRingState {
+ ULONG NdisTokenRingCurrentRingState;
+} MSNdis_TokenRingCurrentRingState, *PMSNdis_TokenRingCurrentRingState;
+
+typedef struct _MSNdis_TokenRingLineErrors {
+ ULONG NdisTokenRingLineErrors;
+} MSNdis_TokenRingLineErrors, *PMSNdis_TokenRingLineErrors;
+
+typedef struct _MSNdis_TokenRingLostFrames {
+ ULONG NdisTokenRingLostFrames;
+} MSNdis_TokenRingLostFrames, *PMSNdis_TokenRingLostFrames;
+
+typedef struct _MSNdis_FddiLongPermanentAddress {
+ MSNdis_NetworkAddress NdisPermanentAddress;
+} MSNdis_FddiLongPermanentAddress, *PMSNdis_FddiLongPermanentAddress;
+
+typedef struct _MSNdis_FddiLongCurrentAddress {
+ MSNdis_NetworkAddress NdisCurrentAddress;
+} MSNdis_FddiLongCurrentAddress, *PMSNdis_FddiLongCurrentAddress;
+
+typedef struct _MSNdis_FddiLongMulticastList {
+ ULONG NumberElements;
+ MSNdis_NetworkAddress NdisMulticastList[1];
+} MSNdis_FddiLongMulticastList, *PMSNdis_FddiLongMulticastList;
+
+typedef struct _MSNdis_FddiLongMaximumListSize {
+ ULONG NdisFddiLongMaximumListSize;
+} MSNdis_FddiLongMaximumListSize, *PMSNdis_FddiLongMaximumListSize;
+
+typedef struct _MSNdis_FddiShortPermanentAddress {
+ MSNdis_NetworkShortAddress NdisPermanentAddress;
+} MSNdis_FddiShortPermanentAddress, *PMSNdis_FddiShortPermanentAddress;
+
+typedef struct _MSNdis_FddiShortCurrentAddress {
+ MSNdis_NetworkShortAddress NdisCurrentAddress;
+} MSNdis_FddiShortCurrentAddress, *PMSNdis_FddiShortCurrentAddress;
+
+typedef struct _MSNdis_FddiShortMulticastList {
+ ULONG NumberElements;
+ MSNdis_NetworkShortAddress NdisMulticastList[1];
+} MSNdis_FddiShortMulticastList, *PMSNdis_FddiShortMulticastList;
+
+typedef struct _MSNdis_FddiShortMaximumListSize {
+ ULONG NdisFddiShortMaximumListSize;
+} MSNdis_FddiShortMaximumListSize, *PMSNdis_FddiShortMaximumListSize;
+
+typedef struct _MSNdis_FddiAttachmentType {
+ ULONG NdisFddiAttachmentType;
+} MSNdis_FddiAttachmentType, *PMSNdis_FddiAttachmentType;
+
+typedef struct _MSNdis_FddiUpstreamNodeLong {
+ MSNdis_NetworkAddress NdisFddiUpstreamNodeLong;
+} MSNdis_FddiUpstreamNodeLong, *PMSNdis_FddiUpstreamNodeLong;
+
+typedef struct _MSNdis_FddiDownstreamNodeLong {
+ MSNdis_NetworkAddress NdisFddiDownstreamNodeLong;
+} MSNdis_FddiDownstreamNodeLong, *PMSNdis_FddiDownstreamNodeLong;
+
+typedef struct _MSNdis_FddiFrameErrors {
+ ULONG NdisFddiFrameErrors;
+} MSNdis_FddiFrameErrors, *PMSNdis_FddiFrameErrors;
+
+typedef struct _MSNdis_FddiFramesLost {
+ ULONG NdisFddiFramesLost;
+} MSNdis_FddiFramesLost, *PMSNdis_FddiFramesLost;
+
+typedef struct _MSNdis_FddiRingManagmentState {
+ ULONG NdisFddiRingManagmentState;
+} MSNdis_FddiRingManagmentState, *PMSNdis_FddiRingManagmentState;
+
+typedef struct _MSNdis_FddiLctFailures {
+ ULONG NdisFddiLctFailures;
+} MSNdis_FddiLctFailures, *PMSNdis_FddiLctFailures;
+
+typedef struct _MSNdis_FddiLemRejects {
+ ULONG NdisFddiLemRejects;
+} MSNdis_FddiLemRejects, *PMSNdis_FddiLemRejects;
+
+typedef struct _MSNdis_FddiLConnectionState {
+ ULONG NdisFddiLConnectionState;
+} MSNdis_FddiLConnectionState, *PMSNdis_FddiLConnectionState;
+
+typedef struct _MSNdis_ObjectHeader {
+ UCHAR Type;
+ UCHAR Revision;
+ USHORT Size;
+} MSNdis_ObjectHeader, *PMSNdis_ObjectHeader;
+
+typedef struct _MSNdis_WmiMethodHeader {
+ MSNdis_ObjectHeader Header;
+ ULONG PortNumber;
+ ULONGLONG NetLuid;
+ ULONGLONG RequestId;
+ ULONG Timeout;
+ ULONG Padding;
+} MSNdis_WmiMethodHeader, *PMSNdis_WmiMethodHeader;
+
+typedef struct _MSNdis_WmiSetHeader {
+ MSNdis_ObjectHeader Header;
+ ULONG PortNumber;
+ ULONGLONG NetLuid;
+ ULONGLONG RequestId;
+ ULONG Timeout;
+ ULONG Padding;
+} MSNdis_WmiSetHeader, *PMSNdis_WmiSetHeader;
+
+typedef struct _MSNdis_WmiOutputInfo {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ UCHAR SupportedRevision;
+ UCHAR Padding1;
+ USHORT Padding2;
+ ULONG DataOffset;
+} MSNdis_WmiOutputInfo, *PMSNdis_WmiOutputInfo;
+
+typedef struct _MSNdis_WmiEnumAdapter {
+ MSNdis_ObjectHeader Header;
+ ULONG IfIndex;
+ ULONGLONG NetLuid;
+ CHAR VariableData[1];
+} MSNdis_WmiEnumAdapter, *PMSNdis_WmiEnumAdapter;
+
+typedef struct _MSNdis_LinkStateData {
+ MSNdis_ObjectHeader Header;
+ ULONG MediaConnectState;
+ ULONG MediaDuplexState;
+ ULONGLONG XmitLinkSpeed;
+ ULONGLONG RcvLinkSpeed;
+ ULONG PauseFunctions;
+ ULONG AutoNegotiationFlags;
+} MSNdis_LinkStateData, *PMSNdis_LinkStateData;
+
+typedef struct _MSNdis_LinkParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG MediaDuplexState;
+ ULONGLONG XmitLinkSpeed;
+ ULONGLONG RcvLinkSpeed;
+ ULONG PauseFunctions;
+ ULONG AutoNegotiationFlags;
+} MSNdis_LinkParameters, *PMSNdis_LinkParameters;
+
+typedef struct _MSNdis_InterruptModerationParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG InterruptModeration;
+} MSNdis_InterruptModerationParameters, *PMSNdis_InterruptModerationParameters;
+
+typedef struct _MSNdis_StatisticsInfo {
+ MSNdis_ObjectHeader Header;
+ ULONG SupportedStatistics;
+ ULONGLONG ifInDiscards;
+ ULONGLONG ifInErrors;
+ ULONGLONG ifHCInOctets;
+ ULONGLONG ifHCInUcastPkts;
+ ULONGLONG ifHCInMulticastPkts;
+ ULONGLONG ifHCInBroadcastPkts;
+ ULONGLONG ifHCOutOctets;
+ ULONGLONG ifHCOutUcastPkts;
+ ULONGLONG ifHCOutMulticastPkts;
+ ULONGLONG ifHCOutBroadcastPkts;
+ ULONGLONG ifOutErrors;
+ ULONGLONG ifOutDiscards;
+ ULONGLONG ifHCInUcastOctets;
+ ULONGLONG ifHCInMulticastOctets;
+ ULONGLONG ifHCInBroadcastOctets;
+ ULONGLONG ifHCOutUcastOctets;
+ ULONGLONG ifHCOutMulticastOctets;
+ ULONGLONG ifHCOutBroadcastOctets;
+} MSNdis_StatisticsInfo, *PMSNdis_StatisticsInfo;
+
+typedef struct _MSNdis_PortStateData {
+ MSNdis_ObjectHeader Header;
+ ULONG MediaConnectState;
+ ULONGLONG XmitLinkSpeed;
+ ULONGLONG RcvLinkSpeed;
+ ULONG Direction;
+ ULONG SendControlState;
+ ULONG RcvControlState;
+ ULONG SendAuthorizationState;
+ ULONG RcvAuthorizationState;
+ ULONG Flags;
+} MSNdis_PortStateData, *PMSNdis_PortStateData;
+
+typedef struct _MSNdis_PortAuthParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG SendControlState;
+ ULONG RcvControlState;
+ ULONG SendAuthorizationState;
+ ULONG RcvAuthorizationState;
+} MSNdis_PortAuthParameters, *PMSNdis_PortAuthParameters;
+
+typedef struct _MSNdis_PortChar {
+ MSNdis_ObjectHeader Header;
+ ULONG PortNumber;
+ ULONG Flags;
+ ULONG Type;
+ ULONG MediaConnectState;
+ ULONGLONG XmitLinkSpeed;
+ ULONGLONG RcvLinkSpeed;
+ ULONG Direction;
+ ULONG SendControlState;
+ ULONG RcvControlState;
+ ULONG SendAuthorizationState;
+ ULONG RcvAuthorizationState;
+} MSNdis_PortChar, *PMSNdis_PortChar;
+
+typedef struct _MSNdis_PortArray {
+ MSNdis_ObjectHeader Header;
+ ULONG NumberOfPorts;
+ ULONG OffsetFirstPort;
+ ULONG ElementSize;
+ MSNdis_PortChar Port[1];
+} MSNdis_PortArray, *PMSNdis_PortArray;
+
+typedef struct _MSNdis_PciDeviceProperty {
+ MSNdis_ObjectHeader Header;
+ ULONG DeviceType;
+ ULONG CurrentSpeedAndMode;
+ ULONG CurrentPayloadSize;
+ ULONG MaxPayloadSize;
+ ULONG MaxReadRequestSize;
+ ULONG CurrentLinkSpeed;
+ ULONG CurrentLinkWidth;
+ ULONG MaxLinkSpeed;
+ ULONG MaxLinkWidth;
+} MSNdis_PciDeviceProperty, *PMSNdis_PciDeviceProperty;
+
+typedef struct _MSNdis_WmiTcpLargeSendOffloadV1_IPv4 {
+ ULONG Encapsulation;
+ ULONG MaxOffLoadSize;
+ ULONG MinSegmentCount;
+ ULONG TcpOptions;
+ ULONG IpOptions;
+} MSNdis_WmiTcpLargeSendOffloadV1_IPv4, *PMSNdis_WmiTcpLargeSendOffloadV1_IPv4;
+
+typedef struct _MSNdis_WmiTcpLargeSendOffloadV1 {
+ MSNdis_WmiTcpLargeSendOffloadV1_IPv4 WmiIPv4;
+} MSNdis_WmiTcpLargeSendOffloadV1, *PMSNdis_WmiTcpLargeSendOffloadV1;
+
+typedef struct _MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive {
+ ULONG Encapsulation;
+ ULONG IpOptionsSupported;
+ ULONG TcpOptionsSupported;
+ ULONG TcpChecksum;
+ ULONG UdpChecksum;
+ ULONG IpChecksum;
+} MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive, *PMSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive;
+
+typedef struct _MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive {
+ ULONG Encapsulation;
+ ULONG IpExtensionHeadersSupported;
+ ULONG TcpOptionsSupported;
+ ULONG TcpChecksum;
+ ULONG UdpChecksum;
+} MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive, *PMSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive;
+
+typedef struct _MSNdis_WmiTcpIpChecksumOffload {
+ MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive IPv4Transmit;
+ MSNdis_WmiTcpIpChecksumOffload_IPv4TransmitReceive IPv4Receive;
+ MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive IPv6Transmit;
+ MSNdis_WmiTcpIpChecksumOffload_IPv6TransmitReceive IPv6Receive;
+} MSNdis_WmiTcpIpChecksumOffload, *PMSNdis_WmiTcpIpChecksumOffload;
+
+typedef struct _MSNdis_WmiIPSecOffloadV1_Supported {
+ ULONG Encapsulation;
+ ULONG AhEspCombined;
+ ULONG TransportTunnelCombined;
+ ULONG IPv4Options;
+ ULONG Flags;
+} MSNdis_WmiIPSecOffloadV1_Supported, *PMSNdis_WmiIPSecOffloadV1_Supported;
+
+typedef struct _MSNdis_WmiIPSecOffloadV1_IPv4AH {
+ ULONG Md5;
+ ULONG Sha_1;
+ ULONG Transport;
+ ULONG Tunnel;
+ ULONG Send;
+ ULONG Receive;
+} MSNdis_WmiIPSecOffloadV1_IPv4AH, *PMSNdis_WmiIPSecOffloadV1_IPv4AH;
+
+typedef struct _MSNdis_WmiIPSecOffloadV1_IPv4ESP {
+ ULONG Des;
+ ULONG Reserved;
+ ULONG TripleDes;
+ ULONG NullEsp;
+ ULONG Transport;
+ ULONG Tunnel;
+ ULONG Send;
+ ULONG Receive;
+} MSNdis_WmiIPSecOffloadV1_IPv4ESP, *PMSNdis_WmiIPSecOffloadV1_IPv4ESP;
+
+typedef struct _MSNdis_WmiIPSecOffloadV1 {
+ MSNdis_WmiIPSecOffloadV1_Supported WmiSupported;
+ MSNdis_WmiIPSecOffloadV1_IPv4AH WmiIPv4AH;
+ MSNdis_WmiIPSecOffloadV1_IPv4ESP WmiIPv4ESP;
+} MSNdis_WmiIPSecOffloadV1, *PMSNdis_WmiIPSecOffloadV1;
+
+typedef struct _MSNdis_WmiTcpLargeSendOffloadV2_IPv4 {
+ ULONG Encapsulation;
+ ULONG MaxOffLoadSize;
+ ULONG MinSegmentCount;
+} MSNdis_WmiTcpLargeSendOffloadV2_IPv4, *PMSNdis_WmiTcpLargeSendOffloadV2_IPv4;
+
+typedef struct _MSNdis_WmiTcpLargeSendOffloadV2_IPv6 {
+ ULONG Encapsulation;
+ ULONG MaxOffLoadSize;
+ ULONG MinSegmentCount;
+ ULONG IpExtensionHeadersSupported;
+ ULONG TcpOptionsSupported;
+} MSNdis_WmiTcpLargeSendOffloadV2_IPv6, *PMSNdis_WmiTcpLargeSendOffloadV2_IPv6;
+
+typedef struct _MSNdis_WmiTcpLargeSendOffloadV2 {
+ MSNdis_WmiTcpLargeSendOffloadV2_IPv4 WmiIPv4;
+ MSNdis_WmiTcpLargeSendOffloadV2_IPv6 WmiIPv6;
+} MSNdis_WmiTcpLargeSendOffloadV2, *PMSNdis_WmiTcpLargeSendOffloadV2;
+
+typedef struct _MSNdis_WmiOffload {
+ MSNdis_ObjectHeader Header;
+ MSNdis_WmiTcpIpChecksumOffload Checksum;
+ MSNdis_WmiTcpLargeSendOffloadV1 LsoV1;
+ MSNdis_WmiIPSecOffloadV1 IPsecV1;
+ MSNdis_WmiTcpLargeSendOffloadV2 LsoV2;
+ ULONG Flags;
+} MSNdis_WmiOffload, *PMSNdis_WmiOffload;
+
+typedef struct _MSNdis_TcpOffloadParameters {
+ MSNdis_ObjectHeader Header;
+ UCHAR IPv4Checksum;
+ UCHAR TCPIPv4Checksum;
+ UCHAR UDPIPv4Checksum;
+ UCHAR TCPIPv6Checksum;
+ UCHAR UDPIPv6Checksum;
+ UCHAR LsoV1;
+ UCHAR IPsec;
+ UCHAR LsoV2IPv4;
+ UCHAR LsoV2IPv6;
+ UCHAR TcpConnectionIPv4;
+ UCHAR TcpConnectionIPv6;
+ ULONG Flags;
+} MSNdis_TcpOffloadParameters, *PMSNdis_TcpOffloadParameters;
+
+typedef struct _MSNdis_WmiTcpConnectionOffload {
+ MSNdis_ObjectHeader Header;
+ ULONG Encapsulation;
+ ULONG SupportIp4;
+ ULONG SupportIp6;
+ ULONG SupportIp6ExtensionHeaders;
+ ULONG SupportSack;
+ ULONG TcpConnectionOffloadCapacity;
+ ULONG Flags;
+} MSNdis_WmiTcpConnectionOffload, *PMSNdis_WmiTcpConnectionOffload;
+
+typedef struct _MSNdis_WmiHDSplitCurrentConfig {
+ MSNdis_ObjectHeader Header;
+ ULONG HardwareCapabilities;
+ ULONG CurrentCapabilities;
+ ULONG HDSplitFlags;
+ ULONG HDSplitCombineFlags;
+ ULONG BackfillSize;
+ ULONG MaxHeaderSize;
+} MSNdis_WmiHDSplitCurrentConfig, *PMSNdis_WmiHDSplitCurrentConfig;
+
+typedef struct _MSNdis_HDSplitParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG HDSplitCombineFlags;
+} MSNdis_HDSplitParameters, *PMSNdis_HDSplitParameters;
+
+typedef struct _MSNdis_WmiReceiveScaleCapabilities {
+ MSNdis_ObjectHeader Header;
+ ULONG CapabilitiesFlags;
+ ULONG NumberOfInterruptMessages;
+ ULONG NumberOfReceiveQueues;
+} MSNdis_WmiReceiveScaleCapabilities, *PMSNdis_WmiReceiveScaleCapabilities;
+
+typedef struct _MSNdis_ReceiveFilterCapabilities {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG EnabledFilterTypes;
+ ULONG EnabledQueueTypes;
+ ULONG NumQueues;
+ ULONG SupportedQueueProperties;
+ ULONG SupportedFilterTests;
+ ULONG SupportedHeaders;
+ ULONG SupportedMacHeaderFields;
+ ULONG MaxMacHeaderFilters;
+ ULONG MaxQueueGroups;
+ ULONG MaxQueuesPerQueueGroup;
+ ULONG MinLookaheadSplitSize;
+ ULONG MaxLookaheadSplitSize;
+} MSNdis_ReceiveFilterCapabilities, *PMSNdis_ReceiveFilterCapabilities;
+
+typedef struct _MSNdis_ReceiveFilterGlobalParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG EnabledFilterTypes;
+ ULONG EnabledQueueTypes;
+} MSNdis_ReceiveFilterGlobalParameters, *PMSNdis_ReceiveFilterGlobalParameters;
+
+typedef struct _MSNdis_CountedString {
+ USHORT Length;
+ SHORT String[257];
+} MSNdis_CountedString, *PMSNdis_CountedString;
+
+typedef struct _MSNdis_ReceiveFilterInfo {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG FilterType;
+ ULONG FilterId;
+} MSNdis_ReceiveFilterInfo, *PMSNdis_ReceiveFilterInfo;
+
+typedef struct _MSNdis_ReceiveFilterInfoArray {
+ MSNdis_ObjectHeader Header;
+ ULONG QueueId;
+ ULONG FirstElementOffset;
+ ULONG NumElements;
+ ULONG ElementSize;
+ MSNdis_ReceiveFilterInfo Filter[1];
+} MSNdis_ReceiveFilterInfoArray, *PMSNdis_ReceiveFilterInfoArray;
+
+typedef struct _MSNdis_ReceiveFilterFieldParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG FrameHeader;
+ ULONG ReceiveFilterTest;
+ ULONG MacHeaderField;
+ UCHAR FieldByteArrayValue[16];
+ UCHAR ResultByteArrayValue[16];
+} MSNdis_ReceiveFilterFieldParameters, *PMSNdis_ReceiveFilterFieldParameters;
+
+typedef struct _MSNdis_ReceiveFilterParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG FilterType;
+ ULONG QueueId;
+ ULONG FilterId;
+ ULONG FieldParametersArrayOffset;
+ ULONG FieldParametersArrayNumElements;
+ ULONG FieldParametersArrayElementSize;
+ ULONG RequestedFilterIdBitCount;
+ MSNdis_ReceiveFilterFieldParameters FieldParameters[1];
+} MSNdis_ReceiveFilterParameters, *PMSNdis_ReceiveFilterParameters;
+
+typedef struct _MSNdis_NicSwitchCapabilities {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG NdisReserved1;
+ ULONG NumTotalMacAddresses;
+ ULONG NumMacAddressesPerPort;
+ ULONG NumVlansPerPort;
+ ULONG NdisReserved2;
+ ULONG NdisReserved3;
+} MSNdis_NicSwitchCapabilities, *PMSNdis_NicSwitchCapabilities;
+
+typedef struct _MSNdis_GroupAffinity {
+ ULONGLONG Mask;
+ USHORT Group;
+ USHORT Reserved[3];
+} MSNdis_GroupAffinity, *PMSNdis_GroupAffinity;
+
+typedef struct _MSNdis_ReceiveQueueParameters {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG QueueType;
+ ULONG QueueId;
+ ULONG QueueGroupId;
+ MSNdis_GroupAffinity ProcessorAffinity;
+ ULONG NumSuggestedReceiveBuffers;
+ ULONG MSIXTableEntry;
+ ULONG LookaheadSize;
+ MSNdis_CountedString VmName;
+ MSNdis_CountedString QueueName;
+} MSNdis_ReceiveQueueParameters, *PMSNdis_ReceiveQueueParameters;
+
+typedef struct _MSNdis_ReceiveQueueInfo {
+ MSNdis_ObjectHeader Header;
+ ULONG Flags;
+ ULONG QueueType;
+ ULONG QueueId;
+ ULONG QueueGroupId;
+ ULONG QueueState;
+ MSNdis_GroupAffinity ProcessorAffinity;
+ ULONG NumSuggestedReceiveBuffers;
+ ULONG MSIXTableEntry;
+ ULONG LookaheadSize;
+ MSNdis_CountedString VmName;
+ MSNdis_CountedString QueueName;
+} MSNdis_ReceiveQueueInfo, *PMSNdis_ReceiveQueueInfo;
+
+typedef struct _MSNdis_ReceiveQueueInfoArray {
+ MSNdis_ObjectHeader Header;
+ ULONG FirstElementOffset;
+ ULONG NumElements;
+ ULONG ElementSize;
+ MSNdis_ReceiveQueueInfo Queue[1];
+} MSNdis_ReceiveQueueInfoArray, *PMSNdis_ReceiveQueueInfoArray;
+
+typedef struct _WmiQueryLinkState_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryLinkState_IN, *PWmiQueryLinkState_IN;
+
+typedef struct _WmiQueryLinkState_OUT {
+ MSNdis_LinkStateData LinkState;
+} WmiQueryLinkState_OUT, *PWmiQueryLinkState_OUT;
+
+typedef struct _WmiQueryInterruptModeration_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryInterruptModeration_IN, *PWmiQueryInterruptModeration_IN;
+
+typedef struct _WmiQueryInterruptModeration_OUT {
+ MSNdis_InterruptModerationParameters InterruptModeration;
+} WmiQueryInterruptModeration_OUT, *PWmiQueryInterruptModeration_OUT;
+
+typedef struct _WmiSetInterruptModeration_IN {
+ MSNdis_WmiMethodHeader MethodHeader;
+ MSNdis_InterruptModerationParameters InterruptModeration;
+} WmiSetInterruptModeration_IN, *PWmiSetInterruptModeration_IN;
+
+typedef struct _WmiSetInterruptModeration_OUT {
+ MSNdis_WmiOutputInfo OutputInfo;
+} WmiSetInterruptModeration_OUT, *PWmiSetInterruptModeration_OUT;
+
+typedef struct _WmiSetLinkParameters_IN {
+ MSNdis_WmiMethodHeader MethodHeader;
+ MSNdis_LinkParameters LinkParameters;
+} WmiSetLinkParameters_IN, *PWmiSetLinkParameters_IN;
+
+typedef struct _WmiSetLinkParameters_OUT {
+ MSNdis_WmiOutputInfo OutputInfo;
+} WmiSetLinkParameters_OUT, *PWmiSetLinkParameters_OUT;
+
+typedef struct _WmiQueryStatisticsInfo_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryStatisticsInfo_IN, *PWmiQueryStatisticsInfo_IN;
+
+typedef struct _WmiQueryStatisticsInfo_OUT {
+ MSNdis_StatisticsInfo StatisticsInfo;
+} WmiQueryStatisticsInfo_OUT, *PWmiQueryStatisticsInfo_OUT;
+
+typedef struct _WmiQueryPortState_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryPortState_IN, *PWmiQueryPortState_IN;
+
+typedef struct _WmiQueryPortState_OUT {
+ MSNdis_PortStateData PortState;
+} WmiQueryPortState_OUT, *PWmiQueryPortState_OUT;
+
+typedef struct _WmiEnumeratePorts_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiEnumeratePorts_IN, *PWmiEnumeratePorts_IN;
+
+typedef struct _WmiEnumeratePorts_OUT {
+ MSNdis_PortArray Ports;
+} WmiEnumeratePorts_OUT, *PWmiEnumeratePorts_OUT;
+
+typedef struct _WmiSetPortParameters_IN {
+ MSNdis_WmiMethodHeader MethodHeader;
+ MSNdis_PortAuthParameters PortParameters;
+} WmiSetPortParameters_IN, *PWmiSetPortParameters_IN;
+
+typedef struct _WmiSetPortParameters_OUT {
+ MSNdis_WmiOutputInfo OutputInfo;
+} WmiSetPortParameters_OUT, *PWmiSetPortParameters_OUT;
+
+typedef struct _WmiQueryPciDeviceCustomProperty_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryPciDeviceCustomProperty_IN, *PWmiQueryPciDeviceCustomProperty_IN;
+
+typedef struct _WmiQueryPciDeviceCustomProperty_OUT {
+ MSNdis_PciDeviceProperty PciDeviceProperty;
+} WmiQueryPciDeviceCustomProperty_OUT, *PWmiQueryPciDeviceCustomProperty_OUT;
+
+typedef struct _MSNdis_EnumerateAdapterEx {
+ MSNdis_WmiEnumAdapter EnumerateAdapter;
+} MSNdis_EnumerateAdapterEx, *PMSNdis_EnumerateAdapterEx;
+
+typedef struct _WmiQueryCurrentOffloadConfig_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryCurrentOffloadConfig_IN, *PWmiQueryCurrentOffloadConfig_IN;
+
+typedef struct _WmiQueryCurrentOffloadConfig_OUT {
+ MSNdis_WmiOffload Offload;
+} WmiQueryCurrentOffloadConfig_OUT, *PWmiQueryCurrentOffloadConfig_OUT;
+
+typedef struct _WmiQueryHardwareOffloadConfig_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryHardwareOffloadConfig_IN, *PWmiQueryHardwareOffloadConfig_IN;
+
+typedef struct _WmiQueryHardwareOffloadConfig_OUT {
+ MSNdis_WmiOffload Offload;
+} WmiQueryHardwareOffloadConfig_OUT, *PWmiQueryHardwareOffloadConfig_OUT;
+
+typedef struct _WmiSetTcpOffloadParameters_IN {
+ MSNdis_WmiMethodHeader MethodHeader;
+ MSNdis_TcpOffloadParameters TcpOffloadParameters;
+} WmiSetTcpOffloadParameters_IN, *PWmiSetTcpOffloadParameters_IN;
+
+typedef struct _WmiSetTcpOffloadParameters_OUT {
+ MSNdis_WmiOutputInfo OutputInfo;
+} WmiSetTcpOffloadParameters_OUT, *PWmiSetTcpOffloadParameters_OUT;
+
+typedef struct _WmiQueryTcpConnectionOffloadCurrentConfig_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryTcpConnectionOffloadCurrentConfig_IN, *PWmiQueryTcpConnectionOffloadCurrentConfig_IN;
+
+typedef struct _WmiQueryTcpConnectionOffloadCurrentConfig_OUT {
+ MSNdis_WmiTcpConnectionOffload Offload;
+} WmiQueryTcpConnectionOffloadCurrentConfig_OUT, *PWmiQueryTcpConnectionOffloadCurrentConfig_OUT;
+
+typedef struct _WmiQueryTcpConnectionOffloadHardwareConfig_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryTcpConnectionOffloadHardwareConfig_IN, *PWmiQueryTcpConnectionOffloadHardwareConfig_IN;
+
+typedef struct _WmiQueryTcpConnectionOffloadHardwareConfig_OUT {
+ MSNdis_WmiTcpConnectionOffload Offload;
+} WmiQueryTcpConnectionOffloadHardwareConfig_OUT, *PWmiQueryTcpConnectionOffloadHardwareConfig_OUT;
+
+typedef struct _WmiQueryReceiveScaleCapabilities_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryReceiveScaleCapabilities_IN, *PWmiQueryReceiveScaleCapabilities_IN;
+
+typedef struct _WmiQueryReceiveScaleCapabilities_OUT {
+ MSNdis_WmiReceiveScaleCapabilities RssCaps;
+} WmiQueryReceiveScaleCapabilities_OUT, *PWmiQueryReceiveScaleCapabilities_OUT;
+
+typedef struct _WmiQueryHDSplitCurrentConfig_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryHDSplitCurrentConfig_IN, *PWmiQueryHDSplitCurrentConfig_IN;
+
+typedef struct _WmiQueryHDSplitCurrentConfig_OUT {
+ MSNdis_WmiHDSplitCurrentConfig HdSplitCurrentConfig;
+} WmiQueryHDSplitCurrentConfig_OUT, *PWmiQueryHDSplitCurrentConfig_OUT;
+
+typedef struct _WmiSetHDSplitParameters_IN {
+ MSNdis_WmiMethodHeader MethodHeader;
+ MSNdis_HDSplitParameters HDSplitParameters;
+} WmiSetHDSplitParameters_IN, *PWmiSetHDSplitParameters_IN;
+
+typedef struct _WmiSetHDSplitParameters_OUT {
+ MSNdis_WmiOutputInfo OutputInfo;
+} WmiSetHDSplitParameters_OUT, *PWmiSetHDSplitParameters_OUT;
+
+typedef struct _WmiQueryPhysicalMediumTypeEx_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryPhysicalMediumTypeEx_IN, *PWmiQueryPhysicalMediumTypeEx_IN;
+
+typedef struct _WmiQueryPhysicalMediumTypeEx_OUT {
+ ULONG NdisPhysicalMediumTypeEx;
+} WmiQueryPhysicalMediumTypeEx_OUT, *PWmiQueryPhysicalMediumTypeEx_OUT;
+
+typedef struct _WmiQueryReceiveFilterHardwareCapabilities_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryReceiveFilterHardwareCapabilities_IN, *PWmiQueryReceiveFilterHardwareCapabilities_IN;
+
+typedef struct _WmiQueryReceiveFilterHardwareCapabilities_OUT {
+ MSNdis_ReceiveFilterCapabilities ReceiveFilterHardwareCapabilities;
+} WmiQueryReceiveFilterHardwareCapabilities_OUT, *PWmiQueryReceiveFilterHardwareCapabilities_OUT;
+
+typedef struct _WmiQueryReceiveFilterGlobalParameters_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryReceiveFilterGlobalParameters_IN, *PWmiQueryReceiveFilterGlobalParameters_IN;
+
+typedef struct _WmiQueryReceiveFilterGlobalParameters_OUT {
+ MSNdis_ReceiveFilterGlobalParameters ReceiveFilterGlobalParameters;
+} WmiQueryReceiveFilterGlobalParameters_OUT, *PWmiQueryReceiveFilterGlobalParameters_OUT;
+
+typedef struct _WmiEnumReceiveFilters_IN {
+ MSNdis_WmiMethodHeader Header;
+ MSNdis_ReceiveFilterInfoArray ReceiveFilterInfoArray;
+} WmiEnumReceiveFilters_IN, *PWmiEnumReceiveFilters_IN;
+
+typedef struct _WmiEnumReceiveFilters_OUT {
+ MSNdis_ReceiveFilterInfoArray ReceiveFilterInfoArray;
+} WmiEnumReceiveFilters_OUT, *PWmiEnumReceiveFilters_OUT;
+
+typedef struct _WmiQueryReceiveFilterParameters_IN {
+ MSNdis_WmiMethodHeader Header;
+ MSNdis_ReceiveFilterParameters ReceiveFilterParameters;
+} WmiQueryReceiveFilterParameters_IN, *PWmiQueryReceiveFilterParameters_IN;
+
+typedef struct _WmiQueryReceiveFilterParameters_OUT {
+ MSNdis_ReceiveFilterParameters ReceiveFilterParameters;
+} WmiQueryReceiveFilterParameters_OUT, *PWmiQueryReceiveFilterParameters_OUT;
+
+typedef struct _WmiQueryReceiveFilterCurrentCapabilities_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryReceiveFilterCurrentCapabilities_IN, *PWmiQueryReceiveFilterCurrentCapabilities_IN;
+
+typedef struct _WmiQueryReceiveFilterCurrentCapabilities_OUT {
+ MSNdis_ReceiveFilterCapabilities ReceiveFilterCurrentCapabilities;
+} WmiQueryReceiveFilterCurrentCapabilities_OUT, *PWmiQueryReceiveFilterCurrentCapabilities_OUT;
+
+typedef struct _WmiQueryNICSwitchHardwareCapabilities_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryNICSwitchHardwareCapabilities_IN, *PWmiQueryNICSwitchHardwareCapabilities_IN;
+
+typedef struct _WmiQueryNICSwitchHardwareCapabilities_OUT {
+ MSNdis_NicSwitchCapabilities NicSwitchHardwareCapabilities;
+} WmiQueryNICSwitchHardwareCapabilities_OUT, *PWmiQueryNICSwitchHardwareCapabilities_OUT;
+
+typedef struct _WmiQueryNICSwitchCurrentCapabilities_IN {
+ MSNdis_WmiMethodHeader Header;
+} WmiQueryNICSwitchCurrentCapabilities_IN, *PWmiQueryNICSwitchCurrentCapabilities_IN;
+
+typedef struct _WmiQueryNICSwitchCurrentCapabilities_OUT {
+ MSNdis_NicSwitchCapabilities NicSwitchCurrentCapabilities;
+} WmiQueryNICSwitchCurrentCapabilities_OUT, *PWmiQueryNICSwitchCurrentCapabilities_OUT;
+
+typedef struct _WmiQueryReceiveQueueParameters_IN {
+ MSNdis_WmiMethodHeader Header;
+ MSNdis_ReceiveQueueParameters ReceiveQueueParameters;
+} WmiQueryReceiveQueueParameters_IN, *PWmiQueryReceiveQueueParameters_IN;
+
+typedef struct _WmiQueryReceiveQueueParameters_OUT {
+ MSNdis_ReceiveQueueParameters ReceiveQueueParameters;
+} WmiQueryReceiveQueueParameters_OUT, *PWmiQueryReceiveQueueParameters_OUT;
+
+typedef struct _WmiEnumReceiveQueues_IN {
+ MSNdis_WmiMethodHeader Header;
+ MSNdis_ReceiveQueueInfoArray ReceiveQueueInfoArray;
+} WmiEnumReceiveQueues_IN, *PWmiEnumReceiveQueues_IN;
+
+typedef struct _WmiEnumReceiveQueues_OUT {
+ MSNdis_ReceiveQueueInfoArray ReceiveQueueInfoArray;
+} WmiEnumReceiveQueues_OUT, *PWmiEnumReceiveQueues_OUT;
+
+typedef struct _MSNdis_80211_BaseServiceSetIdentifier {
+ UCHAR Ndis80211MacAddress[6];
+} MSNdis_80211_BaseServiceSetIdentifier, *PMSNdis_80211_BaseServiceSetIdentifier;
+
+typedef struct _MSNdis_80211_ServiceSetIdentifier {
+ UCHAR Ndis80211SsId[33];
+} MSNdis_80211_ServiceSetIdentifier, *PMSNdis_80211_ServiceSetIdentifier;
+
+typedef struct _MSNdis_80211_NetworkType {
+ ULONG Ndis80211NetworkType;
+} MSNdis_80211_NetworkType, *PMSNdis_80211_NetworkType;
+
+typedef struct _MSNdis_80211_NetworkTypesSupported {
+ ULONG NumberOfItems;
+ MSNdis_80211_NetworkType Ndis80211NetworkTypes[1];
+} MSNdis_80211_NetworkTypesSupported, *PMSNdis_80211_NetworkTypesSupported;
+
+typedef struct _MSNdis_80211_NetworkTypeInUse {
+ MSNdis_80211_NetworkType Ndis80211NetworkTypeInUse;
+} MSNdis_80211_NetworkTypeInUse, *PMSNdis_80211_NetworkTypeInUse;
+
+typedef struct _MSNdis_80211_PowerMode {
+ ULONG Ndis80211PowerMode;
+} MSNdis_80211_PowerMode, *PMSNdis_80211_PowerMode;
+
+typedef struct _MSNdis_80211_TransmitPowerLevel {
+ ULONG Ndis80211TransmitPowerLevel;
+} MSNdis_80211_TransmitPowerLevel, *PMSNdis_80211_TransmitPowerLevel;
+
+typedef struct _MSNdis_80211_ReceivedSignalStrength {
+ LONG Ndis80211ReceivedSignalStrength;
+} MSNdis_80211_ReceivedSignalStrength, *PMSNdis_80211_ReceivedSignalStrength;
+
+typedef struct _MSNdis_80211_ReceivedSignalStrengthEventTrigger {
+ LONG Ndis80211ReceivedSignalStrengthTrigger;
+} MSNdis_80211_ReceivedSignalStrengthEventTrigger, *PMSNdis_80211_ReceivedSignalStrengthEventTrigger;
+
+typedef struct _MSNdis_80211_NetworkInfrastructure {
+ ULONG Ndis80211NetworkInfrastructure;
+} MSNdis_80211_NetworkInfrastructure, *PMSNdis_80211_NetworkInfrastructure;
+
+typedef struct _MSNdis_80211_ConfigurationFH {
+ ULONG FHLength;
+ ULONG HopPattern;
+ ULONG HopSet;
+ ULONG DwellTime;
+} MSNdis_80211_ConfigurationFH, *PMSNdis_80211_ConfigurationFH;
+
+typedef struct _MSNdis_80211_ConfigurationInfo {
+ ULONG ConfigLength;
+ ULONG BeaconPeriod;
+ ULONG ATIMWindow;
+ ULONG DSConfig;
+ MSNdis_80211_ConfigurationFH FHConfig;
+} MSNdis_80211_ConfigurationInfo, *PMSNdis_80211_ConfigurationInfo;
+
+typedef struct _MSNdis_80211_WLanBssId {
+ ULONG Ndis80211WLanBssIdLength;
+ UCHAR Ndis80211MacAddress[6];
+ USHORT Reserved;
+ ULONG Ndis80211SsIdLength;
+ UCHAR Ndis80211SsId[32];
+ ULONG Ndis80211Privacy;
+ ULONG Ndis80211Rssi;
+ MSNdis_80211_NetworkType Ndis80211NetworkTypeInUse;
+ MSNdis_80211_ConfigurationInfo Ndis80211Configuration;
+ MSNdis_80211_NetworkInfrastructure Ndis80211InfrastructureMode;
+ UCHAR Ndis80211SupportedRate[8];
+} MSNdis_80211_WLanBssId, *PMSNdis_80211_WLanBssId;
+
+typedef struct _MSNdis_80211_BSSIList {
+ ULONG NumberOfItems;
+ MSNdis_80211_WLanBssId Ndis80211BSSIList[1];
+} MSNdis_80211_BSSIList, *PMSNdis_80211_BSSIList;
+
+typedef struct _MSNdis_80211_InfrastructureMode {
+ MSNdis_80211_NetworkInfrastructure Ndis80211InfrastructureMode;
+} MSNdis_80211_InfrastructureMode, *PMSNdis_80211_InfrastructureMode;
+
+typedef struct _MSNdis_80211_FragmentationThreshold {
+ ULONG Ndis80211FragmentationThreshold;
+} MSNdis_80211_FragmentationThreshold, *PMSNdis_80211_FragmentationThreshold;
+
+typedef struct _MSNdis_80211_RTSThreshold {
+ ULONG Ndis80211RTSThreshold;
+} MSNdis_80211_RTSThreshold, *PMSNdis_80211_RTSThreshold;
+
+typedef struct _MSNdis_80211_NumberOfAntennas {
+ ULONG Ndis80211NumberOfAntennas;
+} MSNdis_80211_NumberOfAntennas, *PMSNdis_80211_NumberOfAntennas;
+
+typedef struct _MSNdis_80211_ReceiveAntennaSelected {
+ ULONG Ndis80211ReceiveAntennaSelected;
+} MSNdis_80211_ReceiveAntennaSelected, *PMSNdis_80211_ReceiveAntennaSelected;
+
+typedef struct _MSNdis_80211_TransmitAntennaSelected {
+ ULONG Ndis80211TransmitAntennaSelected;
+} MSNdis_80211_TransmitAntennaSelected, *PMSNdis_80211_TransmitAntennaSelected;
+
+typedef struct _MSNdis_80211_DataRates {
+ UCHAR Ndis80211DataRate[8];
+} MSNdis_80211_DataRates, *PMSNdis_80211_DataRates;
+
+typedef struct _MSNdis_80211_DesiredDataRates {
+ UCHAR Ndis80211DesiredRate[8];
+} MSNdis_80211_DesiredDataRates, *PMSNdis_80211_DesiredDataRates;
+
+typedef struct _MSNdis_80211_Configuration {
+ MSNdis_80211_ConfigurationInfo Ndis80211Config;
+} MSNdis_80211_Configuration, *PMSNdis_80211_Configuration;
+
+typedef struct _MSNdis_80211_Statistics {
+ ULONG StatisticsLength;
+ ULONGLONG TransmittedFragmentCount;
+ ULONGLONG MulticastTransmittedFrameCount;
+ ULONGLONG FailedCount;
+ ULONGLONG RetryCount;
+ ULONGLONG MultipleRetryCount;
+ ULONGLONG RTSSuccessCount;
+ ULONGLONG RTSFailureCount;
+ ULONGLONG ACKFailureCount;
+ ULONGLONG FrameDuplicateCount;
+ ULONGLONG ReceivedFragmentCount;
+ ULONGLONG MulticastReceivedFrameCount;
+ ULONGLONG FCSErrorCount;
+} MSNdis_80211_Statistics, *PMSNdis_80211_Statistics;
+
+typedef struct _MSNdis_80211_AddWEP {
+ ULONG Length;
+ ULONG KeyIndex;
+ ULONG KeyLength;
+ UCHAR KeyMaterial[1];
+} MSNdis_80211_AddWEP, *PMSNdis_80211_AddWEP;
+
+typedef struct _MSNdis_80211_RemoveWEP {
+ ULONG Ndis80211KeyIndex;
+} MSNdis_80211_RemoveWEP, *PMSNdis_80211_RemoveWEP;
+
+typedef struct _MSNdis_80211_Disassociate {
+ ULONG UnusedParameter;
+} MSNdis_80211_Disassociate, *PMSNdis_80211_Disassociate;
+
+typedef struct _MSNdis_80211_BssIdListScan {
+ ULONG UnusedParameter;
+} MSNdis_80211_BssIdListScan, *PMSNdis_80211_BssIdListScan;
+
+typedef struct _MSNdis_80211_AuthenticationMode {
+ ULONG Ndis80211AuthenticationMode;
+} MSNdis_80211_AuthenticationMode, *PMSNdis_80211_AuthenticationMode;
+
+typedef struct _MSNdis_80211_PrivacyFilter {
+ ULONG Ndis80211PrivacyFilter;
+} MSNdis_80211_PrivacyFilter, *PMSNdis_80211_PrivacyFilter;
+
+typedef struct _MSNdis_80211_WEPStatus {
+ ULONG Ndis80211WEPStatus;
+} MSNdis_80211_WEPStatus, *PMSNdis_80211_WEPStatus;
+
+typedef struct _MSNdis_80211_ReloadDefaults {
+ ULONG Ndis80211ReloadDefaults;
+} MSNdis_80211_ReloadDefaults, *PMSNdis_80211_ReloadDefaults;
+
+typedef struct _MSNdis_PMAdminConfigState {
+ ULONG NdisPMAdminConfigState;
+} MSNdis_PMAdminConfigState, *PMSNdis_PMAdminConfigState;
+
+typedef struct _MSNdis_PMAdminConfigParam {
+ MSNdis_ObjectHeader Header;
+ MSNdis_PMAdminConfigState WakeOnPattern;
+ MSNdis_PMAdminConfigState WakeOnMagicPacket;
+ MSNdis_PMAdminConfigState DeviceSleepOnDisconnect;
+ MSNdis_PMAdminConfigState PMARPOffload;
+ MSNdis_PMAdminConfigState PMNDOffload;
+ MSNdis_PMAdminConfigState PMWiFiRekeyOffload;
+} MSNdis_PMAdminConfigParam, *PMSNdis_PMAdminConfigParam;
+
+typedef struct _MSNdis_PMAdminConfig {
+ MSNdis_PMAdminConfigParam PMAdminConfigParam;
+} MSNdis_PMAdminConfig, *PMSNdis_PMAdminConfig;
+
+typedef struct _MSNdis_PMCapabilityState {
+ ULONG NdisPMCapabilityState;
+} MSNdis_PMCapabilityState, *PMSNdis_PMCapabilityState;
+
+typedef struct _MSNdis_PMCapabilitiesParam {
+ MSNdis_ObjectHeader Header;
+ MSNdis_PMCapabilityState WakeOnPattern;
+ MSNdis_PMCapabilityState WakeOnMagicPacket;
+ MSNdis_PMCapabilityState DeviceSleepOnDisconnect;
+ MSNdis_PMCapabilityState PMARPOffload;
+ MSNdis_PMCapabilityState PMNDOffload;
+ MSNdis_PMCapabilityState PMWiFiRekeyOffload;
+} MSNdis_PMCapabilitiesParam, *PMSNdis_PMCapabilitiesParam;
+
+typedef struct _MSNdis_PMCapabilities {
+ MSNdis_PMCapabilitiesParam PMCapabilitiesParam;
+} MSNdis_PMCapabilities, *PMSNdis_PMCapabilities;
+
+typedef struct _MSNdis_StatusMediaSpecificIndication {
+ ULONG NumberElements;
+ UCHAR NdisStatusMediaSpecificIndication[1];
+} MSNdis_StatusMediaSpecificIndication, *PMSNdis_StatusMediaSpecificIndication;
+
+typedef struct _MSNdis_StatusLinkSpeedChange {
+ MSNdis_NetworkLinkSpeed NdisStatusLinkSpeedChange;
+} MSNdis_StatusLinkSpeedChange, *PMSNdis_StatusLinkSpeedChange;
+
+typedef struct _MSNdis_StatusProtocolBind {
+ CHAR VariableData[1];
+} MSNdis_StatusProtocolBind, *PMSNdis_StatusProtocolBind;
+
+typedef struct _MSNdis_StatusProtocolUnbind {
+ CHAR VariableData[1];
+} MSNdis_StatusProtocolUnbind, *PMSNdis_StatusProtocolUnbind;
+
+typedef struct _MSNdis_StatusDevicePowerOn {
+ CHAR VariableData[1];
+} MSNdis_StatusDevicePowerOn, *PMSNdis_StatusDevicePowerOn;
+
+typedef struct _MSNdis_StatusDevicePowerOff {
+ CHAR VariableData[1];
+} MSNdis_StatusDevicePowerOff, *PMSNdis_StatusDevicePowerOff;
+
+typedef struct _MSNdis_StatusDevicePowerOnEx {
+ CHAR VariableData[1];
+} MSNdis_StatusDevicePowerOnEx, *PMSNdis_StatusDevicePowerOnEx;
+
+typedef struct _MSNdis_StatusDevicePowerOffEx {
+ CHAR VariableData[1];
+} MSNdis_StatusDevicePowerOffEx, *PMSNdis_StatusDevicePowerOffEx;
+
+typedef struct _MSNdis_StatusTaskOffloadChange {
+ ULONG NumberElements;
+ UCHAR TaskOffloadCapabilities[1];
+} MSNdis_StatusTaskOffloadChange, *PMSNdis_StatusTaskOffloadChange;
+
+typedef struct _MSNdis_StatusPacketFilterChange {
+ ULONG NumberElements;
+ UCHAR NdisPacketFilterStatusIndication[1];
+} MSNdis_StatusPacketFilterChange, *PMSNdis_StatusPacketFilterChange;
+
+typedef struct _MSNdis_StatusNetworkChange {
+ ULONG NumberElements;
+ UCHAR NdisNetworkChangeStatusIndication[1];
+} MSNdis_StatusNetworkChange, *PMSNdis_StatusNetworkChange;
+
+typedef struct _MSNdis_StatusOperationalStatus {
+ ULONG NumberElements;
+ UCHAR NdisOperationalStatusStatusIndication[1];
+} MSNdis_StatusOperationalStatus, *PMSNdis_StatusOperationalStatus;
+
+typedef struct _MSNdis_StatusLinkState {
+ ULONG NumberElements;
+ UCHAR NdisLinkStateStatusIndication[1];
+} MSNdis_StatusLinkState, *PMSNdis_StatusLinkState;
+
+typedef struct _MSNdis_StatusPortState {
+ ULONG NumberElements;
+ UCHAR NdisPortStateStatusIndication[1];
+} MSNdis_StatusPortState, *PMSNdis_StatusPortState;
+
+typedef struct _MSNdis_StatusMediaSpecificIndicationEx {
+ ULONG NumberElements;
+ UCHAR NdisStatusMediaSpecificIndication[1];
+} MSNdis_StatusMediaSpecificIndicationEx, *PMSNdis_StatusMediaSpecificIndicationEx;
+
+typedef struct _MSNdis_StatusHDSplitCurrentConfig {
+ ULONG NumberElements;
+ UCHAR HDSplitCurrentConfig[1];
+} MSNdis_StatusHDSplitCurrentConfig, *PMSNdis_StatusHDSplitCurrentConfig;
+
+typedef struct _MSNdis_StatusDot11ScanConfirm {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11ScanConfirmIndication[1];
+} MSNdis_StatusDot11ScanConfirm, *PMSNdis_StatusDot11ScanConfirm;
+
+typedef struct _MSNdis_StatusDot11MPDUMaxLengthChange {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11MPDUMaxLengthChangeIndication[1];
+} MSNdis_StatusDot11MPDUMaxLengthChange, *PMSNdis_StatusDot11MPDUMaxLengthChange;
+
+typedef struct _MSNdis_StatusDot11AssociationStart {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11AssociationStartIndication[1];
+} MSNdis_StatusDot11AssociationStart, *PMSNdis_StatusDot11AssociationStart;
+
+typedef struct _MSNdis_StatusDot11AssociationCompletion {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11AssociationCompletionIndication[1];
+} MSNdis_StatusDot11AssociationCompletion, *PMSNdis_StatusDot11AssociationCompletion;
+
+typedef struct _MSNdis_StatusDot11ConnectionStart {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11ConnectionStartIndication[1];
+} MSNdis_StatusDot11ConnectionStart, *PMSNdis_StatusDot11ConnectionStart;
+
+typedef struct _MSNdis_StatusDot11ConnectionCompletion {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11ConnectionCompletionIndication[1];
+} MSNdis_StatusDot11ConnectionCompletion, *PMSNdis_StatusDot11ConnectionCompletion;
+
+typedef struct _MSNdis_StatusDot11RoamingStart {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11RoamingStartIndication[1];
+} MSNdis_StatusDot11RoamingStart, *PMSNdis_StatusDot11RoamingStart;
+
+typedef struct _MSNdis_StatusDot11RoamingCompletion {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11RoamingCompletionIndication[1];
+} MSNdis_StatusDot11RoamingCompletion, *PMSNdis_StatusDot11RoamingCompletion;
+
+typedef struct _MSNdis_StatusDot11Disassociation {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11DisassociationIndication[1];
+} MSNdis_StatusDot11Disassociation, *PMSNdis_StatusDot11Disassociation;
+
+typedef struct _MSNdis_StatusDot11TkipmicFailure {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11TkipmicFailureIndication[1];
+} MSNdis_StatusDot11TkipmicFailure, *PMSNdis_StatusDot11TkipmicFailure;
+
+typedef struct _MSNdis_StatusDot11PmkidCandidateList {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11PmkidCandidateListIndication[1];
+} MSNdis_StatusDot11PmkidCandidateList, *PMSNdis_StatusDot11PmkidCandidateList;
+
+typedef struct _MSNdis_StatusDot11PhyStateChange {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11PhyStateChangeIndication[1];
+} MSNdis_StatusDot11PhyStateChange, *PMSNdis_StatusDot11PhyStateChange;
+
+typedef struct _MSNdis_StatusDot11LinkQuality {
+ ULONG NumberElements;
+ UCHAR NdisStatusDot11LinkQualityIndication[1];
+} MSNdis_StatusDot11LinkQuality, *PMSNdis_StatusDot11LinkQuality;
+
+typedef struct _KEYBOARD_PORT_WMI_STD_DATA {
+ ULONG ConnectorType;
+ ULONG DataQueueSize;
+ ULONG ErrorCount;
+ ULONG FunctionKeys;
+ ULONG Indicators;
+} KEYBOARD_PORT_WMI_STD_DATA, *PKEYBOARD_PORT_WMI_STD_DATA;
+
+typedef struct _KEYBOARD_ID_EX {
+ ULONG Type;
+ ULONG Subtype;
+} KEYBOARD_ID_EX, *PKEYBOARD_ID_EX;
+
+typedef struct _POINTER_PORT_WMI_STD_DATA {
+ ULONG ConnectorType;
+ ULONG DataQueueSize;
+ ULONG ErrorCount;
+ ULONG Buttons;
+ ULONG HardwareType;
+} POINTER_PORT_WMI_STD_DATA, *PPOINTER_PORT_WMI_STD_DATA;
+
+typedef struct _MSMouse_ClassInformation {
+ ULONGLONG DeviceId;
+} MSMouse_ClassInformation, *PMSMouse_ClassInformation;
+
+typedef struct _MSKeyboard_ClassInformation {
+ ULONGLONG DeviceId;
+} MSKeyboard_ClassInformation, *PMSKeyboard_ClassInformation;
+
+typedef struct _AGP_STD_DATA {
+ ULONGLONG ApertureBase;
+ ULONG ApertureLength;
+ ULONG AgpStatus;
+ ULONG AgpCommand;
+} AGP_STD_DATA, *PAGP_STD_DATA;
+
+typedef struct _MSAcpi_ThermalZoneTemperature {
+ ULONG ThermalStamp;
+ ULONG ThermalConstant1;
+ ULONG ThermalConstant2;
+ ULONG Reserved;
+ ULONG SamplingPeriod;
+ ULONG CurrentTemperature;
+ ULONG PassiveTripPoint;
+ ULONG CriticalTripPoint;
+ ULONG ActiveTripPointCount;
+ ULONG ActiveTripPoint[10];
+} MSAcpi_ThermalZoneTemperature, *PMSAcpi_ThermalZoneTemperature;
+
+typedef struct _WMI_DISK_GEOMETRY {
+ LONGLONG Cylinders;
+ ULONG MediaType;
+ ULONG TracksPerCylinder;
+ ULONG SectorsPerTrack;
+ ULONG BytesPerSector;
+} WMI_DISK_GEOMETRY, *PWMI_DISK_GEOMETRY;
+
+typedef struct _WMI_DISK_PERFORMANCE {
+ LONGLONG BytesRead;
+ LONGLONG BytesWritten;
+ LONGLONG ReadTime;
+ LONGLONG WriteTime;
+ LONGLONG IdleTime;
+ ULONG ReadCount;
+ ULONG WriteCount;
+ ULONG QueueDepth;
+ ULONG SplitCount;
+ LONGLONG QueryTime;
+ ULONG StorageDeviceNumber;
+ USHORT StorageManagerName[8];
+} WMI_DISK_PERFORMANCE, *PWMI_DISK_PERFORMANCE;
+
+typedef struct _MSDiskDriver_Performance {
+ WMI_DISK_PERFORMANCE PerfData;
+ CHAR VariableData[1];
+} MSDiskDriver_Performance, *PMSDiskDriver_Performance;
+
+typedef struct _STORAGE_FAILURE_PREDICT_STATUS {
+ ULONG Reason;
+ BOOLEAN PredictFailure;
+} STORAGE_FAILURE_PREDICT_STATUS, *PSTORAGE_FAILURE_PREDICT_STATUS;
+
+typedef struct _STORAGE_FAILURE_PREDICT_DATA {
+ ULONG Length;
+ UCHAR VendorSpecific[512];
+} STORAGE_FAILURE_PREDICT_DATA, *PSTORAGE_FAILURE_PREDICT_DATA;
+
+typedef struct _ATAPI_FAILURE_PREDICT_DATA {
+ ULONG Length;
+ UCHAR VendorSpecific[362];
+ UCHAR OfflineCollectionStatus;
+ UCHAR SelfTestStatus;
+ USHORT TotalTime;
+ UCHAR VendorSpecific2;
+ UCHAR OfflineCollectCapability;
+ USHORT SmartCapability;
+ UCHAR ErrorLogCapability;
+ UCHAR VendorSpecific3;
+ UCHAR ShortPollTimeInMinutes;
+ UCHAR ExtendedPollTimeInMinutes;
+ UCHAR Reserved[12];
+ UCHAR VendorSpecific4[125];
+ UCHAR Checksum;
+} ATAPI_FAILURE_PREDICT_DATA, *PATAPI_FAILURE_PREDICT_DATA;
+
+typedef struct _STORAGE_FAILURE_PREDICT_THRESHOLDS {
+ UCHAR VendorSpecific[512];
+} STORAGE_FAILURE_PREDICT_THRESHOLDS, *PSTORAGE_FAILURE_PREDICT_THRESHOLDS;
+
+typedef struct _STORAGE_FAILURE_PREDICT_EVENT {
+ ULONG Length;
+ UCHAR VendorSpecific[1];
+} STORAGE_FAILURE_PREDICT_EVENT, *PSTORAGE_FAILURE_PREDICT_EVENT;
+
+typedef struct _ALLOW_PERFORMANCE_HIT_IN {
+ BOOLEAN Allow;
+} ALLOW_PERFORMANCE_HIT_IN, *PALLOW_PERFORMANCE_HIT_IN;
+
+typedef struct _ENABLE_DISABLE_FP_IN {
+ BOOLEAN Enable;
+} ENABLE_DISABLE_FP_IN, *PENABLE_DISABLE_FP_IN;
+
+typedef struct _ENABLE_DISABLE_FP_POLLING_IN {
+ ULONG Period;
+ BOOLEAN Enable;
+} ENABLE_DISABLE_FP_POLLING_IN, *PENABLE_DISABLE_FP_POLLING_IN;
+
+typedef struct _GET_FP_CAPABILITY_OUT {
+ ULONG Capability;
+} GET_FP_CAPABILITY_OUT, *PGET_FP_CAPABILITY_OUT;
+
+typedef struct _ENABLE_OFFLINE_DIAGS_OUT {
+ BOOLEAN Success;
+} ENABLE_OFFLINE_DIAGS_OUT, *PENABLE_OFFLINE_DIAGS_OUT;
+
+typedef struct _READ_LOG_SECTORS_IN {
+ UCHAR LogAddress;
+ UCHAR SectorCount;
+} READ_LOG_SECTORS_IN, *PREAD_LOG_SECTORS_IN;
+
+typedef struct _READ_LOG_SECTORS_OUT {
+ ULONG Length;
+ UCHAR LogSectors[1];
+} READ_LOG_SECTORS_OUT, *PREAD_LOG_SECTORS_OUT;
+
+typedef struct _WRITE_LOG_SECTORS_IN {
+ UCHAR LogAddress;
+ UCHAR SectorCount;
+ ULONG Length;
+ UCHAR LogSectors[1];
+} WRITE_LOG_SECTORS_IN, *PWRITE_LOG_SECTORS_IN;
+
+typedef struct _WRITE_LOG_SECTORS_OUT {
+ BOOLEAN Success;
+} WRITE_LOG_SECTORS_OUT, *PWRITE_LOG_SECTORS_OUT;
+
+typedef struct _EXECUTE_SELF_TEST_IN {
+ UCHAR Subcommand;
+} EXECUTE_SELF_TEST_IN, *PEXECUTE_SELF_TEST_IN;
+
+typedef struct _EXECUTE_SELF_TEST_OUT {
+ ULONG ReturnCode;
+} EXECUTE_SELF_TEST_OUT, *PEXECUTE_SELF_TEST_OUT;
+
+typedef struct _STORAGE_SCSI_INFO_EXCEPTIONS {
+ BOOLEAN PageSavable;
+ UCHAR Flags;
+ UCHAR MRIE;
+ UCHAR Padding;
+ ULONG IntervalTimer;
+ ULONG ReportCount;
+} STORAGE_SCSI_INFO_EXCEPTIONS, *PSTORAGE_SCSI_INFO_EXCEPTIONS;
+
+typedef struct _MSIde_PortDeviceInfo {
+ UCHAR Bus;
+ UCHAR Target;
+ UCHAR Lun;
+} MSIde_PortDeviceInfo, *PMSIde_PortDeviceInfo;
+
+typedef struct _MSSerial_PortName {
+ CHAR VariableData[1];
+} MSSerial_PortName, *PMSSerial_PortName;
+
+typedef struct _SERIAL_WMI_COMM_DATA {
+ ULONG BaudRate;
+ ULONG BitsPerByte;
+ ULONG Parity;
+ BOOLEAN ParityCheckEnable;
+ ULONG StopBits;
+ ULONG XoffCharacter;
+ ULONG XoffXmitThreshold;
+ ULONG XonCharacter;
+ ULONG XonXmitThreshold;
+ ULONG MaximumBaudRate;
+ ULONG MaximumOutputBufferSize;
+ ULONG MaximumInputBufferSize;
+ BOOLEAN Support16BitMode;
+ BOOLEAN SupportDTRDSR;
+ BOOLEAN SupportIntervalTimeouts;
+ BOOLEAN SupportParityCheck;
+ BOOLEAN SupportRTSCTS;
+ BOOLEAN SupportXonXoff;
+ BOOLEAN SettableBaudRate;
+ BOOLEAN SettableDataBits;
+ BOOLEAN SettableFlowControl;
+ BOOLEAN SettableParity;
+ BOOLEAN SettableParityCheck;
+ BOOLEAN SettableStopBits;
+ BOOLEAN IsBusy;
+} SERIAL_WMI_COMM_DATA, *PSERIAL_WMI_COMM_DATA;
+
+typedef struct _SERIAL_WMI_HW_DATA {
+ ULONG IrqNumber;
+ ULONG IrqVector;
+ ULONG IrqLevel;
+ ULONGLONG IrqAffinityMask;
+ ULONG InterruptType;
+ ULONGLONG BaseIOAddress;
+} SERIAL_WMI_HW_DATA, *PSERIAL_WMI_HW_DATA;
+
+typedef struct _SERIAL_WMI_PERF_DATA {
+ ULONG ReceivedCount;
+ ULONG TransmittedCount;
+ ULONG FrameErrorCount;
+ ULONG SerialOverrunErrorCount;
+ ULONG BufferOverrunErrorCount;
+ ULONG ParityErrorCount;
+} SERIAL_WMI_PERF_DATA, *PSERIAL_WMI_PERF_DATA;
+
+typedef struct _SERIAL_WMI_COMMPROP {
+ USHORT wPacketLength;
+ USHORT wPacketVersion;
+ ULONG dwServiceMask;
+ ULONG dwReserved1;
+ ULONG dwMaxTxQueue;
+ ULONG dwMaxRxQueue;
+ ULONG dwMaxBaud;
+ ULONG dwProvSubType;
+ ULONG dwProvCapabilities;
+ ULONG dwSettableParams;
+ ULONG dwSettableBaud;
+ USHORT wSettableData;
+ USHORT wSettableStopParity;
+ ULONG dwCurrentTxQueue;
+ ULONG dwCurrentRxQueue;
+ ULONG dwProvSpec1;
+ ULONG dwProvSpec2;
+ ULONG dwProvCharSize;
+ UCHAR wcProvChar[1];
+} SERIAL_WMI_COMMPROP, *PSERIAL_WMI_COMMPROP;
+
+typedef struct _PARPORT_WMI_ALLOC_FREE_COUNTS {
+ ULONG PortAllocates;
+ ULONG PortFrees;
+} PARPORT_WMI_ALLOC_FREE_COUNTS, *PPARPORT_WMI_ALLOC_FREE_COUNTS;
+
+typedef struct _PARALLEL_WMI_LOG_INFO {
+ ULONG Flags1;
+ ULONG Flags2;
+ ULONG spare[2];
+ LONGLONG SppWriteCount;
+ LONGLONG NibbleReadCount;
+ LONGLONG BoundedEcpWriteCount;
+ LONGLONG BoundedEcpReadCount;
+ LONGLONG HwEcpWriteCount;
+ LONGLONG HwEcpReadCount;
+ LONGLONG SwEcpWriteCount;
+ LONGLONG SwEcpReadCount;
+ LONGLONG HwEppWriteCount;
+ LONGLONG HwEppReadCount;
+ LONGLONG SwEppWriteCount;
+ LONGLONG SwEppReadCount;
+ LONGLONG ByteReadCount;
+ LONGLONG ChannelNibbleReadCount;
+} PARALLEL_WMI_LOG_INFO, *PPARALLEL_WMI_LOG_INFO;
+
+typedef struct _REDBOOK_WMI_STD_DATA {
+ ULONG NumberOfBuffers;
+ ULONG SectorsPerRead;
+ ULONG SectorsPerReadMask;
+ ULONG MaximumSectorsPerRead;
+ BOOLEAN PlayEnabled;
+ BOOLEAN CDDASupported;
+ BOOLEAN CDDAAccurate;
+ BOOLEAN Reserved1;
+} REDBOOK_WMI_STD_DATA, *PREDBOOK_WMI_STD_DATA;
+
+typedef struct _REDBOOK_WMI_PERF_DATA {
+ LONGLONG TimeReadDelay;
+ LONGLONG TimeReading;
+ LONGLONG TimeStreamDelay;
+ LONGLONG TimeStreaming;
+ LONGLONG DataProcessed;
+ ULONG StreamPausedCount;
+} REDBOOK_WMI_PERF_DATA, *PREDBOOK_WMI_PERF_DATA;
+
+typedef struct _RegisteredGuids {
+ ULONG GuidType;
+ ULONG LoggerId;
+ ULONG EnableLevel;
+ ULONG EnableFlags;
+ BOOLEAN IsEnabled;
+} RegisteredGuids, *PRegisteredGuids;
+
+typedef struct _WMI_TAPE_DRIVE_PARAMETERS {
+ ULONG MaximumBlockSize;
+ ULONG MinimumBlockSize;
+ ULONG DefaultBlockSize;
+ ULONG MaximumPartitionCount;
+ BOOLEAN CompressionCapable;
+ BOOLEAN CompressionEnabled;
+ BOOLEAN ReportSetmarks;
+ BOOLEAN HardwareErrorCorrection;
+} WMI_TAPE_DRIVE_PARAMETERS, *PWMI_TAPE_DRIVE_PARAMETERS;
+
+typedef struct _WMI_TAPE_MEDIA_PARAMETERS {
+ ULONGLONG MaximumCapacity;
+ ULONGLONG AvailableCapacity;
+ ULONG BlockSize;
+ ULONG PartitionCount;
+ BOOLEAN MediaWriteProtected;
+} WMI_TAPE_MEDIA_PARAMETERS, *PWMI_TAPE_MEDIA_PARAMETERS;
+
+typedef struct _WMI_TAPE_SYMBOLIC_NAME {
+ CHAR VariableData[1];
+} WMI_TAPE_SYMBOLIC_NAME, *PWMI_TAPE_SYMBOLIC_NAME;
+
+typedef struct _WMI_TAPE_PROBLEM_WARNING {
+ ULONG DriveProblemType;
+ UCHAR TapeData[512];
+} WMI_TAPE_PROBLEM_WARNING, *PWMI_TAPE_PROBLEM_WARNING;
+
+typedef struct _WMI_TAPE_PROBLEM_IO_ERROR {
+ ULONG ReadCorrectedWithoutDelay;
+ ULONG ReadCorrectedWithDelay;
+ ULONG ReadTotalErrors;
+ ULONG ReadTotalCorrectedErrors;
+ ULONG ReadTotalUncorrectedErrors;
+ ULONG ReadCorrectionAlgorithmProcessed;
+ ULONG WriteCorrectedWithoutDelay;
+ ULONG WriteCorrectedWithDelay;
+ ULONG WriteTotalErrors;
+ ULONG WriteTotalCorrectedErrors;
+ ULONG WriteTotalUncorrectedErrors;
+ ULONG WriteCorrectionAlgorithmProcessed;
+ ULONG NonMediumErrors;
+} WMI_TAPE_PROBLEM_IO_ERROR, *PWMI_TAPE_PROBLEM_IO_ERROR;
+
+typedef struct _WMI_TAPE_PROBLEM_DEVICE_ERROR {
+ BOOLEAN ReadWarning;
+ BOOLEAN WriteWarning;
+ BOOLEAN HardError;
+ BOOLEAN ReadFailure;
+ BOOLEAN WriteFailure;
+ BOOLEAN UnsupportedFormat;
+ BOOLEAN TapeSnapped;
+ BOOLEAN DriveRequiresCleaning;
+ BOOLEAN TimetoCleanDrive;
+ BOOLEAN DriveHardwareError;
+ BOOLEAN ScsiInterfaceError;
+ BOOLEAN MediaLife;
+} WMI_TAPE_PROBLEM_DEVICE_ERROR, *PWMI_TAPE_PROBLEM_DEVICE_ERROR;
+
+typedef struct _WMI_CHANGER_PARAMETERS {
+ ULONG NumberOfSlots;
+ ULONG NumberOfDrives;
+ ULONG NumberOfIEPorts;
+ ULONG NumberOfTransports;
+ ULONG NumberOfDoors;
+ ULONG NumberOfCleanerSlots;
+ ULONG MagazineSize;
+} WMI_CHANGER_PARAMETERS, *PWMI_CHANGER_PARAMETERS;
+
+typedef struct _WMI_CHANGER_PROBLEM_WARNING {
+ ULONG ChangerProblemType;
+ UCHAR ChangerData[512];
+} WMI_CHANGER_PROBLEM_WARNING, *PWMI_CHANGER_PROBLEM_WARNING;
+
+typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR {
+ ULONG ChangerProblemType;
+} WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR;
+
+typedef struct _DEVICE_UI_FIRMWARE_REVISION {
+ CHAR VariableData[1];
+} DEVICE_UI_FIRMWARE_REVISION, *PDEVICE_UI_FIRMWARE_REVISION;
+
+typedef struct _MSVerifierIrpLogEntry {
+ ULONG Count;
+ UCHAR Major;
+ UCHAR Minor;
+ UCHAR Flags;
+ UCHAR Control;
+ ULONGLONG Arg1;
+ ULONGLONG Arg2;
+ ULONGLONG Arg3;
+ ULONGLONG Arg4;
+} MSVerifierIrpLogEntry, *PMSVerifierIrpLogEntry;
+
+typedef struct _MSVerifierIrpLogInformation {
+ ULONG DeviceType;
+ ULONG EntryCount;
+ MSVerifierIrpLogEntry Entries[1];
+} MSVerifierIrpLogInformation, *PMSVerifierIrpLogInformation;
+
+typedef struct _WmiMonitorBrightness {
+ UCHAR CurrentBrightness;
+ ULONG Levels;
+ UCHAR Level[1];
+} WmiMonitorBrightness, *PWmiMonitorBrightness;
+
+typedef struct _WmiSetBrightness_IN {
+ ULONG Timeout;
+ UCHAR Brightness;
+} WmiSetBrightness_IN, *PWmiSetBrightness_IN;
+
+typedef struct _WmiSetALSBrightnessState_IN {
+ BOOLEAN State;
+} WmiSetALSBrightnessState_IN, *PWmiSetALSBrightnessState_IN;
+
+typedef struct _WmiSetALSBrightness_IN {
+ UCHAR Brightness;
+} WmiSetALSBrightness_IN, *PWmiSetALSBrightness_IN;
+
+typedef struct _WmiMonitorBrightnessEvent {
+ UCHAR Brightness;
+} WmiMonitorBrightnessEvent, *PWmiMonitorBrightnessEvent;
+
+typedef struct _WmiMonitorRawEEdidV1Block {
+ UCHAR Id;
+ UCHAR Type;
+ UCHAR Content[128];
+} WmiMonitorRawEEdidV1Block, *PWmiMonitorRawEEdidV1Block;
+
+typedef struct _WmiGetMonitorRawEEdidV1Block_IN {
+ UCHAR BlockId;
+} WmiGetMonitorRawEEdidV1Block_IN, *PWmiGetMonitorRawEEdidV1Block_IN;
+
+typedef struct _WmiGetMonitorRawEEdidV1Block_OUT {
+ UCHAR BlockType;
+ UCHAR BlockContent[128];
+} WmiGetMonitorRawEEdidV1Block_OUT, *PWmiGetMonitorRawEEdidV1Block_OUT;
+
+typedef struct _WmiMonitorID {
+ USHORT ProductCodeID[16];
+ USHORT SerialNumberID[16];
+ USHORT ManufacturerName[16];
+ UCHAR WeekOfManufacture;
+ USHORT YearOfManufacture;
+ USHORT UserFriendlyNameLength;
+ USHORT UserFriendlyName[1];
+} WmiMonitorID, *PWmiMonitorID;
+
+typedef struct _WmiMonitorSupportedDisplayFeatures {
+ BOOLEAN StandbySupported;
+ BOOLEAN SuspendSupported;
+ BOOLEAN ActiveOffSupported;
+ UCHAR DisplayType;
+ BOOLEAN sRGBSupported;
+ BOOLEAN HasPreferredTimingMode;
+ BOOLEAN GTFSupported;
+} WmiMonitorSupportedDisplayFeatures, *PWmiMonitorSupportedDisplayFeatures;
+
+typedef struct _WmiMonitorBasicDisplayParams {
+ UCHAR VideoInputType;
+ UCHAR MaxHorizontalImageSize;
+ UCHAR MaxVerticalImageSize;
+ UCHAR DisplayTransferCharacteristic;
+ WmiMonitorSupportedDisplayFeatures SupportedDisplayFeatures;
+} WmiMonitorBasicDisplayParams, *PWmiMonitorBasicDisplayParams;
+
+typedef struct _WmiMonitorConnectionParams {
+ ULONG VideoOutputTechnology;
+} WmiMonitorConnectionParams, *PWmiMonitorConnectionParams;
+
+typedef struct _WmiMonitorAnalogVideoInputParams {
+ UCHAR SignalLevelStandard;
+ UCHAR SetupExpected;
+ UCHAR SeparateSyncsSupported;
+ UCHAR CompositeSyncSupported;
+ UCHAR SyncOnGreenVideoSupported;
+ UCHAR SerrationOfVsyncRequired;
+} WmiMonitorAnalogVideoInputParams, *PWmiMonitorAnalogVideoInputParams;
+
+typedef struct _WmiMonitorDigitalVideoInputParams {
+ BOOLEAN IsDFP1xCompatible;
+} WmiMonitorDigitalVideoInputParams, *PWmiMonitorDigitalVideoInputParams;
+
+typedef struct _WmiMonitorColorXYZinCIE {
+ USHORT X;
+ USHORT Y;
+} WmiMonitorColorXYZinCIE, *PWmiMonitorColorXYZinCIE;
+
+typedef struct _WmiMonitorColorCharacteristics {
+ WmiMonitorColorXYZinCIE Red;
+ WmiMonitorColorXYZinCIE Blue;
+ WmiMonitorColorXYZinCIE Green;
+ WmiMonitorColorXYZinCIE DefaultWhite;
+} WmiMonitorColorCharacteristics, *PWmiMonitorColorCharacteristics;
+
+typedef struct _VideoModeDescriptor {
+ ULONG PixelClockRate;
+ ULONG VerticalRefreshRateNumerator;
+ ULONG VerticalRefreshRateDenominator;
+ ULONG HorizontalRefreshRateNumerator;
+ ULONG HorizontalRefreshRateDenominator;
+ USHORT HorizontalActivePixels;
+ USHORT VerticalActivePixels;
+ USHORT HorizontalBlankingPixels;
+ USHORT VerticalBlankingPixels;
+ USHORT HorizontalSyncOffset;
+ USHORT VerticalSyncOffset;
+ USHORT HorizontalSyncPulseWidth;
+ USHORT VerticalSyncPulseWidth;
+ USHORT HorizontalImageSize;
+ USHORT VerticalImageSize;
+ USHORT HorizontalBorder;
+ USHORT VerticalBorder;
+ BOOLEAN IsInterlaced;
+ UCHAR StereoModeType;
+ UCHAR SyncSignalType;
+ UCHAR IsSerrationRequired;
+ UCHAR IsSyncOnRGB;
+ UCHAR CompositePolarityType;
+ UCHAR VerticalPolarityType;
+ UCHAR HorizontalPolarityType;
+ UCHAR VideoStandardType;
+ UCHAR Origin;
+ UCHAR TimingType;
+} VideoModeDescriptor, *PVideoModeDescriptor;
+
+typedef struct _WmiMonitorListedSupportedSourceModes {
+ USHORT NumOfMonitorSourceModes;
+ USHORT PreferredMonitorSourceModeIndex;
+ VideoModeDescriptor MonitorSourceModes[1];
+} WmiMonitorListedSupportedSourceModes, *PWmiMonitorListedSupportedSourceModes;
+
+typedef struct _FrequencyRangeDescriptor {
+ UCHAR Origin;
+ ULONG MinVSyncNumerator;
+ ULONG MinVSyncDenominator;
+ ULONG MaxVSyncNumerator;
+ ULONG MaxVSyncDenominator;
+ ULONG MinHSyncNumerator;
+ ULONG MinHSyncDenominator;
+ ULONG MaxHSyncNumerator;
+ ULONG MaxHSyncDenominator;
+ ULONG ConstraintType;
+ ULONG ActiveWidth;
+ ULONG ActiveHeight;
+ ULONG MaxPixelRate;
+} FrequencyRangeDescriptor, *PFrequencyRangeDescriptor;
+
+typedef struct _WmiMonitorListedFrequencyRanges {
+ USHORT NumOfMonitorFreqRanges;
+ FrequencyRangeDescriptor MonitorFreqRanges[1];
+} WmiMonitorListedFrequencyRanges, *PWmiMonitorListedFrequencyRanges;
+
+typedef struct _KernelPerfState {
+ ULONG Frequency;
+ ULONG Power;
+ UCHAR PercentFrequency;
+ UCHAR IncreaseLevel;
+ UCHAR DecreaseLevel;
+ UCHAR Type;
+ ULONG IncreaseTime;
+ ULONG DecreaseTime;
+ ULONGLONG Control;
+ ULONGLONG Status;
+ ULONG HitCount;
+ ULONG Reserved1;
+ ULONGLONG Reserved2;
+ ULONGLONG Reserved3;
+} KernelPerfState, *PKernelPerfState;
+
+typedef struct _KernelPerfStates {
+ ULONG Count;
+ ULONG MaxFrequency;
+ ULONG CurrentState;
+ ULONG MaxPerfState;
+ ULONG MinPerfState;
+ ULONG LowestPerfState;
+ ULONG ThermalConstraint;
+ UCHAR BusyAdjThreshold;
+ UCHAR PolicyType;
+ UCHAR Type;
+ UCHAR Reserved;
+ ULONG TimerInterval;
+ ULONGLONG TargetProcessors;
+ ULONG PStateHandler;
+ ULONG PStateContext;
+ ULONG TStateHandler;
+ ULONG TStateContext;
+ ULONG FeedbackHandler;
+ ULONG Reserved1;
+ ULONGLONG Reserved2;
+ KernelPerfState State[1];
+} KernelPerfStates, *PKernelPerfStates;
+
+typedef struct _KernelIdleState {
+ ULONG Latency;
+ ULONG Power;
+ ULONG TimeCheck;
+ UCHAR PromotePercent;
+ UCHAR DemotePercent;
+ UCHAR StateType;
+ UCHAR Reserved;
+ ULONG StateFlags;
+ ULONG Context;
+ ULONG IdleHandler;
+ ULONG Reserved1;
+} KernelIdleState, *PKernelIdleState;
+
+typedef struct _KernelIdleStates {
+ ULONG Type;
+ ULONG Count;
+ ULONG TargetState;
+ ULONG OldState;
+ ULONGLONG TargetProcessors;
+ KernelIdleState State[1];
+} KernelIdleStates, *PKernelIdleStates;
+
+typedef struct _KernelPerfStateChange {
+ ULONG State;
+ ULONG Status;
+ ULONG Latency;
+ ULONG Speed;
+ ULONG Processor;
+} KernelPerfStateChange, *PKernelPerfStateChange;
+
+typedef struct _KernelPerfStateDomainChange {
+ ULONG State;
+ ULONG Latency;
+ ULONG Speed;
+ ULONGLONG Processors;
+} KernelPerfStateDomainChange, *PKernelPerfStateDomainChange;
+
+typedef struct _KernelIdleStateChange {
+ ULONG NewState;
+ ULONG OldState;
+ ULONGLONG Processors;
+} KernelIdleStateChange, *PKernelIdleStateChange;
+
+typedef struct _KernelThermalConstraintChange {
+ ULONG ThermalConstraint;
+ ULONGLONG Processors;
+} KernelThermalConstraintChange, *PKernelThermalConstraintChange;
+
+typedef struct _IdleStateAccounting {
+ ULONG IdleTransitions;
+ ULONG FailedTransitions;
+ ULONG InvalidBucketIndex;
+ ULONGLONG TotalTime;
+ ULONG IdleTimeBuckets[6];
+} IdleStateAccounting, *PIdleStateAccounting;
+
+typedef struct _IdleAccounting {
+ ULONG StateCount;
+ ULONG TotalTransitions;
+ ULONG ResetCount;
+ ULONGLONG StartTime;
+ IdleStateAccounting State[1];
+} IdleAccounting, *PIdleAccounting;
+
+typedef struct _IdleStateBucketEx {
+ ULONGLONG TotalTimeUs;
+ ULONG MinTimeUs;
+ ULONG MaxTimeUs;
+ ULONG Count;
+} IdleStateBucketEx, *PIdleStateBucketEx;
+
+typedef struct _IdleStateAccountingEx {
+ ULONGLONG TotalTime;
+ ULONG IdleTransitions;
+ ULONG FailedTransitions;
+ ULONG InvalidBucketIndex;
+ ULONG MinTimeUs;
+ ULONG MaxTimeUs;
+ IdleStateBucketEx IdleTimeBuckets[16];
+} IdleStateAccountingEx, *PIdleStateAccountingEx;
+
+typedef struct _IdleAccountingEx {
+ ULONG StateCount;
+ ULONG TotalTransitions;
+ ULONG ResetCount;
+ ULONGLONG StartTime;
+ IdleStateAccountingEx State[1];
+} IdleAccountingEx, *PIdleAccountingEx;
+
+typedef struct _KernelThermalPolicyChange {
+ UCHAR CoolingMode;
+ ULONGLONG Processors;
+} KernelThermalPolicyChange, *PKernelThermalPolicyChange;
+
+typedef struct _ProcessorPerformance {
+ ULONG frequency;
+ ULONG power;
+ ULONG percentage;
+} ProcessorPerformance, *PProcessorPerformance;
diff --git a/include/ddk/wmlib.h b/include/ddk/wmlib.h
deleted file mode 100644
index 98b857500c5..00000000000
--- a/include/ddk/wmlib.h
+++ /dev/null
@@ -1,129 +0,0 @@
-
-#ifndef _WMILIB_
-#define _WMILIB_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct _WMIGUIDREGINFO {
- LPCGUID Guid;
- ULONG InstanceCount;
- ULONG Flags;
-} WMIGUIDREGINFO, *PWMIGUIDREGINFO;
-
-typedef enum _WMIENABLEDISABLECONTROL {
- WmiEventControl,
- WmiDataBlockControl
-} WMIENABLEDISABLECONTROL, *PWMIENABLEDISABLECONTROL;
-
-typedef enum _SYSCTL_IRP_DISPOSITION {
- IrpProcessed,
- IrpNotCompleted,
- IrpNotWmi,
- IrpForward
-} SYSCTL_IRP_DISPOSITION, *PSYSCTL_IRP_DISPOSITION;
-
-typedef
-NTSTATUS
-(NTAPI WMI_QUERY_REGINFO_CALLBACK)(
- IN OUT PDEVICE_OBJECT DeviceObject,
- IN OUT PULONG RegFlags,
- IN OUT PUNICODE_STRING InstanceName,
- IN OUT PUNICODE_STRING *RegistryPath OPTIONAL,
- IN OUT PUNICODE_STRING MofResourceName,
- OUT PDEVICE_OBJECT *Pdo OPTIONAL);
-
-typedef WMI_QUERY_REGINFO_CALLBACK *PWMI_QUERY_REGINFO;
-
-typedef
-NTSTATUS
-(NTAPI WMI_QUERY_DATABLOCK_CALLBACK)(
- IN OUT PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp,
- IN OUT ULONG GuidIndex,
- IN ULONG InstanceIndex,
- IN ULONG InstanceCount,
- OUT PULONG InstanceLengthArray OPTIONAL,
- IN ULONG BufferAvail,
- OUT PUCHAR Buffer OPTIONAL);
-
-typedef WMI_QUERY_DATABLOCK_CALLBACK *PWMI_QUERY_DATABLOCK;
-
-typedef
-NTSTATUS
-(NTAPI WMI_SET_DATABLOCK_CALLBACK)(
- IN OUT PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp,
- IN ULONG GuidIndex,
- IN ULONG InstanceIndex,
- IN ULONG BufferSize,
- IN PUCHAR Buffer);
-
-typedef WMI_SET_DATABLOCK_CALLBACK *PWMI_SET_DATABLOCK;
-
-typedef
-NTSTATUS
-(NTAPI WMI_SET_DATAITEM_CALLBACK)(
- IN OUT PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp,
- IN ULONG GuidIndex,
- IN ULONG InstanceIndex,
- IN ULONG DataItemId,
- IN ULONG BufferSize,
- IN PUCHAR Buffer);
-
-typedef WMI_SET_DATAITEM_CALLBACK *PWMI_SET_DATAITEM;
-
-typedef
-NTSTATUS
-(NTAPI WMI_EXECUTE_METHOD_CALLBACK)(
- IN OUT PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp,
- IN ULONG GuidIndex,
- IN ULONG InstanceIndex,
- IN ULONG MethodId,
- IN ULONG InBufferSize,
- IN ULONG OutBufferSize,
- IN OUT PUCHAR Buffer);
-
-typedef WMI_EXECUTE_METHOD_CALLBACK *PWMI_EXECUTE_METHOD;
-
-typedef
-NTSTATUS
-(NTAPI WMI_FUNCTION_CONTROL_CALLBACK)(
- IN OUT PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp,
- IN ULONG GuidIndex,
- IN WMIENABLEDISABLECONTROL Function,
- IN BOOLEAN Enable);
-
-typedef WMI_FUNCTION_CONTROL_CALLBACK *PWMI_FUNCTION_CONTROL;
-
-typedef struct _WMILIB_CONTEXT {
- ULONG GuidCount;
- PWMIGUIDREGINFO GuidList;
- PWMI_QUERY_REGINFO QueryWmiRegInfo;
- PWMI_QUERY_DATABLOCK QueryWmiDataBlock;
- PWMI_SET_DATABLOCK SetWmiDataBlock;
- PWMI_SET_DATAITEM SetWmiDataItem;
- PWMI_EXECUTE_METHOD ExecuteWmiMethod;
- PWMI_FUNCTION_CONTROL WmiFunctionControl;
-} WMILIB_CONTEXT, *PWMILIB_CONTEXT;
-
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
-NTSTATUS
-NTAPI
-WmiSystemControl(
- IN PWMILIB_CONTEXT WmiLibInfo,
- IN PDEVICE_OBJECT DeviceObject,
- IN OUT PIRP Irp,
- OUT PSYSCTL_IRP_DISPOSITION IrpDisposition);
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !_WMILIB_ */
-
diff --git a/include/ddk/ws2san.h b/include/ddk/ws2san.h
index 392085d7ce4..502f43d70fa 100644
--- a/include/ddk/ws2san.h
+++ b/include/ddk/ws2san.h
@@ -20,27 +20,21 @@
*
*/
-#ifndef __WS2SAN_H
-#define __WS2SAN_H
+#pragma once
-#include
+#define _WS2SAN_H_
#ifdef __cplusplus
extern "C" {
#endif
-#define WSPAPI WINAPI
-
-/* FIXME: Unknown definitions */
-typedef PVOID LPWSPDATA;
-typedef PDWORD LPWSATHREADID;
-typedef PVOID LPWSPPROC_TABLE;
-typedef struct _WSPUPCALLTABLEEX WSPUPCALLTABLEEX;
-typedef WSPUPCALLTABLEEX *LPWSPUPCALLTABLEEX;
-
#define SO_MAX_RDMA_SIZE 0x700D
#define SO_RDMA_THRESHOLD_SIZE 0x700E
+#define MEM_READ 1
+#define MEM_WRITE 2
+#define MEM_READWRITE 3
+
#define WSAID_REGISTERMEMORY \
{0xC0B422F5, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}}
@@ -59,184 +53,198 @@ typedef WSPUPCALLTABLEEX *LPWSPUPCALLTABLEEX;
#define WSAID_RDMAREAD \
{0xC0B422FA, 0xF58C, 0x11d1, {0xAD, 0x6C, 0x00, 0xC0, 0x4F, 0xA3, 0x4A, 0x2D}}
+#if(_WIN32_WINNT >= 0x0501)
#define WSAID_MEMORYREGISTRATIONCACHECALLBACK \
{0xE5DA4AF8, 0xD824, 0x48CD, {0xA7, 0x99, 0x63, 0x37, 0xA9, 0x8E, 0xD2, 0xAF}}
-
-typedef struct _WSABUFEX {
- u_long len;
- char FAR *buf;
- HANDLE handle;
-} WSABUFEX, FAR * LPWSABUFEX;
-
-#if 0
-typedef struct _WSPUPCALLTABLEEX {
- LPWPUCLOSEEVENT lpWPUCloseEvent;
- LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle;
- LPWPUCREATEEVENT lpWPUCreateEvent;
- LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle;
- LPWPUFDISSET lpWPUFDIsSet;
- LPWPUGETPROVIDERPATH lpWPUGetProviderPath;
- LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle;
- LPWPUPOSTMESSAGE lpWPUPostMessage;
- LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback;
- LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext;
- LPWPUQUEUEAPC lpWPUQueueApc;
- LPWPURESETEVENT lpWPUResetEvent;
- LPWPUSETEVENT lpWPUSetEvent;
- LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread;
- LPWPUCLOSETHREAD lpWPUCloseThread;
- LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
-} WSPUPCALLTABLEEX, FAR * LPWSPUPCALLTABLEEX;
#endif
-int WSPAPI
+typedef struct _WSPUPCALLTABLEEX {
+ LPWPUCLOSEEVENT lpWPUCloseEvent;
+ LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle;
+ LPWPUCREATEEVENT lpWPUCreateEvent;
+ LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle;
+ LPWPUFDISSET lpWPUFDIsSet;
+ LPWPUGETPROVIDERPATH lpWPUGetProviderPath;
+ LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle;
+ LPWPUPOSTMESSAGE lpWPUPostMessage;
+ LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback;
+ LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext;
+ LPWPUQUEUEAPC lpWPUQueueApc;
+ LPWPURESETEVENT lpWPUResetEvent;
+ LPWPUSETEVENT lpWPUSetEvent;
+ LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread;
+ LPWPUCLOSETHREAD lpWPUCloseThread;
+ LPWPUCOMPLETEOVERLAPPEDREQUEST lpWPUCompleteOverlappedRequest;
+} WSPUPCALLTABLEEX, FAR *LPWSPUPCALLTABLEEX;
+
+typedef struct _WSABUFEX {
+ u_long len;
+ char FAR *buf;
+ HANDLE handle;
+} WSABUFEX, FAR * LPWSABUFEX;
+
+typedef int
+(WSPAPI *LPWSPSTARTUPEX)(
+ IN WORD wVersionRequested,
+ OUT LPWSPDATA lpWSPData,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
+ IN LPWSPUPCALLTABLEEX lpUpcallTable,
+ OUT LPWSPPROC_TABLE lpProcTable);
+
+typedef HANDLE
+(WSPAPI *LPFN_WSPREGISTERMEMORY)(
+ IN SOCKET s,
+ IN PVOID lpBuffer,
+ IN DWORD dwBufferLength,
+ IN DWORD dwFlags,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPFN_WSPDEREGISTERMEMORY)(
+ IN SOCKET s,
+ IN HANDLE Handle,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPFN_WSPREGISTERRDMAMEMORY)(
+ IN SOCKET s,
+ IN PVOID lpBuffer,
+ IN DWORD dwBufferLength,
+ IN DWORD dwFlags,
+ OUT LPVOID lpRdmaBufferDescriptor,
+ IN OUT LPDWORD lpdwDescriptorLength,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPFN_WSPDEREGISTERRDMAMEMORY)(
+ IN SOCKET s,
+ IN LPVOID lpRdmaBufferDescriptor,
+ IN DWORD dwDescriptorLength,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPFN_WSPRDMAWRITE)(
+ IN SOCKET s,
+ IN LPWSABUFEX lpBuffers,
+ IN DWORD dwBufferCount,
+ IN LPVOID lpTargetBufferDescriptor,
+ IN DWORD dwTargetDescriptorLength,
+ IN DWORD dwTargetBufferOffset,
+ OUT LPDWORD lpdwNumberOfBytesWritten,
+ IN DWORD dwFlags,
+ IN LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPFN_WSPRDMAREAD)(
+ IN SOCKET s,
+ IN LPWSABUFEX lpBuffers,
+ IN DWORD dwBufferCount,
+ IN LPVOID lpTargetBufferDescriptor,
+ IN DWORD dwTargetDescriptorLength,
+ IN DWORD dwTargetBufferOffset,
+ OUT LPDWORD lpdwNumberOfBytesRead,
+ IN DWORD dwFlags,
+ IN LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+#if(_WIN32_WINNT >= 0x0501)
+typedef int
+(WSPAPI *LPFN_WSPMEMORYREGISTRATIONCACHECALLBACK)(
+ IN PVOID lpvAddress,
+ IN SIZE_T Size,
+ OUT LPINT lpErrno);
+#endif
+
+int
+WSPAPI
WSPStartupEx(
- IN WORD wVersionRequested,
- OUT LPWSPDATA lpWSPData,
- IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
- IN LPWSPUPCALLTABLEEX lpUpcallTable,
- OUT LPWSPPROC_TABLE lpProcTable);
+ IN WORD wVersionRequested,
+ OUT LPWSPDATA lpWSPData,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
+ IN LPWSPUPCALLTABLEEX lpUpcallTable,
+ OUT LPWSPPROC_TABLE lpProcTable);
-typedef int WSPAPI
-(*LPWSPSTARTUPEX)(
- IN WORD wVersionRequested,
- OUT LPWSPDATA lpWSPData,
- IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
- IN LPWSPUPCALLTABLEEX lpUpcallTable,
- OUT LPWSPPROC_TABLE lpProcTable);
-
-#define MEM_READ 1
-#define MEM_WRITE 2
-#define MEM_READWRITE 3
-
-int WSPAPI
-WSPDeregisterMemory(
- IN SOCKET s,
- IN HANDLE Handle,
- OUT LPINT lpErrno);
-
-typedef int WSPAPI
-(*LPFN_WSPDEREGISTERMEMORY)(
- IN SOCKET s,
- IN HANDLE Handle,
- OUT LPINT lpErrno);
-
-int WSPAPI
-WSPDeregisterRdmaMemory(
- IN SOCKET s,
- IN LPVOID lpRdmaBufferDescriptor,
- IN DWORD dwDescriptorLength,
- OUT LPINT lpErrno);
-
-typedef int WSPAPI
-(*LPFN_WSPDEREGISTERRDMAMEMORY)(
- IN SOCKET s,
- IN LPVOID lpRdmaBufferDescriptor,
- IN DWORD dwDescriptorLength,
- OUT LPINT lpErrno);
-
-int WSPAPI
-WSPMemoryRegistrationCacheCallback(
- IN PVOID lpvAddress,
- IN SIZE_T Size,
- OUT LPINT lpErrno);
-
-typedef int WSPAPI
-(*LPFN_WSPMEMORYREGISTRATIONCACHECALLBACK)(
- IN PVOID lpvAddress,
- IN SIZE_T Size,
- OUT LPINT lpErrno);
-
-int WSPAPI
-WSPRdmaRead(
- IN SOCKET s,
- IN LPWSABUFEX lpBuffers,
- IN DWORD dwBufferCount,
- IN LPVOID lpTargetBufferDescriptor,
- IN DWORD dwTargetDescriptorLength,
- IN DWORD dwTargetBufferOffset,
- OUT LPDWORD lpdwNumberOfBytesRead,
- IN DWORD dwFlags,
- IN LPWSAOVERLAPPED lpOverlapped,
- IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
- IN LPWSATHREADID lpThreadId,
- OUT LPINT lpErrno);
-
-typedef int WSPAPI
-(*LPFN_WSPRDMAREAD)(
- IN SOCKET s,
- IN LPWSABUFEX lpBuffers,
- IN DWORD dwBufferCount,
- IN LPVOID lpTargetBufferDescriptor,
- IN DWORD dwTargetDescriptorLength,
- IN DWORD dwTargetBufferOffset,
- OUT LPDWORD lpdwNumberOfBytesRead,
- IN DWORD dwFlags,
- IN LPWSAOVERLAPPED lpOverlapped,
- IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
- IN LPWSATHREADID lpThreadId,
- OUT LPINT lpErrno);
-
-int WSPAPI
-WSPRdmaWrite(
- IN SOCKET s,
- IN LPWSABUFEX lpBuffers,
- IN DWORD dwBufferCount,
- IN LPVOID lpTargetBufferDescriptor,
- IN DWORD dwTargetDescriptorLength,
- IN DWORD dwTargetBufferOffset,
- OUT LPDWORD lpdwNumberOfBytesWritten,
- IN DWORD dwFlags,
- IN LPWSAOVERLAPPED lpOverlapped,
- IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
- IN LPWSATHREADID lpThreadId,
- OUT LPINT lpErrno);
-
-typedef int WSPAPI
-(*LPFN_WSPRDMAWRITE)(
- IN SOCKET s,
- IN LPWSABUFEX lpBuffers,
- IN DWORD dwBufferCount,
- IN LPVOID lpTargetBufferDescriptor,
- IN DWORD dwTargetDescriptorLength,
- IN DWORD dwTargetBufferOffset,
- OUT LPDWORD lpdwNumberOfBytesWritten,
- IN DWORD dwFlags,
- IN LPWSAOVERLAPPED lpOverlapped,
- IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
- IN LPWSATHREADID lpThreadId,
- OUT LPINT lpErrno);
-
-HANDLE WSPAPI
+HANDLE
+WSPAPI
WSPRegisterMemory(
- IN SOCKET s,
- IN PVOID lpBuffer,
- IN DWORD dwBufferLength,
- IN DWORD dwFlags,
- OUT LPINT lpErrno);
+ IN SOCKET s,
+ IN PVOID lpBuffer,
+ IN DWORD dwBufferLength,
+ IN DWORD dwFlags,
+ OUT LPINT lpErrno);
-int WSPAPI
+int
+WSPAPI
+WSPDeregisterMemory(
+ IN SOCKET s,
+ IN HANDLE Handle,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
WSPRegisterRdmaMemory(
- IN SOCKET s,
- IN PVOID lpBuffer,
- IN DWORD dwBufferLength,
- IN DWORD dwFlags,
- OUT LPVOID lpRdmaBufferDescriptor,
- IN OUT LPDWORD lpdwDescriptorLength,
- OUT LPINT lpErrno);
+ IN SOCKET s,
+ IN PVOID lpBuffer,
+ IN DWORD dwBufferLength,
+ IN DWORD dwFlags,
+ OUT LPVOID lpRdmaBufferDescriptor,
+ IN OUT LPDWORD lpdwDescriptorLength,
+ OUT LPINT lpErrno);
-typedef int WSPAPI
-(*LPFN_WSPREGISTERRDMAMEMORY)(
- IN SOCKET s,
- IN PVOID lpBuffer,
- IN DWORD dwBufferLength,
- IN DWORD dwFlags,
- OUT LPVOID lpRdmaBufferDescriptor,
- IN OUT LPDWORD lpdwDescriptorLength,
- OUT LPINT lpErrno);
+int
+WSPAPI
+WSPDeregisterRdmaMemory(
+ IN SOCKET s,
+ IN LPVOID lpRdmaBufferDescriptor,
+ IN DWORD dwDescriptorLength,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSPRdmaWrite(
+ IN SOCKET s,
+ IN LPWSABUFEX lpBuffers,
+ IN DWORD dwBufferCount,
+ IN LPVOID lpTargetBufferDescriptor,
+ IN DWORD dwTargetDescriptorLength,
+ IN DWORD dwTargetBufferOffset,
+ OUT LPDWORD lpdwNumberOfBytesWritten,
+ IN DWORD dwFlags,
+ IN LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSPRdmaRead(
+ IN SOCKET s,
+ IN LPWSABUFEX lpBuffers,
+ IN DWORD dwBufferCount,
+ IN LPVOID lpTargetBufferDescriptor,
+ IN DWORD dwTargetDescriptorLength,
+ IN DWORD dwTargetBufferOffset,
+ OUT LPDWORD lpdwNumberOfBytesRead,
+ IN DWORD dwFlags,
+ IN LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+#if(_WIN32_WINNT >= 0x0501)
+int
+WSPAPI
+WSPMemoryRegistrationCacheCallback(
+ IN PVOID lpvAddress,
+ IN SIZE_T Size,
+ OUT LPINT lpErrno);
+#endif
#ifdef __cplusplus
}
#endif
-
-#endif /* __WS2SAN_H */
diff --git a/include/dxsdk/ksguid.h b/include/dxsdk/ksguid.h
index 84b1e59487c..51b1bb38a36 100644
--- a/include/dxsdk/ksguid.h
+++ b/include/dxsdk/ksguid.h
@@ -6,7 +6,7 @@
#endif
#if !defined( DEFINE_WAVEFORMATEX_GUID )
- #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+ #define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, { 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71 }
#endif
#if defined( DEFINE_GUIDEX )
diff --git a/include/ndk/pstypes.h b/include/ndk/pstypes.h
index 43b44680960..414e2dcbec1 100644
--- a/include/ndk/pstypes.h
+++ b/include/ndk/pstypes.h
@@ -60,7 +60,11 @@ Author:
#define FLG_ENABLE_CSRDEBUG 0x00020000
#define FLG_ENABLE_KDEBUG_SYMBOL_LOAD 0x00040000
#define FLG_DISABLE_PAGE_KERNEL_STACKS 0x00080000
+#if (NTDDI_VERSION < NTDDI_WINXP)
#define FLG_HEAP_ENABLE_CALL_TRACING 0x00100000
+#else
+#define FLG_ENABLE_SYSTEM_CRIT_BREAKS 0x00100000
+#endif
#define FLG_HEAP_DISABLE_COALESCING 0x00200000
#define FLG_ENABLE_CLOSE_EXCEPTIONS 0x00400000
#define FLG_ENABLE_EXCEPTION_LOGGING 0x00800000
diff --git a/include/ndk/rtlfuncs.h b/include/ndk/rtlfuncs.h
index 18aa4749ad4..731d2386b46 100644
--- a/include/ndk/rtlfuncs.h
+++ b/include/ndk/rtlfuncs.h
@@ -2042,12 +2042,12 @@ RtlRemoteCall(
);
NTSYSAPI
-VOID
+NTSTATUS
NTAPI
RtlSetProcessIsCritical(
IN BOOLEAN NewValue,
OUT PBOOLEAN OldValue OPTIONAL,
- IN BOOLEAN IsWinlogon
+ IN BOOLEAN NeedBreaks
);
NTSYSAPI
@@ -3185,9 +3185,9 @@ NTSYSAPI
NTSTATUS
NTAPI
RtlIpv4StringToAddressW(
- IN PWCHAR String,
- IN UCHAR Strict,
- OUT PWCHAR Terminator,
+ IN PCWSTR String,
+ IN BOOLEAN Strict,
+ OUT LPWSTR *Terminator,
OUT struct in_addr *Addr
);
diff --git a/include/ndk/rtltypes.h b/include/ndk/rtltypes.h
index aa6d8607fb6..b98d3b3966f 100644
--- a/include/ndk/rtltypes.h
+++ b/include/ndk/rtltypes.h
@@ -558,23 +558,8 @@ typedef NTSTATUS
IN OUT PSIZE_T CommitSize
);
-//
-// Version Info redefinitions
-//
-typedef OSVERSIONINFOW RTL_OSVERSIONINFOW;
-typedef LPOSVERSIONINFOW PRTL_OSVERSIONINFOW;
-typedef OSVERSIONINFOEXW RTL_OSVERSIONINFOEXW;
-typedef LPOSVERSIONINFOEXW PRTL_OSVERSIONINFOEXW;
-
-//
-// Simple pointer definitions
-//
-typedef ACL_REVISION_INFORMATION *PACL_REVISION_INFORMATION;
-typedef ACL_SIZE_INFORMATION *PACL_SIZE_INFORMATION;
-
//
// Parameters for RtlCreateHeap
-// FIXME: Determine whether Length is SIZE_T or ULONG
//
typedef struct _RTL_HEAP_PARAMETERS
{
diff --git a/include/psdk/basetsd.h b/include/psdk/basetsd.h
index e2e5b93f453..0216e499313 100644
--- a/include/psdk/basetsd.h
+++ b/include/psdk/basetsd.h
@@ -15,6 +15,55 @@
#endif
#endif
+#if defined(_MSC_VER) && (_MSC_VER < 1300)
+#error Old MSVC compiler version.
+#endif
+
+#ifdef _MAC
+#error Not supported.
+#endif
+
+#if !defined(_X86_) && !defined(_AMD64) && !defined(_IA64_) && !defined(_ALPHA_) && \
+ !defined(_ARM_) && !defined(_PPC_) && !defined(_MIPS_) && !defined(_68K_)
+
+#if defined(_M_IX86)
+#define _X86_
+#elif defined(_M_AMD64) || defined(__x86_64__)
+#define _AMD64_
+#elif defined(_M_IA64) || defined(__ia64__)
+#define _IA64_
+#elif defined(_M_ALPHA) || defined(__alpha__)
+#define _ALPHA_
+#elif defined(_M_ARM) || defined(__arm__)
+#define _ARM_
+#elif defined(_M_PPC) || defined(__powerpc__)
+#define _PPC_
+#elif defined(_M_MRX000) || defined(__mips__)
+#define _MIPS_
+#elif defined(_M_M68K) || defined(__68k__)
+#define _68K_
+#endif
+
+#endif
+
+#if !defined(MIDL_PASS) && !defined(RC_INVOKED)
+ #define POINTER_64 __ptr64
+ #if defined(_WIN64)
+ #define POINTER_32 __ptr32
+ #else
+ #define POINTER_32
+ #endif
+#else
+ #define POINTER_64
+ #define POINTER_32
+#endif /* !defined(MIDL_PASS) && !defined(RC_INVOKED) */
+
+#if defined(_M_MRX000) || defined(_M_AMD64) || defined(_M_IA64)
+ typedef unsigned __int64 POINTER_64_INT;
+#else
+ typedef unsigned long POINTER_64_INT;
+#endif
+
#if defined(_WIN64)
#define __int3264 __int64
#define ADDRESS_TAG_BIT 0x40000000000UI64
diff --git a/include/psdk/batclass.h b/include/psdk/batclass.h
index 24fc0892944..371ecc4d47e 100644
--- a/include/psdk/batclass.h
+++ b/include/psdk/batclass.h
@@ -20,49 +20,38 @@
*
*/
-#ifndef __BATCLASS_H
-#define __BATCLASS_H
+#pragma once
#ifdef __cplusplus
extern "C" {
#endif
-#if defined(_BATTERYCLASS_)
- #define BCLASSAPI
-#else
- #define BCLASSAPI DECLSPEC_IMPORT
-#endif
-
-
/* Battery device GUIDs */
DEFINE_GUID(GUID_DEVICE_BATTERY,
0x72631e54L, 0x78A4, 0x11d0, 0xbc, 0xf7, 0x00, 0xaa, 0x00, 0xb7, 0xb3, 0x2a);
+#if (NTDDI_VERSION >= NTDDI_WINXP)
DEFINE_GUID(BATTERY_STATUS_WMI_GUID,
0xfc4670d1, 0xebbf, 0x416e, 0x87, 0xce, 0x37, 0x4a, 0x4e, 0xbc, 0x11, 0x1a);
-
DEFINE_GUID(BATTERY_RUNTIME_WMI_GUID,
0x535a3767, 0x1ac2, 0x49bc, 0xa0, 0x77, 0x3f, 0x7a, 0x02, 0xe4, 0x0a, 0xec);
-
DEFINE_GUID(BATTERY_TEMPERATURE_WMI_GUID,
0x1a52a14d, 0xadce, 0x4a44, 0x9a, 0x3e, 0xc8, 0xd8, 0xf1, 0x5f, 0xf2, 0xc2);
-
DEFINE_GUID(BATTERY_FULL_CHARGED_CAPACITY_WMI_GUID,
0x40b40565, 0x96f7, 0x4435, 0x86, 0x94, 0x97, 0xe0, 0xe4, 0x39, 0x59, 0x05);
-
DEFINE_GUID(BATTERY_CYCLE_COUNT_WMI_GUID,
0xef98db24, 0x0014, 0x4c25, 0xa5, 0x0b, 0xc7, 0x24, 0xae, 0x5c, 0xd3, 0x71);
-
DEFINE_GUID(BATTERY_STATIC_DATA_WMI_GUID,
0x05e1e463, 0xe4e2, 0x4ea9, 0x80, 0xcb, 0x9b, 0xd4, 0xb3, 0xca, 0x06, 0x55);
-
DEFINE_GUID(BATTERY_STATUS_CHANGE_WMI_GUID,
0xcddfa0c3, 0x7c5b, 0x4e43, 0xa0, 0x34, 0x05, 0x9f, 0xa5, 0xb8, 0x43, 0x64);
-
DEFINE_GUID(BATTERY_TAG_CHANGE_WMI_GUID,
0x5e1f6e19, 0x8786, 0x4d23, 0x94, 0xfc, 0x9e, 0x74, 0x6b, 0xd5, 0xd8, 0x88);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+#ifndef _BATCLASS_
+#define _BATCLASS_
/* BATTERY_INFORMATION.Capabilities constants */
#define BATTERY_SET_CHARGE_SUPPORTED 0x00000001
@@ -72,30 +61,13 @@ DEFINE_GUID(BATTERY_TAG_CHANGE_WMI_GUID,
#define BATTERY_CAPACITY_RELATIVE 0x40000000
#define BATTERY_SYSTEM_BATTERY 0x80000000
-typedef struct _BATTERY_INFORMATION {
- ULONG Capabilities;
- UCHAR Technology;
- UCHAR Reserved[3];
- UCHAR Chemistry[4];
- ULONG DesignedCapacity;
- ULONG FullChargedCapacity;
- ULONG DefaultAlert1;
- ULONG DefaultAlert2;
- ULONG CriticalBias;
- ULONG CycleCount;
-} BATTERY_INFORMATION, *PBATTERY_INFORMATION;
+/* BATTERY_INFORMATION.Capacity constants */
+#define BATTERY_UNKNOWN_CAPACITY 0xFFFFFFFF
-typedef struct _BATTERY_MANUFACTURE_DATE {
- UCHAR Day;
- UCHAR Month;
- USHORT Year;
-} BATTERY_MANUFACTURE_DATE, *PBATTERY_MANUFACTURE_DATE;
+/* BatteryEstimatedTime constant */
+#define BATTERY_UNKNOWN_TIME 0x80000000
-typedef struct _BATTERY_NOTIFY {
- ULONG PowerState;
- ULONG LowCapacity;
- ULONG HighCapacity;
-} BATTERY_NOTIFY, *PBATTERY_NOTIFY;
+#define MAX_BATTERY_STRING_SIZE 128
/* BATTERY_STATUS.PowerState flags */
#define BATTERY_POWER_ON_LINE 0x00000001
@@ -109,15 +81,17 @@ typedef struct _BATTERY_NOTIFY {
/* BATTERY_STATUS.Rate constant */
#define BATTERY_UNKNOWN_RATE 0x80000000
-typedef struct _BATTERY_STATUS {
- ULONG PowerState;
- ULONG Capacity;
- ULONG Voltage;
- LONG Rate;
-} BATTERY_STATUS, *PBATTERY_STATUS;
+#define IOCTL_BATTERY_QUERY_TAG \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x10, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_BATTERY_QUERY_INFORMATION \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x11, METHOD_BUFFERED, FILE_READ_ACCESS)
+#define IOCTL_BATTERY_SET_INFORMATION \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x12, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+#define IOCTL_BATTERY_QUERY_STATUS \
+ CTL_CODE(FILE_DEVICE_BATTERY, 0x13, METHOD_BUFFERED, FILE_READ_ACCESS)
-/* BATTERY_INFORMATION.Capacity constants */
-#define BATTERY_UNKNOWN_CAPACITY 0xFFFFFFFF
+/* NTSTATUS possibly returned by BCLASS_QUERY_STATUS */
+#define BATTERY_TAG_INVALID 0
typedef enum _BATTERY_QUERY_INFORMATION_LEVEL {
BatteryInformation = 0,
@@ -131,137 +105,216 @@ typedef enum _BATTERY_QUERY_INFORMATION_LEVEL {
BatterySerialNumber
} BATTERY_QUERY_INFORMATION_LEVEL;
-/* BatteryEstimatedTime constant */
-#define BATTERY_UNKNOWN_TIME 0x80000000
-
-/* NTSTATUS possibly returned by BCLASS_QUERY_STATUS */
-#define BATTERY_TAG_INVALID 0
-
typedef struct _BATTERY_QUERY_INFORMATION {
- ULONG BatteryTag;
- BATTERY_QUERY_INFORMATION_LEVEL InformationLevel;
- LONG AtRate;
+ ULONG BatteryTag;
+ BATTERY_QUERY_INFORMATION_LEVEL InformationLevel;
+ LONG AtRate;
} BATTERY_QUERY_INFORMATION, *PBATTERY_QUERY_INFORMATION;
+typedef struct _BATTERY_INFORMATION {
+ ULONG Capabilities;
+ UCHAR Technology;
+ UCHAR Reserved[3];
+ UCHAR Chemistry[4];
+ ULONG DesignedCapacity;
+ ULONG FullChargedCapacity;
+ ULONG DefaultAlert1;
+ ULONG DefaultAlert2;
+ ULONG CriticalBias;
+ ULONG CycleCount;
+} BATTERY_INFORMATION, *PBATTERY_INFORMATION;
+
+typedef struct _BATTERY_MANUFACTURE_DATE {
+ UCHAR Day;
+ UCHAR Month;
+ USHORT Year;
+} BATTERY_MANUFACTURE_DATE, *PBATTERY_MANUFACTURE_DATE;
+
typedef enum _BATTERY_SET_INFORMATION_LEVEL {
BatteryCriticalBias = 0,
BatteryCharge,
BatteryDischarge
} BATTERY_SET_INFORMATION_LEVEL;
-#define MAX_BATTERY_STRING_SIZE 128
-
typedef struct _BATTERY_SET_INFORMATION {
- ULONG BatteryTag;
- BATTERY_SET_INFORMATION_LEVEL InformationLevel;
- UCHAR Buffer[1];
+ ULONG BatteryTag;
+ BATTERY_SET_INFORMATION_LEVEL InformationLevel;
+ UCHAR Buffer[1];
} BATTERY_SET_INFORMATION, *PBATTERY_SET_INFORMATION;
typedef struct _BATTERY_WAIT_STATUS {
- ULONG BatteryTag;
- ULONG Timeout;
- ULONG PowerState;
- ULONG LowCapacity;
- ULONG HighCapacity;
+ ULONG BatteryTag;
+ ULONG Timeout;
+ ULONG PowerState;
+ ULONG LowCapacity;
+ ULONG HighCapacity;
} BATTERY_WAIT_STATUS, *PBATTERY_WAIT_STATUS;
+typedef struct _BATTERY_STATUS {
+ ULONG PowerState;
+ ULONG Capacity;
+ ULONG Voltage;
+ LONG Rate;
+} BATTERY_STATUS, *PBATTERY_STATUS;
-#define IOCTL_BATTERY_QUERY_TAG \
- CTL_CODE(FILE_DEVICE_BATTERY, 0x10, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_BATTERY_QUERY_INFORMATION \
- CTL_CODE(FILE_DEVICE_BATTERY, 0x11, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-#define IOCTL_BATTERY_SET_INFORMATION \
- CTL_CODE(FILE_DEVICE_BATTERY, 0x12, METHOD_BUFFERED, FILE_WRITE_ACCESS)
-
-#define IOCTL_BATTERY_QUERY_STATUS \
- CTL_CODE(FILE_DEVICE_BATTERY, 0x13, METHOD_BUFFERED, FILE_READ_ACCESS)
-
-
-typedef NTSTATUS
-(NTAPI *BCLASS_DISABLE_STATUS_NOTIFY)(
- IN PVOID Context);
-
-typedef NTSTATUS
-(NTAPI *BCLASS_QUERY_INFORMATION)(
- IN PVOID Context,
- IN ULONG BatteryTag,
- IN BATTERY_QUERY_INFORMATION_LEVEL Level,
- IN LONG AtRate OPTIONAL,
- OUT PVOID Buffer,
- IN ULONG BufferLength,
- OUT PULONG ReturnedLength);
-
-typedef NTSTATUS
-(NTAPI *BCLASS_QUERY_STATUS)(
- IN PVOID Context,
- IN ULONG BatteryTag,
- OUT PBATTERY_STATUS BatteryStatus);
-
-typedef NTSTATUS
-(NTAPI *BCLASS_QUERY_TAG)(
- IN PVOID Context,
- OUT PULONG BatteryTag);
-
-typedef NTSTATUS
-(NTAPI *BCLASS_SET_INFORMATION)(
- IN PVOID Context,
- IN ULONG BatteryTag,
- IN BATTERY_SET_INFORMATION_LEVEL Level,
- IN PVOID Buffer OPTIONAL);
-
-typedef NTSTATUS
-(NTAPI *BCLASS_SET_STATUS_NOTIFY)(
- IN PVOID Context,
- IN ULONG BatteryTag,
- IN PBATTERY_NOTIFY BatteryNotify);
-
-
-typedef struct _BATTERY_MINIPORT_INFO {
- USHORT MajorVersion;
- USHORT MinorVersion;
- PVOID Context;
- BCLASS_QUERY_TAG QueryTag;
- BCLASS_QUERY_INFORMATION QueryInformation;
- BCLASS_SET_INFORMATION SetInformation;
- BCLASS_QUERY_STATUS QueryStatus;
- BCLASS_SET_STATUS_NOTIFY SetStatusNotify;
- BCLASS_DISABLE_STATUS_NOTIFY DisableStatusNotify;
- PDEVICE_OBJECT Pdo;
- PUNICODE_STRING DeviceName;
-} BATTERY_MINIPORT_INFO, *PBATTERY_MINIPORT_INFO;
+#ifndef _WINDOWS_H
/* BATTERY_MINIPORT_INFO.XxxVersion */
#define BATTERY_CLASS_MAJOR_VERSION 0x0001
#define BATTERY_CLASS_MINOR_VERSION 0x0000
+typedef NTSTATUS
+(NTAPI BCLASS_QUERY_TAG_CALLBACK)(
+ IN PVOID Context,
+ OUT PULONG BatteryTag);
+typedef BCLASS_QUERY_TAG_CALLBACK *PBCLASS_QUERY_TAG_CALLBACK;
+
+typedef NTSTATUS
+(NTAPI BCLASS_QUERY_INFORMATION_CALLBACK)(
+ IN PVOID Context,
+ IN ULONG BatteryTag,
+ IN BATTERY_QUERY_INFORMATION_LEVEL Level,
+ IN LONG AtRate,
+ OUT PVOID Buffer,
+ IN ULONG BufferLength,
+ OUT PULONG ReturnedLength);
+typedef BCLASS_QUERY_INFORMATION_CALLBACK *PBCLASS_QUERY_INFORMATION_CALLBACK;
+
+typedef NTSTATUS
+(NTAPI BCLASS_QUERY_STATUS_CALLBACK)(
+ IN PVOID Context,
+ IN ULONG BatteryTag,
+ OUT PBATTERY_STATUS BatteryStatus);
+typedef BCLASS_QUERY_STATUS_CALLBACK *PBCLASS_QUERY_STATUS_CALLBACK;
+
+typedef struct _BATTERY_NOTIFY {
+ ULONG PowerState;
+ ULONG LowCapacity;
+ ULONG HighCapacity;
+} BATTERY_NOTIFY, *PBATTERY_NOTIFY;
+
+typedef NTSTATUS
+(NTAPI BCLASS_SET_STATUS_NOTIFY_CALLBACK)(
+ IN PVOID Context,
+ IN ULONG BatteryTag,
+ IN PBATTERY_NOTIFY BatteryNotify);
+typedef BCLASS_SET_STATUS_NOTIFY_CALLBACK *PBCLASS_SET_STATUS_NOTIFY_CALLBACK;
+
+typedef NTSTATUS
+(NTAPI BCLASS_SET_INFORMATION_CALLBACK)(
+ IN PVOID Context,
+ IN ULONG BatteryTag,
+ IN BATTERY_SET_INFORMATION_LEVEL Level,
+ IN PVOID Buffer OPTIONAL);
+typedef BCLASS_SET_INFORMATION_CALLBACK *PBCLASS_SET_INFORMATION_CALLBACK;
+
+typedef NTSTATUS
+(NTAPI BCLASS_DISABLE_STATUS_NOTIFY_CALLBACK)(
+ IN PVOID Context);
+typedef BCLASS_DISABLE_STATUS_NOTIFY_CALLBACK *PBCLASS_DISABLE_STATUS_NOTIFY_CALLBACK;
+
+typedef PBCLASS_QUERY_TAG_CALLBACK BCLASS_QUERY_TAG;
+typedef PBCLASS_QUERY_INFORMATION_CALLBACK BCLASS_QUERY_INFORMATION;
+typedef PBCLASS_QUERY_STATUS_CALLBACK BCLASS_QUERY_STATUS;
+typedef PBCLASS_SET_STATUS_NOTIFY_CALLBACK BCLASS_SET_STATUS_NOTIFY;
+typedef PBCLASS_SET_INFORMATION_CALLBACK BCLASS_SET_INFORMATION;
+typedef PBCLASS_DISABLE_STATUS_NOTIFY_CALLBACK BCLASS_DISABLE_STATUS_NOTIFY;
+
+typedef struct _BATTERY_MINIPORT_INFO {
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ PVOID Context;
+ BCLASS_QUERY_TAG QueryTag;
+ BCLASS_QUERY_INFORMATION QueryInformation;
+ BCLASS_SET_INFORMATION SetInformation;
+ BCLASS_QUERY_STATUS QueryStatus;
+ BCLASS_SET_STATUS_NOTIFY SetStatusNotify;
+ BCLASS_DISABLE_STATUS_NOTIFY DisableStatusNotify;
+ PDEVICE_OBJECT Pdo;
+ PUNICODE_STRING DeviceName;
+} BATTERY_MINIPORT_INFO, *PBATTERY_MINIPORT_INFO;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef struct _BATTERY_WMI_STATUS {
+ ULONG Tag;
+ ULONG RemainingCapacity;
+ LONG ChargeRate;
+ LONG DischargeRate;
+ ULONG Voltage;
+ BOOLEAN PowerOnline;
+ BOOLEAN Charging;
+ BOOLEAN Discharging;
+ BOOLEAN Critical;
+} BATTERY_WMI_STATUS, *PBATTERY_WMI_STATUS;
+
+typedef struct _BATTERY_WMI_RUNTIME {
+ ULONG Tag;
+ ULONG EstimatedRuntime;
+} BATTERY_WMI_RUNTIME, *PBATTERY_WMI_RUNTIME;
+
+typedef struct _BATTERY_WMI_TEMPERATURE {
+ ULONG Tag;
+ ULONG Temperature;
+} BATTERY_WMI_TEMPERATURE, *PBATTERY_WMI_TEMPERATURE;
+
+typedef struct _BATTERY_WMI_FULL_CHARGED_CAPACITY {
+ ULONG Tag;
+ ULONG FullChargedCapacity;
+} BATTERY_WMI_FULL_CHARGED_CAPACITY, *PBATTERY_WMI_FULL_CHARGED_CAPACITY;
+
+typedef struct _BATTERY_WMI_CYCLE_COUNT {
+ ULONG Tag;
+ ULONG CycleCount;
+} BATTERY_WMI_CYCLE_COUNT, *PBATTERY_WMI_CYCLE_COUNT;
+
+typedef struct _BATTERY_WMI_STATIC_DATA {
+ ULONG Tag;
+ WCHAR ManufactureDate[25];
+ BATTERY_REPORTING_SCALE Granularity [4];
+ ULONG Capabilities;
+ UCHAR Technology;
+ ULONG Chemistry;
+ ULONG DesignedCapacity;
+ ULONG DefaultAlert1;
+ ULONG DefaultAlert2;
+ ULONG CriticalBias;
+ WCHAR Strings[1];
+} BATTERY_WMI_STATIC_DATA, *PBATTERY_WMI_STATIC_DATA;
+
+typedef struct _BATTERY_WMI_STATUS_CHANGE {
+ ULONG Tag;
+ BOOLEAN PowerOnline;
+ BOOLEAN Charging;
+ BOOLEAN Discharging;
+ BOOLEAN Critical;
+} BATTERY_WMI_STATUS_CHANGE, *PBATTERY_WMI_STATUS_CHANGE;
+
+typedef struct _BATTERY_TAG_CHANGE {
+ ULONG Tag;
+} BATTERY_TAG_CHANGE, *PBATTERY_TAG_CHANGE;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if defined(_BATTERYCLASS_)
+#define BCLASSAPI
+#else
+#define BCLASSAPI DECLSPEC_IMPORT
+#endif
BCLASSAPI
NTSTATUS
NTAPI
BatteryClassInitializeDevice(
- IN PBATTERY_MINIPORT_INFO MiniportInfo,
- IN PVOID *ClassData);
+ IN PBATTERY_MINIPORT_INFO MiniportInfo,
+ IN PVOID *ClassData);
BCLASSAPI
NTSTATUS
NTAPI
BatteryClassIoctl(
- IN PVOID ClassData,
- IN PIRP Irp);
-
-BCLASSAPI
-NTSTATUS
-NTAPI
-BatteryClassQueryWmiDataBlock(
- IN PVOID ClassData,
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN ULONG GuidIndex,
- IN OUT PULONG InstanceLengthArray,
- IN ULONG OutBufferSize,
- OUT PUCHAR Buffer);
+ IN PVOID ClassData,
+ IN OUT PIRP Irp);
BCLASSAPI
NTSTATUS
@@ -269,24 +322,42 @@ NTAPI
BatteryClassStatusNotify(
IN PVOID ClassData);
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+BCLASSAPI
+NTSTATUS
+NTAPI
+BatteryClassQueryWmiDataBlock(
+ IN PVOID ClassData,
+ IN OUT PDEVICE_OBJECT DeviceObject,
+ IN OUT PIRP Irp,
+ IN ULONG GuidIndex,
+ OUT PULONG InstanceLengthArray,
+ IN ULONG OutBufferSize,
+ OUT PUCHAR Buffer OPTIONAL);
+
BCLASSAPI
NTSTATUS
NTAPI
BatteryClassSystemControl(
- IN PVOID ClassData,
- IN PVOID WmiLibContext, /* PWMILIB_CONTEXT */
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- OUT PVOID Disposition); /* PSYSCTL_IRP_DISPOSITION */
+ IN PVOID ClassData,
+ IN PVOID WmiLibContext, /* PWMILIB_CONTEXT */
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PIRP Irp,
+ OUT PVOID Disposition); /* PSYSCTL_IRP_DISPOSITION */
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
BCLASSAPI
NTSTATUS
NTAPI
BatteryClassUnload(
- IN PVOID ClassData);
+ IN PVOID ClassData);
+
+#endif /* _WINDOWS_H */
+
+#endif /* _BATCLASS_ */
#ifdef __cplusplus
}
#endif
-
-#endif /* __BATCLASS_H */
diff --git a/include/psdk/commctrl.h b/include/psdk/commctrl.h
index 9f3366e3474..a1d261faa80 100644
--- a/include/psdk/commctrl.h
+++ b/include/psdk/commctrl.h
@@ -417,6 +417,8 @@ extern "C" {
WINCOMMCTRLAPI WINBOOL WINAPI ImageList_GetImageInfo(HIMAGELIST himl,int i,IMAGEINFO *pImageInfo);
WINCOMMCTRLAPI HIMAGELIST WINAPI ImageList_Merge(HIMAGELIST himl1,int i1,HIMAGELIST himl2,int i2,int dx,int dy);
WINCOMMCTRLAPI HIMAGELIST WINAPI ImageList_Duplicate(HIMAGELIST himl);
+ WINCOMMCTRLAPI HRESULT WINAPI HIMAGELIST_QueryInterface(HIMAGELIST himl, REFIID riid, void **ppv);
+
#endif
#ifndef NOHEADER
@@ -2240,6 +2242,7 @@ extern "C" {
#define LVSIL_NORMAL 0
#define LVSIL_SMALL 1
#define LVSIL_STATE 2
+#define LVSIL_GROUPHEADER 3
#define LVM_SETIMAGELIST (LVM_FIRST+3)
#define ListView_SetImageList(hwnd,himl,iImageList) (HIMAGELIST)SNDMSG((hwnd),LVM_SETIMAGELIST,(WPARAM)(iImageList),(LPARAM)(HIMAGELIST)(himl))
@@ -2392,6 +2395,7 @@ extern "C" {
#define LVFI_PARAM 0x1
#define LVFI_STRING 0x2
+#define LVFI_SUBSTRING 0x4
#define LVFI_PARTIAL 0x8
#define LVFI_WRAP 0x20
#define LVFI_NEARESTXY 0x40
@@ -4380,6 +4384,8 @@ typedef struct tagTVDISPINFOEXW {
SYSTEMTIME st;
} MCHITTESTINFO,*PMCHITTESTINFO;
+#define MCHITTESTINFO_V1_SIZE CCSIZEOF_STRUCT(MCHITTESTINFO, st)
+
#define MCHT_TITLE 0x10000
#define MCHT_CALENDAR 0x20000
#define MCHT_TODAYLINK 0x30000
@@ -4443,11 +4449,16 @@ typedef struct tagTVDISPINFOEXW {
#define MCN_SELECT (MCN_FIRST+4)
-#define MCS_DAYSTATE 0x1
-#define MCS_MULTISELECT 0x2
-#define MCS_WEEKNUMBERS 0x4
-#define MCS_NOTODAYCIRCLE 0x8
-#define MCS_NOTODAY 0x10
+#define MCS_DAYSTATE 0x0001
+#define MCS_MULTISELECT 0x0002
+#define MCS_WEEKNUMBERS 0x0004
+#define MCS_NOTODAYCIRCLE 0x0008
+#define MCS_NOTODAY 0x0010
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define MCS_NOTRAILINGDATES 0x0040
+#define MCS_SHORTDAYSOFWEEK 0x0080
+#define MCS_NOSELCHANGEONNAV 0x0100
+#endif
#define GMR_VISIBLE 0
#define GMR_DAYSTATE 1
diff --git a/include/psdk/compstui.h b/include/psdk/compstui.h
new file mode 100644
index 00000000000..fd427734597
--- /dev/null
+++ b/include/psdk/compstui.h
@@ -0,0 +1,945 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define IDI_CPSUI_ICONID_FIRST 64000
+
+#define IDI_CPSUI_EMPTY 64000
+#define IDI_CPSUI_SEL_NONE 64001
+#define IDI_CPSUI_WARNING 64002
+#define IDI_CPSUI_NO 64003
+#define IDI_CPSUI_YES 64004
+#define IDI_CPSUI_FALSE 64005
+#define IDI_CPSUI_TRUE 64006
+#define IDI_CPSUI_OFF 64007
+#define IDI_CPSUI_ON 64008
+#define IDI_CPSUI_PAPER_OUTPUT 64009
+#define IDI_CPSUI_ENVELOPE 64010
+#define IDI_CPSUI_MEM 64011
+#define IDI_CPSUI_FONTCARTHDR 64012
+#define IDI_CPSUI_FONTCART 64013
+#define IDI_CPSUI_STAPLER_ON 64014
+#define IDI_CPSUI_STAPLER_OFF 64015
+#define IDI_CPSUI_HT_HOST 64016
+#define IDI_CPSUI_HT_DEVICE 64017
+#define IDI_CPSUI_TT_PRINTASGRAPHIC 64018
+#define IDI_CPSUI_TT_DOWNLOADSOFT 64019
+#define IDI_CPSUI_TT_DOWNLOADVECT 64020
+#define IDI_CPSUI_TT_SUBDEV 64021
+#define IDI_CPSUI_PORTRAIT 64022
+#define IDI_CPSUI_LANDSCAPE 64023
+#define IDI_CPSUI_ROT_LAND 64024
+#define IDI_CPSUI_AUTOSEL 64025
+#define IDI_CPSUI_PAPER_TRAY 64026
+#define IDI_CPSUI_PAPER_TRAY2 64027
+#define IDI_CPSUI_PAPER_TRAY3 64028
+#define IDI_CPSUI_TRANSPARENT 64029
+#define IDI_CPSUI_COLLATE 64030
+#define IDI_CPSUI_DUPLEX_NONE 64031
+#define IDI_CPSUI_DUPLEX_HORZ 64032
+#define IDI_CPSUI_DUPLEX_VERT 64033
+#define IDI_CPSUI_RES_DRAFT 64034
+#define IDI_CPSUI_RES_LOW 64035
+#define IDI_CPSUI_RES_MEDIUM 64036
+#define IDI_CPSUI_RES_HIGH 64037
+#define IDI_CPSUI_RES_PRESENTATION 64038
+#define IDI_CPSUI_MONO 64039
+#define IDI_CPSUI_COLOR 64040
+#define IDI_CPSUI_DITHER_NONE 64041
+#define IDI_CPSUI_DITHER_COARSE 64042
+#define IDI_CPSUI_DITHER_FINE 64043
+#define IDI_CPSUI_DITHER_LINEART 64044
+#define IDI_CPSUI_SCALING 64045
+#define IDI_CPSUI_COPY 64046
+#define IDI_CPSUI_HTCLRADJ 64047
+#define IDI_CPSUI_HALFTONE_SETUP 64048
+#define IDI_CPSUI_WATERMARK 64049
+#define IDI_CPSUI_ERROR 64050
+#define IDI_CPSUI_ICM_OPTION 64051
+#define IDI_CPSUI_ICM_METHOD 64052
+#define IDI_CPSUI_ICM_INTENT 64053
+#define IDI_CPSUI_STD_FORM 64054
+#define IDI_CPSUI_OUTBIN 64055
+#define IDI_CPSUI_OUTPUT 64056
+#define IDI_CPSUI_GRAPHIC 64057
+#define IDI_CPSUI_ADVANCE 64058
+#define IDI_CPSUI_DOCUMENT 64059
+#define IDI_CPSUI_DEVICE 64060
+#define IDI_CPSUI_DEVICE2 64061
+#define IDI_CPSUI_PRINTER 64062
+#define IDI_CPSUI_PRINTER2 64063
+#define IDI_CPSUI_PRINTER3 64064
+#define IDI_CPSUI_PRINTER4 64065
+#define IDI_CPSUI_OPTION 64066
+#define IDI_CPSUI_OPTION2 64067
+#define IDI_CPSUI_STOP 64068
+#define IDI_CPSUI_NOTINSTALLED 64069
+#define IDI_CPSUI_WARNING_OVERLAY 64070
+#define IDI_CPSUI_STOP_WARNING_OVERLAY 64071
+#define IDI_CPSUI_GENERIC_OPTION 64072
+#define IDI_CPSUI_GENERIC_ITEM 64073
+#define IDI_CPSUI_RUN_DIALOG 64074
+#define IDI_CPSUI_QUESTION 64075
+#define IDI_CPSUI_FORMTRAYASSIGN 64076
+#define IDI_CPSUI_PRINTER_FOLDER 64077
+#define IDI_CPSUI_INSTALLABLE_OPTION 64078
+#define IDI_CPSUI_PRINTER_FEATURE 64079
+#define IDI_CPSUI_DEVICE_FEATURE 64080
+#define IDI_CPSUI_FONTSUB 64081
+#define IDI_CPSUI_POSTSCRIPT 64082
+#define IDI_CPSUI_TELEPHONE 64083
+#define IDI_CPSUI_DUPLEX_NONE_L 64084
+#define IDI_CPSUI_DUPLEX_HORZ_L 64085
+#define IDI_CPSUI_DUPLEX_VERT_L 64086
+#define IDI_CPSUI_LF_PEN_PLOTTER 64087
+#define IDI_CPSUI_SF_PEN_PLOTTER 64088
+#define IDI_CPSUI_LF_RASTER_PLOTTER 64089
+#define IDI_CPSUI_SF_RASTER_PLOTTER 64090
+#define IDI_CPSUI_ROLL_PAPER 64091
+#define IDI_CPSUI_PEN_CARROUSEL 64092
+#define IDI_CPSUI_PLOTTER_PEN 64093
+#define IDI_CPSUI_MANUAL_FEED 64094
+#define IDI_CPSUI_FAX 64095
+#define IDI_CPSUI_PAGE_PROTECT 64096
+#define IDI_CPSUI_ENVELOPE_FEED 64097
+#define IDI_CPSUI_FONTCART_SLOT 64098
+#define IDI_CPSUI_LAYOUT_BMP_PORTRAIT 64099
+#define IDI_CPSUI_LAYOUT_BMP_ARROWL 64100
+#define IDI_CPSUI_LAYOUT_BMP_ARROWS 64101
+#define IDI_CPSUI_LAYOUT_BMP_BOOKLETL 64102
+#define IDI_CPSUI_LAYOUT_BMP_BOOKLETP 64103
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define IDI_CPSUI_LAYOUT_BMP_ARROWLR 64104
+#define IDI_CPSUI_LAYOUT_BMP_ROT_PORT 64105
+#define IDI_CPSUI_LAYOUT_BMP_BOOKLETL_NB 64106
+#define IDI_CPSUI_LAYOUT_BMP_BOOKLETP_NB 64107
+#define IDI_CPSUI_ROT_PORT 64110
+#define IDI_CPSUI_NUP_BORDER 64111
+#define IDI_CPSUI_ICONID_LAST 64111
+#else
+#define IDI_CPSUI_ICONID_LAST 64103
+#endif
+
+#define IDS_CPSUI_STRID_FIRST 64700
+
+#define IDS_CPSUI_SETUP 64700
+#define IDS_CPSUI_MORE 64701
+#define IDS_CPSUI_CHANGE 64702
+#define IDS_CPSUI_OPTION 64703
+#define IDS_CPSUI_OF 64704
+#define IDS_CPSUI_RANGE_FROM 64705
+#define IDS_CPSUI_TO 64706
+#define IDS_CPSUI_COLON_SEP 64707
+#define IDS_CPSUI_LEFT_ANGLE 64708
+#define IDS_CPSUI_RIGHT_ANGLE 64709
+#define IDS_CPSUI_SLASH_SEP 64710
+#define IDS_CPSUI_PERCENT 64711
+#define IDS_CPSUI_LBCB_NOSEL 64712
+#define IDS_CPSUI_PROPERTIES 64713
+#define IDS_CPSUI_DEFAULTDOCUMENT 64714
+#define IDS_CPSUI_DOCUMENT 64715
+#define IDS_CPSUI_ADVANCEDOCUMENT 64716
+#define IDS_CPSUI_PRINTER 64717
+#define IDS_CPSUI_AUTOSELECT 64718
+#define IDS_CPSUI_PAPER_OUTPUT 64719
+#define IDS_CPSUI_GRAPHIC 64720
+#define IDS_CPSUI_OPTIONS 64721
+#define IDS_CPSUI_ADVANCED 64722
+#define IDS_CPSUI_STDDOCPROPTAB 64723
+#define IDS_CPSUI_STDDOCPROPTVTAB 64724
+#define IDS_CPSUI_DEVICEOPTIONS 64725
+#define IDS_CPSUI_FALSE 64726
+#define IDS_CPSUI_TRUE 64727
+#define IDS_CPSUI_NO 64728
+#define IDS_CPSUI_YES 64729
+#define IDS_CPSUI_OFF 64730
+#define IDS_CPSUI_ON 64731
+#define IDS_CPSUI_DEFAULT 64732
+#define IDS_CPSUI_ERROR 64733
+#define IDS_CPSUI_NONE 64734
+#define IDS_CPSUI_NOT 64735
+#define IDS_CPSUI_EXIST 64736
+#define IDS_CPSUI_NOTINSTALLED 64737
+#define IDS_CPSUI_ORIENTATION 64738
+#define IDS_CPSUI_SCALING 64739
+#define IDS_CPSUI_NUM_OF_COPIES 64740
+#define IDS_CPSUI_SOURCE 64741
+#define IDS_CPSUI_PRINTQUALITY 64742
+#define IDS_CPSUI_RESOLUTION 64743
+#define IDS_CPSUI_COLOR_APPERANCE 64744
+#define IDS_CPSUI_DUPLEX 64745
+#define IDS_CPSUI_TTOPTION 64746
+#define IDS_CPSUI_FORMNAME 64747
+#define IDS_CPSUI_ICM 64748
+#define IDS_CPSUI_ICMMETHOD 64749
+#define IDS_CPSUI_ICMINTENT 64750
+#define IDS_CPSUI_MEDIA 64751
+#define IDS_CPSUI_DITHERING 64752
+#define IDS_CPSUI_PORTRAIT 64753
+#define IDS_CPSUI_LANDSCAPE 64754
+#define IDS_CPSUI_ROT_LAND 64755
+#define IDS_CPSUI_COLLATE 64756
+#define IDS_CPSUI_COLLATED 64757
+#define IDS_CPSUI_PRINTFLDSETTING 64758
+#define IDS_CPSUI_DRAFT 64759
+#define IDS_CPSUI_LOW 64760
+#define IDS_CPSUI_MEDIUM 64761
+#define IDS_CPSUI_HIGH 64762
+#define IDS_CPSUI_PRESENTATION 64763
+#define IDS_CPSUI_COLOR 64764
+#define IDS_CPSUI_GRAYSCALE 64765
+#define IDS_CPSUI_MONOCHROME 64766
+#define IDS_CPSUI_SIMPLEX 64767
+#define IDS_CPSUI_HORIZONTAL 64768
+#define IDS_CPSUI_VERTICAL 64769
+#define IDS_CPSUI_LONG_SIDE 64770
+#define IDS_CPSUI_SHORT_SIDE 64771
+#define IDS_CPSUI_TT_PRINTASGRAPHIC 64772
+#define IDS_CPSUI_TT_DOWNLOADSOFT 64773
+#define IDS_CPSUI_TT_DOWNLOADVECT 64774
+#define IDS_CPSUI_TT_SUBDEV 64775
+#define IDS_CPSUI_ICM_BLACKWHITE 64776
+#define IDS_CPSUI_ICM_NO 64777
+#define IDS_CPSUI_ICM_YES 64778
+#define IDS_CPSUI_ICM_SATURATION 64779
+#define IDS_CPSUI_ICM_CONTRAST 64780
+#define IDS_CPSUI_ICM_COLORMETRIC 64781
+#define IDS_CPSUI_STANDARD 64782
+#define IDS_CPSUI_GLOSSY 64783
+#define IDS_CPSUI_TRANSPARENCY 64784
+#define IDS_CPSUI_REGULAR 64785
+#define IDS_CPSUI_BOND 64786
+#define IDS_CPSUI_COARSE 64787
+#define IDS_CPSUI_FINE 64788
+#define IDS_CPSUI_LINEART 64789
+#define IDS_CPSUI_ERRDIFFUSE 64790
+#define IDS_CPSUI_HALFTONE 64791
+#define IDS_CPSUI_HTCLRADJ 64792
+#define IDS_CPSUI_USE_HOST_HT 64793
+#define IDS_CPSUI_USE_DEVICE_HT 64794
+#define IDS_CPSUI_USE_PRINTER_HT 64795
+#define IDS_CPSUI_OUTBINASSIGN 64796
+#define IDS_CPSUI_WATERMARK 64797
+#define IDS_CPSUI_FORMTRAYASSIGN 64798
+#define IDS_CPSUI_UPPER_TRAY 64799
+#define IDS_CPSUI_ONLYONE 64800
+#define IDS_CPSUI_LOWER_TRAY 64801
+#define IDS_CPSUI_MIDDLE_TRAY 64802
+#define IDS_CPSUI_MANUAL_TRAY 64803
+#define IDS_CPSUI_ENVELOPE_TRAY 64804
+#define IDS_CPSUI_ENVMANUAL_TRAY 64805
+#define IDS_CPSUI_TRACTOR_TRAY 64806
+#define IDS_CPSUI_SMALLFMT_TRAY 64807
+#define IDS_CPSUI_LARGEFMT_TRAY 64808
+#define IDS_CPSUI_LARGECAP_TRAY 64809
+#define IDS_CPSUI_CASSETTE_TRAY 64810
+#define IDS_CPSUI_DEFAULT_TRAY 64811
+#define IDS_CPSUI_FORMSOURCE 64812
+#define IDS_CPSUI_MANUALFEED 64813
+#define IDS_CPSUI_PRINTERMEM_KB 64814
+#define IDS_CPSUI_PRINTERMEM_MB 64815
+#define IDS_CPSUI_PAGEPROTECT 64816
+#define IDS_CPSUI_HALFTONE_SETUP 64817
+#define IDS_CPSUI_INSTFONTCART 64818
+#define IDS_CPSUI_SLOT1 64819
+#define IDS_CPSUI_SLOT2 64820
+#define IDS_CPSUI_SLOT3 64821
+#define IDS_CPSUI_SLOT4 64822
+#define IDS_CPSUI_LEFT_SLOT 64823
+#define IDS_CPSUI_RIGHT_SLOT 64824
+#define IDS_CPSUI_STAPLER 64825
+#define IDS_CPSUI_STAPLER_ON 64826
+#define IDS_CPSUI_STAPLER_OFF 64827
+#define IDS_CPSUI_STACKER 64828
+#define IDS_CPSUI_MAILBOX 64829
+#define IDS_CPSUI_COPY 64830
+#define IDS_CPSUI_COPIES 64831
+#define IDS_CPSUI_TOTAL 64832
+#define IDS_CPSUI_MAKE 64833
+#define IDS_CPSUI_PRINT 64834
+#define IDS_CPSUI_FAX 64835
+#define IDS_CPSUI_PLOT 64836
+#define IDS_CPSUI_SLOW 64837
+#define IDS_CPSUI_FAST 64838
+#define IDS_CPSUI_ROTATED 64839
+#define IDS_CPSUI_RESET 64840
+#define IDS_CPSUI_ALL 64841
+#define IDS_CPSUI_DEVICE 64842
+#define IDS_CPSUI_SETTINGS 64843
+#define IDS_CPSUI_REVERT 64844
+#define IDS_CPSUI_CHANGES 64845
+#define IDS_CPSUI_CHANGED 64846
+#define IDS_CPSUI_WARNING 64847
+#define IDS_CPSUI_ABOUT 64848
+#define IDS_CPSUI_VERSION 64849
+#define IDS_CPSUI_NO_NAME 64850
+#define IDS_CPSUI_SETTING 64851
+#define IDS_CPSUI_DEVICE_SETTINGS 64852
+#define IDS_CPSUI_STDDOCPROPTAB1 64853
+#define IDS_CPSUI_STDDOCPROPTAB2 64854
+#define IDS_CPSUI_PAGEORDER 64855
+#define IDS_CPSUI_FRONTTOBACK 64856
+#define IDS_CPSUI_BACKTOFRONT 64857
+#define IDS_CPSUI_QUALITY_SETTINGS 64858
+#define IDS_CPSUI_QUALITY_DRAFT 64859
+#define IDS_CPSUI_QUALITY_BETTER 64860
+#define IDS_CPSUI_QUALITY_BEST 64861
+#define IDS_CPSUI_QUALITY_CUSTOM 64862
+#define IDS_CPSUI_OUTPUTBIN 64863
+#define IDS_CPSUI_NUP 64864
+#define IDS_CPSUI_NUP_NORMAL 64865
+#define IDS_CPSUI_NUP_TWOUP 64866
+#define IDS_CPSUI_NUP_FOURUP 64867
+#define IDS_CPSUI_NUP_SIXUP 64868
+#define IDS_CPSUI_NUP_NINEUP 64869
+#define IDS_CPSUI_NUP_SIXTEENUP 64870
+#define IDS_CPSUI_SIDE1 64871
+#define IDS_CPSUI_SIDE2 64872
+#define IDS_CPSUI_BOOKLET 64873
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define IDS_CPSUI_POSTER 64874
+#define IDS_CPSUI_POSTER_2x2 64875
+#define IDS_CPSUI_POSTER_3x3 64876
+#define IDS_CPSUI_POSTER_4x4 64877
+#define IDS_CPSUI_NUP_DIRECTION 64878
+#define IDS_CPSUI_RIGHT_THEN_DOWN 64879
+#define IDS_CPSUI_DOWN_THEN_RIGHT 64880
+#define IDS_CPSUI_LEFT_THEN_DOWN 64881
+#define IDS_CPSUI_DOWN_THEN_LEFT 64882
+#define IDS_CPSUI_MANUAL_DUPLEX 64883
+#define IDS_CPSUI_MANUAL_DUPLEX_ON 64884
+#define IDS_CPSUI_MANUAL_DUPLEX_OFF 64885
+#define IDS_CPSUI_ROT_PORT 64886
+#define IDS_CPSUI_STAPLE 64887
+#define IDS_CPSUI_BOOKLET_EDGE 64888
+#define IDS_CPSUI_BOOKLET_EDGE_LEFT 64889
+#define IDS_CPSUI_BOOKLET_EDGE_RIGHT 64890
+#define IDS_CPSUI_NUP_BORDER 64891
+#define IDS_CPSUI_NUP_BORDERED 64892
+#define IDS_CPSUI_STRID_LAST 64892
+#else
+#define IDS_CPSUI_STRID_LAST 64873
+#endif
+
+#if (!defined(RC_INVOKED))
+
+/* DEFINES */
+
+#define TVOT_2STATES 0
+#define TVOT_3STATES 1
+#define TVOT_UDARROW 2
+#define TVOT_TRACKBAR 3
+#define TVOT_SCROLLBAR 4
+#define TVOT_LISTBOX 5
+#define TVOT_COMBOBOX 6
+#define TVOT_EDITBOX 7
+#define TVOT_PUSHBUTTON 8
+#define TVOT_CHKBOX 9
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define TVOT_NSTATES_EX 10
+#define TVOT_LAST TVOT_NSTATES_EX
+#else
+#define TVOT_LAST TVOT_CHKBOX
+#endif
+#define TVOT_NONE (TVOT_LAST + 1)
+
+#define CHKBOXS_FALSE_TRUE 0
+#define CHKBOXS_NO_YES 1
+#define CHKBOXS_OFF_ON 2
+#define CHKBOXS_FALSE_PDATA 3
+#define CHKBOXS_NO_PDATA 4
+#define CHKBOXS_OFF_PDATA 5
+#define CHKBOXS_NONE_PDATA 6
+
+#define PUSHBUTTON_TYPE_DLGPROC 0
+#define PUSHBUTTON_TYPE_CALLBACK 1
+#define PUSHBUTTON_TYPE_HTCLRADJ 2
+#define PUSHBUTTON_TYPE_HTSETUP 3
+
+#define MAX_RES_STR_CHARS 160
+
+#define OPTPF_HIDE 0x01
+#define OPTPF_DISABLED 0x02
+#define OPTPF_ICONID_AS_HICON 0x04
+#define OPTPF_OVERLAY_WARNING_ICON 0x08
+#define OPTPF_OVERLAY_STOP_ICON 0x10
+#define OPTPF_OVERLAY_NO_ICON 0x20
+#define OPTPF_USE_HDLGTEMPLATE 0x40
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define OPTPF_MASK 0x7f
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define OPTCF_HIDE 0x01
+#define OPTCF_MASK 0x01
+#endif
+
+#define OPTTF_TYPE_DISABLED 0x01
+#define OPTTF_NOSPACE_BEFORE_POSTFIX 0x02
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define OPTTF_MASK 0x03
+#endif
+
+#define OTS_LBCB_SORT 0x0001
+#define OTS_LBCB_PROPPAGE_LBUSECB 0x0002
+#define OTS_LBCB_PROPPAGE_CBUSELB 0x0004
+#define OTS_LBCB_INCL_ITEM_NONE 0x0008
+#define OTS_LBCB_NO_ICON16_IN_ITEM 0x0010
+#define OTS_PUSH_INCL_SETUP_TITLE 0x0020
+#define OTS_PUSH_NO_DOT_DOT_DOT 0x0040
+#define OTS_PUSH_ENABLE_ALWAYS 0x0080
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define OTS_MASK 0x00ff
+#endif
+
+#define EPF_PUSH_TYPE_DLGPROC 0x0001
+#define EPF_INCL_SETUP_TITLE 0x0002
+#define EPF_NO_DOT_DOT_DOT 0x0004
+#define EPF_ICONID_AS_HICON 0x0008
+#define EPF_OVERLAY_WARNING_ICON 0x0010
+#define EPF_OVERLAY_STOP_ICON 0x0020
+#define EPF_OVERLAY_NO_ICON 0x0040
+#define EPF_USE_HDLGTEMPLATE 0x0080
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define EPF_MASK 0x00ff
+#endif
+
+#define ECBF_CHECKNAME_AT_FRONT 0x0001
+#define ECBF_CHECKNAME_ONLY_ENABLED 0x0002
+#define ECBF_ICONID_AS_HICON 0x0004
+#define ECBF_OVERLAY_WARNING_ICON 0x0008
+#define ECBF_OVERLAY_ECBICON_IF_CHECKED 0x0010
+#define ECBF_OVERLAY_STOP_ICON 0x0020
+#define ECBF_OVERLAY_NO_ICON 0x0040
+#define ECBF_CHECKNAME_ONLY 0x0080
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define ECBF_MASK 0x00ff
+#endif
+
+#define OPTIF_COLLAPSE 0x00000001L
+#define OPTIF_HIDE 0x00000002L
+#define OPTIF_CALLBACK 0x00000004L
+#define OPTIF_CHANGED 0x00000008L
+#define OPTIF_CHANGEONCE 0x00000010L
+#define OPTIF_DISABLED 0x00000020L
+#define OPTIF_ECB_CHECKED 0x00000040L
+#define OPTIF_EXT_HIDE 0x00000080L
+#define OPTIF_EXT_DISABLED 0x00000100L
+#define OPTIF_SEL_AS_HICON 0x00000200L
+#define OPTIF_EXT_IS_EXTPUSH 0x00000400L
+#define OPTIF_NO_GROUPBOX_NAME 0x00000800L
+#define OPTIF_OVERLAY_WARNING_ICON 0x00001000L
+#define OPTIF_OVERLAY_STOP_ICON 0x00002000L
+#define OPTIF_OVERLAY_NO_ICON 0x00004000L
+#define OPTIF_INITIAL_TVITEM 0x00008000L
+#define OPTIF_HAS_POIEXT 0x00010000L
+
+#define OPTIF_MASK 0x0001ffffL
+
+
+#define DMPUB_NONE 0
+#define DMPUB_FIRST 1
+
+#define DMPUB_ORIENTATION 1
+#define DMPUB_SCALE 2
+#define DMPUB_COPIES_COLLATE 3
+#define DMPUB_DEFSOURCE 4
+#define DMPUB_PRINTQUALITY 5
+#define DMPUB_COLOR 6
+#define DMPUB_DUPLEX 7
+#define DMPUB_TTOPTION 8
+#define DMPUB_FORMNAME 9
+#define DMPUB_ICMMETHOD 10
+#define DMPUB_ICMINTENT 11
+#define DMPUB_MEDIATYPE 12
+#define DMPUB_DITHERTYPE 13
+#define DMPUB_OUTPUTBIN 14
+#define DMPUB_QUALITY 15
+#define DMPUB_NUP 16
+#define DMPUB_PAGEORDER 17
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define DMPUB_NUP_DIRECTION 18
+#define DMPUB_MANUAL_DUPLEX 19
+#define DMPUB_STAPLE 20
+#define DMPUB_BOOKLET_EDGE 21
+#define DMPUB_LAST 21
+#else
+#define DMPUB_LAST 17
+#endif
+
+#define DMPUB_OEM_PAPER_ITEM 97
+#define DMPUB_OEM_GRAPHIC_ITEM 98
+#define DMPUB_OEM_ROOT_ITEM 99
+#define DMPUB_USER 100
+
+#define MAKE_DMPUB_HIDEBIT(DMPub) (DWORD)(((DWORD)0x01 << ((DMPub) - 1)))
+#define IS_DMPUB_HIDDEN(dw, DMPub) (BOOL)((DWORD)(dw) & MAKE_DMPUB_HIDEBIT(DMPub))
+
+#define OIEXTF_ANSI_STRING 0x0001
+
+#define CPSUICB_REASON_SEL_CHANGED 0
+#define CPSUICB_REASON_PUSHBUTTON 1
+#define CPSUICB_REASON_ECB_CHANGED 2
+#define CPSUICB_REASON_DLGPROC 3
+#define CPSUICB_REASON_UNDO_CHANGES 4
+#define CPSUICB_REASON_EXTPUSH 5
+#define CPSUICB_REASON_APPLYNOW 6
+#define CPSUICB_REASON_OPTITEM_SETFOCUS 7
+#define CPSUICB_REASON_ITEMS_REVERTED 8
+#define CPSUICB_REASON_ABOUT 9
+#define CPSUICB_REASON_SETACTIVE 10
+#define CPSUICB_REASON_KILLACTIVE 11
+
+#define CPSUICB_ACTION_NONE 0
+#define CPSUICB_ACTION_OPTIF_CHANGED 1
+#define CPSUICB_ACTION_REINIT_ITEMS 2
+#define CPSUICB_ACTION_NO_APPLY_EXIT 3
+#define CPSUICB_ACTION_ITEMS_APPLIED 4
+
+#define DP_STD_TREEVIEWPAGE 0xFFFF
+#define DP_STD_DOCPROPPAGE2 0xFFFE
+#define DP_STD_DOCPROPPAGE1 0XFFFD
+#define DP_STD_RESERVED_START 0xFFF0
+
+#define MAX_DLGPAGE_COUNT 64
+
+#define DPF_ICONID_AS_HICON 0x0001
+#define DPF_USE_HDLGTEMPLATE 0x0002
+
+#define CPSUIF_UPDATE_PERMISSION 0x0001
+#define CPSUIF_ICONID_AS_HICON 0x0002
+#define CPSUIF_ABOUT_CALLBACK 0x0004
+
+#define CPSUI_PDLGPAGE_DOCPROP (PDLGPAGE)1
+#define CPSUI_PDLGPAGE_ADVDOCPROP (PDLGPAGE)2
+#define CPSUI_PDLGPAGE_PRINTERPROP (PDLGPAGE)3
+#define CPSUI_PDLGPAGE_TREEVIEWONLY (PDLGPAGE)4
+
+#define CPSUI_PDLGPAGE_TREEVIWONLY CPSUI_PDLGPAGE_TREEVIEWONLY
+
+#define CPSFUNC_ADD_HPROPSHEETPAGE 0
+#define CPSFUNC_ADD_PROPSHEETPAGEW 1
+#define CPSFUNC_ADD_PCOMPROPSHEETUIA 2
+#define CPSFUNC_ADD_PCOMPROPSHEETUIW 3
+#define CPSFUNC_ADD_PFNPROPSHEETUIA 4
+#define CPSFUNC_ADD_PFNPROPSHEETUIW 5
+#define CPSFUNC_DELETE_HCOMPROPSHEET 6
+#define CPSFUNC_SET_HSTARTPAGE 7
+#define CPSFUNC_GET_PAGECOUNT 8
+#define CPSFUNC_SET_RESULT 9
+#define CPSFUNC_GET_HPSUIPAGES 10
+#define CPSFUNC_LOAD_CPSUI_STRINGA 11
+#define CPSFUNC_LOAD_CPSUI_STRINGW 12
+#define CPSFUNC_LOAD_CPSUI_ICON 13
+#define CPSFUNC_GET_PFNPROPSHEETUI_ICON 14
+#define CPSFUNC_ADD_PROPSHEETPAGEA 15
+#define CPSFUNC_INSERT_PSUIPAGEA 16
+#define CPSFUNC_INSERT_PSUIPAGEW 17
+#define CPSFUNC_SET_PSUIPAGE_TITLEA 18
+#define CPSFUNC_SET_PSUIPAGE_TITLEW 19
+#define CPSFUNC_SET_PSUIPAGE_ICON 20
+#define CPSFUNC_SET_DATABLOCK 21
+#define CPSFUNC_QUERY_DATABLOCK 22
+#define CPSFUNC_SET_DMPUB_HIDEBITS 23
+#define CPSFUNC_IGNORE_CPSUI_PSN_APPLY 24
+#define CPSFUNC_DO_APPLY_CPSUI 25
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define CPSFUNC_SET_FUSION_CONTEXT 26
+#define MAX_CPSFUNC_INDEX 26
+#else
+#define MAX_CPSFUNC_INDEX 25
+#endif
+
+#ifdef UNICODE
+#define CPSFUNC_ADD_PCOMPROPSHEETUI CPSFUNC_ADD_PCOMPROPSHEETUIW
+#define CPSFUNC_ADD_PFNPROPSHEETUI CPSFUNC_ADD_PFNPROPSHEETUIW
+#define CPSFUNC_LOAD_CPSUI_STRING CPSFUNC_LOAD_CPSUI_STRINGW
+#define CPSFUNC_ADD_PROPSHEETPAGE CPSFUNC_ADD_PROPSHEETPAGEW
+#define CPSFUNC_INSERT_PSUIPAGE CPSFUNC_INSERT_PSUIPAGEW
+#define CPSFUNC_SET_PSUIPAGE_TITLE CPSFUNC_SET_PSUIPAGE_TITLEW
+
+#else
+#define CPSFUNC_ADD_PCOMPROPSHEETUI CPSFUNC_ADD_PCOMPROPSHEETUIA
+#define CPSFUNC_ADD_PFNPROPSHEETUI CPSFUNC_ADD_PFNPROPSHEETUIA
+#define CPSFUNC_LOAD_CPSUI_STRING CPSFUNC_LOAD_CPSUI_STRINGA
+#define CPSFUNC_ADD_PROPSHEETPAGE CPSFUNC_ADD_PROPSHEETPAGEA
+#define CPSFUNC_INSERT_PSUIPAGE CPSFUNC_INSERT_PSUIPAGEA
+#define CPSFUNC_SET_PSUIPAGE_TITLE CPSFUNC_SET_PSUIPAGE_TITLEA
+
+#endif
+
+#define SR_OWNER 0
+#define SR_OWNER_PARENT 1
+
+#define HINSPSUIPAGE_FIRST (HANDLE)0xFFFFFFFE
+#define HINSPSUIPAGE_LAST (HANDLE)0xFFFFFFFF
+#define HINSPSUIPAGE_INDEX(i) (HANDLE)MAKELONG(i, 0);
+
+#define PSUIPAGEINSERT_GROUP_PARENT 0
+#define PSUIPAGEINSERT_PCOMPROPSHEETUI 1
+#define PSUIPAGEINSERT_PFNPROPSHEETUI 2
+#define PSUIPAGEINSERT_PROPSHEETPAGE 3
+#define PSUIPAGEINSERT_HPROPSHEETPAGE 4
+#define PSUIPAGEINSERT_DLL 5
+#define MAX_PSUIPAGEINSERT_INDEX 5
+
+#define INSPSUIPAGE_MODE_BEFORE 0
+#define INSPSUIPAGE_MODE_AFTER 1
+#define INSPSUIPAGE_MODE_FIRST_CHILD 2
+#define INSPSUIPAGE_MODE_LAST_CHILD 3
+#define INSPSUIPAGE_MODE_INDEX 4
+
+#define SSP_TVPAGE 10000
+#define SSP_STDPAGE1 10001
+#define SSP_STDPAGE2 10002
+
+#define APPLYCPSUI_NO_NEWDEF 0x00000001
+#define APPLYCPSUI_OK_CANCEL_BUTTON 0x00000002
+
+#define PROPSHEETUI_REASON_INIT 0
+#define PROPSHEETUI_REASON_GET_INFO_HEADER 1
+#define PROPSHEETUI_REASON_DESTROY 2
+#define PROPSHEETUI_REASON_SET_RESULT 3
+#define PROPSHEETUI_REASON_GET_ICON 4
+#define MAX_PROPSHEETUI_REASON_INDEX 4
+
+#define PROPSHEETUI_INFO_VERSION 0x0100
+
+#define PSUIINFO_UNICODE 0x0001
+
+/* return-values for CommonPropertySheetUI on success */
+#define CPSUI_CANCEL 0
+#define CPSUI_OK 1
+#define CPSUI_RESTARTWINDOWS 2
+#define CPSUI_REBOOTSYSTEM 3
+
+#define ERR_CPSUI_GETLASTERROR -1
+#define ERR_CPSUI_ALLOCMEM_FAILED -2
+#define ERR_CPSUI_INVALID_PDATA -3
+#define ERR_CPSUI_INVALID_LPARAM -4
+#define ERR_CPSUI_NULL_HINST -5
+#define ERR_CPSUI_NULL_CALLERNAME -6
+#define ERR_CPSUI_NULL_OPTITEMNAME -7
+#define ERR_CPSUI_NO_PROPSHEETPAGE -8
+#define ERR_CPSUI_TOO_MANY_PROPSHEETPAGES -9
+#define ERR_CPSUI_CREATEPROPPAGE_FAILED -10
+#define ERR_CPSUI_MORE_THAN_ONE_TVPAGE -11
+#define ERR_CPSUI_MORE_THAN_ONE_STDPAGE -12
+#define ERR_CPSUI_INVALID_PDLGPAGE -13
+#define ERR_CPSUI_INVALID_DLGPAGE_CBSIZE -14
+#define ERR_CPSUI_TOO_MANY_DLGPAGES -15
+#define ERR_CPSUI_INVALID_DLGPAGEIDX -16
+#define ERR_CPSUI_SUBITEM_DIFF_DLGPAGEIDX -17
+#define ERR_CPSUI_NULL_POPTITEM -18
+#define ERR_CPSUI_INVALID_OPTITEM_CBSIZE -19
+#define ERR_CPSUI_INVALID_OPTTYPE_CBSIZE -20
+#define ERR_CPSUI_INVALID_OPTTYPE_COUNT -21
+#define ERR_CPSUI_NULL_POPTPARAM -22
+#define ERR_CPSUI_INVALID_OPTPARAM_CBSIZE -23
+#define ERR_CPSUI_INVALID_EDITBOX_PSEL -24
+#define ERR_CPSUI_INVALID_EDITBOX_BUF_SIZE -25
+#define ERR_CPSUI_INVALID_ECB_CBSIZE -26
+#define ERR_CPSUI_NULL_ECB_PTITLE -27
+#define ERR_CPSUI_NULL_ECB_PCHECKEDNAME -28
+#define ERR_CPSUI_INVALID_DMPUBID -29
+#define ERR_CPSUI_INVALID_DMPUB_TVOT -30
+#define ERR_CPSUI_CREATE_TRACKBAR_FAILED -31
+#define ERR_CPSUI_CREATE_UDARROW_FAILED -32
+#define ERR_CPSUI_CREATE_IMAGELIST_FAILED -33
+#define ERR_CPSUI_INVALID_TVOT_TYPE -34
+#define ERR_CPSUI_INVALID_LBCB_TYPE -35
+#define ERR_CPSUI_SUBITEM_DIFF_OPTIF_HIDE -36
+#define ERR_CPSUI_INVALID_PUSHBUTTON_TYPE -38
+#define ERR_CPSUI_INVALID_EXTPUSH_CBSIZE -39
+#define ERR_CPSUI_NULL_EXTPUSH_DLGPROC -40
+#define ERR_CPSUI_NO_EXTPUSH_DLGTEMPLATEID -41
+#define ERR_CPSUI_NULL_EXTPUSH_CALLBACK -42
+#define ERR_CPSUI_DMCOPIES_USE_EXTPUSH -43
+#define ERR_CPSUI_ZERO_OPTITEM -44
+
+#define ERR_CPSUI_FUNCTION_NOT_IMPLEMENTED -9999
+#define ERR_CPSUI_INTERNAL_ERROR -10000
+
+#define PSUIHDRF_OBSOLETE 0x0001
+#define PSUIHDRF_NOAPPLYNOW 0x0002
+#define PSUIHDRF_PROPTITLE 0x0004
+#define PSUIHDRF_USEHICON 0x0008
+#define PSUIHDRF_DEFTITLE 0x0010
+#define PSUIHDRF_EXACT_PTITLE 0x0020
+
+/* TYPES */
+
+typedef struct _OPTPARAM {
+ WORD cbSize;
+ BYTE Flags;
+ BYTE Style;
+ LPTSTR pData;
+ ULONG_PTR IconID;
+ LPARAM lParam;
+ ULONG_PTR dwReserved[2];
+} OPTPARAM, *POPTPARAM;
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+typedef struct _OPTCOMBO {
+ WORD cbSize;
+ BYTE Flags;
+ WORD cListItem;
+ POPTPARAM pListItem;
+ LONG Sel;
+ DWORD dwReserved[3];
+} OPTCOMBO, *POPTCOMBO;
+#endif
+
+typedef struct _OPTTYPE {
+ WORD cbSize;
+ BYTE Type;
+ BYTE Flags;
+ WORD Count;
+ WORD BegCtrlID;
+ POPTPARAM pOptParam;
+ WORD Style;
+ WORD wReserved[3];
+ ULONG_PTR dwReserved[3];
+} OPTTYPE, *POPTTYPE;
+
+typedef struct _EXTPUSH {
+ WORD cbSize;
+ WORD Flags;
+ LPTSTR pTitle;
+ union {
+ DLGPROC DlgProc;
+ FARPROC pfnCallBack;
+ } DUMMYUNIONNAME;
+ ULONG_PTR IconID;
+ union {
+ WORD DlgTemplateID;
+ HANDLE hDlgTemplate;
+ } DUMMYUNIONNAME2;
+ ULONG_PTR dwReserved[3];
+} EXTPUSH, *PEXTPUSH;
+
+typedef struct _EXTCHKBOX {
+ WORD cbSize;
+ WORD Flags;
+ LPTSTR pTitle;
+ LPTSTR pSeparator;
+ LPTSTR pCheckedName;
+ ULONG_PTR IconID;
+ WORD wReserved[4];
+ ULONG_PTR dwReserved[2];
+} EXTCHKBOX, *PEXTCHKBOX;
+
+typedef struct _OIEXT {
+ WORD cbSize;
+ WORD Flags;
+ HINSTANCE hInstCaller;
+ LPTSTR pHelpFile;
+ ULONG_PTR dwReserved[4];
+} OIEXT, *POIEXT;
+
+typedef struct _OPTITEM {
+ WORD cbSize;
+ BYTE Level;
+ BYTE DlgPageIdx;
+ DWORD Flags;
+ ULONG_PTR UserData;
+ LPTSTR pName;
+ union {
+ LONG Sel;
+ LPTSTR pSel;
+ } DUMMYUNIONNAME;
+ union {
+ PEXTCHKBOX pExtChkBox;
+ PEXTPUSH pExtPush;
+ } DUMMYUNIONNAME2;
+ POPTTYPE pOptType;
+ DWORD HelpIndex;
+ BYTE DMPubID;
+ BYTE UserItemID;
+ WORD wReserved;
+ POIEXT pOIExt;
+ ULONG_PTR dwReserved[3];
+} OPTITEM, *POPTITEM;
+
+typedef struct _CPSUICBPARAM {
+ WORD cbSize;
+ WORD Reason;
+ HWND hDlg;
+ POPTITEM pOptItem;
+ WORD cOptItem;
+ WORD Flags;
+ POPTITEM pCurItem;
+ union {
+ LONG OldSel;
+ LPTSTR pOldSel;
+ } DUMMYUNIONNAME;
+ ULONG_PTR UserData;
+ ULONG_PTR Result;
+} CPSUICBPARAM, *PCPSUICBPARAM;
+
+typedef LONG
+(APIENTRY *_CPSUICALLBACK)(
+ PCPSUICBPARAM pCPSUICBParam);
+
+#define CPSUICALLBACK LONG APIENTRY
+
+typedef struct _DLGPAGE {
+ WORD cbSize;
+ WORD Flags;
+ DLGPROC DlgProc;
+ LPTSTR pTabName;
+ ULONG_PTR IconID;
+ union {
+ WORD DlgTemplateID;
+ HANDLE hDlgTemplate;
+ } DUMMYUNIONNAME;
+} DLGPAGE, *PDLGPAGE;
+
+typedef struct _COMPROPSHEETUI {
+ WORD cbSize;
+ WORD Flags;
+ HINSTANCE hInstCaller;
+ LPTSTR pCallerName;
+ ULONG_PTR UserData;
+ LPTSTR pHelpFile;
+ _CPSUICALLBACK pfnCallBack;
+ POPTITEM pOptItem;
+ PDLGPAGE pDlgPage;
+ WORD cOptItem;
+ WORD cDlgPage;
+ ULONG_PTR IconID;
+ LPTSTR pOptItemName;
+ WORD CallerVersion;
+ WORD OptItemVersion;
+ ULONG_PTR dwReserved[4];
+} COMPROPSHEETUI, *PCOMPROPSHEETUI;
+
+typedef struct _SETRESULT_INFO {
+ WORD cbSize;
+ WORD wReserved;
+ HANDLE hSetResult;
+ LRESULT Result;
+} SETRESULT_INFO, *PSETRESULT_INFO;
+
+typedef struct _INSERTPSUIPAGE_INFO {
+ WORD cbSize;
+ BYTE Type;
+ BYTE Mode;
+ ULONG_PTR dwData1;
+ ULONG_PTR dwData2;
+ ULONG_PTR dwData3;
+} INSERTPSUIPAGE_INFO, *PINSERTPSUIPAGE_INFO;
+
+typedef LONG_PTR
+(CALLBACK *PFNCOMPROPSHEET)(
+ HANDLE hComPropSheet,
+ UINT Function,
+ LPARAM lParam1,
+ LPARAM lParam2);
+
+typedef struct _PSPINFO {
+ WORD cbSize;
+ WORD wReserved;
+ HANDLE hComPropSheet;
+ HANDLE hCPSUIPage;
+ PFNCOMPROPSHEET pfnComPropSheet;
+} PSPINFO, *PPSPINFO;
+
+#define PPSPINFO_FROM_WM_INITDIALOG_LPARAM(lParam) \
+ (PPSPINFO)((LPBYTE)lParam + ((LPPROPSHEETPAGE)lParam)->dwSize)
+
+typedef struct _CPSUIDATABLOCK {
+ DWORD cbData;
+ LPBYTE pbData;
+} CPSUIDATABLOCK, *PCPSUIDATABLOCK;
+
+typedef struct _PROPSHEETUI_INFO {
+ WORD cbSize;
+ WORD Version;
+ WORD Flags;
+ WORD Reason;
+ HANDLE hComPropSheet;
+ PFNCOMPROPSHEET pfnComPropSheet;
+ LPARAM lParamInit;
+ ULONG_PTR UserData;
+ ULONG_PTR Result;
+} PROPSHEETUI_INFO, *PPROPSHEETUI_INFO;
+
+typedef struct _PROPSHEETUI_GETICON_INFO {
+ WORD cbSize;
+ WORD Flags;
+ WORD cxIcon;
+ WORD cyIcon;
+ HICON hIcon;
+} PROPSHEETUI_GETICON_INFO, *PPROPSHEETUI_GETICON_INFO;
+
+typedef LONG
+(FAR *PFNPROPSHEETUI)(
+ PPROPSHEETUI_INFO pPSUIInfo,
+ LPARAM lParam);
+
+typedef struct _PROPSHEETUI_INFO_HEADER {
+ WORD cbSize;
+ WORD Flags;
+ LPTSTR pTitle;
+ HWND hWndParent;
+ HINSTANCE hInst;
+ union {
+ HICON hIcon;
+ ULONG_PTR IconID;
+ } DUMMYUNIONNAME;
+} PROPSHEETUI_INFO_HEADER, *PPROPSHEETUI_INFO_HEADER;
+
+/* FUNCTIONS */
+
+LONG
+APIENTRY
+CommonPropertySheetUIA(
+ HWND hWndOwner,
+ PFNPROPSHEETUI pfnPropSheetUI,
+ LPARAM lParam,
+ LPDWORD pResult);
+
+LONG
+APIENTRY
+CommonPropertySheetUIW(
+ HWND hWndOwner,
+ PFNPROPSHEETUI pfnPropSheetUI,
+ LPARAM lParam,
+ LPDWORD pResult);
+
+#ifdef UNICODE
+#define CommonPropertySheetUI CommonPropertySheetUIW
+#else
+#define CommonPropertySheetUI CommonPropertySheetUIA
+#endif
+
+ULONG_PTR
+APIENTRY
+GetCPSUIUserData(
+ HWND hDlg);
+
+BOOL
+APIENTRY
+SetCPSUIUserData(
+ HWND hDlg,
+ ULONG_PTR CPSUIUserData);
+
+#endif /* (!defined(RC_INVOKED)) */
+
+/* FIXME : These declarations doesn't exist in the official header */
+ULONG_PTR WINAPI GetPSTUIUserData(HWND);
+BOOL WINAPI SetPSTUIUserData(HWND, ULONG_PTR);
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
diff --git a/include/psdk/dciddi.h b/include/psdk/dciddi.h
deleted file mode 100644
index f4a76c6e6d9..00000000000
--- a/include/psdk/dciddi.h
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * DCI driver interface
- *
- * Copyright (C) 2001 Ove Kaaven
- * Copyright (C) 2008 Magnus Olsen, Aleksey Bragin
- *
- * 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
- */
-
-#ifndef __INC_DCIDDI
-#define __INC_DCIDDI
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* DCI Command Escape */
-#define DCICOMMAND 3075
-#define DCI_VERSION 0x0100
-
-#define DCICREATEPRIMARYSURFACE 1
-#define DCICREATEOFFSCREENSURFACE 2
-#define DCICREATEOVERLAYSURFACE 3
-#define DCIENUMSURFACE 4
-#define DCIESCAPE 5
-
-typedef int DCIRVAL; /* DCI callback return type */
-
-/* DCI Errors and success codes*/
-#define DCI_SUCCESS(error) (((DCIRVAL)error) >= 0)
-
-#define DCI_STATUS_POINTERCHANGED 1
-#define DCI_STATUS_STRIDECHANGED 2
-#define DCI_STATUS_FORMATCHANGED 4
-#define DCI_STATUS_SURFACEINFOCHANGED 8
-#define DCI_STATUS_CHROMAKEYCHANGED 16
-#define DCI_STATUS_WASSTILLDRAWING 32
-
-#define DCI_OK 0
-#define DCI_FAIL_GENERIC -1
-#define DCI_FAIL_UNSUPPORTEDVERSION -2
-#define DCI_FAIL_INVALIDSURFACE -3
-#define DCI_FAIL_UNSUPPORTED -4
-
-#define DCI_ERR_CURRENTLYNOTAVAIL -5
-#define DCI_ERR_INVALIDRECT -6
-#define DCI_ERR_UNSUPPORTEDFORMAT -7
-#define DCI_ERR_UNSUPPORTEDMASK -8
-#define DCI_ERR_TOOBIGHEIGHT -9
-#define DCI_ERR_TOOBIGWIDTH -10
-#define DCI_ERR_TOOBIGSIZE -11
-#define DCI_ERR_OUTOFMEMORY -12
-#define DCI_ERR_INVALIDPOSITION -13
-#define DCI_ERR_INVALIDSTRETCH -14
-#define DCI_ERR_INVALIDCLIPLIST -15
-#define DCI_ERR_SURFACEISOBSCURED -16
-#define DCI_ERR_XALIGN -17
-#define DCI_ERR_YALIGN -18
-#define DCI_ERR_XYALIGN -19
-#define DCI_ERR_WIDTHALIGN -20
-#define DCI_ERR_HEIGHTALIGN -21
-
-/* Capabilities */
-#define DCI_SURFACE_TYPE 0x0000000F
-#define DCI_PRIMARY 0x00000000
-#define DCI_OFFSCREEN 0x00000001
-#define DCI_OVERLAY 0x00000002
-#define DCI_VISIBLE 0x00000010
-#define DCI_CHROMAKEY 0x00000020
-#define DCI_1632_ACCESS 0x00000040
-#define DCI_DWORDSIZE 0x00000080
-#define DCI_DWORDALIGN 0x00000100
-#define DCI_WRITEONLY 0x00000200
-#define DCI_ASYNC 0x00000400
-#define DCI_CAN_STRETCHX 0x00001000
-#define DCI_CAN_STRETCHY 0x00002000
-#define DCI_CAN_STRETCHXY (DCI_CAN_STRETCHX | DCI_CAN_STRETCHY)
-#define DCI_CAN_STRETCHXN 0x00004000
-#define DCI_CAN_STRETCHYN 0x00008000
-#define DCI_CAN_STRETCHXYN (DCI_CAN_STRETCHXN | DCI_CAN_STRETCHYN)
-#define DCI_CANOVERLAY 0x00010000
-
-/* FOURCC codes */
-#ifndef YVU9
-#define YVU9 mmioFOURCC('Y','V','U','9')
-#endif
-#ifndef Y411
-#define Y411 mmioFOURCC('Y','4','1','1')
-#endif
-#ifndef YUY2
-#define YUY2 mmioFOURCC('Y','U','Y','2')
-#endif
-#ifndef YVYU
-#define YVYU mmioFOURCC('Y','V','Y','U')
-#endif
-#ifndef UYVY
-#define UYVY mmioFOURCC('U','Y','V','Y')
-#endif
-#ifndef Y211
-#define Y211 mmioFOURCC('Y','2','1','1')
-#endif
-
-/*****************************************************************************
- * Escape command structures
- */
-typedef struct _DCICMD {
- DWORD dwCommand;
- DWORD dwParam1;
- DWORD dwParam2;
- DWORD dwVersion;
- DWORD dwReserved;
-} DCICMD;
-
-typedef struct _DCICREATEINPUT {
- DCICMD cmd;
- DWORD dwCompression;
- DWORD dwMask[3];
- DWORD dwWidth;
- DWORD dwHeight;
- DWORD dwDCICaps;
- DWORD dwBitCount;
- LPVOID lpSurface;
-} DCICREATEINPUT, *LPDCICREATEINPUT;
-
-typedef struct _DCISURFACEINFO {
- DWORD dwSize;
- DWORD dwDCICaps;
- DWORD dwCompression;
- DWORD dwMask[3];
- DWORD dwWidth;
- DWORD dwHeight;
- LONG lStride;
- DWORD dwBitCount;
- ULONG_PTR dwOffSurface;
- WORD wSelSurface;
- WORD wReserved;
- DWORD dwReserved1;
- DWORD dwReserved2;
- DWORD dwReserved3;
- DCIRVAL (CALLBACK *BeginAccess)(LPVOID, LPRECT);
- void (CALLBACK *EndAccess)(LPVOID);
- void (CALLBACK *DestroySurface)(LPVOID);
-} DCISURFACEINFO, *LPDCISURFACEINFO, DCIPRIMARY, *LPDCIPRIMARY;
-
-typedef void (*ENUM_CALLBACK)(LPDCISURFACEINFO lpSurfaceInfo,
- LPVOID lpContext);
-
-typedef struct _DCIENUMINPUT {
- DCICMD cmd;
- RECT rSrc;
- RECT rDst;
- void (CALLBACK *EnumCallback)(LPDCISURFACEINFO, LPVOID);
- LPVOID lpContext;
-} DCIENUMINPUT, *LPDCIENUMINPUT;
-
-typedef struct _DCIOFFSCREEN {
- DCISURFACEINFO dciInfo;
- DCIRVAL (CALLBACK *Draw) (LPVOID);
- DCIRVAL (CALLBACK *SetClipList) (LPVOID, LPRGNDATA);
- DCIRVAL (CALLBACK *SetDestination) (LPVOID, LPRECT, LPRECT);
-} DCIOFFSCREEN, *LPDCIOFFSCREEN;
-
-typedef struct _DCIOVERLAY {
- DCISURFACEINFO dciInfo;
- DWORD dwChromakeyValue;
- DWORD dwChromakeyMask;
-} DCIOVERLAY, *LPDCIOVERLAY;
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif /* __INC_DCIDDI */
diff --git a/include/ddk/devioctl.h b/include/psdk/devioctl.h
similarity index 79%
rename from include/ddk/devioctl.h
rename to include/psdk/devioctl.h
index f5fe01011f5..413b112141c 100644
--- a/include/ddk/devioctl.h
+++ b/include/psdk/devioctl.h
@@ -3,7 +3,11 @@
*
* IOCTL definitions
*
- * This file is part of the ReactOS ddk.
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Amine Khaldi
+ * Timo Kreuzer (timo.kreuzer@reactos.org)
*
* THIS SOFTWARE IS NOT COPYRIGHTED
*
@@ -16,13 +20,11 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
+#pragma once
#ifndef _DEVIOCTL_
#define _DEVIOCTL_
-/* DEVICE_OBJECT.DeviceType */
-
-#define DEVICE_TYPE ULONG
#define FILE_DEVICE_BEEP 0x00000001
#define FILE_DEVICE_CD_ROM 0x00000002
@@ -81,26 +83,39 @@
#define FILE_DEVICE_SERENUM 0x00000037
#define FILE_DEVICE_TERMSRV 0x00000038
#define FILE_DEVICE_KSEC 0x00000039
-#define FILE_DEVICE_FIPS 0x0000003a
+#define FILE_DEVICE_FIPS 0x0000003A
+#define FILE_DEVICE_INFINIBAND 0x0000003B
+#define FILE_DEVICE_VMBUS 0x0000003E
+#define FILE_DEVICE_CRYPT_PROVIDER 0x0000003F
+#define FILE_DEVICE_WPD 0x00000040
+#define FILE_DEVICE_BLUETOOTH 0x00000041
+#define FILE_DEVICE_MT_COMPOSITE 0x00000042
+#define FILE_DEVICE_MT_TRANSPORT 0x00000043
+#define FILE_DEVICE_BIOMETRIC 0x00000044
+#define FILE_DEVICE_PMI 0x00000045
-#define CTL_CODE(DeviceType, Function, Method, Access)( \
- ((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
+/* DEVICE_OBJECT.DeviceType */
+#define DEVICE_TYPE ULONG
+
+#define CTL_CODE(DeviceType, Function, Method, Access) \
+ (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
#define DEVICE_TYPE_FROM_CTL_CODE(ctl) (((ULONG) (ctl & 0xffff0000)) >> 16)
-#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)((ctrlCode) & 3))
+#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
#define METHOD_NEITHER 3
-#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
-#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
+#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
+#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
#define FILE_ANY_ACCESS 0x00000000
#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
#define FILE_READ_ACCESS 0x00000001
#define FILE_WRITE_ACCESS 0x00000002
-#endif /* !_DEVIOCTL_ */
+
+#endif /*_DEVIOCTL_ */
diff --git a/include/psdk/evntrace.h b/include/psdk/evntrace.h
index 331b8b0770b..75e1d5e58bc 100644
--- a/include/psdk/evntrace.h
+++ b/include/psdk/evntrace.h
@@ -1,4 +1,5 @@
-#ifndef _EVNTRACE_
+#pragma once
+
#define _EVNTRACE_
#ifndef WMIAPI
@@ -8,67 +9,321 @@
#else
#define WMIAPI DECLSPEC_IMPORT __stdcall
#endif
-#endif
+#endif /* MIDL_PASS */
+#endif /* WMIAPI */
+
+#include
+
+#ifdef __cplusplus
+extern "C" {
#endif
-typedef struct _EVENT_TRACE_PROPERTIES
-{
- WNODE_HEADER Wnode;
- ULONG BufferSize;
- ULONG MinimumBuffers;
- ULONG MaximumBuffers;
- ULONG MaximumFileSize;
- ULONG LogFileMode;
- ULONG FlushTimer;
- ULONG EnableFlags;
- LONG AgeLimit;
- ULONG NumberOfBuffers;
- ULONG FreeBuffers;
- ULONG EventsLost;
- ULONG BuffersWritten;
- ULONG LogBuffersLost;
- ULONG RealTimeBuffersLost;
- HANDLE LoggerThreadId;
- ULONG LogFileNameOffset;
- ULONG LoggerNameOffset;
-} EVENT_TRACE_PROPERTIES, *PEVENT_TRACE_PROPERTIES;
+DEFINE_GUID (EventTraceGuid, 0x68fdd900, 0x4a3e, 0x11d1, 0x84, 0xf4, 0x00, 0x00, 0xf8, 0x04, 0x64, 0xe3);
+DEFINE_GUID (SystemTraceControlGuid, 0x9e814aad, 0x3204, 0x11d2, 0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39);
+DEFINE_GUID (EventTraceConfigGuid, 0x01853a65, 0x418f, 0x4f36, 0xae, 0xfc, 0xdc, 0x0f, 0x1d, 0x2f, 0xd2, 0x35);
+DEFINE_GUID (DefaultTraceSecurityGuid, 0x0811c1af, 0x7a07, 0x4a06, 0x82, 0xed, 0x86, 0x94, 0x55, 0xcd, 0xf7, 0x13);
-typedef struct _EVENT_TRACE_HEADER
-{
- USHORT Size;
- union {
- USHORT FieldTypeFlags;
+#define KERNEL_LOGGER_NAMEW L"NT Kernel Logger"
+#define GLOBAL_LOGGER_NAMEW L"GlobalLogger"
+#define EVENT_LOGGER_NAMEW L"EventLog"
+#define DIAG_LOGGER_NAMEW L"DiagLog"
+
+#define KERNEL_LOGGER_NAMEA "NT Kernel Logger"
+#define GLOBAL_LOGGER_NAMEA "GlobalLogger"
+#define EVENT_LOGGER_NAMEA "EventLog"
+#define DIAG_LOGGER_NAMEA "DiagLog"
+
+#define MAX_MOF_FIELDS 16
+
+#ifndef _TRACEHANDLE_DEFINED
+#define _TRACEHANDLE_DEFINED
+typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
+#endif
+
+#define SYSTEM_EVENT_TYPE 1
+
+#define EVENT_TRACE_TYPE_INFO 0x00
+#define EVENT_TRACE_TYPE_START 0x01
+#define EVENT_TRACE_TYPE_END 0x02
+#define EVENT_TRACE_TYPE_STOP 0x02
+#define EVENT_TRACE_TYPE_DC_START 0x03
+#define EVENT_TRACE_TYPE_DC_END 0x04
+#define EVENT_TRACE_TYPE_EXTENSION 0x05
+#define EVENT_TRACE_TYPE_REPLY 0x06
+#define EVENT_TRACE_TYPE_DEQUEUE 0x07
+#define EVENT_TRACE_TYPE_RESUME 0x07
+#define EVENT_TRACE_TYPE_CHECKPOINT 0x08
+#define EVENT_TRACE_TYPE_SUSPEND 0x08
+#define EVENT_TRACE_TYPE_WINEVT_SEND 0x09
+#define EVENT_TRACE_TYPE_WINEVT_RECEIVE 0XF0
+
+#define TRACE_LEVEL_NONE 0
+#define TRACE_LEVEL_CRITICAL 1
+#define TRACE_LEVEL_FATAL 1
+#define TRACE_LEVEL_ERROR 2
+#define TRACE_LEVEL_WARNING 3
+#define TRACE_LEVEL_INFORMATION 4
+#define TRACE_LEVEL_VERBOSE 5
+#define TRACE_LEVEL_RESERVED6 6
+#define TRACE_LEVEL_RESERVED7 7
+#define TRACE_LEVEL_RESERVED8 8
+#define TRACE_LEVEL_RESERVED9 9
+
+#define EVENT_TRACE_TYPE_LOAD 0x0A
+
+#define EVENT_TRACE_TYPE_IO_READ 0x0A
+#define EVENT_TRACE_TYPE_IO_WRITE 0x0B
+#define EVENT_TRACE_TYPE_IO_READ_INIT 0x0C
+#define EVENT_TRACE_TYPE_IO_WRITE_INIT 0x0D
+#define EVENT_TRACE_TYPE_IO_FLUSH 0x0E
+#define EVENT_TRACE_TYPE_IO_FLUSH_INIT 0x0F
+
+#define EVENT_TRACE_TYPE_MM_TF 0x0A
+#define EVENT_TRACE_TYPE_MM_DZF 0x0B
+#define EVENT_TRACE_TYPE_MM_COW 0x0C
+#define EVENT_TRACE_TYPE_MM_GPF 0x0D
+#define EVENT_TRACE_TYPE_MM_HPF 0x0E
+#define EVENT_TRACE_TYPE_MM_AV 0x0F
+
+#define EVENT_TRACE_TYPE_SEND 0x0A
+#define EVENT_TRACE_TYPE_RECEIVE 0x0B
+#define EVENT_TRACE_TYPE_CONNECT 0x0C
+#define EVENT_TRACE_TYPE_DISCONNECT 0x0D
+#define EVENT_TRACE_TYPE_RETRANSMIT 0x0E
+#define EVENT_TRACE_TYPE_ACCEPT 0x0F
+#define EVENT_TRACE_TYPE_RECONNECT 0x10
+#define EVENT_TRACE_TYPE_CONNFAIL 0x11
+#define EVENT_TRACE_TYPE_COPY_TCP 0x12
+#define EVENT_TRACE_TYPE_COPY_ARP 0x13
+#define EVENT_TRACE_TYPE_ACKFULL 0x14
+#define EVENT_TRACE_TYPE_ACKPART 0x15
+#define EVENT_TRACE_TYPE_ACKDUP 0x16
+
+#define EVENT_TRACE_TYPE_GUIDMAP 0x0A
+#define EVENT_TRACE_TYPE_CONFIG 0x0B
+#define EVENT_TRACE_TYPE_SIDINFO 0x0C
+#define EVENT_TRACE_TYPE_SECURITY 0x0D
+
+#define EVENT_TRACE_TYPE_REGCREATE 0x0A
+#define EVENT_TRACE_TYPE_REGOPEN 0x0B
+#define EVENT_TRACE_TYPE_REGDELETE 0x0C
+#define EVENT_TRACE_TYPE_REGQUERY 0x0D
+#define EVENT_TRACE_TYPE_REGSETVALUE 0x0E
+#define EVENT_TRACE_TYPE_REGDELETEVALUE 0x0F
+#define EVENT_TRACE_TYPE_REGQUERYVALUE 0x10
+#define EVENT_TRACE_TYPE_REGENUMERATEKEY 0x11
+#define EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY 0x12
+#define EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE 0x13
+#define EVENT_TRACE_TYPE_REGSETINFORMATION 0x14
+#define EVENT_TRACE_TYPE_REGFLUSH 0x15
+#define EVENT_TRACE_TYPE_REGKCBCREATE 0x16
+#define EVENT_TRACE_TYPE_REGKCBDELETE 0x17
+#define EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN 0x18
+#define EVENT_TRACE_TYPE_REGKCBRUNDOWNEND 0x19
+#define EVENT_TRACE_TYPE_REGVIRTUALIZE 0x1A
+#define EVENT_TRACE_TYPE_REGCLOSE 0x1B
+#define EVENT_TRACE_TYPE_REGSETSECURITY 0x1C
+#define EVENT_TRACE_TYPE_REGQUERYSECURITY 0x1D
+#define EVENT_TRACE_TYPE_REGCOMMIT 0x1E
+#define EVENT_TRACE_TYPE_REGPREPARE 0x1F
+#define EVENT_TRACE_TYPE_REGROLLBACK 0x20
+#define EVENT_TRACE_TYPE_REGMOUNTHIVE 0x21
+
+#define EVENT_TRACE_TYPE_CONFIG_CPU 0x0A
+#define EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK 0x0B
+#define EVENT_TRACE_TYPE_CONFIG_LOGICALDISK 0x0C
+#define EVENT_TRACE_TYPE_CONFIG_NIC 0x0D
+#define EVENT_TRACE_TYPE_CONFIG_VIDEO 0x0E
+#define EVENT_TRACE_TYPE_CONFIG_SERVICES 0x0F
+#define EVENT_TRACE_TYPE_CONFIG_POWER 0x10
+#define EVENT_TRACE_TYPE_CONFIG_NETINFO 0x11
+
+#define EVENT_TRACE_TYPE_CONFIG_IRQ 0x15
+#define EVENT_TRACE_TYPE_CONFIG_PNP 0x16
+#define EVENT_TRACE_TYPE_CONFIG_IDECHANNEL 0x17
+#define EVENT_TRACE_TYPE_CONFIG_PLATFORM 0x19
+
+#define EVENT_TRACE_FLAG_PROCESS 0x00000001
+#define EVENT_TRACE_FLAG_THREAD 0x00000002
+#define EVENT_TRACE_FLAG_IMAGE_LOAD 0x00000004
+
+#define EVENT_TRACE_FLAG_DISK_IO 0x00000100
+#define EVENT_TRACE_FLAG_DISK_FILE_IO 0x00000200
+
+#define EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS 0x00001000
+#define EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS 0x00002000
+
+#define EVENT_TRACE_FLAG_NETWORK_TCPIP 0x00010000
+
+#define EVENT_TRACE_FLAG_REGISTRY 0x00020000
+#define EVENT_TRACE_FLAG_DBGPRINT 0x00040000
+
+#define EVENT_TRACE_FLAG_PROCESS_COUNTERS 0x00000008
+#define EVENT_TRACE_FLAG_CSWITCH 0x00000010
+#define EVENT_TRACE_FLAG_DPC 0x00000020
+#define EVENT_TRACE_FLAG_INTERRUPT 0x00000040
+#define EVENT_TRACE_FLAG_SYSTEMCALL 0x00000080
+
+#define EVENT_TRACE_FLAG_DISK_IO_INIT 0x00000400
+
+#define EVENT_TRACE_FLAG_ALPC 0x00100000
+#define EVENT_TRACE_FLAG_SPLIT_IO 0x00200000
+
+#define EVENT_TRACE_FLAG_DRIVER 0x00800000
+#define EVENT_TRACE_FLAG_PROFILE 0x01000000
+#define EVENT_TRACE_FLAG_FILE_IO 0x02000000
+#define EVENT_TRACE_FLAG_FILE_IO_INIT 0x04000000
+
+#define EVENT_TRACE_FLAG_DISPATCHER 0x00000800
+#define EVENT_TRACE_FLAG_VIRTUAL_ALLOC 0x00004000
+
+#define EVENT_TRACE_FLAG_EXTENSION 0x80000000
+#define EVENT_TRACE_FLAG_FORWARD_WMI 0x40000000
+#define EVENT_TRACE_FLAG_ENABLE_RESERVE 0x20000000
+
+#define EVENT_TRACE_FILE_MODE_NONE 0x00000000
+#define EVENT_TRACE_FILE_MODE_SEQUENTIAL 0x00000001
+#define EVENT_TRACE_FILE_MODE_CIRCULAR 0x00000002
+#define EVENT_TRACE_FILE_MODE_APPEND 0x00000004
+
+#define EVENT_TRACE_REAL_TIME_MODE 0x00000100
+#define EVENT_TRACE_DELAY_OPEN_FILE_MODE 0x00000200
+#define EVENT_TRACE_BUFFERING_MODE 0x00000400
+#define EVENT_TRACE_PRIVATE_LOGGER_MODE 0x00000800
+#define EVENT_TRACE_ADD_HEADER_MODE 0x00001000
+
+#define EVENT_TRACE_USE_GLOBAL_SEQUENCE 0x00004000
+#define EVENT_TRACE_USE_LOCAL_SEQUENCE 0x00008000
+
+#define EVENT_TRACE_RELOG_MODE 0x00010000
+
+#define EVENT_TRACE_USE_PAGED_MEMORY 0x01000000
+
+#define EVENT_TRACE_FILE_MODE_NEWFILE 0x00000008
+#define EVENT_TRACE_FILE_MODE_PREALLOCATE 0x00000020
+
+#define EVENT_TRACE_NONSTOPPABLE_MODE 0x00000040
+#define EVENT_TRACE_SECURE_MODE 0x00000080
+#define EVENT_TRACE_USE_KBYTES_FOR_SIZE 0x00002000
+#define EVENT_TRACE_PRIVATE_IN_PROC 0x00020000
+#define EVENT_TRACE_MODE_RESERVED 0x00100000
+
+#define EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING 0x10000000
+
+#define EVENT_TRACE_CONTROL_QUERY 0
+#define EVENT_TRACE_CONTROL_STOP 1
+#define EVENT_TRACE_CONTROL_UPDATE 2
+
+#define EVENT_TRACE_CONTROL_FLUSH 3
+
+#define TRACE_MESSAGE_SEQUENCE 1
+#define TRACE_MESSAGE_GUID 2
+#define TRACE_MESSAGE_COMPONENTID 4
+#define TRACE_MESSAGE_TIMESTAMP 8
+#define TRACE_MESSAGE_PERFORMANCE_TIMESTAMP 16
+#define TRACE_MESSAGE_SYSTEMINFO 32
+
+#define TRACE_MESSAGE_POINTER32 0x0040
+#define TRACE_MESSAGE_POINTER64 0x0080
+
+#define TRACE_MESSAGE_FLAG_MASK 0xFFFF
+
+#define TRACE_MESSAGE_MAXIMUM_SIZE 8*1024
+
+#define EVENT_TRACE_USE_PROCTIME 0x0001
+#define EVENT_TRACE_USE_NOCPUTIME 0x0002
+
+#define TRACE_HEADER_FLAG_USE_TIMESTAMP 0x00000200
+#define TRACE_HEADER_FLAG_TRACED_GUID 0x00020000
+#define TRACE_HEADER_FLAG_LOG_WNODE 0x00040000
+#define TRACE_HEADER_FLAG_USE_GUID_PTR 0x00080000
+#define TRACE_HEADER_FLAG_USE_MOF_PTR 0x00100000
+
+#define ETW_NULL_TYPE_VALUE 0
+#define ETW_OBJECT_TYPE_VALUE 1
+#define ETW_STRING_TYPE_VALUE 2
+#define ETW_SBYTE_TYPE_VALUE 3
+#define ETW_BYTE_TYPE_VALUE 4
+#define ETW_INT16_TYPE_VALUE 5
+#define ETW_UINT16_TYPE_VALUE 6
+#define ETW_INT32_TYPE_VALUE 7
+#define ETW_UINT32_TYPE_VALUE 8
+#define ETW_INT64_TYPE_VALUE 9
+#define ETW_UINT64_TYPE_VALUE 10
+#define ETW_CHAR_TYPE_VALUE 11
+#define ETW_SINGLE_TYPE_VALUE 12
+#define ETW_DOUBLE_TYPE_VALUE 13
+#define ETW_BOOLEAN_TYPE_VALUE 14
+#define ETW_DECIMAL_TYPE_VALUE 15
+
+#define ETW_GUID_TYPE_VALUE 101
+#define ETW_ASCIICHAR_TYPE_VALUE 102
+#define ETW_ASCIISTRING_TYPE_VALUE 103
+#define ETW_COUNTED_STRING_TYPE_VALUE 104
+#define ETW_POINTER_TYPE_VALUE 105
+#define ETW_SIZET_TYPE_VALUE 106
+#define ETW_HIDDEN_TYPE_VALUE 107
+#define ETW_BOOL_TYPE_VALUE 108
+#define ETW_COUNTED_ANSISTRING_TYPE_VALUE 109
+#define ETW_REVERSED_COUNTED_STRING_TYPE_VALUE 110
+#define ETW_REVERSED_COUNTED_ANSISTRING_TYPE_VALUE 111
+#define ETW_NON_NULL_TERMINATED_STRING_TYPE_VALUE 112
+#define ETW_REDUCED_ANSISTRING_TYPE_VALUE 113
+#define ETW_REDUCED_STRING_TYPE_VALUE 114
+#define ETW_SID_TYPE_VALUE 115
+#define ETW_VARIANT_TYPE_VALUE 116
+#define ETW_PTVECTOR_TYPE_VALUE 117
+#define ETW_WMITIME_TYPE_VALUE 118
+#define ETW_DATETIME_TYPE_VALUE 119
+#define ETW_REFRENCE_TYPE_VALUE 120
+
+#define TRACE_PROVIDER_FLAG_LEGACY 0x00000001
+#define TRACE_PROVIDER_FLAG_PRE_ENABLE 0x00000002
+
+#define EVENT_CONTROL_CODE_DISABLE_PROVIDER 0
+#define EVENT_CONTROL_CODE_ENABLE_PROVIDER 1
+#define EVENT_CONTROL_CODE_CAPTURE_STATE 2
+
+#define DEFINE_TRACE_MOF_FIELD(MOF, ptr, length, type) \
+ (MOF)->DataPtr = (ULONG64)(ULONG_PTR) ptr; \
+ (MOF)->Length = (ULONG) length; \
+ (MOF)->DataType = (ULONG) type;
+
+typedef struct _EVENT_TRACE_HEADER {
+ USHORT Size;
+ _ANONYMOUS_UNION union {
+ USHORT FieldTypeFlags;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR HeaderType;
+ UCHAR MarkerFlags;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ _ANONYMOUS_UNION union {
+ ULONG Version;
struct {
- UCHAR HeaderType;
- UCHAR MarkerFlags;
- };
- };
- union {
- ULONG Version;
- struct {
- UCHAR Type;
- UCHAR Level;
- USHORT Version;
+ UCHAR Type;
+ UCHAR Level;
+ USHORT Version;
} Class;
- };
- ULONG ThreadId;
- ULONG ProcessId;
- LARGE_INTEGER TimeStamp;
- union {
- GUID Guid;
- ULONGLONG GuidPtr;
- };
- union {
- struct {
- ULONG ClientContext;
- ULONG Flags;
- };
- struct {
- ULONG KernelTime;
- ULONG UserTime;
- };
- ULONG64 ProcessorTime;
- };
+ } DUMMYUNIONNAME2;
+ ULONG ThreadId;
+ ULONG ProcessId;
+ LARGE_INTEGER TimeStamp;
+ _ANONYMOUS_UNION union {
+ GUID Guid;
+ ULONGLONG GuidPtr;
+ } DUMMYUNIONNAME3;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ ULONG KernelTime;
+ ULONG UserTime;
+ } DUMMYSTRUCTNAME;
+ ULONG64 ProcessorTime;
+ _ANONYMOUS_STRUCT struct {
+ ULONG ClientContext;
+ ULONG Flags;
+ } DUMMYSTRUCTNAME2;
+ } DUMMYUNIONNAME4;
} EVENT_TRACE_HEADER;
#ifndef PEVENT_TRACE_HEADER_DEFINED
@@ -76,35 +331,767 @@ typedef struct _EVENT_TRACE_HEADER
typedef struct _EVENT_TRACE_HEADER *PEVENT_TRACE_HEADER;
#endif
+typedef struct _EVENT_INSTANCE_HEADER {
+ USHORT Size;
+ _ANONYMOUS_UNION union {
+ USHORT FieldTypeFlags;
+ _ANONYMOUS_STRUCT struct {
+ UCHAR HeaderType;
+ UCHAR MarkerFlags;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ _ANONYMOUS_UNION union {
+ ULONG Version;
+ struct {
+ UCHAR Type;
+ UCHAR Level;
+ USHORT Version;
+ } Class;
+ } DUMMYUNIONNAME2;
+ ULONG ThreadId;
+ ULONG ProcessId;
+ LARGE_INTEGER TimeStamp;
+ ULONGLONG RegHandle;
+ ULONG InstanceId;
+ ULONG ParentInstanceId;
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ ULONG KernelTime;
+ ULONG UserTime;
+ } DUMMYSTRUCTNAME;
+ ULONG64 ProcessorTime;
+ _ANONYMOUS_STRUCT struct {
+ ULONG EventId;
+ ULONG Flags;
+ } DUMMYSTRUCTNAME2;
+ } DUMMYUNIONNAME3;
+ ULONGLONG ParentRegHandle;
+} EVENT_INSTANCE_HEADER, *PEVENT_INSTANCE_HEADER;
-typedef ULONG64 TRACEHANDLE, *PTRACEHANDLE;
-typedef ULONG (WINAPI *WMIDPREQUEST)(
- WMIDPREQUESTCODE RequestCode,
- PVOID RequestContext,
- ULONG *BufferSize,
- PVOID Buffer
-);
+typedef struct _MOF_FIELD {
+ ULONG64 DataPtr;
+ ULONG Length;
+ ULONG DataType;
+} MOF_FIELD, *PMOF_FIELD;
-typedef struct _TRACE_GUID_REGISTRATION
-{
- LPCGUID Guid;
- HANDLE RegHandle;
+typedef struct _EVENT_INSTANCE_INFO {
+ HANDLE RegHandle;
+ ULONG InstanceId;
+} EVENT_INSTANCE_INFO, *PEVENT_INSTANCE_INFO;
+
+typedef struct _TRACE_GUID_PROPERTIES {
+ GUID Guid;
+ ULONG GuidType;
+ ULONG LoggerId;
+ ULONG EnableLevel;
+ ULONG EnableFlags;
+ BOOLEAN IsEnable;
+} TRACE_GUID_PROPERTIES, *PTRACE_GUID_PROPERTIES;
+
+typedef struct _ETW_BUFFER_CONTEXT {
+ UCHAR ProcessorNumber;
+ UCHAR Alignment;
+ USHORT LoggerId;
+} ETW_BUFFER_CONTEXT, *PETW_BUFFER_CONTEXT;
+
+typedef struct _TRACE_ENABLE_INFO {
+ ULONG IsEnabled;
+ UCHAR Level;
+ UCHAR Reserved1;
+ USHORT LoggerId;
+ ULONG EnableProperty;
+ ULONG Reserved2;
+ ULONGLONG MatchAnyKeyword;
+ ULONGLONG MatchAllKeyword;
+} TRACE_ENABLE_INFO, *PTRACE_ENABLE_INFO;
+
+typedef struct _TRACE_PROVIDER_INSTANCE_INFO {
+ ULONG NextOffset;
+ ULONG EnableCount;
+ ULONG Pid;
+ ULONG Flags;
+} TRACE_PROVIDER_INSTANCE_INFO, *PTRACE_PROVIDER_INSTANCE_INFO;
+
+typedef struct _TRACE_GUID_INFO {
+ ULONG InstanceCount;
+ ULONG Reserved;
+} TRACE_GUID_INFO, *PTRACE_GUID_INFO;
+
+typedef struct _EVENT_TRACE {
+ EVENT_TRACE_HEADER Header;
+ ULONG InstanceId;
+ ULONG ParentInstanceId;
+ GUID ParentGuid;
+ PVOID MofData;
+ ULONG MofLength;
+ _ANONYMOUS_UNION union {
+ ULONG ClientContext;
+ ETW_BUFFER_CONTEXT BufferContext;
+ } DUMMYUNIONNAME;
+} EVENT_TRACE, *PEVENT_TRACE;
+
+#if !(defined(_NTDDK_) || defined(_NTIFS_)) || defined(_WMIKM_)
+
+typedef struct _TRACE_LOGFILE_HEADER {
+ ULONG BufferSize;
+ _ANONYMOUS_UNION union {
+ ULONG Version;
+ struct {
+ UCHAR MajorVersion;
+ UCHAR MinorVersion;
+ UCHAR SubVersion;
+ UCHAR SubMinorVersion;
+ } VersionDetail;
+ } DUMMYUNIONNAME;
+ ULONG ProviderVersion;
+ ULONG NumberOfProcessors;
+ LARGE_INTEGER EndTime;
+ ULONG TimerResolution;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG BuffersWritten;
+ _ANONYMOUS_UNION union {
+ GUID LogInstanceGuid;
+ _ANONYMOUS_STRUCT struct {
+ ULONG StartBuffers;
+ ULONG PointerSize;
+ ULONG EventsLost;
+ ULONG CpuSpeedInMHz;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
+#if defined(_WMIKM_)
+ PWCHAR LoggerName;
+ PWCHAR LogFileName;
+ RTL_TIME_ZONE_INFORMATION TimeZone;
+#else
+ LPWSTR LoggerName;
+ LPWSTR LogFileName;
+ TIME_ZONE_INFORMATION TimeZone;
+#endif
+ LARGE_INTEGER BootTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER StartTime;
+ ULONG ReservedFlags;
+ ULONG BuffersLost;
+} TRACE_LOGFILE_HEADER, *PTRACE_LOGFILE_HEADER;
+
+typedef struct _TRACE_LOGFILE_HEADER32 {
+ ULONG BufferSize;
+ _ANONYMOUS_UNION union {
+ ULONG Version;
+ struct {
+ UCHAR MajorVersion;
+ UCHAR MinorVersion;
+ UCHAR SubVersion;
+ UCHAR SubMinorVersion;
+ } VersionDetail;
+ } DUMMYUNIONNAME;
+ ULONG ProviderVersion;
+ ULONG NumberOfProcessors;
+ LARGE_INTEGER EndTime;
+ ULONG TimerResolution;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG BuffersWritten;
+ _ANONYMOUS_UNION union {
+ GUID LogInstanceGuid;
+ _ANONYMOUS_STRUCT struct {
+ ULONG StartBuffers;
+ ULONG PointerSize;
+ ULONG EventsLost;
+ ULONG CpuSpeedInMHz;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
+#if defined(_WMIKM_)
+ ULONG32 LoggerName;
+ ULONG32 LogFileName;
+ RTL_TIME_ZONE_INFORMATION TimeZone;
+#else
+ ULONG32 LoggerName;
+ ULONG32 LogFileName;
+ TIME_ZONE_INFORMATION TimeZone;
+#endif
+ LARGE_INTEGER BootTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER StartTime;
+ ULONG ReservedFlags;
+ ULONG BuffersLost;
+} TRACE_LOGFILE_HEADER32, *PTRACE_LOGFILE_HEADER32;
+
+typedef struct _TRACE_LOGFILE_HEADER64 {
+ ULONG BufferSize;
+ _ANONYMOUS_UNION union {
+ ULONG Version;
+ struct {
+ UCHAR MajorVersion;
+ UCHAR MinorVersion;
+ UCHAR SubVersion;
+ UCHAR SubMinorVersion;
+ } VersionDetail;
+ } DUMMYUNIONNAME;
+ ULONG ProviderVersion;
+ ULONG NumberOfProcessors;
+ LARGE_INTEGER EndTime;
+ ULONG TimerResolution;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG BuffersWritten;
+ _ANONYMOUS_UNION union {
+ GUID LogInstanceGuid;
+ _ANONYMOUS_STRUCT struct {
+ ULONG StartBuffers;
+ ULONG PointerSize;
+ ULONG EventsLost;
+ ULONG CpuSpeedInMHz;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
+#if defined(_WMIKM_)
+ ULONG64 LoggerName;
+ ULONG64 LogFileName;
+ RTL_TIME_ZONE_INFORMATION TimeZone;
+#else
+ ULONG64 LoggerName;
+ ULONG64 LogFileName;
+ TIME_ZONE_INFORMATION TimeZone;
+#endif
+ LARGE_INTEGER BootTime;
+ LARGE_INTEGER PerfFreq;
+ LARGE_INTEGER StartTime;
+ ULONG ReservedFlags;
+ ULONG BuffersLost;
+} TRACE_LOGFILE_HEADER64, *PTRACE_LOGFILE_HEADER64;
+
+#endif /* !_NTDDK_ || _WMIKM_ */
+
+#if !defined(_WMIKM_) && !defined(_NTDDK_) && !defined(_NTIFS_)
+
+#define ENABLE_TRACE_PARAMETERS_VERSION 1
+
+typedef struct _EVENT_TRACE_PROPERTIES {
+ WNODE_HEADER Wnode;
+ ULONG BufferSize;
+ ULONG MinimumBuffers;
+ ULONG MaximumBuffers;
+ ULONG MaximumFileSize;
+ ULONG LogFileMode;
+ ULONG FlushTimer;
+ ULONG EnableFlags;
+ LONG AgeLimit;
+ ULONG NumberOfBuffers;
+ ULONG FreeBuffers;
+ ULONG EventsLost;
+ ULONG BuffersWritten;
+ ULONG LogBuffersLost;
+ ULONG RealTimeBuffersLost;
+ HANDLE LoggerThreadId;
+ ULONG LogFileNameOffset;
+ ULONG LoggerNameOffset;
+} EVENT_TRACE_PROPERTIES, *PEVENT_TRACE_PROPERTIES;
+
+typedef struct _TRACE_GUID_REGISTRATION {
+ LPCGUID Guid;
+ HANDLE RegHandle;
} TRACE_GUID_REGISTRATION, *PTRACE_GUID_REGISTRATION;
+typedef struct _EVENT_RECORD EVENT_RECORD, *PEVENT_RECORD;
+typedef struct _EVENT_TRACE_LOGFILEW EVENT_TRACE_LOGFILEW, *PEVENT_TRACE_LOGFILEW;
+typedef struct _EVENT_TRACE_LOGFILEA EVENT_TRACE_LOGFILEA, *PEVENT_TRACE_LOGFILEA;
+typedef struct _EVENT_FILTER_DESCRIPTOR EVENT_FILTER_DESCRIPTOR, *PEVENT_FILTER_DESCRIPTOR;
-ULONG WMIAPI TraceEvent(TRACEHANDLE,PEVENT_TRACE_HEADER);
-TRACEHANDLE WMIAPI GetTraceLoggerHandle(PVOID);
-ULONG WMIAPI GetTraceEnableFlags(TRACEHANDLE);
-UCHAR WMIAPI GetTraceEnableLevel(TRACEHANDLE);
-ULONG WMIAPI RegisterTraceGuidsA(WMIDPREQUEST,PVOID,LPCGUID,ULONG,PTRACE_GUID_REGISTRATION,LPCSTR,LPCSTR,PTRACEHANDLE);
-ULONG WMIAPI RegisterTraceGuidsW(WMIDPREQUEST,PVOID,LPCGUID,ULONG,PTRACE_GUID_REGISTRATION,LPCWSTR,LPCWSTR,PTRACEHANDLE);
-ULONG WMIAPI UnregisterTraceGuids(TRACEHANDLE);
+typedef ULONG
+(WINAPI *PEVENT_TRACE_BUFFER_CALLBACKW)(
+ PEVENT_TRACE_LOGFILEW Logfile);
+
+typedef ULONG
+(WINAPI *PEVENT_TRACE_BUFFER_CALLBACKA)(
+ PEVENT_TRACE_LOGFILEA Logfile);
+
+typedef VOID
+(WINAPI *PEVENT_CALLBACK)(
+ PEVENT_TRACE pEvent );
+
+typedef VOID
+(WINAPI *PEVENT_RECORD_CALLBACK)(
+ PEVENT_RECORD EventRecord);
+
+typedef ULONG
+(WINAPI *WMIDPREQUEST)(
+ IN WMIDPREQUESTCODE RequestCode,
+ IN PVOID RequestContext,
+ IN OUT ULONG *BufferSize,
+ IN OUT PVOID Buffer);
+
+struct _EVENT_TRACE_LOGFILEW {
+ LPWSTR LogFileName;
+ LPWSTR LoggerName;
+ LONGLONG CurrentTime;
+ ULONG BuffersRead;
+ _ANONYMOUS_UNION union {
+ ULONG LogFileMode;
+ ULONG ProcessTraceMode;
+ } DUMMYUNIONNAME;
+ EVENT_TRACE CurrentEvent;
+ TRACE_LOGFILE_HEADER LogfileHeader;
+ PEVENT_TRACE_BUFFER_CALLBACKW BufferCallback;
+ ULONG BufferSize;
+ ULONG Filled;
+ ULONG EventsLost;
+ _ANONYMOUS_UNION union {
+ PEVENT_CALLBACK EventCallback;
+ PEVENT_RECORD_CALLBACK EventRecordCallback;
+ } DUMMYUNIONNAME2;
+ ULONG IsKernelTrace;
+ PVOID Context;
+};
+
+struct _EVENT_TRACE_LOGFILEA {
+ LPSTR LogFileName;
+ LPSTR LoggerName;
+ LONGLONG CurrentTime;
+ ULONG BuffersRead;
+ _ANONYMOUS_UNION union {
+ ULONG LogFileMode;
+ ULONG ProcessTraceMode;
+ } DUMMYUNIONNAME;
+ EVENT_TRACE CurrentEvent;
+ TRACE_LOGFILE_HEADER LogfileHeader;
+ PEVENT_TRACE_BUFFER_CALLBACKA BufferCallback;
+ ULONG BufferSize;
+ ULONG Filled;
+ ULONG EventsLost;
+ _ANONYMOUS_UNION union {
+ PEVENT_CALLBACK EventCallback;
+ PEVENT_RECORD_CALLBACK EventRecordCallback;
+ } DUMMYUNIONNAME2;
+ ULONG IsKernelTrace;
+ PVOID Context;
+};
+
+#if defined(_UNICODE) || defined(UNICODE)
+
+#define PEVENT_TRACE_BUFFER_CALLBACK PEVENT_TRACE_BUFFER_CALLBACKW
+#define EVENT_TRACE_LOGFILE EVENT_TRACE_LOGFILEW
+#define PEVENT_TRACE_LOGFILE PEVENT_TRACE_LOGFILEW
+#define KERNEL_LOGGER_NAME KERNEL_LOGGER_NAMEW
+#define GLOBAL_LOGGER_NAME GLOBAL_LOGGER_NAMEW
+#define EVENT_LOGGER_NAME EVENT_LOGGER_NAMEW
-#if defined (UNICODE) || defined (_UNICODE)
-#define RegisterTraceGuids RegisterTraceGuidsW
#else
-#define RegisterTraceGuids RegisterTraceGuidsA
+
+#define PEVENT_TRACE_BUFFER_CALLBACK PEVENT_TRACE_BUFFER_CALLBACKA
+#define EVENT_TRACE_LOGFILE EVENT_TRACE_LOGFILEA
+#define PEVENT_TRACE_LOGFILE PEVENT_TRACE_LOGFILEA
+#define KERNEL_LOGGER_NAME KERNEL_LOGGER_NAMEA
+#define GLOBAL_LOGGER_NAME GLOBAL_LOGGER_NAMEA
+#define EVENT_LOGGER_NAME EVENT_LOGGER_NAMEA
+
+#endif /* defined(_UNICODE) || defined(UNICODE) */
+
+typedef enum _TRACE_QUERY_INFO_CLASS {
+ TraceGuidQueryList,
+ TraceGuidQueryInfo,
+ TraceGuidQueryProcess,
+ TraceStackTracingInfo,
+ MaxTraceSetInfoClass
+} TRACE_QUERY_INFO_CLASS, TRACE_INFO_CLASS;
+
+typedef struct _CLASSIC_EVENT_ID {
+ GUID EventGuid;
+ UCHAR Type;
+ UCHAR Reserved[7];
+} CLASSIC_EVENT_ID, *PCLASSIC_EVENT_ID;
+
+typedef struct _ENABLE_TRACE_PARAMETERS {
+ ULONG Version;
+ ULONG EnableProperty;
+ ULONG ControlFlags;
+ GUID SourceId;
+ PEVENT_FILTER_DESCRIPTOR EnableFilterDesc;
+} ENABLE_TRACE_PARAMETERS, *PENABLE_TRACE_PARAMETERS;
+
+#define INVALID_PROCESSTRACE_HANDLE ((TRACEHANDLE)INVALID_HANDLE_VALUE)
+
+#if defined(UNICODE) || defined(_UNICODE)
+
+#define RegisterTraceGuids RegisterTraceGuidsW
+#define StartTrace StartTraceW
+#define ControlTrace ControlTraceW
+
+#if defined(__TRACE_W2K_COMPATIBLE)
+
+#define StopTrace(a,b,c) ControlTraceW((a),(b),(c), EVENT_TRACE_CONTROL_STOP)
+#define QueryTrace(a,b,c) ControlTraceW((a),(b),(c), EVENT_TRACE_CONTROL_QUERY)
+#define UpdateTrace(a,b,c) ControlTraceW((a),(b),(c), EVENT_TRACE_CONTROL_UPDATE)
+
+#else
+
+#define StopTrace StopTraceW
+#define QueryTrace QueryTraceW
+#define UpdateTrace UpdateTraceW
+
+#endif /* defined(__TRACE_W2K_COMPATIBLE) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define FlushTrace FlushTraceW
#endif
-#endif /* ENVTRACE_H */
+#define QueryAllTraces QueryAllTracesW
+#define OpenTrace OpenTraceW
+#else /* defined(UNICODE) || defined(_UNICODE) */
+
+#define RegisterTraceGuids RegisterTraceGuidsA
+#define StartTrace StartTraceA
+#define ControlTrace ControlTraceA
+
+#if defined(__TRACE_W2K_COMPATIBLE)
+
+#define StopTrace(a,b,c) ControlTraceA((a),(b),(c), EVENT_TRACE_CONTROL_STOP)
+#define QueryTrace(a,b,c) ControlTraceA((a),(b),(c), EVENT_TRACE_CONTROL_QUERY)
+#define UpdateTrace(a,b,c) ControlTraceA((a),(b),(c), EVENT_TRACE_CONTROL_UPDATE)
+
+#else
+
+#define StopTrace StopTraceA
+#define QueryTrace QueryTraceA
+#define UpdateTrace UpdateTraceA
+
+#endif /* defined(__TRACE_W2K_COMPATIBLE) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define FlushTrace FlushTraceA
+#endif
+
+#define QueryAllTraces QueryAllTracesA
+#define OpenTrace OpenTraceA
+
+#endif /* defined(UNICODE) || defined(_UNICODE) */
+
+EXTERN_C
+ULONG
+WMIAPI
+StartTraceW(
+ OUT PTRACEHANDLE TraceHandle,
+ IN LPCWSTR InstanceName,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+StartTraceA(
+ OUT PTRACEHANDLE TraceHandle,
+ IN LPCSTR InstanceName,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+StopTraceW(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCWSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+StopTraceA(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+QueryTraceW(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCWSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+QueryTraceA(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+UpdateTraceW(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCWSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+UpdateTraceA(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+ControlTraceW(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCWSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties,
+ IN ULONG ControlCode);
+
+EXTERN_C
+ULONG
+WMIAPI
+ControlTraceA(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties,
+ IN ULONG ControlCode);
+
+EXTERN_C
+ULONG
+WMIAPI
+QueryAllTracesW(
+ OUT PEVENT_TRACE_PROPERTIES *PropertyArray,
+ IN ULONG PropertyArrayCount,
+ OUT PULONG LoggerCount);
+
+EXTERN_C
+ULONG
+WMIAPI
+QueryAllTracesA(
+ OUT PEVENT_TRACE_PROPERTIES *PropertyArray,
+ IN ULONG PropertyArrayCount,
+ OUT PULONG LoggerCount);
+
+EXTERN_C
+ULONG
+WMIAPI
+EnableTrace(
+ IN ULONG Enable,
+ IN ULONG EnableFlag,
+ IN ULONG EnableLevel,
+ IN LPCGUID ControlGuid,
+ IN TRACEHANDLE TraceHandle);
+
+EXTERN_C
+ULONG
+WMIAPI
+CreateTraceInstanceId(
+ IN HANDLE RegHandle,
+ IN OUT PEVENT_INSTANCE_INFO InstInfo);
+
+EXTERN_C
+ULONG
+WMIAPI
+TraceEvent(
+ IN TRACEHANDLE TraceHandle,
+ IN PEVENT_TRACE_HEADER EventTrace);
+
+EXTERN_C
+ULONG
+WMIAPI
+TraceEventInstance(
+ IN TRACEHANDLE TraceHandle,
+ IN PEVENT_INSTANCE_HEADER EventTrace,
+ IN PEVENT_INSTANCE_INFO InstInfo,
+ IN PEVENT_INSTANCE_INFO ParentInstInfo OPTIONAL);
+
+EXTERN_C
+ULONG
+WMIAPI
+RegisterTraceGuidsW(
+ IN WMIDPREQUEST RequestAddress,
+ IN PVOID RequestContext OPTIONAL,
+ IN LPCGUID ControlGuid,
+ IN ULONG GuidCount,
+ IN PTRACE_GUID_REGISTRATION TraceGuidReg OPTIONAL,
+ IN LPCWSTR MofImagePath OPTIONAL,
+ IN LPCWSTR MofResourceName OPTIONAL,
+ OUT PTRACEHANDLE RegistrationHandle);
+
+EXTERN_C
+ULONG
+WMIAPI
+RegisterTraceGuidsA(
+ IN WMIDPREQUEST RequestAddress,
+ IN PVOID RequestContext OPTIONAL,
+ IN LPCGUID ControlGuid,
+ IN ULONG GuidCount,
+ IN PTRACE_GUID_REGISTRATION TraceGuidReg OPTIONAL,
+ IN LPCSTR MofImagePath OPTIONAL,
+ IN LPCSTR MofResourceName OPTIONAL,
+ OUT PTRACEHANDLE RegistrationHandle);
+
+EXTERN_C
+ULONG
+WMIAPI
+UnregisterTraceGuids(
+ IN TRACEHANDLE RegistrationHandle);
+
+EXTERN_C
+TRACEHANDLE
+WMIAPI
+GetTraceLoggerHandle(
+ IN PVOID Buffer);
+
+EXTERN_C
+UCHAR
+WMIAPI
+GetTraceEnableLevel(
+ IN TRACEHANDLE TraceHandle);
+
+EXTERN_C
+ULONG
+WMIAPI
+GetTraceEnableFlags(
+ IN TRACEHANDLE TraceHandle);
+
+EXTERN_C
+TRACEHANDLE
+WMIAPI
+OpenTraceA(
+ IN OUT PEVENT_TRACE_LOGFILEA Logfile);
+
+EXTERN_C
+TRACEHANDLE
+WMIAPI
+OpenTraceW(
+ IN OUT PEVENT_TRACE_LOGFILEW Logfile);
+
+EXTERN_C
+ULONG
+WMIAPI
+ProcessTrace(
+ IN PTRACEHANDLE HandleArray,
+ IN ULONG HandleCount,
+ IN LPFILETIME StartTime OPTIONAL,
+ IN LPFILETIME EndTime OPTIONAL);
+
+EXTERN_C
+ULONG
+WMIAPI
+CloseTrace(
+ IN TRACEHANDLE TraceHandle);
+
+EXTERN_C
+ULONG
+WMIAPI
+SetTraceCallback(
+ IN LPCGUID pGuid,
+ IN PEVENT_CALLBACK EventCallback);
+
+EXTERN_C
+ULONG
+WMIAPI
+RemoveTraceCallback(
+ IN LPCGUID pGuid);
+
+EXTERN_C
+ULONG
+__cdecl
+TraceMessage(
+ IN TRACEHANDLE LoggerHandle,
+ IN ULONG MessageFlags,
+ IN LPCGUID MessageGuid,
+ IN USHORT MessageNumber,
+ ...);
+
+EXTERN_C
+ULONG
+TraceMessageVa(
+ IN TRACEHANDLE LoggerHandle,
+ IN ULONG MessageFlags,
+ IN LPCGUID MessageGuid,
+ IN USHORT MessageNumber,
+ IN va_list MessageArgList);
+
+#if (WINVER >= _WIN32_WINNT_WINXP)
+
+EXTERN_C
+ULONG
+WMIAPI
+EnumerateTraceGuids(
+ IN OUT PTRACE_GUID_PROPERTIES *GuidPropertiesArray,
+ IN ULONG PropertyArrayCount,
+ OUT PULONG GuidCount);
+
+EXTERN_C
+ULONG
+WMIAPI
+FlushTraceW(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCWSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+EXTERN_C
+ULONG
+WMIAPI
+FlushTraceA(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCSTR InstanceName OPTIONAL,
+ IN OUT PEVENT_TRACE_PROPERTIES Properties);
+
+#endif /* (WINVER >= _WIN32_WINNT_WINXP) */
+
+#if (WINVER >= _WIN32_WINNT_VISTA)
+
+EXTERN_C
+ULONG
+WMIAPI
+EnableTraceEx(
+ IN LPCGUID ProviderId,
+ IN LPCGUID SourceId OPTIONAL,
+ IN TRACEHANDLE TraceHandle,
+ IN ULONG IsEnabled,
+ IN UCHAR Level,
+ IN ULONGLONG MatchAnyKeyword,
+ IN ULONGLONG MatchAllKeyword,
+ IN ULONG EnableProperty,
+ IN PEVENT_FILTER_DESCRIPTOR EnableFilterDesc OPTIONAL);
+
+EXTERN_C
+ULONG
+WMIAPI
+EnumerateTraceGuidsEx(
+ IN TRACE_QUERY_INFO_CLASS TraceQueryInfoClass,
+ IN PVOID InBuffer OPTIONAL,
+ IN ULONG InBufferSize,
+ OUT PVOID OutBuffer OPTIONAL,
+ IN ULONG OutBufferSize,
+ OUT PULONG ReturnLength);
+
+#endif /* (WINVER >= _WIN32_WINNT_VISTA) */
+
+#if (WINVER >= _WIN32_WINNT_WIN7)
+
+EXTERN_C
+ULONG
+WMIAPI
+EnableTraceEx2(
+ IN TRACEHANDLE TraceHandle,
+ IN LPCGUID ProviderId,
+ IN ULONG ControlCode,
+ IN UCHAR Level,
+ IN ULONGLONG MatchAnyKeyword,
+ IN ULONGLONG MatchAllKeyword,
+ IN ULONG Timeout,
+ IN PENABLE_TRACE_PARAMETERS EnableParameters OPTIONAL);
+
+EXTERN_C
+ULONG
+WMIAPI
+TraceSetInformation(
+ IN TRACEHANDLE SessionHandle,
+ IN TRACE_INFO_CLASS InformationClass,
+ IN PVOID TraceInformation,
+ IN ULONG InformationLength);
+
+#endif /* (WINVER >= _WIN32_WINNT_WIN7) */
+
+#endif /* !defined(_WMIKM_) && !defined(_NTDDK_) && !defined(_NTIFS_) */
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
diff --git a/include/psdk/in6addr.h b/include/psdk/in6addr.h
index defe83e2eaa..45d82e4f5b0 100644
--- a/include/psdk/in6addr.h
+++ b/include/psdk/in6addr.h
@@ -1,12 +1,10 @@
#ifndef s6_addr
-typedef struct in6_addr
-{
- union
- {
- UCHAR Byte[16];
- USHORT Word[8];
- } u;
+typedef struct in6_addr {
+ union {
+ UCHAR Byte[16];
+ USHORT Word[8];
+ } u;
} IN6_ADDR, *PIN6_ADDR, FAR *LPIN6_ADDR;
#define in_addr6 in6_addr
diff --git a/include/psdk/inaddr.h b/include/psdk/inaddr.h
index 1eef217d1a0..85504b72965 100644
--- a/include/psdk/inaddr.h
+++ b/include/psdk/inaddr.h
@@ -1,13 +1,13 @@
+#pragma once
+
#ifndef s_addr
-typedef struct in_addr
-{
- union
- {
- struct {UCHAR s_b1,s_b2,s_b3,s_b4;} S_un_b;
- struct {USHORT s_w1,s_w2;} S_un_w;
- ULONG S_addr;
- } S_un;
+typedef struct in_addr {
+ union {
+ struct {UCHAR s_b1,s_b2,s_b3,s_b4;} S_un_b;
+ struct {USHORT s_w1,s_w2;} S_un_w;
+ ULONG S_addr;
+ } S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;
#define s_addr S_un.S_addr
@@ -17,5 +17,5 @@ typedef struct in_addr
#define s_impno S_un.S_un_b.s_b4
#define s_lh S_un.S_un_b.s_b3
-#endif
+#endif /* s_addr */
diff --git a/include/psdk/iptypes.h b/include/psdk/iptypes.h
index 12f564b7696..94d81263ad7 100644
--- a/include/psdk/iptypes.h
+++ b/include/psdk/iptypes.h
@@ -78,7 +78,7 @@ typedef struct _FIXED_INFO {
UINT EnableProxy;
UINT EnableDns;
} FIXED_INFO, *PFIXED_INFO;
-#ifdef _WINSOCK2_H
+#ifdef _WINSOCK2API_
typedef enum {
IpPrefixOriginOther = 0,
IpPrefixOriginManual,
diff --git a/include/ddk/kcom.h b/include/psdk/kcom.h
similarity index 57%
rename from include/ddk/kcom.h
rename to include/psdk/kcom.h
index f4f1c3cab38..046b4405d2d 100644
--- a/include/ddk/kcom.h
+++ b/include/psdk/kcom.h
@@ -18,10 +18,14 @@ DEFINE_GUIDSTRUCT("72CF721C-525A-11D1-9AA1-00A0C9223196", KoCreateObject);
#endif
#if !defined(__cplusplus) || _MSC_VER < 1100
+
#define STATIC_IID_IKoInitializeParentDeviceObject 0x21B36996, 0x8DE3, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
DEFINE_GUIDEX(IID_IKoInitializeParentDeviceObject);
+
#else
+
interface __declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitializeParentDeviceObject;
+
#endif
#ifndef COMDDKMETHOD
@@ -40,101 +44,84 @@ interface __declspec(uuid("21B36996-8DE3-11D1-8AE0-00A0C9223196")) IKoInitialize
typedef
NTSTATUS
-(*KoCreateObjectHandler)( IN REFCLSID ClassId,
- IN IUnknown* UnkOuter OPTIONAL,
- IN REFIID InterfaceId,
- OUT PVOID* Interface);
+(*KoCreateObjectHandler)(
+ IN REFCLSID ClassId,
+ IN IUnknown* UnkOuter OPTIONAL,
+ IN REFIID InterfaceId,
+ OUT PVOID* Interface);
#undef INTERFACE
#define INTERFACE INonDelegatedUnknown
-DECLARE_INTERFACE(INonDelegatedUnknown)
-{
- STDMETHOD(NonDelegatedQueryInterface)
- (
+DECLARE_INTERFACE(INonDelegatedUnknown) {
+ STDMETHOD(NonDelegatedQueryInterface)(
THIS_
IN REFIID InterfaceId,
OUT PVOID* Interface
) PURE;
- STDMETHOD_(ULONG,NonDelegatedAddRef)
- (
+ STDMETHOD_(ULONG,NonDelegatedAddRef)(
THIS
) PURE;
- STDMETHOD_(ULONG,NonDelegatedRelease)
- (
+ STDMETHOD_(ULONG,NonDelegatedRelease)(
THIS
) PURE;
};
#undef INTERFACE
#define INTERFACE IIndirectedUnknown
-DECLARE_INTERFACE(IIndirectedUnknown)
-{
- STDMETHOD(IndirectedQueryInterface)
- (
+DECLARE_INTERFACE(IIndirectedUnknown) {
+ STDMETHOD(IndirectedQueryInterface)(
THIS_
IN REFIID InterfaceId,
OUT PVOID* Interface
) PURE;
- STDMETHOD_(ULONG,IndirectedAddRef)
- (
+ STDMETHOD_(ULONG,IndirectedAddRef)(
THIS
) PURE;
- STDMETHOD_(ULONG,IndirectedRelease)
- (
+ STDMETHOD_(ULONG,IndirectedRelease)(
THIS
) PURE;
};
-
#undef INTERFACE
#define INTERFACE IKoInitializeParentDeviceObject
-DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown)
-{
- STDMETHOD(SetParentDeviceObject)
- (
+DECLARE_INTERFACE_(IKoInitializeParentDeviceObject, IUnknown) {
+ STDMETHOD(SetParentDeviceObject)(
THIS_
IN PDEVICE_OBJECT ParentDeviceObject
) PURE;
};
-
-
#if defined(__cplusplus)
-
-class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown
-{
- protected:
- LONG m_RefCount;
- private:
- BOOLEAN m_UsingClassId;
- CLSID m_ClassId;
- protected:
- IUnknown* m_UnknownOuter;
- public:
- COMDDKMETHOD CBaseUnknown (IN REFCLSID ClassId, IN IUnknown* UnknownOuter OPTIONAL = NULL);
- COMDDKMETHOD CBaseUnknown(IN IUnknown* UnknownOuter OPTIONAL = NULL);
- COMDDKMETHOD virtual ~CBaseUnknown();
- COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef();
- COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease();
- COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(IN REFIID InterfaceId,OUT PVOID* Interface);
- COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef();
- COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease();
- COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(IN REFIID InterfaceId, OUT PVOID* Interface);
+class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown {
+ protected:
+ LONG m_RefCount;
+ private:
+ BOOLEAN m_UsingClassId;
+ CLSID m_ClassId;
+ protected:
+ IUnknown* m_UnknownOuter;
+ public:
+ COMDDKMETHOD CBaseUnknown (IN REFCLSID ClassId, IN IUnknown* UnknownOuter OPTIONAL = NULL);
+ COMDDKMETHOD CBaseUnknown(IN IUnknown* UnknownOuter OPTIONAL = NULL);
+ COMDDKMETHOD virtual ~CBaseUnknown();
+ COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedAddRef();
+ COMDDKMETHOD STDMETHODIMP_(ULONG) NonDelegatedRelease();
+ COMDDKMETHOD STDMETHODIMP NonDelegatedQueryInterface(IN REFIID InterfaceId,OUT PVOID* Interface);
+ COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedAddRef();
+ COMDDKMETHOD STDMETHODIMP_(ULONG) IndirectedRelease();
+ COMDDKMETHOD STDMETHODIMP IndirectedQueryInterface(IN REFIID InterfaceId, OUT PVOID* Interface);
};
-
#if !defined(DEFINE_ABSTRACT_UNKNOWN)
-
#define DEFINE_ABSTRACT_UNKNOWN() \
STDMETHOD(QueryInterface)(THIS_ REFIID InterfaceId, PVOID* Interface) PURE; \
STDMETHOD_(ULONG,AddRef)(THIS) PURE; \
STDMETHOD_(ULONG,Release)(THIS) PURE;
-
#endif
#define DEFINE_STD_UNKNOWN() \
@@ -144,46 +131,49 @@ class CBaseUnknown : public INonDelegatedUnknown, public IIndirectedUnknown
STDMETHODIMP_(ULONG) Release();
#define IMPLEMENT_STD_UNKNOWN(Class) \
- STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) \
- { \
+ STDMETHODIMP Class::QueryInterface( REFIID InterfaceId, PVOID* Interface) { \
return m_UnknownOuter->QueryInterface(InterfaceId, Interface);\
} \
- STDMETHODIMP_(ULONG) Class::AddRef() \
- { \
+ STDMETHODIMP_(ULONG) Class::AddRef() { \
return m_UnknownOuter->AddRef(); \
} \
- STDMETHODIMP_(ULONG) Class::Release() \
- { \
+ STDMETHODIMP_(ULONG) Class::Release() { \
return m_UnknownOuter->Release(); \
}
+
#else
COMDDKAPI
void
NTAPI
-KoRelease( IN REFCLSID ClassId);
-#endif // !__cplusplus
+KoRelease(
+ IN REFCLSID ClassId);
+
+#endif /* !__cplusplus */
COMDDKAPI
NTSTATUS
NTAPI
-KoCreateInstance( IN REFCLSID ClassId,
- IN IUnknown* UnkOuter OPTIONAL,
- IN ULONG ClsContext,
- IN REFIID InterfaceId,
- OUT PVOID* Interface);
+KoCreateInstance(
+ IN REFCLSID ClassId,
+ IN IUnknown* UnkOuter OPTIONAL,
+ IN ULONG ClsContext,
+ IN REFIID InterfaceId,
+ OUT PVOID* Interface);
COMDDKAPI
NTSTATUS
NTAPI
-KoDeviceInitialize( IN PDEVICE_OBJECT DeviceObject);
+KoDeviceInitialize(
+ IN PDEVICE_OBJECT DeviceObject);
COMDDKAPI
NTSTATUS
NTAPI
-KoDriverInitialize( IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPathName,
- IN KoCreateObjectHandler CreateObjectHandler);
+KoDriverInitialize(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PUNICODE_STRING RegistryPathName,
+ IN KoCreateObjectHandler CreateObjectHandler);
#if defined(__cplusplus)
@@ -195,44 +185,36 @@ KoDriverInitialize( IN PDRIVER_OBJECT DriverObject,
#ifndef _NEW_DELETE_OPERATORS_
#define _NEW_DELETE_OPERATORS_
-inline PVOID operator new
-(
+inline PVOID operator new(
size_t iSize,
- POOL_TYPE poolType
-)
+ POOL_TYPE poolType)
{
PVOID result = ExAllocatePoolWithTag(poolType,iSize,'wNCK');
- if (result)
- {
+ if (result) {
RtlZeroMemory(result,iSize);
}
return result;
}
-inline PVOID operator new
-(
- size_t iSize,
- POOL_TYPE poolType,
- ULONG tag
-)
+inline PVOID operator new(
+ size_t iSize,
+ POOL_TYPE poolType,
+ ULONG tag)
{
PVOID result = ExAllocatePoolWithTag(poolType,iSize,tag);
- if (result)
- {
+ if (result) {
RtlZeroMemory(result,iSize);
}
return result;
}
-inline void __cdecl operator delete
-(
- PVOID pVoid
-)
+inline void __cdecl operator delete(
+ PVOID pVoid)
{
- ExFreePool(pVoid);
+ if (pVoid) ExFreePool(pVoid);
}
-#endif
+#endif /* _NEW_DELETE_OPERATORS_ */
#if defined(_SYS_GUID_OPERATOR_EQ_)
#define _GUID_OPERATORS_
@@ -242,18 +224,16 @@ inline void __cdecl operator delete
#ifndef _GUID_OPERATORS_
#define _GUID_OPERATORS_
-__inline BOOL operator==(const GUID& guidOne, const GUID& guidOther)
-{
+__inline BOOL operator==(const GUID& guidOne, const GUID& guidOther) {
return IsEqualGUIDAligned(guidOne,guidOther);
}
-__inline BOOL operator!=(const GUID& guidOne, const GUID& guidOther)
-{
+
+__inline BOOL operator!=(const GUID& guidOne, const GUID& guidOther) {
return !(guidOne == guidOther);
}
-#endif
+#endif /* _GUID_OPERATORS_ */
-#endif
-
-#endif
+#endif /* __cplusplus */
+#endif /* _KCOM_ */
diff --git a/include/psdk/ks.h b/include/psdk/ks.h
index 2290d7cf4e2..62357d623a1 100644
--- a/include/psdk/ks.h
+++ b/include/psdk/ks.h
@@ -166,77 +166,77 @@ DEFINE_GUIDSTRUCT("d833f8f8-7894-11d1-b069-00a0c9062802", KSMEMORY_TYPE_KERNEL_P
*/
#define STATIC_KSCATEGORY_BRIDGE \
- 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x085AFF00L, 0x62CE, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("085AFF00-62CE-11CF-A5D6-28DB04C10000", KSCATEGORY_BRIDGE);
#define KSCATEGORY_BRIDGE DEFINE_GUIDNAMED(KSCATEGORY_BRIDGE)
#define STATIC_KSCATEGORY_CAPTURE \
- 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("65E8773D-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_CAPTURE);
#define KSCATEGORY_CAPTURE DEFINE_GUIDNAMED(KSCATEGORY_CAPTURE)
#define STATIC_KSCATEGORY_RENDER \
- 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("65E8773E-8F56-11D0-A3B9-00A0C9223196", KSCATEGORY_RENDER);
#define KSCATEGORY_RENDER DEFINE_GUIDNAMED(KSCATEGORY_RENDER)
#define STATIC_KSCATEGORY_MIXER \
- 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0xAD809C00L, 0x7B88, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("AD809C00-7B88-11D0-A5D6-28DB04C10000", KSCATEGORY_MIXER);
#define KSCATEGORY_MIXER DEFINE_GUIDNAMED(KSCATEGORY_MIXER)
#define STATIC_KSCATEGORY_SPLITTER \
- 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x0A4252A0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("0A4252A0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_SPLITTER);
#define KSCATEGORY_SPLITTER DEFINE_GUIDNAMED(KSCATEGORY_SPLITTER)
#define STATIC_KSCATEGORY_DATACOMPRESSOR \
- 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x1E84C900L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("1E84C900-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATACOMPRESSOR);
#define KSCATEGORY_DATACOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATACOMPRESSOR)
#define STATIC_KSCATEGORY_DATADECOMPRESSOR \
- 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x2721AE20L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("2721AE20-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATADECOMPRESSOR);
#define KSCATEGORY_DATADECOMPRESSOR DEFINE_GUIDNAMED(KSCATEGORY_DATADECOMPRESSOR)
#define STATIC_KSCATEGORY_DATATRANSFORM \
- 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x2EB07EA0L, 0x7E70, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("2EB07EA0-7E70-11D0-A5D6-28DB04C10000", KSCATEGORY_DATATRANSFORM);
#define KSCATEGORY_DATATRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_DATATRANSFORM)
#define STATIC_KSCATEGORY_COMMUNICATIONSTRANSFORM \
- 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xCF1DDA2CL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("CF1DDA2C-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_COMMUNICATIONSTRANSFORM);
#define KSCATEGORY_COMMUNICATIONSTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_COMMUNICATIONSTRANSFORM)
#define STATIC_KSCATEGORY_INTERFACETRANSFORM \
- 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xCF1DDA2DL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("CF1DDA2D-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_INTERFACETRANSFORM);
#define KSCATEGORY_INTERFACETRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_INTERFACETRANSFORM)
#define STATIC_KSCATEGORY_MEDIUMTRANSFORM \
- 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xCF1DDA2EL, 0x9743, 0x11D0, {0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("CF1DDA2E-9743-11D0-A3EE-00A0C9223196", KSCATEGORY_MEDIUMTRANSFORM);
#define KSCATEGORY_MEDIUMTRANSFORM DEFINE_GUIDNAMED(KSCATEGORY_MEDIUMTRANSFORM)
#define STATIC_KSCATEGORY_FILESYSTEM \
- 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x760FED5EL, 0x9357, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("760FED5E-9357-11D0-A3CC-00A0C9223196", KSCATEGORY_FILESYSTEM);
#define KSCATEGORY_FILESYSTEM DEFINE_GUIDNAMED(KSCATEGORY_FILESYSTEM)
#define STATIC_KSCATEGORY_CLOCK \
- 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x53172480L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("53172480-4791-11D0-A5D6-28DB04C10000", KSCATEGORY_CLOCK);
#define KSCATEGORY_CLOCK DEFINE_GUIDNAMED(KSCATEGORY_CLOCK)
#define STATIC_KSCATEGORY_PROXY \
- 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x97EBAACAL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("97EBAACA-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_PROXY);
#define KSCATEGORY_PROXY DEFINE_GUIDNAMED(KSCATEGORY_PROXY)
#define STATIC_KSCATEGORY_QUALITY \
- 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x97EBAACBL, 0x95BD, 0x11D0, {0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("97EBAACB-95BD-11D0-A3EA-00A0C9223196", KSCATEGORY_QUALITY);
#define KSCATEGORY_QUALITY DEFINE_GUIDNAMED(KSCATEGORY_QUALITY)
@@ -308,7 +308,7 @@ typedef enum
} KSINTERFACE_STANDARD;
#define STATIC_KSINTERFACESETID_FileIo \
- 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x8C6F932CL, 0xE771, 0x11D0, {0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("8C6F932C-E771-11D0-B8FF-00A0C9223196", KSINTERFACESETID_FileIo);
#define KSINTERFACESETID_FileIo DEFINE_GUIDNAMED(KSINTERFACESETID_FileIo)
@@ -337,7 +337,7 @@ DEFINE_GUIDSTRUCT("4747B320-62CE-11CF-A5D6-28DB04C10000", KSMEDIUMSETID_Standard
*/
#define STATIC_KSPROPSETID_Clock \
- 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0xDF12A4C0L, 0xAC17, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("DF12A4C0-AC17-11CF-A5D6-28DB04C10000", KSPROPSETID_Clock);
#define KSPROPSETID_Clock DEFINE_GUIDNAMED(KSPROPSETID_Clock)
@@ -355,7 +355,7 @@ typedef enum
} KSPROPERTY_CLOCK;
#define STATIC_KSEVENTSETID_Clock \
- 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x364D8E20L, 0x62C7, 0x11CF, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("364D8E20-62C7-11CF-A5D6-28DB04C10000", KSEVENTSETID_Clock);
#define KSEVENTSETID_Clock DEFINE_GUIDNAMED(KSEVENTSETID_Clock)
@@ -491,7 +491,7 @@ typedef enum
*/
#define KSPROPSETID_GM \
- 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D
+ 0xAF627536L, 0xE719, 0x11D2, {0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D}
typedef enum
{
@@ -508,7 +508,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_MediaSeeking\
- 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0xEE904F0CL, 0xD09B, 0x11D0, {0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("EE904F0C-D09B-11D0-ABE9-00A0C9223196", KSPROPSETID_MediaSeeking);
#define KSPROPSETID_MediaSeeking DEFINE_GUIDNAMED(KSPROPSETID_MediaSeeking)
@@ -652,12 +652,12 @@ typedef struct {
*/
#define STATIC_KSPROPSETID_Pin\
- 0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00
+ 0x8C134960L, 0x51AD, 0x11CF, {0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("8C134960-51AD-11CF-878A-94F801C10000", KSPROPSETID_Pin);
#define KSPROPSETID_Pin DEFINE_GUIDNAMED(KSPROPSETID_Pin)
#define STATIC_KSNAME_Pin\
- 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x146F1A80L, 0x4791, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("146F1A80-4791-11D0-A5D6-28DB04C10000", KSNAME_Pin);
#define KSNAME_Pin DEFINE_GUIDNAMED(KSNAME_Pin)
@@ -725,7 +725,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_Stream\
- 0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0x65aaba60L, 0x98ae, 0x11cf, {0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
DEFINE_GUIDSTRUCT("65aaba60-98ae-11cf-a10d-0020afd156e4", KSPROPSETID_Stream);
#define KSPROPSETID_Stream DEFINE_GUIDNAMED(KSPROPSETID_Stream)
@@ -844,7 +844,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_StreamAllocator\
- 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 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)
@@ -855,7 +855,7 @@ typedef enum
} KSPROPERTY_STREAMALLOCATOR;
#define KSMETHODSETID_StreamAllocator \
- 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0xcf6e4341L, 0xec87, 0x11cf, {0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
typedef enum
{
@@ -893,7 +893,7 @@ typedef enum
*/
#define STATIC_KSPROPSETID_Topology\
- 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00
+ 0x720D4AC0L, 0x7533, 0x11D0, {0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("720D4AC0-7533-11D0-A5D6-28DB04C10000", KSPROPSETID_Topology);
#define KSPROPSETID_Topology DEFINE_GUIDNAMED(KSPROPSETID_Topology)
@@ -1243,7 +1243,7 @@ typedef PVOID KSDEVICE_HEADER,
*/
#define STATIC_KSDATAFORMAT_SPECIFIER_NONE\
- 0x0F6417D6L, 0xC318, 0x11D0, 0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96
+ 0x0F6417D6L, 0xC318, 0x11D0, {0xA4, 0x3F, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
DEFINE_GUIDSTRUCT("0F6417D6-C318-11D0-A43F-00A0C9223196", KSDATAFORMAT_SPECIFIER_NONE);
#define KSDATAFORMAT_SPECIFIER_NONE DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_NONE)
diff --git a/include/psdk/ksdebug.h b/include/psdk/ksdebug.h
new file mode 100644
index 00000000000..2e6553744b6
--- /dev/null
+++ b/include/psdk/ksdebug.h
@@ -0,0 +1,122 @@
+#include
+
+#if !defined(_KSDEBUG_)
+#define _KSDEBUG_
+
+#if !defined(REMIND)
+#define QUOTE(x) #x
+#define QQUOTE(y) QUOTE(y)
+#define REMIND(str) __FILE__ "(" QQUOTE(__LINE__) ") : " str
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#if (DBG)
+
+#if defined(IRPMJFUNCDESC)
+static const PCHAR IrpMjFuncDesc[] = {
+ "IRP_MJ_CREATE",
+ "IRP_MJ_CREATE_NAMED_PIPE",
+ "IRP_MJ_CLOSE",
+ "IRP_MJ_READ",
+ "IRP_MJ_WRITE",
+ "IRP_MJ_QUERY_INFORMATION",
+ "IRP_MJ_SET_INFORMATION",
+ "IRP_MJ_QUERY_EA",
+ "IRP_MJ_SET_EA",
+ "IRP_MJ_FLUSH_BUFFERS",
+ "IRP_MJ_QUERY_VOLUME_INFORMATION",
+ "IRP_MJ_SET_VOLUME_INFORMATION",
+ "IRP_MJ_DIRECTORY_CONTROL",
+ "IRP_MJ_FILE_SYSTEM_CONTROL",
+ "IRP_MJ_DEVICE_CONTROL",
+ "IRP_MJ_INTERNAL_DEVICE_CONTROL",
+ "IRP_MJ_SHUTDOWN",
+ "IRP_MJ_LOCK_CONTROL",
+ "IRP_MJ_CLEANUP",
+ "IRP_MJ_CREATE_MAILSLOT",
+ "IRP_MJ_QUERY_SECURITY",
+ "IRP_MJ_SET_SECURITY",
+ "IRP_MJ_SET_POWER",
+ "IRP_MJ_QUERY_POWER"
+};
+#endif /* defined(IRPMJFUNCDESC) */
+
+#endif /* DBG */
+
+#if defined(_NTDDK_)
+
+#define DEBUGLVL_BLAB TRACE_LEVEL_VERBOSE
+#define DEBUGLVL_VERBOSE TRACE_LEVEL_VERBOSE
+#define DEBUGLVL_TERSE TRACE_LEVEL_INFORMATION
+#define DEBUGLVL_ERROR TRACE_LEVEL_ERROR
+
+#define DEBUGLVL_WARNING TRACE_LEVEL_WARNING
+#define DEBUGLVL_INFO TRACE_LEVEL_INFORMATION
+
+#if (DBG)
+ #if !defined( DEBUG_LEVEL )
+ #if defined( DEBUG_VARIABLE )
+ #if defined( KSDEBUG_INIT )
+ ULONG DEBUG_VARIABLE = DEBUGLVL_TERSE;
+ #else
+ extern ULONG DEBUG_VARIABLE;
+ #endif
+ #else
+ #define DEBUG_VARIABLE DEBUGLVL_TERSE
+ #endif
+ #else
+ #if defined( DEBUG_VARIABLE )
+ #if defined( KSDEBUG_INIT )
+ ULONG DEBUG_VARIABLE = DEBUG_LEVEL;
+ #else
+ extern ULONG DEBUG_VARIABLE;
+ #endif
+ #else
+ #define DEBUG_VARIABLE DEBUG_LEVEL
+ #endif
+ #endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+ #define _DbgPrintFEx(component, lvl, strings) { \
+ if ((lvl) <= DEBUG_VARIABLE) { \
+ DbgPrintEx(component, lvl, STR_MODULENAME); \
+ DbgPrintEx(component, lvl, strings); \
+ DbgPrintEx(component, lvl, "\n"); \
+ if ((lvl) == DEBUGLVL_ERROR) { \
+ DbgBreakPoint(); \
+ } \
+ } \
+ }
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+ #define _DbgPrintF(lvl, strings) { \
+ if (((lvl)==DEBUG_VARIABLE) || (lvl < DEBUG_VARIABLE)) { \
+ DbgPrint(STR_MODULENAME); \
+ DbgPrint##strings; \
+ DbgPrint("\n"); \
+ if ((lvl) == DEBUGLVL_ERROR) { \
+ DbgBreakPoint(); \
+ } \
+ } \
+ }
+
+#else
+
+#define _DbgPrintF(lvl, strings)
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define _DbgPrintFEx(component, lvl, strings)
+#endif
+
+#endif /* DBG */
+
+#endif /* defined(_NTDDK_) */
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* _KSDEBUG_ */
diff --git a/include/psdk/ksmedia.h b/include/psdk/ksmedia.h
index a1b1c0c314e..32e5e3e5269 100644
--- a/include/psdk/ksmedia.h
+++ b/include/psdk/ksmedia.h
@@ -28,7 +28,7 @@ DEFINE_GUIDSTRUCT("FBF6F530-07B9-11D2-A71E-0000F8004788", KSCATEGORY_AUDIO_DEVIC
/* video */
#define STATIC_PINNAME_VIDEO_CAPTURE \
- 0xfb6c4281, 0x353, 0x11d1, 0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba
+ 0xfb6c4281, 0x353, 0x11d1, {0x90, 0x5f, 0x0, 0x0, 0xc0, 0xcc, 0x16, 0xba}
#define STATIC_PINNAME_CAPTURE STATIC_PINNAME_VIDEO_CAPTURE
DEFINE_GUIDSTRUCT("FB6C4281-0353-11d1-905F-0000C0CC16BA", PINNAME_VIDEO_CAPTURE);
#define PINNAME_VIDEO_CAPTURE DEFINE_GUIDNAMED(PINNAME_VIDEO_CAPTURE)
@@ -130,32 +130,32 @@ DEFINE_GUIDSTRUCT("9EA331FA-B91B-45F8-9285-BD2BC77AFCDE", KSCATEGORY_AUDIO_SPLIT
*/
#define STATIC_KSNODETYPE_ADC\
- 0x4D837FE0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x4D837FE0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("4D837FE0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_ADC);
#define KSNODETYPE_ADC DEFINE_GUIDNAMED(KSNODETYPE_ADC)
#define STATIC_KSNODETYPE_AGC\
- 0xE88C9BA0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xE88C9BA0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("E88C9BA0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_AGC);
#define KSNODETYPE_AGC DEFINE_GUIDNAMED(KSNODETYPE_AGC)
#define STATIC_KSNODETYPE_3D_EFFECTS\
- 0x55515860L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x55515860L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("55515860-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_3D_EFFECTS);
#define KSNODETYPE_3D_EFFECTS DEFINE_GUIDNAMED(KSNODETYPE_3D_EFFECTS)
#define STATIC_KSNODETYPE_SUPERMIX\
- 0xE573ADC0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xE573ADC0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("E573ADC0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUPERMIX);
#define KSNODETYPE_SUPERMIX DEFINE_GUIDNAMED(KSNODETYPE_SUPERMIX)
#define STATIC_KSNODETYPE_SRC\
- 0x9DB7B9E0L, 0xC555, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x9DB7B9E0L, 0xC555, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("9DB7B9E0-C555-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SRC);
#define KSNODETYPE_SRC DEFINE_GUIDNAMED(KSNODETYPE_SRC)
#define STATIC_KSNODETYPE_DAC\
- 0x507AE360L, 0xC554, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x507AE360L, 0xC554, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("507AE360-C554-11D0-8A2B-00A0C9255AC1", KSNODETYPE_DAC);
#define KSNODETYPE_DAC DEFINE_GUIDNAMED(KSNODETYPE_DAC)
@@ -175,12 +175,12 @@ DEFINE_GUIDSTRUCT("DFF220E3-F70F-11D0-B917-00A0C9223196", KSNODETYPE_CD_PLAYER);
#define KSNODETYPE_CD_PLAYER DEFINE_GUIDNAMED(KSNODETYPE_CD_PLAYER)
#define STATIC_KSNODETYPE_CHORUS\
- 0x20173F20L, 0xC559, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x20173F20L, 0xC559, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("20173F20-C559-11D0-8A2B-00A0C9255AC1", KSNODETYPE_CHORUS);
#define KSNODETYPE_CHORUS DEFINE_GUIDNAMED(KSNODETYPE_CHORUS)
#define STATIC_KSNODETYPE_REVERB\
- 0xEF0328E0L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xEF0328E0L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("EF0328E0-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_REVERB);
#define KSNODETYPE_REVERB DEFINE_GUIDNAMED(KSNODETYPE_REVERB)
@@ -201,127 +201,127 @@ DEFINE_GUIDSTRUCT("DFF21CE1-F70F-11D0-B917-00A0C9223196", KSNODETYPE_SPEAKER);
#define KSNODETYPE_SPEAKER DEFINE_GUIDNAMED(KSNODETYPE_SPEAKER)
#define STATIC_KSAUDFNAME_RECORDING_CONTROL\
- 0x185FEDFAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDFAL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDFA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_CONTROL);
#define KSAUDFNAME_RECORDING_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_CONTROL)
#define STATIC_KSNODETYPE_VOLUME\
- 0x3A5ACC00L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x3A5ACC00L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("3A5ACC00-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_VOLUME);
#define KSNODETYPE_VOLUME DEFINE_GUIDNAMED(KSNODETYPE_VOLUME)
#define STATIC_KSAUDFNAME_WAVE_VOLUME\
- 0x185FEDE5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE5L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_VOLUME);
#define KSAUDFNAME_WAVE_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_VOLUME)
#define STATIC_KSNODETYPE_MUTE\
- 0x02B223C0L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x02B223C0L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("02B223C0-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUTE);
#define KSNODETYPE_MUTE DEFINE_GUIDNAMED(KSNODETYPE_MUTE)
#define STATIC_KSAUDFNAME_WAVE_MUTE\
- 0x185FEDE6L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE6L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE6-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_WAVE_MUTE);
#define KSAUDFNAME_WAVE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_WAVE_MUTE)
#define STATIC_KSAUDFNAME_MIC_VOLUME\
- 0x185FEDEDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEDL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDED-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_VOLUME);
#define KSAUDFNAME_MIC_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_VOLUME)
#define STATIC_KSNODETYPE_SUM\
- 0xDA441A60L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xDA441A60L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("DA441A60-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_SUM);
#define KSNODETYPE_SUM DEFINE_GUIDNAMED(KSNODETYPE_SUM)
#define STATIC_KSAUDFNAME_MASTER_VOLUME\
- 0x185FEDE3L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE3L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE3-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_VOLUME);
#define KSAUDFNAME_MASTER_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_VOLUME)
#define STATIC_KSAUDFNAME_CD_VOLUME\
- 0x185FEDE9L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE9L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE9-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_VOLUME);
#define KSAUDFNAME_CD_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_CD_VOLUME)
#define STATIC_KSAUDFNAME_RECORDING_SOURCE\
- 0x185FEDEFL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEFL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEF-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_RECORDING_SOURCE);
#define KSAUDFNAME_RECORDING_SOURCE DEFINE_GUIDNAMED(KSAUDFNAME_RECORDING_SOURCE)
#define STATIC_KSAUDFNAME_LINE_IN_VOLUME\
- 0x185FEDF4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDF4L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDF4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_IN_VOLUME);
#define KSAUDFNAME_LINE_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_LINE_IN_VOLUME)
#define STATIC_KSAUDFNAME_AUX_VOLUME\
- 0x185FEDFCL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDFCL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDFC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_VOLUME);
#define KSAUDFNAME_AUX_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_AUX_VOLUME)
#define STATIC_KSAUDFNAME_MIC_IN_VOLUME\
- 0x185FEDF5L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDF5L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDF5-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_IN_VOLUME);
#define KSAUDFNAME_MIC_IN_VOLUME DEFINE_GUIDNAMED(KSAUDFNAME_MIC_IN_VOLUME)
#define STATIC_KSNODETYPE_LOUDNESS\
- 0x41887440L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x41887440L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("41887440-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_LOUDNESS);
#define KSNODETYPE_LOUDNESS DEFINE_GUIDNAMED(KSNODETYPE_LOUDNESS)
#define STATIC_KSAUDFNAME_MICROPHONE_BOOST\
- 0x2bc31d6aL, 0x96e3, 0x11d2, 0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68
+ 0x2bc31d6aL, 0x96e3, 0x11d2, {0xac, 0x4c, 0x0, 0xc0, 0x4f, 0x8e, 0xfb, 0x68}
DEFINE_GUIDSTRUCT("2BC31D6A-96E3-11d2-AC4C-00C04F8EFB68", KSAUDFNAME_MICROPHONE_BOOST);
#define KSAUDFNAME_MICROPHONE_BOOST DEFINE_GUIDNAMED(KSAUDFNAME_MICROPHONE_BOOST)
#define STATIC_KSAUDFNAME_CD_MUTE\
- 0x185FEDEAL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEAL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEA-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_CD_MUTE);
#define KSAUDFNAME_CD_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_CD_MUTE)
#define STATIC_KSAUDFNAME_LINE_MUTE\
- 0x185FEDECL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDECL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEC-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_LINE_MUTE);
#define KSAUDFNAME_LINE_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_LINE_MUTE)
#define STATIC_KSAUDFNAME_MIC_MUTE\
- 0x185FEDEEL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDEEL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDEE-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MIC_MUTE);
#define KSAUDFNAME_MIC_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MIC_MUTE)
#define STATIC_KSAUDFNAME_AUX_MUTE\
- 0x185FEDFDL, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDFDL, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDFD-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_AUX_MUTE);
#define KSAUDFNAME_AUX_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_AUX_MUTE)
#define STATIC_KSAUDFNAME_VOLUME_CONTROL\
- 0x185FEDF7L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDF7L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDF7-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_VOLUME_CONTROL);
#define KSAUDFNAME_VOLUME_CONTROL DEFINE_GUIDNAMED(KSAUDFNAME_VOLUME_CONTROL)
#define STATIC_KSNODETYPE_MUX\
- 0x2CEAF780L, 0xC556, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x2CEAF780L, 0xC556, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("2CEAF780-C556-11D0-8A2B-00A0C9255AC1", KSNODETYPE_MUX);
#define KSNODETYPE_MUX DEFINE_GUIDNAMED(KSNODETYPE_MUX)
#define STATIC_KSAUDFNAME_MASTER_MUTE\
- 0x185FEDE4L, 0x9905, 0x11D1, 0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0x185FEDE4L, 0x9905, 0x11D1, {0x95, 0xA9, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("185FEDE4-9905-11D1-95A9-00C04FB925D3", KSAUDFNAME_MASTER_MUTE);
#define KSAUDFNAME_MASTER_MUTE DEFINE_GUIDNAMED(KSAUDFNAME_MASTER_MUTE)
#define STATIC_KSNODETYPE_PEAKMETER\
- 0xa085651eL, 0x5f0d, 0x4b36, 0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e
+ 0xa085651eL, 0x5f0d, 0x4b36, {0xa8, 0x69, 0xd1, 0x95, 0xd6, 0xab, 0x4b, 0x9e}
DEFINE_GUIDSTRUCT("A085651E-5F0D-4b36-A869-D195D6AB4B9E", KSNODETYPE_PEAKMETER);
#define KSNODETYPE_PEAKMETER DEFINE_GUIDNAMED(KSNODETYPE_PEAKMETER)
#define STATIC_KSNODETYPE_STEREO_WIDE\
- 0xA9E69800L, 0xC558, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0xA9E69800L, 0xC558, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("A9E69800-C558-11D0-8A2B-00A0C9255AC1", KSNODETYPE_STEREO_WIDE);
#define KSNODETYPE_STEREO_WIDE DEFINE_GUIDNAMED(KSNODETYPE_STEREO_WIDE)
#define STATIC_KSNODETYPE_TONE\
- 0x7607E580L, 0xC557, 0x11D0, 0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1
+ 0x7607E580L, 0xC557, 0x11D0, {0x8A, 0x2B, 0x00, 0xA0, 0xC9, 0x25, 0x5A, 0xC1}
DEFINE_GUIDSTRUCT("7607E580-C557-11D0-8A2B-00A0C9255AC1", KSNODETYPE_TONE);
#define KSNODETYPE_TONE DEFINE_GUIDNAMED(KSNODETYPE_TONE)
@@ -375,11 +375,11 @@ typedef struct {
} KSDATARANGE_AUDIO, *PKSDATARANGE_AUDIO;
#if !defined( DEFINE_WAVEFORMATEX_GUID )
-#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+#define DEFINE_WAVEFORMATEX_GUID(x) (USHORT)(x), 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
#endif
#define STATIC_KSDATAFORMAT_SUBTYPE_WAVEFORMATEX\
- 0x00000000L, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71
+ 0x00000000L, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}
DEFINE_GUIDSTRUCT("00000000-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_WAVEFORMATEX);
#define KSDATAFORMAT_SUBTYPE_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_WAVEFORMATEX)
@@ -403,12 +403,12 @@ DEFINE_GUIDSTRUCT("73647561-0000-0010-8000-00aa00389b71", KSDATAFORMAT_TYPE_AUDI
#define KSDATAFORMAT_TYPE_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_TYPE_AUDIO)
#define STATIC_KSDATAFORMAT_SPECIFIER_DSOUND\
- 0x518590a2L, 0xa184, 0x11d0, 0x85, 0x22, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3
+ 0x518590a2L, 0xa184, 0x11d0, {0x85, 0x22, 0x00, 0xc0, 0x4f, 0xd9, 0xba, 0xf3}
DEFINE_GUIDSTRUCT("518590a2-a184-11d0-8522-00c04fd9baf3", KSDATAFORMAT_SPECIFIER_DSOUND);
#define KSDATAFORMAT_SPECIFIER_DSOUND DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_DSOUND)
#define STATIC_KSDATAFORMAT_SUBTYPE_ANALOG\
- 0x6dba3190L, 0x67bd, 0x11cf, 0xa0, 0xf7, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4
+ 0x6dba3190L, 0x67bd, 0x11cf, {0xa0, 0xf7, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4}
DEFINE_GUIDSTRUCT("6dba3190-67bd-11cf-a0f7-0020afd156e4", KSDATAFORMAT_SUBTYPE_ANALOG);
#define KSDATAFORMAT_SUBTYPE_ANALOG DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_ANALOG)
@@ -446,22 +446,22 @@ DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_I
#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
+ 0x05589f81L, 0xc356, 0x11ce, {0xbf, 0x01, 0x00, 0xaa, 0x00, 0x55, 0x59, 0x5a}
DEFINE_GUIDSTRUCT("05589f81-c356-11ce-bf01-00aa0055595a", KSDATAFORMAT_SPECIFIER_WAVEFORMATEX);
#define KSDATAFORMAT_SPECIFIER_WAVEFORMATEX DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
#define STATIC_KSDATAFORMAT_SUBTYPE_AC3_AUDIO\
- 0xe06d802cL, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea
+ 0xe06d802cL, 0xdb46, 0x11cf, {0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea}
DEFINE_GUIDSTRUCT("e06d802c-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SUBTYPE_AC3_AUDIO);
#define KSDATAFORMAT_SUBTYPE_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_AC3_AUDIO)
#define STATIC_KSDATAFORMAT_SPECIFIER_AC3_AUDIO\
- 0xe06d80e4L, 0xdb46, 0x11cf, 0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea
+ 0xe06d80e4L, 0xdb46, 0x11cf, {0xb4, 0xd1, 0x00, 0x80, 0x5f, 0x6c, 0xbb, 0xea}
DEFINE_GUIDSTRUCT("e06d80e4-db46-11cf-b4d1-00805f6cbbea", KSDATAFORMAT_SPECIFIER_AC3_AUDIO);
#define KSDATAFORMAT_SPECIFIER_AC3_AUDIO DEFINE_GUIDNAMED(KSDATAFORMAT_SPECIFIER_AC3_AUDIO)
#define STATIC_KSPROPSETID_AC3\
- 0xBFABE720L, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00
+ 0xBFABE720L, 0x6E1F, 0x11D0, {0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}
DEFINE_GUIDSTRUCT("BFABE720-6E1F-11D0-BCF2-444553540000", KSPROPSETID_AC3);
#define KSPROPSETID_AC3 DEFINE_GUIDNAMED(KSPROPSETID_AC3)
@@ -532,7 +532,7 @@ typedef enum {
} KSPROPERTY_AUDIO;
#define STATIC_KSEVENTSETID_AudioControlChange\
- 0xE85E9698L, 0xFA2F, 0x11D1, 0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3
+ 0xE85E9698L, 0xFA2F, 0x11D1, {0x95, 0xBD, 0x00, 0xC0, 0x4F, 0xB9, 0x25, 0xD3}
DEFINE_GUIDSTRUCT("E85E9698-FA2F-11D1-95BD-00C04FB925D3", KSEVENTSETID_AudioControlChange);
#define KSEVENTSETID_AudioControlChange DEFINE_GUIDNAMED(KSEVENTSETID_AudioControlChange)
@@ -542,7 +542,7 @@ typedef enum {
#define STATIC_KSEVENTSETID_LoopedStreaming\
- 0x4682B940L, 0xC6EF, 0x11D0, 0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D
+ 0x4682B940L, 0xC6EF, 0x11D0, {0x96, 0xD8, 0x00, 0xAA, 0x00, 0x51, 0xE5, 0x1D}
DEFINE_GUIDSTRUCT("4682B940-C6EF-11D0-96D8-00AA0051E51D", KSEVENTSETID_LoopedStreaming);
#define KSEVENTSETID_LoopedStreaming DEFINE_GUIDNAMED(KSEVENTSETID_LoopedStreaming)
@@ -551,7 +551,7 @@ typedef enum {
} KSEVENT_LOOPEDSTREAMING;
#define STATIC_KSEVENTSETID_Connection\
- 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00
+ 0x7f4bcbe0L, 0x9ea5, 0x11cf, {0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00}
DEFINE_GUIDSTRUCT("7f4bcbe0-9ea5-11cf-a5d6-28db04c10000", KSEVENTSETID_Connection);
#define KSEVENTSETID_Connection DEFINE_GUIDNAMED(KSEVENTSETID_Connection)
diff --git a/include/psdk/ksuuids.h b/include/psdk/ksuuids.h
new file mode 100644
index 00000000000..3eb0dd8fd02
--- /dev/null
+++ b/include/psdk/ksuuids.h
@@ -0,0 +1,74 @@
+
+OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PACK, 0x36523B13, 0x8EE5, 0x11D1, 0x8C, 0xA3, 0x00, 0x60, 0xB0, 0x57, 0x66, 0x4A)
+OUR_GUID_ENTRY(MEDIATYPE_MPEG2_PES, 0xE06D8020, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_WMDRM_TRANSPORT, 0x18BEC4EA, 0x4676, 0x450e, 0xB4, 0x78, 0x0C, 0xD8, 0x4C, 0x54, 0xB3, 0x27)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_VIDEO, 0xE06D8026, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(FORMAT_MPEG2_VIDEO, 0xE06D80E3, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x5F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(FORMAT_VIDEOINFO2, 0xF72A76A0, 0xEB0A, 0x11D0, 0xAC, 0xE4, 0x0, 0x0, 0xC0, 0xcc, 0x16, 0xBA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_PROGRAM, 0xE06D8022, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT, 0xE06D8023, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_AUDIO, 0xE06D802B, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DOLBY_AC3, 0xE06D802C, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_SUBPICTURE, 0xE06D802D, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_LPCM_AUDIO, 0xE06D8032, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIATYPE_DVD_ENCRYPTED_PACK, 0xED0B916A, 0x044D, 0x11D1, 0xAA, 0x78, 0x00, 0xc0, 0x04F, 0xC3, 0x1D, 0x60)
+OUR_GUID_ENTRY(MEDIATYPE_DVD_NAVIGATION, 0xE06D802E, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PCI, 0xE06D802F, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_DSI, 0xE06D8030, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DVD_NAVIGATION_PROVIDER, 0xE06D8031, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(FORMAT_MPEG2Video, 0xE06D80E3, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(FORMAT_DolbyAC3, 0xE06D80E4, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(FORMAT_MPEG2Audio, 0xE06D80E5, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(FORMAT_DVD_LPCMAudio, 0xE06D80E6, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(AM_KSPROPSETID_AC3, 0xBFABE720, 0x6E1F, 0x11D0, 0xBC, 0xF2, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00)
+OUR_GUID_ENTRY(AM_KSPROPSETID_DvdSubPic, 0xAC390460, 0x43AF, 0x11D0, 0xBD, 0x6A, 0x00, 0x35, 0x05, 0xC1, 0x03, 0xA9)
+OUR_GUID_ENTRY(AM_KSPROPSETID_CopyProt, 0x0E8A0A40, 0x6AEF, 0x11D0, 0x9E, 0xD0, 0x00, 0xA0, 0x24, 0xCA, 0x19, 0xB3)
+OUR_GUID_ENTRY(AM_KSPROPSETID_TSRateChange, 0xA503C5C0, 0x1D1D, 0x11D1, 0xAD, 0x80, 0x44, 0x45, 0x53, 0x54, 0x0, 0x0)
+OUR_GUID_ENTRY(AM_KSPROPSETID_MPEG4_MediaType_Attributes, 0xff6c4bfa, 0x7a9, 0x4c7b, 0xa2, 0x37, 0x67, 0x2f, 0x9d, 0x68, 0x6, 0x5f)
+OUR_GUID_ENTRY(AM_KSCATEGORY_CAPTURE, 0x65E8773D, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(AM_KSCATEGORY_RENDER, 0x65E8773E, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(AM_KSCATEGORY_DATACOMPRESSOR, 0x1E84C900, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
+OUR_GUID_ENTRY(AM_KSCATEGORY_AUDIO, 0x6994AD04, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(AM_KSCATEGORY_VIDEO, 0x6994AD05, 0x93EF, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(AM_KSCATEGORY_TVTUNER, 0xA799A800, 0xA46D, 0x11D0, 0xA1, 0x8C, 0x00, 0xa0, 0x24, 0x01, 0xDC, 0xD4)
+OUR_GUID_ENTRY(AM_KSCATEGORY_CROSSBAR, 0xA799A801, 0xA46D, 0x11D0, 0xA1, 0x8C, 0x00, 0xa0, 0x24, 0x01, 0xDC, 0xD4)
+OUR_GUID_ENTRY(AM_KSCATEGORY_TVAUDIO, 0xA799A802, 0xA46D, 0x11D0, 0xA1, 0x8C, 0x00, 0xa0, 0x24, 0x01, 0xDC, 0xD4)
+OUR_GUID_ENTRY(AM_KSCATEGORY_VBICODEC, 0x07DAD660, 0x22F1, 0x11D1, 0xa9, 0xF4, 0x00, 0xc0, 0x4F, 0xBB, 0xDE, 0x8F)
+OUR_GUID_ENTRY(AM_KSCATEGORY_SPLITTER, 0x0A4252A0, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
+OUR_GUID_ENTRY(IID_IKsInterfACeHandler, 0xD3ABC7E0, 0x9A61, 0x11D0, 0xA4, 0x0D, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(IID_IKsDataTypeHandler, 0x5FFBAA02, 0x49A3, 0x11D0, 0x9F, 0x36, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xA1)
+OUR_GUID_ENTRY(IID_IKsPin, 0xB61178D1, 0xA2D9, 0x11CF, 0x9E, 0x53, 0x00, 0xAA, 0x00, 0xA2, 0x16, 0xa1)
+OUR_GUID_ENTRY(IID_IKsControl, 0x28F54685, 0x06FD, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(IID_IKsPinFACtory, 0xCD5EBE6B, 0x8B6E, 0x11D1, 0x8A, 0xE0, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96)
+OUR_GUID_ENTRY(AM_INTERFACESETID_Standard, 0x1A8766A0, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00)
+
+#if ( (NTDDI_VERSION >= NTDDI_WINXPSP2) && (NTDDI_VERSION < NTDDI_WS03) ) || (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+OUR_GUID_ENTRY(MEDIATYPE_MPEG2_SECTIONS, 0x455F176C, 0x4B06, 0x47CE, 0x9A, 0xEF, 0x8c, 0xAE, 0xF7, 0x3D, 0xF7, 0xB5)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_VERSIONED_TABLES, 0x1ed988b0, 0x3ffc, 0x4523, 0x87, 0x25, 0x34, 0x7b, 0xee, 0xc1, 0xa8, 0xa0)
+OUR_GUID_ENTRY(MEDIASUBTYPE_ATSC_SI, 0xB3C7397C, 0xD303, 0x414D, 0xB3, 0x3C, 0x4E, 0xD2, 0xC9, 0xD2, 0x97, 0x33)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DVB_SI, 0xE9dD31A3, 0x221D, 0x4ADB, 0x85, 0x32, 0x9A, 0xF3, 0x9, 0xC1, 0xA4, 0x8)
+OUR_GUID_ENTRY(MEDIASUBTYPE_ISDB_SI, 0xe89ad298, 0x3601, 0x4b06, 0xaa, 0xec, 0x9d, 0xde, 0xed, 0xcc, 0x5b, 0xd0)
+OUR_GUID_ENTRY(MEDIASUBTYPE_TIF_SI, 0xec232eb2, 0xcb96, 0x4191, 0xb2, 0x26, 0xe, 0xa1, 0x29, 0xf3, 0x82, 0x50)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2DATA, 0xC892E55B, 0x252D, 0x42B5, 0xA3, 0x16, 0xD9, 0x97, 0xE7, 0xA5, 0xD9, 0x95)
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_TRANSPORT_STRIDE, 0x138AA9A4, 0x1EE2, 0x4C5B, 0x98, 0x8E, 0x19, 0xAB, 0xFD, 0xBC, 0x8A, 0x11)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_UDCR_TRANSPORT, 0x18BEC4EA, 0x4676, 0x450e, 0xB4, 0x78, 0x0C, 0xD8, 0x4C, 0x54, 0xB3, 0x27)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_PBDA_TRANSPORT_RAW, 0x0d7aed42, 0xcb9a, 0x11db, 0x97, 0x5, 0x0, 0x50, 0x56, 0xc0, 0x0, 0x8)
+OUR_GUID_ENTRY(MEDIASUBTYPE_MPEG2_PBDA_TRANSPORT_PROCESSED, 0xaf748dd4, 0xd80, 0x11db, 0x97, 0x5, 0x0, 0x50, 0x56, 0xc0, 0x0, 0x8)
+OUR_GUID_ENTRY(MEDIASUBTYPE_DTS, 0xE06D8033, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(MEDIASUBTYPE_SDDS, 0xE06D8034, 0xDB46, 0x11CF, 0xB4, 0xD1, 0x00, 0x80, 0x05F, 0x6C, 0xBB, 0xEA)
+OUR_GUID_ENTRY(AM_KSPROPSETID_DVD_RateChange, 0x3577EB09, 0x9582, 0x477F, 0xB2, 0x9C, 0xB0, 0xC4, 0x52, 0xA4, 0xFF, 0x9A)
+OUR_GUID_ENTRY(AM_KSPROPSETID_DvdKaraoke, 0xAE4720AE, 0xAA71, 0x42D8, 0xB8, 0x2A, 0xFF, 0xFD, 0xF5, 0x8B, 0x76, 0xFD)
+OUR_GUID_ENTRY(AM_KSPROPSETID_FrameStep, 0xC830ACBD, 0xAB07, 0x492F, 0x88, 0x52, 0x45, 0xB6, 0x98, 0x7C, 0x29, 0x79)
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+OUR_GUID_ENTRY(AM_KSCATEGORY_VBICODEC_MI, 0x9c24a977, 0x951, 0x451a, 0x80, 0x6, 0xe, 0x49, 0xbd, 0x28, 0xcd, 0x5f)
+#endif
+
diff --git a/include/ddk/lmon.h b/include/psdk/lmon.h
similarity index 64%
rename from include/ddk/lmon.h
rename to include/psdk/lmon.h
index 8ab2fe67148..81902c206f4 100644
--- a/include/ddk/lmon.h
+++ b/include/psdk/lmon.h
@@ -1,5 +1,4 @@
-
#ifdef UNICODE
#define PORT_INFO_FF PORT_INFO_FFW
#define PPORT_INFO_FF PPORT_INFO_FFW
@@ -10,18 +9,14 @@
#define LPPORT_INFO_FF LPPORT_INFO_FFA
#endif
-typedef struct _PORT_INFO_FFW
-{
- LPWSTR pName;
- DWORD cbMonitorData;
- LPBYTE pMonitorData;
+typedef struct _PORT_INFO_FFW {
+ LPWSTR pName;
+ DWORD cbMonitorData;
+ LPBYTE pMonitorData;
} PORT_INFO_FFW, *PPORT_INFO_FFW, *LPPORT_INFO_FFW;
-typedef struct _PORT_INFO_FFA
-{
- LPSTR pName;
- DWORD cbMonitorData;
- LPBYTE pMonitorData;
+typedef struct _PORT_INFO_FFA {
+ LPSTR pName;
+ DWORD cbMonitorData;
+ LPBYTE pMonitorData;
} PORT_INFO_FFA, *PPORT_INFO_FFA, *LPPORT_INFO_FFA;
-
-
diff --git a/include/psdk/mstcpip.h b/include/psdk/mstcpip.h
new file mode 100644
index 00000000000..2d25e70f506
--- /dev/null
+++ b/include/psdk/mstcpip.h
@@ -0,0 +1,1525 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef ASSERT
+#define MSTCPIP_ASSERT_UNDEFINED
+#define ASSERT(exp) ((VOID) 0)
+#endif
+
+#ifdef _MSC_VER
+#define MSTCPIP_INLINE __inline
+#else
+#define MSTCPIP_INLINE extern inline
+#endif
+
+/* FIXME :
+#include
+*/
+
+struct tcp_keepalive {
+ ULONG onoff;
+ ULONG keepalivetime;
+ ULONG keepaliveinterval;
+};
+
+#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
+#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)
+#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)
+#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)
+#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)
+#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)
+#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7)
+#define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)
+#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)
+#define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10)
+#define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)
+#define SIO_RCVALL_MCAST_IF _WSAIOW(IOC_VENDOR,13)
+#define SIO_RCVALL_IF _WSAIOW(IOC_VENDOR,14)
+
+typedef enum {
+ RCVALL_OFF = 0,
+ RCVALL_ON = 1,
+ RCVALL_SOCKETLEVELONLY = 2,
+ RCVALL_IPLEVEL = 3,
+} RCVALL_VALUE, *PRCVALL_VALUE;
+
+#define RCVALL_MAX RCVALL_IPLEVEL
+
+typedef struct {
+ RCVALL_VALUE Mode;
+ ULONG Interface;
+} RCVALL_IF, *PRCVALL_IF;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+DEFINE_GUID(SOCKET_DEFAULT2_QM_POLICY, 0xaec2ef9c, 0x3a4d, 0x4d3e, 0x88, 0x42, 0x23, 0x99, 0x42, 0xe3, 0x9a, 0x47);
+#endif
+
+#define SIO_ACQUIRE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 100)
+#define SIO_RELEASE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 101)
+#define SIO_ASSOCIATE_PORT_RESERVATION _WSAIOW(IOC_VENDOR, 102)
+
+typedef struct _INET_PORT_RANGE {
+ USHORT StartPort;
+ USHORT NumberOfPorts;
+} INET_PORT_RANGE, *PINET_PORT_RANGE;
+typedef struct _INET_PORT_RANGE INET_PORT_RESERVATION, *PINET_PORT_RESERVATION;
+
+typedef struct {
+ ULONG64 Token;
+} INET_PORT_RESERVATION_TOKEN, *PINET_PORT_RESERVATION_TOKEN;
+
+#define INVALID_PORT_RESERVATION_TOKEN ((ULONG64)0)
+
+typedef struct {
+#ifdef __cplusplus
+ INET_PORT_RESERVATION Reservation;
+ INET_PORT_RESERVATION_TOKEN Token;
+#else
+ INET_PORT_RESERVATION;
+ INET_PORT_RESERVATION_TOKEN;
+#endif
+} INET_PORT_RESERVATION_INSTANCE, *PINET_PORT_RESERVATION_INSTANCE;
+
+typedef struct {
+ ULONG AssignmentCount;
+ ULONG OwningPid;
+} INET_PORT_RESERVATION_INFORMATION, *PINET_PORT_RESERVATION_INFORMATION;
+
+#ifdef _WS2DEF_
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+#define _SECURE_SOCKET_TYPES_DEFINED_
+
+#define SIO_SET_SECURITY _WSAIOW(IOC_VENDOR, 200)
+#define SIO_QUERY_SECURITY _WSAIORW(IOC_VENDOR, 201)
+#define SIO_SET_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 202)
+#define SIO_DELETE_PEER_TARGET_NAME _WSAIOW(IOC_VENDOR, 203)
+
+#define SIO_SOCKET_USAGE_NOTIFICATION _WSAIOW(IOC_VENDOR, 204)
+
+typedef enum _SOCKET_USAGE_TYPE {
+ SYSTEM_CRITICAL_SOCKET = 1
+}SOCKET_USAGE_TYPE;
+
+typedef enum _SOCKET_SECURITY_PROTOCOL {
+ SOCKET_SECURITY_PROTOCOL_DEFAULT,
+ SOCKET_SECURITY_PROTOCOL_IPSEC,
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+ SOCKET_SECURITY_PROTOCOL_IPSEC2,
+#endif
+ SOCKET_SECURITY_PROTOCOL_INVALID
+} SOCKET_SECURITY_PROTOCOL;
+
+#define SOCKET_SETTINGS_GUARANTEE_ENCRYPTION 0x1
+#define SOCKET_SETTINGS_ALLOW_INSECURE 0x2
+
+typedef struct _SOCKET_SECURITY_SETTINGS {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ ULONG SecurityFlags;
+} SOCKET_SECURITY_SETTINGS;
+
+#define SOCKET_SETTINGS_IPSEC_SKIP_FILTER_INSTANTIATION 0x1
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+#define SOCKET_SETTINGS_IPSEC_OPTIONAL_PEER_NAME_VERIFICATION 0x2
+#define SOCKET_SETTINGS_IPSEC_ALLOW_FIRST_INBOUND_PKT_UNENCRYPTED 0x4
+#define SOCKET_SETTINGS_IPSEC_PEER_NAME_IS_RAW_FORMAT 0x8
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+typedef struct _SOCKET_SECURITY_SETTINGS_IPSEC {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ ULONG SecurityFlags;
+ ULONG IpsecFlags;
+ GUID AuthipMMPolicyKey;
+ GUID AuthipQMPolicyKey;
+ GUID Reserved;
+ UINT64 Reserved2;
+ ULONG UserNameStringLen;
+ ULONG DomainNameStringLen;
+ ULONG PasswordStringLen;
+ wchar_t AllStrings[0];
+} SOCKET_SECURITY_SETTINGS_IPSEC;
+
+typedef struct _SOCKET_PEER_TARGET_NAME {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ SOCKADDR_STORAGE PeerAddress;
+ ULONG PeerTargetNameStringLen;
+ wchar_t AllStrings[0];
+} SOCKET_PEER_TARGET_NAME;
+
+typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ SOCKADDR_STORAGE PeerAddress;
+ ULONG PeerTokenAccessMask;
+} SOCKET_SECURITY_QUERY_TEMPLATE;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+#define SOCKET_QUERY_IPSEC2_ABORT_CONNECTION_ON_FIELD_CHANGE 0x1
+
+#define SOCKET_QUERY_IPSEC2_FIELD_MASK_MM_SA_ID 0x1
+#define SOCKET_QUERY_IPSEC2_FIELD_MASK_QM_SA_ID 0x2
+
+typedef struct _SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2 {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ SOCKADDR_STORAGE PeerAddress;
+ ULONG PeerTokenAccessMask;
+ ULONG Flags;
+ ULONG FieldMask;
+} SOCKET_SECURITY_QUERY_TEMPLATE_IPSEC2;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#define SOCKET_INFO_CONNECTION_SECURED 0x1
+#define SOCKET_INFO_CONNECTION_ENCRYPTED 0x2
+#define SOCKET_INFO_CONNECTION_IMPERSONATED 0x4
+
+typedef struct _SOCKET_SECURITY_QUERY_INFO {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ ULONG Flags;
+ UINT64 PeerApplicationAccessTokenHandle;
+ UINT64 PeerMachineAccessTokenHandle;
+} SOCKET_SECURITY_QUERY_INFO;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+typedef struct _SOCKET_SECURITY_QUERY_INFO_IPSEC2 {
+ SOCKET_SECURITY_PROTOCOL SecurityProtocol;
+ ULONG Flags;
+ UINT64 PeerApplicationAccessTokenHandle;
+ UINT64 PeerMachineAccessTokenHandle;
+ UINT64 MmSaId;
+ UINT64 QmSaId;
+ UINT32 NegotiationWinerr;
+ GUID SaLookupContext;
+} SOCKET_SECURITY_QUERY_INFO_IPSEC2;
+#endif
+
+#define SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE _WSAIOR(IOC_VENDOR, 205)
+#define SIO_QUERY_RSS_SCALABILITY_INFO _WSAIOR(IOC_VENDOR, 210)
+
+typedef struct _RSS_SCALABILITY_INFO {
+ BOOLEAN RssEnabled;
+} RSS_SCALABILITY_INFO, *PRSS_SCALABILITY_INFO;
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#define IN4_CLASSA(i) (((LONG)(i) & 0x00000080) == 0)
+#define IN4_CLASSB(i) (((LONG)(i) & 0x000000c0) == 0x00000080)
+#define IN4_CLASSC(i) (((LONG)(i) & 0x000000e0) == 0x000000c0)
+#define IN4_CLASSD(i) (((LONG)(i) & 0x000000f0) == 0x000000e0)
+#define IN4_MULTICAST(i) IN4_CLASSD(i)
+
+#define IN4ADDR_ANY INADDR_ANY
+#define IN4ADDR_LOOPBACK 0x0100007f
+#define IN4ADDR_BROADCAST INADDR_BROADCAST
+#define IN4ADDR_NONE INADDR_NONE
+#define IN4ADDR_ANY_INIT { 0 }
+#define IN4ADDR_LOOPBACK_INIT { 0x7f, 0, 0, 1 }
+#define IN4ADDR_BROADCAST_INIT { 0xff, 0xff, 0xff, 0xff }
+#define IN4ADDR_ALLNODESONLINK_INIT { 0xe0, 0, 0, 1 }
+#define IN4ADDR_ALLROUTERSONLINK_INIT { 0xe0, 0, 0, 2 }
+#define IN4ADDR_ALLIGMPV3ROUTERSONLINK_INIT { 0xe0, 0, 0, 0x16 }
+#define IN4ADDR_ALLTEREDONODESONLINK_INIT { 0xe0, 0, 0, 0xfd }
+#define IN4ADDR_LINKLOCALPREFIX_INIT { 0xa9, 0xfe, }
+#define IN4ADDR_MULTICASTPREFIX_INIT { 0xe0, }
+
+#define IN4ADDR_LOOPBACKPREFIX_LENGTH 8
+#define IN4ADDR_LINKLOCALPREFIX_LENGTH 16
+#define IN4ADDR_MULTICASTPREFIX_LENGTH 4
+
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP1)
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_ADDR_EQUAL(
+ IN CONST IN_ADDR *a,
+ IN CONST IN_ADDR *b)
+{
+ return (BOOLEAN)(a->s_addr == b->s_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_UNALIGNED_ADDR_EQUAL(
+ IN CONST IN_ADDR UNALIGNED *a,
+ IN CONST IN_ADDR UNALIGNED *b)
+{
+ return (BOOLEAN)(a->s_addr == b->s_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_UNSPECIFIED(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)(a->s_addr == IN4ADDR_ANY);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_UNSPECIFIED(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ return (BOOLEAN)(a->s_addr == IN4ADDR_ANY);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_LOOPBACK(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)(*((PUCHAR) a) == 0x7f);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_LOOPBACK(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ return (BOOLEAN)(*((PUCHAR) a) == 0x7f);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_BROADCAST(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)(a->s_addr == IN4ADDR_BROADCAST);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_BROADCAST(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ return (BOOLEAN)(a->s_addr == IN4ADDR_BROADCAST);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_MULTICAST(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)IN4_MULTICAST(a->s_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_MULTICAST(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ return (BOOLEAN)IN4_MULTICAST(a->s_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_LINKLOCAL(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)((a->s_addr & 0xffff) == 0xfea9);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_LINKLOCAL(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ return (BOOLEAN)((a->s_addr & 0xffff) == 0xfea9); // 169.254/16
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_SITELOCAL(
+ IN CONST IN_ADDR *a)
+{
+ UNREFERENCED_PARAMETER(a);
+ return FALSE;
+}
+#define IN4_IS_UNALIGNED_ADDR_SITELOCAL IN4_IS_ADDR_SITELOCAL
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_RFC1918(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)(((a->s_addr & 0x00ff) == 0x0a) ||
+ ((a->s_addr & 0xf0ff) == 0x10ac) ||
+ ((a->s_addr & 0xffff) == 0xa8c0));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_RFC1918(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ IN_ADDR Ipv4Address = *a;
+ return IN4_IS_ADDR_RFC1918(&Ipv4Address);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_MC_LINKLOCAL(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)((a->s_addr & 0xffffff) == 0xe0);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_MC_ADMINLOCAL(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)((a->s_addr & 0xffff) == 0xffef);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_MC_SITELOCAL(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)((a->s_addr & 0xff) == 0xef) &&
+ !IN4_IS_ADDR_MC_ADMINLOCAL(a);
+}
+
+MSTCPIP_INLINE
+VOID
+IN4ADDR_SETSOCKADDR(
+ OUT PSOCKADDR_IN a,
+ IN CONST IN_ADDR *addr,
+ IN USHORT port)
+{
+ a->sin_family = AF_INET;
+ a->sin_port = port;
+ a->sin_addr = *addr;
+ memset(a->sin_zero, 0, sizeof(a->sin_zero));
+}
+
+MSTCPIP_INLINE
+VOID
+IN4ADDR_SETANY(
+ OUT PSOCKADDR_IN a)
+{
+ a->sin_family = AF_INET;
+ a->sin_port = 0;
+ a->sin_addr.s_addr = IN4ADDR_ANY;
+ memset(a->sin_zero, 0, sizeof(a->sin_zero));
+}
+
+MSTCPIP_INLINE
+VOID
+IN4ADDR_SETLOOPBACK(
+ OUT PSOCKADDR_IN a)
+{
+ a->sin_family = AF_INET;
+ a->sin_port = 0;
+ a->sin_addr.s_addr = IN4ADDR_LOOPBACK;
+ memset(a->sin_zero, 0, sizeof(a->sin_zero));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4ADDR_ISANY(
+ IN CONST SOCKADDR_IN *a)
+{
+ ASSERT(a->sin_family == AF_INET);
+ return IN4_IS_ADDR_UNSPECIFIED(&a->sin_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4ADDR_ISLOOPBACK(
+ IN CONST SOCKADDR_IN *a)
+{
+ ASSERT(a->sin_family == AF_INET);
+ return IN4_IS_ADDR_LOOPBACK(&a->sin_addr);
+}
+
+MSTCPIP_INLINE
+SCOPE_ID
+IN4ADDR_SCOPE_ID(
+ IN CONST SOCKADDR_IN *a)
+{
+ SCOPE_ID UnspecifiedScopeId = {0};
+ UNREFERENCED_PARAMETER(a);
+ return UnspecifiedScopeId;
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4ADDR_ISEQUAL(
+ IN CONST SOCKADDR_IN *a,
+ IN CONST SOCKADDR_IN *b)
+{
+ ASSERT(a->sin_family == AF_INET);
+ return (BOOLEAN)(IN4ADDR_SCOPE_ID(a).Value == IN4ADDR_SCOPE_ID(b).Value &&
+ IN4_ADDR_EQUAL(&a->sin_addr, &b->sin_addr));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4ADDR_ISUNSPECIFIED(
+ IN CONST SOCKADDR_IN *a)
+{
+ ASSERT(a->sin_family == AF_INET);
+ return (BOOLEAN)(IN4ADDR_SCOPE_ID(a).Value == 0 &&
+ IN4_IS_ADDR_UNSPECIFIED(&a->sin_addr));
+}
+
+#define INET_IS_ALIGNED(Pointer, Type) \
+ (((ULONG_PTR)Pointer & (__builtin_alignof(Type)-1)) == 0)
+
+MSTCPIP_INLINE
+SCOPE_LEVEL
+Ipv4UnicastAddressScope(
+ IN CONST UCHAR *Address)
+{
+ IN_ADDR Ipv4Address;
+
+ if (!INET_IS_ALIGNED(Address, IN_ADDR)) {
+ Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address;
+ Address = (CONST UCHAR *) &Ipv4Address;
+ }
+ if (IN4_IS_ADDR_LINKLOCAL((PIN_ADDR) Address) ||
+ IN4_IS_ADDR_LOOPBACK((PIN_ADDR) Address)) {
+ return ScopeLevelLink;
+ }
+ return ScopeLevelGlobal;
+}
+
+MSTCPIP_INLINE
+SCOPE_LEVEL
+Ipv4MulticastAddressScope(
+ IN CONST UCHAR *Address)
+{
+ IN_ADDR Ipv4Address;
+
+ if (!INET_IS_ALIGNED(Address, IN_ADDR)) {
+ Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address;
+ Address = (CONST UCHAR *) &Ipv4Address;
+ }
+ if (IN4_IS_ADDR_MC_LINKLOCAL((PIN_ADDR) Address)) {
+ return ScopeLevelLink;
+ } else if (IN4_IS_ADDR_MC_ADMINLOCAL((PIN_ADDR) Address)) {
+ return ScopeLevelAdmin;
+ } else if (IN4_IS_ADDR_MC_SITELOCAL((PIN_ADDR) Address)) {
+ return ScopeLevelSite;
+ } else {
+ return ScopeLevelGlobal;
+ }
+}
+
+MSTCPIP_INLINE
+SCOPE_LEVEL
+Ipv4AddressScope(
+ IN CONST UCHAR *Address)
+{
+ IN CONST IN_ADDR Ipv4Address = *(CONST IN_ADDR UNALIGNED *)Address;
+
+ if (IN4_IS_ADDR_BROADCAST(&Ipv4Address)) {
+ return ScopeLevelLink;
+ } else if (IN4_IS_ADDR_MULTICAST(&Ipv4Address)) {
+ return Ipv4MulticastAddressScope((UCHAR *) &Ipv4Address);
+ } else {
+ return Ipv4UnicastAddressScope((UCHAR *) &Ipv4Address);
+ }
+}
+
+MSTCPIP_INLINE
+NL_ADDRESS_TYPE
+Ipv4AddressType(
+ IN CONST UCHAR *Address)
+{
+ IN_ADDR Ipv4Address = *(CONST IN_ADDR UNALIGNED *) Address;
+
+ if (IN4_IS_ADDR_MULTICAST(&Ipv4Address)) {
+ return NlatMulticast;
+ }
+ if (IN4_IS_ADDR_BROADCAST(&Ipv4Address)) {
+ return NlatBroadcast;
+ }
+ if (IN4_IS_ADDR_UNSPECIFIED(&Ipv4Address)) {
+ return NlatUnspecified;
+ }
+ if (((Ipv4Address.s_addr & 0x000000ff) == 0) ||
+ ((Ipv4Address.s_addr & 0x000000f0) == 240)) {
+ return NlatInvalid;
+ }
+ return NlatUnicast;
+}
+
+MSTCPIP_INLINE
+VOID
+IN4_UNCANONICALIZE_SCOPE_ID(
+ IN CONST IN_ADDR *Address,
+ IN OUT SCOPE_ID *ScopeId)
+{
+ SCOPE_LEVEL ScopeLevel = Ipv4AddressScope((CONST UCHAR *)Address);
+
+ if ((IN4_IS_ADDR_LOOPBACK(Address)) || (ScopeLevel == ScopeLevelGlobal)) {
+ ScopeId->Value = 0;
+ }
+ if ((SCOPE_LEVEL)ScopeId->Level == ScopeLevel) {
+ ScopeId->Level = 0;
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_ADDR_6TO4ELIGIBLE(
+ IN CONST IN_ADDR *a)
+{
+ return (BOOLEAN)((Ipv4AddressType((CONST UCHAR *) a) == NlatUnicast) &&
+ !(IN4_IS_ADDR_LOOPBACK(a) ||
+ IN4_IS_ADDR_LINKLOCAL(a) ||
+ IN4_IS_ADDR_SITELOCAL(a) ||
+ IN4_IS_ADDR_RFC1918(a)));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN4_IS_UNALIGNED_ADDR_6TO4ELIGIBLE(
+ IN CONST IN_ADDR UNALIGNED *a)
+{
+ IN_ADDR Ipv4Address = *a;
+ return IN4_IS_ADDR_6TO4ELIGIBLE(&Ipv4Address);
+}
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */
+
+#endif /* _WS2DEF_ */
+
+#ifdef _WS2IPDEF_
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_PREFIX_EQUAL(
+ IN CONST IN6_ADDR *a,
+ IN CONST IN6_ADDR *b,
+ IN UINT8 len)
+{
+ UINT8 Bytes = len / 8;
+ UINT8 Bits = len % 8;
+ UINT8 Mask = 0xff << (8 - Bits);
+
+ ASSERT(len <= (sizeof(IN6_ADDR) * 8));
+ return (BOOLEAN) (((memcmp(a, b, Bytes)) == 0) && ((Bits == 0) ||
+ ((a->s6_bytes[Bytes] | Mask) == (b->s6_bytes[Bytes] | Mask))));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_ALLNODESONNODE(
+ IN CONST IN6_ADDR *a)
+{
+ return IN6_ADDR_EQUAL(a, &in6addr_allnodesonnode);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_ALLNODESONLINK(
+ IN CONST IN6_ADDR *a)
+{
+ return IN6_ADDR_EQUAL(a, &in6addr_allnodesonlink);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_ALLROUTERSONLINK(
+ IN CONST IN6_ADDR *a)
+{
+ return IN6_ADDR_EQUAL(a, &in6addr_allroutersonlink);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_SOLICITEDNODE(
+ IN CONST IN6_ADDR *a)
+{
+ return IN6_PREFIX_EQUAL(a, &in6addr_solicitednodemulticastprefix,
+ IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_ISATAP(
+ IN CONST IN6_ADDR *a)
+{
+ return (BOOLEAN)(((a->s6_words[4] & 0xfffd) == 0x0000) &&
+ (a->s6_words[5] == 0xfe5e));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_6TO4(
+ IN CONST IN6_ADDR *a)
+{
+ C_ASSERT(IN6ADDR_6TO4PREFIX_LENGTH == RTL_BITS_OF(USHORT));
+ return (BOOLEAN)(a->s6_words[0] == in6addr_6to4prefix.s6_words[0]);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_TEREDO(
+ IN CONST IN6_ADDR *a)
+{
+ C_ASSERT(IN6ADDR_TEREDOPREFIX_LENGTH == 2 * RTL_BITS_OF(USHORT));
+ return (BOOLEAN)
+ (((a->s6_words[0] == in6addr_teredoprefix.s6_words[0]) &&
+ (a->s6_words[1] == in6addr_teredoprefix.s6_words[1])) ||
+ ((a->s6_words[0] == in6addr_teredoprefix_old.s6_words[0]) &&
+ (a->s6_words[1] == in6addr_teredoprefix_old.s6_words[1])));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISV4MAPPED(
+ IN CONST SOCKADDR_IN6 *a)
+{
+ ASSERT(a->sin6_family == AF_INET6);
+ return IN6_IS_ADDR_V4MAPPED(&a->sin6_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISISATAP(
+ IN CONST SOCKADDR_IN6 *a)
+{
+ ASSERT(a->sin6_family == AF_INET6);
+ return IN6_IS_ADDR_ISATAP(&a->sin6_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6ADDR_IS6TO4(
+ IN CONST SOCKADDR_IN6 *a)
+{
+ ASSERT(a->sin6_family == AF_INET6);
+ return IN6_IS_ADDR_6TO4(&a->sin6_addr);
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISTEREDO(
+ IN CONST SOCKADDR_IN6 *a)
+{
+ ASSERT(a->sin6_family == AF_INET6);
+ return IN6_IS_ADDR_TEREDO(&a->sin6_addr);
+}
+
+MSTCPIP_INLINE
+CONST UCHAR*
+IN6_GET_ADDR_V4MAPPED(
+ IN CONST IN6_ADDR *Ipv6Address)
+{
+ return (CONST UCHAR *) (Ipv6Address->s6_words + 6);
+}
+
+MSTCPIP_INLINE
+CONST UCHAR*
+IN6_GET_ADDR_V4COMPAT(
+ IN CONST IN6_ADDR *Ipv6Address)
+{
+ return (CONST UCHAR *) (Ipv6Address->s6_words + 6);
+}
+
+MSTCPIP_INLINE
+CONST UCHAR*
+IN6_EXTRACT_V4ADDR_FROM_ISATAP(
+ IN CONST IN6_ADDR *Ipv6Address)
+{
+ return (CONST UCHAR *) (Ipv6Address->s6_words + 6);
+}
+
+MSTCPIP_INLINE
+CONST UCHAR*
+IN6_EXTRACT_V4ADDR_FROM_6TO4(
+ IN CONST IN6_ADDR *Ipv6Address)
+{
+ return (CONST UCHAR *) (Ipv6Address->s6_words + 1);
+}
+
+MSTCPIP_INLINE
+VOID
+IN6_SET_ADDR_V4MAPPED(
+ OUT PIN6_ADDR a6,
+ IN CONST IN_ADDR* a4)
+{
+ *a6 = in6addr_v4mappedprefix;
+ a6->s6_bytes[12] = ((CONST UCHAR *) a4)[0];
+ a6->s6_bytes[13] = ((CONST UCHAR *) a4)[1];
+ a6->s6_bytes[14] = ((CONST UCHAR *) a4)[2];
+ a6->s6_bytes[15] = ((CONST UCHAR *) a4)[3];
+}
+
+MSTCPIP_INLINE
+VOID
+IN6_SET_ADDR_V4COMPAT(
+ OUT PIN6_ADDR a6,
+ IN CONST IN_ADDR* a4)
+{
+ *a6 = in6addr_any;
+ a6->s6_bytes[12] = ((CONST UCHAR *) a4)[0];
+ a6->s6_bytes[13] = ((CONST UCHAR *) a4)[1];
+ a6->s6_bytes[14] = ((CONST UCHAR *) a4)[2];
+ a6->s6_bytes[15] = ((CONST UCHAR *) a4)[3];
+}
+
+MSTCPIP_INLINE
+VOID
+IN6_SET_ADDR_SOLICITEDNODE(
+ OUT PIN6_ADDR Multicast,
+ IN CONST IN6_ADDR *Unicast)
+{
+ *Multicast = in6addr_solicitednodemulticastprefix;
+ Multicast->s6_bytes[13] = Unicast->s6_bytes[13];
+ Multicast->s6_bytes[14] = Unicast->s6_bytes[14];
+ Multicast->s6_bytes[15] = Unicast->s6_bytes[15];
+}
+
+MSTCPIP_INLINE
+VOID
+IN6_SET_ISATAP_IDENTIFIER(
+ IN OUT IN6_ADDR *Ipv6Address,
+ IN CONST IN_ADDR *Ipv4Address)
+{
+ if (IN4_IS_ADDR_6TO4ELIGIBLE(Ipv4Address)) {
+ Ipv6Address->s6_words[4] = 0x0002;
+ } else {
+ Ipv6Address->s6_words[4] = 0x0000;
+ }
+ Ipv6Address->s6_words[5] = 0xFE5E;
+ *((UNALIGNED IN_ADDR *) (Ipv6Address->s6_words + 6)) = *Ipv4Address;
+}
+
+MSTCPIP_INLINE
+VOID
+IN6_SET_6TO4_PREFIX(
+ IN OUT IN6_ADDR *Ipv6Address,
+ IN CONST IN_ADDR *Ipv4Address)
+{
+ Ipv6Address->s6_words[0] = 0x0220;
+ *((UNALIGNED IN_ADDR *) (Ipv6Address->s6_words + 1)) = *Ipv4Address;
+ Ipv6Address->s6_words[3] = 0x0000;
+}
+
+MSTCPIP_INLINE
+SCOPE_LEVEL
+Ipv6UnicastAddressScope(
+ IN CONST UCHAR *Address)
+{
+ IN6_ADDR Ipv6Address;
+
+ if (!INET_IS_ALIGNED(Address, IN6_ADDR)) {
+ Ipv6Address = *(CONST IN6_ADDR UNALIGNED *)Address;
+ Address = (CONST UCHAR *) &Ipv6Address;
+ }
+ if (IN6_IS_ADDR_LINKLOCAL((PIN6_ADDR) Address) ||
+ IN6_IS_ADDR_LOOPBACK((PIN6_ADDR) Address)) {
+ return ScopeLevelLink;
+ } else if (IN6_IS_ADDR_SITELOCAL((PIN6_ADDR) Address)) {
+ return ScopeLevelSite;
+ } else {
+ return ScopeLevelGlobal;
+ }
+}
+
+MSTCPIP_INLINE
+SCOPE_LEVEL
+IN6_MULTICAST_SCOPE(
+ IN CONST UCHAR *Address)
+{
+ PIN6_ADDR Ipv6Address = (PIN6_ADDR) Address;
+ return (SCOPE_LEVEL)(Ipv6Address->s6_bytes[1] & 0xf);
+}
+
+MSTCPIP_INLINE
+SCOPE_LEVEL
+Ipv6AddressScope(
+ IN CONST UCHAR *Address)
+{
+ if (IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR *) Address)) {
+ return IN6_MULTICAST_SCOPE(Address);
+ } else {
+ return Ipv6UnicastAddressScope(Address);
+ }
+}
+
+MSTCPIP_INLINE
+NL_ADDRESS_TYPE
+Ipv6AddressType(
+ IN CONST UCHAR *Address)
+{
+ CONST IN6_ADDR *Ipv6Address = (CONST IN6_ADDR *) Address;
+ CONST UCHAR *Ipv4Address;
+
+ if (IN6_IS_ADDR_MULTICAST(Ipv6Address)) {
+ return NlatMulticast;
+ }
+ if (IN6_IS_ADDR_UNSPECIFIED(Ipv6Address)) {
+ return NlatUnspecified;
+ }
+ if (IN6_IS_ADDR_ISATAP(Ipv6Address) || IN6_IS_ADDR_V4COMPAT(Ipv6Address) ||
+ IN6_IS_ADDR_V4MAPPED(Ipv6Address) || IN6_IS_ADDR_V4TRANSLATED(Ipv6Address)) {
+ Ipv4Address = IN6_EXTRACT_V4ADDR_FROM_ISATAP(Ipv6Address);
+ } else if (IN6_IS_ADDR_6TO4(Ipv6Address)) {
+ Ipv4Address = IN6_EXTRACT_V4ADDR_FROM_6TO4(Ipv6Address);
+ } else {
+ return NlatUnicast;
+ }
+ if (Ipv4AddressType(Ipv4Address) != NlatUnicast) {
+ return NlatInvalid;
+ }
+ return NlatUnicast;
+}
+
+MSTCPIP_INLINE
+VOID
+IN6_UNCANONICALIZE_SCOPE_ID(
+ IN CONST IN6_ADDR *Address,
+ IN OUT SCOPE_ID *ScopeId)
+{
+ SCOPE_LEVEL ScopeLevel = Ipv6AddressScope((CONST UCHAR *)Address);
+
+ if ((IN6_IS_ADDR_LOOPBACK(Address)) || (ScopeLevel == ScopeLevelGlobal)) {
+ ScopeId->Value = 0;
+ }
+ if ((SCOPE_LEVEL)ScopeId->Level == ScopeLevel) {
+ ScopeId->Level = 0;
+ }
+}
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+MSTCPIP_INLINE
+VOID
+IN6ADDR_SETSOCKADDR(
+ OUT PSOCKADDR_IN6 a,
+ IN CONST IN6_ADDR *addr,
+ IN SCOPE_ID scope,
+ IN USHORT port)
+{
+ a->sin6_family = AF_INET6;
+ a->sin6_port = port;
+ a->sin6_flowinfo = 0;
+ RtlCopyMemory(&a->sin6_addr, addr, sizeof(IN6_ADDR));
+ a->sin6_scope_struct = scope;
+ IN6_UNCANONICALIZE_SCOPE_ID(&a->sin6_addr, &a->sin6_scope_struct);
+}
+
+MSTCPIP_INLINE
+VOID
+IN6ADDR_SETV4MAPPED(
+ OUT PSOCKADDR_IN6 a6,
+ IN CONST IN_ADDR* a4,
+ IN SCOPE_ID scope,
+ IN USHORT port)
+{
+ a6->sin6_family = AF_INET6;
+ a6->sin6_port = port;
+ a6->sin6_flowinfo = 0;
+ IN6_SET_ADDR_V4MAPPED(&a6->sin6_addr, a4);
+ a6->sin6_scope_struct = scope;
+ IN4_UNCANONICALIZE_SCOPE_ID(a4, &a6->sin6_scope_struct);
+}
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_ADDR_EQUAL(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a,
+ IN CONST VOID* b)
+{
+ if (af == AF_INET6) {
+ return IN6_ADDR_EQUAL((CONST IN6_ADDR*)a, (CONST IN6_ADDR*)b);
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_ADDR_EQUAL((CONST IN_ADDR*)a, (CONST IN_ADDR*)b);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_UNALIGNED_ADDR_EQUAL(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a,
+ IN CONST VOID* b)
+{
+ if (af == AF_INET6) {
+ return IN6_ADDR_EQUAL((CONST IN6_ADDR*)a, (CONST IN6_ADDR*)b);
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_UNALIGNED_ADDR_EQUAL((CONST IN_ADDR*)a, (CONST IN_ADDR*)b);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_IS_ADDR_UNSPECIFIED(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a)
+{
+ if (af == AF_INET6) {
+ return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR*)a);
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_IS_ADDR_UNSPECIFIED((CONST IN_ADDR*)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_IS_UNALIGNED_ADDR_UNSPECIFIED(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a)
+{
+ if (af == AF_INET6) {
+ return IN6_IS_ADDR_UNSPECIFIED((CONST IN6_ADDR*)a);
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_IS_UNALIGNED_ADDR_UNSPECIFIED((CONST IN_ADDR UNALIGNED*)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_IS_ADDR_LOOPBACK(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a)
+{
+ if (af == AF_INET6) {
+ return IN6_IS_ADDR_LOOPBACK((CONST IN6_ADDR*)a);
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_IS_ADDR_LOOPBACK((CONST IN_ADDR*)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_IS_ADDR_BROADCAST(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a)
+{
+ if (af == AF_INET6) {
+ return FALSE;
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_IS_ADDR_BROADCAST((CONST IN_ADDR*)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INET_IS_ADDR_MULTICAST(
+ IN ADDRESS_FAMILY af,
+ IN CONST VOID* a)
+{
+ if (af == AF_INET6) {
+ return IN6_IS_ADDR_MULTICAST((CONST IN6_ADDR*)a);
+ } else {
+ ASSERT(af == AF_INET);
+ return IN4_IS_ADDR_MULTICAST((CONST IN_ADDR*)a);
+ }
+}
+
+MSTCPIP_INLINE
+CONST UCHAR*
+INET_ADDR_UNSPECIFIED(
+ IN ADDRESS_FAMILY af)
+{
+ if (af == AF_INET6) {
+ return (CONST UCHAR*)&in6addr_any;
+ } else {
+ ASSERT(af == AF_INET);
+ return (CONST UCHAR*)&in4addr_any;
+ }
+}
+
+MSTCPIP_INLINE
+VOID
+INET_SET_ADDRESS(
+ IN ADDRESS_FAMILY Family,
+ OUT PUCHAR Address,
+ IN CONST UCHAR *Value)
+{
+ if (Family == AF_INET6) {
+ *((PIN6_ADDR)Address) = *((PIN6_ADDR)Value);
+ } else {
+ ASSERT(Family == AF_INET);
+ *((PIN_ADDR)Address) = *((PIN_ADDR)Value);
+ }
+}
+
+MSTCPIP_INLINE
+SIZE_T
+INET_ADDR_LENGTH(
+ IN ADDRESS_FAMILY af)
+{
+ if (af == AF_INET6) {
+ return sizeof(IN6_ADDR);
+ } else {
+ ASSERT(af == AF_INET);
+ return sizeof(IN_ADDR);
+ }
+}
+
+MSTCPIP_INLINE
+SIZE_T
+INET_SOCKADDR_LENGTH(
+ IN ADDRESS_FAMILY af)
+{
+ if (af == AF_INET6) {
+ return sizeof(SOCKADDR_IN6);
+ } else {
+ ASSERT(af == AF_INET);
+ return sizeof(SOCKADDR_IN);
+ }
+}
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+MSTCPIP_INLINE
+VOID
+INETADDR_SETSOCKADDR(
+ IN ADDRESS_FAMILY af,
+ OUT PSOCKADDR a,
+ IN CONST VOID* addr,
+ IN SCOPE_ID scope,
+ IN USHORT port)
+{
+ if (af == AF_INET6) {
+ IN6ADDR_SETSOCKADDR((PSOCKADDR_IN6) a, (CONST IN6_ADDR *) addr, scope, port);
+ } else {
+ CONST IN_ADDR addr4 = *((IN_ADDR UNALIGNED *) addr);
+ ASSERT(af == AF_INET);
+ IN4ADDR_SETSOCKADDR((PSOCKADDR_IN) a, (CONST IN_ADDR *) &addr4, port);
+ }
+}
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+MSTCPIP_INLINE
+VOID
+INETADDR_SETANY(
+ OUT PSOCKADDR a)
+{
+ if (a->sa_family == AF_INET6) {
+ IN6ADDR_SETANY((PSOCKADDR_IN6)a);
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ IN4ADDR_SETANY((PSOCKADDR_IN)a);
+ }
+}
+
+MSTCPIP_INLINE
+VOID
+INETADDR_SETLOOPBACK(
+ OUT PSOCKADDR a)
+{
+ if (a->sa_family == AF_INET6) {
+ IN6ADDR_SETLOOPBACK((PSOCKADDR_IN6)a);
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ IN4ADDR_SETLOOPBACK((PSOCKADDR_IN)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INETADDR_ISANY(
+ IN CONST SOCKADDR *a)
+{
+ if (a->sa_family == AF_INET6) {
+ return IN6ADDR_ISANY((CONST SOCKADDR_IN6*)a);
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return IN4ADDR_ISANY((CONST SOCKADDR_IN*)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INETADDR_ISLOOPBACK(
+ IN CONST SOCKADDR *a)
+{
+ if (a->sa_family == AF_INET6) {
+ return IN6ADDR_ISLOOPBACK((CONST SOCKADDR_IN6*)a);
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return IN4ADDR_ISLOOPBACK((CONST SOCKADDR_IN*)a);
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INETADDR_ISV4MAPPED(IN CONST SOCKADDR *a)
+{
+ if (a->sa_family == AF_INET6) {
+ return IN6ADDR_ISV4MAPPED((CONST SOCKADDR_IN6*)a);
+ } else {
+ return FALSE;
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+NL_ADDR_EQUAL(
+ IN ADDRESS_FAMILY af,
+ IN SCOPE_ID sa,
+ IN CONST UCHAR* aa,
+ IN SCOPE_ID sb,
+ IN CONST UCHAR* ab)
+{
+ return (BOOLEAN)((sa.Value == sb.Value) && INET_ADDR_EQUAL(af, aa, ab));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+NL_IS_ADDR_UNSPECIFIED(
+ IN ADDRESS_FAMILY af,
+ IN SCOPE_ID s,
+ IN CONST UCHAR* a)
+{
+ return (BOOLEAN)((s.Value == 0) && INET_IS_ADDR_UNSPECIFIED(af, a));
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INETADDR_ISEQUAL(
+ IN CONST SOCKADDR *a,
+ IN CONST SOCKADDR *b)
+{
+ if (a->sa_family == AF_INET6) {
+ return (BOOLEAN) (b->sa_family == AF_INET6 &&
+ IN6ADDR_ISEQUAL((CONST SOCKADDR_IN6*)a, (CONST SOCKADDR_IN6*)b));
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return (BOOLEAN) (b->sa_family == AF_INET &&
+ IN4ADDR_ISEQUAL((CONST SOCKADDR_IN*)a, (CONST SOCKADDR_IN*)b));
+ }
+}
+
+MSTCPIP_INLINE
+BOOLEAN
+INETADDR_ISUNSPECIFIED(
+ IN CONST SOCKADDR *a)
+{
+ if (a->sa_family == AF_INET6) {
+ return IN6ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN6*)a);
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return IN4ADDR_ISUNSPECIFIED((CONST SOCKADDR_IN*)a);
+ }
+}
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+MSTCPIP_INLINE
+SCOPE_ID
+INETADDR_SCOPE_ID(
+ IN CONST SOCKADDR *a)
+{
+ if (a->sa_family == AF_INET6) {
+ return ((CONST SOCKADDR_IN6*)a)->sin6_scope_struct;
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return IN4ADDR_SCOPE_ID((CONST SOCKADDR_IN*)a);
+ }
+}
+#endif
+
+MSTCPIP_INLINE
+USHORT
+INETADDR_PORT(
+ IN CONST SOCKADDR *a)
+{
+ if (a->sa_family == AF_INET6) {
+ return ((CONST SOCKADDR_IN6*)a)->sin6_port;
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return ((CONST SOCKADDR_IN*)a)->sin_port;
+ }
+}
+
+MSTCPIP_INLINE
+PUCHAR
+INETADDR_ADDRESS(
+ IN CONST SOCKADDR* a)
+{
+ if (a->sa_family == AF_INET6) {
+ return (PUCHAR)&((PSOCKADDR_IN6)a)->sin6_addr;
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ return (PUCHAR)&((PSOCKADDR_IN)a)->sin_addr;
+ }
+}
+
+MSTCPIP_INLINE
+VOID
+INETADDR_SET_PORT(
+ IN OUT PSOCKADDR a,
+ IN USHORT Port)
+{
+ SS_PORT(a) = Port;
+}
+
+MSTCPIP_INLINE
+VOID
+INETADDR_SET_ADDRESS(
+ IN OUT PSOCKADDR a,
+ IN CONST UCHAR *Address)
+{
+ if (a->sa_family == AF_INET6) {
+ ((PSOCKADDR_IN6)a)->sin6_addr = *((CONST IN6_ADDR*)Address);
+ } else {
+ ASSERT(a->sa_family == AF_INET);
+ ((PSOCKADDR_IN)a)->sin_addr = *((CONST IN_ADDR*)Address);
+ }
+}
+
+MSTCPIP_INLINE
+VOID
+INET_UNCANONICALIZE_SCOPE_ID(
+ IN ADDRESS_FAMILY AddressFamily,
+ IN CONST UCHAR *Address,
+ IN OUT SCOPE_ID *ScopeId)
+{
+ if (AddressFamily == AF_INET6) {
+ IN6_UNCANONICALIZE_SCOPE_ID((CONST IN6_ADDR*) Address, ScopeId);
+ } else {
+ IN4_UNCANONICALIZE_SCOPE_ID((CONST IN_ADDR*) Address, ScopeId);
+ }
+}
+
+#endif /* _WS2IPDEF_ */
+
+#ifndef __IP2STRING__
+#define __IP2STRING__
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+#ifdef _WS2DEF_
+
+NTSYSAPI
+PSTR
+NTAPI
+RtlIpv4AddressToStringA(
+ IN const struct in_addr *Addr,
+ OUT PSTR S);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv4AddressToStringExA(
+ IN const struct in_addr *Address,
+ IN USHORT Port,
+ OUT PSTR AddressString,
+ IN OUT PULONG AddressStringLength);
+
+NTSYSAPI
+PWSTR
+NTAPI
+RtlIpv4AddressToStringW(
+ IN const struct in_addr *Addr,
+ OUT PWSTR S);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv4AddressToStringExW(
+ IN const struct in_addr *Address,
+ IN USHORT Port,
+ OUT PWSTR AddressString,
+ IN OUT PULONG AddressStringLength);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv4StringToAddressA(
+ IN PCSTR S,
+ IN BOOLEAN Strict,
+ OUT PCSTR *Terminator,
+ OUT struct in_addr *Addr);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv4StringToAddressExA(
+ IN PCSTR AddressString,
+ IN BOOLEAN Strict,
+ OUT struct in_addr *Address,
+ OUT PUSHORT Port);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv4StringToAddressW(
+ IN PCWSTR S,
+ IN BOOLEAN Strict,
+ OUT LPCWSTR *Terminator,
+ OUT struct in_addr *Addr);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv4StringToAddressExW(
+ IN PCWSTR AddressString,
+ IN BOOLEAN Strict,
+ OUT struct in_addr *Address,
+ OUT PUSHORT Port);
+
+#ifdef UNICODE
+#define RtlIpv4AddressToString RtlIpv4AddressToStringW
+#define RtlIpv4StringToAddress RtlIpv4StringToAddressW
+#define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExW
+#define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExW
+#else
+#define RtlIpv4AddressToString RtlIpv4AddressToStringA
+#define RtlIpv4StringToAddress RtlIpv4StringToAddressA
+#define RtlIpv4AddressToStringEx RtlIpv4AddressToStringExA
+#define RtlIpv4StringToAddressEx RtlIpv4StringToAddressExA
+#endif
+
+#endif /* _WS2DEF_ */
+
+#ifdef _WS2IPDEF_
+
+NTSYSAPI
+PSTR
+NTAPI
+RtlIpv6AddressToStringA(
+ IN const struct in6_addr *Addr,
+ OUT PSTR S);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv6AddressToStringExA(
+ IN const struct in6_addr *Address,
+ IN ULONG ScopeId,
+ IN USHORT Port,
+ OUT PSTR AddressString,
+ IN OUT PULONG AddressStringLength);
+
+NTSYSAPI
+PWSTR
+NTAPI
+RtlIpv6AddressToStringW(
+ IN const struct in6_addr *Addr,
+ OUT PWSTR S);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv6AddressToStringExW(
+ IN const struct in6_addr *Address,
+ IN ULONG ScopeId,
+ IN USHORT Port,
+ OUT PWSTR AddressString,
+ IN OUT PULONG AddressStringLength);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv6StringToAddressA(
+ IN PCSTR S,
+ OUT PCSTR *Terminator,
+ OUT struct in6_addr *Addr);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv6StringToAddressExA(
+ IN PCSTR AddressString,
+ OUT struct in6_addr *Address,
+ OUT PULONG ScopeId,
+ OUT PUSHORT Port);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv6StringToAddressW(
+ IN PCWSTR S,
+ OUT PCWSTR *Terminator,
+ OUT struct in6_addr *Addr);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlIpv6StringToAddressExW(
+ IN PCWSTR AddressString,
+ OUT struct in6_addr *Address,
+ OUT PULONG ScopeId,
+ OUT PUSHORT Port);
+
+#ifdef UNICODE
+#define RtlIpv6AddressToString RtlIpv6AddressToStringW
+#define RtlIpv6StringToAddress RtlIpv6StringToAddressW
+#define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExW
+#define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExW
+#else
+#define RtlIpv6AddressToString RtlIpv6AddressToStringA
+#define RtlIpv6StringToAddress RtlIpv6StringToAddressA
+#define RtlIpv6StringToAddressEx RtlIpv6StringToAddressExA
+#define RtlIpv6AddressToStringEx RtlIpv6AddressToStringExA
+#endif
+
+#endif /* __WS2IPDEF__ */
+
+#ifdef _WS2DEF_
+
+union _DL_EUI48;
+typedef union _DL_EUI48 DL_EUI48, *PDL_EUI48;
+
+NTSYSAPI
+PSTR
+NTAPI
+RtlEthernetAddressToStringA(
+ IN const DL_EUI48 *Addr,
+ OUT PSTR S);
+
+NTSYSAPI
+PWSTR
+NTAPI
+RtlEthernetAddressToStringW(
+ IN const DL_EUI48 *Addr,
+ OUT PWSTR S);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlEthernetStringToAddressA(
+ IN PCSTR S,
+ OUT PCSTR *Terminator,
+ OUT DL_EUI48 *Addr);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlEthernetStringToAddressW(
+ IN PCWSTR S,
+ OUT LPCWSTR *Terminator,
+ OUT DL_EUI48 *Addr);
+
+#ifdef UNICODE
+#define RtlEthernetAddressToString RtlEthernetAddressToStringW
+#define RtlEthernetStringToAddress RtlEthernetStringToAddressW
+#else
+#define RtlEthernetAddressToString RtlEthernetAddressToStringA
+#define RtlEthernetStringToAddress RtlEthernetStringToAddressA
+#endif
+
+#endif /* _WS2DEF_ */
+
+#endif /* (NTDDI >= NTDDI_VISTA) */
+
+#endif /* __IP2STRING__ */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/psdk/mswsock.h b/include/psdk/mswsock.h
index b84f043c3bb..68b4c458b98 100644
--- a/include/psdk/mswsock.h
+++ b/include/psdk/mswsock.h
@@ -9,113 +9,347 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*/
-#ifndef _MSWSOCK_H
-#define _MSWSOCK_H
+#pragma once
+
+#define _MSWSOCK_
#ifdef __cplusplus
extern "C" {
#endif
-#define SO_CONNDATA 0x7000
-#define SO_CONNOPT 0x7001
-#define SO_DISCDATA 0x7002
-#define SO_DISCOPT 0x7003
-#define SO_CONNDATALEN 0x7004
-#define SO_CONNOPTLEN 0x7005
-#define SO_DISCDATALEN 0x7006
-#define SO_DISCOPTLEN 0x7007
-#define SO_OPENTYPE 0x7008
-#define SO_SYNCHRONOUS_ALERT 0x10
-#define SO_SYNCHRONOUS_NONALERT 0x20
-#define SO_MAXDG 0x7009
-#define SO_MAXPATHDG 0x700A
-#define SO_UPDATE_ACCEPT_CONTEXT 0x700B
-#define SO_CONNECT_TIME 0x700C
-#define TCP_BSDURGENT 0x7000
+#include
-#define TF_DISCONNECT 1
-#define TF_REUSE_SOCKET 2
-#define TF_WRITE_BEHIND 4
-#define TF_USE_DEFAULT_WORKER 0
-#define TF_USE_SYSTEM_THREAD 16
-#define TF_USE_KERNEL_APC 32
-
-typedef struct _TRANSMIT_FILE_BUFFERS {
- PVOID Head;
- DWORD HeadLength;
- PVOID Tail;
- DWORD TailLength;
-} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, *LPTRANSMIT_FILE_BUFFERS;
-
-int PASCAL WSARecvEx(SOCKET,char*,int,int*);
-BOOL PASCAL TransmitFile(SOCKET,HANDLE,DWORD,DWORD,LPOVERLAPPED,LPTRANSMIT_FILE_BUFFERS,DWORD);
-BOOL PASCAL AcceptEx(SOCKET,SOCKET,PVOID,DWORD,DWORD,DWORD,LPDWORD,LPOVERLAPPED);
-VOID PASCAL GetAcceptExSockaddrs(PVOID,DWORD,DWORD,DWORD,struct sockaddr**, LPINT, struct sockaddr**, LPINT);
-
-#define WSAID_ACCEPTEX { 0xB5367DF0, 0xCBAC, 0x11CF, { 0x95, 0xCA, 0x00, 0x80, 0x5F, 0x48, 0xA1, 0x92 } }
-#define WSAID_TRANSMITFILE { 0xB5367DF1, 0xCBAC, 0x11CF, { 0x95, 0xCA, 0x00, 0x80, 0x5F, 0x48, 0xA1, 0x92 } }
-#define WSAID_GETACCEPTEXSOCKADDRS { 0xB5367DF2, 0xCBAC, 0x11CF, { 0x95, 0xCA, 0x00, 0x80, 0x5F, 0x48, 0xA1, 0x92 } }
-
-#define NLA_NAMESPACE_GUID { 0x6642243A, 0x3BA8, 0x4AA6, { 0xBA, 0xA5, 0x2E, 0xB, 0xD7, 0x1F, 0xDD, 0x83 } }
-
-typedef BOOL (PASCAL *LPFN_TRANSMITFILE)(SOCKET,HANDLE,DWORD,DWORD,LPOVERLAPPED,LPTRANSMIT_FILE_BUFFERS,DWORD);
-typedef BOOL (PASCAL *LPFN_ACCEPTEX)(SOCKET,SOCKET,PVOID,DWORD,DWORD,DWORD,LPDWORD,LPOVERLAPPED);
-typedef VOID (PASCAL *LPFN_GETACCEPTEXSOCKADDRS)(PVOID,DWORD,DWORD,DWORD,struct sockaddr**, LPINT, struct sockaddr**, LPINT);
-
-#ifdef _WINSOCK2_H /* These require the winsock2 interface. */
-
-#define TP_ELEMENT_FILE 1
-#define TP_ELEMENT_MEMORY 2
-#define TP_ELEMENT_EOP 4
-
-typedef struct _TRANSMIT_PACKETS_ELEMENT {
- ULONG dwElFlags;
- ULONG cLength;
- _ANONYMOUS_UNION
- union {
- struct {
- LARGE_INTEGER nFileOffset;
- HANDLE hFile;
- };
- PVOID pBuffer;
- };
-} TRANSMIT_PACKETS_ELEMENT;
-
-typedef struct _WSAMSG {
- LPSOCKADDR name;
- INT namelen;
- LPWSABUF lpBuffers;
- DWORD dwBufferCount;
- WSABUF Control;
- DWORD dwFlags;
-} WSAMSG, *PWSAMSG, *LPWSAMSG;
-
-
-/* According to MSDN docs, the WSAMSG.Control buffer starts with a
- cmsghdr header of the following form. See also RFC 2292. */
-
-typedef struct wsacmsghdr {
- UINT cmsg_len;
- INT cmsg_level;
- INT cmsg_type;
- /* followed by UCHAR cmsg_data[]; */
-} WSACMSGHDR;
-
-/* TODO: Standard Posix.1g macros as per RFC 2292, with WSA_uglification. */
-#if 0
-#define WSA_CMSG_FIRSTHDR(mhdr)
-#define WSA_CMSG_NXTHDR(mhdr, cmsg)
-#define WSA_CMSG_SPACE(length)
-#define WSA_CMSG_LEN(length)
+#define SO_CONNDATA 0x7000
+#define SO_CONNOPT 0x7001
+#define SO_DISCDATA 0x7002
+#define SO_DISCOPT 0x7003
+#define SO_CONNDATALEN 0x7004
+#define SO_CONNOPTLEN 0x7005
+#define SO_DISCDATALEN 0x7006
+#define SO_DISCOPTLEN 0x7007
+#define SO_OPENTYPE 0x7008
+#define SO_SYNCHRONOUS_ALERT 0x10
+#define SO_SYNCHRONOUS_NONALERT 0x20
+#define SO_MAXDG 0x7009
+#define SO_MAXPATHDG 0x700A
+#define SO_UPDATE_ACCEPT_CONTEXT 0x700B
+#define SO_CONNECT_TIME 0x700C
+#if(_WIN32_WINNT >= 0x0501)
+#define SO_UPDATE_CONNECT_CONTEXT 0x7010
#endif
-BOOL PASCAL DisconnectEx(SOCKET,LPOVERLAPPED,DWORD,DWORD);
-int PASCAL WSARecvMsg(SOCKET,LPWSAMSG,LPDWORD,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE);
+#define TCP_BSDURGENT 0x7000
-#endif /* _WINSOCK2_H */
+#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
+
+#if((_WIN32_WINNT < 0x0600) && (_WIN32_WINNT >= 0x0501))
+#define SIO_SOCKET_CLOSE_NOTIFY _WSAIOW(IOC_VENDOR,13)
+#endif
+
+#define SIO_UDP_NETRESET _WSAIOW(IOC_VENDOR,15)
+
+#define TF_DISCONNECT 1
+#define TF_REUSE_SOCKET 2
+#define TF_WRITE_BEHIND 4
+
+#define TF_USE_DEFAULT_WORKER 0
+#define TF_USE_SYSTEM_THREAD 16
+#define TF_USE_KERNEL_APC 32
+
+#if(_WIN32_WINNT >= 0x0501)
+#define TP_ELEMENT_MEMORY 1
+#define TP_ELEMENT_FILE 2
+#define TP_ELEMENT_EOP 4
+#endif
+
+#define TP_DISCONNECT TF_DISCONNECT
+#define TP_REUSE_SOCKET TF_REUSE_SOCKET
+#define TP_USE_DEFAULT_WORKER TF_USE_DEFAULT_WORKER
+#define TP_USE_SYSTEM_THREAD TF_USE_SYSTEM_THREAD
+#define TP_USE_KERNEL_APC TF_USE_KERNEL_APC
+
+#define WSAID_TRANSMITFILE \
+ {0xb5367df0,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
+
+#define WSAID_ACCEPTEX \
+ {0xb5367df1,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
+
+#define WSAID_GETACCEPTEXSOCKADDRS \
+ {0xb5367df2,0xcbac,0x11cf,{0x95,0xca,0x00,0x80,0x5f,0x48,0xa1,0x92}}
+
+typedef struct _TRANSMIT_FILE_BUFFERS {
+ LPVOID Head;
+ DWORD HeadLength;
+ LPVOID Tail;
+ DWORD TailLength;
+} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, FAR *LPTRANSMIT_FILE_BUFFERS;
+
+typedef BOOL
+(PASCAL FAR *LPFN_TRANSMITFILE)(
+ IN SOCKET hSocket,
+ IN HANDLE hFile,
+ IN DWORD nNumberOfBytesToWrite,
+ IN DWORD nNumberOfBytesPerSend,
+ IN OUT LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers OPTIONAL,
+ IN DWORD dwReserved);
+
+typedef BOOL
+(PASCAL FAR *LPFN_ACCEPTEX)(
+ IN SOCKET sListenSocket,
+ IN SOCKET sAcceptSocket,
+ IN PVOID lpOutputBuffer,
+ IN DWORD dwReceiveDataLength,
+ IN DWORD dwLocalAddressLength,
+ IN DWORD dwRemoteAddressLength,
+ OUT LPDWORD lpdwBytesReceived,
+ IN OUT LPOVERLAPPED lpOverlapped);
+
+typedef VOID
+(PASCAL FAR *LPFN_GETACCEPTEXSOCKADDRS)(
+ IN PVOID lpOutputBuffer,
+ IN DWORD dwReceiveDataLength,
+ IN DWORD dwLocalAddressLength,
+ IN DWORD dwRemoteAddressLength,
+ OUT struct sockaddr **LocalSockaddr,
+ OUT LPINT LocalSockaddrLength,
+ OUT struct sockaddr **RemoteSockaddr,
+ OUT LPINT RemoteSockaddrLength);
+
+#if(_WIN32_WINNT >= 0x0501)
+
+typedef struct _TRANSMIT_PACKETS_ELEMENT {
+ ULONG dwElFlags;
+ ULONG cLength;
+ union {
+ struct {
+ LARGE_INTEGER nFileOffset;
+ HANDLE hFile;
+ };
+ PVOID pBuffer;
+ };
+} TRANSMIT_PACKETS_ELEMENT, *PTRANSMIT_PACKETS_ELEMENT, FAR *LPTRANSMIT_PACKETS_ELEMENT;
+
+typedef BOOL
+(PASCAL FAR *LPFN_TRANSMITPACKETS)(
+ IN SOCKET hSocket,
+ IN LPTRANSMIT_PACKETS_ELEMENT lpPacketArray OPTIONAL,
+ IN DWORD nElementCount,
+ IN DWORD nSendSize,
+ IN OUT LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN DWORD dwFlags);
+
+#define WSAID_TRANSMITPACKETS \
+ {0xd9689da0,0x1f90,0x11d3,{0x99,0x71,0x00,0xc0,0x4f,0x68,0xc8,0x76}}
+
+typedef BOOL
+(PASCAL FAR *LPFN_CONNECTEX)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN PVOID lpSendBuffer OPTIONAL,
+ IN DWORD dwSendDataLength,
+ OUT LPDWORD lpdwBytesSent,
+ IN OUT LPOVERLAPPED lpOverlapped);
+
+#define WSAID_CONNECTEX \
+ {0x25a207b9,0xddf3,0x4660,{0x8e,0xe9,0x76,0xe5,0x8c,0x74,0x06,0x3e}}
+
+typedef BOOL
+(PASCAL FAR *LPFN_DISCONNECTEX)(
+ IN SOCKET s,
+ IN OUT LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN DWORD dwFlags,
+ IN DWORD dwReserved);
+
+#define WSAID_DISCONNECTEX \
+ {0x7fda2e11,0x8630,0x436f,{0xa0, 0x31, 0xf5, 0x36, 0xa6, 0xee, 0xc1, 0x57}}
+
+#define DE_REUSE_SOCKET TF_REUSE_SOCKET
+
+#define NLA_NAMESPACE_GUID \
+ {0x6642243a,0x3ba8,0x4aa6,{0xba,0xa5,0x2e,0xb,0xd7,0x1f,0xdd,0x83}}
+
+#define NLA_SERVICE_CLASS_GUID \
+ {0x37e515,0xb5c9,0x4a43,{0xba,0xda,0x8b,0x48,0xa8,0x7a,0xd2,0x39}}
+
+#define NLA_ALLUSERS_NETWORK 0x00000001
+#define NLA_FRIENDLY_NAME 0x00000002
+
+typedef enum _NLA_BLOB_DATA_TYPE {
+ NLA_RAW_DATA = 0,
+ NLA_INTERFACE = 1,
+ NLA_802_1X_LOCATION = 2,
+ NLA_CONNECTIVITY = 3,
+ NLA_ICS = 4,
+} NLA_BLOB_DATA_TYPE, *PNLA_BLOB_DATA_TYPE;
+
+typedef enum _NLA_CONNECTIVITY_TYPE {
+ NLA_NETWORK_AD_HOC = 0,
+ NLA_NETWORK_MANAGED = 1,
+ NLA_NETWORK_UNMANAGED = 2,
+ NLA_NETWORK_UNKNOWN = 3,
+} NLA_CONNECTIVITY_TYPE, *PNLA_CONNECTIVITY_TYPE;
+
+typedef enum _NLA_INTERNET {
+ NLA_INTERNET_UNKNOWN = 0,
+ NLA_INTERNET_NO = 1,
+ NLA_INTERNET_YES = 2,
+} NLA_INTERNET, *PNLA_INTERNET;
+
+typedef struct _NLA_BLOB {
+ struct {
+ NLA_BLOB_DATA_TYPE type;
+ DWORD dwSize;
+ DWORD nextOffset;
+ } header;
+ union {
+ CHAR rawData[1];
+ struct {
+ DWORD dwType;
+ DWORD dwSpeed;
+ CHAR adapterName[1];
+ } interfaceData;
+ struct {
+ CHAR information[1];
+ } locationData;
+ struct {
+ NLA_CONNECTIVITY_TYPE type;
+ NLA_INTERNET internet;
+ } connectivity;
+ struct {
+ struct {
+ DWORD speed;
+ DWORD type;
+ DWORD state;
+ WCHAR machineName[256];
+ WCHAR sharedAdapterName[256];
+ } remote;
+ } ICS;
+ } data;
+} NLA_BLOB, *PNLA_BLOB, * FAR LPNLA_BLOB;
+
+typedef INT
+(PASCAL FAR *LPFN_WSARECVMSG)(
+ IN SOCKET s,
+ IN OUT LPWSAMSG lpMsg,
+ OUT LPDWORD lpdwNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+#define WSAID_WSARECVMSG \
+ {0xf689d7c8,0x6f1f,0x436b,{0x8a,0x53,0xe5,0x4f,0xe3,0x51,0xc3,0x22}}
+
+#endif /* (_WIN32_WINNT >= 0x0501) */
+
+#if(_WIN32_WINNT >= 0x0600)
+
+#define SIO_BSP_HANDLE _WSAIOR(IOC_WS2,27)
+#define SIO_BSP_HANDLE_SELECT _WSAIOR(IOC_WS2,28)
+#define SIO_BSP_HANDLE_POLL _WSAIOR(IOC_WS2,29)
+
+#define SIO_BASE_HANDLE _WSAIOR(IOC_WS2,34)
+
+#define SIO_EXT_SELECT _WSAIORW(IOC_WS2,30)
+#define SIO_EXT_POLL _WSAIORW(IOC_WS2,31)
+#define SIO_EXT_SENDMSG _WSAIORW(IOC_WS2,32)
+
+typedef struct {
+ int result;
+ ULONG fds;
+ INT timeout;
+ WSAPOLLFD fdArray[0];
+} WSAPOLLDATA, *LPWSAPOLLDATA;
+
+typedef struct {
+ LPWSAMSG lpMsg;
+ DWORD dwFlags;
+ LPDWORD lpNumberOfBytesSent;
+ LPWSAOVERLAPPED lpOverlapped;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine;
+} WSASENDMSG, *LPWSASENDMSG;
+
+typedef INT
+(PASCAL FAR *LPFN_WSASENDMSG)(
+ IN SOCKET s,
+ IN LPWSAMSG lpMsg,
+ IN DWORD dwFlags,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+#define WSAID_WSASENDMSG
+ {0xa441e712,0x754f,0x43ca,{0x84,0xa7,0x0d,0xee,0x44,0xcf,0x60,0x6d}}
+
+typedef INT
+(WSAAPI *LPFN_WSAPOLL)(
+ IN OUT LPWSAPOLLFD fdarray,
+ IN ULONG nfds,
+ IN INT timeout);
+
+#define WSAID_WSAPOLL \
+ {0x18C76F85,0xDC66,0x4964,{0x97,0x2E,0x23,0xC2,0x72,0x38,0x31,0x2B}}
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#if(_WIN32_WINNT < 0x0600)
+int
+PASCAL
+FAR
+WSARecvEx(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN OUT int FAR *flags);
+#else
+INT
+PASCAL
+FAR
+WSARecvEx(
+ IN SOCKET s,
+ OUT CHAR FAR *buf,
+ IN INT len,
+ IN OUT INT FAR *flags);
+#endif /* (_WIN32_WINNT < 0x0600) */
+
+BOOL
+PASCAL
+FAR
+TransmitFile(
+ IN SOCKET hSocket,
+ IN HANDLE hFile,
+ IN DWORD nNumberOfBytesToWrite,
+ IN DWORD nNumberOfBytesPerSend,
+ IN OUT LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers OPTIONAL,
+ IN DWORD dwReserved);
+
+BOOL
+PASCAL
+FAR
+AcceptEx(
+ IN SOCKET sListenSocket,
+ IN SOCKET sAcceptSocket,
+ OUT PVOID lpOutputBuffer,
+ IN DWORD dwReceiveDataLength,
+ IN DWORD dwLocalAddressLength,
+ IN DWORD dwRemoteAddressLength,
+ OUT LPDWORD lpdwBytesReceived,
+ IN OUT LPOVERLAPPED lpOverlapped);
+
+VOID
+PASCAL
+FAR
+GetAcceptExSockaddrs(
+ IN PVOID lpOutputBuffer,
+ IN DWORD dwReceiveDataLength,
+ IN DWORD dwLocalAddressLength,
+ IN DWORD dwRemoteAddressLength,
+ OUT struct sockaddr **LocalSockaddr,
+ OUT LPINT LocalSockaddrLength,
+ OUT struct sockaddr **RemoteSockaddr,
+ OUT LPINT RemoteSockaddrLength);
#ifdef __cplusplus
}
#endif
-#endif /* _MSWSOCK_H */
-
diff --git a/include/psdk/mswsockdef.h b/include/psdk/mswsockdef.h
new file mode 100644
index 00000000000..6303cf46978
--- /dev/null
+++ b/include/psdk/mswsockdef.h
@@ -0,0 +1,66 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if(_WIN32_WINNT >= 0x0600)
+#ifdef _MSC_VER
+#define MSWSOCKDEF_INLINE __inline
+#else
+#define MSWSOCKDEF_INLINE extern inline
+#endif
+#endif /* (_WIN32_WINNT>=0x0600) */
+
+#ifndef ASSERT
+#define MSWSOCKDEF_ASSERT_UNDEFINED
+#define ASSERT(exp) ((VOID) 0)
+#endif
+
+#if(_WIN32_WINNT >= 0x0600)
+
+#ifdef _WS2DEF_
+
+extern CONST UCHAR sockaddr_size[AF_MAX];
+
+MSWSOCKDEF_INLINE
+UCHAR
+SOCKADDR_SIZE(
+ IN ADDRESS_FAMILY af)
+{
+ return (UCHAR)((af < AF_MAX) ? sockaddr_size[af]
+ : sockaddr_size[AF_UNSPEC]);
+}
+
+MSWSOCKDEF_INLINE
+SCOPE_LEVEL
+ScopeLevel(
+ IN SCOPE_ID ScopeId)
+{
+ return (SCOPE_LEVEL)ScopeId.Level;
+}
+
+#endif /* _WS2DEF_ */
+
+#define SIO_SET_COMPATIBILITY_MODE _WSAIOW(IOC_VENDOR,300)
+
+typedef enum _WSA_COMPATIBILITY_BEHAVIOR_ID {
+ WsaBehaviorAll = 0,
+ WsaBehaviorReceiveBuffering,
+ WsaBehaviorAutoTuning
+} WSA_COMPATIBILITY_BEHAVIOR_ID, *PWSA_COMPATIBILITY_BEHAVIOR_ID;
+
+typedef struct _WSA_COMPATIBILITY_MODE {
+ WSA_COMPATIBILITY_BEHAVIOR_ID BehaviorId;
+ ULONG TargetOsVersion;
+} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;
+
+#endif /* (_WIN32_WINNT>=0x0600) */
+
+#ifdef MSWSOCKDEF_ASSERT_UNDEFINED
+#undef ASSERT
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/psdk/msxml2.idl b/include/psdk/msxml2.idl
index 89914004955..f2841a5f3f2 100644
--- a/include/psdk/msxml2.idl
+++ b/include/psdk/msxml2.idl
@@ -85,6 +85,22 @@ interface IMXAttributes;
interface IMXReaderControl;
interface IMXWriter;
+interface IXMLDOMSchemaCollection2;
+interface ISchemaStringCollection;
+interface ISchemaItemCollection;
+interface ISchemaItem;
+interface ISchema;
+interface ISchemaParticle;
+interface ISchemaAttribute;
+interface ISchemaElement;
+interface ISchemaType;
+interface ISchemaComplexType;
+interface ISchemaAttributeGroup;
+interface ISchemaModelGroup;
+interface ISchemaAny;
+interface ISchemaIdentityConstraint;
+interface ISchemaNotation;
+
cpp_quote("#define DOMDocument DOMDocument2")
cpp_quote("#define CLSID_DOMDocument CLSID_DOMDocument2")
@@ -108,6 +124,134 @@ typedef enum tagDOMNodeType
} DOMNodeType;
cpp_quote("#endif /* __WIDL_XMLDOM_H */")
+typedef enum _SOMITEMTYPE
+{
+ SOMITEM_SCHEMA = 0x1000,
+ SOMITEM_ATTRIBUTE = 0x1001,
+ SOMITEM_ATTRIBUTEGROUP = 0x1002,
+ SOMITEM_NOTATION = 0x1003,
+ SOMITEM_IDENTITYCONSTRAINT = 0x1100,
+ SOMITEM_KEY = 0x1101,
+ SOMITEM_KEYREF = 0x1102,
+ SOMITEM_UNIQUE = 0x1103,
+ SOMITEM_ANYTYPE = 0x2000,
+ SOMITEM_DATATYPE = 0x2100,
+ SOMITEM_DATATYPE_ANYTYPE = 0x2101,
+ SOMITEM_DATATYPE_ANYURI = 0x2102,
+ SOMITEM_DATATYPE_BASE64BINARY = 0x2103,
+ SOMITEM_DATATYPE_BOOLEAN = 0x2104,
+ SOMITEM_DATATYPE_BYTE = 0x2105,
+ SOMITEM_DATATYPE_DATE = 0x2106,
+ SOMITEM_DATATYPE_DATETIME = 0x2107,
+ SOMITEM_DATATYPE_DAY = 0x2108,
+ SOMITEM_DATATYPE_DECIMAL = 0x2109,
+ SOMITEM_DATATYPE_DOUBLE = 0x210A,
+ SOMITEM_DATATYPE_DURATION = 0x210B,
+ SOMITEM_DATATYPE_ENTITIES = 0x210C,
+ SOMITEM_DATATYPE_ENTITY = 0x210D,
+ SOMITEM_DATATYPE_FLOAT = 0x210E,
+ SOMITEM_DATATYPE_HEXBINARY = 0x210F,
+ SOMITEM_DATATYPE_ID = 0x2110,
+ SOMITEM_DATATYPE_IDREF = 0x2111,
+ SOMITEM_DATATYPE_IDREFS = 0x2112,
+ SOMITEM_DATATYPE_INT = 0x2113,
+ SOMITEM_DATATYPE_INTEGER = 0x2114,
+ SOMITEM_DATATYPE_LANGUAGE = 0x2115,
+ SOMITEM_DATATYPE_LONG = 0x2116,
+ SOMITEM_DATATYPE_MONTH = 0x2117,
+ SOMITEM_DATATYPE_MONTHDAY = 0x2118,
+ SOMITEM_DATATYPE_NAME = 0x2119,
+ SOMITEM_DATATYPE_NCNAME = 0x211A,
+ SOMITEM_DATATYPE_NEGATIVEINTEGER = 0x211B,
+ SOMITEM_DATATYPE_NMTOKEN = 0x211C,
+ SOMITEM_DATATYPE_NMTOKENS = 0x211D,
+ SOMITEM_DATATYPE_NONNEGATIVEINTEGER = 0x211E,
+ SOMITEM_DATATYPE_NONPOSITIVEINTEGER = 0x211F,
+ SOMITEM_DATATYPE_NORMALIZEDSTRING = 0x2120,
+ SOMITEM_DATATYPE_NOTATION = 0x2121,
+ SOMITEM_DATATYPE_POSITIVEINTEGER = 0x2122,
+ SOMITEM_DATATYPE_QNAME = 0x2123,
+ SOMITEM_DATATYPE_SHORT = 0x2124,
+ SOMITEM_DATATYPE_STRING = 0x2125,
+ SOMITEM_DATATYPE_TIME = 0x2126,
+ SOMITEM_DATATYPE_TOKEN = 0x2127,
+ SOMITEM_DATATYPE_UNSIGNEDBYTE = 0x2128,
+ SOMITEM_DATATYPE_UNSIGNEDINT = 0x2129,
+ SOMITEM_DATATYPE_UNSIGNEDLONG = 0x212A,
+ SOMITEM_DATATYPE_UNSIGNEDSHORT = 0x212B,
+ SOMITEM_DATATYPE_YEAR = 0x212C,
+ SOMITEM_DATATYPE_YEARMONTH = 0x212D,
+ SOMITEM_DATATYPE_ANYSIMPLETYPE = 0x21FF,
+ SOMITEM_SIMPLETYPE = 0x2200,
+ SOMITEM_COMPLEXTYPE = 0x2400,
+ SOMITEM_PARTICLE = 0x4000,
+ SOMITEM_ANY = 0x4001,
+ SOMITEM_ANYATTRIBUTE = 0x4002,
+ SOMITEM_ELEMENT = 0x4003,
+ SOMITEM_GROUP = 0x4100,
+ SOMITEM_ALL = 0x4101,
+ SOMITEM_CHOICE = 0x4102,
+ SOMITEM_SEQUENCE = 0x4103,
+ SOMITEM_EMPTYPARTICLE = 0x4104,
+ SOMITEM_NULL = 0x0800,
+ SOMITEM_NULL_TYPE = 0x2800,
+ SOMITEM_NULL_ANY = 0x4801,
+ SOMITEM_NULL_ANYATTRIBUTE = 0x4802,
+ SOMITEM_NULL_ELEMENT = 0x4803,
+} SOMITEMTYPE;
+
+typedef enum _SCHEMAUSE
+{
+ SCHEMAUSE_OPTIONAL,
+ SCHEMAUSE_PROHIBITED,
+ SCHEMAUSE_REQUIRED,
+} SCHEMAUSE;
+
+typedef enum _SCHEMADERIVATIONMETHOD
+{
+ SCHEMADERIVATIONMETHOD_EMPTY = 0x0000,
+ SCHEMADERIVATIONMETHOD_SUBSTITUTION = 0x0001,
+ SCHEMADERIVATIONMETHOD_EXTENSION = 0x0002,
+ SCHEMADERIVATIONMETHOD_RESTRICTION = 0x0004,
+ SCHEMADERIVATIONMETHOD_LIST = 0x0008,
+ SCHEMADERIVATIONMETHOD_UNION = 0x0010,
+ SCHEMADERIVATIONMETHOD_ALL = 0x00FF,
+ SCHEMADERIVATIONMETHOD_NONE = 0x0100,
+} SCHEMADERIVATIONMETHOD;
+
+typedef enum _SCHEMACONTENTTYPE
+{
+ SCHEMACONTENTTYPE_EMPTY,
+ SCHEMACONTENTTYPE_TEXTONLY,
+ SCHEMACONTENTTYPE_ELEMENTONLY,
+ SCHEMACONTENTTYPE_MIXED,
+} SCHEMACONTENTTYPE;
+
+typedef enum _SCHEMAPROCESSCONTENTS
+{
+ SCHEMAPROCESSCONTENTS_NONE,
+ SCHEMAPROCESSCONTENTS_SKIP,
+ SCHEMAPROCESSCONTENTS_LAX,
+ SCHEMAPROCESSCONTENTS_STRICT,
+} SCHEMAPROCESSCONTENTS;
+
+typedef enum _SCHEMAWHITESPACE
+{
+ SCHEMAWHITESPACE_NONE = -1,
+ SCHEMAWHITESPACE_PRESERVE = 0,
+ SCHEMAWHITESPACE_REPLACE = 1,
+ SCHEMAWHITESPACE_COLLAPSE = 2,
+} SCHEMAWHITESPACE;
+
+
+typedef enum _SCHEMATYPEVARIETY
+{
+ SCHEMATYPEVARIETY_NONE = -1,
+ SCHEMATYPEVARIETY_ATOMIC = 0,
+ SCHEMATYPEVARIETY_LIST = 1,
+ SCHEMATYPEVARIETY_UNION = 2,
+} SCHEMATYPEVARIETY;
+
[
local,
object,
@@ -417,6 +561,35 @@ interface IXMLDOMSchemaCollection : IDispatch
HRESULT _newEnum([retval, out] IUnknown **ppUnk);
}
+[
+ local,
+ object,
+ uuid(50ea08b0-dd1b-4664-9a50-c2f40f4bd79a),
+]
+interface IXMLDOMSchemaCollection2 : IXMLDOMSchemaCollection
+{
+ [id(DISPID_SOM_VALIDATE)]
+ HRESULT validate();
+
+ [propput, id(DISPID_SOM_VALIDATEONLOAD)]
+ HRESULT validateOnLoad(
+ [in] VARIANT_BOOL validateOnLoad);
+
+ [propget, id(DISPID_SOM_VALIDATEONLOAD)]
+ HRESULT validateOnLoad(
+ [out,retval] VARIANT_BOOL* validateOnLoad);
+
+ [id(DISPID_SOM_GETSCHEMA)]
+ HRESULT getSchema(
+ [in] BSTR namespaceURI,
+ [out,retval] ISchema** schema);
+
+ [id(DISPID_SOM_GETDECLARATION)]
+ HRESULT getDeclaration(
+ [in] IXMLDOMNode* node,
+ [out,retval]ISchemaItem** item);
+};
+
[
local,
object,
@@ -1106,6 +1279,15 @@ coclass FreeThreadedDOMDocument30
[default, source] dispinterface XMLDOMDocumentEvents;
}
+[
+ uuid(88d969c1-f192-11d4-a65f-0040963251e5),
+]
+coclass FreeThreadedDOMDocument40
+{
+ [default] interface IXMLDOMDocument2;
+ [default, source] dispinterface XMLDOMDocumentEvents;
+};
+
[
uuid(373984c9-b845-449b-91e7-45ac83036ade)
]
@@ -1130,6 +1312,14 @@ coclass XMLSchemaCache30
[default] interface IXMLDOMSchemaCollection;
}
+[
+ uuid(88d969c2-f192-11d4-a65f-0040963251e5)
+]
+coclass XMLSchemaCache40
+{
+ [default] interface IXMLDOMSchemaCollection2;
+};
+
[
uuid(2933BF94-7B36-11d2-B20E-00C04F983E60)
]
@@ -1959,6 +2149,443 @@ interface IMXWriter : IDispatch
HRESULT flush();
};
+[
+ local,
+ object,
+ uuid(50ea08b1-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaStringCollection : IDispatch
+{
+ [id(DISPID_VALUE), propget]
+ HRESULT item(
+ [in] long index,
+ [out,retval] BSTR* bstr);
+
+ [id(DISPID_SOM_LENGTH), propget]
+ HRESULT length(
+ [out,retval] long* length);
+
+ [id(DISPID_NEWENUM), hidden, restricted, propget]
+ HRESULT _newEnum(
+ [out,retval] IUnknown** ppunk);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b2-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaItemCollection : IDispatch
+{
+ [id(DISPID_VALUE), propget]
+ HRESULT item(
+ [in] long index,
+ [out,retval]ISchemaItem** item);
+
+ [id(DISPID_SOM_ITEMBYNAME)]
+ HRESULT itemByName(
+ [in] BSTR name,
+ [out,retval] ISchemaItem** item);
+
+ [id(DISPID_SOM_ITEMBYQNAME)]
+ HRESULT itemByQName(
+ [in] BSTR name,
+ [in] BSTR namespaceURI,
+ [out,retval] ISchemaItem** item);
+
+ [id(DISPID_SOM_LENGTH), propget]
+ HRESULT length(
+ [out,retval]long* length);
+
+ [id(DISPID_NEWENUM), hidden, restricted, propget]
+ HRESULT _newEnum(
+ [out,retval]IUnknown** ppunk);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b3-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaItem : IDispatch
+{
+ [id(DISPID_SOM_NAME), propget]
+ HRESULT name(
+ [out,retval] BSTR* name);
+
+ [id(DISPID_SOM_NAMESPACEURI), propget]
+ HRESULT namespaceURI(
+ [out,retval] BSTR* namespaceURI);
+
+ [id(DISPID_SOM_SCHEMA), propget]
+ HRESULT schema(
+ [out,retval] ISchema** schema);
+
+ [id(DISPID_SOM_ID), propget]
+ HRESULT id(
+ [out,retval] BSTR* id);
+
+ [id(DISPID_SOM_ITEMTYPE), propget]
+ HRESULT itemType(
+ [out,retval] SOMITEMTYPE* itemType);
+
+ [id(DISPID_SOM_UNHANDLEDATTRS), propget]
+ HRESULT unhandledAttributes(
+ [out,retval] IVBSAXAttributes** attributes);
+
+ [id(DISPID_SOM_WRITEANNOTATION)]
+ HRESULT writeAnnotation(
+ [in] IUnknown* annotationSink,
+ [out,retval] VARIANT_BOOL* isWritten);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b4-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchema : ISchemaItem
+{
+ [id(DISPID_SOM_TARGETNAMESPACE), propget]
+ HRESULT targetNamespace(
+ [out,retval] BSTR* targetNamespace);
+
+ [id(DISPID_SOM_VERSION), propget]
+ HRESULT version(
+ [out,retval] BSTR* version);
+
+ [id(DISPID_SOM_TYPES), propget]
+ HRESULT types(
+ [out,retval] ISchemaItemCollection** types);
+
+ [id(DISPID_SOM_ELEMENTS), propget]
+ HRESULT elements(
+ [out,retval] ISchemaItemCollection** elements);
+
+ [id(DISPID_SOM_ATTRIBUTES), propget]
+ HRESULT attributes(
+ [out,retval] ISchemaItemCollection** attributes);
+
+ [id(DISPID_SOM_ATTRIBUTEGROUPS), propget]
+ HRESULT attributeGroups(
+ [out,retval] ISchemaItemCollection** attributeGroups);
+
+ [id(DISPID_SOM_MODELGROUPS), propget]
+ HRESULT modelGroups(
+ [out,retval] ISchemaItemCollection** modelGroups);
+
+ [id(DISPID_SOM_NOTATIONS), propget]
+ HRESULT notations(
+ [out,retval] ISchemaItemCollection** notations);
+
+ [id(DISPID_SOM_SCHEMALOCATIONS), propget]
+ HRESULT schemaLocations(
+ [out,retval] ISchemaStringCollection** schemaLocations);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b5-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaParticle : ISchemaItem
+{
+ [id(DISPID_SOM_MINOCCURS), propget]
+ HRESULT minOccurs(
+ [out,retval] VARIANT* minOccurs);
+
+ [id(DISPID_SOM_MAXOCCURS), propget]
+ HRESULT maxOccurs(
+ [out,retval] VARIANT* maxOccurs);
+};
+
+[
+ object,
+ uuid(50ea08b6-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaAttribute : ISchemaItem
+{
+ [id(DISPID_SOM_TYPE), propget]
+ HRESULT type(
+ [out,retval] ISchemaType** type);
+
+ [id(DISPID_SOM_SCOPE), propget]
+ HRESULT scope(
+ [out,retval] ISchemaComplexType** scope);
+
+ [id(DISPID_SOM_DEFAULTVALUE), propget]
+ HRESULT defaultValue(
+ [out,retval]BSTR* defaultValue);
+
+ [id(DISPID_SOM_FIXEDVALUE), propget]
+ HRESULT fixedValue(
+ [out,retval] BSTR* fixedValue);
+
+ [id(DISPID_SOM_USE), propget]
+ HRESULT use(
+ [out,retval] SCHEMAUSE* use);
+
+ [id(DISPID_SOM_ISREFERENCE), propget]
+ HRESULT isReference(
+ [out,retval] VARIANT_BOOL* reference);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b7-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaElement : ISchemaParticle
+{
+ [id(DISPID_SOM_TYPE), propget]
+ HRESULT type(
+ [out,retval] ISchemaType** type);
+
+ [id(DISPID_SOM_SCOPE), propget]
+ HRESULT scope(
+ [out,retval] ISchemaComplexType** scope);
+
+ [id(DISPID_SOM_DEFAULTVALUE), propget]
+ HRESULT defaultValue(
+ [out,retval] BSTR* defaultValue);
+
+ [id(DISPID_SOM_FIXEDVALUE), propget]
+ HRESULT fixedValue(
+ [out,retval] BSTR* fixedValue);
+
+ [id(DISPID_SOM_ISNILLABLE), propget]
+ HRESULT isNillable(
+ [out,retval] VARIANT_BOOL* nillable);
+
+ [id(DISPID_SOM_IDCONSTRAINTS), propget]
+ HRESULT identityConstraints(
+ [out,retval] ISchemaItemCollection** constraints);
+
+ [id(DISPID_SOM_SUBSTITUTIONGROUP), propget]
+ HRESULT substitutionGroup(
+ [out,retval] ISchemaElement** element);
+
+ [id(DISPID_SOM_EXCLUSIONS), propget]
+ HRESULT substitutionGroupExclusions(
+ [out,retval] SCHEMADERIVATIONMETHOD* exclusions);
+
+ [id(DISPID_SOM_DISALLOWED), propget]
+ HRESULT disallowedSubstitutions(
+ [out,retval] SCHEMADERIVATIONMETHOD* disallowed);
+
+ [id(DISPID_SOM_ISABSTRACT), propget]
+ HRESULT isAbstract(
+ [out,retval] VARIANT_BOOL* abstract);
+
+ [id(DISPID_SOM_ISREFERENCE), propget]
+ HRESULT isReference(
+ [out,retval] VARIANT_BOOL* reference);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b8-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaType : ISchemaItem
+{
+ [id(DISPID_SOM_BASETYPES), propget]
+ HRESULT baseTypes(
+ [out,retval] ISchemaItemCollection** baseTypes);
+
+ [id(DISPID_SOM_FINAL), propget]
+ HRESULT final(
+ [out,retval] SCHEMADERIVATIONMETHOD* final);
+
+ [id(DISPID_SOM_VARIETY), propget]
+ HRESULT variety(
+ [out,retval] SCHEMATYPEVARIETY* variety);
+
+ [id(DISPID_SOM_DERIVEDBY), propget]
+ HRESULT derivedBy(
+ [out,retval] SCHEMADERIVATIONMETHOD* derivedBy);
+
+ [id(DISPID_SOM_ISVALID)]
+ HRESULT isValid(
+ [in] BSTR data,
+ [out,retval] VARIANT_BOOL* valid);
+
+ [id(DISPID_SOM_MINEXCLUSIVE), propget]
+ HRESULT minExclusive(
+ [out,retval]BSTR* minExclusive);
+
+ [id(DISPID_SOM_MININCLUSIVE), propget]
+ HRESULT minInclusive(
+ [out,retval] BSTR* minInclusive);
+
+ [id(DISPID_SOM_MAXEXCLUSIVE), propget]
+ HRESULT maxExclusive(
+ [out,retval] BSTR* maxExclusive);
+
+ [id(DISPID_SOM_MAXINCLUSIVE), propget]
+ HRESULT maxInclusive(
+ [out,retval] BSTR* maxInclusive);
+
+ [id(DISPID_SOM_TOTALDIGITS), propget]
+ HRESULT totalDigits(
+ [out,retval] VARIANT* totalDigits);
+
+ [id(DISPID_SOM_FRACTIONDIGITS), propget]
+ HRESULT fractionDigits(
+ [out,retval] VARIANT* fractionDigits);
+
+ [id(DISPID_SOM_LENGTH), propget]
+ HRESULT length(
+ [out,retval] VARIANT* length);
+
+ [id(DISPID_SOM_MINLENGTH), propget]
+ HRESULT minLength(
+ [out,retval]VARIANT* minLength);
+
+ [id(DISPID_SOM_MAXLENGTH), propget]
+ HRESULT maxLength(
+ [out,retval]VARIANT* maxLength);
+
+ [id(DISPID_SOM_ENUMERATION), propget]
+ HRESULT enumeration(
+ [out,retval] ISchemaStringCollection** enumeration);
+
+ [id(DISPID_SOM_WHITESPACE), propget]
+ HRESULT whitespace(
+ [out,retval]SCHEMAWHITESPACE* whitespace);
+
+ [id(DISPID_SOM_PATTERNS), propget]
+ HRESULT patterns(
+ [out,retval] ISchemaStringCollection** patterns);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08b9-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaComplexType : ISchemaType
+{
+ [id(DISPID_SOM_ISABSTRACT), propget]
+ HRESULT isAbstract(
+ [out,retval] VARIANT_BOOL* abstract);
+
+ [id(DISPID_SOM_ANYATTRIBUTE), propget]
+ HRESULT anyAttribute(
+ [out,retval] ISchemaAny** anyAttribute);
+
+ [id(DISPID_SOM_ATTRIBUTES), propget]
+ HRESULT attributes(
+ [out,retval] ISchemaItemCollection** attributes);
+
+ [id(DISPID_SOM_CONTENTTYPE), propget]
+ HRESULT contentType(
+ [out,retval] SCHEMACONTENTTYPE* contentType);
+
+ [id(DISPID_SOM_CONTENTMODEL), propget]
+ HRESULT contentModel(
+ [out,retval] ISchemaModelGroup** contentModel);
+
+ [id(DISPID_SOM_PROHIBITED), propget]
+ HRESULT prohibitedSubstitutions(
+ [out,retval] SCHEMADERIVATIONMETHOD* prohibited);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08ba-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaAttributeGroup : ISchemaItem
+{
+ [id(DISPID_SOM_ANYATTRIBUTE), propget]
+ HRESULT anyAttribute(
+ [out,retval] ISchemaAny** anyAttribute);
+
+ [id(DISPID_SOM_ATTRIBUTES), propget]
+ HRESULT attributes(
+ [out,retval] ISchemaItemCollection** attributes);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08bb-dd1b-4664-9a50-c2f40f4bd79a),
+ dual,
+]
+interface ISchemaModelGroup : ISchemaParticle
+{
+ [id(DISPID_SOM_PARTICLES), propget]
+ HRESULT particles(
+ [out,retval] ISchemaItemCollection** particles);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08bc-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaAny : ISchemaParticle
+{
+ [id(DISPID_SOM_NAMESPACES), propget]
+ HRESULT namespaces(
+ [out,retval] ISchemaStringCollection** namespaces);
+
+ [id(DISPID_SOM_PROCESSCONTENTS), propget]
+ HRESULT processContents(
+ [out,retval] SCHEMAPROCESSCONTENTS* processContents);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08bd-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaIdentityConstraint : ISchemaItem
+{
+ [id(DISPID_SOM_SELECTOR), propget]
+ HRESULT selector(
+ [out,retval] BSTR* selector);
+
+ [id(DISPID_SOM_FIELDS), propget]
+ HRESULT fields(
+ [out,retval] ISchemaStringCollection** fields);
+
+ [id(DISPID_SOM_REFERENCEDKEY), propget]
+ HRESULT referencedKey(
+ [out,retval] ISchemaIdentityConstraint** key);
+};
+
+[
+ local,
+ object,
+ uuid(50ea08be-dd1b-4664-9a50-c2f40f4bd79a),
+ dual
+]
+interface ISchemaNotation : ISchemaItem
+{
+ [id(DISPID_SOM_SYSTEMIDENTIFIER), propget]
+ HRESULT systemIdentifier(
+ [out,retval] BSTR* uri);
+
+ [id(DISPID_SOM_PUBLICIDENTIFIER), propget]
+ HRESULT publicIdentifier(
+ [out,retval] BSTR* uri);
+};
+
+
[
uuid(079aa557-4a18-424a-8eee-e39f0a8d41b9)
]
@@ -2028,6 +2655,26 @@ coclass MXXMLWriter30
interface IVBSAXLexicalHandler;
};
+[
+ uuid(88d969c8-f192-11d4-a65f-0040963251e5),
+]
+coclass MXXMLWriter40
+{
+ [default] interface IMXWriter;
+
+ interface ISAXContentHandler;
+ interface ISAXDeclHandler;
+ interface ISAXDTDHandler;
+ interface ISAXErrorHandler;
+ interface ISAXLexicalHandler;
+
+ interface IVBSAXContentHandler;
+ interface IVBSAXDeclHandler;
+ interface IVBSAXDTDHandler;
+ interface IVBSAXErrorHandler;
+ interface IVBSAXLexicalHandler;
+};
+
[
uuid(4dd441ad-526d-4a77-9f1b-9841ed802fb0)
]
@@ -2048,5 +2695,15 @@ coclass SAXAttributes30
interface ISAXAttributes;
};
+[
+ uuid(88d969ca-f192-11d4-a65f-0040963251e5),
+]
+coclass SAXAttributes40
+{
+ [default] interface IMXAttributes;
+ interface IVBSAXAttributes;
+ interface ISAXAttributes;
+};
+
} /* Library MSXML */
diff --git a/include/psdk/msxml2did.h b/include/psdk/msxml2did.h
index f2adaaff427..d7489d0524f 100644
--- a/include/psdk/msxml2did.h
+++ b/include/psdk/msxml2did.h
@@ -394,5 +394,87 @@
#define DISPID_MX_READER_CONTROL_RESUME 0x00000577
#define DISPID_MX_READER_CONTROL_SUSPEND 0x00000578
+#define DISPID_MX_SCHEMADECLHANDLER 0x0000057a
+#define DISPID_MX_SCHEMADECLHANDLER_SCHEMAELEMENTDECL 0x0000057b
+
+#define DISPID_MX_NSMGR 0x0000057d
+#define DISPID_MX_NSMGR_ALLOWOVERRIDE 0x0000057e
+#define DISPID_MX_NSMGR_RESET 0x0000057f
+#define DISPID_MX_NSMGR_PUSHCONTEXT 0x00000580
+#define DISPID_MX_NSMGR_PUSHNODECONTEXT 0x00000581
+#define DISPID_MX_NSMGR_POPCONTEXT 0x00000582
+#define DISPID_MX_NSMGR_DECLAREPREFIX 0x00000583
+#define DISPID_MX_NSMGR_GETDECLAREDPREFIXES 0x00000584
+#define DISPID_MX_NSMGR_GETPREFIXES 0x00000585
+#define DISPID_MX_NSMGR_GETURI 0x00000586
+#define DISPID_MX_NSMGR_GETURIFROMNODE 0x00000587
+#define DISPID_MX_NSMGR_LENGTH 0x00000588
+
+#define DISPID_SOM_VALIDATE 0x0000058b
+#define DISPID_SOM_VALIDATEONLOAD 0x0000058c
+#define DISPID_SOM_GETSCHEMA 0x0000058d
+#define DISPID_SOM_GETDECLARATION 0x0000058e
+#define DISPID_SOM_ITEMBYNAME 0x0000058f
+#define DISPID_SOM_ITEMBYQNAME 0x00000590
+#define DISPID_SOM_ANYATTRIBUTE 0x00000591
+#define DISPID_SOM_ATTRIBUTEGROUPS 0x00000592
+#define DISPID_SOM_ATTRIBUTES 0x00000593
+#define DISPID_SOM_BASETYPES 0x00000594
+#define DISPID_SOM_CONTENTMODEL 0x00000595
+#define DISPID_SOM_CONTENTTYPE 0x00000596
+#define DISPID_SOM_DEFAULTVALUE 0x00000597
+#define DISPID_SOM_DERIVEDBY 0x00000598
+#define DISPID_SOM_DISALLOWED 0x00000599
+#define DISPID_SOM_ELEMENTS 0x0000059a
+#define DISPID_SOM_ENUMERATION 0x0000059b
+#define DISPID_SOM_FIELDS 0x0000059c
+#define DISPID_SOM_FINAL 0x0000059d
+#define DISPID_SOM_FIXEDVALUE 0x0000059e
+#define DISPID_SOM_FRACTIONDIGITS 0x0000059f
+#define DISPID_SOM_ID 0x000005a0
+#define DISPID_SOM_IDCONSTRAINTS 0x000005a1
+#define DISPID_SOM_ISABSTRACT 0x000005a2
+#define DISPID_SOM_ISNILLABLE 0x000005a3
+#define DISPID_SOM_ISREFERENCE 0x000005a4
+#define DISPID_SOM_ISVALID 0x000005a5
+#define DISPID_SOM_ITEMTYPE 0x000005a6
+#define DISPID_SOM_LENGTH 0x000005a7
+#define DISPID_SOM_MAXEXCLUSIVE 0x000005a8
+#define DISPID_SOM_MAXINCLUSIVE 0x000005a9
+#define DISPID_SOM_MAXLENGTH 0x000005aa
+#define DISPID_SOM_MAXOCCURS 0x000005ab
+#define DISPID_SOM_MINEXCLUSIVE 0x000005ac
+#define DISPID_SOM_MININCLUSIVE 0x000005ad
+#define DISPID_SOM_MINLENGTH 0x000005ae
+#define DISPID_SOM_MINOCCURS 0x000005af
+#define DISPID_SOM_MODELGROUPS 0x000005b0
+#define DISPID_SOM_NAME 0x000005b1
+#define DISPID_SOM_NAMESPACES 0x000005b2
+#define DISPID_SOM_NAMESPACEURI 0x000005b3
+#define DISPID_SOM_NOTATIONS 0x000005b4
+#define DISPID_SOM_PARTICLES 0x000005b5
+#define DISPID_SOM_PATTERNS 0x000005b6
+#define DISPID_SOM_PROCESSCONTENTS 0x000005b7
+#define DISPID_SOM_PROHIBITED 0x000005b8
+#define DISPID_SOM_PUBLICIDENTIFIER 0x000005b9
+#define DISPID_SOM_REFERENCEDKEY 0x000005ba
+#define DISPID_SOM_SCHEMA 0x000005bb
+#define DISPID_SOM_SCHEMALOCATIONS 0x000005bc
+#define DISPID_SOM_SCOPE 0x000005bd
+#define DISPID_SOM_SELECTOR 0x000005be
+#define DISPID_SOM_SUBSTITUTIONGROUP 0x000005bf
+#define DISPID_SOM_EXCLUSIONS 0x000005c0
+#define DISPID_SOM_SYSTEMIDENTIFIER 0x000005c1
+#define DISPID_SOM_TARGETNAMESPACE 0x000005c2
+#define DISPID_SOM_TOTALDIGITS 0x000005c3
+#define DISPID_SOM_TYPE 0x000005c4
+#define DISPID_SOM_TYPES 0x000005c5
+#define DISPID_SOM_UNHANDLEDATTRS 0x000005c6
+#define DISPID_SOM_USE 0x000005c7
+#define DISPID_SOM_VARIETY 0x000005c8
+#define DISPID_SOM_VERSION 0x000005c9
+#define DISPID_SOM_WHITESPACE 0x000005ca
+#define DISPID_SOM_WRITEANNOTATION 0x000005cb
+
#endif /* __MSXML2DID_H__ */
diff --git a/include/ddk/nettypes.h b/include/psdk/nettypes.h
similarity index 74%
rename from include/ddk/nettypes.h
rename to include/psdk/nettypes.h
index d301f1354e7..7762bf1f2c5 100644
--- a/include/ddk/nettypes.h
+++ b/include/psdk/nettypes.h
@@ -1,32 +1,22 @@
-
-#ifndef _NETTYPES_
-#define _NETTYPES_
+#pragma once
#define HARDWARE_ADDRESS_LENGTH 6
#define NETMAN_VARTYPE_ULONG 0
#define NETMAN_VARTYPE_HARDWARE_ADDRESS 1
#define NETMAN_VARTYPE_STRING 2
-
typedef ULONG OFFSET;
-typedef struct _FLAT_STRING
-{
+typedef struct _FLAT_STRING {
SHORT MaximumLength;
SHORT Length;
char Buffer [1];
} FLAT_STRING, *PFLAT_STRING;
-
-typedef struct _NETWORK_NAME
-{
+typedef struct _NETWORK_NAME {
FLAT_STRING Name;
} NETWORK_NAME, *PNETWORK_NAME;
-typedef struct _HARDWARE_ADDRESS
-{
+typedef struct _HARDWARE_ADDRESS {
UCHAR Address [HARDWARE_ADDRESS_LENGTH];
} HARDWARE_ADDRESS, *PHARDWARE_ADDRESS;
-
-#endif
-
diff --git a/include/psdk/newdev.h b/include/psdk/newdev.h
index 6decf10ef4f..4034a9cce7c 100644
--- a/include/psdk/newdev.h
+++ b/include/psdk/newdev.h
@@ -20,14 +20,15 @@
*
*/
-#ifndef __NEWDEV_H
-#define __NEWDEV_H
+#pragma once
+
+#include
#ifdef __cplusplus
extern "C" {
#endif
-#pragma pack(push,4)
+#include
/* UpdateDriverForPlugAndPlayDevices.InstallFlags constants */
#define INSTALLFLAG_FORCE 0x00000001
@@ -35,21 +36,25 @@ extern "C" {
#define INSTALLFLAG_NONINTERACTIVE 0x00000004
#define INSTALLFLAG_BITS 0x00000007
-BOOL WINAPI
-UpdateDriverForPlugAndPlayDevicesA(
- HWND hwndParent,
- LPCSTR HardwareId,
- LPCSTR FullInfPath,
- DWORD InstallFlags,
- PBOOL bRebootRequired OPTIONAL);
+#if (WINVER >= _WIN32_WINNT_WIN2K)
-BOOL WINAPI
+BOOL
+WINAPI
+UpdateDriverForPlugAndPlayDevicesA(
+ HWND hwndParent,
+ LPCSTR HardwareId,
+ LPCSTR FullInfPath,
+ DWORD InstallFlags,
+ PBOOL bRebootRequired OPTIONAL);
+
+BOOL
+WINAPI
UpdateDriverForPlugAndPlayDevicesW(
- HWND hwndParent,
- LPCWSTR HardwareId,
- LPCWSTR FullInfPath,
- DWORD InstallFlags,
- PBOOL bRebootRequired OPTIONAL);
+ HWND hwndParent,
+ LPCWSTR HardwareId,
+ LPCWSTR FullInfPath,
+ DWORD InstallFlags,
+ PBOOL bRebootRequired OPTIONAL);
#ifdef UNICODE
#define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesW
@@ -57,10 +62,96 @@ UpdateDriverForPlugAndPlayDevicesW(
#define UpdateDriverForPlugAndPlayDevices UpdateDriverForPlugAndPlayDevicesA
#endif /* UNICODE */
-#pragma pack(pop)
+#endif /* (WINVER >= _WIN32_WINNT_WIN2K) */
+
+#if (WINVER >= _WIN32_WINNT_VISTA)
+
+#define DIIDFLAG_SHOWSEARCHUI 0x00000001
+#define DIIDFLAG_NOFINISHINSTALLUI 0x00000002
+#define DIIDFLAG_INSTALLNULLDRIVER 0x00000004
+#define DIIDFLAG_BITS 0x00000007
+
+#define DIIRFLAG_INF_ALREADY_COPIED 0x00000001
+#define DIIRFLAG_FORCE_INF 0x00000002
+#define DIIRFLAG_HW_USING_THE_INF 0x00000004
+#define DIIRFLAG_HOTPATCH 0x00000008
+#define DIIRFLAG_NOBACKUP 0x00000010
+#define DIIRFLAG_BITS ( DIIRFLAG_FORCE_INF | DIIRFLAG_HOTPATCH)
+#define DIIRFLAG_SYSTEM_BITS ( DIIRFLAG_INF_ALREADY_COPIED |\
+ DIIRFLAG_FORCE_INF |\
+ DIIRFLAG_HW_USING_THE_INF |\
+ DIIRFLAG_HOTPATCH |\
+ DIIRFLAG_NOBACKUP )
+
+#define ROLLBACK_FLAG_NO_UI 0x00000001
+#define ROLLBACK_BITS 0x00000001
+
+BOOL
+WINAPI
+DiInstallDevice(
+ HWND hwndParent OPTIONAL,
+ HDEVINFO DeviceInfoSet,
+ PSP_DEVINFO_DATA DeviceInfoData,
+ PSP_DRVINFO_DATA DriverInfoData OPTIONAL,
+ DWORD Flags,
+ PBOOL NeedReboot OPTIONAL);
+
+BOOL
+WINAPI
+DiShowUpdateDevice(
+ HWND hwndParent OPTIONAL,
+ HDEVINFO DeviceInfoSet,
+ PSP_DEVINFO_DATA DeviceInfoData,
+ DWORD Flags,
+ PBOOL NeedReboot OPTIONAL);
+
+BOOL
+WINAPI
+DiRollbackDriver(
+ HDEVINFO DeviceInfoSet,
+ PSP_DEVINFO_DATA DeviceInfoData,
+ HWND hwndParent OPTIONAL,
+ DWORD Flags,
+ PBOOL NeedReboot OPTIONAL);
+
+BOOL
+WINAPI
+DiInstallDriverW(
+ HWND hwndParent OPTIONAL,
+ LPCWSTR InfPath,
+ DWORD Flags,
+ PBOOL NeedReboot OPTIONAL);
+
+BOOL
+WINAPI
+DiInstallDriverA(
+ HWND hwndParent OPTIONAL,
+ LPCSTR InfPath,
+ DWORD Flags,
+ PBOOL NeedReboot OPTIONAL);
+
+
+#ifdef UNICODE
+#define DiInstallDriver DiInstallDriverW
+#else
+#define DiInstallDriver DiInstallDriverA
+#endif
+
+#endif /* (WINVER >= _WIN32_WINNT_VISTA) */
+
+#if (WINVER >= _WIN32_WINNT_WIN7)
+BOOL
+WINAPI
+DiUninstallDevice(
+ HWND hwndParent,
+ HDEVINFO DeviceInfoSet,
+ PSP_DEVINFO_DATA DeviceInfoData,
+ DWORD Flags,
+ PBOOL NeedReboot OPTIONAL);
+#endif /* (WINVER >= _WIN32_WINNT_WIN7) */
+
+#include
#ifdef __cplusplus
}
#endif
-
-#endif /* __NEWDEV_H */
diff --git a/include/psdk/nspapi.h b/include/psdk/nspapi.h
index b745a4672e8..6e921e3c838 100644
--- a/include/psdk/nspapi.h
+++ b/include/psdk/nspapi.h
@@ -36,9 +36,9 @@ extern "C" {
#ifndef RC_INVOKED
-#if defined (_WINSOCK_H) || defined (_WINSOCK2_H) /* needed for LPSOCKADDR */
-#ifndef __CSADDR_T_DEFINED /* also in winsock2.h, but not in winsock.h */
-#define __CSADDR_T_DEFINED
+#if defined (_WINSOCKAPI_) || defined (_WINSOCK2API_) /* needed for LPSOCKADDR */
+#ifndef __CSADDR_DEFINED__ /* also in winsock2.h, but not in winsock.h */
+#define __CSADDR_DEFINED__
typedef struct _SOCKET_ADDRESS {
LPSOCKADDR lpSockaddr;
INT iSockaddrLength;
diff --git a/include/ddk/ntddchgr.h b/include/psdk/ntddchgr.h
similarity index 95%
rename from include/ddk/ntddchgr.h
rename to include/psdk/ntddchgr.h
index 0e9727505a8..c834eed217e 100644
--- a/include/ddk/ntddchgr.h
+++ b/include/psdk/ntddchgr.h
@@ -20,8 +20,7 @@
*
*/
-#ifndef __NTDDCHGR_H
-#define __NTDDCHGR_H
+#pragma once
#include "ntddstor.h"
@@ -34,7 +33,7 @@ extern "C" {
#define IOCTL_CHANGER_BASE FILE_DEVICE_CHANGER
-#define IOCTL_CHANGER_EXCHANGE_MEDIUM \
+#define IOCTL_CHANGER_EXCHANGE_MEDIUM \
CTL_CODE(IOCTL_CHANGER_BASE, 0x0008, METHOD_BUFFERED, FILE_READ_ACCESS)
#define IOCTL_CHANGER_GET_ELEMENT_STATUS \
@@ -67,178 +66,14 @@ extern "C" {
#define IOCTL_CHANGER_SET_POSITION \
CTL_CODE(IOCTL_CHANGER_BASE, 0x0007, METHOD_BUFFERED, FILE_READ_ACCESS)
-
#define MAX_VOLUME_ID_SIZE 36
#define MAX_VOLUME_TEMPLATE_SIZE 40
-typedef enum _ELEMENT_TYPE {
- AllElements,
- ChangerTransport,
- ChangerSlot,
- ChangerIEPort,
- ChangerDrive,
- ChangerDoor,
- ChangerKeypad,
- ChangerMaxElement
-} ELEMENT_TYPE, *PELEMENT_TYPE;
-
-typedef struct _CHANGER_ELEMENT {
- ELEMENT_TYPE ElementType;
- ULONG ElementAddress;
-} CHANGER_ELEMENT, *PCHANGER_ELEMENT;
-
-typedef struct _CHANGER_ELEMENT_LIST {
- CHANGER_ELEMENT Element;
- ULONG NumberOfElements;
-} CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST;
-
-typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
- CHANGER_ELEMENT_LIST ElementList;
- BOOLEAN BarCodeScan;
-} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
-
-typedef struct _CHANGER_READ_ELEMENT_STATUS {
- CHANGER_ELEMENT_LIST ElementList;
- BOOLEAN VolumeTagInfo;
-} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
-
-
-typedef struct _CHANGER_SET_POSITION {
- CHANGER_ELEMENT Transport;
- CHANGER_ELEMENT Destination;
- BOOLEAN Flip;
-} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
-
-typedef struct _CHANGER_EXCHANGE_MEDIUM {
- CHANGER_ELEMENT Transport;
- CHANGER_ELEMENT Source;
- CHANGER_ELEMENT Destination1;
- CHANGER_ELEMENT Destination2;
- BOOLEAN Flip1;
- BOOLEAN Flip2;
-} CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
-
-typedef struct _CHANGER_MOVE_MEDIUM {
- CHANGER_ELEMENT Transport;
- CHANGER_ELEMENT Source;
- CHANGER_ELEMENT Destination;
- BOOLEAN Flip;
-} CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
-
#define VENDOR_ID_LENGTH 8
#define PRODUCT_ID_LENGTH 16
#define REVISION_LENGTH 4
#define SERIAL_NUMBER_LENGTH 32
-typedef struct _CHANGER_PRODUCT_DATA {
- UCHAR VendorId[VENDOR_ID_LENGTH];
- UCHAR ProductId[PRODUCT_ID_LENGTH];
- UCHAR Revision[REVISION_LENGTH];
- UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
- UCHAR DeviceType;
-} CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
-
-/* CHANGER_SET_ACCESS.Control constants */
-#define LOCK_ELEMENT 0
-#define UNLOCK_ELEMENT 1
-#define EXTEND_IEPORT 2
-#define RETRACT_IEPORT 3
-
-typedef struct _CHANGER_SET_ACCESS {
- CHANGER_ELEMENT Element;
- ULONG Control;
-} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
-
-
-typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
- DeviceProblemNone,
- DeviceProblemHardware,
- DeviceProblemCHMError,
- DeviceProblemDoorOpen,
- DeviceProblemCalibrationError,
- DeviceProblemTargetFailure,
- DeviceProblemCHMMoveError,
- DeviceProblemCHMZeroError,
- DeviceProblemCartridgeInsertError,
- DeviceProblemPositionError,
- DeviceProblemSensorError,
- DeviceProblemCartridgeEjectError,
- DeviceProblemGripperError,
- DeviceProblemDriveError
-} CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;
-
-/* CHANGER_ELEMENT_STATUS(_EX).Flags constants */
-#define ELEMENT_STATUS_FULL 0x00000001
-#define ELEMENT_STATUS_IMPEXP 0x00000002
-#define ELEMENT_STATUS_EXCEPT 0x00000004
-#define ELEMENT_STATUS_ACCESS 0x00000008
-#define ELEMENT_STATUS_EXENAB 0x00000010
-#define ELEMENT_STATUS_INENAB 0x00000020
-#define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
-#define ELEMENT_STATUS_LUN_VALID 0x00001000
-#define ELEMENT_STATUS_ID_VALID 0x00002000
-#define ELEMENT_STATUS_NOT_BUS 0x00008000
-#define ELEMENT_STATUS_INVERT 0x00400000
-#define ELEMENT_STATUS_SVALID 0x00800000
-#define ELEMENT_STATUS_PVOLTAG 0x10000000
-#define ELEMENT_STATUS_AVOLTAG 0x20000000
-
-/* CHANGER_ELEMENT_STATUS(_EX).ExceptionCode constants */
-#define ERROR_LABEL_UNREADABLE 0x00000001
-#define ERROR_LABEL_QUESTIONABLE 0x00000002
-#define ERROR_SLOT_NOT_PRESENT 0x00000004
-#define ERROR_DRIVE_NOT_INSTALLED 0x00000008
-#define ERROR_TRAY_MALFUNCTION 0x00000010
-#define ERROR_INIT_STATUS_NEEDED 0x00000011
-#define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
-
-typedef struct _CHANGER_ELEMENT_STATUS {
- CHANGER_ELEMENT Element;
- CHANGER_ELEMENT SrcElementAddress;
- ULONG Flags;
- ULONG ExceptionCode;
- UCHAR TargetId;
- UCHAR Lun;
- USHORT Reserved;
- UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
- UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
-} CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
-
-typedef struct _CHANGER_ELEMENT_STATUS_EX {
- CHANGER_ELEMENT Element;
- CHANGER_ELEMENT SrcElementAddress;
- ULONG Flags;
- ULONG ExceptionCode;
- UCHAR TargetId;
- UCHAR Lun;
- USHORT Reserved;
- UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
- UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
- UCHAR VendorIdentification[VENDOR_ID_LENGTH];
- UCHAR ProductIdentification[PRODUCT_ID_LENGTH];
- UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
-} CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;
-
-/* CHANGER_SEND_VOLUME_TAG_INFORMATION.ActionCode constants */
-#define SEARCH_ALL 0x0
-#define SEARCH_PRIMARY 0x1
-#define SEARCH_ALTERNATE 0x2
-#define SEARCH_ALL_NO_SEQ 0x4
-#define SEARCH_PRI_NO_SEQ 0x5
-#define SEARCH_ALT_NO_SEQ 0x6
-#define ASSERT_PRIMARY 0x8
-#define ASSERT_ALTERNATE 0x9
-#define REPLACE_PRIMARY 0xA
-#define REPLACE_ALTERNATE 0xB
-#define UNDEFINE_PRIMARY 0xC
-#define UNDEFINE_ALTERNATE 0xD
-
-typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
- CHANGER_ELEMENT StartingElement;
- ULONG ActionCode;
- UCHAR VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
-} CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
-
/* GET_CHANGER_PARAMETERS.Features0 constants */
#define CHANGER_BAR_CODE_SCANNER_INSTALLED 0x00000001
#define CHANGER_INIT_ELEM_STAT_WITH_RANGE 0x00000002
@@ -295,6 +130,72 @@ typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
#define LOCK_UNLOCK_DOOR 0x02
#define LOCK_UNLOCK_KEYPAD 0x04
+/* CHANGER_SET_ACCESS.Control constants */
+#define LOCK_ELEMENT 0
+#define UNLOCK_ELEMENT 1
+#define EXTEND_IEPORT 2
+#define RETRACT_IEPORT 3
+
+/* CHANGER_ELEMENT_STATUS(_EX).Flags constants */
+#define ELEMENT_STATUS_FULL 0x00000001
+#define ELEMENT_STATUS_IMPEXP 0x00000002
+#define ELEMENT_STATUS_EXCEPT 0x00000004
+#define ELEMENT_STATUS_ACCESS 0x00000008
+#define ELEMENT_STATUS_EXENAB 0x00000010
+#define ELEMENT_STATUS_INENAB 0x00000020
+#define ELEMENT_STATUS_PRODUCT_DATA 0x00000040
+#define ELEMENT_STATUS_LUN_VALID 0x00001000
+#define ELEMENT_STATUS_ID_VALID 0x00002000
+#define ELEMENT_STATUS_NOT_BUS 0x00008000
+#define ELEMENT_STATUS_INVERT 0x00400000
+#define ELEMENT_STATUS_SVALID 0x00800000
+#define ELEMENT_STATUS_PVOLTAG 0x10000000
+#define ELEMENT_STATUS_AVOLTAG 0x20000000
+
+/* CHANGER_ELEMENT_STATUS(_EX).ExceptionCode constants */
+#define ERROR_LABEL_UNREADABLE 0x00000001
+#define ERROR_LABEL_QUESTIONABLE 0x00000002
+#define ERROR_SLOT_NOT_PRESENT 0x00000004
+#define ERROR_DRIVE_NOT_INSTALLED 0x00000008
+#define ERROR_TRAY_MALFUNCTION 0x00000010
+#define ERROR_INIT_STATUS_NEEDED 0x00000011
+#define ERROR_UNHANDLED_ERROR 0xFFFFFFFF
+
+/* CHANGER_SEND_VOLUME_TAG_INFORMATION.ActionCode constants */
+#define SEARCH_ALL 0x0
+#define SEARCH_PRIMARY 0x1
+#define SEARCH_ALTERNATE 0x2
+#define SEARCH_ALL_NO_SEQ 0x4
+#define SEARCH_PRI_NO_SEQ 0x5
+#define SEARCH_ALT_NO_SEQ 0x6
+#define ASSERT_PRIMARY 0x8
+#define ASSERT_ALTERNATE 0x9
+#define REPLACE_PRIMARY 0xA
+#define REPLACE_ALTERNATE 0xB
+#define UNDEFINE_PRIMARY 0xC
+#define UNDEFINE_ALTERNATE 0xD
+
+typedef enum _ELEMENT_TYPE {
+ AllElements,
+ ChangerTransport,
+ ChangerSlot,
+ ChangerIEPort,
+ ChangerDrive,
+ ChangerDoor,
+ ChangerKeypad,
+ ChangerMaxElement
+} ELEMENT_TYPE, *PELEMENT_TYPE;
+
+typedef struct _CHANGER_ELEMENT {
+ ELEMENT_TYPE ElementType;
+ ULONG ElementAddress;
+} CHANGER_ELEMENT, *PCHANGER_ELEMENT;
+
+typedef struct _CHANGER_ELEMENT_LIST {
+ CHANGER_ELEMENT Element;
+ ULONG NumberOfElements;
+} CHANGER_ELEMENT_LIST, *PCHANGER_ELEMENT_LIST;
+
typedef struct _GET_CHANGER_PARAMETERS {
ULONG Size;
USHORT NumberTransportElements;
@@ -326,23 +227,106 @@ typedef struct _GET_CHANGER_PARAMETERS {
ULONG Reserved2[2];
} GET_CHANGER_PARAMETERS, * PGET_CHANGER_PARAMETERS;
+typedef struct _CHANGER_PRODUCT_DATA {
+ UCHAR VendorId[VENDOR_ID_LENGTH];
+ UCHAR ProductId[PRODUCT_ID_LENGTH];
+ UCHAR Revision[REVISION_LENGTH];
+ UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
+ UCHAR DeviceType;
+} CHANGER_PRODUCT_DATA, *PCHANGER_PRODUCT_DATA;
+
+typedef struct _CHANGER_SET_ACCESS {
+ CHANGER_ELEMENT Element;
+ ULONG Control;
+} CHANGER_SET_ACCESS, *PCHANGER_SET_ACCESS;
+
+typedef struct _CHANGER_READ_ELEMENT_STATUS {
+ CHANGER_ELEMENT_LIST ElementList;
+ BOOLEAN VolumeTagInfo;
+} CHANGER_READ_ELEMENT_STATUS, *PCHANGER_READ_ELEMENT_STATUS;
+
+typedef struct _CHANGER_ELEMENT_STATUS {
+ CHANGER_ELEMENT Element;
+ CHANGER_ELEMENT SrcElementAddress;
+ ULONG Flags;
+ ULONG ExceptionCode;
+ UCHAR TargetId;
+ UCHAR Lun;
+ USHORT Reserved;
+ UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
+ UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
+} CHANGER_ELEMENT_STATUS, *PCHANGER_ELEMENT_STATUS;
+
+typedef struct _CHANGER_ELEMENT_STATUS_EX {
+ CHANGER_ELEMENT Element;
+ CHANGER_ELEMENT SrcElementAddress;
+ ULONG Flags;
+ ULONG ExceptionCode;
+ UCHAR TargetId;
+ UCHAR Lun;
+ USHORT Reserved;
+ UCHAR PrimaryVolumeID[MAX_VOLUME_ID_SIZE];
+ UCHAR AlternateVolumeID[MAX_VOLUME_ID_SIZE];
+ UCHAR VendorIdentification[VENDOR_ID_LENGTH];
+ UCHAR ProductIdentification[PRODUCT_ID_LENGTH];
+ UCHAR SerialNumber[SERIAL_NUMBER_LENGTH];
+} CHANGER_ELEMENT_STATUS_EX, *PCHANGER_ELEMENT_STATUS_EX;
+
+typedef struct _CHANGER_INITIALIZE_ELEMENT_STATUS {
+ CHANGER_ELEMENT_LIST ElementList;
+ BOOLEAN BarCodeScan;
+} CHANGER_INITIALIZE_ELEMENT_STATUS, *PCHANGER_INITIALIZE_ELEMENT_STATUS;
+
+typedef struct _CHANGER_SET_POSITION {
+ CHANGER_ELEMENT Transport;
+ CHANGER_ELEMENT Destination;
+ BOOLEAN Flip;
+} CHANGER_SET_POSITION, *PCHANGER_SET_POSITION;
+
+typedef struct _CHANGER_EXCHANGE_MEDIUM {
+ CHANGER_ELEMENT Transport;
+ CHANGER_ELEMENT Source;
+ CHANGER_ELEMENT Destination1;
+ CHANGER_ELEMENT Destination2;
+ BOOLEAN Flip1;
+ BOOLEAN Flip2;
+} CHANGER_EXCHANGE_MEDIUM, *PCHANGER_EXCHANGE_MEDIUM;
+
+typedef struct _CHANGER_MOVE_MEDIUM {
+ CHANGER_ELEMENT Transport;
+ CHANGER_ELEMENT Source;
+ CHANGER_ELEMENT Destination;
+ BOOLEAN Flip;
+} CHANGER_MOVE_MEDIUM, *PCHANGER_MOVE_MEDIUM;
+
+typedef struct _CHANGER_SEND_VOLUME_TAG_INFORMATION {
+ CHANGER_ELEMENT StartingElement;
+ ULONG ActionCode;
+ UCHAR VolumeIDTemplate[MAX_VOLUME_TEMPLATE_SIZE];
+} CHANGER_SEND_VOLUME_TAG_INFORMATION, *PCHANGER_SEND_VOLUME_TAG_INFORMATION;
+
typedef struct READ_ELEMENT_ADDRESS_INFO {
ULONG NumberOfElements;
CHANGER_ELEMENT_STATUS ElementStatus[1];
} READ_ELEMENT_ADDRESS_INFO, *PREAD_ELEMENT_ADDRESS_INFO;
-typedef struct _TAPE_WMI_OPERATIONS {
- ULONG Method;
- ULONG DataBufferSize;
- PVOID DataBuffer;
-} TAPE_WMI_OPERATIONS, *PTAPE_WMI_OPERATIONS;
-
-typedef struct _WMI_CHANGER_PROBLEM_DEVICE_ERROR {
- ULONG ChangerProblemType;
-} WMI_CHANGER_PROBLEM_DEVICE_ERROR, *PWMI_CHANGER_PROBLEM_DEVICE_ERROR;
+typedef enum _CHANGER_DEVICE_PROBLEM_TYPE {
+ DeviceProblemNone,
+ DeviceProblemHardware,
+ DeviceProblemCHMError,
+ DeviceProblemDoorOpen,
+ DeviceProblemCalibrationError,
+ DeviceProblemTargetFailure,
+ DeviceProblemCHMMoveError,
+ DeviceProblemCHMZeroError,
+ DeviceProblemCartridgeInsertError,
+ DeviceProblemPositionError,
+ DeviceProblemSensorError,
+ DeviceProblemCartridgeEjectError,
+ DeviceProblemGripperError,
+ DeviceProblemDriveError
+} CHANGER_DEVICE_PROBLEM_TYPE, *PCHANGER_DEVICE_PROBLEM_TYPE;
#ifdef __cplusplus
}
#endif
-
-#endif /* __NTDDCHGR_H */
diff --git a/include/psdk/ntddkbd.h b/include/psdk/ntddkbd.h
index 2f06bcf6fa9..f94f83dacfa 100644
--- a/include/psdk/ntddkbd.h
+++ b/include/psdk/ntddkbd.h
@@ -20,8 +20,7 @@
*
*/
-#ifndef __NTDDKBD_H
-#define __NTDDKBD_H
+#pragma once
#ifdef __cplusplus
extern "C" {
@@ -48,20 +47,33 @@ extern "C" {
#define IOCTL_KEYBOARD_SET_INDICATORS \
CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0002, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_KEYBOARD_INSERT_DATA \
+ CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0040, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_KEYBOARD_QUERY_IME_STATUS \
+ CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0400, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_KEYBOARD_SET_IME_STATUS \
+ CTL_CODE(FILE_DEVICE_KEYBOARD, 0x0401, METHOD_BUFFERED, FILE_ANY_ACCESS)
DEFINE_GUID(GUID_DEVINTERFACE_KEYBOARD, \
0x884b96c3, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd);
+#define GUID_CLASS_KEYBOARD GUID_DEVINTERFACE_KEYBOARD /* Obsolete */
+
#define KEYBOARD_ERROR_VALUE_BASE 10000
/* KEYBOARD_INPUT_DATA.MakeCode constants */
-#define KEYBOARD_OVERRUN_MAKE_CODE 0xFF
+#define KEYBOARD_OVERRUN_MAKE_CODE 0xFF
/* KEYBOARD_INPUT_DATA.Flags constants */
-#define KEY_MAKE 0
-#define KEY_BREAK 1
-#define KEY_E0 2
-#define KEY_E1 4
+#define KEY_MAKE 0
+#define KEY_BREAK 1
+#define KEY_E0 2
+#define KEY_E1 4
+#define KEY_TERMSRV_SET_LED 8
+#define KEY_TERMSRV_SHADOW 0x10
+#define KEY_TERMSRV_VKPACKET 0x20
#define KEYBOARD_LED_INJECTED 0x8000
#define KEYBOARD_SHADOW 0x4000
@@ -71,66 +83,64 @@ DEFINE_GUID(GUID_DEVINTERFACE_KEYBOARD, \
#define KEYBOARD_SCROLL_LOCK_ON 1
typedef struct _KEYBOARD_INPUT_DATA {
- USHORT UnitId;
- USHORT MakeCode;
- USHORT Flags;
- USHORT Reserved;
- ULONG ExtraInformation;
+ USHORT UnitId;
+ USHORT MakeCode;
+ USHORT Flags;
+ USHORT Reserved;
+ ULONG ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
typedef struct _KEYBOARD_TYPEMATIC_PARAMETERS {
- USHORT UnitId;
- USHORT Rate;
- USHORT Delay;
+ USHORT UnitId;
+ USHORT Rate;
+ USHORT Delay;
} KEYBOARD_TYPEMATIC_PARAMETERS, *PKEYBOARD_TYPEMATIC_PARAMETERS;
typedef struct _KEYBOARD_ID {
- UCHAR Type;
- UCHAR Subtype;
+ UCHAR Type;
+ UCHAR Subtype;
} KEYBOARD_ID, *PKEYBOARD_ID;
#define ENHANCED_KEYBOARD(Id) ((Id).Type == 2 || (Id).Type == 4 || FAREAST_KEYBOARD(Id))
-#define FAREAST_KEYBOARD(Id) ((Id).Type == 7 || (Id).Type == 8)
+#define FAREAST_KEYBOARD(Id) ((Id).Type == 7 || (Id).Type == 8)
typedef struct _KEYBOARD_INDICATOR_PARAMETERS {
- USHORT UnitId;
- USHORT LedFlags;
+ USHORT UnitId;
+ USHORT LedFlags;
} KEYBOARD_INDICATOR_PARAMETERS, *PKEYBOARD_INDICATOR_PARAMETERS;
typedef struct _INDICATOR_LIST {
- USHORT MakeCode;
- USHORT IndicatorFlags;
+ USHORT MakeCode;
+ USHORT IndicatorFlags;
} INDICATOR_LIST, *PINDICATOR_LIST;
typedef struct _KEYBOARD_INDICATOR_TRANSLATION {
- USHORT NumberOfIndicatorKeys;
- INDICATOR_LIST IndicatorList[1];
+ USHORT NumberOfIndicatorKeys;
+ INDICATOR_LIST IndicatorList[1];
} KEYBOARD_INDICATOR_TRANSLATION, *PKEYBOARD_INDICATOR_TRANSLATION;
typedef struct _KEYBOARD_ATTRIBUTES {
- KEYBOARD_ID KeyboardIdentifier;
- USHORT KeyboardMode;
- USHORT NumberOfFunctionKeys;
- USHORT NumberOfIndicators;
- USHORT NumberOfKeysTotal;
- ULONG InputDataQueueLength;
- KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMinimum;
- KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMaximum;
+ KEYBOARD_ID KeyboardIdentifier;
+ USHORT KeyboardMode;
+ USHORT NumberOfFunctionKeys;
+ USHORT NumberOfIndicators;
+ USHORT NumberOfKeysTotal;
+ ULONG InputDataQueueLength;
+ KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMinimum;
+ KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMaximum;
} KEYBOARD_ATTRIBUTES, *PKEYBOARD_ATTRIBUTES;
typedef struct _KEYBOARD_UNIT_ID_PARAMETER {
- USHORT UnitId;
+ USHORT UnitId;
} KEYBOARD_UNIT_ID_PARAMETER, *PKEYBOARD_UNIT_ID_PARAMETER;
typedef struct _KEYBOARD_IME_STATUS {
- USHORT UnitId;
- ULONG ImeOpen;
- ULONG ImeConvMode;
+ USHORT UnitId;
+ ULONG ImeOpen;
+ ULONG ImeConvMode;
} KEYBOARD_IME_STATUS, *PKEYBOARD_IME_STATUS;
#ifdef __cplusplus
}
#endif
-
-#endif /* __NTDDKBD_H */
diff --git a/include/ddk/ntddmou.h b/include/psdk/ntddmou.h
similarity index 78%
rename from include/ddk/ntddmou.h
rename to include/psdk/ntddmou.h
index a4b24606fdf..52285141f85 100644
--- a/include/ddk/ntddmou.h
+++ b/include/psdk/ntddmou.h
@@ -20,8 +20,7 @@
*
*/
-#ifndef __NTDDMOU_H
-#define __NTDDMOU_H
+#pragma once
#ifdef __cplusplus
extern "C" {
@@ -33,9 +32,14 @@ extern "C" {
#define IOCTL_MOUSE_QUERY_ATTRIBUTES \
CTL_CODE(FILE_DEVICE_MOUSE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define IOCTL_MOUSE_INSERT_DATA \
+ CTL_CODE(FILE_DEVICE_MOUSE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
DEFINE_GUID(GUID_DEVINTERFACE_MOUSE, \
0x378de44c, 0x56ef, 0x11d1, 0xbc, 0x8c, 0x00, 0xa0, 0xc9, 0x14, 0x05, 0xdd);
+#define GUID_CLASS_MOUSE GUID_DEVINTERFACE_MOUSE /* Obsolete */
+
#define MOUSE_ERROR_VALUE_BASE 20000
/* MOUSE_INPUT_DATA.ButtonFlags constants */
@@ -50,6 +54,7 @@ DEFINE_GUID(GUID_DEVINTERFACE_MOUSE, \
#define MOUSE_BUTTON_5_DOWN 0x0100
#define MOUSE_BUTTON_5_UP 0x0200
#define MOUSE_WHEEL 0x0400
+#define MOUSE_HWHEEL 0x0800
#define MOUSE_BUTTON_1_DOWN MOUSE_LEFT_BUTTON_DOWN
#define MOUSE_BUTTON_1_UP MOUSE_LEFT_BUTTON_UP
@@ -63,25 +68,29 @@ DEFINE_GUID(GUID_DEVINTERFACE_MOUSE, \
#define MOUSE_MOVE_ABSOLUTE 1
#define MOUSE_VIRTUAL_DESKTOP 0x02
#define MOUSE_ATTRIBUTES_CHANGED 0x04
+#if(_WIN32_WINNT >= 0x0600)
+#define MOUSE_MOVE_NOCOALESCE 0x08
+#endif
+#define MOUSE_TERMSRV_SRC_SHADOW 0x100
typedef struct _MOUSE_INPUT_DATA {
- USHORT UnitId;
- USHORT Flags;
- _ANONYMOUS_UNION union {
- ULONG Buttons;
- _ANONYMOUS_STRUCT struct {
- USHORT ButtonFlags;
- USHORT ButtonData;
- } DUMMYSTRUCTNAME;
- } DUMMYUNIONNAME;
- ULONG RawButtons;
- LONG LastX;
- LONG LastY;
- ULONG ExtraInformation;
+ USHORT UnitId;
+ USHORT Flags;
+ _ANONYMOUS_UNION union {
+ ULONG Buttons;
+ _ANONYMOUS_STRUCT struct {
+ USHORT ButtonFlags;
+ USHORT ButtonData;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
+ ULONG RawButtons;
+ LONG LastX;
+ LONG LastY;
+ ULONG ExtraInformation;
} MOUSE_INPUT_DATA, *PMOUSE_INPUT_DATA;
typedef struct _MOUSE_UNIT_ID_PARAMETER {
- USHORT UnitId;
+ USHORT UnitId;
} MOUSE_UNIT_ID_PARAMETER, *PMOUSE_UNIT_ID_PARAMETER;
/* MOUSE_ATTRIBUTES.MouseIdentifier constants */
@@ -94,16 +103,15 @@ typedef struct _MOUSE_UNIT_ID_PARAMETER {
#define WHEELMOUSE_SERIAL_HARDWARE 0x0040
#define MOUSE_HID_HARDWARE 0x0080
#define WHEELMOUSE_HID_HARDWARE 0x0100
+#define HORIZONTAL_WHEEL_PRESENT 0x8000
typedef struct _MOUSE_ATTRIBUTES {
- USHORT MouseIdentifier;
- USHORT NumberOfButtons;
- USHORT SampleRate;
- ULONG InputDataQueueLength;
+ USHORT MouseIdentifier;
+ USHORT NumberOfButtons;
+ USHORT SampleRate;
+ ULONG InputDataQueueLength;
} MOUSE_ATTRIBUTES, *PMOUSE_ATTRIBUTES;
#ifdef __cplusplus
}
#endif
-
-#endif /* __NTDDMOU_H */
diff --git a/include/psdk/ntddstor.h b/include/psdk/ntddstor.h
new file mode 100644
index 00000000000..d73ba47b9ab
--- /dev/null
+++ b/include/psdk/ntddstor.h
@@ -0,0 +1,694 @@
+/*
+ * ntddstor.h
+ *
+ * Storage class IOCTL interface.
+ *
+ * This file is part of the w32api package.
+ *
+ * Contributors:
+ * Created by Casper S. Hornstrup
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#ifndef _NTDDSTOR_H_
+#define _NTDDSTOR_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(DEFINE_GUID)
+
+DEFINE_GUID(GUID_DEVINTERFACE_DISK,
+ 0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_CDROM,
+ 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_PARTITION,
+ 0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_TAPE,
+ 0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_WRITEONCEDISK,
+ 0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_VOLUME,
+ 0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_MEDIUMCHANGER,
+ 0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_FLOPPY,
+ 0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_CDCHANGER,
+ 0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_STORAGEPORT,
+ 0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
+
+DEFINE_GUID(GUID_DEVINTERFACE_HIDDEN_VOLUME,
+ 0x7f108a28L, 0x9833, 0x4b3b, 0xb7, 0x80, 0x2c, 0x6b, 0x5f, 0xa5, 0xc0, 0x62);
+
+#define WDI_STORAGE_PREDICT_FAILURE_DPS_GUID \
+ {0xe9f2d03aL, 0x747c, 0x41c2, {0xbb, 0x9a, 0x02, 0xc6, 0x2b, 0x6d, 0x5f, 0xcb}};
+
+/* Aliases for storage guids */
+#define DiskClassGuid GUID_DEVINTERFACE_DISK
+#define CdRomClassGuid GUID_DEVINTERFACE_CDROM
+#define PartitionClassGuid GUID_DEVINTERFACE_PARTITION
+#define TapeClassGuid GUID_DEVINTERFACE_TAPE
+#define WriteOnceDiskClassGuid GUID_DEVINTERFACE_WRITEONCEDISK
+#define VolumeClassGuid GUID_DEVINTERFACE_VOLUME
+#define MediumChangerClassGuid GUID_DEVINTERFACE_MEDIUMCHANGER
+#define FloppyClassGuid GUID_DEVINTERFACE_FLOPPY
+#define CdChangerClassGuid GUID_DEVINTERFACE_CDCHANGER
+#define StoragePortClassGuid GUID_DEVINTERFACE_STORAGEPORT
+#define HiddenVolumeClassGuid GUID_DEVINTERFACE_HIDDEN_VOLUME
+
+#endif /* defined(DEFINE_GUID) */
+
+#define IOCTL_STORAGE_BASE FILE_DEVICE_MASS_STORAGE
+
+#define IOCTL_STORAGE_CHECK_VERIFY \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_CHECK_VERIFY2 \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0200, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_EJECT_MEDIA \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0202, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_EJECTION_CONTROL \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0250, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_FIND_NEW_DEVICES \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0206, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_GET_DEVICE_NUMBER \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0420, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_GET_MEDIA_SERIAL_NUMBER \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0304, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_GET_MEDIA_TYPES \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0300, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0301, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_LOAD_MEDIA \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_LOAD_MEDIA2 \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0203, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_MCN_CONTROL \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0251, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_MEDIA_REMOVAL \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0201, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_PREDICT_FAILURE \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0440, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_QUERY_PROPERTY \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0500, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_RELEASE \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0205, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_RESERVE \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0204, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_GET_HOTPLUG_INFO \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0305, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define IOCTL_STORAGE_SET_HOTPLUG_INFO \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0306, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_RESET_BUS \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_RESET_DEVICE \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_BREAK_RESERVATION \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_PERSISTENT_RESERVE_IN \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0406, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_PERSISTENT_RESERVE_OUT \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0407, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_READ_CAPACITY \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0450, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0501, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_GET_BC_PROPERTIES \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0600, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+#define IOCTL_STORAGE_ALLOCATE_BC_STREAM \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0601, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_FREE_BC_STREAM \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0602, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define IOCTL_STORAGE_CHECK_PRIORITY_HINT_SUPPORT \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0620, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define OBSOLETE_IOCTL_STORAGE_RESET_BUS \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0400, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define OBSOLETE_IOCTL_STORAGE_RESET_DEVICE \
+ CTL_CODE(IOCTL_STORAGE_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+#define RECOVERED_WRITES_VALID 0x00000001
+#define UNRECOVERED_WRITES_VALID 0x00000002
+#define RECOVERED_READS_VALID 0x00000004
+#define UNRECOVERED_READS_VALID 0x00000008
+#define WRITE_COMPRESSION_INFO_VALID 0x00000010
+#define READ_COMPRESSION_INFO_VALID 0x00000020
+
+#define TAPE_RETURN_STATISTICS 0L
+#define TAPE_RETURN_ENV_INFO 1L
+#define TAPE_RESET_STATISTICS 2L
+
+/* DEVICE_MEDIA_INFO.DeviceSpecific.DiskInfo.MediaCharacteristics constants */
+#define MEDIA_ERASEABLE 0x00000001
+#define MEDIA_WRITE_ONCE 0x00000002
+#define MEDIA_READ_ONLY 0x00000004
+#define MEDIA_READ_WRITE 0x00000008
+#define MEDIA_WRITE_PROTECTED 0x00000100
+#define MEDIA_CURRENTLY_MOUNTED 0x80000000
+
+#define StorageIdTypeNAA StorageIdTypeFCPHName
+
+#define DeviceDsmActionFlag_NonDestructive 0x80000000
+
+#define IsDsmActionNonDestructive(_Action) ((BOOLEAN)((_Action & DeviceDsmActionFlag_NonDestructive) != 0))
+
+#define DeviceDsmAction_None 0
+#define DeviceDsmAction_Trim 1
+#define DeviceDsmAction_Notification (2 | DeviceDsmActionFlag_NonDestructive)
+
+#define DEVICE_DSM_FLAG_ENTIRE_DATA_SET_RANGE 0x00000001
+
+#define DEVICE_DSM_NOTIFY_FLAG_BEGIN 0x00000001
+#define DEVICE_DSM_NOTIFY_FLAG_END 0x00000002
+
+#define IOCTL_STORAGE_BC_VERSION 1
+
+#define STORAGE_PRIORITY_HINT_SUPPORTED 0x0001
+
+typedef struct _STORAGE_HOTPLUG_INFO {
+ ULONG Size;
+ BOOLEAN MediaRemovable;
+ BOOLEAN MediaHotplug;
+ BOOLEAN DeviceHotplug;
+ BOOLEAN WriteCacheEnableOverride;
+} STORAGE_HOTPLUG_INFO, *PSTORAGE_HOTPLUG_INFO;
+
+typedef struct _STORAGE_DEVICE_NUMBER {
+ DEVICE_TYPE DeviceType;
+ ULONG DeviceNumber;
+ ULONG PartitionNumber;
+} STORAGE_DEVICE_NUMBER, *PSTORAGE_DEVICE_NUMBER;
+
+typedef struct _STORAGE_BUS_RESET_REQUEST {
+ UCHAR PathId;
+} STORAGE_BUS_RESET_REQUEST, *PSTORAGE_BUS_RESET_REQUEST;
+
+typedef struct _STORAGE_BREAK_RESERVATION_REQUEST {
+ ULONG Length;
+ UCHAR _unused;
+ UCHAR PathId;
+ UCHAR TargetId;
+ UCHAR Lun;
+} STORAGE_BREAK_RESERVATION_REQUEST, *PSTORAGE_BREAK_RESERVATION_REQUEST;
+
+#ifndef _WINIOCTL_H
+typedef struct _PREVENT_MEDIA_REMOVAL {
+ BOOLEAN PreventMediaRemoval;
+} PREVENT_MEDIA_REMOVAL, *PPREVENT_MEDIA_REMOVAL;
+#endif
+
+typedef struct _CLASS_MEDIA_CHANGE_CONTEXT {
+ ULONG MediaChangeCount;
+ ULONG NewState;
+} CLASS_MEDIA_CHANGE_CONTEXT, *PCLASS_MEDIA_CHANGE_CONTEXT;
+
+typedef struct _TAPE_STATISTICS {
+ ULONG Version;
+ ULONG Flags;
+ LARGE_INTEGER RecoveredWrites;
+ LARGE_INTEGER UnrecoveredWrites;
+ LARGE_INTEGER RecoveredReads;
+ LARGE_INTEGER UnrecoveredReads;
+ UCHAR CompressionRatioReads;
+ UCHAR CompressionRatioWrites;
+} TAPE_STATISTICS, *PTAPE_STATISTICS;
+
+typedef struct _TAPE_GET_STATISTICS {
+ ULONG Operation;
+} TAPE_GET_STATISTICS, *PTAPE_GET_STATISTICS;
+
+typedef enum _STORAGE_MEDIA_TYPE {
+ DDS_4mm = 0x20,
+ MiniQic,
+ Travan,
+ QIC,
+ MP_8mm,
+ AME_8mm,
+ AIT1_8mm,
+ DLT,
+ NCTP,
+ IBM_3480,
+ IBM_3490E,
+ IBM_Magstar_3590,
+ IBM_Magstar_MP,
+ STK_DATA_D3,
+ SONY_DTF,
+ DV_6mm,
+ DMI,
+ SONY_D2,
+ CLEANER_CARTRIDGE,
+ CD_ROM,
+ CD_R,
+ CD_RW,
+ DVD_ROM,
+ DVD_R,
+ DVD_RW,
+ MO_3_RW,
+ MO_5_WO,
+ MO_5_RW,
+ MO_5_LIMDOW,
+ PC_5_WO,
+ PC_5_RW,
+ PD_5_RW,
+ ABL_5_WO,
+ PINNACLE_APEX_5_RW,
+ SONY_12_WO,
+ PHILIPS_12_WO,
+ HITACHI_12_WO,
+ CYGNET_12_WO,
+ KODAK_14_WO,
+ MO_NFR_525,
+ NIKON_12_RW,
+ IOMEGA_ZIP,
+ IOMEGA_JAZ,
+ SYQUEST_EZ135,
+ SYQUEST_EZFLYER,
+ SYQUEST_SYJET,
+ AVATAR_F2,
+ MP2_8mm,
+ DST_S,
+ DST_M,
+ DST_L,
+ VXATape_1,
+ VXATape_2,
+#if (NTDDI_VERSION < NTDDI_WINXP)
+ STK_EAGLE,
+#else
+ STK_9840,
+#endif
+ LTO_Ultrium,
+ LTO_Accelis,
+ DVD_RAM,
+ AIT_8mm,
+ ADR_1,
+ ADR_2,
+ STK_9940,
+ SAIT,
+ VXATape
+} STORAGE_MEDIA_TYPE, *PSTORAGE_MEDIA_TYPE;
+
+typedef enum _STORAGE_BUS_TYPE {
+ BusTypeUnknown = 0x00,
+ BusTypeScsi,
+ BusTypeAtapi,
+ BusTypeAta,
+ BusType1394,
+ BusTypeSsa,
+ BusTypeFibre,
+ BusTypeUsb,
+ BusTypeRAID,
+ BusTypeiScsi,
+ BusTypeSas,
+ BusTypeSata,
+ BusTypeSd,
+ BusTypeMmc,
+ BusTypeVirtual,
+ BusTypeFileBackedVirtual,
+ BusTypeMax,
+ BusTypeMaxReserved = 0x7F
+} STORAGE_BUS_TYPE, *PSTORAGE_BUS_TYPE;
+
+typedef struct _DEVICE_MEDIA_INFO {
+ union {
+ struct {
+ LARGE_INTEGER Cylinders;
+ STORAGE_MEDIA_TYPE MediaType;
+ ULONG TracksPerCylinder;
+ ULONG SectorsPerTrack;
+ ULONG BytesPerSector;
+ ULONG NumberMediaSides;
+ ULONG MediaCharacteristics;
+ } DiskInfo;
+ struct {
+ LARGE_INTEGER Cylinders;
+ STORAGE_MEDIA_TYPE MediaType;
+ ULONG TracksPerCylinder;
+ ULONG SectorsPerTrack;
+ ULONG BytesPerSector;
+ ULONG NumberMediaSides;
+ ULONG MediaCharacteristics;
+ } RemovableDiskInfo;
+ struct {
+ STORAGE_MEDIA_TYPE MediaType;
+ ULONG MediaCharacteristics;
+ ULONG CurrentBlockSize;
+ STORAGE_BUS_TYPE BusType;
+ union {
+ struct {
+ UCHAR MediumType;
+ UCHAR DensityCode;
+ } ScsiInformation;
+ } BusSpecificData;
+ } TapeInfo;
+ } DeviceSpecific;
+} DEVICE_MEDIA_INFO, *PDEVICE_MEDIA_INFO;
+
+typedef struct _GET_MEDIA_TYPES {
+ ULONG DeviceType;
+ ULONG MediaInfoCount;
+ DEVICE_MEDIA_INFO MediaInfo[1];
+} GET_MEDIA_TYPES, *PGET_MEDIA_TYPES;
+
+typedef struct _STORAGE_PREDICT_FAILURE {
+ ULONG PredictFailure;
+ UCHAR VendorSpecific[512];
+} STORAGE_PREDICT_FAILURE, *PSTORAGE_PREDICT_FAILURE;
+
+typedef enum _STORAGE_QUERY_TYPE {
+ PropertyStandardQuery = 0,
+ PropertyExistsQuery,
+ PropertyMaskQuery,
+ PropertyQueryMaxDefined
+} STORAGE_QUERY_TYPE, *PSTORAGE_QUERY_TYPE;
+
+typedef enum _STORAGE_PROPERTY_ID {
+ StorageDeviceProperty = 0,
+ StorageAdapterProperty,
+ StorageDeviceIdProperty,
+ StorageDeviceUniqueIdProperty,
+ StorageDeviceWriteCacheProperty,
+ StorageMiniportProperty,
+ StorageAccessAlignmentProperty,
+ StorageDeviceSeekPenaltyProperty,
+ StorageDeviceTrimProperty,
+ StorageDeviceWriteAggregationProperty
+} STORAGE_PROPERTY_ID, *PSTORAGE_PROPERTY_ID;
+
+typedef struct _STORAGE_PROPERTY_QUERY {
+ STORAGE_PROPERTY_ID PropertyId;
+ STORAGE_QUERY_TYPE QueryType;
+ UCHAR AdditionalParameters[1];
+} STORAGE_PROPERTY_QUERY, *PSTORAGE_PROPERTY_QUERY;
+
+typedef struct _STORAGE_DESCRIPTOR_HEADER {
+ ULONG Version;
+ ULONG Size;
+} STORAGE_DESCRIPTOR_HEADER, *PSTORAGE_DESCRIPTOR_HEADER;
+
+typedef struct _STORAGE_DEVICE_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ UCHAR DeviceType;
+ UCHAR DeviceTypeModifier;
+ BOOLEAN RemovableMedia;
+ BOOLEAN CommandQueueing;
+ ULONG VendorIdOffset;
+ ULONG ProductIdOffset;
+ ULONG ProductRevisionOffset;
+ ULONG SerialNumberOffset;
+ STORAGE_BUS_TYPE BusType;
+ ULONG RawPropertiesLength;
+ UCHAR RawDeviceProperties[1];
+} STORAGE_DEVICE_DESCRIPTOR, *PSTORAGE_DEVICE_DESCRIPTOR;
+
+typedef struct _STORAGE_ADAPTER_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ ULONG MaximumTransferLength;
+ ULONG MaximumPhysicalPages;
+ ULONG AlignmentMask;
+ BOOLEAN AdapterUsesPio;
+ BOOLEAN AdapterScansDown;
+ BOOLEAN CommandQueueing;
+ BOOLEAN AcceleratedTransfer;
+#if (NTDDI_VERSION < NTDDI_WINXP)
+ BOOLEAN BusType;
+#else
+ UCHAR BusType;
+#endif
+ USHORT BusMajorVersion;
+ USHORT BusMinorVersion;
+} STORAGE_ADAPTER_DESCRIPTOR, *PSTORAGE_ADAPTER_DESCRIPTOR;
+
+typedef struct _STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ ULONG BytesPerCacheLine;
+ ULONG BytesOffsetForCacheAlignment;
+ ULONG BytesPerLogicalSector;
+ ULONG BytesPerPhysicalSector;
+ ULONG BytesOffsetForSectorAlignment;
+} STORAGE_ACCESS_ALIGNMENT_DESCRIPTOR, *PSTORAGE_ACCESS_ALIGNMENT_DESCRIPTOR;
+
+typedef enum _STORAGE_PORT_CODE_SET {
+ StoragePortCodeSetReserved = 0,
+ StoragePortCodeSetStorport = 1,
+ StoragePortCodeSetSCSIport = 2
+} STORAGE_PORT_CODE_SET, *PSTORAGE_PORT_CODE_SET;
+
+typedef struct _STORAGE_MINIPORT_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ STORAGE_PORT_CODE_SET Portdriver;
+ BOOLEAN LUNResetSupported;
+ BOOLEAN TargetResetSupported;
+} STORAGE_MINIPORT_DESCRIPTOR, *PSTORAGE_MINIPORT_DESCRIPTOR;
+
+typedef enum _STORAGE_IDENTIFIER_CODE_SET {
+ StorageIdCodeSetReserved = 0,
+ StorageIdCodeSetBinary = 1,
+ StorageIdCodeSetAscii = 2,
+ StorageIdCodeSetUtf8 = 3
+} STORAGE_IDENTIFIER_CODE_SET, *PSTORAGE_IDENTIFIER_CODE_SET;
+
+typedef enum _STORAGE_IDENTIFIER_TYPE {
+ StorageIdTypeVendorSpecific = 0,
+ StorageIdTypeVendorId = 1,
+ StorageIdTypeEUI64 = 2,
+ StorageIdTypeFCPHName = 3,
+ StorageIdTypePortRelative = 4,
+ StorageIdTypeTargetPortGroup = 5,
+ StorageIdTypeLogicalUnitGroup = 6,
+ StorageIdTypeMD5LogicalUnitIdentifier = 7,
+ StorageIdTypeScsiNameString = 8
+} STORAGE_IDENTIFIER_TYPE, *PSTORAGE_IDENTIFIER_TYPE;
+
+typedef enum _STORAGE_ID_NAA_FORMAT {
+ StorageIdNAAFormatIEEEExtended = 2,
+ StorageIdNAAFormatIEEERegistered = 3,
+ StorageIdNAAFormatIEEEERegisteredExtended = 5
+} STORAGE_ID_NAA_FORMAT, *PSTORAGE_ID_NAA_FORMAT;
+
+typedef enum _STORAGE_ASSOCIATION_TYPE {
+ StorageIdAssocDevice = 0,
+ StorageIdAssocPort = 1,
+ StorageIdAssocTarget = 2
+} STORAGE_ASSOCIATION_TYPE, *PSTORAGE_ASSOCIATION_TYPE;
+
+typedef struct _STORAGE_IDENTIFIER {
+ STORAGE_IDENTIFIER_CODE_SET CodeSet;
+ STORAGE_IDENTIFIER_TYPE Type;
+ USHORT IdentifierSize;
+ USHORT NextOffset;
+ STORAGE_ASSOCIATION_TYPE Association;
+ UCHAR Identifier[1];
+} STORAGE_IDENTIFIER, *PSTORAGE_IDENTIFIER;
+
+typedef struct _STORAGE_DEVICE_ID_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ ULONG NumberOfIdentifiers;
+ UCHAR Identifiers[1];
+} STORAGE_DEVICE_ID_DESCRIPTOR, *PSTORAGE_DEVICE_ID_DESCRIPTOR;
+
+typedef struct _DEVICE_SEEK_PENALTY_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ BOOLEAN IncursSeekPenalty;
+} DEVICE_SEEK_PENALTY_DESCRIPTOR, *PDEVICE_SEEK_PENALTY_DESCRIPTOR;
+
+typedef struct _DEVICE_WRITE_AGGREGATION_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ BOOLEAN BenefitsFromWriteAggregation;
+} DEVICE_WRITE_AGGREGATION_DESCRIPTOR, *PDEVICE_WRITE_AGGREGATION_DESCRIPTOR;
+
+typedef struct _DEVICE_TRIM_DESCRIPTOR {
+ ULONG Version;
+ ULONG Size;
+ BOOLEAN TrimEnabled;
+} DEVICE_TRIM_DESCRIPTOR, *PDEVICE_TRIM_DESCRIPTOR;
+
+typedef ULONG DEVICE_DATA_MANAGEMENT_SET_ACTION;
+
+typedef struct _DEVICE_DATA_SET_RANGE {
+ LONGLONG StartingOffset;
+ ULONGLONG LengthInBytes;
+} DEVICE_DATA_SET_RANGE, *PDEVICE_DATA_SET_RANGE;
+
+typedef struct _DEVICE_MANAGE_DATA_SET_ATTRIBUTES {
+ ULONG Size;
+ DEVICE_DATA_MANAGEMENT_SET_ACTION Action;
+ ULONG Flags;
+ ULONG ParameterBlockOffset;
+ ULONG ParameterBlockLength;
+ ULONG DataSetRangesOffset;
+ ULONG DataSetRangesLength;
+} DEVICE_MANAGE_DATA_SET_ATTRIBUTES, *PDEVICE_MANAGE_DATA_SET_ATTRIBUTES;
+
+typedef struct _DEVICE_DSM_NOTIFICATION_PARAMETERS {
+ ULONG Size;
+ ULONG Flags;
+ ULONG NumFileTypeIDs;
+ GUID FileTypeID[1];
+} DEVICE_DSM_NOTIFICATION_PARAMETERS, *PDEVICE_DSM_NOTIFICATION_PARAMETERS;
+
+typedef struct _STORAGE_GET_BC_PROPERTIES_OUTPUT {
+ ULONG MaximumRequestsPerPeriod;
+ ULONG MinimumPeriod;
+ ULONGLONG MaximumRequestSize;
+ ULONG EstimatedTimePerRequest;
+ ULONG NumOutStandingRequests;
+ ULONGLONG RequestSize;
+} STORAGE_GET_BC_PROPERTIES_OUTPUT, *PSTORAGE_GET_BC_PROPERTIES_OUTPUT;
+
+typedef struct _STORAGE_ALLOCATE_BC_STREAM_INPUT {
+ ULONG Version;
+ ULONG RequestsPerPeriod;
+ ULONG Period;
+ BOOLEAN RetryFailures;
+ BOOLEAN Discardable;
+ BOOLEAN Reserved1[2];
+ ULONG AccessType;
+ ULONG AccessMode;
+} STORAGE_ALLOCATE_BC_STREAM_INPUT, *PSTORAGE_ALLOCATE_BC_STREAM_INPUT;
+
+typedef struct _STORAGE_ALLOCATE_BC_STREAM_OUTPUT {
+ ULONGLONG RequestSize;
+ ULONG NumOutStandingRequests;
+} STORAGE_ALLOCATE_BC_STREAM_OUTPUT, *PSTORAGE_ALLOCATE_BC_STREAM_OUTPUT;
+
+typedef struct _STORAGE_PRIORITY_HINT_SUPPORT {
+ ULONG SupportFlags;
+} STORAGE_PRIORITY_HINT_SUPPORT, *PSTORAGE_PRIORITY_HINT_SUPPORT;
+
+#if defined(_MSC_EXTENSIONS)
+
+typedef struct _STORAGE_MEDIA_SERIAL_NUMBER_DATA {
+ USHORT Reserved;
+ USHORT SerialNumberLength;
+ UCHAR SerialNumber[0];
+} STORAGE_MEDIA_SERIAL_NUMBER_DATA, *PSTORAGE_MEDIA_SERIAL_NUMBER_DATA;
+
+typedef struct _PERSISTENT_RESERVE_COMMAND {
+ ULONG Version;
+ ULONG Size;
+ _ANONYMOUS_UNION union {
+ struct {
+ UCHAR ServiceAction:5;
+ UCHAR Reserved1:3;
+ USHORT AllocationLength;
+ } PR_IN;
+ struct {
+ UCHAR ServiceAction:5;
+ UCHAR Reserved1:3;
+ UCHAR Type:4;
+ UCHAR Scope:4;
+ UCHAR ParameterList[0];
+ } PR_OUT;
+ } DUMMYUNIONNAME;
+} PERSISTENT_RESERVE_COMMAND, *PPERSISTENT_RESERVE_COMMAND;
+
+#endif /* defined(_MSC_EXTENSIONS) */
+
+typedef struct _STORAGE_READ_CAPACITY {
+ ULONG Version;
+ ULONG Size;
+ ULONG BlockLength;
+ LARGE_INTEGER NumberOfBlocks;
+ LARGE_INTEGER DiskLength;
+} STORAGE_READ_CAPACITY, *PSTORAGE_READ_CAPACITY;
+
+typedef enum _WRITE_CACHE_TYPE {
+ WriteCacheTypeUnknown,
+ WriteCacheTypeNone,
+ WriteCacheTypeWriteBack,
+ WriteCacheTypeWriteThrough
+} WRITE_CACHE_TYPE;
+
+typedef enum _WRITE_CACHE_ENABLE {
+ WriteCacheEnableUnknown,
+ WriteCacheDisabled,
+ WriteCacheEnabled
+} WRITE_CACHE_ENABLE;
+
+typedef enum _WRITE_CACHE_CHANGE {
+ WriteCacheChangeUnknown,
+ WriteCacheNotChangeable,
+ WriteCacheChangeable
+} WRITE_CACHE_CHANGE;
+
+typedef enum _WRITE_THROUGH {
+ WriteThroughUnknown,
+ WriteThroughNotSupported,
+ WriteThroughSupported
+} WRITE_THROUGH;
+
+typedef struct _STORAGE_WRITE_CACHE_PROPERTY {
+ ULONG Version;
+ ULONG Size;
+ WRITE_CACHE_TYPE WriteCacheType;
+ WRITE_CACHE_ENABLE WriteCacheEnabled;
+ WRITE_CACHE_CHANGE WriteCacheChangeable;
+ WRITE_THROUGH WriteThroughSupported;
+ BOOLEAN FlushCacheSupported;
+ BOOLEAN UserDefinedPowerProtection;
+ BOOLEAN NVCacheEnabled;
+} STORAGE_WRITE_CACHE_PROPERTY, *PSTORAGE_WRITE_CACHE_PROPERTY;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NTDDSTOR_H_ */
diff --git a/include/psdk/ntdef.h b/include/psdk/ntdef.h
index 18107cdcbcc..4d6ed252d5f 100644
--- a/include/psdk/ntdef.h
+++ b/include/psdk/ntdef.h
@@ -20,8 +20,6 @@
#endif
#endif
-typedef unsigned long POINTER_64; // FIXME! HACK!!!
-
/* Pseudo Modifiers for Input Parameters */
#ifndef IN
diff --git a/include/psdk/prsht.h b/include/psdk/prsht.h
index 91f3e76de14..dc1b1afedac 100644
--- a/include/psdk/prsht.h
+++ b/include/psdk/prsht.h
@@ -82,7 +82,11 @@ extern "C" {
#if (_WIN32_IE >= 0x0500)
#define PSM_GETRESULT 1159
#define PropSheet_GetResult(hDlg) SNDMSG(hDlg, PSM_GETRESULT, 0, 0)
+
#define PSM_HWNDTOINDEX 1153
+#define PropSheet_HwndToIndex(hDlg, hwnd) \
+ (int)SNDMSG(hDlg, PSM_HWNDTOINDEX, (WPARAM)(hwnd), 0)
+
#define PSM_IDTOINDEX 1157
#define PSM_INDEXTOHWND 1154
#define PSM_INDEXTOID 1158
diff --git a/include/psdk/qos.h b/include/psdk/qos.h
index 34d483270f1..49593624c8a 100644
--- a/include/psdk/qos.h
+++ b/include/psdk/qos.h
@@ -1,26 +1,4 @@
-/*
- * qos.h
- *
- * Structures and definitions for QoS data types.
- *
- * This file is part of the w32api package.
- *
- * Contributors:
- * Created by Alex Ionescu
- *
- * THIS SOFTWARE IS NOT COPYRIGHTED
- *
- * This source code is offered for use in the public domain. You may
- * use, modify or distribute it freely.
- *
- * This code is distributed in the hope that it will be useful but
- * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
- * DISCLAIMED. This includes but is not limited to warranties of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- *
- */
-#ifndef __QOS_H
-#define __QOS_H
+#pragma once
#ifdef __cplusplus
extern "C" {
@@ -28,20 +6,68 @@ extern "C" {
typedef ULONG SERVICETYPE;
-typedef struct _flowspec
-{
- ULONG TokenRate;
- ULONG TokenBucketSize;
- ULONG PeakBandwidth;
- ULONG Latency;
- ULONG DelayVariation;
- SERVICETYPE ServiceType;
- ULONG MaxSduSize;
- ULONG MinimumPolicedSize;
+#define SERVICETYPE_NOTRAFFIC 0x00000000
+#define SERVICETYPE_BESTEFFORT 0x00000001
+#define SERVICETYPE_CONTROLLEDLOAD 0x00000002
+#define SERVICETYPE_GUARANTEED 0x00000003
+#define SERVICETYPE_NETWORK_UNAVAILABLE 0x00000004
+#define SERVICETYPE_GENERAL_INFORMATION 0x00000005
+#define SERVICETYPE_NOCHANGE 0x00000006
+#define SERVICETYPE_NONCONFORMING 0x00000009
+#define SERVICETYPE_NETWORK_CONTROL 0x0000000A
+#define SERVICETYPE_QUALITATIVE 0x0000000D
+
+#define SERVICE_BESTEFFORT 0x80010000
+#define SERVICE_CONTROLLEDLOAD 0x80020000
+#define SERVICE_GUARANTEED 0x80040000
+#define SERVICE_QUALITATIVE 0x80200000
+
+#define SERVICE_NO_TRAFFIC_CONTROL 0x81000000
+
+#define SERVICE_NO_QOS_SIGNALING 0x40000000
+
+#define QOS_NOT_SPECIFIED 0xFFFFFFFF
+
+#define POSITIVE_INFINITY_RATE 0xFFFFFFFE
+
+#define QOS_GENERAL_ID_BASE 2000
+
+#define QOS_OBJECT_END_OF_LIST (0x00000001 + QOS_GENERAL_ID_BASE)
+#define QOS_OBJECT_SD_MODE (0x00000002 + QOS_GENERAL_ID_BASE)
+#define QOS_OBJECT_SHAPING_RATE (0x00000003 + QOS_GENERAL_ID_BASE)
+#define QOS_OBJECT_DESTADDR (0x00000004 + QOS_GENERAL_ID_BASE)
+
+#define TC_NONCONF_BORROW 0
+#define TC_NONCONF_SHAPE 1
+#define TC_NONCONF_DISCARD 2
+#define TC_NONCONF_BORROW_PLUS 3
+
+typedef struct _flowspec {
+ ULONG TokenRate;
+ ULONG TokenBucketSize;
+ ULONG PeakBandwidth;
+ ULONG Latency;
+ ULONG DelayVariation;
+ SERVICETYPE ServiceType;
+ ULONG MaxSduSize;
+ ULONG MinimumPolicedSize;
} FLOWSPEC, *PFLOWSPEC, *LPFLOWSPEC;
+typedef struct _QOS_OBJECT_HDR {
+ ULONG ObjectType;
+ ULONG ObjectLength;
+} QOS_OBJECT_HDR, *LPQOS_OBJECT_HDR;
+
+typedef struct _QOS_SD_MODE {
+ QOS_OBJECT_HDR ObjectHdr;
+ ULONG ShapeDiscardMode;
+} QOS_SD_MODE, *LPQOS_SD_MODE;
+
+typedef struct _QOS_SHAPING_RATE {
+ QOS_OBJECT_HDR ObjectHdr;
+ ULONG ShapingRate;
+} QOS_SHAPING_RATE, *LPQOS_SHAPING_RATE;
+
#ifdef __cplusplus
}
#endif
-
-#endif
diff --git a/include/psdk/shellapi.h b/include/psdk/shellapi.h
index 26fe6450873..ff7b94ea3f9 100644
--- a/include/psdk/shellapi.h
+++ b/include/psdk/shellapi.h
@@ -128,6 +128,19 @@ extern "C" {
#define SHGFI_PIDL 8
#define SHGFI_USEFILEATTRIBUTES 16
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define SHIL_LARGE 0x0
+#define SHIL_SMALL 0x1
+#define SHIL_EXTRALARGE 0x2
+#define SHIL_SYSSMALL 0x3
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+#define SHIL_JUMBO 0x4
+#define SHIL_LAST SHIL_JUMBO
+#else
+#define SHIL_LAST SHIL_SYSSMALL
+#endif
+#endif
+
typedef struct _SHCREATEPROCESSINFOW
{
DWORD cbSize;
diff --git a/include/psdk/urlmon.idl b/include/psdk/urlmon.idl
index 2ab3b2b021d..c1d3bec3b57 100644
--- a/include/psdk/urlmon.idl
+++ b/include/psdk/urlmon.idl
@@ -1231,6 +1231,7 @@ interface IInternetZoneManager : IUnknown
typedef enum tagURLZONE
{
+ URLZONE_INVALID = -1,
URLZONE_PREDEFINED_MIN = 0,
URLZONE_LOCAL_MACHINE = 0,
URLZONE_INTRANET = 1,
@@ -1563,6 +1564,15 @@ interface IUri : IUnknown
Uri_PROPERTY_DWORD_LAST = Uri_PROPERTY_ZONE
} Uri_PROPERTY;
+ typedef enum
+ {
+ Uri_HOST_UNKNOWN = 0,
+ Uri_HOST_DNS = 1,
+ Uri_HOST_IPV4 = 2,
+ Uri_HOST_IPV6 = 3,
+ Uri_HOST_IDN = 4
+ } Uri_HOST_TYPE;
+
HRESULT GetPropertyBSTR(
[in] Uri_PROPERTY uriProp,
[out] BSTR *pbstrProperty,
diff --git a/include/psdk/usb.h b/include/psdk/usb.h
index 8edf7a9f552..9fe5f1de492 100644
--- a/include/psdk/usb.h
+++ b/include/psdk/usb.h
@@ -1,6 +1,26 @@
+/*
+ * usb.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Casper S. Hornstrup
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
-/* Helper macro to enable gcc's extension. */
+/* Helper macro to enable gcc's extension. */
#ifndef __GNU_EXTENSION
#ifdef __GNUC__
#define __GNU_EXTENSION __extension__
diff --git a/include/psdk/usb100.h b/include/psdk/usb100.h
index 7e43d302268..b22bd529a08 100644
--- a/include/psdk/usb100.h
+++ b/include/psdk/usb100.h
@@ -3,7 +3,7 @@
*
* USB 1.0 support
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS PSDK package.
*
* Contributors:
* Created by Casper S. Hornstrup
diff --git a/include/psdk/usb200.h b/include/psdk/usb200.h
index ad021d165fa..5d6fd656886 100644
--- a/include/psdk/usb200.h
+++ b/include/psdk/usb200.h
@@ -1,6 +1,26 @@
+/*
+ * usb200.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Magnus Olsen.
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
-/* Helper macro to enable gcc's extension. */
+/* Helper macro to enable gcc's extension. */
#ifndef __GNU_EXTENSION
#ifdef __GNUC__
#define __GNU_EXTENSION __extension__
diff --git a/include/psdk/usbcamdi.h b/include/psdk/usbcamdi.h
index 31d77733ab4..ab6d4806ec8 100644
--- a/include/psdk/usbcamdi.h
+++ b/include/psdk/usbcamdi.h
@@ -3,7 +3,7 @@
*
* USB Camera driver interface.
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS PSDK package.
*
* Contributors:
* Created by Casper S. Hornstrup
diff --git a/include/psdk/usbdi.h b/include/psdk/usbdi.h
index 014b0299a2f..0e1c3936497 100644
--- a/include/psdk/usbdi.h
+++ b/include/psdk/usbdi.h
@@ -5,7 +5,7 @@
*
* FIXME : Obsolete header.. Use usb.h instead.
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS PSDK package.
*
* Contributors:
* Created by Casper S. Hornstrup
diff --git a/include/psdk/usbioctl.h b/include/psdk/usbioctl.h
index d9aebda5d3f..646a33ab7f8 100644
--- a/include/psdk/usbioctl.h
+++ b/include/psdk/usbioctl.h
@@ -3,7 +3,7 @@
*
* USB IOCTL interface.
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS PSDK package.
*
* Contributors:
* Created by Casper S. Hornstrup
diff --git a/include/psdk/usbiodef.h b/include/psdk/usbiodef.h
index 94238ac24a4..87a55d4a973 100644
--- a/include/psdk/usbiodef.h
+++ b/include/psdk/usbiodef.h
@@ -1,3 +1,23 @@
+/*
+ * usbiodef.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Casper S. Hornstrup
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#define USB_SUBMIT_URB 0
diff --git a/include/psdk/usbrpmif.h b/include/psdk/usbrpmif.h
index c6ee0c4a6a0..9695cc7eb21 100644
--- a/include/psdk/usbrpmif.h
+++ b/include/psdk/usbrpmif.h
@@ -1,3 +1,23 @@
+/*
+ * usbrpmif.h
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Created by Amine Khaldi
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
#pragma once
#include "windef.h"
diff --git a/include/psdk/usbuser.h b/include/psdk/usbuser.h
index 0087467dd4b..188d9484abd 100644
--- a/include/psdk/usbuser.h
+++ b/include/psdk/usbuser.h
@@ -3,7 +3,7 @@
*
* USB user mode IOCTL interface
*
- * This file is part of the w32api package.
+ * This file is part of the ReactOS PSDK package.
*
* Contributors:
* Created by Casper S. Hornstrup
diff --git a/include/psdk/wincrypt.h b/include/psdk/wincrypt.h
index 3f7f4ed6e5b..540169b266d 100644
--- a/include/psdk/wincrypt.h
+++ b/include/psdk/wincrypt.h
@@ -3389,6 +3389,8 @@ typedef struct _CERT_CHAIN_ENGINE_CONFIG
DWORD dwUrlRetrievalTimeout;
DWORD MaximumCachedCertificates;
DWORD CycleDetectionModulus;
+ HCERTSTORE hExclusiveRoot;
+ HCERTSTORE hExclusiveRootTrustedPeople;
} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;
/* message-related definitions */
diff --git a/include/ddk/winddi.h b/include/psdk/winddi.h
similarity index 100%
rename from include/ddk/winddi.h
rename to include/psdk/winddi.h
diff --git a/include/ddk/winddiui.h b/include/psdk/winddiui.h
similarity index 99%
rename from include/ddk/winddiui.h
rename to include/psdk/winddiui.h
index 8105285c5e1..bb596942bd7 100644
--- a/include/ddk/winddiui.h
+++ b/include/psdk/winddiui.h
@@ -21,7 +21,7 @@
#ifndef __WINE_WINDDIUI_H
#define __WINE_WINDDIUI_H
-#include
+#include
#ifdef __cplusplus
extern "C" {
diff --git a/include/psdk/windows.h b/include/psdk/windows.h
index 342239827a8..aa5a4eb0ef8 100644
--- a/include/psdk/windows.h
+++ b/include/psdk/windows.h
@@ -17,20 +17,29 @@
#include
#endif
-#if defined(_M_IX86) && !defined(_X86_)
+#if !defined(_X86_) && !defined(_AMD64) && !defined(_IA64_) && !defined(_ALPHA_) && \
+ !defined(_ARM_) && !defined(_PPC_) && !defined(_MIPS_) && !defined(_68K_)
+
+#if defined(_M_IX86)
#define _X86_
-#elif defined(_M_ALPHA) && !defined(_ALPHA_)
+#elif defined(_M_AMD64) || defined(__x86_64__)
+#define _AMD64_
+#elif defined(_M_IA64) || defined(__ia64__)
+#define _IA64_
+#elif defined(_M_ALPHA) || defined(__alpha__)
#define _ALPHA_
-#elif defined(_M_ARM) && !defined(_ARM_)
+#elif defined(_M_ARM) || defined(__arm__)
#define _ARM_
-#elif defined(_M_PPC) && !defined(_PPC_)
+#elif defined(_M_PPC) || defined(__powerpc__)
#define _PPC_
-#elif defined(_M_MRX000) && !defined(_MIPS_)
+#elif defined(_M_MRX000) || defined(__mips__)
#define _MIPS_
-#elif defined(_M_M68K) && !defined(_68K_)
+#elif defined(_M_M68K) || defined(__68k__)
#define _68K_
#endif
+#endif
+
#ifdef RC_INVOKED
/* winresrc.h includes the necessary headers */
#include
diff --git a/include/psdk/wininet.h b/include/psdk/wininet.h
index 1cb0508ead3..a0ec4082d12 100644
--- a/include/psdk/wininet.h
+++ b/include/psdk/wininet.h
@@ -122,6 +122,9 @@ INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP)
)
#define INTERNET_ERROR_MASK_INSERT_CDROM 0x1
+#define INTERNET_ERROR_MASK_COMBINED_SEC_CERT 0x2
+#define INTERNET_ERROR_MASK_NEED_MSN_SSPI_PKG 0x4
+#define INTERNET_ERROR_MASK_LOGIN_FAILURE_DISPLAY_ENTITY_BODY 0x8
#define INTERNET_OPTIONS_MASK (~INTERNET_FLAGS_MASK)
#define WININET_API_FLAG_ASYNC 0x00000001
diff --git a/include/psdk/winioctl.h b/include/psdk/winioctl.h
index 967ac3148e0..e919fe3d7bd 100644
--- a/include/psdk/winioctl.h
+++ b/include/psdk/winioctl.h
@@ -487,9 +487,13 @@ typedef struct _PERF_BIN {
DWORD TypeOfBin;
BIN_RANGE BinsRanges[1];
} PERF_BIN,*PPERF_BIN;
+
+#ifndef _NTDDSTOR_H_
typedef struct _PREVENT_MEDIA_REMOVAL {
BOOLEAN PreventMediaRemoval;
} PREVENT_MEDIA_REMOVAL,*PPREVENT_MEDIA_REMOVAL;
+#endif
+
typedef struct RETRIEVAL_POINTERS_BUFFER {
DWORD ExtentCount;
LARGE_INTEGER StartingVcn;
diff --git a/include/psdk/winnt.h b/include/psdk/winnt.h
index 66c94b21d6d..469b5f8722c 100644
--- a/include/psdk/winnt.h
+++ b/include/psdk/winnt.h
@@ -11,20 +11,6 @@
#include
#endif
-#if defined(_M_IX86) && !defined(_X86_)
-#define _X86_
-#elif defined(_M_ALPHA) && !defined(_ALPHA_)
-#define _ALPHA_
-#elif defined(_M_ARM) && !defined(_ARM_)
-#define _ARM_
-#elif defined(_M_PPC) && !defined(_PPC_)
-#define _PPC_
-#elif defined(_M_MRX000) && !defined(_MIPS_)
-#define _MIPS_
-#elif defined(_M_M68K) && !defined(_68K_)
-#define _68K_
-#endif
-
#ifndef DECLSPEC_ALIGN
# if defined(_MSC_VER) && (_MSC_VER >= 1300) && !defined(MIDL_PASS)
# define DECLSPEC_ALIGN(x) __declspec(align(x))
@@ -148,6 +134,19 @@ typedef void* __ptr64 PVOID64;
#define STDMETHODIMPV HRESULT STDMETHODVCALLTYPE
#define STDMETHODIMPV_(type) type STDMETHODVCALLTYPE
+/* C99 restrict support */
+#if defined(ENABLE_RESTRICTED) && !defined(MIDL_PASS) && !defined(RC_INVOKED)
+ #if defined(_MSC_VER) && defined(_M_MRX000)
+ #define RESTRICTED_POINTER __restrict
+ #elif defined(__GNUC__) && ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 95)))
+ #define RESTRICTED_POINTER __restrict
+ #else
+ #define RESTRICTED_POINTER
+ #endif
+#else
+ #define RESTRICTED_POINTER
+#endif
+
typedef wchar_t WCHAR;
typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR;
typedef CONST WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR;
@@ -634,83 +633,89 @@ typedef DWORD FLONG;
#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16}
typedef enum {
- WinNullSid = 0,
- WinWorldSid = 1,
- WinLocalSid = 2,
- WinCreatorOwnerSid = 3,
- WinCreatorGroupSid = 4,
- WinCreatorOwnerServerSid = 5,
- WinCreatorGroupServerSid = 6,
- WinNtAuthoritySid = 7,
- WinDialupSid = 8,
- WinNetworkSid = 9,
- WinBatchSid = 10,
- WinInteractiveSid = 11,
- WinServiceSid = 12,
- WinAnonymousSid = 13,
- WinProxySid = 14,
- WinEnterpriseControllersSid = 15,
- WinSelfSid = 16,
- WinAuthenticatedUserSid = 17,
- WinRestrictedCodeSid = 18,
- WinTerminalServerSid = 19,
- WinRemoteLogonIdSid = 20,
- WinLogonIdsSid = 21,
- WinLocalSystemSid = 22,
- WinLocalServiceSid = 23,
- WinNetworkServiceSid = 24,
- WinBuiltinDomainSid = 25,
- WinBuiltinAdministratorsSid = 26,
- WinBuiltinUsersSid = 27,
- WinBuiltinGuestsSid = 28,
- WinBuiltinPowerUsersSid = 29,
- WinBuiltinAccountOperatorsSid = 30,
- WinBuiltinSystemOperatorsSid = 31,
- WinBuiltinPrintOperatorsSid = 32,
- WinBuiltinBackupOperatorsSid = 33,
- WinBuiltinReplicatorSid = 34,
- WinBuiltinPreWindows2000CompatibleAccessSid = 35,
- WinBuiltinRemoteDesktopUsersSid = 36,
- WinBuiltinNetworkConfigurationOperatorsSid = 37,
- WinAccountAdministratorSid = 38,
- WinAccountGuestSid = 39,
- WinAccountKrbtgtSid = 40,
- WinAccountDomainAdminsSid = 41,
- WinAccountDomainUsersSid = 42,
- WinAccountDomainGuestsSid = 43,
- WinAccountComputersSid = 44,
- WinAccountControllersSid = 45,
- WinAccountCertAdminsSid = 46,
- WinAccountSchemaAdminsSid = 47,
- WinAccountEnterpriseAdminsSid = 48,
- WinAccountPolicyAdminsSid = 49,
- WinAccountRasAndIasServersSid = 50,
- WinNTLMAuthenticationSid = 51,
- WinDigestAuthenticationSid = 52,
- WinSChannelAuthenticationSid = 53,
- WinThisOrganizationSid = 54,
- WinOtherOrganizationSid = 55,
- WinBuiltinIncomingForestTrustBuildersSid = 56,
- WinBuiltinPerfMonitoringUsersSid = 57,
- WinBuiltinPerfLoggingUsersSid = 58,
- WinBuiltinAuthorizationAccessSid = 59,
- WinBuiltinTerminalServerLicenseServersSid = 60,
- WinBuiltinDCOMUsersSid = 61,
- WinBuiltinIUsersSid = 62,
- WinIUserSid = 63,
- WinBuiltinCryptoOperatorsSid = 64,
- WinUntrustedLabelSid = 65,
- WinLowLabelSid = 66,
- WinMediumLabelSid = 67,
- WinHighLabelSid = 68,
- WinSystemLabelSid = 69,
- WinWriteRestrictedCodeSid = 70,
- WinCreatorOwnerRightsSid = 71,
- WinCacheablePrincipalsGroupSid = 72,
- WinNonCacheablePrincipalsGroupSid = 73,
- WinEnterpriseReadonlyControllersSid = 74,
- WinAccountReadonlyControllersSid = 75,
- WinBuiltinEventLogReadersGroup = 76
+ WinNullSid = 0,
+ WinWorldSid = 1,
+ WinLocalSid = 2,
+ WinCreatorOwnerSid = 3,
+ WinCreatorGroupSid = 4,
+ WinCreatorOwnerServerSid = 5,
+ WinCreatorGroupServerSid = 6,
+ WinNtAuthoritySid = 7,
+ WinDialupSid = 8,
+ WinNetworkSid = 9,
+ WinBatchSid = 10,
+ WinInteractiveSid = 11,
+ WinServiceSid = 12,
+ WinAnonymousSid = 13,
+ WinProxySid = 14,
+ WinEnterpriseControllersSid = 15,
+ WinSelfSid = 16,
+ WinAuthenticatedUserSid = 17,
+ WinRestrictedCodeSid = 18,
+ WinTerminalServerSid = 19,
+ WinRemoteLogonIdSid = 20,
+ WinLogonIdsSid = 21,
+ WinLocalSystemSid = 22,
+ WinLocalServiceSid = 23,
+ WinNetworkServiceSid = 24,
+ WinBuiltinDomainSid = 25,
+ WinBuiltinAdministratorsSid = 26,
+ WinBuiltinUsersSid = 27,
+ WinBuiltinGuestsSid = 28,
+ WinBuiltinPowerUsersSid = 29,
+ WinBuiltinAccountOperatorsSid = 30,
+ WinBuiltinSystemOperatorsSid = 31,
+ WinBuiltinPrintOperatorsSid = 32,
+ WinBuiltinBackupOperatorsSid = 33,
+ WinBuiltinReplicatorSid = 34,
+ WinBuiltinPreWindows2000CompatibleAccessSid = 35,
+ WinBuiltinRemoteDesktopUsersSid = 36,
+ WinBuiltinNetworkConfigurationOperatorsSid = 37,
+ WinAccountAdministratorSid = 38,
+ WinAccountGuestSid = 39,
+ WinAccountKrbtgtSid = 40,
+ WinAccountDomainAdminsSid = 41,
+ WinAccountDomainUsersSid = 42,
+ WinAccountDomainGuestsSid = 43,
+ WinAccountComputersSid = 44,
+ WinAccountControllersSid = 45,
+ WinAccountCertAdminsSid = 46,
+ WinAccountSchemaAdminsSid = 47,
+ WinAccountEnterpriseAdminsSid = 48,
+ WinAccountPolicyAdminsSid = 49,
+ WinAccountRasAndIasServersSid = 50,
+ WinNTLMAuthenticationSid = 51,
+ WinDigestAuthenticationSid = 52,
+ WinSChannelAuthenticationSid = 53,
+ WinThisOrganizationSid = 54,
+ WinOtherOrganizationSid = 55,
+ WinBuiltinIncomingForestTrustBuildersSid = 56,
+ WinBuiltinPerfMonitoringUsersSid = 57,
+ WinBuiltinPerfLoggingUsersSid = 58,
+ WinBuiltinAuthorizationAccessSid = 59,
+ WinBuiltinTerminalServerLicenseServersSid = 60,
+ WinBuiltinDCOMUsersSid = 61,
+ WinBuiltinIUsersSid = 62,
+ WinIUserSid = 63,
+ WinBuiltinCryptoOperatorsSid = 64,
+ WinUntrustedLabelSid = 65,
+ WinLowLabelSid = 66,
+ WinMediumLabelSid = 67,
+ WinHighLabelSid = 68,
+ WinSystemLabelSid = 69,
+ WinWriteRestrictedCodeSid = 70,
+ WinCreatorOwnerRightsSid = 71,
+ WinCacheablePrincipalsGroupSid = 72,
+ WinNonCacheablePrincipalsGroupSid = 73,
+ WinEnterpriseReadonlyControllersSid = 74,
+ WinAccountReadonlyControllersSid = 75,
+ WinBuiltinEventLogReadersGroup = 76,
+ WinNewEnterpriseReadonlyControllersSid = 77,
+ WinBuiltinCertSvcDComAccessGroup = 78,
+ WinMediumPlusLabelSid = 79,
+ WinLocalLogonSid = 80,
+ WinConsoleLogonSid = 81,
+ WinThisOrganizationCertificateSid = 82,
} WELL_KNOWN_SID_TYPE;
#define SE_CREATE_TOKEN_NAME TEXT("SeCreateTokenPrivilege")
@@ -1906,184 +1911,203 @@ typedef struct _GUID {
#define SYSTEM_MANDATORY_LABEL_ACE_TYPE (0x11)
#define ACCESS_MAX_MS_V5_ACE_TYPE (0x11)
/* end ntifs.h */
+
typedef struct _GENERIC_MAPPING {
- ACCESS_MASK GenericRead;
- ACCESS_MASK GenericWrite;
- ACCESS_MASK GenericExecute;
- ACCESS_MASK GenericAll;
+ ACCESS_MASK GenericRead;
+ ACCESS_MASK GenericWrite;
+ ACCESS_MASK GenericExecute;
+ ACCESS_MASK GenericAll;
} GENERIC_MAPPING, *PGENERIC_MAPPING;
+
typedef struct _ACE_HEADER {
- BYTE AceType;
- BYTE AceFlags;
- WORD AceSize;
+ BYTE AceType;
+ BYTE AceFlags;
+ WORD AceSize;
} ACE_HEADER, *PACE_HEADER;
typedef struct _ACCESS_ALLOWED_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;
+
typedef struct _ACCESS_DENIED_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;
+
typedef struct _SYSTEM_AUDIT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
-} SYSTEM_AUDIT_ACE;
-typedef SYSTEM_AUDIT_ACE *PSYSTEM_AUDIT_ACE;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
+} SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE;
+
typedef struct _SYSTEM_ALARM_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} SYSTEM_ALARM_ACE,*PSYSTEM_ALARM_ACE;
+
typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
+
#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 0x1
#define SYSTEM_MANDATORY_LABEL_NO_READ_UP 0x2
#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP 0x4
#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP | SYSTEM_MANDATORY_LABEL_NO_READ_UP | SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
+
typedef struct _ACCESS_ALLOWED_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} ACCESS_ALLOWED_OBJECT_ACE,*PACCESS_ALLOWED_OBJECT_ACE;
+
typedef struct _ACCESS_DENIED_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} ACCESS_DENIED_OBJECT_ACE,*PACCESS_DENIED_OBJECT_ACE;
+
typedef struct _SYSTEM_AUDIT_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} SYSTEM_AUDIT_OBJECT_ACE,*PSYSTEM_AUDIT_OBJECT_ACE;
+
typedef struct _SYSTEM_ALARM_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} SYSTEM_ALARM_OBJECT_ACE,*PSYSTEM_ALARM_OBJECT_ACE;
+
typedef struct _ACCESS_ALLOWED_CALLBACK_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} ACCESS_ALLOWED_CALLBACK_ACE, *PACCESS_ALLOWED_CALLBACK_ACE;
+
typedef struct _ACCESS_DENIED_CALLBACK_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} ACCESS_DENIED_CALLBACK_ACE, *PACCESS_DENIED_CALLBACK_ACE;
+
typedef struct _SYSTEM_AUDIT_CALLBACK_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} SYSTEM_AUDIT_CALLBACK_ACE, *PSYSTEM_AUDIT_CALLBACK_ACE;
+
typedef struct _SYSTEM_ALARM_CALLBACK_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD SidStart;
} SYSTEM_ALARM_CALLBACK_ACE, *PSYSTEM_ALARM_CALLBACK_ACE;
+
typedef struct _ACCESS_ALLOWED_CALLBACK_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} ACCESS_ALLOWED_CALLBACK_OBJECT_ACE, *PACCESS_ALLOWED_CALLBACK_OBJECT_ACE;
+
typedef struct _ACCESS_DENIED_CALLBACK_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} ACCESS_DENIED_CALLBACK_OBJECT_ACE, *PACCESS_DENIED_CALLBACK_OBJECT_ACE;
+
typedef struct _SYSTEM_AUDIT_CALLBACK_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} SYSTEM_AUDIT_CALLBACK_OBJECT_ACE, *PSYSTEM_AUDIT_CALLBACK_OBJECT_ACE;
+
typedef struct _SYSTEM_ALARM_CALLBACK_OBJECT_ACE {
- ACE_HEADER Header;
- ACCESS_MASK Mask;
- DWORD Flags;
- GUID ObjectType;
- GUID InheritedObjectType;
- DWORD SidStart;
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ DWORD Flags;
+ GUID ObjectType;
+ GUID InheritedObjectType;
+ DWORD SidStart;
} SYSTEM_ALARM_CALLBACK_OBJECT_ACE, *PSYSTEM_ALARM_CALLBACK_OBJECT_ACE;
+
typedef struct _ACL {
- BYTE AclRevision;
- BYTE Sbz1;
- WORD AclSize;
- WORD AceCount;
- WORD Sbz2;
+ BYTE AclRevision;
+ BYTE Sbz1;
+ WORD AclSize;
+ WORD AceCount;
+ WORD Sbz2;
} ACL,*PACL;
-typedef enum _ACL_INFORMATION_CLASS
-{
+
+typedef enum _ACL_INFORMATION_CLASS {
AclRevisionInformation = 1,
AclSizeInformation
} ACL_INFORMATION_CLASS;
+
typedef struct _ACL_REVISION_INFORMATION {
- DWORD AclRevision;
-} ACL_REVISION_INFORMATION;
+ DWORD AclRevision;
+} ACL_REVISION_INFORMATION, *PACL_REVISION_INFORMATION;
+
typedef struct _ACL_SIZE_INFORMATION {
- DWORD AceCount;
- DWORD AclBytesInUse;
- DWORD AclBytesFree;
-} ACL_SIZE_INFORMATION;
+ DWORD AceCount;
+ DWORD AclBytesInUse;
+ DWORD AclBytesFree;
+} ACL_SIZE_INFORMATION, *PACL_SIZE_INFORMATION;
#ifndef _LDT_ENTRY_DEFINED
#define _LDT_ENTRY_DEFINED
-typedef struct _LDT_ENTRY
-{
- USHORT LimitLow;
- USHORT BaseLow;
- union
- {
- struct
- {
- UCHAR BaseMid;
- UCHAR Flags1;
- UCHAR Flags2;
- UCHAR BaseHi;
- } Bytes;
- struct
- {
- ULONG BaseMid:8;
- ULONG Type:5;
- ULONG Dpl:2;
- ULONG Pres:1;
- ULONG LimitHi:4;
- ULONG Sys:1;
- ULONG Reserved_0:1;
- ULONG Default_Big:1;
- ULONG Granularity:1;
- ULONG BaseHi:8;
- } Bits;
- } HighWord;
+
+typedef struct _LDT_ENTRY {
+ WORD LimitLow;
+ WORD BaseLow;
+ union {
+ struct {
+ BYTE BaseMid;
+ BYTE Flags1;
+ BYTE Flags2;
+ BYTE BaseHi;
+ } Bytes;
+ struct {
+ DWORD BaseMid:8;
+ DWORD Type:5;
+ DWORD Dpl:2;
+ DWORD Pres:1;
+ DWORD LimitHi:4;
+ DWORD Sys:1;
+ DWORD Reserved_0:1;
+ DWORD Default_Big:1;
+ DWORD Granularity:1;
+ DWORD BaseHi:8;
+ } Bits;
+ } HighWord;
} LDT_ENTRY, *PLDT_ENTRY, *LPLDT_ENTRY;
-#endif
+
+#endif /* _LDT_ENTRY_DEFINED */
/* FIXME: add more machines */
#if defined(_X86_) && !defined(__PowerPC__)
@@ -2104,42 +2128,43 @@ typedef struct _LDT_ENTRY
#define EXCEPTION_EXECUTE_FAULT 8
typedef struct _FLOATING_SAVE_AREA {
- DWORD ControlWord;
- DWORD StatusWord;
- DWORD TagWord;
- DWORD ErrorOffset;
- DWORD ErrorSelector;
- DWORD DataOffset;
- DWORD DataSelector;
- BYTE RegisterArea[80];
- DWORD Cr0NpxState;
-} FLOATING_SAVE_AREA;
+ DWORD ControlWord;
+ DWORD StatusWord;
+ DWORD TagWord;
+ DWORD ErrorOffset;
+ DWORD ErrorSelector;
+ DWORD DataOffset;
+ DWORD DataSelector;
+ BYTE RegisterArea[80];
+ DWORD Cr0NpxState;
+} FLOATING_SAVE_AREA, *PFLOATING_SAVE_AREA;
+
typedef struct _CONTEXT {
- DWORD ContextFlags;
- DWORD Dr0;
- DWORD Dr1;
- DWORD Dr2;
- DWORD Dr3;
- DWORD Dr6;
- DWORD Dr7;
- FLOATING_SAVE_AREA FloatSave;
- DWORD SegGs;
- DWORD SegFs;
- DWORD SegEs;
- DWORD SegDs;
- DWORD Edi;
- DWORD Esi;
- DWORD Ebx;
- DWORD Edx;
- DWORD Ecx;
- DWORD Eax;
- DWORD Ebp;
- DWORD Eip;
- DWORD SegCs;
- DWORD EFlags;
- DWORD Esp;
- DWORD SegSs;
- BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
+ DWORD ContextFlags;
+ DWORD Dr0;
+ DWORD Dr1;
+ DWORD Dr2;
+ DWORD Dr3;
+ DWORD Dr6;
+ DWORD Dr7;
+ FLOATING_SAVE_AREA FloatSave;
+ DWORD SegGs;
+ DWORD SegFs;
+ DWORD SegEs;
+ DWORD SegDs;
+ DWORD Edi;
+ DWORD Esi;
+ DWORD Ebx;
+ DWORD Edx;
+ DWORD Ecx;
+ DWORD Eax;
+ DWORD Ebp;
+ DWORD Eip;
+ DWORD SegCs;
+ DWORD EFlags;
+ DWORD Esp;
+ DWORD SegSs;
+ BYTE ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];
} CONTEXT;
#elif defined(__x86_64__)
@@ -2300,8 +2325,8 @@ typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
PM128A Xmm13;
PM128A Xmm14;
PM128A Xmm15;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
union {
PULONG64 IntegerContext[16];
@@ -2322,8 +2347,8 @@ typedef struct _KNONVOLATILE_CONTEXT_POINTERS {
PULONG64 R13;
PULONG64 R14;
PULONG64 R15;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME2;
} KNONVOLATILE_CONTEXT_POINTERS, *PKNONVOLATILE_CONTEXT_POINTERS;
#define RUNTIME_FUNCTION_INDIRECT 0x1
@@ -2879,40 +2904,38 @@ typedef CONTEXT *PCONTEXT,*LPCONTEXT;
#define EXCEPTION_NONCONTINUABLE 1
#define EXCEPTION_MAXIMUM_PARAMETERS 15
- typedef struct _EXCEPTION_RECORD {
- DWORD ExceptionCode;
- DWORD ExceptionFlags;
- struct _EXCEPTION_RECORD *ExceptionRecord;
- PVOID ExceptionAddress;
- DWORD NumberParameters;
- ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
- } EXCEPTION_RECORD;
+typedef struct _EXCEPTION_RECORD {
+ DWORD ExceptionCode;
+ DWORD ExceptionFlags;
+ struct _EXCEPTION_RECORD *ExceptionRecord;
+ PVOID ExceptionAddress;
+ DWORD NumberParameters;
+ ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD, *PEXCEPTION_RECORD;
- typedef EXCEPTION_RECORD *PEXCEPTION_RECORD;
+typedef struct _EXCEPTION_RECORD32 {
+ DWORD ExceptionCode;
+ DWORD ExceptionFlags;
+ DWORD ExceptionRecord;
+ DWORD ExceptionAddress;
+ DWORD NumberParameters;
+ DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD32,*PEXCEPTION_RECORD32;
- typedef struct _EXCEPTION_RECORD32 {
- DWORD ExceptionCode;
- DWORD ExceptionFlags;
- DWORD ExceptionRecord;
- DWORD ExceptionAddress;
- DWORD NumberParameters;
- DWORD ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
- } EXCEPTION_RECORD32,*PEXCEPTION_RECORD32;
+typedef struct _EXCEPTION_RECORD64 {
+ DWORD ExceptionCode;
+ DWORD ExceptionFlags;
+ DWORD64 ExceptionRecord;
+ DWORD64 ExceptionAddress;
+ DWORD NumberParameters;
+ DWORD __unusedAlignment;
+ DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
+} EXCEPTION_RECORD64,*PEXCEPTION_RECORD64;
- typedef struct _EXCEPTION_RECORD64 {
- DWORD ExceptionCode;
- DWORD ExceptionFlags;
- DWORD64 ExceptionRecord;
- DWORD64 ExceptionAddress;
- DWORD NumberParameters;
- DWORD __unusedAlignment;
- DWORD64 ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
- } EXCEPTION_RECORD64,*PEXCEPTION_RECORD64;
-
- typedef struct _EXCEPTION_POINTERS {
- PEXCEPTION_RECORD ExceptionRecord;
- PCONTEXT ContextRecord;
- } EXCEPTION_POINTERS,*PEXCEPTION_POINTERS, *LPEXCEPTION_POINTERS;
+typedef struct _EXCEPTION_POINTERS {
+ PEXCEPTION_RECORD ExceptionRecord;
+ PCONTEXT ContextRecord;
+} EXCEPTION_POINTERS,*PEXCEPTION_POINTERS, *LPEXCEPTION_POINTERS;
#ifdef _M_PPC
#define LARGE_INTEGER_ORDER(x) x HighPart; DWORD LowPart;
@@ -2947,104 +2970,127 @@ typedef struct _LUID {
} LUID, *PLUID;
#include
-typedef struct _LUID_AND_ATTRIBUTES {
- LUID Luid;
- DWORD Attributes;
-} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
-#include
+typedef struct _LUID_AND_ATTRIBUTES {
+ LUID Luid;
+ DWORD Attributes;
+} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES;
typedef LUID_AND_ATTRIBUTES LUID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef LUID_AND_ATTRIBUTES_ARRAY *PLUID_AND_ATTRIBUTES_ARRAY;
+
+#include
+
typedef struct _PRIVILEGE_SET {
- DWORD PrivilegeCount;
- DWORD Control;
- LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
+ DWORD PrivilegeCount;
+ DWORD Control;
+ LUID_AND_ATTRIBUTES Privilege[ANYSIZE_ARRAY];
} PRIVILEGE_SET,*PPRIVILEGE_SET;
+
typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES,*PSECURITY_ATTRIBUTES,*LPSECURITY_ATTRIBUTES;
+
typedef enum _SECURITY_IMPERSONATION_LEVEL {
- SecurityAnonymous,
- SecurityIdentification,
- SecurityImpersonation,
- SecurityDelegation
+ SecurityAnonymous,
+ SecurityIdentification,
+ SecurityImpersonation,
+ SecurityDelegation
} SECURITY_IMPERSONATION_LEVEL,*PSECURITY_IMPERSONATION_LEVEL;
+
typedef BOOLEAN SECURITY_CONTEXT_TRACKING_MODE,*PSECURITY_CONTEXT_TRACKING_MODE;
+
typedef struct _SECURITY_QUALITY_OF_SERVICE {
- DWORD Length;
- SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
- SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
- BOOLEAN EffectiveOnly;
+ DWORD Length;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ SECURITY_CONTEXT_TRACKING_MODE ContextTrackingMode;
+ BOOLEAN EffectiveOnly;
} SECURITY_QUALITY_OF_SERVICE,*PSECURITY_QUALITY_OF_SERVICE;
+
typedef PVOID PACCESS_TOKEN;
+
typedef struct _SE_IMPERSONATION_STATE {
- PACCESS_TOKEN Token;
- BOOLEAN CopyOnOpen;
- BOOLEAN EffectiveOnly;
- SECURITY_IMPERSONATION_LEVEL Level;
+ PACCESS_TOKEN Token;
+ BOOLEAN CopyOnOpen;
+ BOOLEAN EffectiveOnly;
+ SECURITY_IMPERSONATION_LEVEL Level;
} SE_IMPERSONATION_STATE,*PSE_IMPERSONATION_STATE;
+
typedef struct _SID_IDENTIFIER_AUTHORITY {
- BYTE Value[6];
+ BYTE Value[6];
} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
+
typedef PVOID PSID;
+
typedef struct _SID {
- BYTE Revision;
- BYTE SubAuthorityCount;
- SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
- DWORD SubAuthority[ANYSIZE_ARRAY];
+ BYTE Revision;
+ BYTE SubAuthorityCount;
+ SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+ DWORD SubAuthority[ANYSIZE_ARRAY];
} SID, *PISID;
+
#define SECURITY_MIN_SID_SIZE (sizeof(SID))
#define SECURITY_MAX_SID_SIZE (FIELD_OFFSET(SID, SubAuthority) + SID_MAX_SUB_AUTHORITIES * sizeof(DWORD))
+
typedef struct _SID_AND_ATTRIBUTES {
- PSID Sid;
- DWORD Attributes;
+ PSID Sid;
+ DWORD Attributes;
} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
+
typedef struct _TOKEN_SOURCE {
- CHAR SourceName[TOKEN_SOURCE_LENGTH];
- LUID SourceIdentifier;
+ CHAR SourceName[TOKEN_SOURCE_LENGTH];
+ LUID SourceIdentifier;
} TOKEN_SOURCE,*PTOKEN_SOURCE;
+
typedef struct _TOKEN_CONTROL {
- LUID TokenId;
- LUID AuthenticationId;
- LUID ModifiedId;
- TOKEN_SOURCE TokenSource;
+ LUID TokenId;
+ LUID AuthenticationId;
+ LUID ModifiedId;
+ TOKEN_SOURCE TokenSource;
} TOKEN_CONTROL,*PTOKEN_CONTROL;
+
typedef struct _TOKEN_DEFAULT_DACL {
- PACL DefaultDacl;
+ PACL DefaultDacl;
} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;
+
typedef struct _TOKEN_GROUPS {
- DWORD GroupCount;
- SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
+ DWORD GroupCount;
+ SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
+
typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
- ULONG SidCount;
- ULONG SidLength;
- PSID_AND_ATTRIBUTES Sids;
- ULONG RestrictedSidCount;
- ULONG RestrictedSidLength;
- PSID_AND_ATTRIBUTES RestrictedSids;
- ULONG PrivilegeCount;
- ULONG PrivilegeLength;
- PLUID_AND_ATTRIBUTES Privileges;
- LUID AuthenticationId;
+ DWORD SidCount;
+ DWORD SidLength;
+ PSID_AND_ATTRIBUTES Sids;
+ DWORD RestrictedSidCount;
+ DWORD RestrictedSidLength;
+ PSID_AND_ATTRIBUTES RestrictedSids;
+ DWORD PrivilegeCount;
+ DWORD PrivilegeLength;
+ PLUID_AND_ATTRIBUTES Privileges;
+ LUID AuthenticationId;
} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
+
typedef struct _TOKEN_ORIGIN {
- LUID OriginatingLogonSession;
+ LUID OriginatingLogonSession;
} TOKEN_ORIGIN, *PTOKEN_ORIGIN;
+
typedef struct _TOKEN_OWNER {
- PSID Owner;
+ PSID Owner;
} TOKEN_OWNER,*PTOKEN_OWNER;
+
typedef struct _TOKEN_PRIMARY_GROUP {
- PSID PrimaryGroup;
+ PSID PrimaryGroup;
} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;
+
typedef struct _TOKEN_PRIVILEGES {
- DWORD PrivilegeCount;
- LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
+ DWORD PrivilegeCount;
+ LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
+
typedef enum tagTOKEN_TYPE {
TokenPrimary = 1,
TokenImpersonation
@@ -3052,46 +3098,48 @@ typedef enum tagTOKEN_TYPE {
#include
typedef struct _TOKEN_STATISTICS {
- LUID TokenId;
- LUID AuthenticationId;
- LARGE_INTEGER ExpirationTime;
- TOKEN_TYPE TokenType;
- SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
- DWORD DynamicCharged;
- DWORD DynamicAvailable;
- DWORD GroupCount;
- DWORD PrivilegeCount;
- LUID ModifiedId;
+ LUID TokenId;
+ LUID AuthenticationId;
+ LARGE_INTEGER ExpirationTime;
+ TOKEN_TYPE TokenType;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ DWORD DynamicCharged;
+ DWORD DynamicAvailable;
+ DWORD GroupCount;
+ DWORD PrivilegeCount;
+ LUID ModifiedId;
} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
#include
typedef struct _TOKEN_USER {
- SID_AND_ATTRIBUTES User;
+ SID_AND_ATTRIBUTES User;
} TOKEN_USER, *PTOKEN_USER;
+
typedef DWORD SECURITY_INFORMATION,*PSECURITY_INFORMATION;
typedef WORD SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
#ifndef _SECURITY_ATTRIBUTES_
#define _SECURITY_ATTRIBUTES_
typedef struct _SECURITY_DESCRIPTOR {
- BYTE Revision;
- BYTE Sbz1;
- SECURITY_DESCRIPTOR_CONTROL Control;
- PSID Owner;
- PSID Group;
- PACL Sacl;
- PACL Dacl;
+ BYTE Revision;
+ BYTE Sbz1;
+ SECURITY_DESCRIPTOR_CONTROL Control;
+ PSID Owner;
+ PSID Group;
+ PACL Sacl;
+ PACL Dacl;
} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
typedef PVOID PSECURITY_DESCRIPTOR;
#endif
+
typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
- BYTE Revision;
- BYTE Sbz1;
- SECURITY_DESCRIPTOR_CONTROL Control;
- DWORD Owner;
- DWORD Group;
- DWORD Sacl;
- DWORD Dacl;
+ BYTE Revision;
+ BYTE Sbz1;
+ SECURITY_DESCRIPTOR_CONTROL Control;
+ DWORD Owner;
+ DWORD Group;
+ DWORD Sacl;
+ DWORD Dacl;
} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
typedef enum _TOKEN_INFORMATION_CLASS {
@@ -3127,129 +3175,156 @@ typedef enum _TOKEN_INFORMATION_CLASS {
} TOKEN_INFORMATION_CLASS;
typedef enum _SID_NAME_USE {
- SidTypeUser=1,SidTypeGroup,SidTypeDomain,SidTypeAlias,
- SidTypeWellKnownGroup,SidTypeDeletedAccount,SidTypeInvalid,
- SidTypeUnknown
+ SidTypeUser=1,
+ SidTypeGroup,
+ SidTypeDomain,
+ SidTypeAlias,
+ SidTypeWellKnownGroup,
+ SidTypeDeletedAccount,
+ SidTypeInvalid,
+ SidTypeUnknown,
+ SidTypeComputer,
+ SidTypeLabel
} SID_NAME_USE,*PSID_NAME_USE;
+
typedef struct _QUOTA_LIMITS {
- SIZE_T PagedPoolLimit;
- SIZE_T NonPagedPoolLimit;
- SIZE_T MinimumWorkingSetSize;
- SIZE_T MaximumWorkingSetSize;
- SIZE_T PagefileLimit;
- LARGE_INTEGER TimeLimit;
+ SIZE_T PagedPoolLimit;
+ SIZE_T NonPagedPoolLimit;
+ SIZE_T MinimumWorkingSetSize;
+ SIZE_T MaximumWorkingSetSize;
+ SIZE_T PagefileLimit;
+ LARGE_INTEGER TimeLimit;
} QUOTA_LIMITS,*PQUOTA_LIMITS;
+
typedef struct _IO_COUNTERS {
- ULONGLONG ReadOperationCount;
- ULONGLONG WriteOperationCount;
- ULONGLONG OtherOperationCount;
- ULONGLONG ReadTransferCount;
- ULONGLONG WriteTransferCount;
- ULONGLONG OtherTransferCount;
+ ULONGLONG ReadOperationCount;
+ ULONGLONG WriteOperationCount;
+ ULONGLONG OtherOperationCount;
+ ULONGLONG ReadTransferCount;
+ ULONGLONG WriteTransferCount;
+ ULONGLONG OtherTransferCount;
} IO_COUNTERS, *PIO_COUNTERS;
+
typedef struct _FILE_NOTIFY_INFORMATION {
- DWORD NextEntryOffset;
- DWORD Action;
- DWORD FileNameLength;
- WCHAR FileName[1];
+ DWORD NextEntryOffset;
+ DWORD Action;
+ DWORD FileNameLength;
+ WCHAR FileName[1];
} FILE_NOTIFY_INFORMATION,*PFILE_NOTIFY_INFORMATION;
+
typedef struct _TAPE_ERASE {
- DWORD Type;
- BOOLEAN Immediate;
-} TAPE_ERASE,*PTAPE_ERASE;
+ DWORD Type;
+ BOOLEAN Immediate;
+} TAPE_ERASE, *PTAPE_ERASE;
+
typedef struct _TAPE_GET_DRIVE_PARAMETERS {
- BOOLEAN ECC;
- BOOLEAN Compression;
- BOOLEAN DataPadding;
- BOOLEAN ReportSetmarks;
- DWORD DefaultBlockSize;
- DWORD MaximumBlockSize;
- DWORD MinimumBlockSize;
- DWORD MaximumPartitionCount;
- DWORD FeaturesLow;
- DWORD FeaturesHigh;
- DWORD EOTWarningZoneSize;
-} TAPE_GET_DRIVE_PARAMETERS,*PTAPE_GET_DRIVE_PARAMETERS;
+ BOOLEAN ECC;
+ BOOLEAN Compression;
+ BOOLEAN DataPadding;
+ BOOLEAN ReportSetmarks;
+ DWORD DefaultBlockSize;
+ DWORD MaximumBlockSize;
+ DWORD MinimumBlockSize;
+ DWORD MaximumPartitionCount;
+ DWORD FeaturesLow;
+ DWORD FeaturesHigh;
+ DWORD EOTWarningZoneSize;
+} TAPE_GET_DRIVE_PARAMETERS, *PTAPE_GET_DRIVE_PARAMETERS;
+
typedef struct _TAPE_GET_MEDIA_PARAMETERS {
- LARGE_INTEGER Capacity;
- LARGE_INTEGER Remaining;
- DWORD BlockSize;
- DWORD PartitionCount;
- BOOLEAN WriteProtected;
-} TAPE_GET_MEDIA_PARAMETERS,*PTAPE_GET_MEDIA_PARAMETERS;
+ LARGE_INTEGER Capacity;
+ LARGE_INTEGER Remaining;
+ DWORD BlockSize;
+ DWORD PartitionCount;
+ BOOLEAN WriteProtected;
+} TAPE_GET_MEDIA_PARAMETERS, *PTAPE_GET_MEDIA_PARAMETERS;
+
typedef struct _TAPE_GET_POSITION {
- ULONG Type;
- ULONG Partition;
- LARGE_INTEGER Offset;
-} TAPE_GET_POSITION,*PTAPE_GET_POSITION;
+ ULONG Type;
+ ULONG Partition;
+ LARGE_INTEGER Offset;
+} TAPE_GET_POSITION, *PTAPE_GET_POSITION;
+
typedef struct _TAPE_PREPARE {
- DWORD Operation;
- BOOLEAN Immediate;
-} TAPE_PREPARE,*PTAPE_PREPARE;
+ DWORD Operation;
+ BOOLEAN Immediate;
+} TAPE_PREPARE, *PTAPE_PREPARE;
+
typedef struct _TAPE_SET_DRIVE_PARAMETERS {
- BOOLEAN ECC;
- BOOLEAN Compression;
- BOOLEAN DataPadding;
- BOOLEAN ReportSetmarks;
- ULONG EOTWarningZoneSize;
-} TAPE_SET_DRIVE_PARAMETERS,*PTAPE_SET_DRIVE_PARAMETERS;
+ BOOLEAN ECC;
+ BOOLEAN Compression;
+ BOOLEAN DataPadding;
+ BOOLEAN ReportSetmarks;
+ DWORD EOTWarningZoneSize;
+} TAPE_SET_DRIVE_PARAMETERS, *PTAPE_SET_DRIVE_PARAMETERS;
+
typedef struct _TAPE_SET_MEDIA_PARAMETERS {
- ULONG BlockSize;
+ DWORD BlockSize;
} TAPE_SET_MEDIA_PARAMETERS,*PTAPE_SET_MEDIA_PARAMETERS;
+
typedef struct _TAPE_SET_POSITION {
- DWORD Method;
- DWORD Partition;
- LARGE_INTEGER Offset;
- BOOLEAN Immediate;
-} TAPE_SET_POSITION,*PTAPE_SET_POSITION;
+ DWORD Method;
+ DWORD Partition;
+ LARGE_INTEGER Offset;
+ BOOLEAN Immediate;
+} TAPE_SET_POSITION, *PTAPE_SET_POSITION;
+
typedef struct _TAPE_WRITE_MARKS {
- DWORD Type;
- DWORD Count;
- BOOLEAN Immediate;
-} TAPE_WRITE_MARKS,*PTAPE_WRITE_MARKS;
+ DWORD Type;
+ DWORD Count;
+ BOOLEAN Immediate;
+} TAPE_WRITE_MARKS, *PTAPE_WRITE_MARKS;
+
typedef struct _TAPE_CREATE_PARTITION {
- DWORD Method;
- DWORD Count;
- DWORD Size;
-} TAPE_CREATE_PARTITION,*PTAPE_CREATE_PARTITION;
+ DWORD Method;
+ DWORD Count;
+ DWORD Size;
+} TAPE_CREATE_PARTITION, *PTAPE_CREATE_PARTITION;
+
typedef struct _MEMORY_BASIC_INFORMATION {
- PVOID BaseAddress;
- PVOID AllocationBase;
- DWORD AllocationProtect;
- SIZE_T RegionSize;
- DWORD State;
- DWORD Protect;
- DWORD Type;
-} MEMORY_BASIC_INFORMATION,*PMEMORY_BASIC_INFORMATION;
+ PVOID BaseAddress;
+ PVOID AllocationBase;
+ DWORD AllocationProtect;
+ SIZE_T RegionSize;
+ DWORD State;
+ DWORD Protect;
+ DWORD Type;
+} MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;
+
typedef struct _MESSAGE_RESOURCE_ENTRY {
- WORD Length;
- WORD Flags;
- BYTE Text[1];
-} MESSAGE_RESOURCE_ENTRY,*PMESSAGE_RESOURCE_ENTRY;
+ WORD Length;
+ WORD Flags;
+ BYTE Text[1];
+} MESSAGE_RESOURCE_ENTRY, *PMESSAGE_RESOURCE_ENTRY;
+
typedef struct _MESSAGE_RESOURCE_BLOCK {
- DWORD LowId;
- DWORD HighId;
- DWORD OffsetToEntries;
-} MESSAGE_RESOURCE_BLOCK,*PMESSAGE_RESOURCE_BLOCK;
+ DWORD LowId;
+ DWORD HighId;
+ DWORD OffsetToEntries;
+} MESSAGE_RESOURCE_BLOCK, *PMESSAGE_RESOURCE_BLOCK;
+
typedef struct _MESSAGE_RESOURCE_DATA {
- DWORD NumberOfBlocks;
- MESSAGE_RESOURCE_BLOCK Blocks[1];
+ DWORD NumberOfBlocks;
+ MESSAGE_RESOURCE_BLOCK Blocks[1];
} MESSAGE_RESOURCE_DATA,*PMESSAGE_RESOURCE_DATA;
+
typedef struct _LIST_ENTRY {
- struct _LIST_ENTRY *Flink;
- struct _LIST_ENTRY *Blink;
-} LIST_ENTRY,*PLIST_ENTRY;
+ struct _LIST_ENTRY *Flink;
+ struct _LIST_ENTRY *Blink;
+} LIST_ENTRY, *PLIST_ENTRY, *RESTRICTED_POINTER PRLIST_ENTRY;
+
typedef struct _LIST_ENTRY32 {
- DWORD Flink;
- DWORD Blink;
+ DWORD Flink;
+ DWORD Blink;
} LIST_ENTRY32,*PLIST_ENTRY32;
+
typedef struct _LIST_ENTRY64 {
- ULONGLONG Flink;
- ULONGLONG Blink;
+ ULONGLONG Flink;
+ ULONGLONG Blink;
} LIST_ENTRY64,*PLIST_ENTRY64;
typedef struct _SINGLE_LIST_ENTRY {
- struct _SINGLE_LIST_ENTRY *Next;
+ struct _SINGLE_LIST_ENTRY *Next;
} SINGLE_LIST_ENTRY,*PSINGLE_LIST_ENTRY;
//
@@ -3259,50 +3334,80 @@ typedef struct _SINGLE_LIST_ENTRY {
#define _SLIST_HEADER_
#if defined(_WIN64)
-typedef struct _SLIST_ENTRY *PSLIST_ENTRY;
+
+typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY *PSLIST_ENTRY;
+
typedef struct DECLSPEC_ALIGN(16) _SLIST_ENTRY {
- PSLIST_ENTRY Next;
+ PSLIST_ENTRY Next;
} SLIST_ENTRY;
+
+typedef struct _SLIST_ENTRY32 {
+ DWORD Next;
+} SLIST_ENTRY32, *PSLIST_ENTRY32;
+
typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
- struct {
- ULONGLONG Alignment;
- ULONGLONG Region;
- } DUMMYSTRUCTNAME;
- struct {
- ULONGLONG Depth:16;
- ULONGLONG Sequence:9;
- ULONGLONG NextEntry:39;
- ULONGLONG HeaderType:1;
- ULONGLONG Init:1;
- ULONGLONG Reserved:59;
- ULONGLONG Region:3;
- } Header8;
- struct {
- ULONGLONG Depth:16;
- ULONGLONG Sequence:48;
- ULONGLONG HeaderType:1;
- ULONGLONG Init:1;
- ULONGLONG Reserved:2;
- ULONGLONG NextEntry:60;
- } Header16;
+ _ANONYMOUS_STRUCT struct {
+ ULONGLONG Alignment;
+ ULONGLONG Region;
+ } DUMMYSTRUCTNAME;
+ struct {
+ ULONGLONG Depth:16;
+ ULONGLONG Sequence:9;
+ ULONGLONG NextEntry:39;
+ ULONGLONG HeaderType:1;
+ ULONGLONG Init:1;
+ ULONGLONG Reserved:59;
+ ULONGLONG Region:3;
+ } Header8;
+ struct {
+ ULONGLONG Depth:16;
+ ULONGLONG Sequence:48;
+ ULONGLONG HeaderType:1;
+ ULONGLONG Init:1;
+ ULONGLONG Reserved:2;
+ ULONGLONG NextEntry:60;
+ } Header16;
+ struct {
+ ULONGLONG Depth:16;
+ ULONGLONG Sequence:48;
+ ULONGLONG HeaderType:1;
+ ULONGLONG Reserved:3;
+ ULONGLONG NextEntry:60;
+ } HeaderX64;
} SLIST_HEADER, *PSLIST_HEADER;
+
+typedef union _SLIST_HEADER32{
+ ULONGLONG Alignment;
+ _ANONYMOUS_STRUCT struct {
+ SLIST_ENTRY32 Next;
+ WORD Depth;
+ WORD Sequence;
+ } DUMMYSTRUCTNAME;
+} SLIST_HEADER32, *PSLIST_HEADER32;
+
#else
+
#define SLIST_ENTRY SINGLE_LIST_ENTRY
#define _SLIST_ENTRY _SINGLE_LIST_ENTRY
#define PSLIST_ENTRY PSINGLE_LIST_ENTRY
+
+typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
+
typedef union _SLIST_HEADER {
- ULONGLONG Alignment;
- struct {
- SLIST_ENTRY Next;
- USHORT Depth;
- USHORT Sequence;
- } DUMMYSTRUCTNAME;
+ ULONGLONG Alignment;
+ _ANONYMOUS_STRUCT struct {
+ SLIST_ENTRY Next;
+ WORD Depth;
+ WORD Sequence;
+ } DUMMYSTRUCTNAME;
} SLIST_HEADER, *PSLIST_HEADER;
-#endif
+
+typedef SLIST_HEADER SLIST_HEADER32, *PSLIST_HEADER32;
+
+#endif /* defined(_WIN64) */
#endif /* _SLIST_HEADER_ */
-
NTSYSAPI
VOID
NTAPI
@@ -3347,24 +3452,27 @@ RtlQueryDepthSList (
);
typedef struct _RTL_CRITICAL_SECTION_DEBUG {
- WORD Type;
- WORD CreatorBackTraceIndex;
- struct _RTL_CRITICAL_SECTION *CriticalSection;
- LIST_ENTRY ProcessLocksList;
- DWORD EntryCount;
- DWORD ContentionCount;
- DWORD Flags;
- WORD CreatorBackTraceIndexHigh;
- WORD SpareWORD;
-} RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG;
+ WORD Type;
+ WORD CreatorBackTraceIndex;
+ struct _RTL_CRITICAL_SECTION *CriticalSection;
+ LIST_ENTRY ProcessLocksList;
+ DWORD EntryCount;
+ DWORD ContentionCount;
+ DWORD Flags;
+ WORD CreatorBackTraceIndexHigh;
+ WORD SpareWORD;
+} RTL_CRITICAL_SECTION_DEBUG, *PRTL_CRITICAL_SECTION_DEBUG, RTL_RESOURCE_DEBUG, *PRTL_RESOURCE_DEBUG;
+
+#include "pshpack8.h"
typedef struct _RTL_CRITICAL_SECTION {
- PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
- LONG LockCount;
- LONG RecursionCount;
- HANDLE OwningThread;
- HANDLE LockSemaphore;
- ULONG_PTR SpinCount;
-} RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
+ PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
+ LONG LockCount;
+ LONG RecursionCount;
+ HANDLE OwningThread;
+ HANDLE LockSemaphore;
+ ULONG_PTR SpinCount;
+} RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;
+#include "poppack.h"
NTSYSAPI
WORD
@@ -3402,16 +3510,16 @@ RtlUnwind (
);
#define RTL_SRWLOCK_INIT {0}
-typedef struct _RTL_SRWLOCK
-{
- PVOID Ptr;
+
+typedef struct _RTL_SRWLOCK {
+ PVOID Ptr;
} RTL_SRWLOCK, *PRTL_SRWLOCK;
#define RTL_CONDITION_VARIABLE_INIT {0}
#define RTL_CONDITION_VARIABLE_LOCKMODE_SHARED 0x1
-typedef struct _RTL_CONDITION_VARIABLE
-{
- PVOID Ptr;
+
+typedef struct _RTL_CONDITION_VARIABLE {
+ PVOID Ptr;
} RTL_CONDITION_VARIABLE, *PRTL_CONDITION_VARIABLE;
typedef LONG
@@ -3419,6 +3527,12 @@ typedef LONG
struct _EXCEPTION_POINTERS *ExceptionInfo
);
+typedef struct _PROCESSOR_NUMBER {
+ WORD Group;
+ BYTE Number;
+ BYTE Reserved;
+} PROCESSOR_NUMBER, *PPROCESSOR_NUMBER;
+
typedef struct _GROUP_AFFINITY {
KAFFINITY Mask;
WORD Group;
@@ -3426,292 +3540,292 @@ typedef struct _GROUP_AFFINITY {
} GROUP_AFFINITY, *PGROUP_AFFINITY;
typedef struct _EVENTLOGRECORD {
- DWORD Length;
- DWORD Reserved;
- DWORD RecordNumber;
- DWORD TimeGenerated;
- DWORD TimeWritten;
- DWORD EventID;
- WORD EventType;
- WORD NumStrings;
- WORD EventCategory;
- WORD ReservedFlags;
- DWORD ClosingRecordNumber;
- DWORD StringOffset;
- DWORD UserSidLength;
- DWORD UserSidOffset;
- DWORD DataLength;
- DWORD DataOffset;
-} EVENTLOGRECORD,*PEVENTLOGRECORD;
+ DWORD Length;
+ DWORD Reserved;
+ DWORD RecordNumber;
+ DWORD TimeGenerated;
+ DWORD TimeWritten;
+ DWORD EventID;
+ WORD EventType;
+ WORD NumStrings;
+ WORD EventCategory;
+ WORD ReservedFlags;
+ DWORD ClosingRecordNumber;
+ DWORD StringOffset;
+ DWORD UserSidLength;
+ DWORD UserSidOffset;
+ DWORD DataLength;
+ DWORD DataOffset;
+} EVENTLOGRECORD, *PEVENTLOGRECORD;
typedef struct _OSVERSIONINFOA {
- DWORD dwOSVersionInfoSize;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- DWORD dwBuildNumber;
- DWORD dwPlatformId;
- CHAR szCSDVersion[128];
-} OSVERSIONINFOA,*POSVERSIONINFOA,*LPOSVERSIONINFOA;
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ CHAR szCSDVersion[128];
+} OSVERSIONINFOA, *POSVERSIONINFOA, *LPOSVERSIONINFOA;
typedef struct _OSVERSIONINFOW {
- DWORD dwOSVersionInfoSize;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- DWORD dwBuildNumber;
- DWORD dwPlatformId;
- WCHAR szCSDVersion[128];
-} OSVERSIONINFOW,*POSVERSIONINFOW,*LPOSVERSIONINFOW;
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ WCHAR szCSDVersion[128];
+} OSVERSIONINFOW, *POSVERSIONINFOW, *LPOSVERSIONINFOW, RTL_OSVERSIONINFOW, *PRTL_OSVERSIONINFOW;
typedef struct _OSVERSIONINFOEXA {
- DWORD dwOSVersionInfoSize;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- DWORD dwBuildNumber;
- DWORD dwPlatformId;
- CHAR szCSDVersion[128];
- WORD wServicePackMajor;
- WORD wServicePackMinor;
- WORD wSuiteMask;
- BYTE wProductType;
- BYTE wReserved;
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ CHAR szCSDVersion[128];
+ WORD wServicePackMajor;
+ WORD wServicePackMinor;
+ WORD wSuiteMask;
+ BYTE wProductType;
+ BYTE wReserved;
} OSVERSIONINFOEXA, *POSVERSIONINFOEXA, *LPOSVERSIONINFOEXA;
typedef struct _OSVERSIONINFOEXW {
- DWORD dwOSVersionInfoSize;
- DWORD dwMajorVersion;
- DWORD dwMinorVersion;
- DWORD dwBuildNumber;
- DWORD dwPlatformId;
- WCHAR szCSDVersion[128];
- WORD wServicePackMajor;
- WORD wServicePackMinor;
- WORD wSuiteMask;
- BYTE wProductType;
- BYTE wReserved;
-} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW;
+ DWORD dwOSVersionInfoSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ DWORD dwBuildNumber;
+ DWORD dwPlatformId;
+ WCHAR szCSDVersion[128];
+ WORD wServicePackMajor;
+ WORD wServicePackMinor;
+ WORD wSuiteMask;
+ BYTE wProductType;
+ BYTE wReserved;
+} OSVERSIONINFOEXW, *POSVERSIONINFOEXW, *LPOSVERSIONINFOEXW, RTL_OSVERSIONINFOEXW, *PRTL_OSVERSIONINFOEXW;
#include
+
typedef struct _IMAGE_VXD_HEADER {
- WORD e32_magic;
- BYTE e32_border;
- BYTE e32_worder;
- DWORD e32_level;
- WORD e32_cpu;
- WORD e32_os;
- DWORD e32_ver;
- DWORD e32_mflags;
- DWORD e32_mpages;
- DWORD e32_startobj;
- DWORD e32_eip;
- DWORD e32_stackobj;
- DWORD e32_esp;
- DWORD e32_pagesize;
- DWORD e32_lastpagesize;
- DWORD e32_fixupsize;
- DWORD e32_fixupsum;
- DWORD e32_ldrsize;
- DWORD e32_ldrsum;
- DWORD e32_objtab;
- DWORD e32_objcnt;
- DWORD e32_objmap;
- DWORD e32_itermap;
- DWORD e32_rsrctab;
- DWORD e32_rsrccnt;
- DWORD e32_restab;
- DWORD e32_enttab;
- DWORD e32_dirtab;
- DWORD e32_dircnt;
- DWORD e32_fpagetab;
- DWORD e32_frectab;
- DWORD e32_impmod;
- DWORD e32_impmodcnt;
- DWORD e32_impproc;
- DWORD e32_pagesum;
- DWORD e32_datapage;
- DWORD e32_preload;
- DWORD e32_nrestab;
- DWORD e32_cbnrestab;
- DWORD e32_nressum;
- DWORD e32_autodata;
- DWORD e32_debuginfo;
- DWORD e32_debuglen;
- DWORD e32_instpreload;
- DWORD e32_instdemand;
- DWORD e32_heapsize;
- BYTE e32_res3[12];
- DWORD e32_winresoff;
- DWORD e32_winreslen;
- WORD e32_devid;
- WORD e32_ddkver;
-} IMAGE_VXD_HEADER,*PIMAGE_VXD_HEADER;
+ WORD e32_magic;
+ BYTE e32_border;
+ BYTE e32_worder;
+ DWORD e32_level;
+ WORD e32_cpu;
+ WORD e32_os;
+ DWORD e32_ver;
+ DWORD e32_mflags;
+ DWORD e32_mpages;
+ DWORD e32_startobj;
+ DWORD e32_eip;
+ DWORD e32_stackobj;
+ DWORD e32_esp;
+ DWORD e32_pagesize;
+ DWORD e32_lastpagesize;
+ DWORD e32_fixupsize;
+ DWORD e32_fixupsum;
+ DWORD e32_ldrsize;
+ DWORD e32_ldrsum;
+ DWORD e32_objtab;
+ DWORD e32_objcnt;
+ DWORD e32_objmap;
+ DWORD e32_itermap;
+ DWORD e32_rsrctab;
+ DWORD e32_rsrccnt;
+ DWORD e32_restab;
+ DWORD e32_enttab;
+ DWORD e32_dirtab;
+ DWORD e32_dircnt;
+ DWORD e32_fpagetab;
+ DWORD e32_frectab;
+ DWORD e32_impmod;
+ DWORD e32_impmodcnt;
+ DWORD e32_impproc;
+ DWORD e32_pagesum;
+ DWORD e32_datapage;
+ DWORD e32_preload;
+ DWORD e32_nrestab;
+ DWORD e32_cbnrestab;
+ DWORD e32_nressum;
+ DWORD e32_autodata;
+ DWORD e32_debuginfo;
+ DWORD e32_debuglen;
+ DWORD e32_instpreload;
+ DWORD e32_instdemand;
+ DWORD e32_heapsize;
+ BYTE e32_res3[12];
+ DWORD e32_winresoff;
+ DWORD e32_winreslen;
+ WORD e32_devid;
+ WORD e32_ddkver;
+} IMAGE_VXD_HEADER, *PIMAGE_VXD_HEADER;
+
+typedef struct _IMAGE_DOS_HEADER {
+ WORD e_magic;
+ WORD e_cblp;
+ WORD e_cp;
+ WORD e_crlc;
+ WORD e_cparhdr;
+ WORD e_minalloc;
+ WORD e_maxalloc;
+ WORD e_ss;
+ WORD e_sp;
+ WORD e_csum;
+ WORD e_ip;
+ WORD e_cs;
+ WORD e_lfarlc;
+ WORD e_ovno;
+ WORD e_res[4];
+ WORD e_oemid;
+ WORD e_oeminfo;
+ WORD e_res2[10];
+ LONG e_lfanew;
+} IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
+
+typedef struct _IMAGE_OS2_HEADER {
+ WORD ne_magic;
+ CHAR ne_ver;
+ CHAR ne_rev;
+ WORD ne_enttab;
+ WORD ne_cbenttab;
+ LONG ne_crc;
+ WORD ne_flags;
+ WORD ne_autodata;
+ WORD ne_heap;
+ WORD ne_stack;
+ LONG ne_csip;
+ LONG ne_sssp;
+ WORD ne_cseg;
+ WORD ne_cmod;
+ WORD ne_cbnrestab;
+ WORD ne_segtab;
+ WORD ne_rsrctab;
+ WORD ne_restab;
+ WORD ne_modtab;
+ WORD ne_imptab;
+ LONG ne_nrestab;
+ WORD ne_cmovent;
+ WORD ne_align;
+ WORD ne_cres;
+ BYTE ne_exetyp;
+ BYTE ne_flagsothers;
+ WORD ne_pretthunks;
+ WORD ne_psegrefbytes;
+ WORD ne_swaparea;
+ WORD ne_expver;
+} IMAGE_OS2_HEADER, *PIMAGE_OS2_HEADER;
+
#include
typedef struct _IMAGE_FILE_HEADER {
- WORD Machine;
- WORD NumberOfSections;
- DWORD TimeDateStamp;
- DWORD PointerToSymbolTable;
- DWORD NumberOfSymbols;
- WORD SizeOfOptionalHeader;
- WORD Characteristics;
+ WORD Machine;
+ WORD NumberOfSections;
+ DWORD TimeDateStamp;
+ DWORD PointerToSymbolTable;
+ DWORD NumberOfSymbols;
+ 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;
+ DWORD VirtualAddress;
+ DWORD Size;
+} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
typedef struct _IMAGE_OPTIONAL_HEADER32 {
- WORD Magic;
- BYTE MajorLinkerVersion;
- BYTE MinorLinkerVersion;
- DWORD SizeOfCode;
- DWORD SizeOfInitializedData;
- DWORD SizeOfUninitializedData;
- DWORD AddressOfEntryPoint;
- DWORD BaseOfCode;
- DWORD BaseOfData;
- DWORD ImageBase;
- DWORD SectionAlignment;
- DWORD FileAlignment;
- WORD MajorOperatingSystemVersion;
- WORD MinorOperatingSystemVersion;
- WORD MajorImageVersion;
- WORD MinorImageVersion;
- WORD MajorSubsystemVersion;
- WORD MinorSubsystemVersion;
- DWORD Win32VersionValue;
- DWORD SizeOfImage;
- DWORD SizeOfHeaders;
- DWORD CheckSum;
- WORD Subsystem;
- WORD DllCharacteristics;
- DWORD SizeOfStackReserve;
- DWORD SizeOfStackCommit;
- DWORD SizeOfHeapReserve;
- DWORD SizeOfHeapCommit;
- DWORD LoaderFlags;
- DWORD NumberOfRvaAndSizes;
- IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
-} IMAGE_OPTIONAL_HEADER32,*PIMAGE_OPTIONAL_HEADER32;
+ WORD Magic;
+ BYTE MajorLinkerVersion;
+ BYTE MinorLinkerVersion;
+ DWORD SizeOfCode;
+ DWORD SizeOfInitializedData;
+ DWORD SizeOfUninitializedData;
+ DWORD AddressOfEntryPoint;
+ DWORD BaseOfCode;
+ DWORD BaseOfData;
+ DWORD ImageBase;
+ DWORD SectionAlignment;
+ DWORD FileAlignment;
+ WORD MajorOperatingSystemVersion;
+ WORD MinorOperatingSystemVersion;
+ WORD MajorImageVersion;
+ WORD MinorImageVersion;
+ WORD MajorSubsystemVersion;
+ WORD MinorSubsystemVersion;
+ DWORD Win32VersionValue;
+ DWORD SizeOfImage;
+ DWORD SizeOfHeaders;
+ DWORD CheckSum;
+ WORD Subsystem;
+ WORD DllCharacteristics;
+ DWORD SizeOfStackReserve;
+ DWORD SizeOfStackCommit;
+ DWORD SizeOfHeapReserve;
+ DWORD SizeOfHeapCommit;
+ DWORD LoaderFlags;
+ 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;
- BYTE MinorLinkerVersion;
- DWORD SizeOfCode;
- DWORD SizeOfInitializedData;
- DWORD SizeOfUninitializedData;
- DWORD AddressOfEntryPoint;
- DWORD BaseOfCode;
- ULONGLONG ImageBase;
- DWORD SectionAlignment;
- DWORD FileAlignment;
- WORD MajorOperatingSystemVersion;
- WORD MinorOperatingSystemVersion;
- WORD MajorImageVersion;
- WORD MinorImageVersion;
- WORD MajorSubsystemVersion;
- WORD MinorSubsystemVersion;
- DWORD Win32VersionValue;
- DWORD SizeOfImage;
- DWORD SizeOfHeaders;
- DWORD CheckSum;
- WORD Subsystem;
- WORD DllCharacteristics;
- ULONGLONG SizeOfStackReserve;
- ULONGLONG SizeOfStackCommit;
- ULONGLONG SizeOfHeapReserve;
- ULONGLONG SizeOfHeapCommit;
- DWORD LoaderFlags;
- DWORD NumberOfRvaAndSizes;
- IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
-} IMAGE_OPTIONAL_HEADER64,*PIMAGE_OPTIONAL_HEADER64;
+ WORD Magic;
+ BYTE MajorLinkerVersion;
+ BYTE MinorLinkerVersion;
+ DWORD SizeOfCode;
+ DWORD SizeOfInitializedData;
+ DWORD SizeOfUninitializedData;
+ DWORD AddressOfEntryPoint;
+ DWORD BaseOfCode;
+ ULONGLONG ImageBase;
+ DWORD SectionAlignment;
+ DWORD FileAlignment;
+ WORD MajorOperatingSystemVersion;
+ WORD MinorOperatingSystemVersion;
+ WORD MajorImageVersion;
+ WORD MinorImageVersion;
+ WORD MajorSubsystemVersion;
+ WORD MinorSubsystemVersion;
+ DWORD Win32VersionValue;
+ DWORD SizeOfImage;
+ DWORD SizeOfHeaders;
+ DWORD CheckSum;
+ WORD Subsystem;
+ WORD DllCharacteristics;
+ ULONGLONG SizeOfStackReserve;
+ ULONGLONG SizeOfStackCommit;
+ ULONGLONG SizeOfHeapReserve;
+ ULONGLONG SizeOfHeapCommit;
+ DWORD LoaderFlags;
+ 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;
- BYTE MinorLinkerVersion;
- DWORD SizeOfCode;
- DWORD SizeOfInitializedData;
- DWORD SizeOfUninitializedData;
- DWORD AddressOfEntryPoint;
- DWORD BaseOfCode;
- DWORD BaseOfData;
- DWORD BaseOfBss;
- DWORD GprMask;
- DWORD CprMask[4];
- DWORD GpValue;
-} IMAGE_ROM_OPTIONAL_HEADER,*PIMAGE_ROM_OPTIONAL_HEADER;
-
-#include
-typedef struct _IMAGE_DOS_HEADER {
- WORD e_magic;
- WORD e_cblp;
- WORD e_cp;
- WORD e_crlc;
- WORD e_cparhdr;
- WORD e_minalloc;
- WORD e_maxalloc;
- WORD e_ss;
- WORD e_sp;
- WORD e_csum;
- WORD e_ip;
- WORD e_cs;
- WORD e_lfarlc;
- WORD e_ovno;
- WORD e_res[4];
- WORD e_oemid;
- WORD e_oeminfo;
- WORD e_res2[10];
- LONG e_lfanew;
-} IMAGE_DOS_HEADER,*PIMAGE_DOS_HEADER;
-
-typedef struct _IMAGE_OS2_HEADER {
- WORD ne_magic;
- CHAR ne_ver;
- CHAR ne_rev;
- WORD ne_enttab;
- WORD ne_cbenttab;
- LONG ne_crc;
- WORD ne_flags;
- WORD ne_autodata;
- WORD ne_heap;
- WORD ne_stack;
- LONG ne_csip;
- LONG ne_sssp;
- WORD ne_cseg;
- WORD ne_cmod;
- WORD ne_cbnrestab;
- WORD ne_segtab;
- WORD ne_rsrctab;
- WORD ne_restab;
- WORD ne_modtab;
- WORD ne_imptab;
- LONG ne_nrestab;
- WORD ne_cmovent;
- WORD ne_align;
- WORD ne_cres;
- BYTE ne_exetyp;
- BYTE ne_flagsothers;
- WORD ne_pretthunks;
- WORD ne_psegrefbytes;
- WORD ne_swaparea;
- WORD ne_expver;
-} IMAGE_OS2_HEADER,*PIMAGE_OS2_HEADER;
-#include
+ WORD Magic;
+ BYTE MajorLinkerVersion;
+ BYTE MinorLinkerVersion;
+ DWORD SizeOfCode;
+ DWORD SizeOfInitializedData;
+ DWORD SizeOfUninitializedData;
+ DWORD AddressOfEntryPoint;
+ DWORD BaseOfCode;
+ DWORD BaseOfData;
+ DWORD BaseOfBss;
+ DWORD GprMask;
+ DWORD CprMask[4];
+ DWORD GpValue;
+} IMAGE_ROM_OPTIONAL_HEADER, *PIMAGE_ROM_OPTIONAL_HEADER;
typedef struct _IMAGE_NT_HEADERS32 {
- DWORD Signature;
- IMAGE_FILE_HEADER FileHeader;
- IMAGE_OPTIONAL_HEADER32 OptionalHeader;
-} IMAGE_NT_HEADERS32,*PIMAGE_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;
+ 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;
@@ -3726,217 +3840,225 @@ 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;
+ 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 {
- DWORD PhysicalAddress;
- DWORD VirtualSize;
- } Misc;
- DWORD VirtualAddress;
- DWORD SizeOfRawData;
- DWORD PointerToRawData;
- DWORD PointerToRelocations;
- DWORD PointerToLinenumbers;
- WORD NumberOfRelocations;
- WORD NumberOfLinenumbers;
- DWORD Characteristics;
-} IMAGE_SECTION_HEADER,*PIMAGE_SECTION_HEADER;
+ BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
+ union {
+ DWORD PhysicalAddress;
+ DWORD VirtualSize;
+ } Misc;
+ DWORD VirtualAddress;
+ DWORD SizeOfRawData;
+ DWORD PointerToRawData;
+ DWORD PointerToRelocations;
+ DWORD PointerToLinenumbers;
+ WORD NumberOfRelocations;
+ WORD NumberOfLinenumbers;
+ DWORD Characteristics;
+} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
#include
+
typedef struct _IMAGE_SYMBOL {
- union {
- BYTE ShortName[8];
- struct {
- DWORD Short;
- DWORD Long;
- } Name;
- PBYTE LongName[2];
- } N;
- DWORD Value;
- SHORT SectionNumber;
- WORD Type;
- BYTE StorageClass;
- BYTE NumberOfAuxSymbols;
-} IMAGE_SYMBOL,*PIMAGE_SYMBOL;
+ union {
+ BYTE ShortName[8];
+ struct {
+ DWORD Short;
+ DWORD Long;
+ } Name;
+ PBYTE LongName[2];
+ } N;
+ DWORD Value;
+ SHORT SectionNumber;
+ WORD Type;
+ BYTE StorageClass;
+ BYTE NumberOfAuxSymbols;
+} IMAGE_SYMBOL, *PIMAGE_SYMBOL;
typedef struct _IMAGE_LINENUMBER {
- union {
- DWORD SymbolTableIndex;
- DWORD VirtualAddress;
- } Type;
- WORD Linenumber;
-} IMAGE_LINENUMBER,*PIMAGE_LINENUMBER;
+ union {
+ DWORD SymbolTableIndex;
+ DWORD VirtualAddress;
+ } Type;
+ WORD Linenumber;
+} IMAGE_LINENUMBER, UNALIGNED *PIMAGE_LINENUMBER;
+
+typedef struct IMAGE_AUX_SYMBOL_TOKEN_DEF {
+ BYTE bAuxType;
+ BYTE bReserved;
+ DWORD SymbolTableIndex;
+ BYTE rgbReserved[12];
+} IMAGE_AUX_SYMBOL_TOKEN_DEF, UNALIGNED *PIMAGE_AUX_SYMBOL_TOKEN_DEF;
typedef union _IMAGE_AUX_SYMBOL {
- struct {
- DWORD TagIndex;
- union {
- struct {
- WORD Linenumber;
- WORD Size;
- } LnSz;
- DWORD TotalSize;
- } Misc;
- union {
- struct {
- DWORD PointerToLinenumber;
- DWORD PointerToNextFunction;
- } Function;
- struct {
- WORD Dimension[4];
- } Array;
- } FcnAry;
- WORD TvIndex;
- } Sym;
- struct {
- BYTE Name[IMAGE_SIZEOF_SYMBOL];
- } File;
- struct {
- DWORD Length;
- WORD NumberOfRelocations;
- WORD NumberOfLinenumbers;
- DWORD CheckSum;
- SHORT Number;
- BYTE Selection;
- } Section;
-} IMAGE_AUX_SYMBOL,*PIMAGE_AUX_SYMBOL;
+ struct {
+ DWORD TagIndex;
+ union {
+ struct {
+ WORD Linenumber;
+ WORD Size;
+ } LnSz;
+ DWORD TotalSize;
+ } Misc;
+ union {
+ struct {
+ DWORD PointerToLinenumber;
+ DWORD PointerToNextFunction;
+ } Function;
+ struct {
+ WORD Dimension[4];
+ } Array;
+ } FcnAry;
+ WORD TvIndex;
+ } Sym;
+ struct {
+ BYTE Name[IMAGE_SIZEOF_SYMBOL];
+ } File;
+ struct {
+ DWORD Length;
+ WORD NumberOfRelocations;
+ WORD NumberOfLinenumbers;
+ DWORD CheckSum;
+ SHORT Number;
+ BYTE Selection;
+ BYTE bReserved;
+ SHORT HighNumber;
+ } Section;
+ IMAGE_AUX_SYMBOL_TOKEN_DEF TokenDef;
+ struct {
+ DWORD crc;
+ BYTE rgbReserved[14];
+ } CRC;
+} IMAGE_AUX_SYMBOL, *PIMAGE_AUX_SYMBOL;
+
+typedef struct _IMAGE_RELOCATION {
+ _ANONYMOUS_UNION union {
+ DWORD VirtualAddress;
+ DWORD RelocCount;
+ } DUMMYUNIONNAME;
+ DWORD SymbolTableIndex;
+ WORD Type;
+} IMAGE_RELOCATION, UNALIGNED *PIMAGE_RELOCATION;
+
+#include
#ifndef __IMAGE_COR20_HEADER_DEFINED__
#define __IMAGE_COR20_HEADER_DEFINED__
-typedef enum ReplacesCorHdrNumericDefines
-{
- COMIMAGE_FLAGS_ILONLY = 0x00000001,
- COMIMAGE_FLAGS_32BITREQUIRED = 0x00000002,
- COMIMAGE_FLAGS_IL_LIBRARY = 0x00000004,
- COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x00000008,
- COMIMAGE_FLAGS_TRACKDEBUGDATA = 0x00010000,
-
- COR_VERSION_MAJOR_V2 = 2,
- COR_VERSION_MAJOR = COR_VERSION_MAJOR_V2,
- COR_VERSION_MINOR = 0,
- COR_DELETED_NAME_LENGTH = 8,
- COR_VTABLEGAP_NAME_LENGTH = 8,
-
- NATIVE_TYPE_MAX_CB = 1,
- COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE = 0xff,
-
- IMAGE_COR_MIH_METHODRVA = 0x01,
- IMAGE_COR_MIH_EHRVA = 0x02,
- IMAGE_COR_MIH_BASICBLOCK = 0x08,
-
- COR_VTABLE_32BIT = 0x01,
- COR_VTABLE_64BIT = 0x02,
- COR_VTABLE_FROM_UNMANAGED = 0x04,
- COR_VTABLE_CALL_MOST_DERIVED = 0x10,
-
- IMAGE_COR_EATJ_THUNK_SIZE = 32,
-
- MAX_CLASS_NAME = 1024,
- MAX_PACKAGE_NAME = 1024,
+typedef enum ReplacesCorHdrNumericDefines {
+ COMIMAGE_FLAGS_ILONLY = 0x00000001,
+ COMIMAGE_FLAGS_32BITREQUIRED = 0x00000002,
+ COMIMAGE_FLAGS_IL_LIBRARY = 0x00000004,
+ COMIMAGE_FLAGS_STRONGNAMESIGNED = 0x00000008,
+ COMIMAGE_FLAGS_NATIVE_ENTRYPOINT = 0x00000010,
+ COMIMAGE_FLAGS_TRACKDEBUGDATA = 0x00010000,
+ COR_VERSION_MAJOR_V2 = 2,
+ COR_VERSION_MAJOR = COR_VERSION_MAJOR_V2,
+ COR_VERSION_MINOR = 0,
+ COR_DELETED_NAME_LENGTH = 8,
+ COR_VTABLEGAP_NAME_LENGTH = 8,
+ NATIVE_TYPE_MAX_CB = 1,
+ COR_ILMETHOD_SECT_SMALL_MAX_DATASIZE = 0xFF,
+ IMAGE_COR_MIH_METHODRVA = 0x01,
+ IMAGE_COR_MIH_EHRVA = 0x02,
+ IMAGE_COR_MIH_BASICBLOCK = 0x08,
+ COR_VTABLE_32BIT = 0x01,
+ COR_VTABLE_64BIT = 0x02,
+ COR_VTABLE_FROM_UNMANAGED = 0x04,
+ COR_VTABLE_FROM_UNMANAGED_RETAIN_APPDOMAIN = 0x08,
+ COR_VTABLE_CALL_MOST_DERIVED = 0x10,
+ IMAGE_COR_EATJ_THUNK_SIZE = 32,
+ MAX_CLASS_NAME = 1024,
+ MAX_PACKAGE_NAME = 1024
} ReplacesCorHdrNumericDefines;
-typedef struct IMAGE_COR20_HEADER
-{
- DWORD cb;
- WORD MajorRuntimeVersion;
- WORD MinorRuntimeVersion;
-
- IMAGE_DATA_DIRECTORY MetaData;
- DWORD Flags;
+typedef struct IMAGE_COR20_HEADER {
+ DWORD cb;
+ WORD MajorRuntimeVersion;
+ WORD MinorRuntimeVersion;
+ IMAGE_DATA_DIRECTORY MetaData;
+ DWORD Flags;
+ _ANONYMOUS_UNION union {
DWORD EntryPointToken;
-
- IMAGE_DATA_DIRECTORY Resources;
- IMAGE_DATA_DIRECTORY StrongNameSignature;
- IMAGE_DATA_DIRECTORY CodeManagerTable;
- IMAGE_DATA_DIRECTORY VTableFixups;
- IMAGE_DATA_DIRECTORY ExportAddressTableJumps;
- IMAGE_DATA_DIRECTORY ManagedNativeHeader;
-
+ DWORD EntryPointRVA;
+ } DUMMYUNIONNAME;
+ IMAGE_DATA_DIRECTORY Resources;
+ IMAGE_DATA_DIRECTORY StrongNameSignature;
+ IMAGE_DATA_DIRECTORY CodeManagerTable;
+ IMAGE_DATA_DIRECTORY VTableFixups;
+ IMAGE_DATA_DIRECTORY ExportAddressTableJumps;
+ IMAGE_DATA_DIRECTORY ManagedNativeHeader;
} IMAGE_COR20_HEADER, *PIMAGE_COR20_HEADER;
-#endif
+#endif /* __IMAGE_COR20_HEADER_DEFINED__ */
typedef struct _IMAGE_COFF_SYMBOLS_HEADER {
- DWORD NumberOfSymbols;
- DWORD LvaToFirstSymbol;
- DWORD NumberOfLinenumbers;
- DWORD LvaToFirstLinenumber;
- DWORD RvaToFirstByteOfCode;
- DWORD RvaToLastByteOfCode;
- DWORD RvaToFirstByteOfData;
- DWORD RvaToLastByteOfData;
-} IMAGE_COFF_SYMBOLS_HEADER,*PIMAGE_COFF_SYMBOLS_HEADER;
-
-typedef struct _IMAGE_RELOCATION {
- _ANONYMOUS_UNION union {
- DWORD VirtualAddress;
- DWORD RelocCount;
- } DUMMYUNIONNAME;
- DWORD SymbolTableIndex;
- WORD Type;
-} IMAGE_RELOCATION,*PIMAGE_RELOCATION;
-#include
+ DWORD NumberOfSymbols;
+ DWORD LvaToFirstSymbol;
+ DWORD NumberOfLinenumbers;
+ DWORD LvaToFirstLinenumber;
+ DWORD RvaToFirstByteOfCode;
+ DWORD RvaToLastByteOfCode;
+ DWORD RvaToFirstByteOfData;
+ DWORD RvaToLastByteOfData;
+} IMAGE_COFF_SYMBOLS_HEADER, *PIMAGE_COFF_SYMBOLS_HEADER;
typedef struct _IMAGE_BASE_RELOCATION {
- DWORD VirtualAddress;
- DWORD SizeOfBlock;
-} IMAGE_BASE_RELOCATION,*PIMAGE_BASE_RELOCATION;
+ DWORD VirtualAddress;
+ DWORD SizeOfBlock;
+} IMAGE_BASE_RELOCATION, UNALIGNED *PIMAGE_BASE_RELOCATION;
typedef struct _IMAGE_ARCHIVE_MEMBER_HEADER {
- BYTE Name[16];
- BYTE Date[12];
- BYTE UserID[6];
- BYTE GroupID[6];
- BYTE Mode[8];
- BYTE Size[10];
- BYTE EndHeader[2];
-} IMAGE_ARCHIVE_MEMBER_HEADER,*PIMAGE_ARCHIVE_MEMBER_HEADER;
+ BYTE Name[16];
+ BYTE Date[12];
+ BYTE UserID[6];
+ BYTE GroupID[6];
+ BYTE Mode[8];
+ BYTE Size[10];
+ BYTE EndHeader[2];
+} IMAGE_ARCHIVE_MEMBER_HEADER, *PIMAGE_ARCHIVE_MEMBER_HEADER;
typedef struct _IMAGE_EXPORT_DIRECTORY {
- DWORD Characteristics;
- DWORD TimeDateStamp;
- WORD MajorVersion;
- WORD MinorVersion;
- DWORD Name;
- DWORD Base;
- DWORD NumberOfFunctions;
- DWORD NumberOfNames;
- DWORD AddressOfFunctions;
- DWORD AddressOfNames;
- DWORD AddressOfNameOrdinals;
-} IMAGE_EXPORT_DIRECTORY,*PIMAGE_EXPORT_DIRECTORY;
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD Name;
+ DWORD Base;
+ DWORD NumberOfFunctions;
+ DWORD NumberOfNames;
+ DWORD AddressOfFunctions;
+ 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;
+ WORD Hint;
+ BYTE Name[1];
+} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
#include
typedef struct _IMAGE_THUNK_DATA64 {
- union {
- ULONGLONG ForwarderString;
- ULONGLONG Function;
- ULONGLONG Ordinal;
- ULONGLONG AddressOfData;
- } u1;
-} IMAGE_THUNK_DATA64;
-typedef IMAGE_THUNK_DATA64 *PIMAGE_THUNK_DATA64;
+ union {
+ ULONGLONG ForwarderString;
+ ULONGLONG Function;
+ ULONGLONG Ordinal;
+ ULONGLONG AddressOfData;
+ } u1;
+} IMAGE_THUNK_DATA64, *PIMAGE_THUNK_DATA64;
#include
typedef struct _IMAGE_THUNK_DATA32 {
- union {
- DWORD ForwarderString;
- DWORD Function;
- DWORD Ordinal;
- DWORD AddressOfData;
- } u1;
-} IMAGE_THUNK_DATA32;
-typedef IMAGE_THUNK_DATA32 *PIMAGE_THUNK_DATA32;
+ union {
+ DWORD ForwarderString;
+ DWORD Function;
+ DWORD Ordinal;
+ DWORD AddressOfData;
+ } u1;
+} IMAGE_THUNK_DATA32, *PIMAGE_THUNK_DATA32;
#define IMAGE_ORDINAL_FLAG64 0x8000000000000000ULL
#define IMAGE_ORDINAL_FLAG32 0x80000000
@@ -3949,24 +4071,23 @@ typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK)(PVOID DllHandle,DWORD Reason,PVOID Reserved);
typedef struct _IMAGE_TLS_DIRECTORY64 {
- ULONGLONG StartAddressOfRawData;
- ULONGLONG EndAddressOfRawData;
- ULONGLONG AddressOfIndex;
- ULONGLONG AddressOfCallBacks;
- DWORD SizeOfZeroFill;
- DWORD Characteristics;
-} IMAGE_TLS_DIRECTORY64;
-typedef IMAGE_TLS_DIRECTORY64 *PIMAGE_TLS_DIRECTORY64;
+ ULONGLONG StartAddressOfRawData;
+ ULONGLONG EndAddressOfRawData;
+ ULONGLONG AddressOfIndex;
+ ULONGLONG AddressOfCallBacks;
+ DWORD SizeOfZeroFill;
+ DWORD Characteristics;
+} IMAGE_TLS_DIRECTORY64, *PIMAGE_TLS_DIRECTORY64;
typedef struct _IMAGE_TLS_DIRECTORY32 {
- DWORD StartAddressOfRawData;
- DWORD EndAddressOfRawData;
- DWORD AddressOfIndex;
- DWORD AddressOfCallBacks;
- DWORD SizeOfZeroFill;
- DWORD Characteristics;
-} IMAGE_TLS_DIRECTORY32;
-typedef IMAGE_TLS_DIRECTORY32 *PIMAGE_TLS_DIRECTORY32;
+ DWORD StartAddressOfRawData;
+ DWORD EndAddressOfRawData;
+ DWORD AddressOfIndex;
+ DWORD AddressOfCallBacks;
+ DWORD SizeOfZeroFill;
+ DWORD Characteristics;
+} IMAGE_TLS_DIRECTORY32, *PIMAGE_TLS_DIRECTORY32;
+
#ifdef _WIN64
#define IMAGE_ORDINAL_FLAG IMAGE_ORDINAL_FLAG64
#define IMAGE_ORDINAL(Ordinal) IMAGE_ORDINAL64(Ordinal)
@@ -3986,230 +4107,257 @@ typedef PIMAGE_TLS_DIRECTORY32 PIMAGE_TLS_DIRECTORY;
#endif
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
- _ANONYMOUS_UNION union {
- DWORD Characteristics;
- ULONG OriginalFirstThunk;
- } DUMMYUNIONNAME;
- DWORD TimeDateStamp;
- DWORD ForwarderChain;
- DWORD Name;
- ULONG FirstThunk;
-} IMAGE_IMPORT_DESCRIPTOR,*PIMAGE_IMPORT_DESCRIPTOR;
+ _ANONYMOUS_UNION union {
+ DWORD Characteristics;
+ DWORD OriginalFirstThunk;
+ } DUMMYUNIONNAME;
+ DWORD TimeDateStamp;
+ DWORD ForwarderChain;
+ DWORD Name;
+ DWORD FirstThunk;
+} IMAGE_IMPORT_DESCRIPTOR, UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR;
typedef struct _IMAGE_BOUND_IMPORT_DESCRIPTOR {
- DWORD TimeDateStamp;
- WORD OffsetModuleName;
- WORD NumberOfModuleForwarderRefs;
-} IMAGE_BOUND_IMPORT_DESCRIPTOR,*PIMAGE_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;
+ DWORD TimeDateStamp;
+ WORD OffsetModuleName;
+ WORD Reserved;
+} IMAGE_BOUND_FORWARDER_REF, *PIMAGE_BOUND_FORWARDER_REF;
typedef struct _IMAGE_RESOURCE_DIRECTORY {
- DWORD Characteristics;
- DWORD TimeDateStamp;
- WORD MajorVersion;
- WORD MinorVersion;
- WORD NumberOfNamedEntries;
- WORD NumberOfIdEntries;
-} IMAGE_RESOURCE_DIRECTORY,*PIMAGE_RESOURCE_DIRECTORY;
-_ANONYMOUS_STRUCT typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
- _ANONYMOUS_UNION union {
- _ANONYMOUS_STRUCT struct {
- DWORD NameOffset:31;
- DWORD NameIsString:1;
- }DUMMYSTRUCTNAME1;
- DWORD Name;
- _ANONYMOUS_STRUCT struct {
- WORD Id;
- WORD __pad;
- }DUMMYSTRUCTNAME2;
- } DUMMYUNIONNAME1;
- _ANONYMOUS_UNION union {
- DWORD OffsetToData;
- _ANONYMOUS_STRUCT struct {
- DWORD OffsetToDirectory:31;
- DWORD DataIsDirectory:1;
- } DUMMYSTRUCTNAME3;
- } DUMMYUNIONNAME2;
-} IMAGE_RESOURCE_DIRECTORY_ENTRY,*PIMAGE_RESOURCE_DIRECTORY_ENTRY;
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ WORD NumberOfNamedEntries;
+ WORD NumberOfIdEntries;
+} IMAGE_RESOURCE_DIRECTORY, *PIMAGE_RESOURCE_DIRECTORY;
+
+typedef struct _IMAGE_RESOURCE_DIRECTORY_ENTRY {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ DWORD NameOffset:31;
+ DWORD NameIsString:1;
+ } DUMMYSTRUCTNAME;
+ DWORD Name;
+ WORD Id;
+ } DUMMYUNIONNAME;
+ _ANONYMOUS_UNION union {
+ DWORD OffsetToData;
+ _ANONYMOUS_STRUCT struct {
+ DWORD OffsetToDirectory:31;
+ DWORD DataIsDirectory:1;
+ } DUMMYSTRUCTNAME;
+ } 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;
+ 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;
+ 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;
+ 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;
- WORD MajorVersion;
- WORD MinorVersion;
- DWORD GlobalFlagsClear;
- DWORD GlobalFlagsSet;
- DWORD CriticalSectionDefaultTimeout;
- DWORD DeCommitFreeBlockThreshold;
- DWORD DeCommitTotalFreeThreshold;
- DWORD LockPrefixTable;
- DWORD MaximumAllocationSize;
- DWORD VirtualMemoryThreshold;
- DWORD ProcessHeapFlags;
- DWORD ProcessAffinityMask;
- WORD CSDVersion;
- WORD Reserved1;
- DWORD EditList;
- DWORD SecurityCookie;
- DWORD SEHandlerTable;
- DWORD SEHandlerCount;
-} IMAGE_LOAD_CONFIG_DIRECTORY,*PIMAGE_LOAD_CONFIG_DIRECTORY;
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY32 {
+ DWORD Size;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD GlobalFlagsClear;
+ DWORD GlobalFlagsSet;
+ DWORD CriticalSectionDefaultTimeout;
+ DWORD DeCommitFreeBlockThreshold;
+ DWORD DeCommitTotalFreeThreshold;
+ DWORD LockPrefixTable;
+ DWORD MaximumAllocationSize;
+ DWORD VirtualMemoryThreshold;
+ DWORD ProcessHeapFlags;
+ DWORD ProcessAffinityMask;
+ WORD CSDVersion;
+ WORD Reserved1;
+ DWORD EditList;
+ DWORD SecurityCookie;
+ DWORD SEHandlerTable;
+ DWORD SEHandlerCount;
+} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
+
+typedef struct _IMAGE_LOAD_CONFIG_DIRECTORY64 {
+ DWORD Size;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD GlobalFlagsClear;
+ DWORD GlobalFlagsSet;
+ DWORD CriticalSectionDefaultTimeout;
+ ULONGLONG DeCommitFreeBlockThreshold;
+ ULONGLONG DeCommitTotalFreeThreshold;
+ ULONGLONG LockPrefixTable;
+ ULONGLONG MaximumAllocationSize;
+ ULONGLONG VirtualMemoryThreshold;
+ ULONGLONG ProcessAffinityMask;
+ DWORD ProcessHeapFlags;
+ WORD CSDVersion;
+ WORD Reserved1;
+ ULONGLONG EditList;
+ ULONGLONG SecurityCookie;
+ ULONGLONG SEHandlerTable;
+ ULONGLONG SEHandlerCount;
+} IMAGE_LOAD_CONFIG_DIRECTORY64, *PIMAGE_LOAD_CONFIG_DIRECTORY64;
+
+#ifdef _WIN64
+typedef IMAGE_LOAD_CONFIG_DIRECTORY64 IMAGE_LOAD_CONFIG_DIRECTORY;
+typedef PIMAGE_LOAD_CONFIG_DIRECTORY64 PIMAGE_LOAD_CONFIG_DIRECTORY;
+#else
+typedef IMAGE_LOAD_CONFIG_DIRECTORY32 IMAGE_LOAD_CONFIG_DIRECTORY;
+typedef PIMAGE_LOAD_CONFIG_DIRECTORY32 PIMAGE_LOAD_CONFIG_DIRECTORY;
+#endif
typedef struct _IMAGE_RUNTIME_FUNCTION_ENTRY {
- DWORD BeginAddress;
- DWORD EndAddress;
- PVOID ExceptionHandler;
- PVOID HandlerData;
- DWORD PrologEndAddress;
-} IMAGE_RUNTIME_FUNCTION_ENTRY,*PIMAGE_RUNTIME_FUNCTION_ENTRY;
+ DWORD BeginAddress;
+ DWORD EndAddress;
+ DWORD UnwindInfoAddress;
+} IMAGE_RUNTIME_FUNCTION_ENTRY, *PIMAGE_RUNTIME_FUNCTION_ENTRY;
typedef struct _IMAGE_DEBUG_DIRECTORY {
- DWORD Characteristics;
- DWORD TimeDateStamp;
- WORD MajorVersion;
- WORD MinorVersion;
- DWORD Type;
- DWORD SizeOfData;
- DWORD AddressOfRawData;
- DWORD PointerToRawData;
-} IMAGE_DEBUG_DIRECTORY,*PIMAGE_DEBUG_DIRECTORY;
+ DWORD Characteristics;
+ DWORD TimeDateStamp;
+ WORD MajorVersion;
+ WORD MinorVersion;
+ DWORD Type;
+ DWORD SizeOfData;
+ DWORD AddressOfRawData;
+ DWORD PointerToRawData;
+} IMAGE_DEBUG_DIRECTORY, *PIMAGE_DEBUG_DIRECTORY;
typedef struct _FPO_DATA {
- DWORD ulOffStart;
- DWORD cbProcSize;
- DWORD cdwLocals;
- WORD cdwParams;
- WORD cbProlog:8;
- WORD cbRegs:3;
- WORD fHasSEH:1;
- WORD fUseBP:1;
- WORD reserved:1;
- WORD cbFrame:2;
-} FPO_DATA,*PFPO_DATA;
+ DWORD ulOffStart;
+ DWORD cbProcSize;
+ DWORD cdwLocals;
+ WORD cdwParams;
+ WORD cbProlog:8;
+ WORD cbRegs:3;
+ WORD fHasSEH:1;
+ WORD fUseBP:1;
+ WORD reserved:1;
+ WORD cbFrame:2;
+} FPO_DATA, *PFPO_DATA;
typedef struct _IMAGE_DEBUG_MISC {
- DWORD DataType;
- DWORD Length;
- BOOLEAN Unicode;
- BYTE Reserved[3];
- BYTE Data[1];
-} IMAGE_DEBUG_MISC,*PIMAGE_DEBUG_MISC;
+ DWORD DataType;
+ DWORD Length;
+ BOOLEAN Unicode;
+ 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;
+ DWORD StartingAddress;
+ DWORD EndingAddress;
+ DWORD EndOfPrologue;
+} IMAGE_FUNCTION_ENTRY, *PIMAGE_FUNCTION_ENTRY;
typedef struct _IMAGE_SEPARATE_DEBUG_HEADER {
- WORD Signature;
- WORD Flags;
- WORD Machine;
- WORD Characteristics;
- DWORD TimeDateStamp;
- DWORD CheckSum;
- DWORD ImageBase;
- DWORD SizeOfImage;
- DWORD NumberOfSections;
- DWORD ExportedNamesSize;
- DWORD DebugDirectorySize;
- DWORD SectionAlignment;
- DWORD Reserved[2];
-} IMAGE_SEPARATE_DEBUG_HEADER,*PIMAGE_SEPARATE_DEBUG_HEADER;
+ WORD Signature;
+ WORD Flags;
+ WORD Machine;
+ WORD Characteristics;
+ DWORD TimeDateStamp;
+ DWORD CheckSum;
+ DWORD ImageBase;
+ DWORD SizeOfImage;
+ DWORD NumberOfSections;
+ DWORD ExportedNamesSize;
+ DWORD DebugDirectorySize;
+ DWORD SectionAlignment;
+ DWORD Reserved[2];
+} IMAGE_SEPARATE_DEBUG_HEADER, *PIMAGE_SEPARATE_DEBUG_HEADER;
typedef enum _CM_SERVICE_NODE_TYPE {
- DriverType=SERVICE_KERNEL_DRIVER,
- FileSystemType=SERVICE_FILE_SYSTEM_DRIVER,
- Win32ServiceOwnProcess=SERVICE_WIN32_OWN_PROCESS,
- Win32ServiceShareProcess=SERVICE_WIN32_SHARE_PROCESS,
- AdapterType=SERVICE_ADAPTER,
- RecognizerType=SERVICE_RECOGNIZER_DRIVER
+ DriverType = SERVICE_KERNEL_DRIVER,
+ FileSystemType = SERVICE_FILE_SYSTEM_DRIVER,
+ Win32ServiceOwnProcess = SERVICE_WIN32_OWN_PROCESS,
+ Win32ServiceShareProcess = SERVICE_WIN32_SHARE_PROCESS,
+ AdapterType = SERVICE_ADAPTER,
+ RecognizerType = SERVICE_RECOGNIZER_DRIVER
} SERVICE_NODE_TYPE;
typedef enum _CM_SERVICE_LOAD_TYPE {
- BootLoad=SERVICE_BOOT_START,
- SystemLoad=SERVICE_SYSTEM_START,
- AutoLoad=SERVICE_AUTO_START,
- DemandLoad=SERVICE_DEMAND_START,
- DisableLoad=SERVICE_DISABLED
+ BootLoad = SERVICE_BOOT_START,
+ SystemLoad = SERVICE_SYSTEM_START,
+ AutoLoad = SERVICE_AUTO_START,
+ 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
+ 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;
- PVOID StackLimit;
- PVOID SubSystemTib;
- _ANONYMOUS_UNION union {
- PVOID FiberData;
- DWORD Version;
- } DUMMYUNIONNAME;
- PVOID ArbitraryUserPointer;
- struct _NT_TIB *Self;
+ struct _EXCEPTION_REGISTRATION_RECORD *ExceptionList;
+ PVOID StackBase;
+ PVOID StackLimit;
+ PVOID SubSystemTib;
+ _ANONYMOUS_UNION union {
+ PVOID FiberData;
+ DWORD Version;
+ } DUMMYUNIONNAME;
+ PVOID ArbitraryUserPointer;
+ struct _NT_TIB *Self;
} NT_TIB,*PNT_TIB;
typedef struct _NT_TIB32 {
- DWORD ExceptionList;
- DWORD StackBase;
- DWORD StackLimit;
- DWORD SubSystemTib;
- union {
- DWORD FiberData;
- DWORD Version;
- };
- DWORD ArbitraryUserPointer;
- DWORD Self;
+ DWORD ExceptionList;
+ DWORD StackBase;
+ DWORD StackLimit;
+ DWORD SubSystemTib;
+ _ANONYMOUS_UNION union {
+ DWORD FiberData;
+ DWORD Version;
+ } DUMMYUNIONNAME;
+ DWORD ArbitraryUserPointer;
+ DWORD Self;
} NT_TIB32,*PNT_TIB32;
typedef struct _NT_TIB64 {
- DWORD64 ExceptionList;
- DWORD64 StackBase;
- DWORD64 StackLimit;
- DWORD64 SubSystemTib;
- union {
- DWORD64 FiberData;
- DWORD Version;
- };
- DWORD64 ArbitraryUserPointer;
- DWORD64 Self;
+ DWORD64 ExceptionList;
+ DWORD64 StackBase;
+ DWORD64 StackLimit;
+ DWORD64 SubSystemTib;
+ _ANONYMOUS_UNION union {
+ DWORD64 FiberData;
+ DWORD Version;
+ } DUMMYUNIONNAME;
+ DWORD64 ArbitraryUserPointer;
+ DWORD64 Self;
} NT_TIB64,*PNT_TIB64;
typedef struct _REPARSE_GUID_DATA_BUFFER {
- DWORD ReparseTag;
- WORD ReparseDataLength;
- WORD Reserved;
- GUID ReparseGuid;
- struct {
- BYTE DataBuffer[1];
- } GenericReparseBuffer;
+ DWORD ReparseTag;
+ WORD ReparseDataLength;
+ WORD Reserved;
+ GUID ReparseGuid;
+ struct {
+ BYTE DataBuffer[1];
+ } GenericReparseBuffer;
} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
typedef struct _REPARSE_POINT_INFORMATION {
@@ -4218,9 +4366,9 @@ typedef struct _REPARSE_POINT_INFORMATION {
} REPARSE_POINT_INFORMATION, *PREPARSE_POINT_INFORMATION;
typedef union _FILE_SEGMENT_ELEMENT {
- PVOID64 Buffer;
- ULONGLONG Alignment;
-}FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
+ PVOID64 Buffer;
+ ULONGLONG Alignment;
+} FILE_SEGMENT_ELEMENT, *PFILE_SEGMENT_ELEMENT;
/* JOBOBJECT_BASIC_LIMIT_INFORMATION.LimitFlags constants */
#define JOB_OBJECT_LIMIT_WORKINGSET 0x0001
@@ -4275,91 +4423,92 @@ typedef union _FILE_SEGMENT_ELEMENT {
#define JOB_OBJECT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SYNCHRONIZE|31)
typedef enum _JOBOBJECTINFOCLASS {
- JobObjectBasicAccountingInformation = 1,
- JobObjectBasicLimitInformation,
- JobObjectBasicProcessIdList,
- JobObjectBasicUIRestrictions,
- JobObjectSecurityLimitInformation,
- JobObjectEndOfJobTimeInformation,
- JobObjectAssociateCompletionPortInformation,
- JobObjectBasicAndIoAccountingInformation,
- JobObjectExtendedLimitInformation,
- JobObjectJobSetInformation,
- MaxJobObjectInfoClass
+ JobObjectBasicAccountingInformation = 1,
+ JobObjectBasicLimitInformation,
+ JobObjectBasicProcessIdList,
+ JobObjectBasicUIRestrictions,
+ JobObjectSecurityLimitInformation,
+ JobObjectEndOfJobTimeInformation,
+ JobObjectAssociateCompletionPortInformation,
+ JobObjectBasicAndIoAccountingInformation,
+ JobObjectExtendedLimitInformation,
+ JobObjectJobSetInformation,
+ JobObjectGroupInformation,
+ MaxJobObjectInfoClass
} JOBOBJECTINFOCLASS;
-typedef struct _JOB_SET_ARRAY
-{
- HANDLE JobHandle;
- DWORD MemberLevel;
- DWORD Flags;
+typedef struct _JOB_SET_ARRAY {
+ HANDLE JobHandle;
+ DWORD MemberLevel;
+ DWORD Flags;
} JOB_SET_ARRAY, *PJOB_SET_ARRAY;
typedef struct _JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
- LARGE_INTEGER TotalUserTime;
- LARGE_INTEGER TotalKernelTime;
- LARGE_INTEGER ThisPeriodTotalUserTime;
- LARGE_INTEGER ThisPeriodTotalKernelTime;
- DWORD TotalPageFaultCount;
- DWORD TotalProcesses;
- DWORD ActiveProcesses;
- DWORD TotalTerminatedProcesses;
+ LARGE_INTEGER TotalUserTime;
+ LARGE_INTEGER TotalKernelTime;
+ LARGE_INTEGER ThisPeriodTotalUserTime;
+ LARGE_INTEGER ThisPeriodTotalKernelTime;
+ DWORD TotalPageFaultCount;
+ DWORD TotalProcesses;
+ DWORD ActiveProcesses;
+ DWORD TotalTerminatedProcesses;
} JOBOBJECT_BASIC_ACCOUNTING_INFORMATION,*PJOBOBJECT_BASIC_ACCOUNTING_INFORMATION;
+
typedef struct _JOBOBJECT_BASIC_LIMIT_INFORMATION {
- LARGE_INTEGER PerProcessUserTimeLimit;
- LARGE_INTEGER PerJobUserTimeLimit;
- DWORD LimitFlags;
- SIZE_T MinimumWorkingSetSize;
- SIZE_T MaximumWorkingSetSize;
- DWORD ActiveProcessLimit;
- ULONG_PTR Affinity;
- DWORD PriorityClass;
- DWORD SchedulingClass;
+ LARGE_INTEGER PerProcessUserTimeLimit;
+ LARGE_INTEGER PerJobUserTimeLimit;
+ DWORD LimitFlags;
+ SIZE_T MinimumWorkingSetSize;
+ SIZE_T MaximumWorkingSetSize;
+ DWORD ActiveProcessLimit;
+ ULONG_PTR Affinity;
+ 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];
+ 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;
+ DWORD UIRestrictionsClass;
} JOBOBJECT_BASIC_UI_RESTRICTIONS,*PJOBOBJECT_BASIC_UI_RESTRICTIONS;
typedef struct _JOBOBJECT_SECURITY_LIMIT_INFORMATION {
- DWORD SecurityLimitFlags;
- HANDLE JobToken;
- PTOKEN_GROUPS SidsToDisable;
- PTOKEN_PRIVILEGES PrivilegesToDelete;
- PTOKEN_GROUPS RestrictedSids;
+ DWORD SecurityLimitFlags;
+ HANDLE JobToken;
+ PTOKEN_GROUPS SidsToDisable;
+ PTOKEN_PRIVILEGES PrivilegesToDelete;
+ PTOKEN_GROUPS RestrictedSids;
} JOBOBJECT_SECURITY_LIMIT_INFORMATION,*PJOBOBJECT_SECURITY_LIMIT_INFORMATION;
typedef struct _JOBOBJECT_END_OF_JOB_TIME_INFORMATION {
- DWORD EndOfJobTimeAction;
+ DWORD EndOfJobTimeAction;
} JOBOBJECT_END_OF_JOB_TIME_INFORMATION,*PJOBOBJECT_END_OF_JOB_TIME_INFORMATION;
typedef struct _JOBOBJECT_ASSOCIATE_COMPLETION_PORT {
- PVOID CompletionKey;
- HANDLE CompletionPort;
+ 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_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;
- SIZE_T ProcessMemoryLimit;
- SIZE_T JobMemoryLimit;
- SIZE_T PeakProcessMemoryUsed;
- SIZE_T PeakJobMemoryUsed;
+ JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation;
+ IO_COUNTERS IoInfo;
+ SIZE_T ProcessMemoryLimit;
+ SIZE_T JobMemoryLimit;
+ SIZE_T PeakProcessMemoryUsed;
+ SIZE_T PeakJobMemoryUsed;
} JOBOBJECT_EXTENDED_LIMIT_INFORMATION,*PJOBOBJECT_EXTENDED_LIMIT_INFORMATION;
typedef struct _JOBOBJECT_JOBSET_INFORMATION {
- DWORD MemberLevel;
+ DWORD MemberLevel;
} JOBOBJECT_JOBSET_INFORMATION,*PJOBOBJECT_JOBSET_INFORMATION;
/* Fixme: Making these defines conditional on WINVER will break ddk includes */
@@ -4371,51 +4520,54 @@ typedef struct _JOBOBJECT_JOBSET_INFORMATION {
#define ES_CONTINUOUS 0x80000000
typedef enum _LATENCY_TIME {
- LT_DONT_CARE,
- LT_LOWEST_LATENCY
+ LT_DONT_CARE,
+ LT_LOWEST_LATENCY
} LATENCY_TIME, *PLATENCY_TIME;
typedef enum _SYSTEM_POWER_STATE {
- PowerSystemUnspecified,
- PowerSystemWorking,
- PowerSystemSleeping1,
- PowerSystemSleeping2,
- PowerSystemSleeping3,
- PowerSystemHibernate,
- PowerSystemShutdown,
- PowerSystemMaximum
+ PowerSystemUnspecified = 0,
+ PowerSystemWorking,
+ PowerSystemSleeping1,
+ PowerSystemSleeping2,
+ PowerSystemSleeping3,
+ PowerSystemHibernate,
+ PowerSystemShutdown,
+ PowerSystemMaximum
} SYSTEM_POWER_STATE, *PSYSTEM_POWER_STATE;
+
#define POWER_SYSTEM_MAXIMUM PowerSystemMaximum
typedef enum {
- PowerActionNone,
- PowerActionReserved,
- PowerActionSleep,
- PowerActionHibernate,
- PowerActionShutdown,
- PowerActionShutdownReset,
- PowerActionShutdownOff,
- PowerActionWarmEject
+ PowerActionNone = 0,
+ PowerActionReserved,
+ PowerActionSleep,
+ PowerActionHibernate,
+ PowerActionShutdown,
+ PowerActionShutdownReset,
+ PowerActionShutdownOff,
+ PowerActionWarmEject
} POWER_ACTION, *PPOWER_ACTION;
typedef enum _DEVICE_POWER_STATE {
- PowerDeviceUnspecified,
- PowerDeviceD0,
- PowerDeviceD1,
- PowerDeviceD2,
- PowerDeviceD3,
- PowerDeviceMaximum
+ PowerDeviceUnspecified = 0,
+ PowerDeviceD0,
+ PowerDeviceD1,
+ PowerDeviceD2,
+ PowerDeviceD3,
+ PowerDeviceMaximum
} DEVICE_POWER_STATE, *PDEVICE_POWER_STATE;
+#if (NTDDI_VERSION >= NTDDI_WINXP) || !defined(_BATCLASS_)
typedef struct {
- DWORD Granularity;
- DWORD Capacity;
+ DWORD Granularity;
+ DWORD Capacity;
} BATTERY_REPORTING_SCALE, *PBATTERY_REPORTING_SCALE;
+#endif
typedef struct _POWER_ACTION_POLICY {
- POWER_ACTION Action;
- ULONG Flags;
- ULONG EventCode;
+ POWER_ACTION Action;
+ DWORD Flags;
+ DWORD EventCode;
} POWER_ACTION_POLICY, *PPOWER_ACTION_POLICY;
/* POWER_ACTION_POLICY.Flags constants */
@@ -4446,87 +4598,93 @@ typedef struct _POWER_ACTION_POLICY {
#define PO_THROTTLE_MAXIMUM 4
typedef struct _SYSTEM_POWER_LEVEL {
- BOOLEAN Enable;
- UCHAR Spare[3];
- ULONG BatteryLevel;
- POWER_ACTION_POLICY PowerPolicy;
- SYSTEM_POWER_STATE MinSystemState;
+ BOOLEAN Enable;
+ BYTE Spare[3];
+ DWORD BatteryLevel;
+ POWER_ACTION_POLICY PowerPolicy;
+ SYSTEM_POWER_STATE MinSystemState;
} SYSTEM_POWER_LEVEL, *PSYSTEM_POWER_LEVEL;
typedef struct _SYSTEM_POWER_POLICY {
- ULONG Revision;
- POWER_ACTION_POLICY PowerButton;
- POWER_ACTION_POLICY SleepButton;
- POWER_ACTION_POLICY LidClose;
- SYSTEM_POWER_STATE LidOpenWake;
- ULONG Reserved;
- POWER_ACTION_POLICY Idle;
- ULONG IdleTimeout;
- UCHAR IdleSensitivity;
- UCHAR DynamicThrottle;
- UCHAR Spare2[2];
- SYSTEM_POWER_STATE MinSleep;
- SYSTEM_POWER_STATE MaxSleep;
- SYSTEM_POWER_STATE ReducedLatencySleep;
- ULONG WinLogonFlags;
- ULONG Spare3;
- ULONG DozeS4Timeout;
- ULONG BroadcastCapacityResolution;
- SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES];
- ULONG VideoTimeout;
- BOOLEAN VideoDimDisplay;
- ULONG VideoReserved[3];
- ULONG SpindownTimeout;
- BOOLEAN OptimizeForPower;
- UCHAR FanThrottleTolerance;
- UCHAR ForcedThrottle;
- UCHAR MinThrottle;
- POWER_ACTION_POLICY OverThrottled;
+ DWORD Revision;
+ POWER_ACTION_POLICY PowerButton;
+ POWER_ACTION_POLICY SleepButton;
+ POWER_ACTION_POLICY LidClose;
+ SYSTEM_POWER_STATE LidOpenWake;
+ DWORD Reserved;
+ POWER_ACTION_POLICY Idle;
+ DWORD IdleTimeout;
+ BYTE IdleSensitivity;
+ BYTE DynamicThrottle;
+ BYTE Spare2[2];
+ SYSTEM_POWER_STATE MinSleep;
+ SYSTEM_POWER_STATE MaxSleep;
+ SYSTEM_POWER_STATE ReducedLatencySleep;
+ DWORD WinLogonFlags;
+ DWORD Spare3;
+ DWORD DozeS4Timeout;
+ DWORD BroadcastCapacityResolution;
+ SYSTEM_POWER_LEVEL DischargePolicy[NUM_DISCHARGE_POLICIES];
+ DWORD VideoTimeout;
+ BOOLEAN VideoDimDisplay;
+ DWORD VideoReserved[3];
+ DWORD SpindownTimeout;
+ BOOLEAN OptimizeForPower;
+ BYTE FanThrottleTolerance;
+ BYTE ForcedThrottle;
+ BYTE MinThrottle;
+ POWER_ACTION_POLICY OverThrottled;
} SYSTEM_POWER_POLICY, *PSYSTEM_POWER_POLICY;
typedef struct _SYSTEM_POWER_CAPABILITIES {
- BOOLEAN PowerButtonPresent;
- BOOLEAN SleepButtonPresent;
- BOOLEAN LidPresent;
- BOOLEAN SystemS1;
- BOOLEAN SystemS2;
- BOOLEAN SystemS3;
- BOOLEAN SystemS4;
- BOOLEAN SystemS5;
- BOOLEAN HiberFilePresent;
- BOOLEAN FullWake;
- BOOLEAN VideoDimPresent;
- BOOLEAN ApmPresent;
- BOOLEAN UpsPresent;
- BOOLEAN ThermalControl;
- BOOLEAN ProcessorThrottle;
- UCHAR ProcessorMinThrottle;
- UCHAR ProcessorMaxThrottle;
- UCHAR spare2[4];
- BOOLEAN DiskSpinDown;
- UCHAR spare3[8];
- BOOLEAN SystemBatteriesPresent;
- BOOLEAN BatteriesAreShortTerm;
- BATTERY_REPORTING_SCALE BatteryScale[3];
- SYSTEM_POWER_STATE AcOnLineWake;
- SYSTEM_POWER_STATE SoftLidWake;
- SYSTEM_POWER_STATE RtcWake;
- SYSTEM_POWER_STATE MinDeviceWakeState;
- SYSTEM_POWER_STATE DefaultLowLatencyWake;
+ BOOLEAN PowerButtonPresent;
+ BOOLEAN SleepButtonPresent;
+ BOOLEAN LidPresent;
+ BOOLEAN SystemS1;
+ BOOLEAN SystemS2;
+ BOOLEAN SystemS3;
+ BOOLEAN SystemS4;
+ BOOLEAN SystemS5;
+ BOOLEAN HiberFilePresent;
+ BOOLEAN FullWake;
+ BOOLEAN VideoDimPresent;
+ BOOLEAN ApmPresent;
+ BOOLEAN UpsPresent;
+ BOOLEAN ThermalControl;
+ BOOLEAN ProcessorThrottle;
+ BYTE ProcessorMinThrottle;
+#if (NTDDI_VERSION < NTDDI_WINXP)
+ BYTE ProcessorThrottleScale;
+ BYTE spare2[4];
+#else
+ BYTE ProcessorMaxThrottle;
+ BOOLEAN FastSystemS4;
+ BYTE spare2[3];
+#endif /* (NTDDI_VERSION < NTDDI_WINXP) */
+ BOOLEAN DiskSpinDown;
+ BYTE spare3[8];
+ BOOLEAN SystemBatteriesPresent;
+ BOOLEAN BatteriesAreShortTerm;
+ BATTERY_REPORTING_SCALE BatteryScale[3];
+ SYSTEM_POWER_STATE AcOnLineWake;
+ SYSTEM_POWER_STATE SoftLidWake;
+ SYSTEM_POWER_STATE RtcWake;
+ SYSTEM_POWER_STATE MinDeviceWakeState;
+ SYSTEM_POWER_STATE DefaultLowLatencyWake;
} SYSTEM_POWER_CAPABILITIES, *PSYSTEM_POWER_CAPABILITIES;
typedef struct _SYSTEM_BATTERY_STATE {
- BOOLEAN AcOnLine;
- BOOLEAN BatteryPresent;
- BOOLEAN Charging;
- BOOLEAN Discharging;
- BOOLEAN Spare1[4];
- ULONG MaxCapacity;
- ULONG RemainingCapacity;
- ULONG Rate;
- ULONG EstimatedTime;
- ULONG DefaultAlert1;
- ULONG DefaultAlert2;
+ BOOLEAN AcOnLine;
+ BOOLEAN BatteryPresent;
+ BOOLEAN Charging;
+ BOOLEAN Discharging;
+ BOOLEAN Spare1[4];
+ DWORD MaxCapacity;
+ DWORD RemainingCapacity;
+ DWORD Rate;
+ DWORD EstimatedTime;
+ DWORD DefaultAlert1;
+ DWORD DefaultAlert2;
} SYSTEM_BATTERY_STATE, *PSYSTEM_BATTERY_STATE;
typedef struct _PROCESSOR_POWER_INFORMATION {
@@ -4539,30 +4697,61 @@ typedef struct _PROCESSOR_POWER_INFORMATION {
} PROCESSOR_POWER_INFORMATION, *PPROCESSOR_POWER_INFORMATION;
typedef DWORD EXECUTION_STATE;
+
typedef enum _POWER_INFORMATION_LEVEL {
- SystemPowerPolicyAc,
- SystemPowerPolicyDc,
- VerifySystemPolicyAc,
- VerifySystemPolicyDc,
- SystemPowerCapabilities,
- SystemBatteryState,
- SystemPowerStateHandler,
- ProcessorStateHandler,
- SystemPowerPolicyCurrent,
- AdministratorPowerPolicy,
- SystemReserveHiberFile,
- ProcessorInformation,
- SystemPowerInformation,
- ProcessorStateHandler2,
- LastWakeTime,
- LastSleepTime,
- SystemExecutionState,
- SystemPowerStateNotifyHandler,
- ProcessorPowerPolicyAc,
- ProcessorPowerPolicyDc,
- VerifyProcessorPowerPolicyAc,
- VerifyProcessorPowerPolicyDc,
- ProcessorPowerPolicyCurrent
+ SystemPowerPolicyAc,
+ SystemPowerPolicyDc,
+ VerifySystemPolicyAc,
+ VerifySystemPolicyDc,
+ SystemPowerCapabilities,
+ SystemBatteryState,
+ SystemPowerStateHandler,
+ ProcessorStateHandler,
+ SystemPowerPolicyCurrent,
+ AdministratorPowerPolicy,
+ SystemReserveHiberFile,
+ ProcessorInformation,
+ SystemPowerInformation,
+ ProcessorStateHandler2,
+ LastWakeTime,
+ LastSleepTime,
+ SystemExecutionState,
+ SystemPowerStateNotifyHandler,
+ ProcessorPowerPolicyAc,
+ ProcessorPowerPolicyDc,
+ VerifyProcessorPowerPolicyAc,
+ VerifyProcessorPowerPolicyDc,
+ ProcessorPowerPolicyCurrent,
+ SystemPowerStateLogging,
+ SystemPowerLoggingEntry,
+ SetPowerSettingValue,
+ NotifyUserPowerSetting,
+ PowerInformationLevelUnused0,
+ PowerInformationLevelUnused1,
+ SystemVideoState,
+ TraceApplicationPowerMessage,
+ TraceApplicationPowerMessageEnd,
+ ProcessorPerfStates,
+ ProcessorIdleStates,
+ ProcessorCap,
+ SystemWakeSource,
+ SystemHiberFileInformation,
+ TraceServicePowerMessage,
+ ProcessorLoad,
+ PowerShutdownNotification,
+ MonitorCapabilities,
+ SessionPowerInit,
+ SessionDisplayState,
+ PowerRequestCreate,
+ PowerRequestAction,
+ GetPowerRequestList,
+ ProcessorInformationEx,
+ NotifyUserModeLegacyPowerEvent,
+ GroupPark,
+ ProcessorIdleDomains,
+ WakeTimerList,
+ SystemHiberFileSize,
+ PowerInformationLevelMaximum
} POWER_INFORMATION_LEVEL;
#if 1 /* (WIN32_WINNT >= 0x0500) */
@@ -4577,65 +4766,77 @@ typedef struct _SYSTEM_POWER_INFORMATION {
#if (_WIN32_WINNT >= 0x0500)
#define _AUDIT_EVENT_TYPE_HACK 1
typedef enum _AUDIT_EVENT_TYPE {
- AuditEventObjectAccess,
- AuditEventDirectoryServiceAccess
+ AuditEventObjectAccess,
+ AuditEventDirectoryServiceAccess
} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
#endif
#if (_WIN32_WINNT >= 0x0501)
+
typedef enum _ACTIVATION_CONTEXT_INFO_CLASS {
- ActivationContextBasicInformation = 1,
- ActivationContextDetailedInformation,
- AssemblyDetailedInformationInActivationContext,
- FileInformationInAssemblyOfAssemblyInActivationContext
+ ActivationContextBasicInformation = 1,
+ ActivationContextDetailedInformation = 2,
+ AssemblyDetailedInformationInActivationContext = 3,
+ FileInformationInAssemblyOfAssemblyInActivationContext = 4,
+ RunlevelInformationInActivationContext = 5,
+ CompatibilityInformationInActivationContext = 6,
+ ActivationContextManifestResourceName = 7,
+ MaxActivationContextInfoClass,
+/* For compatibility with the old names */
+ AssemblyDetailedInformationInActivationContxt = 3,
+ FileInformationInAssemblyOfAssemblyInActivationContxt = 4
} ACTIVATION_CONTEXT_INFO_CLASS;
+
typedef struct _ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION {
- DWORD ulFlags;
- DWORD ulEncodedAssemblyIdentityLength;
- DWORD ulManifestPathType;
- DWORD ulManifestPathLength;
- LARGE_INTEGER liManifestLastWriteTime;
- DWORD ulPolicyPathType;
- DWORD ulPolicyPathLength;
- LARGE_INTEGER liPolicyLastWriteTime;
- DWORD ulMetadataSatelliteRosterIndex;
- DWORD ulManifestVersionMajor;
- DWORD ulManifestVersionMinor;
- DWORD ulPolicyVersionMajor;
- DWORD ulPolicyVersionMinor;
- DWORD ulAssemblyDirectoryNameLength;
- PCWSTR lpAssemblyEncodedAssemblyIdentity;
- PCWSTR lpAssemblyManifestPath;
- PCWSTR lpAssemblyPolicyPath;
- PCWSTR lpAssemblyDirectoryName;
-} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION,*PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
+ DWORD ulFlags;
+ DWORD ulEncodedAssemblyIdentityLength;
+ DWORD ulManifestPathType;
+ DWORD ulManifestPathLength;
+ LARGE_INTEGER liManifestLastWriteTime;
+ DWORD ulPolicyPathType;
+ DWORD ulPolicyPathLength;
+ LARGE_INTEGER liPolicyLastWriteTime;
+ DWORD ulMetadataSatelliteRosterIndex;
+ DWORD ulManifestVersionMajor;
+ DWORD ulManifestVersionMinor;
+ DWORD ulPolicyVersionMajor;
+ DWORD ulPolicyVersionMinor;
+ DWORD ulAssemblyDirectoryNameLength;
+ PCWSTR lpAssemblyEncodedAssemblyIdentity;
+ PCWSTR lpAssemblyManifestPath;
+ PCWSTR lpAssemblyPolicyPath;
+ PCWSTR lpAssemblyDirectoryName;
+} ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
typedef const ACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_ASSEMBLY_DETAILED_INFORMATION;
+
typedef struct _ACTIVATION_CONTEXT_DETAILED_INFORMATION {
- DWORD dwFlags;
- DWORD ulFormatVersion;
- DWORD ulAssemblyCount;
- DWORD ulRootManifestPathType;
- DWORD ulRootManifestPathChars;
- DWORD ulRootConfigurationPathType;
- DWORD ulRootConfigurationPathChars;
- DWORD ulAppDirPathType;
- DWORD ulAppDirPathChars;
- PCWSTR lpRootManifestPath;
- PCWSTR lpRootConfigurationPath;
- PCWSTR lpAppDirPath;
-} ACTIVATION_CONTEXT_DETAILED_INFORMATION,*PACTIVATION_CONTEXT_DETAILED_INFORMATION;
+ DWORD dwFlags;
+ DWORD ulFormatVersion;
+ DWORD ulAssemblyCount;
+ DWORD ulRootManifestPathType;
+ DWORD ulRootManifestPathChars;
+ DWORD ulRootConfigurationPathType;
+ DWORD ulRootConfigurationPathChars;
+ DWORD ulAppDirPathType;
+ DWORD ulAppDirPathChars;
+ PCWSTR lpRootManifestPath;
+ PCWSTR lpRootConfigurationPath;
+ PCWSTR lpAppDirPath;
+} ACTIVATION_CONTEXT_DETAILED_INFORMATION, *PACTIVATION_CONTEXT_DETAILED_INFORMATION;
typedef const ACTIVATION_CONTEXT_DETAILED_INFORMATION *PCACTIVATION_CONTEXT_DETAILED_INFORMATION;
+
typedef struct _ACTIVATION_CONTEXT_QUERY_INDEX {
- ULONG ulAssemblyIndex;
- ULONG ulFileIndexInAssembly;
+ DWORD ulAssemblyIndex;
+ DWORD ulFileIndexInAssembly;
} ACTIVATION_CONTEXT_QUERY_INDEX,*PACTIVATION_CONTEXT_QUERY_INDEX;
typedef const ACTIVATION_CONTEXT_QUERY_INDEX *PCACTIVATION_CONTEXT_QUERY_INDEX;
+
typedef struct _ASSEMBLY_FILE_DETAILED_INFORMATION {
- DWORD ulFlags;
- DWORD ulFilenameLength;
- DWORD ulPathLength;
- PCWSTR lpFileName;
- PCWSTR lpFilePath;
+ DWORD ulFlags;
+ DWORD ulFilenameLength;
+ DWORD ulPathLength;
+ PCWSTR lpFileName;
+ PCWSTR lpFilePath;
} ASSEMBLY_FILE_DETAILED_INFORMATION,*PASSEMBLY_FILE_DETAILED_INFORMATION;
typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFORMATION;
@@ -4657,32 +4858,36 @@ typedef const ASSEMBLY_FILE_DETAILED_INFORMATION *PCASSEMBLY_FILE_DETAILED_INFOR
#endif /* (WIN32_WINNT >= 0x0501) */
typedef struct _PROCESSOR_POWER_POLICY_INFO {
- ULONG TimeCheck;
- ULONG DemoteLimit;
- ULONG PromoteLimit;
- UCHAR DemotePercent;
- UCHAR PromotePercent;
- UCHAR Spare[2];
- ULONG AllowDemotion : 1;
- ULONG AllowPromotion : 1;
- ULONG Reserved : 30;
+ DWORD TimeCheck;
+ DWORD DemoteLimit;
+ DWORD PromoteLimit;
+ BYTE DemotePercent;
+ BYTE PromotePercent;
+ BYTE Spare[2];
+ DWORD AllowDemotion:1;
+ DWORD AllowPromotion:1;
+ DWORD Reserved:30;
} PROCESSOR_POWER_POLICY_INFO, *PPROCESSOR_POWER_POLICY_INFO;
+
typedef struct _PROCESSOR_POWER_POLICY {
- ULONG Revision;
- UCHAR DynamicThrottle;
- UCHAR Spare[3];
- ULONG Reserved;
- ULONG PolicyCount;
- PROCESSOR_POWER_POLICY_INFO Policy[3];
+ DWORD Revision;
+ BYTE DynamicThrottle;
+ BYTE Spare[3];
+ DWORD DisableCStates:1;
+ DWORD Reserved:31;
+ DWORD PolicyCount;
+ PROCESSOR_POWER_POLICY_INFO Policy[3];
} PROCESSOR_POWER_POLICY, *PPROCESSOR_POWER_POLICY;
+
typedef struct _ADMINISTRATOR_POWER_POLICY {
- SYSTEM_POWER_STATE MinSleep;
- SYSTEM_POWER_STATE MaxSleep;
- ULONG MinVideoTimeout;
- ULONG MaxVideoTimeout;
- ULONG MinSpindownTimeout;
- ULONG MaxSpindownTimeout;
+ SYSTEM_POWER_STATE MinSleep;
+ SYSTEM_POWER_STATE MaxSleep;
+ DWORD MinVideoTimeout;
+ DWORD MaxVideoTimeout;
+ DWORD MinSpindownTimeout;
+ DWORD MaxSpindownTimeout;
} ADMINISTRATOR_POWER_POLICY, *PADMINISTRATOR_POWER_POLICY;
+
#endif /* WINVER >= 0x0500 */
typedef VOID (NTAPI *WAITORTIMERCALLBACKFUNC)(PVOID,BOOLEAN);
@@ -4702,9 +4907,8 @@ ULONGLONG WINAPI VerSetConditionMask(ULONGLONG,DWORD,BYTE);
#endif
typedef enum _HEAP_INFORMATION_CLASS {
-
- HeapCompatibilityInformation
-
+ HeapCompatibilityInformation,
+ HeapEnableTerminationOnCorruption
} HEAP_INFORMATION_CLASS;
NTSYSAPI
@@ -4752,42 +4956,44 @@ RtlMultipleFreeHeap (
);
typedef enum _PROCESSOR_CACHE_TYPE {
- CacheUnified,
- CacheInstruction,
- CacheData,
- CacheTrace
+ CacheUnified,
+ CacheInstruction,
+ CacheData,
+ CacheTrace
} PROCESSOR_CACHE_TYPE;
typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
- RelationProcessorCore,
- RelationNumaNode,
- RelationCache,
- RelationProcessorPackage
+ RelationProcessorCore,
+ RelationNumaNode,
+ RelationCache,
+ RelationProcessorPackage,
+ RelationGroup,
+ RelationAll = 0xffff
} LOGICAL_PROCESSOR_RELATIONSHIP;
#define CACHE_FULLY_ASSOCIATIVE 0xFF
typedef struct _CACHE_DESCRIPTOR {
- BYTE Level;
- BYTE Associativity;
- WORD LineSize;
- DWORD Size;
- PROCESSOR_CACHE_TYPE Type;
+ BYTE Level;
+ BYTE Associativity;
+ WORD LineSize;
+ DWORD Size;
+ PROCESSOR_CACHE_TYPE Type;
} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
- ULONG_PTR ProcessorMask;
- LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
- union {
- struct {
- BYTE Flags;
- } ProcessorCore;
- struct {
- DWORD NodeNumber;
- } NumaNode;
- CACHE_DESCRIPTOR Cache;
- ULONGLONG Reserved[2];
- };
+ ULONG_PTR ProcessorMask;
+ LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
+ _ANONYMOUS_UNION union {
+ struct {
+ BYTE Flags;
+ } ProcessorCore;
+ struct {
+ DWORD NodeNumber;
+ } NumaNode;
+ CACHE_DESCRIPTOR Cache;
+ ULONGLONG Reserved[2];
+ } DUMMYUNIONNAME;
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
NTSYSAPI
@@ -4827,9 +5033,9 @@ RtlSecureZeroMemory(IN PVOID Buffer,
}
typedef struct _OBJECT_TYPE_LIST {
- WORD Level;
- WORD Sbz;
- GUID *ObjectType;
+ WORD Level;
+ WORD Sbz;
+ GUID *ObjectType;
} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
#if defined(__GNUC__)
@@ -5068,7 +5274,7 @@ MemoryBarrier(VOID)
#elif defined(_M_MIPS)
#define YieldProcessor() __asm__ __volatile__("nop");
#elif defined(_M_ARM)
-#define YieldProcessor()
+#define YieldProcessor __yield
#else
#error Unknown architecture
#endif
diff --git a/include/psdk/winsock.h b/include/psdk/winsock.h
index 4357e34a464..75283ec215b 100644
--- a/include/psdk/winsock.h
+++ b/include/psdk/winsock.h
@@ -1,5 +1,4 @@
/*
-
Definitions for winsock 1.1
Portions Copyright (c) 1980, 1983, 1988, 1993
@@ -8,8 +7,13 @@
Portions Copyright (c) 1993 by Digital Equipment Corporation.
*/
-#ifndef _WINSOCK_H
-#define _WINSOCK_H
+#pragma once
+
+#define _WINSOCKAPI_
+
+#ifndef _INC_WINDOWS
+#include
+#endif
#ifndef _M_AMD64
#if !defined(__ROS_LONG64__)
@@ -20,27 +24,32 @@
#endif
#define _GNU_H_WINDOWS32_SOCKETS
-#include
#ifdef __cplusplus
extern "C" {
#endif
#if !defined ( _BSDTYPES_DEFINED )
+
/* also defined in gmon.h and in cygwin's sys/types */
-typedef unsigned char u_char;
-typedef unsigned short u_short;
-typedef unsigned int u_int;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
+
#ifndef __ROS_LONG64__
-typedef unsigned long u_long;
+typedef unsigned long u_long;
#else
-typedef unsigned int u_long;
+typedef unsigned int u_long;
#endif
+
#define _BSDTYPES_DEFINED
-#endif /* !defined _BSDTYPES_DEFINED */
-typedef UINT_PTR SOCKET;
+
+#endif /* !defined ( _BSDTYPES_DEFINED ) */
+
+typedef UINT_PTR SOCKET;
+
#ifndef FD_SETSIZE
-#define FD_SETSIZE 64
+#define FD_SETSIZE 64
#endif
/* shutdown() how types */
@@ -49,451 +58,430 @@ typedef UINT_PTR SOCKET;
#define SD_BOTH 0x02
#ifndef _SYS_TYPES_FD_SET
+
/* fd_set may have be defined by the newlib
- * if __USE_W32_SOCKETS not defined.
+ * if __USE_W32_SOCKETS not defined.
*/
#ifdef fd_set
#undef fd_set
#endif
typedef struct fd_set {
- u_int fd_count;
- SOCKET fd_array[FD_SETSIZE];
+ u_int fd_count;
+ SOCKET fd_array[FD_SETSIZE];
} fd_set;
-int PASCAL __WSAFDIsSet(SOCKET,fd_set*);
+
+extern int PASCAL __WSAFDIsSet(SOCKET,fd_set FAR*);
+
#ifndef FD_CLR
#define FD_CLR(fd,set) do { u_int __i;\
-for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
- if (((fd_set *)(set))->fd_array[__i] == (fd)) {\
- while (__i < ((fd_set *)(set))->fd_count-1) {\
- ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\
- __i++;\
- }\
- ((fd_set*)(set))->fd_count--;\
- break;\
- }\
+for (__i = 0; __i < ((fd_set FAR*)(set))->fd_count ; __i++) {\
+ if (((fd_set FAR*)(set))->fd_array[__i] == (fd)) {\
+ while (__i < ((fd_set FAR*)(set))->fd_count-1) {\
+ ((fd_set FAR*)(set))->fd_array[__i] = ((fd_set FAR*)(set))->fd_array[__i+1];\
+ __i++;\
+ }\
+ ((fd_set FAR*)(set))->fd_count--;\
+ break;\
+ }\
}\
} while (0)
-#endif
+#endif /* FD_CLR */
+
#ifndef FD_SET
#define FD_SET(fd, set) do { \
- if (((fd_set *)(set))->fd_count < FD_SETSIZE) \
- ((fd_set *)(set))->fd_array[((fd_set *)(set))->fd_count++]=(fd);\
+ if (((fd_set FAR*)(set))->fd_count < FD_SETSIZE) \
+ ((fd_set FAR*)(set))->fd_array[((fd_set FAR*)(set))->fd_count++]=(fd);\
}while (0)
#endif
+
#ifndef FD_ZERO
-#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0)
+#define FD_ZERO(set) (((fd_set FAR*)(set))->fd_count=0)
#endif
+
#ifndef FD_ISSET
-#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
+#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR*)(set))
#endif
+
+
+
#elif !defined(USE_SYS_TYPES_FD_SET)
#warning "fd_set and associated macros have been defined in sys/types. \
This can cause runtime problems with W32 sockets"
#endif /* ndef _SYS_TYPES_FD_SET */
#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
+
#ifndef _TIMEVAL_DEFINED /* also in sys/time.h */
#define _TIMEVAL_DEFINED
+
struct timeval {
- LONG tv_sec;
- LONG tv_usec;
+ LONG tv_sec;
+ LONG tv_usec;
};
-#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
+
+#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
+
#define timercmp(tvp, uvp, cmp) \
- (((tvp)->tv_sec != (uvp)->tv_sec) ? \
- ((tvp)->tv_sec cmp (uvp)->tv_sec) : \
- ((tvp)->tv_usec cmp (uvp)->tv_usec))
-#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
+ (((tvp)->tv_sec != (uvp)->tv_sec) ? \
+ ((tvp)->tv_sec cmp (uvp)->tv_sec) : \
+ ((tvp)->tv_usec cmp (uvp)->tv_usec))
+
+#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
+
#endif /* _TIMEVAL_DEFINED */
-struct hostent {
- char *h_name;
- char **h_aliases;
- short h_addrtype;
- short h_length;
- char **h_addr_list;
+
#define h_addr h_addr_list[0]
+
+struct hostent {
+ char *h_name;
+ char **h_aliases;
+ short h_addrtype;
+ short h_length;
+ char **h_addr_list;
};
+
struct linger {
- u_short l_onoff;
- u_short l_linger;
+ u_short l_onoff;
+ u_short l_linger;
};
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define IOCPARM_MASK 0x7f
-#define IOC_VOID 0x20000000
-#define IOC_OUT 0x40000000
-#define IOC_IN 0x80000000
-#define IOC_INOUT (IOC_IN|IOC_OUT)
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
-#define _IOR(x,y,t) (IOC_OUT|(((LONG)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#define _IOW(x,y,t) (IOC_IN|(((LONG)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#define FIONBIO _IOW('f', 126, u_long)
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
+#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
+#define _IOR(x,y,t) (IOC_OUT|(((LONG)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t) (IOC_IN|(((LONG)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define FIONBIO _IOW('f', 126, u_long)
-#define FIONREAD _IOR('f', 127, u_long)
-#define FIOASYNC _IOW('f', 125, u_long)
-#define SIOCSHIWAT _IOW('s', 0, u_long)
-#define SIOCGHIWAT _IOR('s', 1, u_long)
-#define SIOCSLOWAT _IOW('s', 2, u_long)
-#define SIOCGLOWAT _IOR('s', 3, u_long)
-#define SIOCATMARK _IOR('s', 7, u_long)
-
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
struct netent {
- char * n_name;
- char **n_aliases;
- short n_addrtype;
- u_long n_net;
+ char * n_name;
+ char **n_aliases;
+ short n_addrtype;
+ u_long n_net;
};
-struct servent {
- char *s_name;
- char **s_aliases;
- short s_port;
- char *s_proto;
-};
-struct protoent {
- char *p_name;
- char **p_aliases;
- short p_proto;
-};
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define IPPROTO_IP 0
-#define IPPROTO_ICMP 1
-#define IPPROTO_IGMP 2
-#define IPPROTO_GGP 3
-#define IPPROTO_TCP 6
-#define IPPROTO_PUP 12
-#define IPPROTO_UDP 17
-#define IPPROTO_IDP 22
-#define IPPROTO_ND 77
-#define IPPROTO_RAW 255
-#define IPPROTO_MAX 256
-#define IPPORT_ECHO 7
-#define IPPORT_DISCARD 9
-#define IPPORT_SYSTAT 11
-#define IPPORT_DAYTIME 13
-#define IPPORT_NETSTAT 15
-#define IPPORT_FTP 21
-#define IPPORT_TELNET 23
-#define IPPORT_SMTP 25
-#define IPPORT_TIMESERVER 37
-#define IPPORT_NAMESERVER 42
-#define IPPORT_WHOIS 43
-#define IPPORT_MTP 57
-#define IPPORT_TFTP 69
-#define IPPORT_RJE 77
-#define IPPORT_FINGER 79
-#define IPPORT_TTYLINK 87
-#define IPPORT_SUPDUP 95
-#define IPPORT_EXECSERVER 512
-#define IPPORT_LOGINSERVER 513
-#define IPPORT_CMDSERVER 514
-#define IPPORT_EFSSERVER 520
-#define IPPORT_BIFFUDP 512
-#define IPPORT_WHOSERVER 513
-#define IPPORT_ROUTESERVER 520
-#define IPPORT_RESERVED 1024
-#define IMPLINK_IP 155
-#define IMPLINK_LOWEXPER 156
-#define IMPLINK_HIGHEXPER 158
-struct in_addr {
- union {
- struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
- struct { u_short s_w1,s_w2; } S_un_w;
- u_long S_addr;
- } S_un;
-#define s_addr S_un.S_addr
-#define s_host S_un.S_un_b.s_b2
-#define s_net S_un.S_un_b.s_b1
-#define s_imp S_un.S_un_w.s_w2
-#define s_impno S_un.S_un_b.s_b4
-#define s_lh S_un.S_un_b.s_b3
+struct servent {
+ char *s_name;
+ char **s_aliases;
+#ifdef _WIN64
+ char *s_proto;
+ short s_port;
+#else
+ short s_port;
+ char *s_proto;
+#endif
};
-#define IN_CLASSA(i) ((LONG)(i)&0x80000000)
-#define IN_CLASSA_NET 0xff000000
-#define IN_CLASSA_NSHIFT 24
-#define IN_CLASSA_HOST 0x00ffffff
-#define IN_CLASSA_MAX 128
-#define IN_CLASSB(i) (((LONG)(i)&0xc0000000)==0x80000000)
-#define IN_CLASSB_NET 0xffff0000
-#define IN_CLASSB_NSHIFT 16
-#define IN_CLASSB_HOST 0x0000ffff
-#define IN_CLASSB_MAX 65536
-#define IN_CLASSC(i) (((LONG)(i)&0xe0000000)==0xc0000000)
-#define IN_CLASSC_NET 0xffffff00
-#define IN_CLASSC_NSHIFT 8
-#define IN_CLASSC_HOST 0xff
-#define INADDR_ANY (u_long)0
-#define INADDR_LOOPBACK 0x7f000001
-#define INADDR_BROADCAST (u_long)0xffffffff
-#define INADDR_NONE 0xffffffff
-struct sockaddr_in {
- short sin_family;
- u_short sin_port;
- struct in_addr sin_addr;
- char sin_zero[8];
-};
-#define WSADESCRIPTION_LEN 256
-#define WSASYS_STATUS_LEN 128
-typedef struct WSAData {
- WORD wVersion;
- WORD wHighVersion;
- char szDescription[WSADESCRIPTION_LEN+1];
- char szSystemStatus[WSASYS_STATUS_LEN+1];
- unsigned short iMaxSockets;
- unsigned short iMaxUdpDg;
- char * lpVendorInfo;
-} WSADATA;
-typedef WSADATA *LPWSADATA;
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define IP_OPTIONS 1
-#define SO_DEBUG 1
-#define SO_ACCEPTCONN 2
-#define SO_REUSEADDR 4
-#define SO_KEEPALIVE 8
-#define SO_DONTROUTE 16
-#define SO_BROADCAST 32
-#define SO_USELOOPBACK 64
-#define SO_LINGER 128
-#define SO_OOBINLINE 256
-#define SO_DONTLINGER (u_int)(~SO_LINGER)
-#define SO_SNDBUF 0x1001
-#define SO_RCVBUF 0x1002
-#define SO_SNDLOWAT 0x1003
-#define SO_RCVLOWAT 0x1004
-#define SO_SNDTIMEO 0x1005
-#define SO_RCVTIMEO 0x1006
-#define SO_ERROR 0x1007
-#define SO_TYPE 0x1008
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-/*
- * Note that the next 5 IP defines are specific to WinSock 1.1 (wsock32.dll).
- * They will cause errors or unexpected results if used with the
- * (gs)etsockopts exported from the WinSock 2 lib, ws2_32.dll. Refer ws2tcpip.h.
- */
-#define IP_MULTICAST_IF 2
-#define IP_MULTICAST_TTL 3
-#define IP_MULTICAST_LOOP 4
-#define IP_ADD_MEMBERSHIP 5
-#define IP_DROP_MEMBERSHIP 6
-
-#define IP_DEFAULT_MULTICAST_TTL 1
-#define IP_DEFAULT_MULTICAST_LOOP 1
-#define IP_MAX_MEMBERSHIPS 20
-struct ip_mreq {
- struct in_addr imr_multiaddr;
- struct in_addr imr_interface;
+struct protoent {
+ char *p_name;
+ char **p_aliases;
+ short p_proto;
};
-#define INVALID_SOCKET (SOCKET)(~0)
-#define SOCKET_ERROR (-1)
-#define SOCK_STREAM 1
-#define SOCK_DGRAM 2
-#define SOCK_RAW 3
-#define SOCK_RDM 4
-#define SOCK_SEQPACKET 5
-#define TCP_NODELAY 0x0001
-#define AF_UNSPEC 0
-#define AF_UNIX 1
-#define AF_INET 2
-#define AF_IMPLINK 3
-#define AF_PUP 4
-#define AF_CHAOS 5
-#define AF_IPX 6
-#define AF_NS 6
-#define AF_ISO 7
-#define AF_OSI AF_ISO
-#define AF_ECMA 8
-#define AF_DATAKIT 9
-#define AF_CCITT 10
-#define AF_SNA 11
-#define AF_DECnet 12
-#define AF_DLI 13
-#define AF_LAT 14
-#define AF_HYLINK 15
-#define AF_APPLETALK 16
-#define AF_NETBIOS 17
-#define AF_VOICEVIEW 18
-#define AF_FIREFOX 19
-#define AF_UNKNOWN1 20
-#define AF_BAN 21
-#define AF_ATM 22
-#define AF_INET6 23
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define AF_MAX 24
+
+#define IP_OPTIONS 1
+
+#define SO_DEBUG 1
+#define SO_ACCEPTCONN 2
+#define SO_REUSEADDR 4
+#define SO_KEEPALIVE 8
+#define SO_DONTROUTE 16
+#define SO_BROADCAST 32
+#define SO_USELOOPBACK 64
+#define SO_LINGER 128
+#define SO_OOBINLINE 256
+#define SO_DONTLINGER (u_int)(~SO_LINGER)
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_SNDTIMEO 0x1005
+#define SO_RCVTIMEO 0x1006
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+
+#define SO_CONNDATA 0x7000
+#define SO_CONNOPT 0x7001
+#define SO_DISCDATA 0x7002
+#define SO_DISCOPT 0x7003
+#define SO_CONNDATALEN 0x7004
+#define SO_CONNOPTLEN 0x7005
+#define SO_DISCDATALEN 0x7006
+#define SO_DISCOPTLEN 0x7007
+#define SO_OPENTYPE 0x7008
+#define SO_MAXDG 0x7009
+#define SO_MAXPATHDG 0x700A
+#define SO_UPDATE_ACCEPT_CONTEXT 0x700B
+#define SO_CONNECT_TIME 0x700C
+
+#define SO_SYNCHRONOUS_ALERT 0x10
+#define SO_SYNCHRONOUS_NONALERT 0x20
+
+#define AF_MAX 24
+
struct sockaddr {
- u_short sa_family;
- char sa_data[14];
+ u_short sa_family;
+ char sa_data[14];
};
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-struct sockproto {
- u_short sp_family;
- u_short sp_protocol;
-};
-#define PF_UNSPEC AF_UNSPEC
-#define PF_UNIX AF_UNIX
-#define PF_INET AF_INET
-#define PF_IMPLINK AF_IMPLINK
-#define PF_PUP AF_PUP
-#define PF_CHAOS AF_CHAOS
-#define PF_NS AF_NS
-#define PF_IPX AF_IPX
-#define PF_ISO AF_ISO
-#define PF_OSI AF_OSI
-#define PF_ECMA AF_ECMA
-#define PF_DATAKIT AF_DATAKIT
-#define PF_CCITT AF_CCITT
-#define PF_SNA AF_SNA
-#define PF_DECnet AF_DECnet
-#define PF_DLI AF_DLI
-#define PF_LAT AF_LAT
-#define PF_HYLINK AF_HYLINK
-#define PF_APPLETALK AF_APPLETALK
-#define PF_VOICEVIEW AF_VOICEVIEW
-#define PF_FIREFOX AF_FIREFOX
-#define PF_UNKNOWN1 AF_UNKNOWN1
-#define PF_BAN AF_BAN
-#define PF_ATM AF_ATM
-#define PF_INET6 AF_INET6
-#define PF_MAX AF_MAX
-#define SOL_SOCKET 0xffff
-#define SOMAXCONN 5
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define MSG_OOB 1
-#define MSG_PEEK 2
-#define MSG_DONTROUTE 4
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define MSG_MAXIOVLEN 16
-#define MSG_PARTIAL 0x8000
-#define MAXGETHOSTSTRUCT 1024
-#define FD_READ 1
-#define FD_WRITE 2
-#define FD_OOB 4
-#define FD_ACCEPT 8
-#define FD_CONNECT 16
-#define FD_CLOSE 32
-#ifndef WSABASEERR
-#define WSABASEERR 10000
-#define WSAEINTR (WSABASEERR+4)
-#define WSAEBADF (WSABASEERR+9)
-#define WSAEACCES (WSABASEERR+13)
-#define WSAEFAULT (WSABASEERR+14)
-#define WSAEINVAL (WSABASEERR+22)
-#define WSAEMFILE (WSABASEERR+24)
-#define WSAEWOULDBLOCK (WSABASEERR+35)
-#define WSAEINPROGRESS (WSABASEERR+36)
-#define WSAEALREADY (WSABASEERR+37)
-#define WSAENOTSOCK (WSABASEERR+38)
-#define WSAEDESTADDRREQ (WSABASEERR+39)
-#define WSAEMSGSIZE (WSABASEERR+40)
-#define WSAEPROTOTYPE (WSABASEERR+41)
-#define WSAENOPROTOOPT (WSABASEERR+42)
-#define WSAEPROTONOSUPPORT (WSABASEERR+43)
-#define WSAESOCKTNOSUPPORT (WSABASEERR+44)
-#define WSAEOPNOTSUPP (WSABASEERR+45)
-#define WSAEPFNOSUPPORT (WSABASEERR+46)
-#define WSAEAFNOSUPPORT (WSABASEERR+47)
-#define WSAEADDRINUSE (WSABASEERR+48)
-#define WSAEADDRNOTAVAIL (WSABASEERR+49)
-#define WSAENETDOWN (WSABASEERR+50)
-#define WSAENETUNREACH (WSABASEERR+51)
-#define WSAENETRESET (WSABASEERR+52)
-#define WSAECONNABORTED (WSABASEERR+53)
-#define WSAECONNRESET (WSABASEERR+54)
-#define WSAENOBUFS (WSABASEERR+55)
-#define WSAEISCONN (WSABASEERR+56)
-#define WSAENOTCONN (WSABASEERR+57)
-#define WSAESHUTDOWN (WSABASEERR+58)
-#define WSAETOOMANYREFS (WSABASEERR+59)
-#define WSAETIMEDOUT (WSABASEERR+60)
-#define WSAECONNREFUSED (WSABASEERR+61)
-#define WSAELOOP (WSABASEERR+62)
-#define WSAENAMETOOLONG (WSABASEERR+63)
-#define WSAEHOSTDOWN (WSABASEERR+64)
-#define WSAEHOSTUNREACH (WSABASEERR+65)
-#define WSAENOTEMPTY (WSABASEERR+66)
-#define WSAEPROCLIM (WSABASEERR+67)
-#define WSAEUSERS (WSABASEERR+68)
-#define WSAEDQUOT (WSABASEERR+69)
-#define WSAESTALE (WSABASEERR+70)
-#define WSAEREMOTE (WSABASEERR+71)
-#define WSAEDISCON (WSABASEERR+101)
-#define WSASYSNOTREADY (WSABASEERR+91)
-#define WSAVERNOTSUPPORTED (WSABASEERR+92)
-#define WSANOTINITIALISED (WSABASEERR+93)
-#define WSAHOST_NOT_FOUND (WSABASEERR+1001)
-#define WSATRY_AGAIN (WSABASEERR+1002)
-#define WSANO_RECOVERY (WSABASEERR+1003)
-#define WSANO_DATA (WSABASEERR+1004)
-#endif /* !WSABASEERR */
+#define MSG_OOB 1
+#define MSG_PEEK 2
+#define MSG_DONTROUTE 4
-#define WSANO_ADDRESS WSANO_DATA
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
#define h_errno WSAGetLastError()
-#define HOST_NOT_FOUND WSAHOST_NOT_FOUND
-#define TRY_AGAIN WSATRY_AGAIN
-#define NO_RECOVERY WSANO_RECOVERY
-#define NO_DATA WSANO_DATA
-#define NO_ADDRESS WSANO_ADDRESS
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*);
-int PASCAL bind(SOCKET,const struct sockaddr*,int);
-int PASCAL closesocket(SOCKET);
-int PASCAL connect(SOCKET,const struct sockaddr*,int);
-int PASCAL ioctlsocket(SOCKET,LONG,u_long *);
-int PASCAL getpeername(SOCKET,struct sockaddr*,int*);
-int PASCAL getsockname(SOCKET,struct sockaddr*,int*);
-int PASCAL getsockopt(SOCKET,int,int,char*,int*);
-u_long PASCAL inet_addr(const char*);
-DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr);
-int PASCAL listen(SOCKET,int);
-int PASCAL recv(SOCKET,char*,int,int);
-int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*);
-int PASCAL send(SOCKET,const char*,int,int);
-int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int);
-int PASCAL setsockopt(SOCKET,int,int,const char*,int);
-int PASCAL shutdown(SOCKET,int);
-SOCKET PASCAL socket(int,int,int);
-DECLARE_STDCALL_P(struct hostent *) gethostbyaddr(const char*,int,int);
-DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*);
-DECLARE_STDCALL_P(struct servent *) getservbyport(int,const char*);
-DECLARE_STDCALL_P(struct servent *) getservbyname(const char*,const char*);
-DECLARE_STDCALL_P(struct protoent *) getprotobynumber(int);
-DECLARE_STDCALL_P(struct protoent *) getprotobyname(const char*);
-int PASCAL WSAStartup(WORD,LPWSADATA);
-int PASCAL WSACleanup(void);
-void PASCAL WSASetLastError(int);
-int PASCAL WSAGetLastError(void);
-BOOL PASCAL WSAIsBlocking(void);
-int PASCAL WSAUnhookBlockingHook(void);
-FARPROC PASCAL WSASetBlockingHook(FARPROC);
-int PASCAL WSACancelBlockingCall(void);
-HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int);
-HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int);
-int PASCAL WSACancelAsyncRequest(HANDLE);
-int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,LONG);
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
+#define HOST_NOT_FOUND WSAHOST_NOT_FOUND
+#define TRY_AGAIN WSATRY_AGAIN
+#define NO_RECOVERY WSANO_RECOVERY
+#define NO_DATA WSANO_DATA
+#define NO_ADDRES WSANO_ADDRESS
+
u_long PASCAL htonl(u_long);
u_long PASCAL ntohl(u_long);
u_short PASCAL htons(u_short);
u_short PASCAL ntohs(u_short);
int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*);
int PASCAL gethostname(char*,int);
+
#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e)
-#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error)
-#define WSAGETASYNCBUFLEN(l) LOWORD(l)
-#define WSAGETASYNCERROR(l) HIWORD(l)
-#define WSAGETSELECTEVENT(l) LOWORD(l)
-#define WSAGETSELECTERROR(l) HIWORD(l)
+#define IOCPARM_MASK 0x7f
+#define IOC_VOID 0x20000000
+#define IOC_OUT 0x40000000
+#define IOC_IN 0x80000000
+#define IOC_INOUT (IOC_IN|IOC_OUT)
+
+#define FIONREAD _IOR('f', 127, u_long)
+#define FIOASYNC _IOW('f', 125, u_long)
+#define SIOCSHIWAT _IOW('s', 0, u_long)
+#define SIOCGHIWAT _IOR('s', 1, u_long)
+#define SIOCSLOWAT _IOW('s', 2, u_long)
+#define SIOCGLOWAT _IOR('s', 3, u_long)
+#define SIOCATMARK _IOR('s', 7, u_long)
+
+#define IPPROTO_IP 0
+#define IPPROTO_ICMP 1
+#define IPPROTO_IGMP 2
+#define IPPROTO_GGP 3
+#define IPPROTO_TCP 6
+#define IPPROTO_PUP 12
+#define IPPROTO_UDP 17
+#define IPPROTO_IDP 22
+#define IPPROTO_ND 77
+#define IPPROTO_RAW 255
+#define IPPROTO_MAX 256
+#define IPPORT_ECHO 7
+#define IPPORT_DISCARD 9
+#define IPPORT_SYSTAT 11
+#define IPPORT_DAYTIME 13
+#define IPPORT_NETSTAT 15
+#define IPPORT_FTP 21
+#define IPPORT_TELNET 23
+#define IPPORT_SMTP 25
+#define IPPORT_TIMESERVER 37
+#define IPPORT_NAMESERVER 42
+#define IPPORT_WHOIS 43
+#define IPPORT_MTP 57
+#define IPPORT_TFTP 69
+#define IPPORT_RJE 77
+#define IPPORT_FINGER 79
+#define IPPORT_TTYLINK 87
+#define IPPORT_SUPDUP 95
+#define IPPORT_EXECSERVER 512
+#define IPPORT_LOGINSERVER 513
+#define IPPORT_CMDSERVER 514
+#define IPPORT_EFSSERVER 520
+#define IPPORT_BIFFUDP 512
+#define IPPORT_WHOSERVER 513
+#define IPPORT_ROUTESERVER 520
+#define IPPORT_RESERVED 1024
+#define IMPLINK_IP 155
+#define IMPLINK_LOWEXPER 156
+#define IMPLINK_HIGHEXPER 158
+
+#include
+
+#define IN_CLASSA(i) ((LONG)(i)&0x80000000)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST 0x00ffffff
+#define IN_CLASSA_MAX 128
+#define IN_CLASSB(i) (((LONG)(i)&0xc0000000)==0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST 0x0000ffff
+#define IN_CLASSB_MAX 65536
+#define IN_CLASSC(i) (((LONG)(i)&0xe0000000)==0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST 0xff
+#define INADDR_ANY (u_long)0
+#define INADDR_LOOPBACK 0x7f000001
+#define INADDR_BROADCAST (u_long)0xffffffff
+#define INADDR_NONE 0xffffffff
+
+#define WSADESCRIPTION_LEN 256
+#define WSASYS_STATUS_LEN 128
+
+#define IP_MULTICAST_IF 2
+#define IP_MULTICAST_TTL 3
+#define IP_MULTICAST_LOOP 4
+#define IP_ADD_MEMBERSHIP 5
+#define IP_DROP_MEMBERSHIP 6
+#define IP_TTL 7
+#define IP_TOS 8
+#define IP_DONTFRAGMENT 9
+
+#define IP_DEFAULT_MULTICAST_TTL 1
+#define IP_DEFAULT_MULTICAST_LOOP 1
+#define IP_MAX_MEMBERSHIPS 20
+
+#define INVALID_SOCKET (SOCKET)(~0)
+#define SOCKET_ERROR (-1)
+
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#define SOCK_RAW 3
+#define SOCK_RDM 4
+#define SOCK_SEQPACKET 5
+
+#define TCP_NODELAY 0x0001
+#define TCP_BSDURGENT 0x7000
+
+#define AF_UNSPEC 0
+#define AF_UNIX 1
+#define AF_INET 2
+#define AF_IMPLINK 3
+#define AF_PUP 4
+#define AF_CHAOS 5
+#define AF_IPX 6
+#define AF_NS 6
+#define AF_ISO 7
+#define AF_OSI AF_ISO
+#define AF_ECMA 8
+#define AF_DATAKIT 9
+#define AF_CCITT 10
+#define AF_SNA 11
+#define AF_DECnet 12
+#define AF_DLI 13
+#define AF_LAT 14
+#define AF_HYLINK 15
+#define AF_APPLETALK 16
+#define AF_NETBIOS 17
+#define AF_VOICEVIEW 18
+#define AF_FIREFOX 19
+#define AF_UNKNOWN1 20
+#define AF_BAN 21
+#define AF_ATM 22
+#define AF_INET6 23
+
+#define PF_UNSPEC AF_UNSPEC
+#define PF_UNIX AF_UNIX
+#define PF_INET AF_INET
+#define PF_IMPLINK AF_IMPLINK
+#define PF_PUP AF_PUP
+#define PF_CHAOS AF_CHAOS
+#define PF_NS AF_NS
+#define PF_IPX AF_IPX
+#define PF_ISO AF_ISO
+#define PF_OSI AF_OSI
+#define PF_ECMA AF_ECMA
+#define PF_DATAKIT AF_DATAKIT
+#define PF_CCITT AF_CCITT
+#define PF_SNA AF_SNA
+#define PF_DECnet AF_DECnet
+#define PF_DLI AF_DLI
+#define PF_LAT AF_LAT
+#define PF_HYLINK AF_HYLINK
+#define PF_APPLETALK AF_APPLETALK
+#define PF_VOICEVIEW AF_VOICEVIEW
+#define PF_FIREFOX AF_FIREFOX
+#define PF_UNKNOWN1 AF_UNKNOWN1
+#define PF_BAN AF_BAN
+#define PF_ATM AF_ATM
+#define PF_INET6 AF_INET6
+#define PF_MAX AF_MAX
+
+#define SOL_SOCKET 0xffff
+#define SOMAXCONN 5
+
+#define MSG_MAXIOVLEN 16
+#define MSG_PARTIAL 0x8000
+#define MAXGETHOSTSTRUCT 1024
+
+#define FD_READ 1
+#define FD_WRITE 2
+#define FD_OOB 4
+#define FD_ACCEPT 8
+#define FD_CONNECT 16
+#define FD_CLOSE 32
+
+#ifndef WSABASEERR
+
+#define WSABASEERR 10000
+#define WSAEINTR (WSABASEERR+4)
+#define WSAEBADF (WSABASEERR+9)
+#define WSAEACCES (WSABASEERR+13)
+#define WSAEFAULT (WSABASEERR+14)
+#define WSAEINVAL (WSABASEERR+22)
+#define WSAEMFILE (WSABASEERR+24)
+#define WSAEWOULDBLOCK (WSABASEERR+35)
+#define WSAEINPROGRESS (WSABASEERR+36)
+#define WSAEALREADY (WSABASEERR+37)
+#define WSAENOTSOCK (WSABASEERR+38)
+#define WSAEDESTADDRREQ (WSABASEERR+39)
+#define WSAEMSGSIZE (WSABASEERR+40)
+#define WSAEPROTOTYPE (WSABASEERR+41)
+#define WSAENOPROTOOPT (WSABASEERR+42)
+#define WSAEPROTONOSUPPORT (WSABASEERR+43)
+#define WSAESOCKTNOSUPPORT (WSABASEERR+44)
+#define WSAEOPNOTSUPP (WSABASEERR+45)
+#define WSAEPFNOSUPPORT (WSABASEERR+46)
+#define WSAEAFNOSUPPORT (WSABASEERR+47)
+#define WSAEADDRINUSE (WSABASEERR+48)
+#define WSAEADDRNOTAVAIL (WSABASEERR+49)
+#define WSAENETDOWN (WSABASEERR+50)
+#define WSAENETUNREACH (WSABASEERR+51)
+#define WSAENETRESET (WSABASEERR+52)
+#define WSAECONNABORTED (WSABASEERR+53)
+#define WSAECONNRESET (WSABASEERR+54)
+#define WSAENOBUFS (WSABASEERR+55)
+#define WSAEISCONN (WSABASEERR+56)
+#define WSAENOTCONN (WSABASEERR+57)
+#define WSAESHUTDOWN (WSABASEERR+58)
+#define WSAETOOMANYREFS (WSABASEERR+59)
+#define WSAETIMEDOUT (WSABASEERR+60)
+#define WSAECONNREFUSED (WSABASEERR+61)
+#define WSAELOOP (WSABASEERR+62)
+#define WSAENAMETOOLONG (WSABASEERR+63)
+#define WSAEHOSTDOWN (WSABASEERR+64)
+#define WSAEHOSTUNREACH (WSABASEERR+65)
+#define WSAENOTEMPTY (WSABASEERR+66)
+#define WSAEPROCLIM (WSABASEERR+67)
+#define WSAEUSERS (WSABASEERR+68)
+#define WSAEDQUOT (WSABASEERR+69)
+#define WSAESTALE (WSABASEERR+70)
+#define WSAEREMOTE (WSABASEERR+71)
+#define WSASYSNOTREADY (WSABASEERR+91)
+#define WSAVERNOTSUPPORTED (WSABASEERR+92)
+#define WSANOTINITIALISED (WSABASEERR+93)
+#define WSAEDISCON (WSABASEERR+101)
+#define WSAHOST_NOT_FOUND (WSABASEERR+1001)
+#define WSATRY_AGAIN (WSABASEERR+1002)
+#define WSANO_RECOVERY (WSABASEERR+1003)
+#define WSANO_DATA (WSABASEERR+1004)
+#define WSA_SECURE_HOST_NOT_FOUND (WSABASEERR+1032)
+#define WSA_IPSEC_NAME_POLICY_ERROR (WSABASEERR+1033)
+
+#endif /* !WSABASEERR */
+
+#define WSANO_ADDRESS WSANO_DATA
+
+#define TF_DISCONNECT 0x01
+#define TF_REUSE_SOCKET 0x02
+#define TF_WRITE_BEHIND 0x04
+
+#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e)
+#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error)
+#define WSAGETASYNCBUFLEN(l) LOWORD(l)
+#define WSAGETASYNCERROR(l) HIWORD(l)
+#define WSAGETSELECTEVENT(l) LOWORD(l)
+#define WSAGETSELECTERROR(l) HIWORD(l)
typedef struct sockaddr SOCKADDR;
typedef struct sockaddr *PSOCKADDR;
@@ -504,9 +492,6 @@ typedef struct sockaddr_in *LPSOCKADDR_IN;
typedef struct linger LINGER;
typedef struct linger *PLINGER;
typedef struct linger *LPLINGER;
-typedef struct in_addr IN_ADDR;
-typedef struct in_addr *PIN_ADDR;
-typedef struct in_addr *LPIN_ADDR;
typedef struct fd_set FD_SET;
typedef struct fd_set *PFD_SET;
typedef struct fd_set *LPFD_SET;
@@ -523,22 +508,405 @@ typedef struct timeval TIMEVAL;
typedef struct timeval *PTIMEVAL;
typedef struct timeval *LPTIMEVAL;
+struct sockaddr_in {
+ short sin_family;
+ u_short sin_port;
+ struct in_addr sin_addr;
+ char sin_zero[8];
+};
+
+typedef struct WSAData {
+ WORD wVersion;
+ WORD wHighVersion;
+#ifdef _WIN64
+ unsigned short iMaxSockets;
+ unsigned short iMaxUdpDg;
+ char *lpVendorInfo;
+ char szDescription[WSADESCRIPTION_LEN+1];
+ char szSystemStatus[WSASYS_STATUS_LEN+1];
+#else
+ char szDescription[WSADESCRIPTION_LEN+1];
+ char szSystemStatus[WSASYS_STATUS_LEN+1];
+ unsigned short iMaxSockets;
+ unsigned short iMaxUdpDg;
+ char *lpVendorInfo;
+#endif
+} WSADATA, FAR *LPWSADATA;
+
+struct ip_mreq {
+ struct in_addr imr_multiaddr;
+ struct in_addr imr_interface;
+};
+
+struct sockproto {
+ u_short sp_family;
+ u_short sp_protocol;
+};
+
+SOCKET
+PASCAL FAR
+accept(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *addr OPTIONAL,
+ IN OUT int FAR *addrlen OPTIONAL);
+
+int
+PASCAL FAR
+bind(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *addr,
+ IN int namelen);
+
+int
+PASCAL FAR
+closesocket(
+ IN SOCKET s);
+
+int
+PASCAL FAR
+connect(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen);
+
+int
+PASCAL FAR
+ioctlsocket(
+ IN SOCKET s,
+ IN long cmd,
+ IN OUT u_long FAR *argp);
+
+int
+PASCAL FAR
+getpeername(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT int FAR *namelen);
+
+int
+PASCAL FAR
+getsockname(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT int FAR *namelen);
+
+int
+PASCAL FAR
+getsockopt(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ OUT char FAR *optval,
+ IN OUT int FAR *optlen);
+
+u_long
+PASCAL FAR
+htonl(
+ IN u_long hostlong);
+
+u_short
+PASCAL FAR
+htons(
+ IN u_short hostshort);
+
+unsigned long
+PASCAL FAR
+inet_addr(
+ IN const char FAR *cp);
+
+char FAR
+*PASCAL FAR
+inet_ntoa(
+ IN struct in_addr in);
+
+int
+PASCAL FAR
+listen(
+ IN SOCKET s,
+ IN int backlog);
+
+u_long
+PASCAL FAR
+ntohl(
+ IN u_long netlong);
+
+u_short
+PASCAL FAR
+ntohs(
+ IN u_short netshort);
+
+int
+PASCAL FAR
+recv(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN int flags);
+
+int
+PASCAL FAR
+recvfrom(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN int flags,
+ OUT struct sockaddr FAR *from OPTIONAL,
+ IN OUT int FAR * fromlen OPTIONAL);
+
+int
+PASCAL FAR
+select(
+ IN int nfds,
+ IN OUT fd_set FAR *readfds OPTIONAL,
+ IN OUT fd_set FAR *writefds OPTIONAL,
+ IN OUT fd_set FAR *exceptfds OPTIONAL,
+ IN const struct timeval FAR *timeout OPTIONAL);
+
+int
+PASCAL FAR
+send(
+ IN SOCKET s,
+ IN const char FAR *buf,
+ IN int len,
+ IN int flags);
+
+int
+PASCAL FAR
+sendto(
+ IN SOCKET s,
+ IN const char FAR *buf,
+ IN int len,
+ IN int flags,
+ IN const struct sockaddr FAR *to OPTIONAL,
+ IN int tolen);
+
+int
+PASCAL FAR
+setsockopt(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ IN const char FAR *optval OPTIONAL,
+ IN int optlen);
+
+int
+PASCAL FAR
+shutdown(
+ IN SOCKET s,
+ IN int how);
+
+SOCKET
+PASCAL FAR
+socket(
+ IN int af,
+ IN int type,
+ IN int protocol);
+
+struct hostent FAR
+*PASCAL FAR
+gethostbyaddr(
+ IN const char FAR *addr,
+ IN int len,
+ IN int type);
+
+struct hostent FAR
+*PASCAL FAR
+gethostbyname(
+ IN const char FAR *name);
+
+int
+PASCAL FAR
+gethostname(
+ OUT char FAR *name,
+ IN int namelen);
+
+struct servent FAR
+*PASCAL FAR
+getservbyport(
+ IN int port,
+ IN const char FAR *proto);
+
+struct servent FAR
+*PASCAL FAR
+getservbyname(
+ IN const char FAR *name,
+ IN const char FAR *proto);
+
+struct protoent FAR
+*PASCAL FAR
+getprotobynumber(
+ IN int number);
+
+struct protoent FAR
+*PASCAL FAR
+getprotobyname(
+ IN const char FAR *name);
+
+int
+PASCAL FAR
+WSAStartup(
+ IN WORD wVersionRequired,
+ OUT LPWSADATA lpWSAData);
+
+int
+PASCAL FAR
+WSACleanup(void);
+
+void
+PASCAL FAR
+WSASetLastError(
+ IN int iError);
+
+int
+PASCAL FAR
+WSAGetLastError(void);
+
+BOOL
+PASCAL FAR
+WSAIsBlocking(void);
+
+int
+PASCAL FAR
+WSAUnhookBlockingHook(void);
+
+FARPROC
+PASCAL FAR
+WSASetBlockingHook(
+ IN FARPROC lpBlockFunc);
+
+int
+PASCAL FAR
+WSACancelBlockingCall(void);
+
+HANDLE
+PASCAL FAR
+WSAAsyncGetServByName(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ IN const char FAR *proto,
+ OUT char FAR *buf,
+ IN int buflen);
+
+HANDLE
+PASCAL FAR
+WSAAsyncGetServByPort(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN int port,
+ IN const char FAR *proto,
+ OUT char FAR *buf,
+ IN int buflen);
+
+HANDLE
+PASCAL FAR
+WSAAsyncGetProtoByName(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ OUT char FAR *buf,
+ IN int buflen);
+
+HANDLE
+PASCAL FAR
+WSAAsyncGetProtoByNumber(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN int number,
+ OUT char FAR *buf,
+ IN int buflen);
+
+HANDLE
+PASCAL FAR
+WSAAsyncGetHostByName(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ OUT char FAR *buf,
+ IN int buflen);
+
+HANDLE
+PASCAL FAR
+WSAAsyncGetHostByAddr(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *addr,
+ IN int len,
+ IN int type,
+ OUT char FAR *buf,
+ IN int buflen);
+
+int
+PASCAL FAR
+WSACancelAsyncRequest(
+ IN HANDLE hAsyncTaskHandle);
+
+int
+PASCAL FAR
+WSAAsyncSelect(
+ IN SOCKET s,
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN long lEvent);
+
+int
+PASCAL FAR
+WSARecvEx(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN OUT int FAR *flags);
+
+typedef struct _TRANSMIT_FILE_BUFFERS {
+ PVOID Head;
+ DWORD HeadLength;
+ PVOID Tail;
+ DWORD TailLength;
+} TRANSMIT_FILE_BUFFERS, *PTRANSMIT_FILE_BUFFERS, *LPTRANSMIT_FILE_BUFFERS;
+
+BOOL
+PASCAL FAR
+TransmitFile(
+ IN SOCKET hSocket,
+ IN HANDLE hFile,
+ IN DWORD nNumberOfBytesToWrite,
+ IN DWORD nNumberOfBytesPerSend,
+ IN OUT LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers OPTIONAL,
+ IN DWORD dwReserved);
+
+BOOL
+PASCAL FAR
+AcceptEx(
+ IN SOCKET sListenSocket,
+ IN SOCKET sAcceptSocket,
+ OUT PVOID lpOutputBuffer,
+ IN DWORD dwReceiveDataLength,
+ IN DWORD dwLocalAddressLength,
+ IN DWORD dwRemoteAddressLength,
+ OUT LPDWORD lpdwBytesReceived,
+ IN OUT LPOVERLAPPED lpOverlapped);
+
+VOID
+PASCAL FAR
+GetAcceptExSockaddrs(
+ IN PVOID lpOutputBuffer,
+ IN DWORD dwReceiveDataLength,
+ IN DWORD dwLocalAddressLength,
+ IN DWORD dwRemoteAddressLength,
+ OUT struct sockaddr **LocalSockaddr,
+ OUT LPINT LocalSockaddrLength,
+ OUT struct sockaddr **RemoteSockaddr,
+ OUT LPINT RemoteSockaddrLength);
+
+#if(_WIN32_WINNT >= 0x0501)
+
+#ifdef IPV6STRICT
+#error WINSOCK2 required.
+#endif
+
+#endif /* (_WIN32_WINNT >= 0x0501) */
+
#ifdef __cplusplus
}
#endif
-/*
- * Recent MSDN docs indicate that the MS-specific extensions exported from
- * mswsock.dll (AcceptEx, TransmitFile. WSARecEx and GetAcceptExSockaddrs) are
- * declared in mswsock.h. These extensions are not supported on W9x or WinCE.
- * However, code using WinSock 1.1 API may expect the declarations and
- * associated defines to be in this header. Thus we include mswsock.h here.
- *
- * When linking against the WinSock 1.1 lib, wsock32.dll, the mswsock functions
- * are automatically routed to mswsock.dll (on platforms with support).
- * The WinSock 2 lib, ws2_32.dll, does not contain any references to
- * the mswsock extensions.
- */
-
-#include
-
-#endif
diff --git a/include/psdk/winsock2.h b/include/psdk/winsock2.h
index 4a42a279a81..f2243369f3e 100644
--- a/include/psdk/winsock2.h
+++ b/include/psdk/winsock2.h
@@ -1,21 +1,44 @@
-/*
+#pragma once
- Definitions for winsock 2
-
- Initially taken from the Wine project.
-
- Portions Copyright (c) 1980, 1983, 1988, 1993
- The Regents of the University of California. All rights reserved.
-
- Portions Copyright (c) 1993 by Digital Equipment Corporation.
- */
-
-#if !(defined _WINSOCK2_H || defined _WINSOCK_H)
-#define _WINSOCK2_H
-#define _WINSOCK_H /* to prevent later inclusion of winsock.h */
+#if !(defined _WINSOCK2API_ || defined _WINSOCKAPI_)
+#define _WINSOCK2API_
+#define _WINSOCKAPI_ /* to prevent later inclusion of winsock.h */
#define _GNU_H_WINDOWS32_SOCKETS
+#if (!defined(_WIN64) && !defined(WIN32))
+#include
+#define _NEED_POPPACK
+#endif
+
+#ifndef INCL_WINSOCK_API_PROTOTYPES
+#define INCL_WINSOCK_API_PROTOTYPES 1
+#endif
+
+#ifndef INCL_WINSOCK_API_TYPEDEFS
+#define INCL_WINSOCK_API_TYPEDEFS 0
+#endif
+
+#ifndef _INC_WINDOWS
+#include
+#endif
+
+#if !defined(MAKEWORD)
+#define MAKEWORD(low,high) ((WORD)(((BYTE)(low)) | ((WORD)((BYTE)(high))) << 8))
+#endif
+
+#ifndef WINSOCK_VERSION
+#define WINSOCK_VERSION MAKEWORD(2,2)
+#endif
+
+#ifndef WINSOCK_API_LINKAGE
+#ifdef DECLSPEC_IMPORT
+#define WINSOCK_API_LINKAGE DECLSPEC_IMPORT
+#else
+#define WINSOCK_API_LINKAGE
+#endif
+#endif
+
#ifndef _M_AMD64
#if !defined(__ROS_LONG64__)
#ifdef __WINESRC__
@@ -24,1031 +47,392 @@
#endif
#endif
-#include
-
#ifdef __cplusplus
extern "C" {
#endif
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable:4820)
-#endif
-/* Names common to Winsock1.1 and Winsock2 */
+
+/* Names common to Winsock1.1 and Winsock2 */
#if !defined ( _BSDTYPES_DEFINED )
/* also defined in gmon.h and in cygwin's sys/types */
-typedef unsigned char u_char;
-typedef unsigned short u_short;
-typedef unsigned int u_int;
+typedef unsigned char u_char;
+typedef unsigned short u_short;
+typedef unsigned int u_int;
#ifndef __ROS_LONG64__
-typedef unsigned long u_long;
+typedef unsigned long u_long;
#else
-typedef unsigned int u_long;
+typedef unsigned int u_long;
#endif
#define _BSDTYPES_DEFINED
#endif /* ! def _BSDTYPES_DEFINED */
-typedef UINT_PTR SOCKET;
+
+#if(_WIN32_WINNT >= 0x0501)
+typedef unsigned __int64 u_int64;
+#endif /* (_WIN32_WINNT >= 0x0501) */
+
+#include
+
+typedef UINT_PTR SOCKET;
+
#ifndef FD_SETSIZE
-#define FD_SETSIZE 64
+#define FD_SETSIZE 64
#endif
-#define WSAAPI WINAPI
-
-/* shutdown() how types */
-#define SD_RECEIVE 0x00
-#define SD_SEND 0x01
-#define SD_BOTH 0x02
-
#ifndef _SYS_TYPES_FD_SET
+
/* fd_set may be defined by the newlib
* if __USE_W32_SOCKETS not defined.
*/
#ifdef fd_set
#undef fd_set
#endif
+
typedef struct fd_set {
- u_int fd_count;
- SOCKET fd_array[FD_SETSIZE];
+ u_int fd_count;
+ SOCKET fd_array[FD_SETSIZE];
} fd_set;
-int PASCAL __WSAFDIsSet(SOCKET,fd_set*);
+
+extern int PASCAL FAR __WSAFDIsSet(SOCKET,fd_set FAR*);
+
#ifndef FD_CLR
-#define FD_CLR(fd,set) do { u_int __i;\
-for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
- if (((fd_set *)(set))->fd_array[__i] == (fd)) {\
- while (__i < ((fd_set *)(set))->fd_count-1) {\
- ((fd_set*)(set))->fd_array[__i] = ((fd_set*)(set))->fd_array[__i+1];\
- __i++;\
- }\
- ((fd_set*)(set))->fd_count--;\
- break;\
- }\
-}\
-} while (0)
-#endif
-#ifndef FD_SET
-/* this differs from the define in winsock.h and in cygwin sys/types.h */
-#define FD_SET(fd, set) do { u_int __i;\
-for (__i = 0; __i < ((fd_set *)(set))->fd_count ; __i++) {\
- if (((fd_set *)(set))->fd_array[__i] == (fd)) {\
- break;\
- }\
-}\
-if (__i == ((fd_set *)(set))->fd_count) {\
- if (((fd_set *)(set))->fd_count < FD_SETSIZE) {\
- ((fd_set *)(set))->fd_array[__i] = (fd);\
- ((fd_set *)(set))->fd_count++;\
- }\
-}\
+#define FD_CLR(fd, set) do { \
+ u_int __i; \
+ for (__i = 0; __i < ((fd_set FAR*)(set))->fd_count ; __i++) { \
+ if (((fd_set FAR*)(set))->fd_array[__i] == fd) { \
+ while (__i < ((fd_set FAR*)(set))->fd_count-1) { \
+ ((fd_set FAR*)(set))->fd_array[__i] = \
+ ((fd_set FAR*)(set))->fd_array[__i+1]; \
+ __i++; \
+ } \
+ ((fd_set FAR*)(set))->fd_count--; \
+ break; \
+ } \
+ } \
} while(0)
#endif
+
+#ifndef FD_SET
+/* this differs from the define in winsock.h and in cygwin sys/types.h */
+#define FD_SET(fd, set) do { \
+ u_int __i; \
+ for (__i = 0; __i < ((fd_set FAR *)(set))->fd_count; __i++) { \
+ if (((fd_set FAR *)(set))->fd_array[__i] == (fd)) { \
+ break; \
+ } \
+ } \
+ if (__i == ((fd_set FAR *)(set))->fd_count) { \
+ if (((fd_set FAR *)(set))->fd_count < FD_SETSIZE) { \
+ ((fd_set FAR *)(set))->fd_array[__i] = (fd); \
+ ((fd_set FAR *)(set))->fd_count++; \
+ } \
+ } \
+} while(0)
+#endif
+
#ifndef FD_ZERO
-#define FD_ZERO(set) (((fd_set *)(set))->fd_count=0)
+#define FD_ZERO(set) (((fd_set FAR*)(set))->fd_count=0)
#endif
+
#ifndef FD_ISSET
-#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set *)(set))
+#define FD_ISSET(fd, set) __WSAFDIsSet((SOCKET)(fd), (fd_set FAR*)(set))
#endif
+
#elif !defined (USE_SYS_TYPES_FD_SET)
#warning "fd_set and associated macros have been defined in sys/types. \
This may cause runtime problems with W32 sockets"
#endif /* ndef _SYS_TYPES_FD_SET */
-#if !(defined (__INSIDE_CYGWIN__) || (defined (__INSIDE_MSYS__) && (__INSIDE_MSYS__)))
+
+#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
+
#ifndef _TIMEVAL_DEFINED
+
/* also in sys/time.h */
#define _TIMEVAL_DEFINED
#define _STRUCT_TIMEVAL
struct timeval {
- LONG tv_sec;
- LONG tv_usec;
+ LONG tv_sec;
+ LONG tv_usec;
};
-#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
+
+#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
+
#define timercmp(tvp, uvp, cmp) \
- (((tvp)->tv_sec != (uvp)->tv_sec) ? \
- ((tvp)->tv_sec cmp (uvp)->tv_sec) : \
- ((tvp)->tv_usec cmp (uvp)->tv_usec))
-#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
+ (((tvp)->tv_sec != (uvp)->tv_sec) ? \
+ ((tvp)->tv_sec cmp (uvp)->tv_sec) : \
+ ((tvp)->tv_usec cmp (uvp)->tv_usec))
+
+#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
+
#endif /* _TIMEVAL_DEFINED */
-struct hostent {
- char *h_name;
- char **h_aliases;
- short h_addrtype;
- short h_length;
- char **h_addr_list;
+
#define h_addr h_addr_list[0]
+
+struct hostent {
+ char *h_name;
+ char **h_aliases;
+ short h_addrtype;
+ short h_length;
+ char **h_addr_list;
};
+
struct linger {
- u_short l_onoff;
- u_short l_linger;
+ u_short l_onoff;
+ u_short l_linger;
};
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define IOCPARM_MASK 0x7f
-#define IOC_VOID 0x20000000
-#define IOC_OUT 0x40000000
-#define IOC_IN 0x80000000
-#define IOC_INOUT (IOC_IN|IOC_OUT)
-#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
-#define _IOR(x,y,t) (IOC_OUT|(((LONG)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#define _IOW(x,y,t) (IOC_IN|(((LONG)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
-#define FIONBIO _IOW('f', 126, u_long)
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
+#define FIONBIO _IOW('f', 126, u_long)
-#define FIONREAD _IOR('f', 127, u_long)
-#define FIOASYNC _IOW('f', 125, u_long)
-#define SIOCSHIWAT _IOW('s', 0, u_long)
-#define SIOCGHIWAT _IOR('s', 1, u_long)
-#define SIOCSLOWAT _IOW('s', 2, u_long)
-#define SIOCGLOWAT _IOR('s', 3, u_long)
-#define SIOCATMARK _IOR('s', 7, u_long)
-
-#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
struct netent {
- char * n_name;
- char **n_aliases;
- short n_addrtype;
- u_long n_net;
+ char * n_name;
+ char **n_aliases;
+ short n_addrtype;
+ u_long n_net;
};
-struct servent {
- char *s_name;
- char **s_aliases;
- short s_port;
- char *s_proto;
-};
-struct protoent {
- char *p_name;
- char **p_aliases;
- short p_proto;
-};
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define IPPROTO_IP 0
-#define IPPROTO_ICMP 1
-#define IPPROTO_IGMP 2
-#define IPPROTO_GGP 3
-#define IPPROTO_TCP 6
-#define IPPROTO_PUP 12
-#define IPPROTO_UDP 17
-#define IPPROTO_IDP 22
-#define IPPROTO_ND 77
-#define IPPROTO_RAW 255
-#define IPPROTO_MAX 256
-/* IPv6 options */
-#define IPPROTO_HOPOPTS 0 /* IPv6 Hop-by-Hop options */
-#define IPPROTO_IPV6 41 /* IPv6 header */
-#define IPPROTO_ROUTING 43 /* IPv6 Routing header */
-#define IPPROTO_FRAGMENT 44 /* IPv6 fragmentation header */
-#define IPPROTO_ESP 50 /* encapsulating security payload */
-#define IPPROTO_AH 51 /* authentication header */
-#define IPPROTO_ICMPV6 58 /* ICMPv6 */
-#define IPPROTO_NONE 59 /* IPv6 no next header */
-#define IPPROTO_DSTOPTS 60 /* IPv6 Destination options */
-#define IPPORT_ECHO 7
-#define IPPORT_DISCARD 9
-#define IPPORT_SYSTAT 11
-#define IPPORT_DAYTIME 13
-#define IPPORT_NETSTAT 15
-#define IPPORT_FTP 21
-#define IPPORT_TELNET 23
-#define IPPORT_SMTP 25
-#define IPPORT_TIMESERVER 37
-#define IPPORT_NAMESERVER 42
-#define IPPORT_WHOIS 43
-#define IPPORT_MTP 57
-#define IPPORT_TFTP 69
-#define IPPORT_RJE 77
-#define IPPORT_FINGER 79
-#define IPPORT_TTYLINK 87
-#define IPPORT_SUPDUP 95
-#define IPPORT_EXECSERVER 512
-#define IPPORT_LOGINSERVER 513
-#define IPPORT_CMDSERVER 514
-#define IPPORT_EFSSERVER 520
-#define IPPORT_BIFFUDP 512
-#define IPPORT_WHOSERVER 513
-#define IPPORT_ROUTESERVER 520
-#define IPPORT_RESERVED 1024
-#define IMPLINK_IP 155
-#define IMPLINK_LOWEXPER 156
-#define IMPLINK_HIGHEXPER 158
-#ifndef s_addr
-typedef struct in_addr {
- union {
- struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
- struct { u_short s_w1,s_w2; } S_un_w;
- u_long S_addr;
- } S_un;
-#define s_addr S_un.S_addr
-#define s_host S_un.S_un_b.s_b2
-#define s_net S_un.S_un_b.s_b1
-#define s_imp S_un.S_un_w.s_w2
-#define s_impno S_un.S_un_b.s_b4
-#define s_lh S_un.S_un_b.s_b3
-} IN_ADDR, *PIN_ADDR;
+struct servent {
+ char FAR *s_name;
+ char FAR **s_aliases;
+#ifdef _WIN64
+ char FAR *s_proto;
+ short s_port;
+#else
+ short s_port;
+ char FAR *s_proto;
#endif
-#define IN_CLASSA(i) ((LONG)(i)&0x80000000)
-#define IN_CLASSA_NET 0xff000000
-#define IN_CLASSA_NSHIFT 24
-#define IN_CLASSA_HOST 0x00ffffff
-#define IN_CLASSA_MAX 128
-#define IN_CLASSB(i) (((LONG)(i)&0xc0000000)==0x80000000)
-#define IN_CLASSB_NET 0xffff0000
-#define IN_CLASSB_NSHIFT 16
-#define IN_CLASSB_HOST 0x0000ffff
-#define IN_CLASSB_MAX 65536
-#define IN_CLASSC(i) (((LONG)(i)&0xe0000000)==0xc0000000)
-#define IN_CLASSC_NET 0xffffff00
-#define IN_CLASSC_NSHIFT 8
-#define IN_CLASSC_HOST 0xff
-#define INADDR_ANY (u_long)0
-#define INADDR_LOOPBACK 0x7f000001
-#define INADDR_BROADCAST (u_long)0xffffffff
-#define INADDR_NONE 0xffffffff
-struct sockaddr_in {
- short sin_family;
- u_short sin_port;
- struct in_addr sin_addr;
- char sin_zero[8];
};
-#define WSADESCRIPTION_LEN 256
-#define WSASYS_STATUS_LEN 128
-typedef struct WSAData {
- WORD wVersion;
- WORD wHighVersion;
- char szDescription[WSADESCRIPTION_LEN+1];
- char szSystemStatus[WSASYS_STATUS_LEN+1];
- unsigned short iMaxSockets;
- unsigned short iMaxUdpDg;
- char * lpVendorInfo;
-} WSADATA;
-typedef WSADATA *LPWSADATA;
-#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define IP_OPTIONS 1
-#define SO_DEBUG 1
-#define SO_ACCEPTCONN 2
-#define SO_REUSEADDR 4
-#define SO_KEEPALIVE 8
-#define SO_DONTROUTE 16
-#define SO_BROADCAST 32
-#define SO_USELOOPBACK 64
-#define SO_LINGER 128
-#define SO_OOBINLINE 256
-#define SO_DONTLINGER (u_int)(~SO_LINGER)
-#define SO_EXCLUSIVEADDRUSE ((u_int)(~SO_REUSEADDR))
-#define SO_SNDBUF 0x1001
-#define SO_RCVBUF 0x1002
-#define SO_SNDLOWAT 0x1003
-#define SO_RCVLOWAT 0x1004
-#define SO_SNDTIMEO 0x1005
-#define SO_RCVTIMEO 0x1006
-#define SO_ERROR 0x1007
-#define SO_TYPE 0x1008
-#define SO_CONDITIONAL_ACCEPT 0x3002
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
+struct protoent {
+ char *p_name;
+ char **p_aliases;
+ short p_proto;
+};
+
+#define SOMAXCONN 0x7fffffff
+
+#define MSG_OOB 1
+#define MSG_PEEK 2
+#define MSG_DONTROUTE 4
+#if(_WIN32_WINNT >= 0x0502)
+#define MSG_WAITALL 8
+#endif
+
+#define h_errno WSAGetLastError()
+#define HOST_NOT_FOUND WSAHOST_NOT_FOUND
+#define TRY_AGAIN WSATRY_AGAIN
+#define NO_RECOVERY WSANO_RECOVERY
+#define NO_DATA WSANO_DATA
+#define NO_ADDRESS WSANO_ADDRESS
+
+#endif /* !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__)) */
+
+#define FIONREAD _IOR('f', 127, u_long)
+#define FIOASYNC _IOW('f', 125, u_long)
+#define SIOCSHIWAT _IOW('s', 0, u_long)
+#define SIOCGHIWAT _IOR('s', 1, u_long)
+#define SIOCSLOWAT _IOW('s', 2, u_long)
+#define SIOCGLOWAT _IOR('s', 3, u_long)
+#define SIOCATMARK _IOR('s', 7, u_long)
+
+#define IMPLINK_IP 155
+#define IMPLINK_LOWEXPER 156
+#define IMPLINK_HIGHEXPER 158
+
+#define ADDR_ANY INADDR_ANY
+
+#define WSADESCRIPTION_LEN 256
+#define WSASYS_STATUS_LEN 128
#define INVALID_SOCKET (SOCKET)(~0)
-#define SOCKET_ERROR (-1)
-#define SOCK_STREAM 1
-#define SOCK_DGRAM 2
-#define SOCK_RAW 3
-#define SOCK_RDM 4
-#define SOCK_SEQPACKET 5
-#define TCP_NODELAY 0x0001
-#define AF_UNSPEC 0
-#define AF_UNIX 1
-#define AF_INET 2
-#define AF_IMPLINK 3
-#define AF_PUP 4
-#define AF_CHAOS 5
-#define AF_IPX 6
-#define AF_NS 6
-#define AF_ISO 7
-#define AF_OSI AF_ISO
-#define AF_ECMA 8
-#define AF_DATAKIT 9
-#define AF_CCITT 10
-#define AF_SNA 11
-#define AF_DECnet 12
-#define AF_DLI 13
-#define AF_LAT 14
-#define AF_HYLINK 15
-#define AF_APPLETALK 16
-#define AF_NETBIOS 17
-#define AF_VOICEVIEW 18
-#define AF_FIREFOX 19
-#define AF_UNKNOWN1 20
-#define AF_BAN 21
-#define AF_ATM 22
-#define AF_INET6 23
-#define AF_CLUSTER 24
-#define AF_12844 25
-#define AF_IRDA 26
-#define AF_NETDES 28
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define AF_MAX 29
-struct sockaddr {
- u_short sa_family;
- char sa_data[14];
-};
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-/* Portable IPv6/IPv4 version of sockaddr.
- Uses padding to force 8 byte alignment
- and maximum size of 128 bytes */
-struct sockaddr_storage {
- short ss_family;
- char __ss_pad1[6]; /* pad to 8 */
- __int64 __ss_align; /* force alignment */
- char __ss_pad2[112]; /* pad to 128 */
-};
+#define SOCKET_ERROR (-1)
-struct sockproto {
- u_short sp_family;
- u_short sp_protocol;
-};
-#define PF_UNSPEC AF_UNSPEC
-#define PF_UNIX AF_UNIX
-#define PF_INET AF_INET
-#define PF_IMPLINK AF_IMPLINK
-#define PF_PUP AF_PUP
-#define PF_CHAOS AF_CHAOS
-#define PF_NS AF_NS
-#define PF_IPX AF_IPX
-#define PF_ISO AF_ISO
-#define PF_OSI AF_OSI
-#define PF_ECMA AF_ECMA
-#define PF_DATAKIT AF_DATAKIT
-#define PF_CCITT AF_CCITT
-#define PF_SNA AF_SNA
-#define PF_DECnet AF_DECnet
-#define PF_DLI AF_DLI
-#define PF_LAT AF_LAT
-#define PF_HYLINK AF_HYLINK
-#define PF_APPLETALK AF_APPLETALK
-#define PF_VOICEVIEW AF_VOICEVIEW
-#define PF_FIREFOX AF_FIREFOX
-#define PF_UNKNOWN1 AF_UNKNOWN1
-#define PF_BAN AF_BAN
-#define PF_ATM AF_ATM
-#define PF_INET6 AF_INET6
-#define PF_MAX AF_MAX
-#define SOL_SOCKET 0xffff
-#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define SOMAXCONN 0x7fffffff /* (5) in WinSock1.1 */
-#define MSG_OOB 1
-#define MSG_PEEK 2
-#define MSG_DONTROUTE 4
-#define MSG_WAITALL 8
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-#define MSG_MAXIOVLEN 16
-#define MSG_PARTIAL 0x8000
-#define MAXGETHOSTSTRUCT 1024
+#define FROM_PROTOCOL_INFO (-1)
-#define FD_READ_BIT 0
-#define FD_READ (1 << FD_READ_BIT)
-#define FD_WRITE_BIT 1
-#define FD_WRITE (1 << FD_WRITE_BIT)
-#define FD_OOB_BIT 2
-#define FD_OOB (1 << FD_OOB_BIT)
-#define FD_ACCEPT_BIT 3
-#define FD_ACCEPT (1 << FD_ACCEPT_BIT)
-#define FD_CONNECT_BIT 4
-#define FD_CONNECT (1 << FD_CONNECT_BIT)
-#define FD_CLOSE_BIT 5
-#define FD_CLOSE (1 << FD_CLOSE_BIT)
-/* winsock1.1 defines stop at FD_CLOSE (32) */
-#define FD_QOS_BIT 6
-#define FD_QOS (1 << FD_QOS_BIT)
+#define SO_PROTOCOL_INFOA 0x2004
+#define SO_PROTOCOL_INFOW 0x2005
+#ifdef UNICODE
+#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOW
+#else
+#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA
+#endif
+#define PVD_CONFIG 0x3001
+
+#define PF_UNSPEC AF_UNSPEC
+#define PF_UNIX AF_UNIX
+#define PF_INET AF_INET
+#define PF_IMPLINK AF_IMPLINK
+#define PF_PUP AF_PUP
+#define PF_CHAOS AF_CHAOS
+#define PF_NS AF_NS
+#define PF_IPX AF_IPX
+#define PF_ISO AF_ISO
+#define PF_OSI AF_OSI
+#define PF_ECMA AF_ECMA
+#define PF_DATAKIT AF_DATAKIT
+#define PF_CCITT AF_CCITT
+#define PF_SNA AF_SNA
+#define PF_DECnet AF_DECnet
+#define PF_DLI AF_DLI
+#define PF_LAT AF_LAT
+#define PF_HYLINK AF_HYLINK
+#define PF_APPLETALK AF_APPLETALK
+#define PF_VOICEVIEW AF_VOICEVIEW
+#define PF_FIREFOX AF_FIREFOX
+#define PF_UNKNOWN1 AF_UNKNOWN1
+#define PF_BAN AF_BAN
+#define PF_ATM AF_ATM
+#define PF_INET6 AF_INET6
+#if(_WIN32_WINNT >= 0x0600)
+#define PF_BTH AF_BTH
+#endif
+#define PF_MAX AF_MAX
+
+#define MSG_PARTIAL 0x8000
+#define MSG_INTERRUPT 0x10
+#define MSG_MAXIOVLEN 16
+
+#define MAXGETHOSTSTRUCT 1024
+
+#define FD_READ_BIT 0
+#define FD_READ (1 << FD_READ_BIT)
+#define FD_WRITE_BIT 1
+#define FD_WRITE (1 << FD_WRITE_BIT)
+#define FD_OOB_BIT 2
+#define FD_OOB (1 << FD_OOB_BIT)
+#define FD_ACCEPT_BIT 3
+#define FD_ACCEPT (1 << FD_ACCEPT_BIT)
+#define FD_CONNECT_BIT 4
+#define FD_CONNECT (1 << FD_CONNECT_BIT)
+#define FD_CLOSE_BIT 5
+#define FD_CLOSE (1 << FD_CLOSE_BIT)
+#define FD_QOS_BIT 6
+#define FD_QOS (1 << FD_QOS_BIT)
#define FD_GROUP_QOS_BIT 7
-#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT)
+#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT)
#define FD_ROUTING_INTERFACE_CHANGE_BIT 8
-#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT)
+#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT)
#define FD_ADDRESS_LIST_CHANGE_BIT 9
-#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT)
-#define FD_MAX_EVENTS 10
-#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1)
+#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT)
+#define FD_MAX_EVENTS 10
+#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1)
#ifndef WSABASEERR
-#define WSABASEERR 10000
-#define WSAEINTR (WSABASEERR+4)
-#define WSAEBADF (WSABASEERR+9)
-#define WSAEACCES (WSABASEERR+13)
-#define WSAEFAULT (WSABASEERR+14)
-#define WSAEINVAL (WSABASEERR+22)
-#define WSAEMFILE (WSABASEERR+24)
-#define WSAEWOULDBLOCK (WSABASEERR+35)
-#define WSAEINPROGRESS (WSABASEERR+36) /* deprecated on WinSock2 */
-#define WSAEALREADY (WSABASEERR+37)
-#define WSAENOTSOCK (WSABASEERR+38)
-#define WSAEDESTADDRREQ (WSABASEERR+39)
-#define WSAEMSGSIZE (WSABASEERR+40)
-#define WSAEPROTOTYPE (WSABASEERR+41)
-#define WSAENOPROTOOPT (WSABASEERR+42)
-#define WSAEPROTONOSUPPORT (WSABASEERR+43)
-#define WSAESOCKTNOSUPPORT (WSABASEERR+44)
-#define WSAEOPNOTSUPP (WSABASEERR+45)
-#define WSAEPFNOSUPPORT (WSABASEERR+46)
-#define WSAEAFNOSUPPORT (WSABASEERR+47)
-#define WSAEADDRINUSE (WSABASEERR+48)
-#define WSAEADDRNOTAVAIL (WSABASEERR+49)
-#define WSAENETDOWN (WSABASEERR+50)
-#define WSAENETUNREACH (WSABASEERR+51)
-#define WSAENETRESET (WSABASEERR+52)
-#define WSAECONNABORTED (WSABASEERR+53)
-#define WSAECONNRESET (WSABASEERR+54)
-#define WSAENOBUFS (WSABASEERR+55)
-#define WSAEISCONN (WSABASEERR+56)
-#define WSAENOTCONN (WSABASEERR+57)
-#define WSAESHUTDOWN (WSABASEERR+58)
-#define WSAETOOMANYREFS (WSABASEERR+59)
-#define WSAETIMEDOUT (WSABASEERR+60)
-#define WSAECONNREFUSED (WSABASEERR+61)
-#define WSAELOOP (WSABASEERR+62)
-#define WSAENAMETOOLONG (WSABASEERR+63)
-#define WSAEHOSTDOWN (WSABASEERR+64)
-#define WSAEHOSTUNREACH (WSABASEERR+65)
-#define WSAENOTEMPTY (WSABASEERR+66)
-#define WSAEPROCLIM (WSABASEERR+67)
-#define WSAEUSERS (WSABASEERR+68)
-#define WSAEDQUOT (WSABASEERR+69)
-#define WSAESTALE (WSABASEERR+70)
-#define WSAEREMOTE (WSABASEERR+71)
-#define WSAEDISCON (WSABASEERR+101)
-#define WSASYSNOTREADY (WSABASEERR+91)
-#define WSAVERNOTSUPPORTED (WSABASEERR+92)
-#define WSANOTINITIALISED (WSABASEERR+93)
-#define WSAHOST_NOT_FOUND (WSABASEERR+1001)
-#define WSATRY_AGAIN (WSABASEERR+1002)
-#define WSANO_RECOVERY (WSABASEERR+1003)
-#define WSANO_DATA (WSABASEERR+1004)
-/* WinSock2 specific error codes */
-#define WSAENOMORE (WSABASEERR+102)
-#define WSAECANCELLED (WSABASEERR+103)
-#define WSAEINVALIDPROCTABLE (WSABASEERR+104)
-#define WSAEINVALIDPROVIDER (WSABASEERR+105)
-#define WSAEPROVIDERFAILEDINIT (WSABASEERR+106)
-#define WSASYSCALLFAILURE (WSABASEERR+107)
-#define WSASERVICE_NOT_FOUND (WSABASEERR+108)
-#define WSATYPE_NOT_FOUND (WSABASEERR+109)
-#define WSA_E_NO_MORE (WSABASEERR+110)
-#define WSA_E_CANCELLED (WSABASEERR+111)
-#define WSAEREFUSED (WSABASEERR+112)
-
-/* WS QualityofService errors */
-#define WSA_QOS_RECEIVERS (WSABASEERR + 1005)
-#define WSA_QOS_SENDERS (WSABASEERR + 1006)
-#define WSA_QOS_NO_SENDERS (WSABASEERR + 1007)
-#define WSA_QOS_NO_RECEIVERS (WSABASEERR + 1008)
-#define WSA_QOS_REQUEST_CONFIRMED (WSABASEERR + 1009)
-#define WSA_QOS_ADMISSION_FAILURE (WSABASEERR + 1010)
-#define WSA_QOS_POLICY_FAILURE (WSABASEERR + 1011)
-#define WSA_QOS_BAD_STYLE (WSABASEERR + 1012)
-#define WSA_QOS_BAD_OBJECT (WSABASEERR + 1013)
-#define WSA_QOS_TRAFFIC_CTRL_ERROR (WSABASEERR + 1014)
-#define WSA_QOS_GENERIC_ERROR (WSABASEERR + 1015)
-#define WSA_QOS_ESERVICETYPE (WSABASEERR + 1016)
-#define WSA_QOS_EFLOWSPEC (WSABASEERR + 1017)
-#define WSA_QOS_EPROVSPECBUF (WSABASEERR + 1018)
-#define WSA_QOS_EFILTERSTYLE (WSABASEERR + 1019)
-#define WSA_QOS_EFILTERTYPE (WSABASEERR + 1020)
-#define WSA_QOS_EFILTERCOUNT (WSABASEERR + 1021)
-#define WSA_QOS_EOBJLENGTH (WSABASEERR + 1022)
-#define WSA_QOS_EFLOWCOUNT (WSABASEERR + 1023)
-#define WSA_QOS_EUNKOWNPSOBJ (WSABASEERR + 1024)
-#define WSA_QOS_EPOLICYOBJ (WSABASEERR + 1025)
-#define WSA_QOS_EFLOWDESC (WSABASEERR + 1026)
-#define WSA_QOS_EPSFLOWSPEC (WSABASEERR + 1027)
-#define WSA_QOS_EPSFILTERSPEC (WSABASEERR + 1028)
-#define WSA_QOS_ESDMODEOBJ (WSABASEERR + 1029)
-#define WSA_QOS_ESHAPERATEOBJ (WSABASEERR + 1030)
-#define WSA_QOS_RESERVED_PETYPE (WSABASEERR + 1031)
+#define WSABASEERR 10000
+#define WSAEINTR (WSABASEERR+4)
+#define WSAEBADF (WSABASEERR+9)
+#define WSAEACCES (WSABASEERR+13)
+#define WSAEFAULT (WSABASEERR+14)
+#define WSAEINVAL (WSABASEERR+22)
+#define WSAEMFILE (WSABASEERR+24)
+#define WSAEWOULDBLOCK (WSABASEERR+35)
+#define WSAEINPROGRESS (WSABASEERR+36)
+#define WSAEALREADY (WSABASEERR+37)
+#define WSAENOTSOCK (WSABASEERR+38)
+#define WSAEDESTADDRREQ (WSABASEERR+39)
+#define WSAEMSGSIZE (WSABASEERR+40)
+#define WSAEPROTOTYPE (WSABASEERR+41)
+#define WSAENOPROTOOPT (WSABASEERR+42)
+#define WSAEPROTONOSUPPORT (WSABASEERR+43)
+#define WSAESOCKTNOSUPPORT (WSABASEERR+44)
+#define WSAEOPNOTSUPP (WSABASEERR+45)
+#define WSAEPFNOSUPPORT (WSABASEERR+46)
+#define WSAEAFNOSUPPORT (WSABASEERR+47)
+#define WSAEADDRINUSE (WSABASEERR+48)
+#define WSAEADDRNOTAVAIL (WSABASEERR+49)
+#define WSAENETDOWN (WSABASEERR+50)
+#define WSAENETUNREACH (WSABASEERR+51)
+#define WSAENETRESET (WSABASEERR+52)
+#define WSAECONNABORTED (WSABASEERR+53)
+#define WSAECONNRESET (WSABASEERR+54)
+#define WSAENOBUFS (WSABASEERR+55)
+#define WSAEISCONN (WSABASEERR+56)
+#define WSAENOTCONN (WSABASEERR+57)
+#define WSAESHUTDOWN (WSABASEERR+58)
+#define WSAETOOMANYREFS (WSABASEERR+59)
+#define WSAETIMEDOUT (WSABASEERR+60)
+#define WSAECONNREFUSED (WSABASEERR+61)
+#define WSAELOOP (WSABASEERR+62)
+#define WSAENAMETOOLONG (WSABASEERR+63)
+#define WSAEHOSTDOWN (WSABASEERR+64)
+#define WSAEHOSTUNREACH (WSABASEERR+65)
+#define WSAENOTEMPTY (WSABASEERR+66)
+#define WSAEPROCLIM (WSABASEERR+67)
+#define WSAEUSERS (WSABASEERR+68)
+#define WSAEDQUOT (WSABASEERR+69)
+#define WSAESTALE (WSABASEERR+70)
+#define WSAEREMOTE (WSABASEERR+71)
+#define WSASYSNOTREADY (WSABASEERR+91)
+#define WSAVERNOTSUPPORTED (WSABASEERR+92)
+#define WSANOTINITIALISED (WSABASEERR+93)
+#define WSAEDISCON (WSABASEERR+101)
+#define WSAENOMORE (WSABASEERR+102)
+#define WSAECANCELLED (WSABASEERR+103)
+#define WSAEINVALIDPROCTABLE (WSABASEERR+104)
+#define WSAEINVALIDPROVIDER (WSABASEERR+105)
+#define WSAEPROVIDERFAILEDINIT (WSABASEERR+106)
+#define WSASYSCALLFAILURE (WSABASEERR+107)
+#define WSASERVICE_NOT_FOUND (WSABASEERR+108)
+#define WSATYPE_NOT_FOUND (WSABASEERR+109)
+#define WSA_E_NO_MORE (WSABASEERR+110)
+#define WSA_E_CANCELLED (WSABASEERR+111)
+#define WSAEREFUSED (WSABASEERR+112)
+#define WSAHOST_NOT_FOUND (WSABASEERR+1001)
+#define WSATRY_AGAIN (WSABASEERR+1002)
+#define WSANO_RECOVERY (WSABASEERR+1003)
+#define WSANO_DATA (WSABASEERR+1004)
+#define WSA_QOS_RECEIVERS (WSABASEERR + 1005)
+#define WSA_QOS_SENDERS (WSABASEERR + 1006)
+#define WSA_QOS_NO_SENDERS (WSABASEERR + 1007)
+#define WSA_QOS_NO_RECEIVERS (WSABASEERR + 1008)
+#define WSA_QOS_REQUEST_CONFIRMED (WSABASEERR + 1009)
+#define WSA_QOS_ADMISSION_FAILURE (WSABASEERR + 1010)
+#define WSA_QOS_POLICY_FAILURE (WSABASEERR + 1011)
+#define WSA_QOS_BAD_STYLE (WSABASEERR + 1012)
+#define WSA_QOS_BAD_OBJECT (WSABASEERR + 1013)
+#define WSA_QOS_TRAFFIC_CTRL_ERROR (WSABASEERR + 1014)
+#define WSA_QOS_GENERIC_ERROR (WSABASEERR + 1015)
+#define WSA_QOS_ESERVICETYPE (WSABASEERR + 1016)
+#define WSA_QOS_EFLOWSPEC (WSABASEERR + 1017)
+#define WSA_QOS_EPROVSPECBUF (WSABASEERR + 1018)
+#define WSA_QOS_EFILTERSTYLE (WSABASEERR + 1019)
+#define WSA_QOS_EFILTERTYPE (WSABASEERR + 1020)
+#define WSA_QOS_EFILTERCOUNT (WSABASEERR + 1021)
+#define WSA_QOS_EOBJLENGTH (WSABASEERR + 1022)
+#define WSA_QOS_EFLOWCOUNT (WSABASEERR + 1023)
+#define WSA_QOS_EUNKOWNPSOBJ (WSABASEERR + 1024)
+#define WSA_QOS_EPOLICYOBJ (WSABASEERR + 1025)
+#define WSA_QOS_EFLOWDESC (WSABASEERR + 1026)
+#define WSA_QOS_EPSFLOWSPEC (WSABASEERR + 1027)
+#define WSA_QOS_EPSFILTERSPEC (WSABASEERR + 1028)
+#define WSA_QOS_ESDMODEOBJ (WSABASEERR + 1029)
+#define WSA_QOS_ESHAPERATEOBJ (WSABASEERR + 1030)
+#define WSA_QOS_RESERVED_PETYPE (WSABASEERR + 1031)
#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 CF_ACCEPT 0x0000
+#define CF_REJECT 0x0001
+#define CF_DEFER 0x0002
+#define SD_RECEIVE 0x00
+#define SD_SEND 0x01
+#define SD_BOTH 0x02
-#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 SG_UNCONSTRAINED_GROUP 0x01
+#define SG_CONSTRAINED_GROUP 0x02
-#define WSANO_ADDRESS WSANO_DATA
-#if !(defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-#define h_errno WSAGetLastError()
-#define HOST_NOT_FOUND WSAHOST_NOT_FOUND
-#define TRY_AGAIN WSATRY_AGAIN
-#define NO_RECOVERY WSANO_RECOVERY
-#define NO_DATA WSANO_DATA
-#define NO_ADDRESS WSANO_ADDRESS
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
-SOCKET PASCAL accept(SOCKET,struct sockaddr*,int*);
-int PASCAL bind(SOCKET,const struct sockaddr*,int);
-int PASCAL closesocket(SOCKET);
-int PASCAL connect(SOCKET,const struct sockaddr*,int);
-int PASCAL ioctlsocket(SOCKET,LONG,u_long *);
-int PASCAL getpeername(SOCKET,struct sockaddr*,int*);
-int PASCAL getsockname(SOCKET,struct sockaddr*,int*);
-int PASCAL getsockopt(SOCKET,int,int,char*,int*);
-u_long PASCAL inet_addr(const char*);
-DECLARE_STDCALL_P(char *) inet_ntoa(struct in_addr);
-int PASCAL listen(SOCKET,int);
-int PASCAL recv(SOCKET,char*,int,int);
-int PASCAL recvfrom(SOCKET,char*,int,int,struct sockaddr*,int*);
-int PASCAL send(SOCKET,const char*,int,int);
-int PASCAL sendto(SOCKET,const char*,int,int,const struct sockaddr*,int);
-int PASCAL setsockopt(SOCKET,int,int,const char*,int);
-int PASCAL shutdown(SOCKET,int);
-SOCKET PASCAL socket(int,int,int);
-DECLARE_STDCALL_P(struct hostent *) gethostbyaddr(const char*,int,int);
-DECLARE_STDCALL_P(struct hostent *) gethostbyname(const char*);
-DECLARE_STDCALL_P(struct servent *) getservbyport(int,const char*);
-DECLARE_STDCALL_P(struct servent *) getservbyname(const char*,const char*);
-DECLARE_STDCALL_P(struct protoent *) getprotobynumber(int);
-DECLARE_STDCALL_P(struct protoent *) getprotobyname(const char*);
-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.
- */
-BOOL PASCAL WSAIsBlocking(void);
-int PASCAL WSAUnhookBlockingHook(void);
-FARPROC PASCAL WSASetBlockingHook(FARPROC);
-int PASCAL WSACancelBlockingCall(void);
+#define MAX_PROTOCOL_CHAIN 7
-HANDLE PASCAL WSAAsyncGetServByName(HWND,u_int,const char*,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetServByPort(HWND,u_int,int,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetProtoByName(HWND,u_int,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetProtoByNumber(HWND,u_int,int,char*,int);
-HANDLE PASCAL WSAAsyncGetHostByName(HWND,u_int,const char*,char*,int);
-HANDLE PASCAL WSAAsyncGetHostByAddr(HWND,u_int,const char*,int,int,char*,int);
-int PASCAL WSACancelAsyncRequest(HANDLE);
-int PASCAL WSAAsyncSelect(SOCKET,HWND,u_int,LONG);
-#if ! (defined (__INSIDE_CYGWIN__) || defined (__INSIDE_MSYS__))
-u_long PASCAL htonl(u_long);
-u_long PASCAL ntohl(u_long);
-u_short PASCAL htons(u_short);
-u_short PASCAL ntohs(u_short);
-#ifndef _SYS_SELECT_H /* Work around for Linux Compilers */
-#define _SYS_SELECT_H
-int PASCAL select(int nfds,fd_set*,fd_set*,fd_set*,const struct timeval*);
-#endif
-#endif /* ! (__INSIDE_CYGWIN__ || __INSIDE_MSYS__) */
+#define BASE_PROTOCOL 1
+#define LAYERED_PROTOCOL 0
-int PASCAL gethostname(char*,int);
-
-#define WSAMAKEASYNCREPLY(b,e) MAKELONG(b,e)
-#define WSAMAKESELECTREPLY(e,error) MAKELONG(e,error)
-#define WSAGETASYNCBUFLEN(l) LOWORD(l)
-#define WSAGETASYNCERROR(l) HIWORD(l)
-#define WSAGETSELECTEVENT(l) LOWORD(l)
-#define WSAGETSELECTERROR(l) HIWORD(l)
-
-typedef struct sockaddr SOCKADDR;
-typedef struct sockaddr *PSOCKADDR;
-typedef struct sockaddr *LPSOCKADDR;
-typedef struct sockaddr_storage SOCKADDR_STORAGE, *PSOCKADDR_STORAGE;
-typedef struct sockaddr_in SOCKADDR_IN;
-typedef struct sockaddr_in *PSOCKADDR_IN;
-typedef struct sockaddr_in *LPSOCKADDR_IN;
-typedef struct linger LINGER;
-typedef struct linger *PLINGER;
-typedef struct linger *LPLINGER;
-typedef struct in_addr *LPIN_ADDR;
-typedef struct fd_set FD_SET;
-typedef struct fd_set *PFD_SET;
-typedef struct fd_set *LPFD_SET;
-typedef struct hostent HOSTENT;
-typedef struct hostent *PHOSTENT;
-typedef struct hostent *LPHOSTENT;
-typedef struct servent SERVENT;
-typedef struct servent *PSERVENT;
-typedef struct servent *LPSERVENT;
-typedef struct protoent PROTOENT;
-typedef struct protoent *PPROTOENT;
-typedef struct protoent *LPPROTOENT;
-typedef struct timeval TIMEVAL;
-typedef struct timeval *PTIMEVAL;
-typedef struct timeval *LPTIMEVAL;
-
-/* winsock2 additions */
-#define ADDR_ANY INADDR_ANY
-
-#define IN_CLASSD(i) (((LONG)(i) & 0xf0000000) == 0xe0000000)
-#define IN_CLASSD_NET 0xf0000000
-#define IN_CLASSD_NSHIFT 28
-#define IN_CLASSD_HOST 0x0fffffff
-#define IN_MULTICAST(i) IN_CLASSD(i)
-
-#define FROM_PROTOCOL_INFO (-1)
-
-#define SO_DONTLINGER (u_int)(~SO_LINGER)
-#define SO_GROUP_ID 0x2001
-#define SO_GROUP_PRIORITY 0x2002
-#define SO_MAX_MSG_SIZE 0x2003
-#define SO_PROTOCOL_INFOA 0x2004
-#define SO_PROTOCOL_INFOW 0x2005
-#ifdef UNICODE
-#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOW
-#else
-#define SO_PROTOCOL_INFO SO_PROTOCOL_INFOA
-#endif
-#define PVD_CONFIG 0x3001
-
-#define MSG_INTERRUPT 0x10
-#define MSG_MAXIOVLEN 16
-
-#define WSAEVENT HANDLE
-#define LPWSAEVENT LPHANDLE
-#define WSAOVERLAPPED OVERLAPPED
-typedef struct _OVERLAPPED *LPWSAOVERLAPPED;
-
-#define WSA_IO_PENDING (ERROR_IO_PENDING)
-#define WSA_IO_INCOMPLETE (ERROR_IO_INCOMPLETE)
-#define WSA_INVALID_HANDLE (ERROR_INVALID_HANDLE)
-#define WSA_INVALID_PARAMETER (ERROR_INVALID_PARAMETER)
-#define WSA_NOT_ENOUGH_MEMORY (ERROR_NOT_ENOUGH_MEMORY)
-#define WSA_OPERATION_ABORTED (ERROR_OPERATION_ABORTED)
-
-#define WSA_INVALID_EVENT ((WSAEVENT)NULL)
-#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS)
-#define WSA_WAIT_FAILED ((DWORD)-1L)
-#define WSA_WAIT_EVENT_0 (WAIT_OBJECT_0)
-#define WSA_WAIT_IO_COMPLETION (WAIT_IO_COMPLETION)
-#define WSA_WAIT_TIMEOUT (WAIT_TIMEOUT)
-#define WSA_INFINITE (INFINITE)
-
-typedef struct _WSABUF {
- u_long len;
- char *buf;
-} WSABUF, *LPWSABUF;
-
-typedef enum
-{
- BestEffortService,
- ControlledLoadService,
- PredictiveService,
- GuaranteedDelayService,
- GuaranteedService
-} GUARANTEE;
-
-#include
-typedef struct _QualityOfService
-{
- FLOWSPEC SendingFlowspec;
- FLOWSPEC ReceivingFlowspec;
- WSABUF ProviderSpecific;
-} QOS, *LPQOS;
-
-#define CF_ACCEPT 0x0000
-#define CF_REJECT 0x0001
-#define CF_DEFER 0x0002
-#define SD_RECEIVE 0x00
-#define SD_SEND 0x01
-#define SD_BOTH 0x02
-typedef unsigned int GROUP;
-
-#define SG_UNCONSTRAINED_GROUP 0x01
-#define SG_CONSTRAINED_GROUP 0x02
-typedef struct _WSANETWORKEVENTS {
- LONG lNetworkEvents;
- int iErrorCode[FD_MAX_EVENTS];
-} WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
-
-#define MAX_PROTOCOL_CHAIN 7
-
-#define BASE_PROTOCOL 1
-#define LAYERED_PROTOCOL 0
-
-typedef enum _WSAESETSERVICEOP
-{
- RNRSERVICE_REGISTER=0,
- RNRSERVICE_DEREGISTER,
- RNRSERVICE_DELETE
-} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP;
-
-typedef struct _AFPROTOCOLS {
- INT iAddressFamily;
- INT iProtocol;
-} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS;
-
-typedef enum _WSAEcomparator
-{
- COMP_EQUAL = 0,
- COMP_NOTLESS
-} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR;
-
-typedef struct _WSAVersion
-{
- DWORD dwVersion;
- WSAECOMPARATOR ecHow;
-} WSAVERSION, *PWSAVERSION, *LPWSAVERSION;
-
-#ifndef __CSADDR_T_DEFINED /* also in nspapi.h */
-#define __CSADDR_T_DEFINED
-typedef struct _SOCKET_ADDRESS {
- LPSOCKADDR lpSockaddr;
- INT iSockaddrLength;
-} SOCKET_ADDRESS,*PSOCKET_ADDRESS,*LPSOCKET_ADDRESS;
-typedef struct _CSADDR_INFO {
- SOCKET_ADDRESS LocalAddr;
- SOCKET_ADDRESS RemoteAddr;
- INT iSocketType;
- INT iProtocol;
-} CSADDR_INFO,*PCSADDR_INFO,*LPCSADDR_INFO;
-#endif
-
-typedef struct _SOCKET_ADDRESS_LIST {
- INT iAddressCount;
- SOCKET_ADDRESS Address[1];
-} SOCKET_ADDRESS_LIST, * LPSOCKET_ADDRESS_LIST;
-
-#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */
-#define __BLOB_T_DEFINED
-/* wine is using a diff define */
-#ifndef _tagBLOB_DEFINED
-#define _tagBLOB_DEFINED
-#define _BLOB_DEFINED
-#define _LPBLOB_DEFINED
-
-typedef struct _BLOB {
- ULONG cbSize;
- BYTE *pBlobData;
-} BLOB,*PBLOB,*LPBLOB;
-#endif
-#endif
-
-typedef struct _WSAQuerySetA
-{
- DWORD dwSize;
- LPSTR lpszServiceInstanceName;
- LPGUID lpServiceClassId;
- LPWSAVERSION lpVersion;
- LPSTR lpszComment;
- DWORD dwNameSpace;
- LPGUID lpNSProviderId;
- LPSTR lpszContext;
- DWORD dwNumberOfProtocols;
- LPAFPROTOCOLS lpafpProtocols;
- LPSTR lpszQueryString;
- DWORD dwNumberOfCsAddrs;
- LPCSADDR_INFO lpcsaBuffer;
- DWORD dwOutputFlags;
- LPBLOB lpBlob;
-} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
-
-typedef struct _WSAQuerySetW
-{
- DWORD dwSize;
- LPWSTR lpszServiceInstanceName;
- LPGUID lpServiceClassId;
- LPWSAVERSION lpVersion;
- LPWSTR lpszComment;
- DWORD dwNameSpace;
- LPGUID lpNSProviderId;
- LPWSTR lpszContext;
- DWORD dwNumberOfProtocols;
- LPAFPROTOCOLS lpafpProtocols;
- LPWSTR lpszQueryString;
- DWORD dwNumberOfCsAddrs;
- LPCSADDR_INFO lpcsaBuffer;
- DWORD dwOutputFlags;
- LPBLOB lpBlob;
-} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW;
-
-#ifdef UNICODE
-typedef WSAQUERYSETW WSAQUERYSET;
-typedef PWSAQUERYSETW PWSAQUERYSET;
-typedef LPWSAQUERYSETW LPWSAQUERYSET;
-#else
-typedef WSAQUERYSETA WSAQUERYSET;
-typedef PWSAQUERYSETA PWSAQUERYSET;
-typedef LPWSAQUERYSETA LPWSAQUERYSET;
-#endif
-
-typedef struct _WSANSClassInfoA
-{
- LPSTR lpszName;
- DWORD dwNameSpace;
- DWORD dwValueType;
- DWORD dwValueSize;
- LPVOID lpValue;
-} WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA;
-
-typedef struct _WSANSClassInfoW
-{
- LPWSTR lpszName;
- DWORD dwNameSpace;
- DWORD dwValueType;
- DWORD dwValueSize;
- LPVOID lpValue;
-} WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW;
-
-#ifdef UNICODE
-typedef WSANSCLASSINFOW WSANSCLASSINFO;
-typedef PWSANSCLASSINFOW PWSANSCLASSINFO;
-typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO;
-#else
-typedef WSANSCLASSINFOA WSANSCLASSINFO;
-typedef PWSANSCLASSINFOA PWSANSCLASSINFO;
-typedef LPWSANSCLASSINFOA LPWSANSCLASSINFO;
-#endif
-
-typedef struct _WSAServiceClassInfoA
-{
- LPGUID lpServiceClassId;
- LPSTR lpszServiceClassName;
- DWORD dwCount;
- LPWSANSCLASSINFOA lpClassInfos;
-} WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA;
-
-typedef struct _WSAServiceClassInfoW
-{
- LPGUID lpServiceClassId;
- LPWSTR lpszServiceClassName;
- DWORD dwCount;
- LPWSANSCLASSINFOW lpClassInfos;
-} WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW;
-
-#ifdef UNICODE
-typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO;
-typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
-typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
-#else
-typedef WSASERVICECLASSINFOA WSASERVICECLASSINFO;
-typedef PWSASERVICECLASSINFOA PWSASERVICECLASSINFO;
-typedef LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO;
-#endif
-
-typedef struct _WSANAMESPACE_INFOA {
- GUID NSProviderId;
- DWORD dwNameSpace;
- BOOL fActive;
- DWORD dwVersion;
- LPSTR lpszIdentifier;
-} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA;
-
-typedef struct _WSANAMESPACE_INFOW {
- GUID NSProviderId;
- DWORD dwNameSpace;
- BOOL fActive;
- DWORD dwVersion;
- LPWSTR lpszIdentifier;
-} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW;
-
-#ifdef UNICODE
-typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO;
-typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
-typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
-#else
-typedef WSANAMESPACE_INFOA WSANAMESPACE_INFO;
-typedef PWSANAMESPACE_INFOA PWSANAMESPACE_INFO;
-typedef LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO;
-#endif
-
-typedef struct _WSAPROTOCOLCHAIN {
- int ChainLen;
- DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
-} WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN;
-
-#define WSAPROTOCOL_LEN 255
-
-typedef struct _WSAPROTOCOL_INFOA {
- DWORD dwServiceFlags1;
- DWORD dwServiceFlags2;
- DWORD dwServiceFlags3;
- DWORD dwServiceFlags4;
- DWORD dwProviderFlags;
- GUID ProviderId;
- DWORD dwCatalogEntryId;
- WSAPROTOCOLCHAIN ProtocolChain;
- int iVersion;
- int iAddressFamily;
- int iMaxSockAddr;
- int iMinSockAddr;
- int iSocketType;
- int iProtocol;
- int iProtocolMaxOffset;
- int iNetworkByteOrder;
- int iSecurityScheme;
- DWORD dwMessageSize;
- DWORD dwProviderReserved;
- CHAR szProtocol[WSAPROTOCOL_LEN+1];
-} WSAPROTOCOL_INFOA, *LPWSAPROTOCOL_INFOA;
-
-typedef struct _WSAPROTOCOL_INFOW {
- DWORD dwServiceFlags1;
- DWORD dwServiceFlags2;
- DWORD dwServiceFlags3;
- DWORD dwServiceFlags4;
- DWORD dwProviderFlags;
- GUID ProviderId;
- DWORD dwCatalogEntryId;
- WSAPROTOCOLCHAIN ProtocolChain;
- int iVersion;
- int iAddressFamily;
- int iMaxSockAddr;
- int iMinSockAddr;
- int iSocketType;
- int iProtocol;
- int iProtocolMaxOffset;
- int iNetworkByteOrder;
- int iSecurityScheme;
- DWORD dwMessageSize;
- DWORD dwProviderReserved;
- WCHAR szProtocol[WSAPROTOCOL_LEN+1];
-} WSAPROTOCOL_INFOW, * LPWSAPROTOCOL_INFOW;
-
-typedef int (CALLBACK *LPCONDITIONPROC)(LPWSABUF, LPWSABUF, LPQOS, LPQOS, LPWSABUF, LPWSABUF, GROUP *, DWORD);
-typedef void (WINAPI *LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD, DWORD, LPWSAOVERLAPPED, DWORD);
-
-
-#ifdef UNICODE
-typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
-typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
-#else
-typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO;
-typedef LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO;
-#endif
-
-/* Needed for XP & .NET Server function WSANSPIoctl. */
-typedef enum _WSACOMPLETIONTYPE {
- NSP_NOTIFY_IMMEDIATELY = 0,
- NSP_NOTIFY_HWND,
- NSP_NOTIFY_EVENT,
- NSP_NOTIFY_PORT,
- NSP_NOTIFY_APC
-} WSACOMPLETIONTYPE, * PWSACOMPLETIONTYPE, * LPWSACOMPLETIONTYPE;
-typedef struct _WSACOMPLETION {
- WSACOMPLETIONTYPE Type;
- union {
- struct {
- HWND hWnd;
- UINT uMsg;
- WPARAM context;
- } WindowMessage;
- struct {
- LPWSAOVERLAPPED lpOverlapped;
- } Event;
- struct {
- LPWSAOVERLAPPED lpOverlapped;
- LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
- } Apc;
- struct {
- LPWSAOVERLAPPED lpOverlapped;
- HANDLE hPort;
- ULONG_PTR Key;
- } Port;
- } Parameters;
-} WSACOMPLETION, *PWSACOMPLETION, *LPWSACOMPLETION;
+#define WSAPROTOCOL_LEN 255
#define PFL_MULTIPLE_PROTO_ENTRIES 0x00000001
#define PFL_RECOMMENDED_PROTO_ENTRY 0x00000002
#define PFL_HIDDEN 0x00000004
#define PFL_MATCHES_PROTOCOL_ZERO 0x00000008
+#define PFL_NETWORKDIRECT_PROVIDER 0x00000010
+
#define XP1_CONNECTIONLESS 0x00000001
#define XP1_GUARANTEED_DELIVERY 0x00000002
#define XP1_GUARANTEED_ORDER 0x00000004
@@ -1068,210 +452,2278 @@ typedef struct _WSACOMPLETION {
#define XP1_UNI_RECV 0x00010000
#define XP1_IFS_HANDLES 0x00020000
#define XP1_PARTIAL_MESSAGE 0x00040000
+#define XP1_SAN_SUPPORT_SDP 0x00080000
#define BIGENDIAN 0x0000
#define LITTLEENDIAN 0x0001
#define SECURITY_PROTOCOL_NONE 0x0000
-#define JL_SENDER_ONLY 0x01
-#define JL_RECEIVER_ONLY 0x02
-#define JL_BOTH 0x04
-#define WSA_FLAG_OVERLAPPED 0x01
-#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02
-#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04
-#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08
-#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10
-#define IOC_UNIX 0x00000000
-#define IOC_WS2 0x08000000
-#define IOC_PROTOCOL 0x10000000
-#define IOC_VENDOR 0x18000000
-#define _WSAIO(x,y) (IOC_VOID|(x)|(y))
-#define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
-#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
-#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y))
+#define JL_SENDER_ONLY 0x01
+#define JL_RECEIVER_ONLY 0x02
+#define JL_BOTH 0x04
-#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1)
-#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2)
-#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3)
-#define SIO_FLUSH _WSAIO(IOC_WS2,4)
-#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5)
-#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6)
-#define SIO_GET_QOS _WSAIORW(IOC_WS2,7)
-#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8)
-#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9)
-#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10)
-#define SIO_SET_QOS _WSAIOW(IOC_WS2,11)
-#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12)
-#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13)
-#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20)
-#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21)
-#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22)
-#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23)
-#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24)
-#define SIO_NSP_NOTIFY_CHANGE _WSAIOW(IOC_WS2,25)
+#define WSA_FLAG_OVERLAPPED 0x01
+#define WSA_FLAG_MULTIPOINT_C_ROOT 0x02
+#define WSA_FLAG_MULTIPOINT_C_LEAF 0x04
+#define WSA_FLAG_MULTIPOINT_D_ROOT 0x08
+#define WSA_FLAG_MULTIPOINT_D_LEAF 0x10
+#define WSA_FLAG_ACCESS_SYSTEM_SECURITY 0x40
-#define TH_NETDEV 0x00000001
-#define TH_TAPI 0x00000002
+#define TH_NETDEV 0x00000001
+#define TH_TAPI 0x00000002
-SOCKET WINAPI WSAAccept(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD);
-INT WINAPI WSAAddressToStringA(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
-INT WINAPI WSAAddressToStringW(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD);
-BOOL WINAPI WSACloseEvent(WSAEVENT);
-int WINAPI WSAConnect(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS);
-WSAEVENT WINAPI WSACreateEvent(void);
-int WINAPI WSADuplicateSocketA(SOCKET, DWORD, LPWSAPROTOCOL_INFOA);
-int WINAPI WSADuplicateSocketW(SOCKET, DWORD, LPWSAPROTOCOL_INFOW);
-INT WINAPI WSAEnumNameSpaceProvidersA(LPDWORD, LPWSANAMESPACE_INFOA);
-INT WINAPI WSAEnumNameSpaceProvidersW(LPDWORD, LPWSANAMESPACE_INFOW);
-int WINAPI WSAEnumNetworkEvents(SOCKET, WSAEVENT, LPWSANETWORKEVENTS);
-int WINAPI WSAEnumProtocolsA(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD);
-int WINAPI WSAEnumProtocolsW(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD);
-int WINAPI WSAEventSelect(SOCKET, WSAEVENT, LONG);
-BOOL WINAPI WSAGetOverlappedResult(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD);
-BOOL WINAPI WSAGetQOSByName(SOCKET, LPWSABUF, LPQOS);
-INT WINAPI WSAGetServiceClassInfoA(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA);
-INT WINAPI WSAGetServiceClassInfoW(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW);
-INT WINAPI WSAGetServiceClassNameByClassIdA(LPGUID, LPSTR, LPDWORD);
-INT WINAPI WSAGetServiceClassNameByClassIdW(LPGUID, LPWSTR, LPDWORD);
-int WINAPI WSAHtonl(SOCKET, u_long, u_long *);
-int WINAPI WSAHtons(SOCKET, unsigned short, unsigned short *);
-INT WINAPI WSAInstallServiceClassA(LPWSASERVICECLASSINFOA);
-INT WINAPI WSAInstallServiceClassW(LPWSASERVICECLASSINFOW);
-int WINAPI WSAIoctl(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-SOCKET WINAPI WSAJoinLeaf(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD);
-INT WINAPI WSALookupServiceBeginA(LPWSAQUERYSETA, DWORD, LPHANDLE);
-INT WINAPI WSALookupServiceBeginW(LPWSAQUERYSETW lpqsRestrictions, DWORD, LPHANDLE);
-INT WINAPI WSALookupServiceNextA(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA);
-INT WINAPI WSALookupServiceNextW(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW);
-INT WINAPI WSALookupServiceEnd(HANDLE);
-int WINAPI WSANSPIoctl(HANDLE,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION); /* XP or .NET Server */
-int WINAPI WSANtohl(SOCKET, u_long, u_long *);
-int WINAPI WSANtohs(SOCKET, unsigned short, unsigned short *);
-int WINAPI WSARecv(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-int WINAPI WSARecvDisconnect(SOCKET, LPWSABUF);
-int WINAPI WSARecvFrom(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-INT WINAPI WSARemoveServiceClass(LPGUID);
-BOOL WINAPI WSAResetEvent(WSAEVENT);
-int WINAPI WSASend(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-int WINAPI WSASendDisconnect(SOCKET, LPWSABUF);
-int WINAPI WSASendTo(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-BOOL WINAPI WSASetEvent(WSAEVENT);
-INT WSAAPI WSASetServiceA(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD);
-INT WINAPI WSASetServiceW(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD);
-SOCKET WINAPI WSASocketA(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
-SOCKET WINAPI WSASocketW(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD);
-INT WINAPI WSAStringToAddressA(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT);
-INT WINAPI WSAStringToAddressW(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT);
-DWORD WINAPI WSAWaitForMultipleEvents(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL);
-typedef SOCKET (WINAPI *LPFN_WSAACCEPT)(SOCKET, struct sockaddr *, LPINT, LPCONDITIONPROC, DWORD);
-typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGA)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOA, LPSTR, LPDWORD);
-typedef INT (WINAPI *LPFN_WSAADDRESSTOSTRINGW)(LPSOCKADDR, DWORD, LPWSAPROTOCOL_INFOW, LPWSTR, LPDWORD);
-typedef BOOL (WINAPI *LPFN_WSACLOSEEVENT)(WSAEVENT);
-typedef int (WINAPI *LPFN_WSACONNECT)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS);
-typedef WSAEVENT (WINAPI *LPFN_WSACREATEEVENT)(void);
-typedef int (WINAPI *LPFN_WSADUPLICATESOCKETA)(SOCKET, DWORD, LPWSAPROTOCOL_INFOA);
-typedef int (WINAPI *LPFN_WSADUPLICATESOCKETW)(SOCKET, DWORD, LPWSAPROTOCOL_INFOW);
-typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSA)(LPDWORD, LPWSANAMESPACE_INFOA);
-typedef INT (WINAPI *LPFN_WSAENUMNAMESPACEPROVIDERSW)(LPDWORD, LPWSANAMESPACE_INFOW);
-typedef int (WINAPI *LPFN_WSAENUMNETWORKEVENTS)(SOCKET, WSAEVENT, LPWSANETWORKEVENTS);
-typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSA)(LPINT, LPWSAPROTOCOL_INFOA, LPDWORD);
-typedef int (WINAPI *LPFN_WSAENUMPROTOCOLSW)(LPINT, LPWSAPROTOCOL_INFOW, LPDWORD);
-typedef int (WINAPI *LPFN_WSAEVENTSELECT)(SOCKET, WSAEVENT, LONG);
-typedef BOOL (WINAPI *LPFN_WSAGETOVERLAPPEDRESULT)(SOCKET, LPWSAOVERLAPPED, LPDWORD, BOOL, LPDWORD);
-typedef BOOL (WINAPI *LPFN_WSAGETQOSBYNAME)(SOCKET, LPWSABUF, LPQOS);
-typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOA)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOA);
-typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSINFOW)(LPGUID, LPGUID, LPDWORD, LPWSASERVICECLASSINFOW);
-typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA)(LPGUID, LPSTR, LPDWORD);
-typedef INT (WINAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW)(LPGUID, LPWSTR, LPDWORD);
-typedef int (WINAPI *LPFN_WSAHTONL)(SOCKET, u_long, u_long *);
-typedef int (WINAPI *LPFN_WSAHTONS)(SOCKET, unsigned short, unsigned short *);
-typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSA)(LPWSASERVICECLASSINFOA);
-typedef INT (WINAPI *LPFN_WSAINSTALLSERVICECLASSW)(LPWSASERVICECLASSINFOW);
-typedef int (WINAPI *LPFN_WSAIOCTL)(SOCKET, DWORD, LPVOID, DWORD, LPVOID, DWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-typedef SOCKET (WINAPI *LPFN_WSAJOINLEAF)(SOCKET, const struct sockaddr *, int, LPWSABUF, LPWSABUF, LPQOS, LPQOS, DWORD);
-typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINA)(LPWSAQUERYSETA, DWORD, LPHANDLE);
-typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEBEGINW)(LPWSAQUERYSETW, DWORD, LPHANDLE);
-typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTA)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETA);
-typedef INT (WINAPI *LPFN_WSALOOKUPSERVICENEXTW)(HANDLE, DWORD, LPDWORD, LPWSAQUERYSETW);
-typedef INT (WINAPI *LPFN_WSALOOKUPSERVICEEND)(HANDLE);
-typedef int (WINAPI *LPFN_WSANSPIoctl)(HANDLE, DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,LPWSACOMPLETION);
-typedef int (WINAPI *LPFN_WSANTOHL)(SOCKET, u_long, u_long *);
-typedef int (WINAPI *LPFN_WSANTOHS)(SOCKET, unsigned short, unsigned short *);
-typedef int (WINAPI *LPFN_WSARECV)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-typedef int (WINAPI *LPFN_WSARECVDISCONNECT)(SOCKET, LPWSABUF);
-typedef int (WINAPI *LPFN_WSARECVFROM)(SOCKET, LPWSABUF, DWORD, LPDWORD, LPDWORD, struct sockaddr *, LPINT, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-typedef INT (WINAPI *LPFN_WSAREMOVESERVICECLASS)(LPGUID);
-typedef BOOL (WINAPI *LPFN_WSARESETEVENT)(WSAEVENT);
-typedef int (WINAPI *LPFN_WSASEND)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-typedef int (WINAPI *LPFN_WSASENDDISCONNECT)(SOCKET, LPWSABUF);
-typedef int (WINAPI *LPFN_WSASENDTO)(SOCKET, LPWSABUF, DWORD, LPDWORD, DWORD, const struct sockaddr *, int, LPWSAOVERLAPPED, LPWSAOVERLAPPED_COMPLETION_ROUTINE);
-typedef BOOL (WINAPI *LPFN_WSASETEVENT)(WSAEVENT);
-typedef INT (WINAPI *LPFN_WSASETSERVICEA)(LPWSAQUERYSETA, WSAESETSERVICEOP, DWORD);
-typedef INT (WINAPI *LPFN_WSASETSERVICEW)(LPWSAQUERYSETW, WSAESETSERVICEOP, DWORD);
-typedef SOCKET (WINAPI *LPFN_WSASOCKETA)(int, int, int, LPWSAPROTOCOL_INFOA, GROUP, DWORD);
-typedef SOCKET (WINAPI *LPFN_WSASOCKETW)(int, int, int, LPWSAPROTOCOL_INFOW, GROUP, DWORD);
-typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSA)(LPSTR, INT, LPWSAPROTOCOL_INFOA, LPSOCKADDR, LPINT);
-typedef INT (WINAPI *LPFN_WSASTRINGTOADDRESSW)(LPWSTR, INT, LPWSAPROTOCOL_INFOW, LPSOCKADDR, LPINT);
-typedef DWORD (WINAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(DWORD, const WSAEVENT *, BOOL, DWORD, BOOL);
+#define SERVICE_MULTIPLE 0x00000001
+
+#define RES_UNUSED_1 0x00000001
+#define RES_FLUSH_CACHE 0x00000002
+#ifndef RES_SERVICE
+#define RES_SERVICE 0x00000004
+#endif
+
+#define SERVICE_TYPE_VALUE_IPXPORTA "IpxSocket"
+#define SERVICE_TYPE_VALUE_IPXPORTW L"IpxSocket"
+#define SERVICE_TYPE_VALUE_SAPIDA "SapId"
+#define SERVICE_TYPE_VALUE_SAPIDW L"SapId"
+
+#define SERVICE_TYPE_VALUE_TCPPORTA "TcpPort"
+#define SERVICE_TYPE_VALUE_TCPPORTW L"TcpPort"
+
+#define SERVICE_TYPE_VALUE_UDPPORTA "UdpPort"
+#define SERVICE_TYPE_VALUE_UDPPORTW L"UdpPort"
+
+#define SERVICE_TYPE_VALUE_OBJECTIDA "ObjectId"
+#define SERVICE_TYPE_VALUE_OBJECTIDW L"ObjectId"
+
+#ifdef UNICODE
+#define SERVICE_TYPE_VALUE_SAPID SERVICE_TYPE_VALUE_SAPIDW
+#define SERVICE_TYPE_VALUE_TCPPORT SERVICE_TYPE_VALUE_TCPPORTW
+#define SERVICE_TYPE_VALUE_UDPPORT SERVICE_TYPE_VALUE_UDPPORTW
+#define SERVICE_TYPE_VALUE_OBJECTID SERVICE_TYPE_VALUE_OBJECTIDW
+#else
+#define SERVICE_TYPE_VALUE_SAPID SERVICE_TYPE_VALUE_SAPIDA
+#define SERVICE_TYPE_VALUE_TCPPORT SERVICE_TYPE_VALUE_TCPPORTA
+#define SERVICE_TYPE_VALUE_UDPPORT SERVICE_TYPE_VALUE_UDPPORTA
+#define SERVICE_TYPE_VALUE_OBJECTID SERVICE_TYPE_VALUE_OBJECTIDA
+#endif
+
+#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 LUP_NON_AUTHORITATIVE 0x4000
+#define LUP_SECURE 0x8000
+#define LUP_RETURN_PREFERRED_NAMES 0x10000
+#define LUP_ADDRCONFIG 0x00100000
+#define LUP_DUAL_ADDR 0x00200000
+#define LUP_FILESERVER 0x00400000
+
+#define RESULT_IS_ALIAS 0x0001
+#if(_WIN32_WINNT >= 0x0501)
+#define RESULT_IS_ADDED 0x0010
+#define RESULT_IS_CHANGED 0x0020
+#define RESULT_IS_DELETED 0x0040
+#endif
+
+#ifndef s_addr
+
+#define s_addr S_un.S_addr
+#define s_host S_un.S_un_b.s_b2
+#define s_net S_un.S_un_b.s_b1
+#define s_imp S_un.S_un_w.s_w2
+#define s_impno S_un.S_un_b.s_b4
+#define s_lh S_un.S_un_b.s_b3
+
+typedef struct in_addr {
+ union {
+ struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
+ struct { u_short s_w1,s_w2; } S_un_w;
+ u_long S_addr;
+ } S_un;
+} IN_ADDR, *PIN_ADDR;
+
+#endif /* s_addr */
+
+typedef struct WSAData {
+ WORD wVersion;
+ WORD wHighVersion;
+#ifdef _WIN64
+ unsigned short iMaxSockets;
+ unsigned short iMaxUdpDg;
+ char FAR *lpVendorInfo;
+ char szDescription[WSADESCRIPTION_LEN+1];
+ char szSystemStatus[WSASYS_STATUS_LEN+1];
+#else
+ char szDescription[WSADESCRIPTION_LEN+1];
+ char szSystemStatus[WSASYS_STATUS_LEN+1];
+ unsigned short iMaxSockets;
+ unsigned short iMaxUdpDg;
+ char FAR *lpVendorInfo;
+#endif
+} WSADATA, FAR *LPWSADATA;
+
+struct sockproto {
+ u_short sp_family;
+ u_short sp_protocol;
+};
+
+#ifdef WIN32
+
+#define WSAAPI FAR PASCAL
+#define WSAEVENT HANDLE
+#define LPWSAEVENT LPHANDLE
+#define WSAOVERLAPPED OVERLAPPED
+typedef struct _OVERLAPPED *LPWSAOVERLAPPED;
+#define WSA_IO_PENDING (ERROR_IO_PENDING)
+#define WSA_IO_INCOMPLETE (ERROR_IO_INCOMPLETE)
+#define WSA_INVALID_HANDLE (ERROR_INVALID_HANDLE)
+#define WSA_INVALID_PARAMETER (ERROR_INVALID_PARAMETER)
+#define WSA_NOT_ENOUGH_MEMORY (ERROR_NOT_ENOUGH_MEMORY)
+#define WSA_OPERATION_ABORTED (ERROR_OPERATION_ABORTED)
+#define WSA_INVALID_EVENT ((WSAEVENT)NULL)
+#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS)
+#define WSA_WAIT_FAILED ((DWORD)-1L)
+#define WSA_WAIT_EVENT_0 (WAIT_OBJECT_0)
+#define WSA_WAIT_IO_COMPLETION (WAIT_IO_COMPLETION)
+#define WSA_WAIT_TIMEOUT (WAIT_TIMEOUT)
+#define WSA_INFINITE (INFINITE)
+
+#else /* WIN16 */
+
+#define WSAAPI FAR PASCAL
+typedef DWORD WSAEVENT, FAR * LPWSAEVENT;
+
+typedef struct _WSAOVERLAPPED {
+ DWORD Internal;
+ DWORD InternalHigh;
+ DWORD Offset;
+ DWORD OffsetHigh;
+ WSAEVENT hEvent;
+} WSAOVERLAPPED, FAR * LPWSAOVERLAPPED;
+
+#define WSA_IO_PENDING (WSAEWOULDBLOCK)
+#define WSA_IO_INCOMPLETE (WSAEWOULDBLOCK)
+#define WSA_INVALID_HANDLE (WSAENOTSOCK)
+#define WSA_INVALID_PARAMETER (WSAEINVAL)
+#define WSA_NOT_ENOUGH_MEMORY (WSAENOBUFS)
+#define WSA_OPERATION_ABORTED (WSAEINTR)
+
+#define WSA_INVALID_EVENT ((WSAEVENT)NULL)
+#define WSA_MAXIMUM_WAIT_EVENTS (MAXIMUM_WAIT_OBJECTS)
+#define WSA_WAIT_FAILED ((DWORD)-1L)
+#define WSA_WAIT_EVENT_0 ((DWORD)0)
+#define WSA_WAIT_TIMEOUT ((DWORD)0x102L)
+#define WSA_INFINITE ((DWORD)-1L)
+
+#endif /* WIN32 */
+
+#include
+
+typedef struct _QualityOfService {
+ FLOWSPEC SendingFlowspec;
+ FLOWSPEC ReceivingFlowspec;
+ WSABUF ProviderSpecific;
+} QOS, *LPQOS;
+
+typedef unsigned int GROUP;
+
+typedef struct _WSANETWORKEVENTS {
+ LONG lNetworkEvents;
+ int iErrorCode[FD_MAX_EVENTS];
+} WSANETWORKEVENTS, *LPWSANETWORKEVENTS;
+
+#ifndef GUID_DEFINED
+#include
+#endif
+
+typedef struct _WSAPROTOCOLCHAIN {
+ int ChainLen;
+ DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
+} WSAPROTOCOLCHAIN, *LPWSAPROTOCOLCHAIN;
+
+typedef struct _WSAPROTOCOL_INFOA {
+ DWORD dwServiceFlags1;
+ DWORD dwServiceFlags2;
+ DWORD dwServiceFlags3;
+ DWORD dwServiceFlags4;
+ DWORD dwProviderFlags;
+ GUID ProviderId;
+ DWORD dwCatalogEntryId;
+ WSAPROTOCOLCHAIN ProtocolChain;
+ int iVersion;
+ int iAddressFamily;
+ int iMaxSockAddr;
+ int iMinSockAddr;
+ int iSocketType;
+ int iProtocol;
+ int iProtocolMaxOffset;
+ int iNetworkByteOrder;
+ int iSecurityScheme;
+ DWORD dwMessageSize;
+ DWORD dwProviderReserved;
+ CHAR szProtocol[WSAPROTOCOL_LEN+1];
+} WSAPROTOCOL_INFOA, *LPWSAPROTOCOL_INFOA;
+
+typedef struct _WSAPROTOCOL_INFOW {
+ DWORD dwServiceFlags1;
+ DWORD dwServiceFlags2;
+ DWORD dwServiceFlags3;
+ DWORD dwServiceFlags4;
+ DWORD dwProviderFlags;
+ GUID ProviderId;
+ DWORD dwCatalogEntryId;
+ WSAPROTOCOLCHAIN ProtocolChain;
+ int iVersion;
+ int iAddressFamily;
+ int iMaxSockAddr;
+ int iMinSockAddr;
+ int iSocketType;
+ int iProtocol;
+ int iProtocolMaxOffset;
+ int iNetworkByteOrder;
+ int iSecurityScheme;
+ DWORD dwMessageSize;
+ DWORD dwProviderReserved;
+ WCHAR szProtocol[WSAPROTOCOL_LEN+1];
+} WSAPROTOCOL_INFOW, * LPWSAPROTOCOL_INFOW;
+
+#ifdef UNICODE
+typedef WSAPROTOCOL_INFOW WSAPROTOCOL_INFO;
+typedef LPWSAPROTOCOL_INFOW LPWSAPROTOCOL_INFO;
+#else
+typedef WSAPROTOCOL_INFOA WSAPROTOCOL_INFO;
+typedef LPWSAPROTOCOL_INFOA LPWSAPROTOCOL_INFO;
+#endif
+
+typedef int
+(CALLBACK *LPCONDITIONPROC)(
+ IN LPWSABUF lpCallerId,
+ IN LPWSABUF lpCallerData,
+ IN OUT LPQOS lpSQOS,
+ IN OUT LPQOS lpGQOS,
+ IN LPWSABUF lpCalleeId,
+ IN LPWSABUF lpCalleeData,
+ OUT GROUP FAR *g,
+ IN DWORD_PTR dwCallbackData);
+
+typedef void
+(CALLBACK *LPWSAOVERLAPPED_COMPLETION_ROUTINE)(
+ IN DWORD dwError,
+ IN DWORD cbTransferred,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ IN DWORD dwFlags);
+
+#if(_WIN32_WINNT >= 0x0501)
+
+#define SIO_NSP_NOTIFY_CHANGE _WSAIOW(IOC_WS2,25)
+
+typedef enum _WSACOMPLETIONTYPE {
+ NSP_NOTIFY_IMMEDIATELY = 0,
+ NSP_NOTIFY_HWND,
+ NSP_NOTIFY_EVENT,
+ NSP_NOTIFY_PORT,
+ NSP_NOTIFY_APC
+} WSACOMPLETIONTYPE, * PWSACOMPLETIONTYPE, *LPWSACOMPLETIONTYPE;
+
+typedef struct _WSACOMPLETION {
+ WSACOMPLETIONTYPE Type;
+ union {
+ struct {
+ HWND hWnd;
+ UINT uMsg;
+ WPARAM context;
+ } WindowMessage;
+ struct {
+ LPWSAOVERLAPPED lpOverlapped;
+ } Event;
+ struct {
+ LPWSAOVERLAPPED lpOverlapped;
+ LPWSAOVERLAPPED_COMPLETION_ROUTINE lpfnCompletionProc;
+ } Apc;
+ struct {
+ LPWSAOVERLAPPED lpOverlapped;
+ HANDLE hPort;
+ ULONG_PTR Key;
+ } Port;
+ } Parameters;
+} WSACOMPLETION, *PWSACOMPLETION, *LPWSACOMPLETION;
+
+#endif /* (_WIN32_WINNT >= 0x0501) */
+
+#ifndef __BLOB_T_DEFINED /* also in wtypes.h and nspapi.h */
+#define __BLOB_T_DEFINED
+/* wine is using a diff define */
+#ifndef _tagBLOB_DEFINED
+#define _tagBLOB_DEFINED
+#define _BLOB_DEFINED
+#define _LPBLOB_DEFINED
+
+typedef struct _BLOB {
+ ULONG cbSize;
+ BYTE *pBlobData;
+} BLOB,*PBLOB,*LPBLOB;
+
+#endif /* _tagBLOB_DEFINED */
+
+#endif /* __BLOB_T_DEFINED */
+
+typedef struct _AFPROTOCOLS {
+ INT iAddressFamily;
+ INT iProtocol;
+} AFPROTOCOLS, *PAFPROTOCOLS, *LPAFPROTOCOLS;
+
+typedef enum _WSAEcomparator {
+ COMP_EQUAL = 0,
+ COMP_NOTLESS
+} WSAECOMPARATOR, *PWSAECOMPARATOR, *LPWSAECOMPARATOR;
+
+typedef struct _WSAVersion {
+ DWORD dwVersion;
+ WSAECOMPARATOR ecHow;
+} WSAVERSION, *PWSAVERSION, *LPWSAVERSION;
+
+typedef struct _WSAQuerySetA {
+ DWORD dwSize;
+ LPSTR lpszServiceInstanceName;
+ LPGUID lpServiceClassId;
+ LPWSAVERSION lpVersion;
+ LPSTR lpszComment;
+ DWORD dwNameSpace;
+ LPGUID lpNSProviderId;
+ LPSTR lpszContext;
+ DWORD dwNumberOfProtocols;
+ LPAFPROTOCOLS lpafpProtocols;
+ LPSTR lpszQueryString;
+ DWORD dwNumberOfCsAddrs;
+ LPCSADDR_INFO lpcsaBuffer;
+ DWORD dwOutputFlags;
+ LPBLOB lpBlob;
+} WSAQUERYSETA, *PWSAQUERYSETA, *LPWSAQUERYSETA;
+
+typedef struct _WSAQuerySetW {
+ DWORD dwSize;
+ LPWSTR lpszServiceInstanceName;
+ LPGUID lpServiceClassId;
+ LPWSAVERSION lpVersion;
+ LPWSTR lpszComment;
+ DWORD dwNameSpace;
+ LPGUID lpNSProviderId;
+ LPWSTR lpszContext;
+ DWORD dwNumberOfProtocols;
+ LPAFPROTOCOLS lpafpProtocols;
+ LPWSTR lpszQueryString;
+ DWORD dwNumberOfCsAddrs;
+ LPCSADDR_INFO lpcsaBuffer;
+ DWORD dwOutputFlags;
+ LPBLOB lpBlob;
+} WSAQUERYSETW, *PWSAQUERYSETW, *LPWSAQUERYSETW;
+
+typedef struct _WSAQuerySet2A {
+ DWORD dwSize;
+ LPSTR lpszServiceInstanceName;
+ LPWSAVERSION lpVersion;
+ LPSTR lpszComment;
+ DWORD dwNameSpace;
+ LPGUID lpNSProviderId;
+ LPSTR lpszContext;
+ DWORD dwNumberOfProtocols;
+ LPAFPROTOCOLS lpafpProtocols;
+ LPSTR lpszQueryString;
+ DWORD dwNumberOfCsAddrs;
+ LPCSADDR_INFO lpcsaBuffer;
+ DWORD dwOutputFlags;
+ LPBLOB lpBlob;
+} WSAQUERYSET2A, *PWSAQUERYSET2A, *LPWSAQUERYSET2A;
+
+typedef struct _WSAQuerySet2W {
+ DWORD dwSize;
+ LPWSTR lpszServiceInstanceName;
+ LPWSAVERSION lpVersion;
+ LPWSTR lpszComment;
+ DWORD dwNameSpace;
+ LPGUID lpNSProviderId;
+ LPWSTR lpszContext;
+ DWORD dwNumberOfProtocols;
+ LPAFPROTOCOLS lpafpProtocols;
+ LPWSTR lpszQueryString;
+ DWORD dwNumberOfCsAddrs;
+ LPCSADDR_INFO lpcsaBuffer;
+ DWORD dwOutputFlags;
+ LPBLOB lpBlob;
+} WSAQUERYSET2W, *PWSAQUERYSET2W, *LPWSAQUERYSET2W;
+
+#ifdef UNICODE
+typedef WSAQUERYSETW WSAQUERYSET;
+typedef PWSAQUERYSETW PWSAQUERYSET;
+typedef LPWSAQUERYSETW LPWSAQUERYSET;
+typedef WSAQUERYSET2W WSAQUERYSET2;
+typedef PWSAQUERYSET2W PWSAQUERYSET2;
+typedef LPWSAQUERYSET2W LPWSAQUERYSET2;
+#else
+typedef WSAQUERYSETA WSAQUERYSET;
+typedef PWSAQUERYSETA PWSAQUERYSET;
+typedef LPWSAQUERYSETA LPWSAQUERYSET;
+typedef WSAQUERYSET2A WSAQUERYSET2;
+typedef PWSAQUERYSET2A PWSAQUERYSET2;
+typedef LPWSAQUERYSET2A LPWSAQUERYSET2;
+#endif /* UNICODE */
+
+typedef enum _WSAESETSERVICEOP {
+ RNRSERVICE_REGISTER=0,
+ RNRSERVICE_DEREGISTER,
+ RNRSERVICE_DELETE
+} WSAESETSERVICEOP, *PWSAESETSERVICEOP, *LPWSAESETSERVICEOP;
+
+typedef struct _WSANSClassInfoA {
+ LPSTR lpszName;
+ DWORD dwNameSpace;
+ DWORD dwValueType;
+ DWORD dwValueSize;
+ LPVOID lpValue;
+} WSANSCLASSINFOA, *PWSANSCLASSINFOA, *LPWSANSCLASSINFOA;
+
+typedef struct _WSANSClassInfoW {
+ LPWSTR lpszName;
+ DWORD dwNameSpace;
+ DWORD dwValueType;
+ DWORD dwValueSize;
+ LPVOID lpValue;
+} WSANSCLASSINFOW, *PWSANSCLASSINFOW, *LPWSANSCLASSINFOW;
+
+#ifdef UNICODE
+typedef WSANSCLASSINFOW WSANSCLASSINFO;
+typedef PWSANSCLASSINFOW PWSANSCLASSINFO;
+typedef LPWSANSCLASSINFOW LPWSANSCLASSINFO;
+#else
+typedef WSANSCLASSINFOA WSANSCLASSINFO;
+typedef PWSANSCLASSINFOA PWSANSCLASSINFO;
+typedef LPWSANSCLASSINFOA LPWSANSCLASSINFO;
+#endif
+
+typedef struct _WSAServiceClassInfoA {
+ LPGUID lpServiceClassId;
+ LPSTR lpszServiceClassName;
+ DWORD dwCount;
+ LPWSANSCLASSINFOA lpClassInfos;
+} WSASERVICECLASSINFOA, *PWSASERVICECLASSINFOA, *LPWSASERVICECLASSINFOA;
+
+typedef struct _WSAServiceClassInfoW {
+ LPGUID lpServiceClassId;
+ LPWSTR lpszServiceClassName;
+ DWORD dwCount;
+ LPWSANSCLASSINFOW lpClassInfos;
+} WSASERVICECLASSINFOW, *PWSASERVICECLASSINFOW, *LPWSASERVICECLASSINFOW;
+
+#ifdef UNICODE
+typedef WSASERVICECLASSINFOW WSASERVICECLASSINFO;
+typedef PWSASERVICECLASSINFOW PWSASERVICECLASSINFO;
+typedef LPWSASERVICECLASSINFOW LPWSASERVICECLASSINFO;
+#else
+typedef WSASERVICECLASSINFOA WSASERVICECLASSINFO;
+typedef PWSASERVICECLASSINFOA PWSASERVICECLASSINFO;
+typedef LPWSASERVICECLASSINFOA LPWSASERVICECLASSINFO;
+#endif
+
+typedef struct _WSANAMESPACE_INFOA {
+ GUID NSProviderId;
+ DWORD dwNameSpace;
+ BOOL fActive;
+ DWORD dwVersion;
+ LPSTR lpszIdentifier;
+} WSANAMESPACE_INFOA, *PWSANAMESPACE_INFOA, *LPWSANAMESPACE_INFOA;
+
+typedef struct _WSANAMESPACE_INFOW {
+ GUID NSProviderId;
+ DWORD dwNameSpace;
+ BOOL fActive;
+ DWORD dwVersion;
+ LPWSTR lpszIdentifier;
+} WSANAMESPACE_INFOW, *PWSANAMESPACE_INFOW, *LPWSANAMESPACE_INFOW;
+
+typedef struct _WSANAMESPACE_INFOEXA {
+ GUID NSProviderId;
+ DWORD dwNameSpace;
+ BOOL fActive;
+ DWORD dwVersion;
+ LPSTR lpszIdentifier;
+ BLOB ProviderSpecific;
+} WSANAMESPACE_INFOEXA, *PWSANAMESPACE_INFOEXA, *LPWSANAMESPACE_INFOEXA;
+
+typedef struct _WSANAMESPACE_INFOEXW {
+ GUID NSProviderId;
+ DWORD dwNameSpace;
+ BOOL fActive;
+ DWORD dwVersion;
+ LPWSTR lpszIdentifier;
+ BLOB ProviderSpecific;
+} WSANAMESPACE_INFOEXW, *PWSANAMESPACE_INFOEXW, *LPWSANAMESPACE_INFOEXW;
+
+#ifdef UNICODE
+typedef WSANAMESPACE_INFOW WSANAMESPACE_INFO;
+typedef PWSANAMESPACE_INFOW PWSANAMESPACE_INFO;
+typedef LPWSANAMESPACE_INFOW LPWSANAMESPACE_INFO;
+typedef WSANAMESPACE_INFOEXW WSANAMESPACE_INFOEX;
+typedef PWSANAMESPACE_INFOEXW PWSANAMESPACE_INFOEX;
+typedef LPWSANAMESPACE_INFOEXW LPWSANAMESPACE_INFOEX;
+#else
+typedef WSANAMESPACE_INFOA WSANAMESPACE_INFO;
+typedef PWSANAMESPACE_INFOA PWSANAMESPACE_INFO;
+typedef LPWSANAMESPACE_INFOA LPWSANAMESPACE_INFO;
+typedef WSANAMESPACE_INFOEXA WSANAMESPACE_INFOEX;
+typedef PWSANAMESPACE_INFOEXA PWSANAMESPACE_INFOEX;
+typedef LPWSANAMESPACE_INFOEXA LPWSANAMESPACE_INFOEX;
+#endif /* UNICODE */
+
+#if(_WIN32_WINNT >= 0x0600)
+
+#define POLLRDNORM 0x0100
+#define POLLRDBAND 0x0200
+#define POLLIN (POLLRDNORM | POLLRDBAND)
+#define POLLPRI 0x0400
+
+#define POLLWRNORM 0x0010
+#define POLLOUT (POLLWRNORM)
+#define POLLWRBAND 0x0020
+
+#define POLLERR 0x0001
+#define POLLHUP 0x0002
+#define POLLNVAL 0x0004
+
+typedef struct pollfd {
+ SOCKET fd;
+ SHORT events;
+ SHORT revents;
+} WSAPOLLFD, *PWSAPOLLFD, FAR *LPWSAPOLLFD;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef SOCKET
+(WSAAPI *LPFN_ACCEPT)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *addr OPTIONAL,
+ IN OUT int FAR *addrlen OPTIONAL);
+
+typedef int
+(WSAAPI *LPFN_BIND)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen);
+
+typedef int
+(WSAAPI *LPFN_CLOSESOCKET)(
+ IN SOCKET s);
+
+typedef int
+(WSAAPI *LPFN_CONNECT)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen);
+
+typedef int
+(WSAAPI *LPFN_IOCTLSOCKET)(
+ IN SOCKET s,
+ IN long cmd,
+ IN OUT u_long FAR *argp);
+
+typedef int
+(WSAAPI *LPFN_GETPEERNAME)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT int FAR *namelen);
+
+typedef int
+(WSAAPI *LPFN_GETSOCKNAME)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT int FAR *namelen);
+
+typedef int
+(WSAAPI *LPFN_GETSOCKOPT)(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ OUT char FAR *optval,
+ IN OUT int FAR *optlen);
+
+typedef u_long
+(WSAAPI *LPFN_HTONL)(
+ IN u_long hostlong);
+
+typedef u_short
+(WSAAPI *LPFN_HTONS)(
+ IN u_short hostshort);
+
+typedef unsigned long
+(WSAAPI *LPFN_INET_ADDR)(
+ IN const char FAR *cp);
+
+typedef char FAR *
+(WSAAPI *LPFN_INET_NTOA)(
+ IN struct in_addr in);
+
+typedef int
+(WSAAPI *LPFN_LISTEN)(
+ IN SOCKET s,
+ IN int backlog);
+
+typedef u_long
+(WSAAPI *LPFN_NTOHL)(
+ IN u_long netlong);
+
+typedef u_short
+(WSAAPI *LPFN_NTOHS)(
+ IN u_short netshort);
+
+typedef int
+(WSAAPI *LPFN_RECV)(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN int flags);
+
+typedef int
+(WSAAPI *LPFN_RECVFROM)(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN int flags,
+ OUT struct sockaddr FAR *from OPTIONAL,
+ IN OUT int FAR * fromlen OPTIONAL);
+
+typedef int
+(WSAAPI *LPFN_SELECT)(
+ IN int nfds,
+ IN OUT fd_set FAR *readfds OPTIONAL,
+ IN OUT fd_set FAR *writefds OPTIONAL,
+ IN OUT fd_set FAR *exceptfds OPTIONAL,
+ IN const struct timeval FAR *timeout OPTIONAL);
+
+typedef int
+(WSAAPI *LPFN_SEND)(
+ IN SOCKET s,
+ IN const char FAR *buf,
+ IN int len,
+ IN int flags);
+
+typedef int
+(WSAAPI *LPFN_SENDTO)(
+ IN SOCKET s,
+ IN const char FAR *buf,
+ IN int len,
+ IN int flags,
+ IN const struct sockaddr FAR *to OPTIONAL,
+ IN int tolen);
+
+typedef int
+(WSAAPI *LPFN_SETSOCKOPT)(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ IN const char FAR *optval OPTIONAL,
+ IN int optlen);
+
+typedef int
+(WSAAPI *LPFN_SHUTDOWN)(
+ IN SOCKET s,
+ IN int how);
+
+typedef SOCKET
+(WSAAPI *LPFN_SOCKET)(
+ IN int af,
+ IN int type,
+ IN int protocol);
+
+typedef struct hostent FAR *
+(WSAAPI *LPFN_GETHOSTBYADDR)(
+ IN const char FAR *addr,
+ IN int len,
+ IN int type);
+
+typedef struct hostent FAR *
+(WSAAPI *LPFN_GETHOSTBYNAME)(
+ IN const char FAR *name);
+
+typedef int
+(WSAAPI *LPFN_GETHOSTNAME)(
+ OUT char FAR *name,
+ IN int namelen);
+
+typedef struct servent FAR *
+(WSAAPI *LPFN_GETSERVBYPORT)(
+ IN int port,
+ IN const char FAR *proto);
+
+typedef struct servent FAR *
+(WSAAPI *LPFN_GETSERVBYNAME)(
+ IN const char FAR *name,
+ IN const char FAR *proto);
+
+typedef struct protoent FAR *
+(WSAAPI *LPFN_GETPROTOBYNUMBER)(
+ IN int number);
+
+typedef struct protoent FAR *
+(WSAAPI *LPFN_GETPROTOBYNAME)(
+ IN const char FAR *name);
+
+typedef int
+(WSAAPI *LPFN_WSASTARTUP)(
+ IN WORD wVersionRequired,
+ OUT LPWSADATA lpWSAData);
+
+typedef int
+(WSAAPI *LPFN_WSACLEANUP)(void);
+
+typedef void
+(WSAAPI *LPFN_WSASETLASTERROR)(
+ IN int iError);
+
+typedef int
+(WSAAPI *LPFN_WSAGETLASTERROR)(void);
+
+typedef BOOL
+(WSAAPI *LPFN_WSAISBLOCKING)(void);
+
+typedef int
+(WSAAPI *LPFN_WSAUNHOOKBLOCKINGHOOK)(void);
+
+typedef FARPROC
+(WSAAPI *LPFN_WSASETBLOCKINGHOOK)(
+ IN FARPROC lpBlockFunc);
+
+typedef int
+(WSAAPI *LPFN_WSACANCELBLOCKINGCALL)(void);
+
+typedef HANDLE
+(WSAAPI *LPFN_WSAASYNCGETSERVBYNAME)(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ IN const char FAR *proto,
+ OUT char FAR *buf,
+ IN int buflen);
+
+typedef HANDLE
+(WSAAPI *LPFN_WSAASYNCGETSERVBYPORT)(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN int port,
+ IN const char FAR *proto,
+ OUT char FAR *buf,
+ IN int buflen);
+
+typedef HANDLE
+(WSAAPI *LPFN_WSAASYNCGETPROTOBYNAME)(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ OUT char FAR *buf,
+ IN int buflen);
+
+typedef HANDLE
+(WSAAPI *LPFN_WSAASYNCGETPROTOBYNUMBER)(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN int number,
+ OUT char FAR *buf,
+ IN int buflen);
+
+typedef HANDLE
+(WSAAPI *LPFN_WSAASYNCGETHOSTBYNAME)(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ OUT char FAR *buf,
+ IN int buflen);
+
+typedef HANDLE
+(WSAAPI *LPFN_WSAASYNCGETHOSTBYADDR)(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *addr,
+ IN int len,
+ IN int type,
+ OUT char FAR *buf,
+ IN int buflen);
+
+typedef int
+(WSAAPI *LPFN_WSACANCELASYNCREQUEST)(
+ IN HANDLE hAsyncTaskHandle);
+
+typedef int
+(WSAAPI *LPFN_WSAASYNCSELECT)(
+ IN SOCKET s,
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN long lEvent);
+
+typedef SOCKET
+(WSAAPI *LPFN_WSAACCEPT)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *addr OPTIONAL,
+ IN OUT LPINT addrlen OPTIONAL,
+ IN LPCONDITIONPROC lpfnCondition OPTIONAL,
+ IN DWORD_PTR dwCallbackData OPTIONAL);
+
+typedef BOOL
+(WSAAPI *LPFN_WSACLOSEEVENT)(
+ IN WSAEVENT hEvent);
+
+typedef int
+(WSAAPI *LPFN_WSACONNECT)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN LPWSABUF lpCallerData OPTIONAL,
+ OUT LPWSABUF lpCalleeData OPTIONAL,
+ IN LPQOS lpSQOS OPTIONAL,
+ IN LPQOS lpGQOS OPTIONAL);
+
+typedef WSAEVENT
+(WSAAPI *LPFN_WSACREATEEVENT)(void);
+
+typedef int
+(WSAAPI *LPFN_WSADUPLICATESOCKETA)(
+ IN SOCKET s,
+ IN DWORD dwProcessId,
+ OUT LPWSAPROTOCOL_INFOA lpProtocolInfo);
+
+typedef int
+(WSAAPI *LPFN_WSADUPLICATESOCKETW)(
+ IN SOCKET s,
+ IN DWORD dwProcessId,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolInfo);
+
+#ifdef UNICODE
+#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW
+#else
+#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETA
+#endif
+
+typedef int
+(WSAAPI *LPFN_WSAENUMNETWORKEVENTS)(
+ IN SOCKET s,
+ IN WSAEVENT hEventObject,
+ OUT LPWSANETWORKEVENTS lpNetworkEvents);
+
+typedef int
+(WSAAPI *LPFN_WSAENUMPROTOCOLSA)(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer OPTIONAL,
+ IN OUT LPDWORD lpdwBufferLength);
+
+typedef int
+(WSAAPI *LPFN_WSAENUMPROTOCOLSW)(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer OPTIONAL,
+ IN OUT LPDWORD lpdwBufferLength);
+
+#ifdef UNICODE
+#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSW
+#else
+#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSA
+#endif
+
+typedef int
+(WSAAPI *LPFN_WSAEVENTSELECT)(
+ IN SOCKET s,
+ IN WSAEVENT hEventObject,
+ IN long lNetworkEvents);
+
+typedef BOOL
+(WSAAPI *LPFN_WSAGETOVERLAPPEDRESULT)(
+ IN SOCKET s,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ OUT LPDWORD lpcbTransfer,
+ IN BOOL fWait,
+ OUT LPDWORD lpdwFlags);
+
+typedef BOOL
+(WSAAPI *LPFN_WSAGETQOSBYNAME)(
+ IN SOCKET s,
+ IN LPWSABUF lpQOSName,
+ OUT LPQOS lpQOS);
+
+typedef int
+(WSAAPI *LPFN_WSAHTONL)(
+ IN SOCKET s,
+ IN u_long hostlong,
+ OUT u_long FAR *lpnetlong);
+
+typedef int
+(WSAAPI *LPFN_WSAHTONS)(
+ IN SOCKET s,
+ IN u_short hostshort,
+ OUT u_short FAR *lpnetshort);
+
+typedef int
+(WSAAPI *LPFN_WSAIOCTL)(
+ IN SOCKET s,
+ IN DWORD dwIoControlCode,
+ IN LPVOID lpvInBuffer OPTIONAL,
+ IN DWORD cbInBuffer,
+ OUT LPVOID lpvOutBuffer OPTIONAL,
+ IN DWORD cbOutBuffer,
+ OUT LPDWORD lpcbBytesReturned,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+typedef SOCKET
+(WSAAPI *LPFN_WSAJOINLEAF)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN LPWSABUF lpCallerData OPTIONAL,
+ OUT LPWSABUF lpCalleeData OPTIONAL,
+ IN LPQOS lpSQOS OPTIONAL,
+ IN LPQOS lpGQOS OPTIONAL,
+ IN DWORD dwFlags);
+
+typedef int
+(WSAAPI *LPFN_WSANTOHL)(
+ IN SOCKET s,
+ IN u_long netlong,
+ OUT u_long FAR *lphostlong);
+
+typedef int
+(WSAAPI *LPFN_WSANTOHS)(
+ IN SOCKET s,
+ IN u_short netshort,
+ OUT u_short FAR *lphostshort);
+
+typedef int
+(WSAAPI *LPFN_WSARECV)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPDWORD lpFlags,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+typedef int
+(WSAAPI *LPFN_WSARECVDISCONNECT)(
+ IN SOCKET s,
+ OUT LPWSABUF lpInboundDisconnectData);
+
+typedef int
+(WSAAPI *LPFN_WSARECVFROM)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPDWORD lpFlags,
+ OUT struct sockaddr FAR *lpFrom OPTIONAL,
+ IN OUT LPINT lpFromlen OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+typedef BOOL
+(WSAAPI *LPFN_WSARESETEVENT)(
+ IN WSAEVENT hEvent);
+
+typedef int
+(WSAAPI *LPFN_WSASEND)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN DWORD dwFlags,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+typedef int
+(WSAAPI *LPFN_WSASENDDISCONNECT)(
+ IN SOCKET s,
+ IN LPWSABUF lpOutboundDisconnectData OPTIONAL);
+
+typedef int
+(WSAAPI *LPFN_WSASENDTO)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN DWORD dwFlags,
+ IN const struct sockaddr FAR *lpTo,
+ IN int iTolen,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+typedef BOOL
+(WSAAPI *LPFN_WSASETEVENT)(
+ IN WSAEVENT hEvent);
+
+typedef SOCKET
+(WSAAPI *LPFN_WSASOCKETA)(
+ IN int af,
+ IN int type,
+ IN int protocol,
+ IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL,
+ IN GROUP g,
+ IN DWORD dwFlags);
+
+typedef SOCKET
+(WSAAPI *LPFN_WSASOCKETW)(
+ IN int af,
+ IN int type,
+ IN int protocol,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ IN GROUP g,
+ IN DWORD dwFlags);
+
+#ifdef UNICODE
+#define LPFN_WSASOCKET LPFN_WSASOCKETW
+#else
+#define LPFN_WSASOCKET LPFN_WSASOCKETA
+#endif
+
+typedef DWORD
+(WSAAPI *LPFN_WSAWAITFORMULTIPLEEVENTS)(
+ IN DWORD cEvents,
+ IN const WSAEVENT FAR *lphEvents,
+ IN BOOL fWaitAll,
+ IN DWORD dwTimeout,
+ IN BOOL fAlertable);
+
+typedef INT
+(WSAAPI *LPFN_WSAADDRESSTOSTRINGA)(
+ IN LPSOCKADDR lpsaAddress,
+ IN DWORD dwAddressLength,
+ IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL,
+ OUT LPSTR lpszAddressString,
+ IN OUT LPDWORD lpdwAddressStringLength);
+
+typedef INT
+(WSAAPI *LPFN_WSAADDRESSTOSTRINGW)(
+ IN LPSOCKADDR lpsaAddress,
+ IN DWORD dwAddressLength,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ OUT LPWSTR lpszAddressString,
+ IN OUT LPDWORD lpdwAddressStringLength);
#ifdef UNICODE
#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGW
-#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW
-#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW
-#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSW
-#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOW
-#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW
-#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSW
-#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINW
-#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTW
-#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEW
-#define LPFN_WSASOCKET LPFN_WSASOCKETW
-#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSW
-#define WSAAddressToString WSAAddressToStringW
-#define WSADuplicateSocket WSADuplicateSocketW
-#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersW
-#define WSAEnumProtocols WSAEnumProtocolsW
-#define WSAGetServiceClassInfo WSAGetServiceClassInfoW
-#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdW
-#define WSASetService WSASetServiceW
-#define WSASocket WSASocketW
-#define WSAStringToAddress WSAStringToAddressW
-#define WSALookupServiceBegin WSALookupServiceBeginW
-#define WSALookupServiceNext WSALookupServiceNextW
-#define WSAInstallServiceClass WSAInstallServiceClassW
#else
#define LPFN_WSAADDRESSTOSTRING LPFN_WSAADDRESSTOSTRINGA
-#define LPFN_WSADUPLICATESOCKET LPFN_WSADUPLICATESOCKETW
-#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSA
-#define LPFN_WSAENUMPROTOCOLS LPFN_WSAENUMPROTOCOLSA
-#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOA
-#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA
-#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSA
-#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINA
-#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTA
-#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEA
-#define LPFN_WSASOCKET LPFN_WSASOCKETA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSASTRINGTOADDRESSA)(
+ IN LPSTR AddressString,
+ IN INT AddressFamily,
+ IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL,
+ OUT LPSOCKADDR lpAddress,
+ IN OUT LPINT lpAddressLength);
+
+typedef INT
+(WSAAPI *LPFN_WSASTRINGTOADDRESSW)(
+ IN LPWSTR AddressString,
+ IN INT AddressFamily,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ OUT LPSOCKADDR lpAddress,
+ IN OUT LPINT lpAddressLength);
+
+#ifdef UNICODE
+#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSW
+#else
#define LPFN_WSASTRINGTOADDRESS LPFN_WSASTRINGTOADDRESSA
-#define WSAAddressToString WSAAddressToStringA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSALOOKUPSERVICEBEGINA)(
+ IN LPWSAQUERYSETA lpqsRestrictions,
+ IN DWORD dwControlFlags,
+ OUT LPHANDLE lphLookup);
+
+typedef INT
+(WSAAPI *LPFN_WSALOOKUPSERVICEBEGINW)(
+ IN LPWSAQUERYSETW lpqsRestrictions,
+ IN DWORD dwControlFlags,
+ OUT LPHANDLE lphLookup);
+
+#ifdef UNICODE
+#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINW
+#else
+#define LPFN_WSALOOKUPSERVICEBEGIN LPFN_WSALOOKUPSERVICEBEGINA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSALOOKUPSERVICENEXTA)(
+ IN HANDLE hLookup,
+ IN DWORD dwControlFlags,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSAQUERYSETA lpqsResults);
+
+typedef INT
+(WSAAPI *LPFN_WSALOOKUPSERVICENEXTW)(
+ IN HANDLE hLookup,
+ IN DWORD dwControlFlags,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSAQUERYSETW lpqsResults OPTIONAL);
+
+#ifdef UNICODE
+#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTW
+#else
+#define LPFN_WSALOOKUPSERVICENEXT LPFN_WSALOOKUPSERVICENEXTA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSALOOKUPSERVICEEND)(
+ IN HANDLE hLookup);
+
+typedef INT
+(WSAAPI *LPFN_WSAINSTALLSERVICECLASSA)(
+ IN LPWSASERVICECLASSINFOA lpServiceClassInfo);
+
+typedef INT
+(WSAAPI *LPFN_WSAINSTALLSERVICECLASSW)(
+ IN LPWSASERVICECLASSINFOW lpServiceClassInfo);
+
+#ifdef UNICODE
+#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSW
+#else
+#define LPFN_WSAINSTALLSERVICECLASS LPFN_WSAINSTALLSERVICECLASSA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSAREMOVESERVICECLASS)(
+ IN LPGUID lpServiceClassId);
+
+typedef INT
+(WSAAPI *LPFN_WSAGETSERVICECLASSINFOA)(
+ IN LPGUID lpProviderId,
+ IN LPGUID lpServiceClassId,
+ IN OUT LPDWORD lpdwBufSize,
+ OUT LPWSASERVICECLASSINFOA lpServiceClassInfo);
+
+typedef INT
+(WSAAPI *LPFN_WSAGETSERVICECLASSINFOW)(
+ IN LPGUID lpProviderId,
+ IN LPGUID lpServiceClassId,
+ IN OUT LPDWORD lpdwBufSize,
+ OUT LPWSASERVICECLASSINFOW lpServiceClassInfo);
+
+#ifdef UNICODE
+#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOW
+#else
+#define LPFN_WSAGETSERVICECLASSINFO LPFN_WSAGETSERVICECLASSINFOA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSA)(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOA lpnspBuffer);
+
+typedef INT
+(WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSW)(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOW lpnspBuffer);
+
+#ifdef UNICODE
+#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW
+#else
+#define LPFN_WSAENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA)(
+ IN LPGUID lpServiceClassId,
+ OUT LPSTR lpszServiceClassName,
+ IN OUT LPDWORD lpdwBufferLength);
+
+typedef INT
+(WSAAPI *LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW)(
+ IN LPGUID lpServiceClassId,
+ OUT LPWSTR lpszServiceClassName,
+ IN OUT LPDWORD lpdwBufferLength);
+
+#ifdef UNICODE
+#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDW
+#else
+#define LPFN_WSAGETSERVICECLASSNAMEBYCLASSID LPFN_WSAGETSERVICECLASSNAMEBYCLASSIDA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSASETSERVICEA)(
+ IN LPWSAQUERYSETA lpqsRegInfo,
+ IN WSAESETSERVICEOP essoperation,
+ IN DWORD dwControlFlags);
+
+typedef INT
+(WSAAPI *LPFN_WSASETSERVICEW)(
+ IN LPWSAQUERYSETW lpqsRegInfo,
+ IN WSAESETSERVICEOP essoperation,
+ IN DWORD dwControlFlags);
+
+#ifdef UNICODE
+#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEW
+#else
+#define LPFN_WSASETSERVICE LPFN_WSASETSERVICEA
+#endif
+
+typedef INT
+(WSAAPI *LPFN_WSAPROVIDERCONFIGCHANGE)(
+ IN OUT LPHANDLE lpNotificationHandle OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+#if(_WIN32_WINNT >= 0x0501)
+typedef INT
+(WSAAPI *LPFN_WSANSPIOCTL)(
+ IN HANDLE hLookup,
+ IN DWORD dwControlCode,
+ IN LPVOID lpvInBuffer OPTIONAL,
+ IN DWORD cbInBuffer,
+ OUT LPVOID lpvOutBuffer OPTIONAL,
+ IN DWORD cbOutBuffer,
+ OUT LPDWORD lpcbBytesReturned,
+ IN LPWSACOMPLETION lpCompletion OPTIONAL);
+#endif /* (_WIN32_WINNT >= 0x0501) */
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef INT
+(WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSEXA)(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOEXA lpnspBuffer);
+
+typedef INT
+(WSAAPI *LPFN_WSAENUMNAMESPACEPROVIDERSEXW)(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOEXW lpnspBuffer);
+
+#ifdef UNICODE
+#define LPFN_WSAENUMNAMESPACEPROVIDERSEX LPFN_WSAENUMNAMESPACEPROVIDERSEXW
+#else
+#define LPFN_WSAENUMNAMESPACEPROVIDERSEX LPFN_WSAENUMNAMESPACEPROVIDERSEXA
+#endif
+
+#endif /* (_WIN32_WINNT >= 0x600) */
+
+#endif /* INCL_WINSOCK_API_TYPEDEFS */
+
+#if INCL_WINSOCK_API_PROTOTYPES
+
+WINSOCK_API_LINKAGE
+SOCKET
+WSAAPI
+accept(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *addr OPTIONAL,
+ IN OUT int FAR *addrlen OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+bind(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *addr,
+ IN int namelen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+closesocket(
+ IN SOCKET s);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+connect(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+ioctlsocket(
+ IN SOCKET s,
+ IN long cmd,
+ IN OUT u_long FAR *argp);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+getpeername(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT int FAR *namelen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+getsockname(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT int FAR *namelen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+getsockopt(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ OUT char FAR *optval,
+ IN OUT int FAR *optlen);
+
+WINSOCK_API_LINKAGE
+u_long
+WSAAPI
+htonl(
+ IN u_long hostlong);
+
+WINSOCK_API_LINKAGE
+u_short
+WSAAPI
+htons(
+ IN u_short hostshort);
+
+WINSOCK_API_LINKAGE
+unsigned long
+WSAAPI
+inet_addr(
+ IN const char FAR *cp);
+
+WINSOCK_API_LINKAGE
+char FAR *
+WSAAPI
+inet_ntoa(
+ IN struct in_addr in);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+listen(
+ IN SOCKET s,
+ IN int backlog);
+
+WINSOCK_API_LINKAGE
+u_long
+WSAAPI
+ntohl(
+ IN u_long netlong);
+
+WINSOCK_API_LINKAGE
+u_short
+WSAAPI
+ntohs(
+ IN u_short netshort);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+recv(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN int flags);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+recvfrom(
+ IN SOCKET s,
+ OUT char FAR *buf,
+ IN int len,
+ IN int flags,
+ OUT struct sockaddr FAR *from OPTIONAL,
+ IN OUT int FAR *fromlen OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+select(
+ IN int nfds,
+ IN OUT fd_set FAR *readfds OPTIONAL,
+ IN OUT fd_set FAR *writefds OPTIONAL,
+ IN OUT fd_set FAR *exceptfds OPTIONAL,
+ IN const struct timeval FAR *timeout OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+send(
+ IN SOCKET s,
+ IN const char FAR *buf,
+ IN int len,
+ IN int flags);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+sendto(
+ IN SOCKET s,
+ IN const char FAR *buf,
+ IN int len,
+ IN int flags,
+ IN const struct sockaddr FAR *to OPTIONAL,
+ IN int tolen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+setsockopt(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ IN const char FAR *optval OPTIONAL,
+ IN int optlen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+shutdown(
+ IN SOCKET s,
+ IN int how);
+
+WINSOCK_API_LINKAGE
+SOCKET
+WSAAPI
+socket(
+ IN int af,
+ IN int type,
+ IN int protocol);
+
+WINSOCK_API_LINKAGE
+struct hostent FAR *
+WSAAPI
+gethostbyaddr(
+ IN const char FAR *addr,
+ IN int len,
+ IN int type);
+
+WINSOCK_API_LINKAGE
+struct hostent FAR *
+WSAAPI
+gethostbyname(
+ IN const char FAR *name);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+gethostname(
+ OUT char FAR *name,
+ IN int namelen);
+
+WINSOCK_API_LINKAGE
+struct servent FAR *
+WSAAPI
+getservbyport(
+ IN int port,
+ IN const char FAR *proto);
+
+WINSOCK_API_LINKAGE
+struct servent FAR *
+WSAAPI
+getservbyname(
+ IN const char FAR *name,
+ IN const char FAR *proto);
+
+WINSOCK_API_LINKAGE
+struct protoent FAR *
+WSAAPI
+getprotobynumber(
+ IN int number);
+
+WINSOCK_API_LINKAGE
+struct protoent FAR *
+WSAAPI
+getprotobyname(
+ IN const char FAR *name);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAStartup(
+ IN WORD wVersionRequired,
+ OUT LPWSADATA lpWSAData);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSACleanup(void);
+
+WINSOCK_API_LINKAGE
+void
+WSAAPI
+WSASetLastError(
+ IN int iError);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAGetLastError(void);
+
+WINSOCK_API_LINKAGE
+BOOL
+WSAAPI
+WSAIsBlocking(void);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAUnhookBlockingHook(void);
+
+WINSOCK_API_LINKAGE
+FARPROC
+WSAAPI
+WSASetBlockingHook(
+ IN FARPROC lpBlockFunc);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSACancelBlockingCall(void);
+
+WINSOCK_API_LINKAGE
+HANDLE
+WSAAPI
+WSAAsyncGetServByName(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ IN const char FAR *proto,
+ OUT char FAR *buf,
+ IN int buflen);
+
+WINSOCK_API_LINKAGE
+HANDLE
+WSAAPI
+WSAAsyncGetServByPort(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN int port,
+ IN const char FAR *proto,
+ OUT char FAR *buf,
+ IN int buflen);
+
+WINSOCK_API_LINKAGE
+HANDLE
+WSAAPI
+WSAAsyncGetProtoByName(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ OUT char FAR *buf,
+ IN int buflen);
+
+WINSOCK_API_LINKAGE
+HANDLE
+WSAAPI
+WSAAsyncGetProtoByNumber(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN int number,
+ OUT char FAR *buf,
+ IN int buflen);
+
+WINSOCK_API_LINKAGE
+HANDLE
+WSAAPI
+WSAAsyncGetHostByName(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *name,
+ OUT char FAR *buf,
+ IN int buflen);
+
+WINSOCK_API_LINKAGE
+HANDLE
+WSAAPI
+WSAAsyncGetHostByAddr(
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN const char FAR *addr,
+ IN int len,
+ IN int type,
+ OUT char FAR *buf,
+ IN int buflen);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSACancelAsyncRequest(
+ IN HANDLE hAsyncTaskHandle);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAAsyncSelect(
+ IN SOCKET s,
+ IN HWND hWnd,
+ IN u_int wMsg,
+ IN long lEvent);
+
+WINSOCK_API_LINKAGE
+SOCKET
+WSAAPI
+WSAAccept(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *addr OPTIONAL,
+ IN OUT LPINT addrlen OPTIONAL,
+ IN LPCONDITIONPROC lpfnCondition OPTIONAL,
+ IN DWORD_PTR dwCallbackData OPTIONAL);
+
+WINSOCK_API_LINKAGE
+BOOL
+WSAAPI
+WSACloseEvent(
+ IN WSAEVENT hEvent);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAConnect(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN LPWSABUF lpCallerData OPTIONAL,
+ OUT LPWSABUF lpCalleeData OPTIONAL,
+ IN LPQOS lpSQOS OPTIONAL,
+ IN LPQOS lpGQOS OPTIONAL);
+
+#ifdef UNICODE
+#define WSAConnectByName WSAConnectByNameW
+#else
+#define WSAConnectByName WSAConnectByNameA
+#endif
+
+BOOL
+PASCAL
+WSAConnectByNameW(
+ IN SOCKET s,
+ IN LPWSTR nodename,
+ IN LPWSTR servicename,
+ IN OUT LPDWORD LocalAddressLength,
+ OUT LPSOCKADDR LocalAddress,
+ IN OUT LPDWORD RemoteAddressLength,
+ OUT LPSOCKADDR RemoteAddress,
+ IN const struct timeval *timeout,
+ IN LPWSAOVERLAPPED Reserved OPTIONAL);
+
+BOOL
+PASCAL
+WSAConnectByNameA(
+ IN SOCKET s,
+ IN LPCSTR nodename,
+ IN LPCSTR servicename,
+ IN OUT LPDWORD LocalAddressLength,
+ OUT LPSOCKADDR LocalAddress,
+ IN OUT LPDWORD RemoteAddressLength,
+ OUT LPSOCKADDR RemoteAddress,
+ IN const struct timeval *timeout,
+ IN LPWSAOVERLAPPED Reserved OPTIONAL);
+
+BOOL
+PASCAL
+WSAConnectByList(
+ IN SOCKET s,
+ IN PSOCKET_ADDRESS_LIST SocketAddress,
+ IN OUT LPDWORD LocalAddressLength,
+ OUT LPSOCKADDR LocalAddress,
+ IN OUT LPDWORD RemoteAddressLength,
+ OUT LPSOCKADDR RemoteAddress,
+ IN const struct timeval *timeout,
+ IN LPWSAOVERLAPPED Reserved OPTIONAL);
+
+WINSOCK_API_LINKAGE
+WSAEVENT
+WSAAPI
+WSACreateEvent(void);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSADuplicateSocketA(
+ IN SOCKET s,
+ IN DWORD dwProcessId,
+ OUT LPWSAPROTOCOL_INFOA lpProtocolInfo);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSADuplicateSocketW(
+ IN SOCKET s,
+ IN DWORD dwProcessId,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolInfo);
+
+#ifdef UNICODE
+#define WSADuplicateSocket WSADuplicateSocketW
+#else
#define WSADuplicateSocket WSADuplicateSocketA
-#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersA
+#endif
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAEnumNetworkEvents(
+ IN SOCKET s,
+ IN WSAEVENT hEventObject,
+ OUT LPWSANETWORKEVENTS lpNetworkEvents);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAEnumProtocolsA(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOA lpProtocolBuffer OPTIONAL,
+ IN OUT LPDWORD lpdwBufferLength);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAEnumProtocolsW(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer OPTIONAL,
+ IN OUT LPDWORD lpdwBufferLength);
+
+#ifdef UNICODE
+#define WSAEnumProtocols WSAEnumProtocolsW
+#else
#define WSAEnumProtocols WSAEnumProtocolsA
-#define WSAGetServiceClassInfo WSAGetServiceClassInfoA
-#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdA
-#define WSAInstallServiceClass WSAInstallServiceClassA
-#define WSALookupServiceBegin WSALookupServiceBeginA
-#define WSALookupServiceNext WSALookupServiceNextA
+#endif
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAEventSelect(
+ IN SOCKET s,
+ IN WSAEVENT hEventObject,
+ IN long lNetworkEvents);
+
+WINSOCK_API_LINKAGE
+BOOL
+WSAAPI
+WSAGetOverlappedResult(
+ IN SOCKET s,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ OUT LPDWORD lpcbTransfer,
+ IN BOOL fWait,
+ OUT LPDWORD lpdwFlags);
+
+WINSOCK_API_LINKAGE
+BOOL
+WSAAPI
+WSAGetQOSByName(
+ IN SOCKET s,
+ IN LPWSABUF lpQOSName,
+ OUT LPQOS lpQOS);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAHtonl(
+ IN SOCKET s,
+ IN u_long hostlong,
+ OUT u_long FAR *lpnetlong);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAHtons(
+ IN SOCKET s,
+ IN u_short hostshort,
+ OUT u_short FAR *lpnetshort);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAIoctl(
+ IN SOCKET s,
+ IN DWORD dwIoControlCode,
+ IN LPVOID lpvInBuffer OPTIONAL,
+ IN DWORD cbInBuffer,
+ OUT LPVOID lpvOutBuffer OPTIONAL,
+ IN DWORD cbOutBuffer,
+ OUT LPDWORD lpcbBytesReturned,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+SOCKET
+WSAAPI
+WSAJoinLeaf(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN LPWSABUF lpCallerData OPTIONAL,
+ OUT LPWSABUF lpCalleeData OPTIONAL,
+ IN LPQOS lpSQOS OPTIONAL,
+ IN LPQOS lpGQOS OPTIONAL,
+ IN DWORD dwFlags);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSANtohl(
+ IN SOCKET s,
+ IN u_long netlong,
+ OUT u_long FAR *lphostlong);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSANtohs(
+ IN SOCKET s,
+ IN u_short netshort,
+ OUT u_short FAR *lphostshort);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSARecv(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPDWORD lpFlags,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSARecvDisconnect(
+ IN SOCKET s,
+ IN LPWSABUF lpInboundDisconnectData OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSARecvFrom(
+ IN SOCKET s,
+ IN OUT LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPDWORD lpFlags,
+ OUT struct sockaddr FAR *lpFrom,
+ IN OUT LPINT lpFromlen OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+BOOL
+WSAAPI
+WSAResetEvent(
+ IN WSAEVENT hEvent);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSASendDisconnect(
+ IN SOCKET s,
+ IN LPWSABUF lpOutboundDisconnectData OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSASend(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN DWORD dwFlags,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSASendTo(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN DWORD dwFlags,
+ IN const struct sockaddr FAR *lpTo OPTIONAL,
+ IN int iTolen,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+BOOL
+WSAAPI
+WSASetEvent(
+ IN WSAEVENT hEvent);
+
+WINSOCK_API_LINKAGE
+SOCKET
+WSAAPI
+WSASocketA(
+ IN int af,
+ IN int type,
+ IN int protocol,
+ IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL,
+ IN GROUP g,
+ IN DWORD dwFlags);
+
+WINSOCK_API_LINKAGE
+SOCKET
+WSAAPI
+WSASocketW(
+ IN int af,
+ IN int type,
+ IN int protocol,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ IN GROUP g,
+ IN DWORD dwFlags);
+
+#ifdef UNICODE
+#define WSASocket WSASocketW
+#else
#define WSASocket WSASocketA
+#endif
+
+WINSOCK_API_LINKAGE
+DWORD
+WSAAPI
+WSAWaitForMultipleEvents(
+ IN DWORD cEvents,
+ IN const WSAEVENT FAR *lphEvents,
+ IN BOOL fWaitAll,
+ IN DWORD dwTimeout,
+ IN BOOL fAlertable);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAAddressToStringA(
+ IN LPSOCKADDR lpsaAddress,
+ IN DWORD dwAddressLength,
+ IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL,
+ OUT LPSTR lpszAddressString,
+ IN OUT LPDWORD lpdwAddressStringLength);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAAddressToStringW(
+ IN LPSOCKADDR lpsaAddress,
+ IN DWORD dwAddressLength,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ OUT LPWSTR lpszAddressString,
+ IN OUT LPDWORD lpdwAddressStringLength);
+
+#ifdef UNICODE
+#define WSAAddressToString WSAAddressToStringW
+#else
+#define WSAAddressToString WSAAddressToStringA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAStringToAddressA(
+ IN LPSTR AddressString,
+ IN INT AddressFamily,
+ IN LPWSAPROTOCOL_INFOA lpProtocolInfo OPTIONAL,
+ OUT LPSOCKADDR lpAddress,
+ IN OUT LPINT lpAddressLength);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAStringToAddressW(
+ IN LPWSTR AddressString,
+ IN INT AddressFamily,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ OUT LPSOCKADDR lpAddress,
+ IN OUT LPINT lpAddressLength);
+
+#ifdef UNICODE
+#define WSAStringToAddress WSAStringToAddressW
+#else
#define WSAStringToAddress WSAStringToAddressA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSALookupServiceBeginA(
+ IN LPWSAQUERYSETA lpqsRestrictions,
+ IN DWORD dwControlFlags,
+ OUT LPHANDLE lphLookup);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSALookupServiceBeginW(
+ IN LPWSAQUERYSETW lpqsRestrictions,
+ IN DWORD dwControlFlags,
+ OUT LPHANDLE lphLookup);
+
+#ifdef UNICODE
+#define WSALookupServiceBegin WSALookupServiceBeginW
+#else
+#define WSALookupServiceBegin WSALookupServiceBeginA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSALookupServiceNextA(
+ IN HANDLE hLookup,
+ IN DWORD dwControlFlags,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSAQUERYSETA lpqsResults);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSALookupServiceNextW(
+ IN HANDLE hLookup,
+ IN DWORD dwControlFlags,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSAQUERYSETW lpqsResults OPTIONAL);
+
+#ifdef UNICODE
+#define WSALookupServiceNext WSALookupServiceNextW
+#else
+#define WSALookupServiceNext WSALookupServiceNextA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSALookupServiceEnd(
+ IN HANDLE hLookup);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAInstallServiceClassA(
+ IN LPWSASERVICECLASSINFOA lpServiceClassInfo);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAInstallServiceClassW(
+ IN LPWSASERVICECLASSINFOW lpServiceClassInfo);
+
+#ifdef UNICODE
+#define WSAInstallServiceClass WSAInstallServiceClassW
+#else
+#define WSAInstallServiceClass WSAInstallServiceClassA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSARemoveServiceClass(
+ IN LPGUID lpServiceClassId);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAGetServiceClassInfoA(
+ IN LPGUID lpProviderId,
+ IN LPGUID lpServiceClassId,
+ IN OUT LPDWORD lpdwBufSize,
+ OUT LPWSASERVICECLASSINFOA lpServiceClassInfo);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAGetServiceClassInfoW(
+ IN LPGUID lpProviderId,
+ IN LPGUID lpServiceClassId,
+ IN OUT LPDWORD lpdwBufSize,
+ OUT LPWSASERVICECLASSINFOW lpServiceClassInfo);
+
+#ifdef UNICODE
+#define WSAGetServiceClassInfo WSAGetServiceClassInfoW
+#else
+#define WSAGetServiceClassInfo WSAGetServiceClassInfoA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAEnumNameSpaceProvidersA(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOA lpnspBuffer);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAEnumNameSpaceProvidersW(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOW lpnspBuffer);
+
+#ifdef UNICODE
+#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersW
+#else
+#define WSAEnumNameSpaceProviders WSAEnumNameSpaceProvidersA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAGetServiceClassNameByClassIdA(
+ IN LPGUID lpServiceClassId,
+ OUT LPSTR lpszServiceClassName,
+ IN OUT LPDWORD lpdwBufferLength);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAGetServiceClassNameByClassIdW(
+ IN LPGUID lpServiceClassId,
+ OUT LPWSTR lpszServiceClassName,
+ IN OUT LPDWORD lpdwBufferLength);
+
+#ifdef UNICODE
+#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdW
+#else
+#define WSAGetServiceClassNameByClassId WSAGetServiceClassNameByClassIdA
+#endif
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSASetServiceA(
+ IN LPWSAQUERYSETA lpqsRegInfo,
+ IN WSAESETSERVICEOP essoperation,
+ IN DWORD dwControlFlags);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSASetServiceW(
+ IN LPWSAQUERYSETW lpqsRegInfo,
+ IN WSAESETSERVICEOP essoperation,
+ IN DWORD dwControlFlags);
+
+#ifdef UNICODE
+#define WSASetService WSASetServiceW
+#else
#define WSASetService WSASetServiceA
#endif
-#ifdef _MSC_VER
-#pragma warning(pop)
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAProviderConfigChange(
+ IN OUT LPHANDLE lpNotificationHandle OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+#if(_WIN32_WINNT >= 0x0501)
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSANSPIoctl(
+ IN HANDLE hLookup,
+ IN DWORD dwControlCode,
+ IN LPVOID lpvInBuffer OPTIONAL,
+ IN DWORD cbInBuffer,
+ OUT LPVOID lpvOutBuffer OPTIONAL,
+ IN DWORD cbOutBuffer,
+ OUT LPDWORD lpcbBytesReturned,
+ IN LPWSACOMPLETION lpCompletion OPTIONAL);
+#endif /* (_WIN32_WINNT >= 0x0501) */
+
+#if(_WIN32_WINNT >= 0x0600)
+
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSASendMsg(
+ IN SOCKET Handle,
+ IN LPWSAMSG lpMsg,
+ IN DWORD dwFlags,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAEnumNameSpaceProvidersExA(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOEXA lpnspBuffer);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAEnumNameSpaceProvidersExW(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOEXW lpnspBuffer);
+
+#ifdef UNICODE
+#define WSAEnumNameSpaceProvidersEx WSAEnumNameSpaceProvidersExW
+#else
+#define WSAEnumNameSpaceProvidersEx WSAEnumNameSpaceProvidersExA
#endif
+WINSOCK_API_LINKAGE
+int
+WSAAPI
+WSAPoll(
+ IN OUT LPWSAPOLLFD fdArray,
+ IN ULONG fds,
+ IN INT timeout);
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#endif /* INCL_WINSOCK_API_PROTOTYPES */
+
+typedef struct sockaddr_in FAR *LPSOCKADDR_IN;
+typedef struct linger LINGER;
+typedef struct linger *PLINGER;
+typedef struct linger FAR *LPLINGER;
+typedef struct fd_set FD_SET;
+typedef struct fd_set *PFD_SET;
+typedef struct fd_set FAR *LPFD_SET;
+typedef struct hostent HOSTENT;
+typedef struct hostent *PHOSTENT;
+typedef struct hostent FAR *LPHOSTENT;
+typedef struct servent SERVENT;
+typedef struct servent *PSERVENT;
+typedef struct servent FAR *LPSERVENT;
+typedef struct protoent PROTOENT;
+typedef struct protoent *PPROTOENT;
+typedef struct protoent FAR *LPPROTOENT;
+typedef struct timeval TIMEVAL;
+typedef struct timeval *PTIMEVAL;
+typedef struct timeval FAR *LPTIMEVAL;
+
+#define WSAMAKEASYNCREPLY(buflen,error) MAKELONG(buflen,error)
+#define WSAMAKESELECTREPLY(event,error) MAKELONG(event,error)
+#define WSAGETASYNCBUFLEN(lParam) LOWORD(lParam)
+#define WSAGETASYNCERROR(lParam) HIWORD(lParam)
+#define WSAGETSELECTEVENT(lParam) LOWORD(lParam)
+#define WSAGETSELECTERROR(lParam) HIWORD(lParam)
+
#ifdef __cplusplus
}
#endif
+
+#ifdef _NEED_POPPACK
+#include
#endif
+
+/* FIXME :
+#if(_WIN32_WINNT >= 0x0501)
+#ifdef IPV6STRICT
+#include
+#endif
+#endif */
+
+#endif /* !(defined _WINSOCK2API_ || defined _WINSOCKAPI_) */
diff --git a/include/psdk/winsplp.h b/include/psdk/winsplp.h
new file mode 100644
index 00000000000..38a98ed926c
--- /dev/null
+++ b/include/psdk/winsplp.h
@@ -0,0 +1,786 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (STRICT && (NTDDI_VERSION >= NTDDI_VISTA))
+#define HKEYMONITOR HKEY
+#else
+#define HKEYMONITOR HANDLE
+#endif
+
+#define PRINTER_NOTIFY_STATUS_ENDPOINT 1
+#define PRINTER_NOTIFY_STATUS_POLL 2
+#define PRINTER_NOTIFY_STATUS_INFO 4
+
+#define ROUTER_UNKNOWN 0
+#define ROUTER_SUCCESS 1
+#define ROUTER_STOP_ROUTING 2
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+#define MONITOR2_SIZE_WIN2K (sizeof(DWORD) + (sizeof(PVOID)*18))
+#endif
+
+#define COPYFILE_EVENT_SET_PRINTER_DATAEX 1
+#define COPYFILE_EVENT_DELETE_PRINTER 2
+#define COPYFILE_EVENT_ADD_PRINTER_CONNECTION 3
+#define COPYFILE_EVENT_DELETE_PRINTER_CONNECTION 4
+#define COPYFILE_EVENT_FILES_CHANGED 5
+
+#define COPYFILE_FLAG_CLIENT_SPOOLER 0x00000001
+#define COPYFILE_FLAG_SERVER_SPOOLER 0x00000002
+
+#define PRINTER_NOTIFY_INFO_DATA_COMPACT 1
+
+typedef struct _PRINTER_NOTIFY_INIT {
+ DWORD Size;
+ DWORD Reserved;
+ DWORD PollTime;
+} PRINTER_NOTIFY_INIT, *LPPRINTER_NOTIFY_INIT, *PPRINTER_NOTIFY_INIT;
+
+typedef struct _SPLCLIENT_INFO_1 {
+ DWORD dwSize;
+ LPWSTR pMachineName;
+ LPWSTR pUserName;
+ DWORD dwBuildNum;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ WORD wProcessorArchitecture;
+} SPLCLIENT_INFO_1, *LPSPLCLIENT_INFO_1, *PSPLCLIENT_INFO_1;
+
+typedef struct _SPLCLIENT_INFO_2_V1{
+ ULONG_PTR hSplPrinter;
+} SPLCLIENT_INFO_2_W2K;
+
+typedef struct _SPLCLIENT_INFO_2_V2{
+#ifdef _WIN64
+ DWORD64 hSplPrinter;
+#else
+ DWORD32 hSplPrinter;
+#endif
+} SPLCLIENT_INFO_2_WINXP;
+
+typedef struct _SPLCLIENT_INFO_2_V3{
+ UINT64 hSplPrinter;
+} SPLCLIENT_INFO_2_LONGHORN;
+
+typedef struct _PRINTPROVIDOR {
+ BOOL (WINAPI *fpOpenPrinter)(PWSTR lpPrinterName, HANDLE *phPrinter,
+ PPRINTER_DEFAULTSW pDefault);
+ BOOL (WINAPI *fpSetJob)(HANDLE hPrinter, DWORD JobID, DWORD Level,
+ LPBYTE pJob, DWORD Command);
+ BOOL (WINAPI *fpGetJob)(HANDLE hPrinter, DWORD JobID, DWORD Level,
+ LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpEnumJobs)(HANDLE hPrinter, DWORD FirstJob, DWORD NoJobs,
+ DWORD Level, LPBYTE pJob, DWORD cbBuf, LPDWORD pcbNeeded,
+ LPDWORD pcReturned);
+ HANDLE (WINAPI *fpAddPrinter)(LPWSTR pName, DWORD Level, LPBYTE pPrinter);
+ BOOL (WINAPI *fpDeletePrinter)(HANDLE hPrinter);
+ BOOL (WINAPI *fpSetPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
+ DWORD Command);
+ BOOL (WINAPI *fpGetPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
+ DWORD cbBuf, LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpEnumPrinters)(DWORD dwType, LPWSTR lpszName, DWORD dwLevel,
+ LPBYTE lpbPrinters, DWORD cbBuf, LPDWORD lpdwNeeded,
+ LPDWORD lpdwReturned);
+ BOOL (WINAPI *fpAddPrinterDriver)(LPWSTR pName, DWORD Level, LPBYTE pDriverInfo);
+ BOOL (WINAPI *fpEnumPrinterDrivers)(LPWSTR pName, LPWSTR pEnvironment,
+ DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf,
+ LPDWORD pcbNeeded, LPDWORD pcbReturned);
+ BOOL (WINAPI *fpGetPrinterDriver)(HANDLE hPrinter, LPWSTR pEnvironment,
+ DWORD Level, LPBYTE pDriverInfo, DWORD cbBuf,
+ LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpGetPrinterDriverDirectory)(LPWSTR pName, LPWSTR pEnvironment,
+ DWORD Level, LPBYTE pDriverDirectory,
+ DWORD cbBuf, LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpDeletePrinterDriver)(LPWSTR pName, LPWSTR pEnvironment,
+ LPWSTR pDriverName);
+ BOOL (WINAPI *fpAddPrintProcessor)(LPWSTR pName, LPWSTR pEnvironment,
+ LPWSTR pPathName, LPWSTR pPrintProcessorName);
+ BOOL (WINAPI *fpEnumPrintProcessors)(LPWSTR pName, LPWSTR pEnvironment,
+ DWORD Level, LPBYTE pPrintProcessorInfo,
+ DWORD cbBuf, LPDWORD pcbNeeded,
+ LPDWORD pcbReturned);
+ BOOL (WINAPI *fpGetPrintProcessorDirectory)(LPWSTR pName, LPWSTR pEnvironment,
+ DWORD Level, LPBYTE pPrintProcessorInfo,
+ DWORD cbBuf, LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpDeletePrintProcessor)(LPWSTR pName, LPWSTR pEnvironment,
+ LPWSTR pPrintProcessorName);
+ BOOL (WINAPI *fpEnumPrintProcessorDatatypes)(LPWSTR pName,
+ LPWSTR pPrintProcessorName,
+ DWORD Level, LPBYTE pDatatypes,
+ DWORD cbBuf, LPDWORD pcbNeeded,
+ LPDWORD pcbReturned);
+ DWORD (WINAPI *fpStartDocPrinter)(HANDLE hPrinter, DWORD Level, LPBYTE pDocInfo);
+ BOOL (WINAPI *fpStartPagePrinter)(HANDLE hPrinter);
+ BOOL (WINAPI *fpWritePrinter)(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf,
+ LPDWORD pcWritten);
+ BOOL (WINAPI *fpEndPagePrinter)(HANDLE hPrinter);
+ BOOL (WINAPI *fpAbortPrinter)(HANDLE hPrinter);
+ BOOL (WINAPI *fpReadPrinter)(HANDLE hPrinter, LPVOID pBuf, DWORD cbBuf,
+ LPDWORD pNoBytesRead);
+ BOOL (WINAPI *fpEndDocPrinter)(HANDLE hPrinter);
+ BOOL (WINAPI *fpAddJob)(HANDLE hPrinter, DWORD Level, LPBYTE pData,
+ DWORD cbBuf, LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpScheduleJob)(HANDLE hPrinter, DWORD JobID);
+ DWORD (WINAPI *fpGetPrinterData)(HANDLE hPrinter, LPWSTR pValueName,
+ LPDWORD pType, LPBYTE pData, DWORD nSize,
+ LPDWORD pcbNeeded);
+ DWORD (WINAPI *fpSetPrinterData)(HANDLE hPrinter, LPWSTR pValueName,
+ DWORD Type, LPBYTE pData, DWORD cbData);
+ DWORD (WINAPI *fpWaitForPrinterChange)(HANDLE hPrinter, DWORD Flags);
+ BOOL (WINAPI *fpClosePrinter)(HANDLE phPrinter);
+ BOOL (WINAPI *fpAddForm)(HANDLE hPrinter, DWORD Level, LPBYTE pForm);
+ BOOL (WINAPI *fpDeleteForm)(HANDLE hPrinter, LPWSTR pFormName);
+ BOOL (WINAPI *fpGetForm)(HANDLE hPrinter, LPWSTR pFormName, DWORD Level,
+ LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded);
+ BOOL (WINAPI *fpSetForm)(HANDLE hPrinter, LPWSTR pFormName, DWORD Level,
+ LPBYTE pForm);
+ BOOL (WINAPI *fpEnumForms)(HANDLE hPrinter, DWORD Level, LPBYTE pForm,
+ DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
+ BOOL (WINAPI *fpEnumMonitors)(LPWSTR pName, DWORD Level, LPBYTE pMonitors,
+ DWORD cbBuf, LPDWORD pcbNeeded,
+ LPDWORD pcReturned);
+ BOOL (WINAPI *fpEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
+ DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
+ BOOL (WINAPI *fpAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
+ BOOL (WINAPI *fpConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
+ BOOL (WINAPI *fpDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
+ HANDLE (WINAPI *fpCreatePrinterIC)(HANDLE hPrinter, LPDEVMODEW pDevMode);
+ BOOL (WINAPI *fpPlayGdiScriptOnPrinterIC)(HANDLE hPrinterIC, LPBYTE pIn,
+ DWORD cIn, LPBYTE pOut, DWORD cOut,
+ DWORD ul);
+ BOOL (WINAPI *fpDeletePrinterIC)(HANDLE hPrinterIC);
+ BOOL (WINAPI *fpAddPrinterConnection)(LPWSTR pName);
+ BOOL (WINAPI *fpDeletePrinterConnection)(LPWSTR pName);
+ DWORD (WINAPI *fpPrinterMessageBox)(HANDLE hPrinter, DWORD Error, HWND hWnd,
+ LPWSTR pText, LPWSTR pCaption,
+ DWORD dwType);
+ BOOL (WINAPI *fpAddMonitor)(LPWSTR pName, DWORD Level, LPBYTE pMonitors);
+ BOOL (WINAPI *fpDeleteMonitor)(LPWSTR pName, LPWSTR pEnvironment,
+ LPWSTR pMonitorName);
+ BOOL (WINAPI *fpResetPrinter)(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault);
+ BOOL (WINAPI *fpGetPrinterDriverEx)(HANDLE hPrinter, LPWSTR pEnvironment,
+ DWORD Level, LPBYTE pDriverInfo,
+ DWORD cbBuf, LPDWORD pcbNeeded,
+ DWORD dwClientMajorVersion,
+ DWORD dwClientMinorVersion,
+ PDWORD pdwServerMajorVersion,
+ PDWORD pdwServerMinorVersion);
+ HANDLE (WINAPI *fpFindFirstPrinterChangeNotification)(HANDLE hPrinter,
+ DWORD fdwFlags,
+ DWORD fdwOptions,
+ LPVOID pPrinterNotifyOptions);
+ BOOL (WINAPI *fpFindClosePrinterChangeNotification)(HANDLE hChange);
+ BOOL (WINAPI *fpAddPortEx)(HANDLE hMonitor, LPWSTR pName, DWORD Level,
+ LPBYTE lpBuffer, LPWSTR lpMonitorName);
+ BOOL (WINAPI *fpShutDown)(LPVOID pvReserved);
+ BOOL (WINAPI *fpRefreshPrinterChangeNotification)(HANDLE hPrinter,
+ DWORD Reserved,
+ PVOID pvReserved,
+ PVOID pPrinterNotifyInfo);
+ BOOL (WINAPI *fpOpenPrinterEx)(LPWSTR pPrinterName, LPHANDLE phPrinter,
+ LPPRINTER_DEFAULTSW pDefault, LPBYTE pClientInfo,
+ DWORD Level);
+ HANDLE (WINAPI *fpAddPrinterEx)(LPWSTR pName, DWORD Level, LPBYTE pPrinter,
+ LPBYTE pClientInfo, DWORD ClientInfoLevel);
+ BOOL (WINAPI *fpSetPort)(LPWSTR pName, LPWSTR pPortName, DWORD dwLevel,
+ LPBYTE pPortInfo);
+ DWORD (WINAPI *fpEnumPrinterData)(HANDLE hPrinter, DWORD dwIndex,
+ LPWSTR pValueName, DWORD cbValueName,
+ LPDWORD pcbValueName, LPDWORD pType,
+ LPBYTE pData, DWORD cbData, LPDWORD pcbData);
+ DWORD (WINAPI *fpDeletePrinterData)(HANDLE hPrinter, LPWSTR pValueName);
+ DWORD (WINAPI *fpClusterSplOpen)(LPCWSTR pszServer, LPCWSTR pszResource,
+ PHANDLE phSpooler, LPCWSTR pszName,
+ LPCWSTR pszAddress);
+ DWORD (WINAPI *fpClusterSplClose)(HANDLE hSpooler);
+ DWORD (WINAPI *fpClusterSplIsAlive)(HANDLE hSpooler);
+ DWORD (WINAPI *fpSetPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
+ LPCWSTR pValueName, DWORD Type,
+ LPBYTE pData, DWORD cbData);
+ DWORD (WINAPI *fpGetPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
+ LPCWSTR pValueName, LPDWORD pType,
+ LPBYTE pData, DWORD nSize, LPDWORD pcbNeeded);
+ DWORD (WINAPI *fpEnumPrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
+ LPBYTE pEnumValues, DWORD cbEnumValues,
+ LPDWORD pcbEnumValues, LPDWORD pnEnumValues);
+ DWORD (WINAPI *fpEnumPrinterKey)(HANDLE hPrinter, LPCWSTR pKeyName,
+ LPWSTR pSubkey, DWORD cbSubkey, LPDWORD pcbSubkey);
+ DWORD (WINAPI *fpDeletePrinterDataEx)(HANDLE hPrinter, LPCWSTR pKeyName,
+ LPCWSTR pValueName);
+ DWORD (WINAPI *fpDeletePrinterKey)(HANDLE hPrinter, LPCWSTR pKeyName);
+ BOOL (WINAPI *fpSeekPrinter)(HANDLE hPrinter, LARGE_INTEGER liDistanceToMove,
+ PLARGE_INTEGER pliNewPointer, DWORD dwMoveMethod,
+ BOOL bWrite);
+ BOOL (WINAPI *fpDeletePrinterDriverEx)(LPWSTR pName, LPWSTR pEnvironment,
+ LPWSTR pDriverName, DWORD dwDeleteFlag,
+ DWORD dwVersionNum);
+ BOOL (WINAPI *fpAddPerMachineConnection)(LPCWSTR pServer,
+ LPCWSTR pPrinterName, LPCWSTR pPrintServer,
+ LPCWSTR pProvider);
+ BOOL (WINAPI *fpDeletePerMachineConnection)(LPCWSTR pServer,
+ LPCWSTR pPrinterName);
+ BOOL (WINAPI *fpEnumPerMachineConnections)(LPCWSTR pServer,
+ LPBYTE pPrinterEnum, DWORD cbBuf,
+ LPDWORD pcbNeeded,
+ LPDWORD pcReturned);
+ BOOL (WINAPI *fpXcvData)(HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
+ DWORD cbInputData, PBYTE pOutputData, DWORD cbOutputData,
+ PDWORD pcbOutputNeeded, PDWORD pdwStatus);
+ BOOL (WINAPI *fpAddPrinterDriverEx)(LPWSTR pName, DWORD Level,
+ LPBYTE pDriverInfo, DWORD dwFileCopyFlags);
+ BOOL (WINAPI *fpSplReadPrinter)(HANDLE hPrinter, LPBYTE *pBuf, DWORD cbBuf);
+ BOOL (WINAPI *fpDriverUnloadComplete)(LPWSTR pDriverFile);
+ BOOL (WINAPI *fpGetSpoolFileInfo)(HANDLE hPrinter, LPWSTR *pSpoolDir,
+ LPHANDLE phFile, HANDLE hSpoolerProcess,
+ HANDLE hAppProcess);
+ BOOL (WINAPI *fpCommitSpoolData)(HANDLE hPrinter, DWORD cbCommit);
+ BOOL (WINAPI *fpCloseSpoolFileHandle)(HANDLE hPrinter);
+ BOOL (WINAPI *fpFlushPrinter)(HANDLE hPrinter, LPBYTE pBuf, DWORD cbBuf,
+ LPDWORD pcWritten, DWORD cSleep);
+ DWORD (WINAPI *fpSendRecvBidiData)(HANDLE hPort, LPCWSTR pAction,
+ LPBIDI_REQUEST_CONTAINER pReqData,
+ LPBIDI_RESPONSE_CONTAINER *ppResData);
+ BOOL (WINAPI *fpAddDriverCatalog)(HANDLE hPrinter, DWORD dwLevel,
+ VOID *pvDriverInfCatInfo, DWORD dwCatalogCopyFlags);
+} PRINTPROVIDOR, *LPPRINTPROVIDOR;
+
+typedef struct _PRINTPROCESSOROPENDATA {
+ PDEVMODEW pDevMode;
+ LPWSTR pDatatype;
+ LPWSTR pParameters;
+ LPWSTR pDocumentName;
+ DWORD JobId;
+ LPWSTR pOutputFile;
+ LPWSTR pPrinterName;
+} PRINTPROCESSOROPENDATA, *LPPRINTPROCESSOROPENDATA, *PPRINTPROCESSOROPENDATA;
+
+typedef struct _MONITORREG {
+ DWORD cbSize;
+ LONG (WINAPI *fpCreateKey)(HANDLE hcKey, LPCWSTR pszSubKey, DWORD dwOptions,
+ REGSAM samDesired,
+ PSECURITY_ATTRIBUTES pSecurityAttributes,
+ PHANDLE phckResult, PDWORD pdwDisposition,
+ HANDLE hSpooler);
+ LONG (WINAPI *fpOpenKey)(HANDLE hcKey, LPCWSTR pszSubKey, REGSAM samDesired,
+ PHANDLE phkResult, HANDLE hSpooler);
+ LONG (WINAPI *fpCloseKey)(HANDLE hcKey, HANDLE hSpooler);
+ LONG (WINAPI *fpDeleteKey)(HANDLE hcKey, LPCWSTR pszSubKey, HANDLE hSpooler);
+ LONG (WINAPI *fpEnumKey)(HANDLE hcKey, DWORD dwIndex, LPWSTR pszName,
+ PDWORD pcchName, PFILETIME pftLastWriteTime,
+ HANDLE hSpooler);
+ LONG (WINAPI *fpQueryInfoKey)(HANDLE hcKey, PDWORD pcSubKeys, PDWORD pcbKey,
+ PDWORD pcValues, PDWORD pcbValue, PDWORD pcbData,
+ PDWORD pcbSecurityDescriptor,
+ PFILETIME pftLastWriteTime,
+ HANDLE hSpooler);
+ LONG (WINAPI *fpSetValue)(HANDLE hcKey, LPCWSTR pszValue, DWORD dwType,
+ const BYTE* pData, DWORD cbData, HANDLE hSpooler);
+ LONG (WINAPI *fpDeleteValue)(HANDLE hcKey, LPCWSTR pszValue, HANDLE hSpooler);
+ LONG (WINAPI *fpEnumValue)(HANDLE hcKey, DWORD dwIndex, LPWSTR pszValue,
+ PDWORD pcbValue, PDWORD pType, PBYTE pData, PDWORD pcbData,
+ HANDLE hSpooler);
+ LONG (WINAPI *fpQueryValue)(HANDLE hcKey, LPCWSTR pszValue, PDWORD pType,
+ PBYTE pData, PDWORD pcbData, HANDLE hSpooler);
+} MONITORREG, *PMONITORREG;
+
+typedef struct _MONITORINIT {
+ DWORD cbSize;
+ HANDLE hSpooler;
+ HKEYMONITOR hckRegistryRoot;
+ PMONITORREG pMonitorReg;
+ BOOL bLocal;
+ LPCWSTR pszServerName;
+} MONITORINIT, *PMONITORINIT;
+
+typedef struct _MONITOR {
+ BOOL (WINAPI *pfnEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
+ DWORD cbBuf, LPDWORD pcbNeeded, LPDWORD pcReturned);
+ BOOL (WINAPI *pfnOpenPort)(LPWSTR pName, PHANDLE pHandle);
+ BOOL (WINAPI *pfnOpenPortEx)(LPWSTR pPortName, LPWSTR pPrinterName,
+ PHANDLE pHandle, struct _MONITOR *pMonitor);
+ BOOL (WINAPI *pfnStartDocPort)(HANDLE hPort, LPWSTR pPrinterName,
+ DWORD JobId, DWORD Level, LPBYTE pDocInfo);
+ BOOL (WINAPI *pfnWritePort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
+ LPDWORD pcbWritten);
+ BOOL (WINAPI *pfnReadPort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
+ LPDWORD pcbRead);
+ BOOL (WINAPI *pfnEndDocPort)(HANDLE hPort);
+ BOOL (WINAPI *pfnClosePort)(HANDLE hPort);
+ BOOL (WINAPI *pfnAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
+ BOOL (WINAPI *pfnAddPortEx)(LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
+ LPWSTR lpMonitorName);
+ BOOL (WINAPI *pfnConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
+ BOOL (WINAPI *pfnDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
+ BOOL (WINAPI *pfnGetPrinterDataFromPort)(HANDLE hPort, DWORD ControlID,
+ LPWSTR pValueName, LPWSTR lpInBuffer,
+ DWORD cbInBuffer, LPWSTR lpOutBuffer,
+ DWORD cbOutBuffer, LPDWORD lpcbReturned);
+ BOOL (WINAPI *pfnSetPortTimeOuts)(HANDLE hPort, LPCOMMTIMEOUTS lpCTO,
+ DWORD reserved);
+ BOOL (WINAPI *pfnXcvOpenPort)(LPCWSTR pszObject, ACCESS_MASK GrantedAccess, PHANDLE phXcv);
+ DWORD (WINAPI *pfnXcvDataPort)(HANDLE hXcv, LPCWSTR pszDataName,
+ PBYTE pInputData, DWORD cbInputData,
+ PBYTE pOutputData, DWORD cbOutputData,
+ PDWORD pcbOutputNeeded);
+ BOOL (WINAPI *pfnXcvClosePort)(HANDLE hXcv);
+} MONITOR, *LPMONITOR;
+
+typedef struct _MONITOREX {
+ DWORD dwMonitorSize;
+ MONITOR Monitor;
+} MONITOREX, *LPMONITOREX;
+
+typedef struct _MONITOR2 {
+ DWORD cbSize;
+ BOOL (WINAPI *pfnEnumPorts)(LPWSTR pName, DWORD Level, LPBYTE pPorts,
+ DWORD cbBuf, LPDWORD pcbNeeded,
+ LPDWORD pcReturned);
+ BOOL (WINAPI *pfnOpenPort)(LPWSTR pName, PHANDLE pHandle);
+ BOOL (WINAPI *pfnOpenPortEx)(LPWSTR pPortName, LPWSTR pPrinterName,
+ PHANDLE pHandle, struct _MONITOR2 *pMonitor2);
+ BOOL (WINAPI *pfnStartDocPort)(HANDLE hPort, LPWSTR pPrinterName,
+ DWORD JobId, DWORD Level, LPBYTE pDocInfo);
+ BOOL (WINAPI *pfnWritePort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuf,
+ LPDWORD pcbWritten);
+ BOOL (WINAPI *pfnReadPort)(HANDLE hPort, LPBYTE pBuffer, DWORD cbBuffer,
+ LPDWORD pcbRead);
+ BOOL (WINAPI *pfnEndDocPort)(HANDLE hPort);
+ BOOL (WINAPI *pfnClosePort)(HANDLE hPort);
+ BOOL (WINAPI *pfnAddPort)(LPWSTR pName, HWND hWnd, LPWSTR pMonitorName);
+ BOOL (WINAPI *pfnAddPortEx)(LPWSTR pName, DWORD Level, LPBYTE lpBuffer,
+ LPWSTR lpMonitorName);
+ BOOL (WINAPI *pfnConfigurePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
+ BOOL (WINAPI *pfnDeletePort)(LPWSTR pName, HWND hWnd, LPWSTR pPortName);
+ BOOL (WINAPI *pfnGetPrinterDataFromPort)(HANDLE hPort, DWORD ControlID,
+ LPWSTR pValueName, LPWSTR lpInBuffer,
+ DWORD cbInBuffer, LPWSTR lpOutBuffer,
+ DWORD cbOutBuffer, LPDWORD lpcbReturned);
+ BOOL (WINAPI *pfnSetPortTimeOuts)(HANDLE hPort, LPCOMMTIMEOUTS lpCTO,
+ DWORD reserved);
+ BOOL (WINAPI *pfnXcvOpenPort)(HANDLE hMonitor, LPCWSTR pszObject,
+ ACCESS_MASK GrantedAccess, PHANDLE phXcv);
+ DWORD (WINAPI *pfnXcvDataPort)(HANDLE hXcv, LPCWSTR pszDataName,
+ PBYTE pInputData, DWORD cbInputData,
+ PBYTE pOutputData, DWORD cbOutputData,
+ PDWORD pcbOutputNeeded);
+ BOOL (WINAPI *pfnXcvClosePort)(HANDLE hXcv);
+ VOID (WINAPI *pfnShutdown)(HANDLE hMonitor);
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+ DWORD (WINAPI *pfnSendRecvBidiDataFromPort)(HANDLE hPort, DWORD dwAccessBit,
+ LPCWSTR pAction,
+ PBIDI_REQUEST_CONTAINER pReqData,
+ PBIDI_RESPONSE_CONTAINER *ppResData);
+#endif
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+ DWORD (WINAPI *pfnNotifyUsedPorts)(HANDLE hMonitor, DWORD cPorts,
+ PCWSTR *ppszPorts);
+
+ DWORD (WINAPI *pfnNotifyUnusedPorts)(HANDLE hMonitor, DWORD cPorts,
+ PCWSTR *ppszPorts);
+#endif
+} MONITOR2, *LPMONITOR2, *PMONITOR2;
+
+typedef struct _MONITORUI {
+ DWORD dwMonitorUISize;
+ BOOL (WINAPI *pfnAddPortUI)(PCWSTR pszServer, HWND hWnd,
+ PCWSTR pszPortNameIn, PWSTR *ppszPortNameOut);
+ BOOL (WINAPI *pfnConfigurePortUI)(PCWSTR pName, HWND hWnd, PCWSTR pPortName);
+ BOOL (WINAPI *pfnDeletePortUI)(PCWSTR pszServer, HWND hWnd, PCWSTR pszPortName);
+} MONITORUI, *PMONITORUI;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef enum {
+ kMessageBox = 0
+} UI_TYPE;
+
+typedef struct {
+ DWORD cbSize;
+ LPWSTR pTitle;
+ LPWSTR pMessage;
+ DWORD Style;
+ DWORD dwTimeout;
+ BOOL bWait;
+} MESSAGEBOX_PARAMS, *PMESSAGEBOX_PARAMS;
+
+typedef struct {
+ UI_TYPE UIType;
+ MESSAGEBOX_PARAMS MessageBoxParams;
+} SHOWUIPARAMS, *PSHOWUIPARAMS;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+#ifndef __ATTRIBUTE_INFO_3__
+#define __ATTRIBUTE_INFO_3__
+typedef struct _ATTRIBUTE_INFO_3 {
+ DWORD dwJobNumberOfPagesPerSide;
+ DWORD dwDrvNumberOfPagesPerSide;
+ DWORD dwNupBorderFlags;
+ DWORD dwJobPageOrderFlags;
+ DWORD dwDrvPageOrderFlags;
+ DWORD dwJobNumberOfCopies;
+ DWORD dwDrvNumberOfCopies;
+ DWORD dwColorOptimization;
+ short dmPrintQuality;
+ short dmYResolution;
+} ATTRIBUTE_INFO_3, *PATTRIBUTE_INFO_3;
+#endif /* __ATTRIBUTE_INFO_3__ */
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef BOOL
+(CALLBACK *ROUTER_NOTIFY_CALLBACK)(
+ IN DWORD dwCommand,
+ IN PVOID pContext,
+ IN DWORD dwColor,
+ IN PPRINTER_NOTIFY_INFO pNofityInfo,
+ IN DWORD fdwFlags,
+ OUT PDWORD pdwResult);
+
+typedef enum _NOTIFICATION_CALLBACK_COMMANDS {
+ NOTIFICATION_COMMAND_NOTIFY,
+ NOTIFICATION_COMMAND_CONTEXT_ACQUIRE,
+ NOTIFICATION_COMMAND_CONTEXT_RELEASE
+} NOTIFICATION_CALLBACK_COMMANDS;
+
+typedef struct _NOTIFICATION_CONFIG_1 {
+ UINT cbSize;
+ DWORD fdwFlags;
+ ROUTER_NOTIFY_CALLBACK pfnNotifyCallback;
+ PVOID pContext;
+} NOTIFICATION_CONFIG_1, *PNOTIFICATION_CONFIG_1;
+
+typedef enum _NOTIFICATION_CONFIG_FLAGS {
+ NOTIFICATION_CONFIG_CREATE_EVENT = 1 << 0,
+ NOTIFICATION_CONFIG_REGISTER_CALLBACK = 1 << 1,
+ NOTIFICATION_CONFIG_EVENT_TRIGGER = 1 << 2,
+ NOTIFICATION_CONFIG_ASYNC_CHANNEL = 1 << 3
+} NOTIFICATION_CONFIG_FLAGS;
+
+typedef struct _SPLCLIENT_INFO_3 {
+ UINT cbSize;
+ DWORD dwFlags;
+ DWORD dwSize;
+ PWSTR pMachineName;
+ PWSTR pUserName;
+ DWORD dwBuildNum;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ WORD wProcessorArchitecture;
+ UINT64 hSplPrinter;
+} SPLCLIENT_INFO_3, *PSPLCLIENT_INFO_3, *LPSPLCLIENT_INFO_3;
+
+#ifndef __ATTRIBUTE_INFO_4__
+#define __ATTRIBUTE_INFO_4__
+
+typedef struct _ATTRIBUTE_INFO_4 {
+ DWORD dwJobNumberOfPagesPerSide;
+ DWORD dwDrvNumberOfPagesPerSide;
+ DWORD dwNupBorderFlags;
+ DWORD dwJobPageOrderFlags;
+ DWORD dwDrvPageOrderFlags;
+ DWORD dwJobNumberOfCopies;
+ DWORD dwDrvNumberOfCopies;
+ DWORD dwColorOptimization;
+ short dmPrintQuality;
+ short dmYResolution;
+ DWORD dwDuplexFlags;
+ DWORD dwNupDirection;
+ DWORD dwBookletFlags;
+ DWORD dwScalingPercentX;
+ DWORD dwScalingPercentY;
+} ATTRIBUTE_INFO_4, *PATTRIBUTE_INFO_4;
+
+#define REVERSE_PAGES_FOR_REVERSE_DUPLEX (0x00000001)
+#define DONT_SEND_EXTRA_PAGES_FOR_DUPLEX (0x00000001 << 1)
+
+#define RIGHT_THEN_DOWN (0x00000001)
+#define DOWN_THEN_RIGHT (0x00000001 << 1)
+#define LEFT_THEN_DOWN (0x00000001 << 2)
+#define DOWN_THEN_LEFT (0x00000001 << 3)
+
+#define BOOKLET_EDGE_LEFT 0x00000000
+#define BOOKLET_EDGE_RIGHT 0x00000001
+
+#endif /* __ATTRIBUTE_INFO_4__ */
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (OSVER(NTDDI_VERSION) == NTDDI_W2K)
+typedef SPLCLIENT_INFO_2_W2K SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
+#elif ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) || (OSVER(NTDDI_VERSION) == NTDDI_WS03))
+typedef SPLCLIENT_INFO_2_WINXP SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
+#else
+typedef SPLCLIENT_INFO_2_LONGHORN SPLCLIENT_INFO_2, *PSPLCLIENT_INFO_2, *LPSPLCLIENT_INFO_2;
+#endif /* (OSVER(NTDDI_VERSION) == NTDDI_W2K) */
+
+BOOL
+WINAPI
+InitializePrintProvidor(
+ OUT LPPRINTPROVIDOR pPrintProvidor,
+ IN DWORD cbPrintProvidor,
+ IN LPWSTR pFullRegistryPath OPTIONAL);
+
+HANDLE
+WINAPI
+OpenPrintProcessor(
+ IN LPWSTR pPrinterName,
+ IN PPRINTPROCESSOROPENDATA pPrintProcessorOpenData);
+
+BOOL
+WINAPI
+PrintDocumentOnPrintProcessor(
+ IN HANDLE hPrintProcessor,
+ IN LPWSTR pDocumentName);
+
+BOOL
+WINAPI
+ClosePrintProcessor(
+ IN OUT HANDLE hPrintProcessor);
+
+BOOL
+WINAPI
+ControlPrintProcessor(
+ IN HANDLE hPrintProcessor,
+ IN DWORD Command);
+
+DWORD
+WINAPI
+GetPrintProcessorCapabilities(
+ IN LPTSTR pValueName,
+ IN DWORD dwAttributes,
+ OUT LPBYTE pData,
+ IN DWORD nSize,
+ OUT LPDWORD pcbNeeded);
+
+BOOL
+WINAPI
+InitializeMonitor(
+ IN LPWSTR pRegistryRoot);
+
+BOOL
+WINAPI
+OpenPort(
+ IN LPWSTR pName,
+ OUT PHANDLE pHandle);
+
+BOOL
+WINAPI
+WritePort(
+ HANDLE hPort,
+ LPBYTE pBuffer,
+ DWORD cbBuf,
+ LPDWORD pcbWritten);
+
+BOOL
+WINAPI
+ReadPort(
+ HANDLE hPort,
+ LPBYTE pBuffer,
+ DWORD cbBuffer,
+ LPDWORD pcbRead);
+
+BOOL
+WINAPI
+ClosePort(
+ IN HANDLE hPort);
+
+BOOL
+WINAPI
+XcvOpenPort(
+ LPCWSTR pszObject,
+ ACCESS_MASK GrantedAccess,
+ PHANDLE phXcv);
+
+DWORD
+WINAPI
+XcvDataPort(
+ HANDLE hXcv,
+ LPCWSTR pszDataName,
+ PBYTE pInputData,
+ DWORD cbInputData,
+ PBYTE pOutputData,
+ DWORD cbOutputData,
+ PDWORD pcbOutputNeeded);
+
+BOOL
+WINAPI
+XcvClosePort(
+ IN HANDLE hXcv);
+
+BOOL
+WINAPI
+AddPortUI(
+ IN PCWSTR pszServer OPTIONAL,
+ IN HWND hWnd,
+ IN PCWSTR pszMonitorNameIn,
+ OUT PWSTR *ppszPortNameOut OPTIONAL);
+
+BOOL
+WINAPI
+ConfigurePortUI(
+ IN PCWSTR pszServer,
+ IN HWND hWnd,
+ IN PCWSTR pszPortName);
+
+BOOL
+WINAPI
+DeletePortUI(
+ IN PCWSTR pszServer,
+ IN HWND hWnd,
+ IN PCWSTR pszPortName);
+
+BOOL
+WINAPI
+SplDeleteSpoolerPortStart(
+ IN PCWSTR pPortName);
+
+BOOL
+WINAPI
+SplDeleteSpoolerPortEnd(
+ IN PCWSTR pName,
+ IN BOOL bDeletePort);
+
+BOOL
+WINAPI
+SpoolerCopyFileEvent(
+ IN LPWSTR pszPrinterName,
+ IN LPWSTR pszKey,
+ IN DWORD dwCopyFileEvent);
+
+DWORD
+WINAPI
+GenerateCopyFilePaths(
+ IN LPCWSTR pszPrinterName,
+ IN LPCWSTR pszDirectory,
+ IN LPBYTE pSplClientInfo,
+ IN DWORD dwLevel,
+ IN OUT LPWSTR pszSourceDir,
+ IN OUT LPDWORD pcchSourceDirSize,
+ IN OUT LPWSTR pszTargetDir,
+ IN OUT LPDWORD pcchTargetDirSize,
+ IN DWORD dwFlags);
+
+HANDLE WINAPI CreatePrinterIC(HANDLE hPrinter, LPDEVMODEW pDevMode);
+BOOL WINAPI PlayGdiScriptOnPrinterIC(HANDLE hPrinterIC, LPBYTE pIn,
+ DWORD cIn, LPBYTE pOut, DWORD cOut, DWORD ul);
+BOOL WINAPI DeletePrinterIC(HANDLE hPrinterIC);
+BOOL WINAPI DevQueryPrint(HANDLE hPrinter, LPDEVMODEW pDevMode, DWORD *pResID);
+HANDLE WINAPI RevertToPrinterSelf(VOID);
+BOOL WINAPI ImpersonatePrinterClient(HANDLE hToken);
+BOOL WINAPI ReplyPrinterChangeNotification(HANDLE hNotify, DWORD fdwFlags,
+ PDWORD pdwResult, PVOID pPrinterNotifyInfo);
+BOOL WINAPI ReplyPrinterChangeNotificationEx(HANDLE hNotify, DWORD dwColor,
+ DWORD fdwFlags, PDWORD pdwResult,
+ PVOID pPrinterNotifyInfo);
+BOOL WINAPI PartialReplyPrinterChangeNotification(HANDLE hNotify,
+ PPRINTER_NOTIFY_INFO_DATA pInfoDataSrc);
+PPRINTER_NOTIFY_INFO WINAPI RouterAllocPrinterNotifyInfo(DWORD cPrinterNotifyInfoData);
+BOOL WINAPI RouterFreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO pInfo);
+
+BOOL WINAPI AppendPrinterNotifyInfoData(PPRINTER_NOTIFY_INFO pInfoDest,
+ PPRINTER_NOTIFY_INFO_DATA pInfoDataSrc,
+ DWORD fdwFlags);
+DWORD WINAPI CallRouterFindFirstPrinterChangeNotification(HANDLE hPrinter,
+ DWORD fdwFlags,
+ DWORD fdwOptions,
+ HANDLE hNotify,
+ PPRINTER_NOTIFY_OPTIONS pPrinterNotifyOptions);
+BOOL WINAPI ProvidorFindFirstPrinterChangeNotification(HANDLE hPrinter,
+ DWORD fdwFlags,
+ DWORD fdwOptions,
+ HANDLE hNotify,
+ PVOID pvReserved0,
+ PVOID pvReserved1);
+BOOL WINAPI ProvidorFindClosePrinterChangeNotification(HANDLE hPrinter);
+
+/* Spooler */
+BOOL WINAPI SpoolerFindFirstPrinterChangeNotification(HANDLE hPrinter,
+ DWORD fdwFlags,
+ DWORD fdwOptions,
+ PHANDLE phEvent,
+ PVOID pPrinterNotifyOptions,
+ PVOID pvReserved);
+BOOL WINAPI SpoolerFindNextPrinterChangeNotification(HANDLE hPrinter,
+ LPDWORD pfdwChange,
+ PVOID pvReserved0,
+ PVOID ppPrinterNotifyInfo);
+VOID WINAPI SpoolerFreePrinterNotifyInfo(PPRINTER_NOTIFY_INFO pInfo);
+BOOL WINAPI SpoolerFindClosePrinterChangeNotification(HANDLE hPrinter);
+
+/* Port monitor / Language monitor / Print monitor */
+LPMONITOR2 WINAPI InitializePrintMonitor2(PMONITORINIT pMonitorInit,
+ PHANDLE phMonitor);
+PMONITORUI WINAPI InitializePrintMonitorUI(VOID);
+LPMONITOREX WINAPI InitializePrintMonitor(LPWSTR pRegistryRoot);
+BOOL WINAPI InitializeMonitorEx(LPWSTR pRegistryRoot, LPMONITOR pMonitor);
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+PBIDI_RESPONSE_CONTAINER WINAPI RouterAllocBidiResponseContainer(DWORD Count);
+PVOID WINAPI RouterAllocBidiMem(size_t NumBytes);
+DWORD WINAPI RouterFreeBidiResponseContainer(PBIDI_RESPONSE_CONTAINER pData);
+VOID WINAPI RouterFreeBidiMem(PVOID pMemPointer);
+
+BOOL
+WINAPI
+SplPromptUIInUsersSession(
+ IN HANDLE hPrinter,
+ IN DWORD JobId,
+ IN PSHOWUIPARAMS pUIParams,
+ OUT DWORD *pResponse);
+
+DWORD
+WINAPI
+SplIsSessionZero(
+ IN HANDLE hPrinter,
+ IN DWORD JobId,
+ OUT BOOL *pIsSessionZero);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+BOOL
+WINAPI
+GetJobAttributes(
+ IN LPWSTR pPrinterName,
+ IN LPDEVMODEW pDevmode,
+ OUT PATTRIBUTE_INFO_3 pAttributeInfo);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+#define FILL_WITH_DEFAULTS 0x1
+
+BOOL
+WINAPI
+GetJobAttributesEx(
+ IN LPWSTR pPrinterName,
+ IN LPDEVMODEW pDevmode,
+ IN DWORD dwLevel,
+ OUT LPBYTE pAttributeInfo,
+ IN DWORD nSize,
+ IN DWORD dwFlags);
+
+BOOL WINAPI SpoolerRefreshPrinterChangeNotification(HANDLE hPrinter,
+ DWORD dwColor,
+ PPRINTER_NOTIFY_OPTIONS pOptions,
+ PPRINTER_NOTIFY_INFO *ppInfo);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+/* FIXME : The following declarations are not present in the official header */
+
+BOOL WINAPI OpenPrinterToken(PHANDLE phToken);
+BOOL WINAPI SetPrinterToken(HANDLE hToken);
+BOOL WINAPI ClosePrinterToken(HANDLE hToken);
+BOOL WINAPI InstallPrintProcessor(HWND hWnd);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/psdk/winspool.h b/include/psdk/winspool.h
index d8c91959aaf..92d89aa6a70 100644
--- a/include/psdk/winspool.h
+++ b/include/psdk/winspool.h
@@ -218,6 +218,23 @@ extern "C" {
#define PORT_STATUS_TONER_LOW 10
#define PORT_STATUS_WARMING_UP 11
#define PORT_STATUS_POWER_SAVE 12
+
+typedef struct _PRINTER_NOTIFY_OPTIONS_TYPE {
+ WORD Type;
+ WORD Reserved0;
+ DWORD Reserved1;
+ DWORD Reserved2;
+ DWORD Count;
+ PWORD pFields;
+} PRINTER_NOTIFY_OPTIONS_TYPE, *PPRINTER_NOTIFY_OPTIONS_TYPE, *LPPRINTER_NOTIFY_OPTIONS_TYPE;
+
+typedef struct _PRINTER_NOTIFY_OPTIONS {
+ DWORD Version;
+ DWORD Flags;
+ DWORD Count;
+ PPRINTER_NOTIFY_OPTIONS_TYPE pTypes;
+} PRINTER_NOTIFY_OPTIONS, *PPRINTER_NOTIFY_OPTIONS, *LPPRINTER_NOTIFY_OPTIONS;
+
#ifndef RC_INVOKED
typedef struct _ADDJOB_INFO_1A {
LPSTR Path;
diff --git a/include/psdk/winuser.h b/include/psdk/winuser.h
index 21cdf040f9d..fbae7314d97 100644
--- a/include/psdk/winuser.h
+++ b/include/psdk/winuser.h
@@ -3253,7 +3253,7 @@ typedef struct tagICONMETRICSA {
int iVertSpacing;
int iTitleWrap;
LOGFONTA lfFont;
-} ICONMETRICSA,*LPICONMETRICSA;
+} ICONMETRICSA, *PICONMETRICSA, *LPICONMETRICSA;
typedef struct tagICONMETRICSW {
UINT cbSize;
@@ -3261,7 +3261,7 @@ typedef struct tagICONMETRICSW {
int iVertSpacing;
int iTitleWrap;
LOGFONTW lfFont;
-} ICONMETRICSW,*LPICONMETRICSW;
+} ICONMETRICSW, *PICONMETRICSW, *LPICONMETRICSW;
#ifdef UNICODE
typedef ICONMETRICSW ICONMETRICS,*LPICONMETRICS;
diff --git a/include/psdk/ws2bth.h b/include/psdk/ws2bth.h
new file mode 100644
index 00000000000..dbe96cbcf40
--- /dev/null
+++ b/include/psdk/ws2bth.h
@@ -0,0 +1,233 @@
+#pragma once
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+
+#include
+
+#include
+
+#define BT_PORT_ANY ((ULONG)-1)
+#define BT_PORT_MIN 0x1
+#define BT_PORT_MAX 0xffff
+#define BT_PORT_DYN_FIRST 0x1001
+
+#ifndef AF_BTH
+#define AF_BTH 32
+#endif
+#ifndef PF_BTH
+#define PF_BTH AF_BTH
+#endif
+#ifndef NS_BTH
+#define NS_BTH 16
+#endif
+
+DEFINE_GUID(SVCID_BTH_PROVIDER, 0x6aa63e0, 0x7d60, 0x41ff, 0xaf, 0xb2, 0x3e, 0xe6, 0xd2, 0xd9, 0x39, 0x2d);
+
+#define BTH_ADDR_STRING_SIZE 12
+
+#define BTHPROTO_RFCOMM 0x0003
+#define BTHPROTO_L2CAP 0x0100
+
+#define SOL_RFCOMM BTHPROTO_RFCOMM
+#define SOL_L2CAP BTHPROTO_L2CAP
+#define SOL_SDP 0x0101
+
+#define SO_BTH_AUTHENTICATE 0x80000001
+#define SO_BTH_ENCRYPT 0x00000002
+#define SO_BTH_MTU 0x80000007
+#define SO_BTH_MTU_MAX 0x80000008
+#define SO_BTH_MTU_MIN 0x8000000a
+
+#define RFCOMM_MAX_MTU 0x000003F3
+#define RFCOMM_MIN_MTU 0x00000017
+
+#define BTH_SDP_VERSION 1
+
+#define SDP_DEFAULT_INQUIRY_SECONDS 6
+#define SDP_MAX_INQUIRY_SECONDS 60
+
+#define SDP_DEFAULT_INQUIRY_MAX_RESPONSES 255
+
+#define SDP_SERVICE_SEARCH_REQUEST 1
+#define SDP_SERVICE_ATTRIBUTE_REQUEST 2
+#define SDP_SERVICE_SEARCH_ATTRIBUTE_REQUEST 3
+
+#define BTHNS_RESULT_DEVICE_CONNECTED 0x00010000
+#define BTHNS_RESULT_DEVICE_REMEMBERED 0x00020000
+#define BTHNS_RESULT_DEVICE_AUTHENTICATED 0x00040000
+
+#define SIO_RFCOMM_SEND_COMMAND _WSAIORW (IOC_VENDOR, 101)
+#define SIO_RFCOMM_WAIT_COMMAND _WSAIORW (IOC_VENDOR, 102)
+
+#define SIO_BTH_PING _WSAIORW (IOC_VENDOR, 8)
+#define SIO_BTH_INFO _WSAIORW (IOC_VENDOR, 9)
+#define SIO_RFCOMM_SESSION_FLOW_OFF _WSAIORW (IOC_VENDOR, 103)
+#define SIO_RFCOMM_TEST _WSAIORW (IOC_VENDOR, 104)
+#define SIO_RFCOMM_USECFC _WSAIORW (IOC_VENDOR, 105)
+
+#ifndef BIT
+#define BIT(b) (1<<(b))
+#endif
+
+#define MSC_EA_BIT EA_BIT
+#define MSC_FC_BIT BIT(1)
+#define MSC_RTC_BIT BIT(2)
+#define MSC_RTR_BIT BIT(3)
+#define MSC_RESERVED (BIT(4)|BIT(5))
+#define MSC_IC_BIT BIT(6)
+#define MSC_DV_BIT BIT(7)
+#define MSC_BREAK_BIT BIT(1)
+#define MSC_SET_BREAK_LENGTH(b, l) ((b) = ((b)&0x3) | (((l)&0xf) << 4))
+
+#define RLS_ERROR 0x01
+#define RLS_OVERRUN 0x02
+#define RLS_PARITY 0x04
+#define RLS_FRAMING 0x08
+
+#define RPN_BAUD_2400 0
+#define RPN_BAUD_4800 1
+#define RPN_BAUD_7200 2
+#define RPN_BAUD_9600 3
+#define RPN_BAUD_19200 4
+#define RPN_BAUD_38400 5
+#define RPN_BAUD_57600 6
+#define RPN_BAUD_115200 7
+#define RPN_BAUD_230400 8
+
+#define RPN_DATA_5 0x0
+#define RPN_DATA_6 0x1
+#define RPN_DATA_7 0x2
+#define RPN_DATA_8 0x3
+
+#define RPN_STOP_1 0x0
+#define RPN_STOP_1_5 0x4
+
+#define RPN_PARITY_NONE 0x00
+#define RPN_PARITY_ODD 0x08
+#define RPN_PARITY_EVEN 0x18
+#define RPN_PARITY_MARK 0x28
+#define RPN_PARITY_SPACE 0x38
+
+#define RPN_FLOW_X_IN 0x01
+#define RPN_FLOW_X_OUT 0x02
+#define RPN_FLOW_RTR_IN 0x04
+#define RPN_FLOW_RTR_OUT 0x08
+#define RPN_FLOW_RTC_IN 0x10
+#define RPN_FLOW_RTC_OUT 0x20
+
+#define RPN_PARAM_BAUD 0x01
+#define RPN_PARAM_DATA 0x02
+#define RPN_PARAM_STOP 0x04
+#define RPN_PARAM_PARITY 0x08
+#define RPN_PARAM_P_TYPE 0x10
+#define RPN_PARAM_XON 0x20
+#define RPN_PARAM_XOFF 0x40
+#define RPN_PARAM_X_IN 0x01
+#define RPN_PARAM_X_OUT 0x02
+#define RPN_PARAM_RTR_IN 0x04
+#define RPN_PARAM_RTR_OUT 0x08
+#define RPN_PARAM_RTC_IN 0x10
+#define RPN_PARAM_RTC_OUT 0x20
+
+#define RFCOMM_CMD_NONE 0
+#define RFCOMM_CMD_MSC 1
+#define RFCOMM_CMD_RLS 2
+#define RFCOMM_CMD_RPN 3
+#define RFCOMM_CMD_RPN_REQUEST 4
+#define RFCOMM_CMD_RPN_RESPONSE 5
+
+
+
+
+
+
+
+typedef struct _SOCKADDR_BTH {
+ USHORT addressFamily;
+ BTH_ADDR btAddr;
+ GUID serviceClassId;
+ ULONG port;
+} SOCKADDR_BTH, *PSOCKADDR_BTH;
+
+typedef struct _BTH_SET_SERVICE {
+ PULONG pSdpVersion;
+ HANDLE *pRecordHandle;
+ ULONG fCodService;
+ ULONG Reserved[5];
+ ULONG ulRecordLength;
+ UCHAR pRecord[1];
+} BTH_SET_SERVICE, *PBTH_SET_SERVICE;
+
+typedef struct _BTH_QUERY_DEVICE {
+ ULONG LAP;
+ UCHAR length;
+} BTH_QUERY_DEVICE, *PBTH_QUERY_DEVICE;
+
+typedef struct _BTH_QUERY_SERVICE {
+ ULONG type;
+ ULONG serviceHandle;
+ SdpQueryUuid uuids[MAX_UUIDS_IN_QUERY];
+ ULONG numRange;
+ SdpAttributeRange pRange[1];
+} BTH_QUERY_SERVICE, *PBTH_QUERY_SERVICE;
+
+typedef struct _RFCOMM_MSC_DATA {
+ UCHAR Signals;
+ UCHAR Break;
+} RFCOMM_MSC_DATA, *PRFCOMM_MSC_DATA;
+
+typedef struct _RFCOMM_RLS_DATA {
+ UCHAR LineStatus;
+} RFCOMM_RLS_DATA, *PRFCOMM_RLS_DATA;
+
+typedef struct _RFCOMM_RPN_DATA {
+ UCHAR Baud;
+ UCHAR Data;
+ UCHAR FlowControl;
+ UCHAR XonChar;
+ UCHAR XoffChar;
+ UCHAR ParameterMask1;
+ UCHAR ParameterMask2;
+} RFCOMM_RPN_DATA, *PRFCOMM_RPN_DATA;
+
+typedef struct _RFCOMM_COMMAND {
+ ULONG CmdType;
+ union {
+ RFCOMM_MSC_DATA MSC;
+ RFCOMM_RLS_DATA RLS;
+ RFCOMM_RPN_DATA RPN;
+ } Data;
+} RFCOMM_COMMAND, *PRFCOMM_COMMAND;
+
+typedef struct _BTH_PING_REQ {
+ BTH_ADDR btAddr;
+ UCHAR dataLen;
+ UCHAR data[MAX_L2CAP_PING_DATA_LENGTH];
+} BTH_PING_REQ, *PBTH_PING_REQ;
+
+typedef struct _BTH_PING_RSP {
+ UCHAR dataLen;
+ UCHAR data[MAX_L2CAP_PING_DATA_LENGTH];
+} BTH_PING_RSP, *PBTH_PING_RSP;
+
+typedef struct _BTH_INFO_REQ {
+ BTH_ADDR btAddr;
+ USHORT infoType;
+} BTH_INFO_REQ, *PBTH_INFO_REQ;
+
+typedef struct _BTH_INFO_RSP {
+ USHORT result;
+ UCHAR dataLen;
+ union {
+ USHORT connectionlessMTU;
+ UCHAR data[MAX_L2CAP_INFO_DATA_LENGTH];
+ };
+} BTH_INFO_RSP, *PBTH_INFO_RSP;
+
+typedef struct _BTH_SET_SERVICE BTHNS_SETBLOB, *PBTHNS_SETBLOB;
+typedef struct _BTH_QUERY_DEVICE BTHNS_INQUIRYBLOB, *PBTHNS_INQUIRYBLOB;
+typedef struct _BTH_QUERY_SERVICE BTHNS_RESTRICTIONBLOB, *PBTHNS_RESTRICTIONBLOB;
+
+#include
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
diff --git a/include/psdk/ws2def.h b/include/psdk/ws2def.h
index 2903596cdb2..081e24daefc 100644
--- a/include/psdk/ws2def.h
+++ b/include/psdk/ws2def.h
@@ -1,15 +1,718 @@
-#ifndef _WS2DEF_
+#pragma once
+
#define _WS2DEF_
#ifdef __cplusplus
extern "C" {
#endif
+#if !defined(_WINSOCK2API_) && defined(_WINSOCKAPI_)
+#error Include only winsock2.h, not both winsock.h and ws2def.h in the same module.
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+#ifdef _MSC_VER
+#define WS2DEF_INLINE __inline
+#else
+#define WS2DEF_INLINE extern inline
+#endif
+
+#endif/* (_WIN32_WINNT >= 0x0600) */
+
+#include
+
+typedef USHORT ADDRESS_FAMILY;
+
+#define AF_UNSPEC 0
+#define AF_UNIX 1
+#define AF_INET 2
+#define AF_IMPLINK 3
+#define AF_PUP 4
+#define AF_CHAOS 5
+#define AF_NS 6
+#define AF_IPX AF_NS
+#define AF_ISO 7
+#define AF_OSI AF_ISO
+#define AF_ECMA 8
+#define AF_DATAKIT 9
+#define AF_CCITT 10
+#define AF_SNA 11
+#define AF_DECnet 12
+#define AF_DLI 13
+#define AF_LAT 14
+#define AF_HYLINK 15
+#define AF_APPLETALK 16
+#define AF_NETBIOS 17
+#define AF_VOICEVIEW 18
+#define AF_FIREFOX 19
+#define AF_UNKNOWN1 20
+#define AF_BAN 21
+#define AF_ATM 22
+#define AF_INET6 23
+#define AF_CLUSTER 24
+#define AF_12844 25
+#define AF_IRDA 26
+#define AF_NETDES 28
+
+#if (_WIN32_WINNT < 0x0501)
+
+#define AF_MAX 29
+
+#else
+
+#define AF_TCNPROCESS 29
+#define AF_TCNMESSAGE 30
+#define AF_ICLFXBM 31
+
+#if(_WIN32_WINNT < 0x0600)
+
+#define AF_MAX 32
+
+#else
+
+#define AF_BTH 32
+#if (_WIN32_WINNT < 0x0601)
+#define AF_MAX 33
+#else
+#define AF_LINK 33
+#define AF_MAX 34
+#endif /* (_WIN32_WINNT < 0x0601) */
+
+#endif /* (_WIN32_WINNT < 0x0600) */
+
+#endif /* (_WIN32_WINNT < 0x0501) */
+
+#define SOCK_STREAM 1
+#define SOCK_DGRAM 2
+#define SOCK_RAW 3
+#define SOCK_RDM 4
+#define SOCK_SEQPACKET 5
+
+#define SOL_SOCKET 0xffff
+
+#define SO_DEBUG 0x0001
+#define SO_ACCEPTCONN 0x0002
+#define SO_REUSEADDR 0x0004
+#define SO_KEEPALIVE 0x0008
+#define SO_DONTROUTE 0x0010
+#define SO_BROADCAST 0x0020
+#define SO_USELOOPBACK 0x0040
+#define SO_LINGER 0x0080
+#define SO_OOBINLINE 0x0100
+
+#define SO_DONTLINGER (int)(~SO_LINGER)
+#define SO_EXCLUSIVEADDRUSE ((int)(~SO_REUSEADDR))
+
+#define SO_SNDBUF 0x1001
+#define SO_RCVBUF 0x1002
+#define SO_SNDLOWAT 0x1003
+#define SO_RCVLOWAT 0x1004
+#define SO_SNDTIMEO 0x1005
+#define SO_RCVTIMEO 0x1006
+#define SO_ERROR 0x1007
+#define SO_TYPE 0x1008
+#define SO_BSP_STATE 0x1009
+
+#define SO_GROUP_ID 0x2001
+#define SO_GROUP_PRIORITY 0x2002
+#define SO_MAX_MSG_SIZE 0x2003
+
+#define SO_CONDITIONAL_ACCEPT 0x3002
+#define SO_PAUSE_ACCEPT 0x3003
+#define SO_COMPARTMENT_ID 0x3004
+#if (_WIN32_WINNT >= 0x0600)
+#define SO_RANDOMIZE_PORT 0x3005
+#define SO_PORT_SCALABILITY 0x3006
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#define WSK_SO_BASE 0x4000
+
+#define TCP_NODELAY 0x0001
+
+#define _SS_MAXSIZE 128
+#define _SS_ALIGNSIZE (sizeof(__int64))
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof(USHORT))
+#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof(USHORT) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
+
+#else
+
+#define _SS_PAD1SIZE (_SS_ALIGNSIZE - sizeof (short))
+#define _SS_PAD2SIZE (_SS_MAXSIZE - (sizeof (short) + _SS_PAD1SIZE + _SS_ALIGNSIZE))
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#define IOC_UNIX 0x00000000
+#define IOC_WS2 0x08000000
+#define IOC_PROTOCOL 0x10000000
+#define IOC_VENDOR 0x18000000
+
+#if (_WIN32_WINNT >= 0x0600)
+#define IOC_WSK (IOC_WS2|0x07000000)
+#endif
+
+#define _WSAIO(x,y) (IOC_VOID|(x)|(y))
+#define _WSAIOR(x,y) (IOC_OUT|(x)|(y))
+#define _WSAIOW(x,y) (IOC_IN|(x)|(y))
+#define _WSAIORW(x,y) (IOC_INOUT|(x)|(y))
+
+#define SIO_ASSOCIATE_HANDLE _WSAIOW(IOC_WS2,1)
+#define SIO_ENABLE_CIRCULAR_QUEUEING _WSAIO(IOC_WS2,2)
+#define SIO_FIND_ROUTE _WSAIOR(IOC_WS2,3)
+#define SIO_FLUSH _WSAIO(IOC_WS2,4)
+#define SIO_GET_BROADCAST_ADDRESS _WSAIOR(IOC_WS2,5)
+#define SIO_GET_EXTENSION_FUNCTION_POINTER _WSAIORW(IOC_WS2,6)
+#define SIO_GET_QOS _WSAIORW(IOC_WS2,7)
+#define SIO_GET_GROUP_QOS _WSAIORW(IOC_WS2,8)
+#define SIO_MULTIPOINT_LOOPBACK _WSAIOW(IOC_WS2,9)
+#define SIO_MULTICAST_SCOPE _WSAIOW(IOC_WS2,10)
+#define SIO_SET_QOS _WSAIOW(IOC_WS2,11)
+#define SIO_SET_GROUP_QOS _WSAIOW(IOC_WS2,12)
+#define SIO_TRANSLATE_HANDLE _WSAIORW(IOC_WS2,13)
+#define SIO_ROUTING_INTERFACE_QUERY _WSAIORW(IOC_WS2,20)
+#define SIO_ROUTING_INTERFACE_CHANGE _WSAIOW(IOC_WS2,21)
+#define SIO_ADDRESS_LIST_QUERY _WSAIOR(IOC_WS2,22)
+#define SIO_ADDRESS_LIST_CHANGE _WSAIO(IOC_WS2,23)
+#define SIO_QUERY_TARGET_PNP_HANDLE _WSAIOR(IOC_WS2,24)
+
+#if(_WIN32_WINNT >= 0x0501)
+#define SIO_ADDRESS_LIST_SORT _WSAIORW(IOC_WS2,25)
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+#define SIO_RESERVED_1 _WSAIOW(IOC_WS2,26)
+#define SIO_RESERVED_2 _WSAIOW(IOC_WS2,33)
+#endif
+
+#define IPPROTO_IP 0
+
+#define IPPORT_TCPMUX 1
+#define IPPORT_ECHO 7
+#define IPPORT_DISCARD 9
+#define IPPORT_SYSTAT 11
+#define IPPORT_DAYTIME 13
+#define IPPORT_NETSTAT 15
+#define IPPORT_QOTD 17
+#define IPPORT_MSP 18
+#define IPPORT_CHARGEN 19
+#define IPPORT_FTP_DATA 20
+#define IPPORT_FTP 21
+#define IPPORT_TELNET 23
+#define IPPORT_SMTP 25
+#define IPPORT_TIMESERVER 37
+#define IPPORT_NAMESERVER 42
+#define IPPORT_WHOIS 43
+#define IPPORT_MTP 57
+
+#define IPPORT_TFTP 69
+#define IPPORT_RJE 77
+#define IPPORT_FINGER 79
+#define IPPORT_TTYLINK 87
+#define IPPORT_SUPDUP 95
+
+#define IPPORT_POP3 110
+#define IPPORT_NTP 123
+#define IPPORT_EPMAP 135
+#define IPPORT_NETBIOS_NS 137
+#define IPPORT_NETBIOS_DGM 138
+#define IPPORT_NETBIOS_SSN 139
+#define IPPORT_IMAP 143
+#define IPPORT_SNMP 161
+#define IPPORT_SNMP_TRAP 162
+#define IPPORT_IMAP3 220
+#define IPPORT_LDAP 389
+#define IPPORT_HTTPS 443
+#define IPPORT_MICROSOFT_DS 445
+#define IPPORT_EXECSERVER 512
+#define IPPORT_LOGINSERVER 513
+#define IPPORT_CMDSERVER 514
+#define IPPORT_EFSSERVER 520
+
+#define IPPORT_BIFFUDP 512
+#define IPPORT_WHOSERVER 513
+#define IPPORT_ROUTESERVER 520
+#define IPPORT_RESERVED 1024
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define IPPORT_REGISTERED_MIN IPPORT_RESERVED
+#define IPPORT_REGISTERED_MAX 0xbfff
+#define IPPORT_DYNAMIC_MIN 0xc000
+#define IPPORT_DYNAMIC_MAX 0xffff
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#define IN_CLASSA(i) (((LONG)(i) & 0x80000000) == 0)
+#define IN_CLASSA_NET 0xff000000
+#define IN_CLASSA_NSHIFT 24
+#define IN_CLASSA_HOST 0x00ffffff
+#define IN_CLASSA_MAX 128
+
+#define IN_CLASSB(i) (((LONG)(i) & 0xc0000000) == 0x80000000)
+#define IN_CLASSB_NET 0xffff0000
+#define IN_CLASSB_NSHIFT 16
+#define IN_CLASSB_HOST 0x0000ffff
+#define IN_CLASSB_MAX 65536
+
+#define IN_CLASSC(i) (((LONG)(i) & 0xe0000000) == 0xc0000000)
+#define IN_CLASSC_NET 0xffffff00
+#define IN_CLASSC_NSHIFT 8
+#define IN_CLASSC_HOST 0x000000ff
+
+#define IN_CLASSD(i) (((long)(i) & 0xf0000000) == 0xe0000000)
+#define IN_CLASSD_NET 0xf0000000
+#define IN_CLASSD_NSHIFT 28
+#define IN_CLASSD_HOST 0x0fffffff
+#define IN_MULTICAST(i) IN_CLASSD(i)
+
+#define INADDR_ANY (ULONG)0x00000000
+#define INADDR_LOOPBACK 0x7f000001
+#define INADDR_BROADCAST (ULONG)0xffffffff
+#define INADDR_NONE 0xffffffff
+
+#define SCOPEID_UNSPECIFIED_INIT {0}
+
+#define IOCPARM_MASK 0x7f
+#define IOC_VOID 0x20000000
+#define IOC_OUT 0x40000000
+#define IOC_IN 0x80000000
+#define IOC_INOUT (IOC_IN|IOC_OUT)
+
+#define _IO(x,y) (IOC_VOID|((x)<<8)|(y))
+#define _IOR(x,y,t) (IOC_OUT|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+#define _IOW(x,y,t) (IOC_IN|(((long)sizeof(t)&IOCPARM_MASK)<<16)|((x)<<8)|(y))
+
+#define MSG_TRUNC 0x0100
+#define MSG_CTRUNC 0x0200
+#define MSG_BCAST 0x0400
+#define MSG_MCAST 0x0800
+
+#define AI_PASSIVE 0x00000001
+#define AI_CANONNAME 0x00000002
+#define AI_NUMERICHOST 0x00000004
+#define AI_NUMERICSERV 0x00000008
+
+#define AI_ALL 0x00000100
+#define AI_ADDRCONFIG 0x00000400
+#define AI_V4MAPPED 0x00000800
+
+#define AI_NON_AUTHORITATIVE 0x00004000
+#define AI_SECURE 0x00008000
+#define AI_RETURN_PREFERRED_NAMES 0x00010000
+
+#define AI_FQDN 0x00020000
+#define AI_FILESERVER 0x00040000
+
+#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
+
+#if(_WIN32_WINNT >= 0x0501)
+#define NS_NLA 15
+#endif
+
+#if(_WIN32_WINNT >= 0x0600)
+#define NS_BTH 16
+#endif
+
+#define NS_NBP 20
+
+#define NS_MS 30
+#define NS_STDA 31
+#define NS_NTDS 32
+
+#if(_WIN32_WINNT >= 0x0600)
+#define NS_EMAIL 37
+#define NS_PNRPNAME 38
+#define NS_PNRPCLOUD 39
+#endif
+
+#define NS_X500 40
+#define NS_NIS 41
+#define NS_NISPLUS 42
+
+#define NS_WRQ 50
+
+#define NS_NETDES 60
+
+#define NI_NOFQDN 0x01
+#define NI_NUMERICHOST 0x02
+#define NI_NAMEREQD 0x04
+#define NI_NUMERICSERV 0x08
+#define NI_DGRAM 0x10
+
+#define NI_MAXHOST 1025
+#define NI_MAXSERV 32
+
+typedef struct sockaddr {
+#if (_WIN32_WINNT < 0x0600)
+ u_short sa_family;
+#else
+ ADDRESS_FAMILY sa_family;
+#endif
+ CHAR sa_data[14];
+} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;
+
+#ifndef __CSADDR_DEFINED__
+#define __CSADDR_DEFINED__
+
+typedef struct _SOCKET_ADDRESS {
+ LPSOCKADDR lpSockaddr;
+ INT iSockaddrLength;
+} SOCKET_ADDRESS, *PSOCKET_ADDRESS, *LPSOCKET_ADDRESS;
+
+typedef struct _SOCKET_ADDRESS_LIST {
+ INT iAddressCount;
+ SOCKET_ADDRESS Address[1];
+} SOCKET_ADDRESS_LIST, *PSOCKET_ADDRESS_LIST, FAR *LPSOCKET_ADDRESS_LIST;
+
+#if (_WIN32_WINNT >= 0x0600)
+#define SIZEOF_SOCKET_ADDRESS_LIST(AddressCount) \
+ (FIELD_OFFSET(SOCKET_ADDRESS_LIST, Address) + \
+ AddressCount * sizeof(SOCKET_ADDRESS))
+#endif
+
+typedef struct _CSADDR_INFO {
+ SOCKET_ADDRESS LocalAddr;
+ SOCKET_ADDRESS RemoteAddr;
+ INT iSocketType;
+ INT iProtocol;
+} CSADDR_INFO, *PCSADDR_INFO, FAR *LPCSADDR_INFO ;
+
+#endif /* __CSADDR_DEFINED__ */
+
+typedef struct sockaddr_storage {
+ ADDRESS_FAMILY ss_family;
+ CHAR __ss_pad1[_SS_PAD1SIZE];
+ __int64 __ss_align;
+ CHAR __ss_pad2[_SS_PAD2SIZE];
+} SOCKADDR_STORAGE_LH, *PSOCKADDR_STORAGE_LH, FAR *LPSOCKADDR_STORAGE_LH;
+
+typedef struct sockaddr_storage_xp {
+ short ss_family;
+ CHAR __ss_pad1[_SS_PAD1SIZE];
+ __int64 __ss_align;
+ CHAR __ss_pad2[_SS_PAD2SIZE];
+} SOCKADDR_STORAGE_XP, *PSOCKADDR_STORAGE_XP, FAR *LPSOCKADDR_STORAGE_XP;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef SOCKADDR_STORAGE_LH SOCKADDR_STORAGE;
+typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
+
+#elif (_WIN32_WINNT >= 0x0501)
+
+typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;
+typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+typedef enum {
+#if (_WIN32_WINNT >= 0x0501)
+ IPPROTO_HOPOPTS = 0,
+#endif
+ IPPROTO_ICMP = 1,
+ IPPROTO_IGMP = 2,
+ IPPROTO_GGP = 3,
+#if (_WIN32_WINNT >= 0x0501)
+ IPPROTO_IPV4 = 4,
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_ST = 5,
+#endif
+ IPPROTO_TCP = 6,
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_CBT = 7,
+ IPPROTO_EGP = 8,
+ IPPROTO_IGP = 9,
+#endif
+ IPPROTO_PUP = 12,
+ IPPROTO_UDP = 17,
+ IPPROTO_IDP = 22,
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_RDP = 27,
+#endif
+#if (_WIN32_WINNT >= 0x0501)
+ IPPROTO_IPV6 = 41,
+ IPPROTO_ROUTING = 43,
+ IPPROTO_FRAGMENT = 44,
+ IPPROTO_ESP = 50,
+ IPPROTO_AH = 51,
+ IPPROTO_ICMPV6 = 58,
+ IPPROTO_NONE = 59,
+ IPPROTO_DSTOPTS = 60,
+#endif /* (_WIN32_WINNT >= 0x0501) */
+ IPPROTO_ND = 77,
+#if(_WIN32_WINNT >= 0x0501)
+ IPPROTO_ICLFXBM = 78,
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+ IPPROTO_PIM = 103,
+ IPPROTO_PGM = 113,
+ IPPROTO_L2TP = 115,
+ IPPROTO_SCTP = 132,
+#endif /* (_WIN32_WINNT >= 0x0600) */
+ IPPROTO_RAW = 255,
+ IPPROTO_MAX = 256,
+ IPPROTO_RESERVED_RAW = 257,
+ IPPROTO_RESERVED_IPSEC = 258,
+ IPPROTO_RESERVED_IPSECOFFLOAD = 259,
+ IPPROTO_RESERVED_MAX = 260
+} IPPROTO, *PIPROTO;
+
+typedef enum {
+ ScopeLevelInterface = 1,
+ ScopeLevelLink = 2,
+ ScopeLevelSubnet = 3,
+ ScopeLevelAdmin = 4,
+ ScopeLevelSite = 5,
+ ScopeLevelOrganization = 8,
+ ScopeLevelGlobal = 14,
+ ScopeLevelCount = 16
+} SCOPE_LEVEL;
+
+typedef struct {
+ union {
+ struct {
+ ULONG Zone:28;
+ ULONG Level:4;
+ };
+ ULONG Value;
+ };
+} SCOPE_ID, *PSCOPE_ID;
+
+typedef struct sockaddr_in {
+#if(_WIN32_WINNT < 0x0600)
+ short sin_family;
+#else
+ ADDRESS_FAMILY sin_family;
+#endif
+ USHORT sin_port;
+ IN_ADDR sin_addr;
+ CHAR sin_zero[8];
+} SOCKADDR_IN, *PSOCKADDR_IN;
+
+#if(_WIN32_WINNT >= 0x0601)
+typedef struct sockaddr_dl {
+ ADDRESS_FAMILY sdl_family;
+ UCHAR sdl_data[8];
+ UCHAR sdl_zero[4];
+} SOCKADDR_DL, *PSOCKADDR_DL;
+#endif
+
+typedef struct _WSABUF {
+ ULONG len;
+ CHAR FAR *buf;
+} WSABUF, FAR * LPWSABUF;
+
+typedef struct _WSAMSG {
+ LPSOCKADDR name;
+ INT namelen;
+ LPWSABUF lpBuffers;
+#if (_WIN32_WINNT >= 0x0600)
+ ULONG dwBufferCount;
+#else
+ DWORD dwBufferCount;
+#endif
+ WSABUF Control;
+#if (_WIN32_WINNT >= 0x0600)
+ ULONG dwFlags;
+#else
+ DWORD dwFlags;
+#endif
+} WSAMSG, *PWSAMSG, *FAR LPWSAMSG;
+
+#if (_WIN32_WINNT >= 0x0600)
+#define _WSACMSGHDR cmsghdr
+#endif
+
+typedef struct _WSACMSGHDR {
+ SIZE_T cmsg_len;
+ INT cmsg_level;
+ INT cmsg_type;
+} WSACMSGHDR, *PWSACMSGHDR, FAR *LPWSACMSGHDR;
+
+#if (_WIN32_WINNT >= 0x0600)
+typedef WSACMSGHDR CMSGHDR, *PCMSGHDR;
+#endif
+
+#define WSA_CMSGHDR_ALIGN(length) (((length) + TYPE_ALIGNMENT(WSACMSGHDR)-1) & \
+ (~(TYPE_ALIGNMENT(WSACMSGHDR)-1)))
+
+#define WSA_CMSGDATA_ALIGN(length) (((length) + MAX_NATURAL_ALIGNMENT-1) & \
+ (~(MAX_NATURAL_ALIGNMENT-1)))
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSGHDR_ALIGN WSA_CMSGHDR_ALIGN
+#define CMSGDATA_ALIGN WSA_CMSGDATA_ALIGN
+#endif
+
+/*
+ * WSA_CMSG_FIRSTHDR
+ *
+ * Returns a pointer to the first ancillary data object,
+ * or a null pointer if there is no ancillary data in the
+ * control buffer of the WSAMSG structure.
+ *
+ * LPCMSGHDR
+ * WSA_CMSG_FIRSTHDR (
+ * LPWSAMSG msg
+ * );
+ */
+#define WSA_CMSG_FIRSTHDR(msg) (((msg)->Control.len >= sizeof(WSACMSGHDR)) \
+ ? (LPWSACMSGHDR)(msg)->Control.buf \
+ : (LPWSACMSGHDR)NULL)
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
+#endif
+
+/*
+ * WSA_CMSG_NXTHDR
+ *
+ * Returns a pointer to the next ancillary data object,
+ * or a null if there are no more data objects.
+ *
+ * LPCMSGHDR
+ * WSA_CMSG_NEXTHDR (
+ * LPWSAMSG msg,
+ * LPWSACMSGHDR cmsg
+ * );
+ */
+#define WSA_CMSG_NXTHDR(msg, cmsg) \
+ ( ((cmsg) == NULL) \
+ ? WSA_CMSG_FIRSTHDR(msg) \
+ : ( ( ((PUCHAR)(cmsg) + \
+ WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + \
+ sizeof(WSACMSGHDR) ) > \
+ (PUCHAR)((msg)->Control.buf) + \
+ (msg)->Control.len ) \
+ ? (LPWSACMSGHDR)NULL \
+ : (LPWSACMSGHDR)((PUCHAR)(cmsg) + \
+ WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len)) ) )
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_NXTHDR WSA_CMSG_NXTHDR
+#endif
+
+/*
+ * WSA_CMSG_DATA
+ *
+ * Returns a pointer to the first byte of data (what is referred
+ * to as the cmsg_data member though it is not defined in
+ * the structure).
+ *
+ * Note that RFC 2292 defines this as CMSG_DATA, but that name
+ * is already used by wincrypt.h, and so Windows has used WSA_CMSG_DATA.
+ *
+ * PUCHAR
+ * WSA_CMSG_DATA (
+ * LPWSACMSGHDR pcmsg
+ * );
+ */
+#define WSA_CMSG_DATA(cmsg) ((PUCHAR)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)))
+
+/*
+ * WSA_CMSG_SPACE
+ *
+ * Returns total size of an ancillary data object given
+ * the amount of data. Used to allocate the correct amount
+ * of space.
+ *
+ * SIZE_T
+ * WSA_CMSG_SPACE (
+ * SIZE_T length
+ * );
+ */
+#define WSA_CMSG_SPACE(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_SPACE WSA_CMSG_SPACE
+#endif
+
+/*
+ * WSA_CMSG_LEN
+ *
+ * Returns the value to store in cmsg_len given the amount of data.
+ *
+ * SIZE_T
+ * WSA_CMSG_LEN (
+ * SIZE_T length
+ * );
+ */
+#define WSA_CMSG_LEN(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
+
+#if(_WIN32_WINNT >= 0x0600)
+#define CMSG_LEN WSA_CMSG_LEN
+#endif
+
+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;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef struct addrinfoexA {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ char *ai_canonname;
+ struct sockaddr *ai_addr;
+ void *ai_blob;
+ size_t ai_bloblen;
+ LPGUID ai_provider;
+ struct addrinfoexA *ai_next;
+} ADDRINFOEXA, *PADDRINFOEXA, *LPADDRINFOEXA;
+
+typedef struct addrinfoexW {
+ int ai_flags;
+ int ai_family;
+ int ai_socktype;
+ int ai_protocol;
+ size_t ai_addrlen;
+ PWSTR ai_canonname;
+ struct sockaddr *ai_addr;
+ void *ai_blob;
+ size_t ai_bloblen;
+ LPGUID ai_provider;
+ struct addrinfoexW *ai_next;
+} ADDRINFOEXW, *PADDRINFOEXW, *LPADDRINFOEXW;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
#ifdef __cplusplus
}
#endif
-
-#endif
diff --git a/include/psdk/ws2ipdef.h b/include/psdk/ws2ipdef.h
index 5bb88b797b7..f7b6c4d1ccd 100644
--- a/include/psdk/ws2ipdef.h
+++ b/include/psdk/ws2ipdef.h
@@ -1,15 +1,593 @@
-#ifndef _WS2IPDEF_
+#pragma once
+
#define _WS2IPDEF_
#ifdef __cplusplus
extern "C" {
#endif
+#ifndef WS2IPDEF_ASSERT
+#define WS2IPDEF_ASSERT(exp) ((VOID) 0)
+#endif
+#ifdef _MSC_VER
+#define WS2TCPIP_INLINE __inline
+#else
+#define WS2TCPIP_INLINE extern inline
+#endif
+#include
+
+#define IFF_UP 0x00000001
+#define IFF_BROADCAST 0x00000002
+#define IFF_LOOPBACK 0x00000004
+#define IFF_POINTTOPOINT 0x00000008
+#define IFF_MULTICAST 0x00000010
+
+#define IP_OPTIONS 1
+#define IP_HDRINCL 2
+#define IP_TOS 3
+#define IP_TTL 4
+#define IP_MULTICAST_IF 9
+#define IP_MULTICAST_TTL 10
+#define IP_MULTICAST_LOOP 11
+#define IP_ADD_MEMBERSHIP 12
+#define IP_DROP_MEMBERSHIP 13
+#define IP_DONTFRAGMENT 14
+#define IP_ADD_SOURCE_MEMBERSHIP 15
+#define IP_DROP_SOURCE_MEMBERSHIP 16
+#define IP_BLOCK_SOURCE 17
+#define IP_UNBLOCK_SOURCE 18
+#define IP_PKTINFO 19
+#define IP_HOPLIMIT 21
+#define IP_RECEIVE_BROADCAST 22
+#define IP_RECVIF 24
+#define IP_RECVDSTADDR 25
+#define IP_IFLIST 28
+#define IP_ADD_IFLIST 29
+#define IP_DEL_IFLIST 30
+#define IP_UNICAST_IF 31
+#define IP_RTHDR 32
+#define IP_RECVRTHDR 38
+#define IP_TCLASS 39
+#define IP_RECVTCLASS 40
+#define IP_ORIGINAL_ARRIVAL_IF 47
+
+#define IP_UNSPECIFIED_TYPE_OF_SERVICE -1
+
+#define IPV6_ADDRESS_BITS RTL_BITS_OF(IN6_ADDR)
+
+#define SS_PORT(ssp) (((PSOCKADDR_IN)(ssp))->sin_port)
+
+#define SIO_GET_INTERFACE_LIST _IOR('t', 127, ULONG)
+#define SIO_GET_INTERFACE_LIST_EX _IOR('t', 126, ULONG)
+#define SIO_SET_MULTICAST_FILTER _IOW('t', 125, ULONG)
+#define SIO_GET_MULTICAST_FILTER _IOW('t', 124 | IOC_IN, ULONG)
+#define SIOCSIPMSFILTER SIO_SET_MULTICAST_FILTER
+#define SIOCGIPMSFILTER SIO_GET_MULTICAST_FILTER
+
+#define SIOCSMSFILTER _IOW('t', 126, ULONG)
+#define SIOCGMSFILTER _IOW('t', 127 | IOC_IN, ULONG)
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+
+#define IDEAL_SEND_BACKLOG_IOCTLS
+
+#define SIO_IDEAL_SEND_BACKLOG_QUERY _IOR('t', 123, ULONG)
+#define SIO_IDEAL_SEND_BACKLOG_CHANGE _IO('t', 122)
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
+
+#define MCAST_JOIN_GROUP 41
+#define MCAST_LEAVE_GROUP 42
+#define MCAST_BLOCK_SOURCE 43
+#define MCAST_UNBLOCK_SOURCE 44
+#define MCAST_JOIN_SOURCE_GROUP 45
+#define MCAST_LEAVE_SOURCE_GROUP 46
+
+#define IP_MSFILTER_SIZE(NumSources) \
+ (sizeof(IP_MSFILTER) - sizeof(IN_ADDR) + (NumSources) * sizeof(IN_ADDR))
+
+#define IPV6_HOPOPTS 1
+#define IPV6_HDRINCL 2
+#define IPV6_UNICAST_HOPS 4
+#define IPV6_MULTICAST_IF 9
+#define IPV6_MULTICAST_HOPS 10
+#define IPV6_MULTICAST_LOOP 11
+#define IPV6_ADD_MEMBERSHIP 12
+#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
+#define IPV6_DROP_MEMBERSHIP 13
+#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP
+#define IPV6_DONTFRAG 14
+#define IPV6_PKTINFO 19
+#define IPV6_HOPLIMIT 21
+#define IPV6_PROTECTION_LEVEL 23
+#define IPV6_RECVIF 24
+#define IPV6_RECVDSTADDR 25
+#define IPV6_CHECKSUM 26
+#define IPV6_V6ONLY 27
+#define IPV6_IFLIST 28
+#define IPV6_ADD_IFLIST 29
+#define IPV6_DEL_IFLIST 30
+#define IPV6_UNICAST_IF 31
+#define IPV6_RTHDR 32
+#define IPV6_RECVRTHDR 38
+#define IPV6_TCLASS 39
+#define IPV6_RECVTCLASS 40
+
+#define IP_UNSPECIFIED_HOP_LIMIT -1
+
+#define IP_PROTECTION_LEVEL IPV6_PROTECTION_LEVEL
+#define PROTECTION_LEVEL_UNRESTRICTED 10
+#define PROTECTION_LEVEL_EDGERESTRICTED 20
+#define PROTECTION_LEVEL_RESTRICTED 30
+
+#if (NTDDI_VERSION < NTDDI_VISTA)
+#define PROTECTION_LEVEL_DEFAULT PROTECTION_LEVEL_EDGERESTRICTED
+#else
+#define PROTECTION_LEVEL_DEFAULT ((UINT)-1)
+#endif
+
+#define INET_ADDRSTRLEN 22
+#define INET6_ADDRSTRLEN 65
+
+#define TCP_OFFLOAD_NO_PREFERENCE 0
+#define TCP_OFFLOAD_NOT_PREFERRED 1
+#define TCP_OFFLOAD_PREFERRED 2
+
+#define TCP_EXPEDITED_1122 0x0002
+#define TCP_KEEPALIVE 3
+#define TCP_MAXSEG 4
+#define TCP_MAXRT 5
+#define TCP_STDURG 6
+#define TCP_NOURG 7
+#define TCP_ATMARK 8
+#define TCP_NOSYNRETRIES 9
+#define TCP_TIMESTAMPS 10
+#define TCP_OFFLOAD_PREFERENCE 11
+#define TCP_CONGESTION_ALGORITHM 12
+#define TCP_DELAY_FIN_ACK 13
+
+struct sockaddr_in6_old {
+ SHORT sin6_family;
+ USHORT sin6_port;
+ ULONG sin6_flowinfo;
+ IN6_ADDR sin6_addr;
+};
+
+typedef union sockaddr_gen {
+ struct sockaddr Address;
+ struct sockaddr_in AddressIn;
+ struct sockaddr_in6_old AddressIn6;
+} sockaddr_gen;
+
+typedef struct _INTERFACE_INFO {
+ ULONG iiFlags;
+ sockaddr_gen iiAddress;
+ sockaddr_gen iiBroadcastAddress;
+ sockaddr_gen iiNetmask;
+} INTERFACE_INFO, FAR *LPINTERFACE_INFO;
+
+typedef struct _INTERFACE_INFO_EX {
+ ULONG iiFlags;
+ SOCKET_ADDRESS iiAddress;
+ SOCKET_ADDRESS iiBroadcastAddress;
+ SOCKET_ADDRESS iiNetmask;
+} INTERFACE_INFO_EX, FAR *LPINTERFACE_INFO_EX;
+
+typedef struct sockaddr_in6 {
+ ADDRESS_FAMILY sin6_family;
+ USHORT sin6_port;
+ ULONG sin6_flowinfo;
+ IN6_ADDR sin6_addr;
+ union {
+ ULONG sin6_scope_id;
+ SCOPE_ID sin6_scope_struct;
+ };
+} SOCKADDR_IN6_LH, *PSOCKADDR_IN6_LH, FAR *LPSOCKADDR_IN6_LH;
+
+typedef struct sockaddr_in6_w2ksp1 {
+ short sin6_family;
+ USHORT sin6_port;
+ ULONG sin6_flowinfo;
+ struct in6_addr sin6_addr;
+ ULONG sin6_scope_id;
+} SOCKADDR_IN6_W2KSP1, *PSOCKADDR_IN6_W2KSP1, FAR *LPSOCKADDR_IN6_W2KSP1;
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef SOCKADDR_IN6_LH SOCKADDR_IN6;
+typedef SOCKADDR_IN6_LH *PSOCKADDR_IN6;
+typedef SOCKADDR_IN6_LH FAR *LPSOCKADDR_IN6;
+
+#elif(NTDDI_VERSION >= NTDDI_WIN2KSP1)
+
+typedef SOCKADDR_IN6_W2KSP1 SOCKADDR_IN6;
+typedef SOCKADDR_IN6_W2KSP1 *PSOCKADDR_IN6;
+typedef SOCKADDR_IN6_W2KSP1 FAR *LPSOCKADDR_IN6;
+
+#else
+
+typedef SOCKADDR_IN6_LH SOCKADDR_IN6;
+typedef SOCKADDR_IN6_LH *PSOCKADDR_IN6;
+typedef SOCKADDR_IN6_LH FAR *LPSOCKADDR_IN6;
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+typedef union _SOCKADDR_INET {
+ SOCKADDR_IN Ipv4;
+ SOCKADDR_IN6 Ipv6;
+ ADDRESS_FAMILY si_family;
+} SOCKADDR_INET, *PSOCKADDR_INET;
+
+typedef struct _sockaddr_in6_pair {
+ PSOCKADDR_IN6 SourceAddress;
+ PSOCKADDR_IN6 DestinationAddress;
+} SOCKADDR_IN6_PAIR, *PSOCKADDR_IN6_PAIR;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP1)
+
+#define IN6ADDR_ANY_INIT {0}
+#define IN6ADDR_LOOPBACK_INIT {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1}
+#define IN6ADDR_ALLNODESONNODE_INIT {0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
+#define IN6ADDR_ALLNODESONLINK_INIT {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}
+#define IN6ADDR_ALLROUTERSONLINK_INIT {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}
+#define IN6ADDR_ALLMLDV2ROUTERSONLINK_INIT {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16}
+#define IN6ADDR_TEREDOINITIALLINKLOCALADDRESS_INIT {0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe}
+#define IN6ADDR_TEREDOOLDLINKLOCALADDRESSXP_INIT {0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 'T', 'E', 'R', 'E', 'D', 'O'}
+#define IN6ADDR_TEREDOOLDLINKLOCALADDRESSVISTA_INIT {0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
+#define IN6ADDR_LINKLOCALPREFIX_INIT {0xfe, 0x80, }
+#define IN6ADDR_MULTICASTPREFIX_INIT {0xff, 0x00, }
+#define IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_INIT {0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, }
+#define IN6ADDR_V4MAPPEDPREFIX_INIT {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, }
+#define IN6ADDR_6TO4PREFIX_INIT {0x20, 0x02, }
+#define IN6ADDR_TEREDOPREFIX_INIT {0x20, 0x01, 0x00, 0x00, }
+#define IN6ADDR_TEREDOPREFIX_INIT_OLD {0x3f, 0xfe, 0x83, 0x1f, }
+
+#define IN6ADDR_LINKLOCALPREFIX_LENGTH 64
+#define IN6ADDR_MULTICASTPREFIX_LENGTH 8
+#define IN6ADDR_SOLICITEDNODEMULTICASTPREFIX_LENGTH 104
+#define IN6ADDR_V4MAPPEDPREFIX_LENGTH 96
+#define IN6ADDR_6TO4PREFIX_LENGTH 16
+#define IN6ADDR_TEREDOPREFIX_LENGTH 32
+
+extern CONST SCOPE_ID scopeid_unspecified;
+
+extern CONST IN_ADDR in4addr_any;
+extern CONST IN_ADDR in4addr_loopback;
+extern CONST IN_ADDR in4addr_broadcast;
+extern CONST IN_ADDR in4addr_allnodesonlink;
+extern CONST IN_ADDR in4addr_allroutersonlink;
+extern CONST IN_ADDR in4addr_alligmpv3routersonlink;
+extern CONST IN_ADDR in4addr_allteredohostsonlink;
+extern CONST IN_ADDR in4addr_linklocalprefix;
+extern CONST IN_ADDR in4addr_multicastprefix;
+
+extern CONST IN6_ADDR in6addr_any;
+extern CONST IN6_ADDR in6addr_loopback;
+extern CONST IN6_ADDR in6addr_allnodesonnode;
+extern CONST IN6_ADDR in6addr_allnodesonlink;
+extern CONST IN6_ADDR in6addr_allroutersonlink;
+extern CONST IN6_ADDR in6addr_allmldv2routersonlink;
+extern CONST IN6_ADDR in6addr_teredoinitiallinklocaladdress;
+extern CONST IN6_ADDR in6addr_linklocalprefix;
+extern CONST IN6_ADDR in6addr_multicastprefix;
+extern CONST IN6_ADDR in6addr_solicitednodemulticastprefix;
+extern CONST IN6_ADDR in6addr_v4mappedprefix;
+extern CONST IN6_ADDR in6addr_6to4prefix;
+extern CONST IN6_ADDR in6addr_teredoprefix;
+extern CONST IN6_ADDR in6addr_teredoprefix_old;
+
+#ifndef __midl
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_ADDR_EQUAL(CONST IN6_ADDR *x, CONST IN6_ADDR *y) {
+ __int64 UNALIGNED *a;
+ __int64 UNALIGNED *b;
+
+ a = (__int64 UNALIGNED *)x;
+ b = (__int64 UNALIGNED *)y;
+ return (BOOLEAN)((a[1] == b[1]) && (a[0] == b[0]));
+}
+
+#define IN6_ARE_ADDR_EQUAL IN6_ADDR_EQUAL
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_UNSPECIFIED(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_words[0] == 0) &&
+ (a->s6_words[1] == 0) &&
+ (a->s6_words[2] == 0) &&
+ (a->s6_words[3] == 0) &&
+ (a->s6_words[4] == 0) &&
+ (a->s6_words[5] == 0) &&
+ (a->s6_words[6] == 0) &&
+ (a->s6_words[7] == 0));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_LOOPBACK(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_words[0] == 0) &&
+ (a->s6_words[1] == 0) &&
+ (a->s6_words[2] == 0) &&
+ (a->s6_words[3] == 0) &&
+ (a->s6_words[4] == 0) &&
+ (a->s6_words[5] == 0) &&
+ (a->s6_words[6] == 0) &&
+ (a->s6_words[7] == 0x0100));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_MULTICAST(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(a->s6_bytes[0] == 0xff);
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_EUI64(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(((a->s6_bytes[0] & 0xe0) != 0) &&
+ !IN6_IS_ADDR_MULTICAST(a));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_EUI64(a) &&
+ (a->s6_words[4] == 0) &&
+ (a->s6_words[5] == 0) &&
+ (a->s6_words[6] == 0) &&
+ (a->s6_words[7] == 0));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_EUI64(a) &&
+ (a->s6_words[4] == 0xfffd) &&
+ (a->s6_words[5] == 0xffff) &&
+ (a->s6_words[6] == 0xffff) &&
+ ((a->s6_words[7] & 0x80ff) == 0x80ff));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_ANYCAST(CONST IN6_ADDR *a) {
+ return (IN6_IS_ADDR_SUBNET_RESERVED_ANYCAST(a) ||
+ IN6_IS_ADDR_SUBNET_ROUTER_ANYCAST(a));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_LINKLOCAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_bytes[0] == 0xfe) &&
+ ((a->s6_bytes[1] & 0xc0) == 0x80));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_SITELOCAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_bytes[0] == 0xfe) &&
+ ((a->s6_bytes[1] & 0xc0) == 0xc0));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_GLOBAL(CONST IN6_ADDR *a) {
+ ULONG High = (a->s6_bytes[0] & 0xf0);
+ return (BOOLEAN)((High != 0) && (High != 0xf0));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_V4MAPPED(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_words[0] == 0) &&
+ (a->s6_words[1] == 0) &&
+ (a->s6_words[2] == 0) &&
+ (a->s6_words[3] == 0) &&
+ (a->s6_words[4] == 0) &&
+ (a->s6_words[5] == 0xffff));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_V4COMPAT(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_words[0] == 0) &&
+ (a->s6_words[1] == 0) &&
+ (a->s6_words[2] == 0) &&
+ (a->s6_words[3] == 0) &&
+ (a->s6_words[4] == 0) &&
+ (a->s6_words[5] == 0) &&
+ !((a->s6_words[6] == 0) &&
+ (a->s6_addr[14] == 0) &&
+ ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1))));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_V4TRANSLATED(CONST IN6_ADDR *a) {
+ return (BOOLEAN)((a->s6_words[0] == 0) &&
+ (a->s6_words[1] == 0) &&
+ (a->s6_words[2] == 0) &&
+ (a->s6_words[3] == 0) &&
+ (a->s6_words[4] == 0xffff) &&
+ (a->s6_words[5] == 0));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_MC_NODELOCAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_MULTICAST(a) &&
+ ((a->s6_bytes[1] & 0xf) == 1));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_MC_LINKLOCAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_MULTICAST(a) &&
+ ((a->s6_bytes[1] & 0xf) == 2));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_MC_SITELOCAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_MULTICAST(a) &&
+ ((a->s6_bytes[1] & 0xf) == 5));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_MC_ORGLOCAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_MULTICAST(a) &&
+ ((a->s6_bytes[1] & 0xf) == 8));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6_IS_ADDR_MC_GLOBAL(CONST IN6_ADDR *a) {
+ return (BOOLEAN)(IN6_IS_ADDR_MULTICAST(a) &&
+ ((a->s6_bytes[1] & 0xf) == 0xe));
+}
+
+WS2TCPIP_INLINE
+VOID
+IN6_SET_ADDR_UNSPECIFIED(PIN6_ADDR a) {
+ memset(a->s6_bytes, 0, sizeof(IN6_ADDR));
+}
+
+WS2TCPIP_INLINE
+VOID
+IN6_SET_ADDR_LOOPBACK(PIN6_ADDR a) {
+ memset(a->s6_bytes, 0, sizeof(IN6_ADDR));
+ a->s6_bytes[15] = 1;
+}
+
+WS2TCPIP_INLINE
+VOID
+IN6ADDR_SETANY(PSOCKADDR_IN6 a) {
+ a->sin6_family = AF_INET6;
+ a->sin6_port = 0;
+ a->sin6_flowinfo = 0;
+ IN6_SET_ADDR_UNSPECIFIED(&a->sin6_addr);
+ a->sin6_scope_id = 0;
+}
+
+WS2TCPIP_INLINE
+VOID
+IN6ADDR_SETLOOPBACK(PSOCKADDR_IN6 a) {
+ a->sin6_family = AF_INET6;
+ a->sin6_port = 0;
+ a->sin6_flowinfo = 0;
+ IN6_SET_ADDR_LOOPBACK(&a->sin6_addr);
+ a->sin6_scope_id = 0;
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISANY(CONST SOCKADDR_IN6 *a) {
+ WS2IPDEF_ASSERT(a->sin6_family == AF_INET6);
+ return IN6_IS_ADDR_UNSPECIFIED(&a->sin6_addr);
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISLOOPBACK(CONST SOCKADDR_IN6 *a) {
+ WS2IPDEF_ASSERT(a->sin6_family == AF_INET6);
+ return IN6_IS_ADDR_LOOPBACK(&a->sin6_addr);
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISEQUAL(CONST SOCKADDR_IN6 *a, CONST SOCKADDR_IN6 *b) {
+ WS2IPDEF_ASSERT(a->sin6_family == AF_INET6);
+ return (BOOLEAN)(a->sin6_scope_id == b->sin6_scope_id &&
+ IN6_ADDR_EQUAL(&a->sin6_addr, &b->sin6_addr));
+}
+
+WS2TCPIP_INLINE
+BOOLEAN
+IN6ADDR_ISUNSPECIFIED(CONST SOCKADDR_IN6 *a) {
+ WS2IPDEF_ASSERT(a->sin6_family == AF_INET6);
+ return (BOOLEAN)(a->sin6_scope_id == 0 &&
+ IN6_IS_ADDR_UNSPECIFIED(&a->sin6_addr));
+}
+
+#endif /* __midl */
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP1) */
+
+typedef enum _MULTICAST_MODE_TYPE {
+ MCAST_INCLUDE = 0,
+ MCAST_EXCLUDE
+} MULTICAST_MODE_TYPE;
+
+typedef struct ip_mreq {
+ IN_ADDR imr_multiaddr;
+ IN_ADDR imr_interface;
+} IP_MREQ, *PIP_MREQ;
+
+typedef struct ip_mreq_source {
+ IN_ADDR imr_multiaddr;
+ IN_ADDR imr_sourceaddr;
+ IN_ADDR imr_interface;
+} IP_MREQ_SOURCE, *PIP_MREQ_SOURCE;
+
+typedef struct ip_msfilter {
+ IN_ADDR imsf_multiaddr;
+ IN_ADDR imsf_interface;
+ MULTICAST_MODE_TYPE imsf_fmode;
+ ULONG imsf_numsrc;
+ IN_ADDR imsf_slist[1];
+} IP_MSFILTER, *PIP_MSFILTER;
+
+typedef struct ipv6_mreq {
+ IN6_ADDR ipv6mr_multiaddr;
+ ULONG ipv6mr_interface;
+} IPV6_MREQ, *PIPV6_MREQ;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef struct group_req {
+ ULONG gr_interface;
+ SOCKADDR_STORAGE gr_group;
+} GROUP_REQ, *PGROUP_REQ;
+
+typedef struct group_source_req {
+ ULONG gsr_interface;
+ SOCKADDR_STORAGE gsr_group;
+ SOCKADDR_STORAGE gsr_source;
+} GROUP_SOURCE_REQ, *PGROUP_SOURCE_REQ;
+
+typedef struct group_filter {
+ ULONG gf_interface;
+ SOCKADDR_STORAGE gf_group;
+ MULTICAST_MODE_TYPE gf_fmode;
+ ULONG gf_numsrc;
+ SOCKADDR_STORAGE gf_slist[1];
+} GROUP_FILTER, *PGROUP_FILTER;
+
+#define GROUP_FILTER_SIZE(numsrc) \
+ (sizeof(GROUP_FILTER) - sizeof(SOCKADDR_STORAGE) \
+ + (numsrc) * sizeof(SOCKADDR_STORAGE))
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+typedef struct in_pktinfo {
+ IN_ADDR ipi_addr;
+ ULONG ipi_ifindex;
+} IN_PKTINFO, *PIN_PKTINFO;
+
+C_ASSERT(sizeof(IN_PKTINFO) == 8);
+
+typedef struct in6_pktinfo {
+ IN6_ADDR ipi6_addr;
+ ULONG ipi6_ifindex;
+} IN6_PKTINFO, *PIN6_PKTINFO;
+
+C_ASSERT(sizeof(IN6_PKTINFO) == 20);
#ifdef __cplusplus
}
#endif
-
-#endif
diff --git a/include/psdk/ws2spi.h b/include/psdk/ws2spi.h
index c34e0b85585..3126c22b385 100644
--- a/include/psdk/ws2spi.h
+++ b/include/psdk/ws2spi.h
@@ -15,69 +15,439 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
*/
-#ifndef _WS2SPI_H
+#pragma once
+
#define _WS2SPI_H
+#ifndef _WINSOCK2API_
#include
+#endif
#ifdef __cplusplus
extern "C" {
-#endif /* __cplusplus */
+#endif
+
+#if !defined(_WIN64)
+#include
+#endif
-#define WSPAPI WSAAPI
#define WSPDESCRIPTION_LEN 255
-#ifndef RC_INVOKED
+#define WSS_OPERATION_IN_PROGRESS 0x00000103L
+
+#define WSPAPI WSAAPI
-typedef struct WSPData {
- WORD wVersion;
- WORD wHighVersion;
- WCHAR szDescription[WSPDESCRIPTION_LEN+1];
-} WSPDATA, FAR *LPWSPDATA;
typedef struct _WSATHREADID {
- HANDLE ThreadHandle;
- DWORD Reserved;
+ HANDLE ThreadHandle;
+ DWORD_PTR Reserved;
} WSATHREADID, FAR *LPWSATHREADID;
-typedef BOOL (CALLBACK FAR *LPBLOCKINGCALLBACK)(DWORD);
-typedef VOID (CALLBACK FAR *LPWSAUSERAPC)(DWORD);
+typedef struct WSPData {
+ WORD wVersion;
+ WORD wHighVersion;
+ WCHAR szDescription[WSPDESCRIPTION_LEN+1];
+} WSPDATA, FAR *LPWSPDATA;
-/* Prototypes for service provider procedure table */
-typedef SOCKET (WSPAPI *LPWSPACCEPT)(SOCKET,LPSOCKADDR,LPINT,LPCONDITIONPROC,DWORD,LPINT);
-typedef INT (WSPAPI *LPWSPADDRESSTOSTRING)(LPSOCKADDR,DWORD,LPWSAPROTOCOL_INFOW,LPWSTR,LPDWORD,LPINT);
-typedef INT (WSPAPI *LPWSPASYNCSELECT)(SOCKET,HWND,UINT,LONG,LPINT);
-typedef INT (WSPAPI *LPWSPBIND)(SOCKET,const struct sockaddr*,INT,LPINT);
-typedef INT (WSPAPI *LPWSPCANCELBLOCKINGCALL)(LPINT);
-typedef INT (WSPAPI *LPWSPCLEANUP)(LPINT);
-typedef INT (WSPAPI *LPWSPCLOSESOCKET)(SOCKET,LPINT);
-typedef INT (WSPAPI *LPWSPCONNECT)(SOCKET,const struct sockaddr*,INT,LPWSABUF,LPWSABUF,LPQOS,LPQOS,LPINT);
-typedef INT (WSPAPI *LPWSPDUPLICATESOCKET)(SOCKET,DWORD,LPWSAPROTOCOL_INFOW,LPINT);
-typedef INT (WSPAPI *LPWSPENUMNETWORKEVENTS)(SOCKET,WSAEVENT,LPWSANETWORKEVENTS,LPINT);
-typedef INT (WSPAPI *LPWSPEVENTSELECT)(SOCKET,WSAEVENT,LONG,LPINT);
-typedef BOOL (WSPAPI *LPWSPGETOVERLAPPEDRESULT)(SOCKET,LPWSAOVERLAPPED,LPDWORD,BOOL,LPDWORD,LPINT);
-typedef INT (WSPAPI *LPWSPGETPEERNAME)(SOCKET,LPSOCKADDR,LPINT,LPINT);
-typedef BOOL (WSPAPI *LPWSPGETQOSBYNAME)(SOCKET,LPWSABUF,LPQOS,LPINT);
-typedef INT (WSPAPI *LPWSPGETSOCKNAME)(SOCKET,LPSOCKADDR,LPINT,LPINT);
-typedef INT (WSPAPI *LPWSPGETSOCKOPT)(SOCKET,INT,INT,CHAR FAR*,LPINT,LPINT);
-typedef INT (WSPAPI *LPWSPIOCTL)(SOCKET,DWORD,LPVOID,DWORD,LPVOID,DWORD,LPDWORD,
- LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT);
-typedef SOCKET (WSPAPI *LPWSPJOINLEAF)(SOCKET,const struct sockaddr*,INT,LPWSABUF,LPWSABUF,LPQOS,LPQOS,DWORD,LPINT);
-typedef INT (WSPAPI *LPWSPLISTEN)(SOCKET,INT,LPINT);
-typedef INT (WSPAPI *LPWSPRECV)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,
-LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT);
-typedef INT (WSPAPI *LPWSPRECVDISCONNECT)(SOCKET,LPWSABUF,LPINT);
-typedef INT (WSPAPI *LPWSPRECVFROM)(SOCKET,LPWSABUF,DWORD,LPDWORD,LPDWORD,LPSOCKADDR,
-LPINT,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT);
-typedef INT (WSPAPI *LPWSPSELECT)(INT,LPFD_SET,LPFD_SET,LPFD_SET,CONST LPTIMEVAL,LPINT);
-typedef INT (WSPAPI *LPWSPSEND)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,
-LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT);
-typedef INT (WSPAPI *LPWSPSENDDISCONNECT)(SOCKET,LPWSABUF,LPINT);
-typedef INT (WSPAPI *LPWSPSENDTO)(SOCKET,LPWSABUF,DWORD,LPDWORD,DWORD,const struct sockaddr*,
- INT,LPWSAOVERLAPPED,LPWSAOVERLAPPED_COMPLETION_ROUTINE,LPWSATHREADID,LPINT);
-typedef INT (WSPAPI *LPWSPSETSOCKOPT)(SOCKET,INT,INT,CONST CHAR FAR*,INT,LPINT);
-typedef INT (WSPAPI *LPWSPSHUTDOWN)(SOCKET,INT,LPINT);
-typedef SOCKET (WSPAPI *LPWSPSOCKET)(INT,INT,INT,LPWSAPROTOCOL_INFOW,GROUP,DWORD,LPINT);
-typedef INT (WSPAPI *LPWSPSTRINGTOADDRESS)(LPWSTR,INT,LPWSAPROTOCOL_INFOW,LPSOCKADDR,LPINT,LPINT);
+typedef BOOL
+(CALLBACK FAR *LPBLOCKINGCALLBACK)(
+ DWORD_PTR dwContext);
+
+typedef SOCKET
+(WSPAPI *LPWSPACCEPT)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *addr OPTIONAL,
+ IN OUT LPINT addrlen OPTIONAL,
+ IN LPCONDITIONPROC lpfnCondition OPTIONAL,
+ IN DWORD_PTR dwCallbackData OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef VOID
+(CALLBACK FAR *LPWSAUSERAPC)(
+ DWORD_PTR dwContext);
+
+typedef INT
+(WSPAPI *LPWSPADDRESSTOSTRING)(
+ IN LPSOCKADDR lpsaAddress,
+ IN DWORD dwAddressLength,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ OUT LPWSTR lpszAddressString,
+ IN OUT LPDWORD lpdwAddressStringLength,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPASYNCSELECT)(
+ IN SOCKET s,
+ IN HWND hWnd,
+ IN unsigned int wMsg,
+ IN long lEvent,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPBIND)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPCANCELBLOCKINGCALL)(
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPCLEANUP)(
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPCLOSESOCKET)(
+ IN SOCKET s,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPCONNECT)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN LPWSABUF lpCallerData OPTIONAL,
+ OUT LPWSABUF lpCalleeData OPTIONAL,
+ IN LPQOS lpSQOS OPTIONAL,
+ IN LPQOS lpGQOS OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPDUPLICATESOCKET)(
+ IN SOCKET s,
+ IN DWORD dwProcessId,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolInfo,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPENUMNETWORKEVENTS)(
+ IN SOCKET s,
+ IN WSAEVENT hEventObject,
+ OUT LPWSANETWORKEVENTS lpNetworkEvents,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPEVENTSELECT)(
+ IN SOCKET s,
+ IN WSAEVENT hEventObject,
+ IN long lNetworkEvents,
+ OUT LPINT lpErrno);
+
+typedef BOOL
+(WSPAPI *LPWSPGETOVERLAPPEDRESULT)(
+ IN SOCKET s,
+ IN LPWSAOVERLAPPED lpOverlapped,
+ OUT LPDWORD lpcbTransfer,
+ IN BOOL fWait,
+ OUT LPDWORD lpdwFlags,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPGETPEERNAME)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT LPINT namelen,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPGETSOCKNAME)(
+ IN SOCKET s,
+ OUT struct sockaddr FAR *name,
+ IN OUT LPINT namelen,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPGETSOCKOPT)(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ OUT char FAR *optval,
+ IN OUT LPINT optlen,
+ OUT LPINT lpErrno);
+
+typedef BOOL
+(WSPAPI *LPWSPGETQOSBYNAME)(
+ IN SOCKET s,
+ IN LPWSABUF lpQOSName,
+ OUT LPQOS lpQOS,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPIOCTL)(
+ IN SOCKET s,
+ IN DWORD dwIoControlCode,
+ IN LPVOID lpvInBuffer OPTIONAL,
+ IN DWORD cbInBuffer,
+ OUT LPVOID lpvOutBuffer OPTIONAL,
+ IN DWORD cbOutBuffer,
+ OUT LPDWORD lpcbBytesReturned,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef SOCKET
+(WSPAPI *LPWSPJOINLEAF)(
+ IN SOCKET s,
+ IN const struct sockaddr FAR *name,
+ IN int namelen,
+ IN LPWSABUF lpCallerData OPTIONAL,
+ OUT LPWSABUF lpCalleeData OPTIONAL,
+ IN LPQOS lpSQOS OPTIONAL,
+ IN LPQOS lpGQOS OPTIONAL,
+ IN DWORD dwFlags,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPLISTEN)(
+ IN SOCKET s,
+ IN int backlog,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPRECV)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPDWORD lpFlags,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId OPTIONAL,
+ IN LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPRECVDISCONNECT)(
+ IN SOCKET s,
+ IN LPWSABUF lpInboundDisconnectData OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPRECVFROM)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesRecvd OPTIONAL,
+ IN OUT LPDWORD lpFlags,
+ OUT struct sockaddr FAR *lpFrom OPTIONAL,
+ IN OUT LPINT lpFromlen OPTIONAL,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPSELECT)(
+ IN int nfds,
+ IN OUT fd_set FAR *readfds OPTIONAL,
+ IN OUT fd_set FAR *writefds OPTIONAL,
+ IN OUT fd_set FAR *exceptfds OPTIONAL,
+ IN const struct timeval FAR *timeout OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPSEND)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN DWORD dwFlags,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPSENDDISCONNECT)(
+ IN SOCKET s,
+ IN LPWSABUF lpOutboundDisconnectData OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPSENDTO)(
+ IN SOCKET s,
+ IN LPWSABUF lpBuffers,
+ IN DWORD dwBufferCount,
+ OUT LPDWORD lpNumberOfBytesSent OPTIONAL,
+ IN DWORD dwFlags,
+ IN const struct sockaddr FAR *lpTo OPTIONAL,
+ IN int iTolen,
+ IN OUT LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ IN LPWSATHREADID lpThreadId OPTIONAL,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPSETSOCKOPT)(
+ IN SOCKET s,
+ IN int level,
+ IN int optname,
+ IN const char FAR *optval OPTIONAL,
+ IN int optlen,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSPSHUTDOWN)(
+ IN SOCKET s,
+ IN int how,
+ OUT LPINT lpErrno);
+
+typedef SOCKET
+(WSPAPI *LPWSPSOCKET)(
+ IN int af,
+ IN int type,
+ IN int protocol,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ IN GROUP g,
+ IN DWORD dwFlags,
+ OUT LPINT lpErrno);
+
+typedef INT
+(WSPAPI *LPWSPSTRINGTOADDRESS)(
+ IN LPWSTR AddressString,
+ IN INT AddressFamily,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo OPTIONAL,
+ OUT LPSOCKADDR lpAddress,
+ IN OUT LPINT lpAddressLength,
+ OUT LPINT lpErrno);
+
+typedef BOOL
+(WSPAPI *LPWPUCLOSEEVENT)(
+ IN WSAEVENT hEvent,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUCLOSESOCKETHANDLE)(
+ IN SOCKET s,
+ OUT LPINT lpErrno);
+
+typedef WSAEVENT
+(WSPAPI *LPWPUCREATEEVENT)(
+ OUT LPINT lpErrno);
+
+typedef SOCKET
+(WSPAPI *LPWPUCREATESOCKETHANDLE)(
+ IN DWORD dwCatalogEntryId,
+ IN DWORD_PTR dwContext,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUFDISSET)(
+ IN SOCKET s,
+ IN fd_set FAR *fdset);
+
+typedef int
+(WSPAPI *LPWPUGETPROVIDERPATH)(
+ IN LPGUID lpProviderId,
+ OUT WCHAR FAR *lpszProviderDllPath,
+ IN OUT LPINT lpProviderDllPathLen,
+ OUT LPINT lpErrno);
+
+typedef SOCKET
+(WSPAPI *LPWPUMODIFYIFSHANDLE)(
+ IN DWORD dwCatalogEntryId,
+ IN SOCKET ProposedHandle,
+ OUT LPINT lpErrno);
+
+typedef BOOL
+(WSPAPI *LPWPUPOSTMESSAGE)(
+ IN HWND hWnd,
+ IN UINT Msg,
+ IN WPARAM wParam,
+ IN LPARAM lParam);
+
+typedef int
+(WSPAPI *LPWPUQUERYBLOCKINGCALLBACK)(
+ IN DWORD dwCatalogEntryId,
+ OUT LPBLOCKINGCALLBACK FAR *lplpfnCallback,
+ OUT PDWORD_PTR lpdwContext,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUQUERYSOCKETHANDLECONTEXT)(
+ IN SOCKET s,
+ OUT PDWORD_PTR lpContext,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUQUEUEAPC)(
+ IN LPWSATHREADID lpThreadId,
+ IN LPWSAUSERAPC lpfnUserApc,
+ IN DWORD_PTR dwContext,
+ OUT LPINT lpErrno);
+
+typedef BOOL
+(WSPAPI *LPWPURESETEVENT)(
+ IN WSAEVENT hEvent,
+ OUT LPINT lpErrno);
+
+typedef BOOL
+(WSPAPI *LPWPUSETEVENT)(
+ IN WSAEVENT hEvent,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUOPENCURRENTTHREAD)(
+ OUT LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUCLOSETHREAD)(
+ IN LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWPUCOMPLETEOVERLAPPEDREQUEST)(
+ IN SOCKET s,
+ IN OUT LPWSAOVERLAPPED lpOverlapped,
+ IN DWORD dwError,
+ IN DWORD cbTransferred,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSCENUMPROTOCOLS)(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer OPTIONAL,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSCDEINSTALLPROVIDER)(
+ IN LPGUID lpProviderId,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSCINSTALLPROVIDER)(
+ IN LPGUID lpProviderId,
+ IN const WCHAR FAR *lpszProviderDllPath,
+ IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSCGETPROVIDERPATH)(
+ IN LPGUID lpProviderId,
+ OUT WCHAR FAR *lpszProviderDllPath,
+ IN OUT LPINT lpProviderDllPathLen,
+ OUT LPINT lpErrno);
+
+typedef INT
+(WSPAPI *LPWSCINSTALLNAMESPACE)(
+ IN LPWSTR lpszIdentifier,
+ IN LPWSTR lpszPathName,
+ IN DWORD dwNameSpace,
+ IN DWORD dwVersion,
+ IN LPGUID lpProviderId);
+
+typedef INT
+(WSPAPI *LPWSCUNINSTALLNAMESPACE)(
+ IN LPGUID lpProviderId);
+
+typedef INT
+(WSPAPI *LPWSCENABLENSPROVIDER)(
+ IN LPGUID lpProviderId,
+ IN BOOL fEnable);
/* Service provider procedure table */
typedef struct _WSPPROC_TABLE {
@@ -113,16 +483,161 @@ 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 INT
+(WSAAPI *LPNSPCLEANUP)(
+ IN LPGUID lpProviderId);
+
+typedef INT
+(WSAAPI *LPNSPLOOKUPSERVICEBEGIN)(
+ IN LPGUID lpProviderId,
+ IN LPWSAQUERYSETW lpqsRestrictions,
+ IN LPWSASERVICECLASSINFOW lpServiceClassInfo,
+ IN DWORD dwControlFlags,
+ OUT LPHANDLE lphLookup);
+
+typedef INT
+(WSAAPI *LPNSPLOOKUPSERVICENEXT)(
+ IN HANDLE hLookup,
+ IN DWORD dwControlFlags,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSAQUERYSETW lpqsResults);
+
+#if(_WIN32_WINNT >= 0x0501)
+typedef INT
+(WSAAPI *LPNSPIOCTL)(
+ IN HANDLE hLookup,
+ IN DWORD dwControlCode,
+ IN LPVOID lpvInBuffer,
+ IN DWORD cbInBuffer,
+ OUT LPVOID lpvOutBuffer,
+ IN DWORD cbOutBuffer,
+ OUT LPDWORD lpcbBytesReturned,
+ IN LPWSACOMPLETION lpCompletion OPTIONAL,
+ IN LPWSATHREADID lpThreadId);
+#endif
+
+typedef INT
+(WSAAPI *LPNSPLOOKUPSERVICEEND)(
+ IN HANDLE hLookup);
+
+typedef INT
+(WSAAPI *LPNSPSETSERVICE)(
+ IN LPGUID lpProviderId,
+ IN LPWSASERVICECLASSINFOW lpServiceClassInfo,
+ IN LPWSAQUERYSETW lpqsRegInfo,
+ IN WSAESETSERVICEOP essOperation,
+ IN DWORD dwControlFlags);
+
+typedef INT
+(WSAAPI *LPNSPINSTALLSERVICECLASS)(
+ IN LPGUID lpProviderId,
+ IN LPWSASERVICECLASSINFOW lpServiceClassInfo);
+
+typedef INT
+(WSAAPI *LPNSPREMOVESERVICECLASS)(
+ IN LPGUID lpProviderId,
+ IN LPGUID lpServiceClassId);
+
+typedef INT
+(WSAAPI *LPNSPGETSERVICECLASSINFO)(
+ IN LPGUID lpProviderId,
+ IN LPDWORD lpdwBufSize,
+ IN LPWSASERVICECLASSINFOW lpServiceClassInfo);
+
+typedef INT
+(WSAAPI *LPNSPV2STARTUP)(
+ IN LPGUID lpProviderId,
+ OUT LPVOID *ppvClientSessionArg);
+
+typedef INT
+(WSAAPI *LPNSPV2CLEANUP)(
+ IN LPGUID lpProviderId,
+ IN LPVOID pvClientSessionArg);
+
+typedef INT
+(WSAAPI *LPNSPV2LOOKUPSERVICEBEGIN)(
+ IN LPGUID lpProviderId,
+ IN LPWSAQUERYSET2W lpqsRestrictions,
+ IN DWORD dwControlFlags,
+ IN LPVOID lpvClientSessionArg,
+ OUT LPHANDLE lphLookup);
+
+typedef VOID
+(WSAAPI *LPNSPV2LOOKUPSERVICENEXTEX)(
+ IN HANDLE hAsyncCall,
+ IN HANDLE hLookup,
+ IN DWORD dwControlFlags,
+ IN LPDWORD lpdwBufferLength,
+ OUT LPWSAQUERYSET2W lpqsResults);
+
+typedef INT
+(WSAAPI *LPNSPV2LOOKUPSERVICEEND)(
+ IN HANDLE hLookup);
+
+typedef VOID
+(WSAAPI *LPNSPV2SETSERVICEEX)(
+ IN HANDLE hAsyncCall,
+ IN LPGUID lpProviderId,
+ IN LPWSAQUERYSET2W lpqsRegInfo,
+ IN WSAESETSERVICEOP essOperation,
+ IN DWORD dwControlFlags,
+ IN LPVOID lpvClientSessionArg);
+
+typedef VOID
+(WSAAPI *LPNSPV2CLIENTSESSIONRUNDOWN)(
+ IN LPGUID lpProviderId,
+ IN LPVOID pvClientSessionArg);
+
+/* Service Provider upcall table */
+typedef struct _WSPUPCALLTABLE {
+ LPWPUCLOSEEVENT lpWPUCloseEvent;
+ LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle;
+ LPWPUCREATEEVENT lpWPUCreateEvent;
+ LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle;
+ LPWPUFDISSET lpWPUFDIsSet;
+ LPWPUGETPROVIDERPATH lpWPUGetProviderPath;
+ LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle;
+ LPWPUPOSTMESSAGE lpWPUPostMessage;
+ LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback;
+ LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext;
+ LPWPUQUEUEAPC lpWPUQueueApc;
+ LPWPURESETEVENT lpWPUResetEvent;
+ LPWPUSETEVENT lpWPUSetEvent;
+ LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread;
+ LPWPUCLOSETHREAD lpWPUCloseThread;
+} WSPUPCALLTABLE, FAR* LPWSPUPCALLTABLE;
+
+typedef int
+(WSPAPI *LPWSPSTARTUP)(
+ IN WORD wVersionRequested,
+ IN LPWSPDATA lpWSPData,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
+ IN WSPUPCALLTABLE UpcallTable,
+ OUT LPWSPPROC_TABLE lpProcTable);
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define LSP_SYSTEM 0x80000000
+#define LSP_INSPECTOR 0x00000001
+#define LSP_REDIRECTOR 0x00000002
+#define LSP_PROXY 0x00000004
+#define LSP_FIREWALL 0x00000008
+#define LSP_INBOUND_MODIFY 0x00000010
+#define LSP_OUTBOUND_MODIFY 0x00000020
+#define LSP_CRYPTO_COMPRESS 0x00000040
+#define LSP_LOCAL_CACHE 0x00000080
+
+typedef enum _WSC_PROVIDER_INFO_TYPE {
+ ProviderInfoLspCategories,
+ ProviderInfoAudit
+} WSC_PROVIDER_INFO_TYPE ;
+
+typedef struct _WSC_PROVIDER_AUDIT_INFO {
+ DWORD RecordSize;
+ PVOID Reserved;
+} WSC_PROVIDER_AUDIT_INFO;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
typedef struct _NSP_ROUTINE {
DWORD cbSize;
@@ -139,80 +654,462 @@ typedef struct _NSP_ROUTINE {
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_PTR,LPINT);
-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);
-typedef BOOL (WSPAPI *LPWPUPOSTMESSAGE)(HWND,UINT,WPARAM,LPARAM);
-typedef INT (WSPAPI *LPWPUQUERYBLOCKINGCALLBACK)(DWORD,LPBLOCKINGCALLBACK FAR*,PDWORD_PTR,LPINT);
-typedef INT (WSPAPI *LPWPUQUERYSOCKETHANDLECONTEXT)(SOCKET,PDWORD_PTR,LPINT);
-typedef INT (WSPAPI *LPWPUQUEUEAPC)(LPWSATHREADID,LPWSAUSERAPC,DWORD_PTR,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);
+typedef INT
+(WSAAPI *LPNSPSTARTUP)(
+ IN LPGUID lpProviderId,
+ IN OUT LPNSP_ROUTINE lpnspRoutines);
-/* Service Provider upcall table */
-typedef struct _WSPUPCALLTABLE {
- LPWPUCLOSEEVENT lpWPUCloseEvent;
- LPWPUCLOSESOCKETHANDLE lpWPUCloseSocketHandle;
- LPWPUCREATEEVENT lpWPUCreateEvent;
- LPWPUCREATESOCKETHANDLE lpWPUCreateSocketHandle;
- LPWPUFDISSET lpWPUFDIsSet;
- LPWPUGETPROVIDERPATH lpWPUGetProviderPath;
- LPWPUMODIFYIFSHANDLE lpWPUModifyIFSHandle;
- LPWPUPOSTMESSAGE lpWPUPostMessage;
- LPWPUQUERYBLOCKINGCALLBACK lpWPUQueryBlockingCallback;
- LPWPUQUERYSOCKETHANDLECONTEXT lpWPUQuerySocketHandleContext;
- LPWPUQUEUEAPC lpWPUQueueApc;
- LPWPURESETEVENT lpWPUResetEvent;
- LPWPUSETEVENT lpWPUSetEvent;
- LPWPUOPENCURRENTTHREAD lpWPUOpenCurrentThread;
- LPWPUCLOSETHREAD lpWPUCloseThread;
-} WSPUPCALLTABLE, FAR* LPWSPUPCALLTABLE;
+typedef struct _NSPV2_ROUTINE {
+ DWORD cbSize;
+ DWORD dwMajorVersion;
+ DWORD dwMinorVersion;
+ LPNSPV2STARTUP NSPv2Startup;
+ LPNSPV2CLEANUP NSPv2Cleanup;
+ LPNSPV2LOOKUPSERVICEBEGIN NSPv2LookupServiceBegin;
+ LPNSPV2LOOKUPSERVICENEXTEX NSPv2LookupServiceNextEx;
+ LPNSPV2LOOKUPSERVICEEND NSPv2LookupServiceEnd;
+ LPNSPV2SETSERVICEEX NSPv2SetServiceEx;
+ LPNSPV2CLIENTSESSIONRUNDOWN NSPv2ClientSessionRundown;
+} NSPV2_ROUTINE, *PNSPV2_ROUTINE, *LPNSPV2_ROUTINE;
+typedef const NSPV2_ROUTINE *PCNSPV2_ROUTINE, *LPCNSPV2_ROUTINE;
-typedef INT (WSPAPI *LPWSPSTARTUP)(WORD,LPWSPDATA,LPWSAPROTOCOL_INFOW,WSPUPCALLTABLE,LPWSPPROC_TABLE);
+int
+WSPAPI
+WSPStartup(
+ IN WORD wVersionRequested,
+ IN LPWSPDATA lpWSPData,
+ IN LPWSAPROTOCOL_INFOW lpProtocolInfo,
+ IN WSPUPCALLTABLE UpcallTable,
+ OUT LPWSPPROC_TABLE lpProcTable);
-INT WSPAPI NSPStartup(LPGUID,LPNSP_ROUTINE);
+int
+WSPAPI
+WSCEnumProtocols(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer OPTIONAL,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPINT lpErrno);
-/* WinSock 2 DLL function prototypes */
-INT WSPAPI WPUCompleteOverlappedRequest(SOCKET,LPWSAOVERLAPPED,DWORD,DWORD,LPINT);
-INT WSPAPI WSPStartup(WORD,LPWSPDATA,LPWSAPROTOCOL_INFOW,WSPUPCALLTABLE,LPWSPPROC_TABLE);
-INT WSPAPI WSCDeinstallProvider(LPGUID,LPINT);
-INT WSPAPI WSCEnumProtocols(LPINT,LPWSAPROTOCOL_INFOW,LPDWORD,LPINT);
-INT WSPAPI WSCGetProviderPath(LPGUID,LPWSTR,LPINT,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);
+#if (_WIN32_WINNT >= 0x0501)
-#endif /* RC_INVOKED */
+int
+WSPAPI
+WPUOpenCurrentThread(
+ OUT LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WPUCloseThread(
+ IN LPWSATHREADID lpThreadId,
+ OUT LPINT lpErrno);
+
+#define WSCEnumNameSpaceProviders WSAEnumNameSpaceProvidersW
+#define LPFN_WSCENUMNAMESPACEPROVIDERS LPFN_WSAENUMNAMESPACEPROVIDERSW
+
+int
+WSPAPI
+WSCUpdateProvider(
+ IN LPGUID lpProviderId,
+ IN const WCHAR FAR *lpszProviderDllPath,
+ IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPINT lpErrno);
+
+typedef int
+(WSPAPI *LPWSCUPDATEPROVIDER)(
+ IN LPGUID lpProviderId,
+ IN const WCHAR FAR *lpszProviderDllPath,
+ IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPINT lpErrno);
+
+#if defined(_WIN64)
+
+int
+WSPAPI
+WSCEnumProtocols32(
+ IN LPINT lpiProtocols OPTIONAL,
+ OUT LPWSAPROTOCOL_INFOW lpProtocolBuffer,
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCDeinstallProvider32(
+ IN LPGUID lpProviderId,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCInstallProvider64_32(
+ IN LPGUID lpProviderId,
+ IN const WCHAR FAR *lpszProviderDllPath,
+ IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCGetProviderPath32(
+ IN LPGUID lpProviderId,
+ OUT WCHAR FAR *lpszProviderDllPath,
+ IN OUT LPINT lpProviderDllPathLen,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCUpdateProvider32(
+ IN LPGUID lpProviderId,
+ IN const WCHAR FAR *lpszProviderDllPath,
+ IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPINT lpErrno);
+
+INT
+WSAAPI
+WSCEnumNameSpaceProviders32(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOW lpnspBuffer);
+
+INT
+WSPAPI
+WSCInstallNameSpace32(
+ IN LPWSTR lpszIdentifier,
+ IN LPWSTR lpszPathName,
+ IN DWORD dwNameSpace,
+ IN DWORD dwVersion,
+ IN LPGUID lpProviderId);
+
+INT
+WSPAPI
+WSCUnInstallNameSpace32(
+ IN LPGUID lpProviderId);
+
+INT
+WSPAPI
+WSCEnableNSProvider32(
+ IN LPGUID lpProviderId,
+ IN BOOL fEnable);
+
+#endif /* defined(_WIN64) */
+
+#endif /* defined(_WIN32_WINNT >= 0x0501) */
+
+int
+WSPAPI
+WSCDeinstallProvider(
+ IN LPGUID lpProviderId,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCInstallProvider(
+ IN LPGUID lpProviderId,
+ IN const WCHAR FAR *lpszProviderDllPath,
+ IN const LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCGetProviderPath(
+ IN LPGUID lpProviderId,
+ OUT WCHAR FAR *lpszProviderDllPath,
+ IN OUT LPINT lpProviderDllPathLen,
+ OUT LPINT lpErrno);
+
+#if (_WIN32_WINNT < 0x0600)
+
+int
+WSPAPI
+WSCInstallQOSTemplate(
+ IN const LPGUID Guid,
+ IN LPWSABUF QosName,
+ IN LPQOS Qos);
+
+typedef int
+(WSPAPI *LPWSCINSTALLQOSTEMPLATE)(
+ IN const LPGUID Guid,
+ IN LPWSABUF QosName,
+ IN LPQOS Qos);
+
+int
+WSPAPI
+WSCRemoveQOSTemplate(
+ IN const LPGUID Guid,
+ IN LPWSABUF QosName);
+
+typedef int
+(WSPAPI *LPWSCREMOVEQOSTEMPLATE)(
+ IN const LPGUID Guid,
+ IN LPWSABUF QosName);
+
+#endif /* (_WIN32_WINNT < 0x0600) */
+
+#if(_WIN32_WINNT >= 0x0600)
+
+int
+WSPAPI
+WSCSetProviderInfo(
+ IN LPGUID lpProviderId,
+ IN WSC_PROVIDER_INFO_TYPE InfoType,
+ IN PBYTE Info,
+ IN size_t InfoSize,
+ IN DWORD Flags,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCGetProviderInfo(
+ IN LPGUID lpProviderId,
+ IN WSC_PROVIDER_INFO_TYPE InfoType,
+ OUT PBYTE Info,
+ IN OUT *InfoSize,
+ IN DWORD Flags,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCSetApplicationCategory(
+ IN LPCWSTR Path,
+ IN DWORD PathLength,
+ IN LPCWSTR Extra OPTIONAL,
+ IN DWORD ExtraLength,
+ IN DWORD PermittedLspCategories,
+ OUT DWORD *pPrevPermLspCat OPTIONAL,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCGetApplicationCategory(
+ IN LPCWSTR Path,
+ IN DWORD PathLength,
+ IN LPCWSTR Extra OPTIONAL,
+ IN DWORD ExtraLength,
+ OUT DWORD *pPermittedLspCategories,
+ OUT LPINT lpErrno);
+
+#define WSCEnumNameSpaceProvidersEx WSAEnumNameSpaceProvidersExW
+#define LPFN_WSCENUMNAMESPACEPROVIDERSEX LPFN_WSAENUMNAMESPACEPROVIDERSEXW
+
+INT
+WSPAPI
+WSCInstallNameSpaceEx(
+ IN LPWSTR lpszIdentifier,
+ IN LPWSTR lpszPathName,
+ IN DWORD dwNameSpace,
+ IN DWORD dwVersion,
+ IN LPGUID lpProviderId,
+ IN LPBLOB lpProviderSpecific);
+
+INT
+WSAAPI
+WSAAdvertiseProvider(
+ IN const GUID *puuidProviderId,
+ IN const LPCNSPV2_ROUTINE pNSPv2Routine);
+
+INT
+WSAAPI
+WSAUnadvertiseProvider(
+ IN const GUID *puuidProviderId);
+
+INT
+WSAAPI
+WSAProviderCompleteAsyncCall(
+ IN HANDLE hAsyncCall,
+ IN INT iRetCode);
+
+#if defined(_WIN64)
+
+int
+WSPAPI
+WSCSetProviderInfo32(
+ IN LPGUID lpProviderId,
+ IN WSC_PROVIDER_INFO_TYPE InfoType,
+ IN PBYTE Info,
+ IN size_t InfoSize,
+ IN DWORD Flags,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WSCGetProviderInfo32(
+ IN LPGUID lpProviderId,
+ IN WSC_PROVIDER_INFO_TYPE InfoType,
+ OUT PBYTE Info,
+ IN OUT size_t *InfoSize,
+ IN DWORD Flags,
+ OUT LPINT lpErrno);
+
+INT
+WSAAPI
+WSCEnumNameSpaceProvidersEx32(
+ IN OUT LPDWORD lpdwBufferLength,
+ OUT LPWSANAMESPACE_INFOEXW lpnspBuffer);
+
+INT
+WSPAPI
+WSCInstallNameSpaceEx32(
+ IN LPWSTR lpszIdentifier,
+ IN LPWSTR lpszPathName,
+ IN DWORD dwNameSpace,
+ IN DWORD dwVersion,
+ IN LPGUID lpProviderId,
+ IN LPBLOB lpProviderSpecific);
+
+#endif /* (_WIN64) */
+
+#if defined(_WIN64)
+int
+WSPAPI
+WSCInstallProviderAndChains64_32(
+#else
+int
+WSPAPI
+WSCInstallProviderAndChains(
+#endif
+ IN LPGUID lpProviderId,
+ IN const LPWSTR lpszProviderDllPath,
+#if defined(_WIN64)
+ IN const LPWSTR lpszProviderDllPath32,
+#endif
+ IN const LPWSTR lpszLspName,
+ IN DWORD dwServiceFlags,
+ IN OUT LPWSAPROTOCOL_INFOW lpProtocolInfoList,
+ IN DWORD dwNumberOfEntries,
+ OUT LPDWORD lpdwCatalogEntryId OPTIONAL,
+ OUT LPINT lpErrno);
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+BOOL
+WSPAPI
+WPUCloseEvent(
+ IN WSAEVENT hEvent,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WPUCloseSocketHandle(
+ IN SOCKET s,
+ OUT LPINT lpErrno);
+
+WSAEVENT
+WSPAPI
+WPUCreateEvent(
+ OUT LPINT lpErrno);
+
+SOCKET
+WSPAPI
+WPUCreateSocketHandle(
+ IN DWORD dwCatalogEntryId,
+ IN DWORD_PTR dwContext,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WPUFDIsSet(
+ IN SOCKET s,
+ IN fd_set FAR *fdset);
+
+int
+WSPAPI
+WPUGetProviderPath(
+ IN LPGUID lpProviderId,
+ OUT WCHAR FAR *lpszProviderDllPath,
+ IN OUT LPINT lpProviderDllPathLen,
+ OUT LPINT lpErrno);
+
+SOCKET
+WSPAPI
+WPUModifyIFSHandle(
+ IN DWORD dwCatalogEntryId,
+ IN SOCKET ProposedHandle,
+ OUT LPINT lpErrno);
+
+BOOL
+WSPAPI
+WPUPostMessage(
+ IN HWND hWnd,
+ IN UINT Msg,
+ IN WPARAM wParam,
+ IN LPARAM lParam);
+
+int
+WSPAPI
+WPUQueryBlockingCallback(
+ IN DWORD dwCatalogEntryId,
+ OUT LPBLOCKINGCALLBACK FAR *lplpfnCallback,
+ OUT PDWORD_PTR lpdwContext,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WPUQuerySocketHandleContext(
+ IN SOCKET s,
+ OUT PDWORD_PTR lpContext,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WPUQueueApc(
+ IN LPWSATHREADID lpThreadId,
+ IN LPWSAUSERAPC lpfnUserApc,
+ IN DWORD_PTR dwContext,
+ OUT LPINT lpErrno);
+
+BOOL
+WSPAPI
+WPUResetEvent(
+ IN WSAEVENT hEvent,
+ OUT LPINT lpErrno);
+
+BOOL
+WSPAPI
+WPUSetEvent(
+ IN WSAEVENT hEvent,
+ OUT LPINT lpErrno);
+
+int
+WSPAPI
+WPUCompleteOverlappedRequest(
+ IN SOCKET s,
+ IN OUT LPWSAOVERLAPPED lpOverlapped,
+ IN DWORD dwError,
+ IN DWORD cbTransferred,
+ OUT LPINT lpErrno);
+
+INT
+WSPAPI
+WSCInstallNameSpace(
+ IN LPWSTR lpszIdentifier,
+ IN LPWSTR lpszPathName,
+ IN DWORD dwNameSpace,
+ IN DWORD dwVersion,
+ IN LPGUID lpProviderId);
+
+INT
+WSPAPI
+WSCUnInstallNameSpace(
+ IN LPGUID lpProviderId);
+
+INT
+WSPAPI
+WSCEnableNSProvider(
+ IN LPGUID lpProviderId,
+ IN BOOL fEnable);
+
+INT
+WSAAPI
+NSPStartup(
+ IN LPGUID lpProviderId,
+ IN OUT LPNSP_ROUTINE lpnspRoutines);
+
+#if !defined(_WIN64)
+#include
+#endif
#ifdef __cplusplus
}
-#endif /* __cplusplus */
-
-#endif /* _WS2SPI_H */
+#endif
diff --git a/include/psdk/ws2tcpip.h b/include/psdk/ws2tcpip.h
index 42f7e62be7a..21a43d42c30 100644
--- a/include/psdk/ws2tcpip.h
+++ b/include/psdk/ws2tcpip.h
@@ -6,299 +6,39 @@
*
*/
-#ifndef _WS2TCPIP_H
-#define _WS2TCPIP_H
+#pragma once
-#if (defined _WINSOCK_H && !defined _WINSOCK2_H)
-#error "ws2tcpip.h is not compatable with winsock.h. Include winsock2.h instead."
-#endif
+#define _WS2TCPIP_H
#include
#include
-#ifdef __cplusplus
+#include
+
+#ifdef __cplusplus
extern "C" {
#endif
-/*
- * The IP_* macros are also defined in winsock.h, but some values are different there.
- * The values defined in winsock.h for 1.1 and used in wsock32.dll are consistent
- * with the original values Steve Deering defined in his document "IP Multicast Extensions
- * for 4.3BSD UNIX related systems (MULTICAST 1.2 Release)." However, these conflicted with
- * the definitions for some IPPROTO_IP level socket options already assigned by BSD,
- * so Berkeley changed all the values by adding 7. WinSock2 (ws2_32.dll) uses
- * the BSD 4.4 compatible values defined here.
- *
- * See also: msdn kb article Q257460
- * http://support.microsoft.com/support/kb/articles/Q257/4/60.asp
- */
-
-/* This is also defined in winsock.h; value hasn't changed */
-#define IP_OPTIONS 1
-
-#define IP_HDRINCL 2
-/*
- * These are also be defined in winsock.h,
- * but values have changed for WinSock2 interface
- */
-#define IP_TOS 3 /* old (winsock 1.1) value 8 */
-#define IP_TTL 4 /* old value 7 */
-#define IP_MULTICAST_IF 9 /* old value 2 */
-#define IP_MULTICAST_TTL 10 /* old value 3 */
-#define IP_MULTICAST_LOOP 11 /* old value 4 */
-#define IP_ADD_MEMBERSHIP 12 /* old value 5 */
-#define IP_DROP_MEMBERSHIP 13 /* old value 6 */
-#define IP_DONTFRAGMENT 14 /* old value 9 */
-#define IP_ADD_SOURCE_MEMBERSHIP 15
-#define IP_DROP_SOURCE_MEMBERSHIP 16
-#define IP_BLOCK_SOURCE 17
-#define IP_UNBLOCK_SOURCE 18
-#define IP_PKTINFO 19
-
-/*
- * As with BSD implementation, IPPROTO_IPV6 level socket options have
- * same values as IPv4 counterparts.
- */
-#define IPV6_UNICAST_HOPS 4
-#define IPV6_MULTICAST_IF 9
-#define IPV6_MULTICAST_HOPS 10
-#define IPV6_MULTICAST_LOOP 11
-#define IPV6_ADD_MEMBERSHIP 12
-#define IPV6_DROP_MEMBERSHIP 13
-#define IPV6_JOIN_GROUP IPV6_ADD_MEMBERSHIP
-#define IPV6_LEAVE_GROUP IPV6_DROP_MEMBERSHIP
-#define IPV6_PKTINFO 19
-
-#define IP_DEFAULT_MULTICAST_TTL 1
-#define IP_DEFAULT_MULTICAST_LOOP 1
-#define IP_MAX_MEMBERSHIPS 20
-
-#define TCP_EXPEDITED_1122 2
-
#define UDP_NOCHECKSUM 1
+#define UDP_CHECKSUM_COVERAGE 20
-/* INTERFACE_INFO iiFlags */
-#define IFF_UP 1
-#define IFF_BROADCAST 2
-#define IFF_LOOPBACK 4
-#define IFF_POINTTOPOINT 8
-#define IFF_MULTICAST 16
-
-#define SIO_GET_INTERFACE_LIST _IOR('t', 127, u_long)
-
-#define INET_ADDRSTRLEN 16
-#define INET6_ADDRSTRLEN 46
-
-/* getnameinfo constants */
-#define NI_MAXHOST 1025
-#define NI_MAXSERV 32
-
-#define NI_NOFQDN 0x01
-#define NI_NUMERICHOST 0x02
-#define NI_NAMEREQD 0x04
-#define NI_NUMERICSERV 0x08
-#define NI_DGRAM 0x10
-
-/* getaddrinfo constants */
-#define AI_PASSIVE 1
-#define AI_CANONNAME 2
-#define AI_NUMERICHOST 4
+#ifdef _MSC_VER
+#define WS2TCPIP_INLINE __inline
+#else
+#define WS2TCPIP_INLINE extern inline
+#endif
/* getaddrinfo error codes */
-#define EAI_AGAIN WSATRY_AGAIN
-#define EAI_BADFLAGS WSAEINVAL
-#define EAI_FAIL WSANO_RECOVERY
-#define EAI_FAMILY WSAEAFNOSUPPORT
-#define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY
-#define EAI_NODATA WSANO_DATA
-#define EAI_NONAME WSAHOST_NOT_FOUND
-#define EAI_SERVICE WSATYPE_NOT_FOUND
-#define EAI_SOCKTYPE WSAESOCKTNOSUPPORT
-
-/*
- * ip_mreq also in winsock.h for WinSock1.1,
- * but online msdn docs say it is defined here for WinSock2.
- */
-
-struct ip_mreq {
- struct in_addr imr_multiaddr;
- struct in_addr imr_interface;
-};
-
-struct ip_mreq_source {
- struct in_addr imr_multiaddr;
- struct in_addr imr_sourceaddr;
- struct in_addr imr_interface;
-};
-
-struct ip_msfilter {
- struct in_addr imsf_multiaddr;
- struct in_addr imsf_interface;
- u_long imsf_fmode;
- u_long imsf_numsrc;
- struct in_addr imsf_slist[1];
-};
-
-#define IP_MSFILTER_SIZE(numsrc) \
- (sizeof(struct ip_msfilter) - sizeof(struct in_addr) \
- + (numsrc) * sizeof(struct in_addr))
-
-
-/* ipv6 */
-/* These require XP or .NET Server or use of add-on IPv6 stacks on NT 4
- or higher */
-
-/* This is based on the example given in RFC 2553 with stdint types
- changed to BSD types. For now, use these field names until there
- is some consistency in MS docs. In this file, we only use the
- in6_addr structure start address, with casts to get the right offsets
- when testing addresses */
-
-struct in6_addr {
- union {
- u_char Byte[16];
- u_short Word[8];
- u_long _S6_u32[4];
- } u;
-};
-
-/* s6_addr is the standard name */
-#define s6_addr u.Byte
-
-/* These are GLIBC names */
-#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 u.Byte
-#define _s6_words u.Word
-
-typedef struct in6_addr IN6_ADDR, *PIN6_ADDR, *LPIN6_ADDR;
-
-struct sockaddr_in6 {
- short sin6_family; /* AF_INET6 */
- u_short sin6_port; /* transport layer port # */
- u_long sin6_flowinfo; /* IPv6 traffic class & flow info */
- struct in6_addr sin6_addr; /* IPv6 address */
- u_long sin6_scope_id; /* set of interfaces for a scope */
-};
-typedef struct sockaddr_in6 SOCKADDR_IN6, *PSOCKADDR_IN6, *LPSOCKADDR_IN6;
-
-extern const struct in6_addr in6addr_any;
-extern const struct in6_addr in6addr_loopback;
-/* the above can get initialised using: */
-#define IN6ADDR_ANY_INIT { 0 }
-#define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
-
-/* Described in RFC 2292, but not in 2553 */
-/* int IN6_ARE_ADDR_EQUAL(const struct in6_addr * a, const struct in6_addr * b) */
-#define IN6_ARE_ADDR_EQUAL(a, b) \
- (memcmp ((void*)(a), (void*)(b), sizeof (struct in6_addr)) == 0)
-
-
-/* Address Testing Macros
-
- These macro functions all take const struct in6_addr* as arg.
- Static inlines would allow type checking, but RFC 2553 says they
- macros.
- NB: These are written specifically for little endian host */
-
-#define IN6_IS_ADDR_UNSPECIFIED(_addr) \
- ( (((const u_long *)(_addr))[0] == 0) \
- && (((const u_long *)(_addr))[1] == 0) \
- && (((const u_long *)(_addr))[2] == 0) \
- && (((const u_long *)(_addr))[3] == 0))
-
-#define IN6_IS_ADDR_LOOPBACK(_addr) \
- ( (((const u_long *)(_addr))[0] == 0) \
- && (((const u_long *)(_addr))[1] == 0) \
- && (((const u_long *)(_addr))[2] == 0) \
- && (((const u_long *)(_addr))[3] == 0x01000000)) /* Note byte order reversed */
-/* (((const u_long *)(_addr))[3] == ntohl(1)) */
-
-#define IN6_IS_ADDR_MULTICAST(_addr) (((const u_char *) (_addr))[0] == 0xff)
-
-#define IN6_IS_ADDR_LINKLOCAL(_addr) \
- ( (((const u_char *)(_addr))[0] == 0xfe) \
- && ((((const u_char *)(_addr))[1] & 0xc0) == 0x80))
-
-#define IN6_IS_ADDR_SITELOCAL(_addr) \
- ( (((const u_char *)(_addr))[0] == 0xfe) \
- && ((((const u_char *)(_addr))[1] & 0xc0) == 0xc0))
-
-#define IN6_IS_ADDR_V4MAPPED(_addr) \
- ( (((const u_long *)(_addr))[0] == 0) \
- && (((const u_long *)(_addr))[1] == 0) \
- && (((const u_long *)(_addr))[2] == 0xffff0000)) /* Note byte order reversed */
-/* (((const u_long *)(_addr))[2] == ntohl(0x0000ffff))) */
-
-#define IN6_IS_ADDR_V4COMPAT(_addr) \
- ( (((const u_long *)(_addr))[0] == 0) \
- && (((const u_long *)(_addr))[1] == 0) \
- && (((const u_long *)(_addr))[2] == 0) \
- && (((const u_long *)(_addr))[3] != 0) \
- && (((const u_long *)(_addr))[3] != 0x01000000)) /* Note byte order reversed */
-/* (ntohl (((const u_long *)(_addr))[3]) > 1 ) */
-
-
-#define IN6_IS_ADDR_MC_NODELOCAL(_addr) \
- ( IN6_IS_ADDR_MULTICAST(_addr) \
- && ((((const u_char *)(_addr))[1] & 0xf) == 0x1))
-
-#define IN6_IS_ADDR_MC_LINKLOCAL(_addr) \
- ( IN6_IS_ADDR_MULTICAST (_addr) \
- && ((((const u_char *)(_addr))[1] & 0xf) == 0x2))
-
-#define IN6_IS_ADDR_MC_SITELOCAL(_addr) \
- ( IN6_IS_ADDR_MULTICAST(_addr) \
- && ((((const u_char *)(_addr))[1] & 0xf) == 0x5))
-
-#define IN6_IS_ADDR_MC_ORGLOCAL(_addr) \
- ( IN6_IS_ADDR_MULTICAST(_addr) \
- && ((((const u_char *)(_addr))[1] & 0xf) == 0x8))
-
-#define IN6_IS_ADDR_MC_GLOBAL(_addr) \
- ( IN6_IS_ADDR_MULTICAST(_addr) \
- && ((((const u_char *)(_addr))[1] & 0xf) == 0xe))
-
-
-typedef int socklen_t;
-
-struct ipv6_mreq {
- struct in6_addr ipv6mr_multiaddr;
- unsigned int ipv6mr_interface;
-};
-typedef struct ipv6_mreq IPV6_MREG;
-
-struct in6_pktinfo {
- IN6_ADDR ipi6_addr;
- UINT ipi6_ifindex;
-};
-typedef struct in6_pktinfo IN6_PKTINFO;
-
-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;
+#define EAI_AGAIN WSATRY_AGAIN
+#define EAI_BADFLAGS WSAEINVAL
+#define EAI_FAIL WSANO_RECOVERY
+#define EAI_FAMILY WSAEAFNOSUPPORT
+#define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY
+#define EAI_NODATA EAI_NONAME
+#define EAI_NOSECURENAME WSA_SECURE_HOST_NOT_FOUND
+#define EAI_NONAME WSAHOST_NOT_FOUND
+#define EAI_SERVICE WSATYPE_NOT_FOUND
+#define EAI_SOCKTYPE WSAESOCKTNOSUPPORT
+#define EAI_IPSECPOLICY WSA_IPSEC_NAME_POLICY_ERROR
#ifdef UNICODE
typedef ADDRINFOW ADDRINFOT,*PADDRINFOT;
@@ -308,110 +48,804 @@ typedef ADDRINFOA ADDRINFOT,*PADDRINFOT;
typedef ADDRINFOA ADDRINFO, FAR *LPADDRINFO;
-void WSAAPI freeaddrinfo (struct addrinfo*);
-int WSAAPI getaddrinfo (const char*,const char*,const struct addrinfo*,
- struct addrinfo**);
-
-#define GAI_STRERROR_BUFFER_SIZE 1024
-
-static __inline char*
-gai_strerrorA(int ecode)
-{
- static char buff[GAI_STRERROR_BUFFER_SIZE + 1];
-
- FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
- NULL,
- ecode,
- MAKELANGID(LANG_NEUTRAL,
- SUBLANG_DEFAULT),
- (LPSTR)buff,
- GAI_STRERROR_BUFFER_SIZE,
- NULL);
-
- return buff;
-}
-
-static __inline WCHAR*
-gai_strerrorW(int ecode)
-{
- static WCHAR buff[GAI_STRERROR_BUFFER_SIZE + 1];
-
- FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
- NULL,
- ecode,
- MAKELANGID(LANG_NEUTRAL,
- SUBLANG_DEFAULT),
- (LPWSTR)buff,
- GAI_STRERROR_BUFFER_SIZE,
- NULL);
-
- return buff;
-}
+#if (_WIN32_WINNT >= 0x0600)
#ifdef UNICODE
-#define gai_strerror gai_strerrorW
+typedef ADDRINFOEXW ADDRINFOEX, *PADDRINFOEX;
#else
-#define gai_strerror gai_strerrorA
-#endif /* UNICODE */
+typedef ADDRINFOEXA ADDRINFOEX, *PADDRINFOEX;
+#endif
-int WSAAPI getnameinfo(const struct sockaddr*,socklen_t,char*,DWORD,
- char*,DWORD,int);
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+getaddrinfo(
+ IN PCSTR pNodeName OPTIONAL,
+ IN PCSTR pServiceName OPTIONAL,
+ IN const ADDRINFOA *pHints OPTIONAL,
+ OUT PADDRINFOA *ppResult);
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+GetAddrInfoW(
+ IN PCWSTR pNodeName OPTIONAL,
+ IN PCWSTR pServiceName OPTIONAL,
+ IN const ADDRINFOW *pHints OPTIONAL,
+ OUT PADDRINFOW *ppResult);
+
+#define GetAddrInfoA getaddrinfo
+
+#ifdef UNICODE
+#define GetAddrInfo GetAddrInfoW
+#else
+#define GetAddrInfo GetAddrInfoA
+#endif
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502) */
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef INT
+(WSAAPI *LPFN_GETADDRINFO)(
+ IN PCSTR pNodeName OPTIONAL,
+ IN PCSTR pServiceName OPTIONAL,
+ IN const ADDRINFOA *pHints OPTIONAL,
+ OUT PADDRINFOA *ppResult);
+
+typedef INT
+(WSAAPI *LPFN_GETADDRINFOW)(
+ IN PCWSTR pNodeName OPTIONAL,
+ IN PCWSTR pServiceName OPTIONAL,
+ IN const ADDRINFOW *pHints OPTIONAL,
+ OUT PADDRINFOW *ppResult);
+
+#define LPFN_GETADDRINFOA LPFN_GETADDRINFO
+
+#ifdef UNICODE
+#define LPFN_GETADDRINFOT LPFN_GETADDRINFOW
+#else
+#define LPFN_GETADDRINFOT LPFN_GETADDRINFOA
+#endif
+
+#endif /* INCL_WINSOCK_API_TYPEDEFS */
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef void
+(CALLBACK *LPLOOKUPSERVICE_COMPLETION_ROUTINE)(
+ IN DWORD dwError,
+ IN DWORD dwBytes,
+ IN LPWSAOVERLAPPED lpOverlapped);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+GetAddrInfoExA(
+ IN PCSTR pName OPTIONAL,
+ IN PCSTR pServiceName OPTIONAL,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN const ADDRINFOEXA *hints,
+ OUT PADDRINFOEXA *ppResult,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpNameHandle OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+GetAddrInfoExW(
+ IN PCWSTR pName OPTIONAL,
+ IN PCWSTR pServiceName OPTIONAL,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN const ADDRINFOEXW *hints OPTIONAL,
+ OUT PADDRINFOEXW *ppResult,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpHandle OPTIONAL);
+
+#ifdef UNICODE
+#define GetAddrInfoEx GetAddrInfoExW
+#else
+#define GetAddrInfoEx GetAddrInfoExA
+#endif
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef INT
+(WSAAPI *LPFN_GETADDRINFOEXA)(
+ IN PCSTR pName,
+ IN PCSTR pServiceName OPTIONAL,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN const ADDRINFOEXA *hints OPTIONAL,
+ OUT PADDRINFOEXA *ppResult,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpNameHandle OPTIONAL);
+
+typedef INT
+(WSAAPI *LPFN_GETADDRINFOEXW)(
+ IN PCWSTR pName,
+ IN PCWSTR pServiceName OPTIONAL,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN const ADDRINFOEXW *hints OPTIONAL,
+ OUT PADDRINFOEXW *ppResult,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpHandle OPTIONAL);
+
+#ifdef UNICODE
+#define LPFN_GETADDRINFOEX LPFN_GETADDRINFOEXW
+#else
+#define LPFN_GETADDRINFOEX LPFN_GETADDRINFOEXA
+#endif
+#endif
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+SetAddrInfoExA(
+ IN PCSTR pName,
+ IN PCSTR pServiceName OPTIONAL,
+ IN SOCKET_ADDRESS *pAddresses OPTIONAL,
+ IN DWORD dwAddressCount,
+ IN LPBLOB lpBlob OPTIONAL,
+ IN DWORD dwFlags,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpNameHandle OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+SetAddrInfoExW(
+ IN PCWSTR pName,
+ IN PCWSTR pServiceName OPTIONAL,
+ IN SOCKET_ADDRESS *pAddresses OPTIONAL,
+ IN DWORD dwAddressCount,
+ IN LPBLOB lpBlob OPTIONAL,
+ IN DWORD dwFlags,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpNameHandle OPTIONAL);
+
+#ifdef UNICODE
+#define SetAddrInfoEx SetAddrInfoExW
+#else
+#define SetAddrInfoEx SetAddrInfoExA
+#endif
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef INT
+(WSAAPI *LPFN_SETADDRINFOEXA)(
+ IN PCSTR pName,
+ IN PCSTR pServiceName OPTIONAL,
+ IN SOCKET_ADDRESS *pAddresses OPTIONAL,
+ IN DWORD dwAddressCount,
+ IN LPBLOB lpBlob OPTIONAL,
+ IN DWORD dwFlags,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpNameHandle OPTIONAL);
+
+typedef INT
+(WSAAPI *LPFN_SETADDRINFOEXW)(
+ IN PCWSTR pName,
+ IN PCWSTR pServiceName OPTIONAL,
+ IN SOCKET_ADDRESS *pAddresses OPTIONAL,
+ IN DWORD dwAddressCount,
+ IN LPBLOB lpBlob OPTIONAL,
+ IN DWORD dwFlags,
+ IN DWORD dwNameSpace,
+ IN LPGUID lpNspId OPTIONAL,
+ IN struct timeval *timeout OPTIONAL,
+ IN LPOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPLOOKUPSERVICE_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL,
+ OUT LPHANDLE lpNameHandle OPTIONAL);
+
+#ifdef UNICODE
+#define LPFN_SETADDRINFOEX LPFN_SETADDRINFOEXW
+#else
+#define LPFN_SETADDRINFOEX LPFN_SETADDRINFOEXA
+#endif
+#endif
+
+#endif
+
+WINSOCK_API_LINKAGE
+VOID
+WSAAPI
+freeaddrinfo(
+ IN PADDRINFOA pAddrInfo OPTIONAL);
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
+
+WINSOCK_API_LINKAGE
+VOID
+WSAAPI
+FreeAddrInfoW(
+ IN PADDRINFOW pAddrInfo OPTIONAL);
+
+#define FreeAddrInfoA freeaddrinfo
+
+#ifdef UNICODE
+#define FreeAddrInfo FreeAddrInfoW
+#else
+#define FreeAddrInfo FreeAddrInfoA
+#endif
+#endif
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef VOID
+(WSAAPI *LPFN_FREEADDRINFO)(
+ IN PADDRINFOA pAddrInfo OPTIONAL);
+
+typedef VOID
+(WSAAPI *LPFN_FREEADDRINFOW)(
+ IN PADDRINFOW pAddrInfo OPTIONAL);
+
+#define LPFN_FREEADDRINFOA LPFN_FREEADDRINFO
+
+#ifdef UNICODE
+#define LPFN_FREEADDRINFOT LPFN_FREEADDRINFOW
+#else
+#define LPFN_FREEADDRINFOT LPFN_FREEADDRINFOA
+#endif
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+WINSOCK_API_LINKAGE
+void
+WSAAPI
+FreeAddrInfoEx(
+ IN PADDRINFOEXA pAddrInfoEx OPTIONAL);
+
+WINSOCK_API_LINKAGE
+void
+WSAAPI
+FreeAddrInfoExW(
+ IN PADDRINFOEXW pAddrInfoEx OPTIONAL);
+
+#define FreeAddrInfoExA FreeAddrInfoEx
+
+#ifdef UNICODE
+#define FreeAddrInfoEx FreeAddrInfoExW
+#endif
+
+#ifdef INCL_WINSOCK_API_TYPEDEFS
+
+typedef void
+(WSAAPI *LPFN_FREEADDRINFOEXA)(
+ IN PADDRINFOEXA pAddrInfoEx);
+
+typedef void
+(WSAAPI *LPFN_FREEADDRINFOEXW)(
+ IN PADDRINFOEXW pAddrInfoEx);
+
+
+#ifdef UNICODE
+#define LPFN_FREEADDRINFOEX LPFN_FREEADDRINFOEXW
+#else
+#define LPFN_FREEADDRINFOEX LPFN_FREEADDRINFOEXA
+#endif
+
+#endif
+#endif
+
+typedef int socklen_t;
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+getnameinfo(
+ IN const SOCKADDR *pSockaddr,
+ IN socklen_t SockaddrLength,
+ OUT PCHAR pNodeBuffer OPTIONAL,
+ IN DWORD NodeBufferSize,
+ OUT PCHAR pServiceBuffer,
+ IN DWORD ServiceBufferSize,
+ IN INT Flags);
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+GetNameInfoW(
+ IN const SOCKADDR *pSockaddr,
+ IN socklen_t SockaddrLength,
+ OUT PWCHAR pNodeBuffer,
+ IN DWORD NodeBufferSize,
+ OUT PWCHAR pServiceBuffer OPTIONAL,
+ IN DWORD ServiceBufferSize,
+ IN INT Flags);
-#if (_WIN32_WINNT >= 0x0502)
-INT WSAAPI GetNameInfoW(const SOCKADDR*,socklen_t,PWCHAR,DWORD,PWCHAR,DWORD,INT);
#define GetNameInfoA getnameinfo
#ifdef UNICODE
-#define GetNameInfo GetNameInfoW
+#define GetNameInfo GetNameInfoW
#else
-#define GetNameInfo GetNameInfoA
-#endif /* UNICODE */
-
-#endif /* (_WIN32_WINNT >= 0x0502) */
-
-/* Some older IPv4/IPv6 compatability stuff */
-
-/* This struct lacks sin6_scope_id; retained for use in sockaddr_gen */
-struct sockaddr_in6_old {
- short sin6_family;
- u_short sin6_port;
- u_long sin6_flowinfo;
- struct in6_addr sin6_addr;
-};
-
-typedef union sockaddr_gen{
- struct sockaddr Address;
- struct sockaddr_in AddressIn;
- struct sockaddr_in6_old AddressIn6;
-} sockaddr_gen;
-
-
-typedef struct _INTERFACE_INFO {
- u_long iiFlags;
- sockaddr_gen iiAddress;
- sockaddr_gen iiBroadcastAddress;
- sockaddr_gen iiNetmask;
-} INTERFACE_INFO, *LPINTERFACE_INFO;
-
-/*
- The definition above can cause problems on NT4,prior to sp4.
- To workaround, include the following struct and typedef and
- #define INTERFACE_INFO OLD_INTERFACE_INFO
- See: FIX: WSAIoctl SIO_GET_INTERFACE_LIST Option Problem
- (Q181520) in MSDN KB.
-
- The old definition causes problems on newer NT and on XP.
-
-typedef struct _OLD_INTERFACE_INFO {
- u_long iiFlags;
- struct sockaddr iiAddress;
- struct sockaddr iiBroadcastAddress;
- struct sockaddr iiNetmask;
-} OLD_INTERFACE_INFO;
-*/
-
-#ifdef __cplusplus
-}
+#define GetNameInfo GetNameInfoA
#endif
-#endif /* _WS2TCPIP_H */
+#endif
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef int
+(WSAAPI *LPFN_GETNAMEINFO)(
+ IN const SOCKADDR *pSockaddr,
+ IN socklen_t SockaddrLength,
+ OUT PCHAR pNodeBuffer,
+ IN DWORD NodeBufferSize,
+ OUT PCHAR pServiceBuffer OPTIONAL,
+ IN DWORD ServiceBufferSize,
+ IN INT Flags);
+
+typedef INT
+(WSAAPI *LPFN_GETNAMEINFOW)(
+ IN const SOCKADDR *pSockaddr,
+ IN socklen_t SockaddrLength,
+ OUT PWCHAR pNodeBuffer,
+ IN DWORD NodeBufferSize,
+ OUT PWCHAR pServiceBuffer OPTIONAL,
+ IN DWORD ServiceBufferSize,
+ IN INT Flags);
+
+#define LPFN_GETNAMEINFOA LPFN_GETNAMEINFO
+
+#ifdef UNICODE
+#define LPFN_GETNAMEINFOT LPFN_GETNAMEINFOW
+#else
+#define LPFN_GETNAMEINFOT LPFN_GETNAMEINFOA
+#endif
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+inet_pton(
+ IN INT Family,
+ IN PCSTR pszAddrString,
+ OUT PVOID pAddrBuf);
+
+INT
+WSAAPI
+InetPtonW(
+ IN INT Family,
+ IN PCWSTR pszAddrString,
+ OUT PVOID pAddrBuf);
+
+PCSTR
+WSAAPI
+inet_ntop(
+ IN INT Family,
+ IN PVOID pAddr,
+ OUT PSTR pStringBuf,
+ IN size_t StringBufSize);
+
+PCWSTR
+WSAAPI
+InetNtopW(
+ IN INT Family,
+ IN PVOID pAddr,
+ OUT PWSTR pStringBuf,
+ IN size_t StringBufSize);
+
+#define InetPtonA inet_pton
+#define InetNtopA inet_ntop
+
+#ifdef UNICODE
+#define InetPton InetPtonW
+#define InetNtop InetNtopW
+#else
+#define InetPton InetPtonA
+#define InetNtop InetNtopA
+#endif
+
+#if INCL_WINSOCK_API_TYPEDEFS
+
+typedef INT
+(WSAAPI *LPFN_INET_PTONA)(
+ IN INT Family,
+ IN PCSTR pszAddrString,
+ OUT PVOID pAddrBuf);
+
+typedef INT
+(WSAAPI *LPFN_INET_PTONW)(
+ IN INT Family,
+ IN PCWSTR pszAddrString,
+ OUT PVOID pAddrBuf);
+
+typedef PCSTR
+(WSAAPI *LPFN_INET_NTOPA)(
+ IN INT Family,
+ IN PVOID pAddr,
+ OUT PSTR pStringBuf,
+ IN size_t StringBufSize);
+
+typedef PCWSTR
+(WSAAPI *LPFN_INET_NTOPW)(
+ IN INT Family,
+ IN PVOID pAddr,
+ OUT PWSTR pStringBuf,
+ IN size_t StringBufSize);
+
+#ifdef UNICODE
+#define LPFN_INET_PTON LPFN_INET_PTONW
+#define LPFN_INET_NTOP LPFN_INET_NTOPW
+#else
+#define LPFN_INET_PTON LPFN_INET_PTONA
+#define LPFN_INET_NTOP LPFN_INET_NTOPA
+#endif
+
+#endif /* TYPEDEFS */
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if INCL_WINSOCK_API_PROTOTYPES
+
+#ifdef UNICODE
+#define gai_strerror gai_strerrorW
+#else
+#define gai_strerror gai_strerrorA
+#endif
+
+#define GAI_STRERROR_BUFFER_SIZE 1024
+
+static __inline
+char *
+gai_strerrorA(
+ IN int ecode)
+{
+ DWORD dwMsgLen;
+ static char buff[GAI_STRERROR_BUFFER_SIZE + 1];
+
+ dwMsgLen = FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM
+ |FORMAT_MESSAGE_IGNORE_INSERTS
+ |FORMAT_MESSAGE_MAX_WIDTH_MASK,
+ NULL,
+ ecode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPSTR)buff,
+ GAI_STRERROR_BUFFER_SIZE,
+ NULL);
+
+ return buff;
+}
+
+static __inline
+WCHAR *
+gai_strerrorW(
+ IN int ecode)
+{
+ DWORD dwMsgLen;
+ static WCHAR buff[GAI_STRERROR_BUFFER_SIZE + 1];
+
+ dwMsgLen = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM
+ |FORMAT_MESSAGE_IGNORE_INSERTS
+ |FORMAT_MESSAGE_MAX_WIDTH_MASK,
+ NULL,
+ ecode,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPWSTR)buff,
+ GAI_STRERROR_BUFFER_SIZE,
+ NULL);
+
+ return buff;
+}
+
+#endif /* INCL_WINSOCK_API_PROTOTYPES */
+
+WS2TCPIP_INLINE
+int
+setipv4sourcefilter(
+ IN SOCKET Socket,
+ IN IN_ADDR Interface,
+ IN IN_ADDR Group,
+ IN MULTICAST_MODE_TYPE FilterMode,
+ IN ULONG SourceCount,
+ IN CONST IN_ADDR *SourceList)
+{
+ int Error;
+ DWORD Size, Returned;
+ PIP_MSFILTER Filter;
+
+ if (SourceCount >
+ (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Size = IP_MSFILTER_SIZE(SourceCount);
+ Filter = (PIP_MSFILTER) HeapAlloc(GetProcessHeap(), 0, Size);
+ if (Filter == NULL) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Filter->imsf_multiaddr = Group;
+ Filter->imsf_interface = Interface;
+ Filter->imsf_fmode = FilterMode;
+ Filter->imsf_numsrc = SourceCount;
+ if (SourceCount > 0) {
+ CopyMemory(Filter->imsf_slist, SourceList,
+ SourceCount * sizeof(*SourceList));
+ }
+
+ Error = WSAIoctl(Socket, SIOCSIPMSFILTER, Filter, Size, NULL, 0,
+ &Returned, NULL, NULL);
+
+ HeapFree(GetProcessHeap(), 0, Filter);
+
+ return Error;
+}
+
+WS2TCPIP_INLINE
+int
+getipv4sourcefilter(
+ IN SOCKET Socket,
+ IN IN_ADDR Interface,
+ IN IN_ADDR Group,
+ OUT MULTICAST_MODE_TYPE *FilterMode,
+ IN OUT ULONG *SourceCount,
+ OUT IN_ADDR *SourceList)
+{
+ int Error;
+ DWORD Size, Returned;
+ PIP_MSFILTER Filter;
+
+ if (*SourceCount >
+ (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Size = IP_MSFILTER_SIZE(*SourceCount);
+ Filter = (PIP_MSFILTER) HeapAlloc(GetProcessHeap(), 0, Size);
+ if (Filter == NULL) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Filter->imsf_multiaddr = Group;
+ Filter->imsf_interface = Interface;
+ Filter->imsf_numsrc = *SourceCount;
+
+ Error = WSAIoctl(Socket, SIOCGIPMSFILTER, Filter, Size, Filter, Size,
+ &Returned, NULL, NULL);
+
+ if (Error == 0) {
+ if (*SourceCount > 0) {
+ CopyMemory(SourceList, Filter->imsf_slist,
+ *SourceCount * sizeof(*SourceList));
+ *SourceCount = Filter->imsf_numsrc;
+ }
+ *FilterMode = Filter->imsf_fmode;
+ }
+
+ HeapFree(GetProcessHeap(), 0, Filter);
+
+ return Error;
+}
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+WS2TCPIP_INLINE
+int
+setsourcefilter(
+ IN SOCKET Socket,
+ IN ULONG Interface,
+ IN CONST SOCKADDR *Group,
+ IN int GroupLength,
+ IN MULTICAST_MODE_TYPE FilterMode,
+ IN ULONG SourceCount,
+ IN CONST SOCKADDR_STORAGE *SourceList)
+{
+ int Error;
+ DWORD Size, Returned;
+ PGROUP_FILTER Filter;
+
+ if (SourceCount >= (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Size = GROUP_FILTER_SIZE(SourceCount);
+ Filter = (PGROUP_FILTER) HeapAlloc(GetProcessHeap(), 0, Size);
+ if (Filter == NULL) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Filter->gf_interface = Interface;
+ ZeroMemory(&Filter->gf_group, sizeof(Filter->gf_group));
+ CopyMemory(&Filter->gf_group, Group, GroupLength);
+ Filter->gf_fmode = FilterMode;
+ Filter->gf_numsrc = SourceCount;
+ if (SourceCount > 0) {
+ CopyMemory(Filter->gf_slist, SourceList, SourceCount * sizeof(*SourceList));
+ }
+
+ Error = WSAIoctl(Socket, SIOCSMSFILTER, Filter, Size, NULL, 0, &Returned, NULL, NULL);
+ HeapFree(GetProcessHeap(), 0, Filter);
+
+ return Error;
+}
+
+WS2TCPIP_INLINE
+int
+getsourcefilter(
+ IN SOCKET Socket,
+ IN ULONG Interface,
+ IN CONST SOCKADDR *Group,
+ IN int GroupLength,
+ OUT MULTICAST_MODE_TYPE *FilterMode,
+ IN OUT ULONG *SourceCount,
+ OUT SOCKADDR_STORAGE *SourceList)
+{
+ int Error;
+ DWORD Size, Returned;
+ PGROUP_FILTER Filter;
+
+ if (*SourceCount > (((ULONG) (ULONG_MAX - sizeof(*Filter))) / sizeof(*SourceList))) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Size = GROUP_FILTER_SIZE(*SourceCount);
+ Filter = (PGROUP_FILTER) HeapAlloc(GetProcessHeap(), 0, Size);
+ if (Filter == NULL) {
+ WSASetLastError(WSAENOBUFS);
+ return SOCKET_ERROR;
+ }
+
+ Filter->gf_interface = Interface;
+ ZeroMemory(&Filter->gf_group, sizeof(Filter->gf_group));
+ CopyMemory(&Filter->gf_group, Group, GroupLength);
+ Filter->gf_numsrc = *SourceCount;
+
+ Error = WSAIoctl(Socket, SIOCGMSFILTER, Filter, Size, Filter, Size, &Returned, NULL, NULL);
+ if (Error == 0) {
+ if (*SourceCount > 0) {
+ CopyMemory(SourceList, Filter->gf_slist, *SourceCount * sizeof(*SourceList));
+ *SourceCount = Filter->gf_numsrc;
+ }
+ *FilterMode = Filter->gf_fmode;
+ }
+
+ HeapFree(GetProcessHeap(), 0, Filter);
+
+ return Error;
+}
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#ifdef IDEAL_SEND_BACKLOG_IOCTLS
+
+WS2TCPIP_INLINE
+int
+idealsendbacklogquery(
+ IN SOCKET s,
+ OUT ULONG *pISB)
+{
+ DWORD bytes;
+
+ return WSAIoctl(s, SIO_IDEAL_SEND_BACKLOG_QUERY,
+ NULL, 0, pISB, sizeof(*pISB), &bytes, NULL, NULL);
+}
+
+WS2TCPIP_INLINE
+int
+idealsendbacklognotify(
+ IN SOCKET s,
+ IN LPWSAOVERLAPPED lpOverlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine OPTIONAL)
+{
+ DWORD bytes;
+
+ return WSAIoctl(s, SIO_IDEAL_SEND_BACKLOG_CHANGE,
+ NULL, 0, NULL, 0, &bytes,
+ lpOverlapped, lpCompletionRoutine);
+}
+
+#endif /* IDEAL_SEND_BACKLOG_IOCTLS */
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#ifdef _SECURE_SOCKET_TYPES_DEFINED_
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSASetSocketSecurity(
+ IN SOCKET Socket,
+ IN const SOCKET_SECURITY_SETTINGS *SecuritySettings OPTIONAL,
+ IN ULONG SecuritySettingsLen,
+ IN LPWSAOVERLAPPED Overlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAQuerySocketSecurity(
+ IN SOCKET Socket,
+ IN const SOCKET_SECURITY_QUERY_TEMPLATE *SecurityQueryTemplate OPTIONAL,
+ IN ULONG SecurityQueryTemplateLen,
+ OUT SOCKET_SECURITY_QUERY_INFO* SecurityQueryInfo OPTIONAL,
+ IN OUT ULONG *SecurityQueryInfoLen,
+ IN LPWSAOVERLAPPED Overlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSASetSocketPeerTargetName(
+ IN SOCKET Socket,
+ IN const SOCKET_PEER_TARGET_NAME *PeerTargetName,
+ IN ULONG PeerTargetNameLen,
+ IN LPWSAOVERLAPPED Overlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSADeleteSocketPeerTargetName(
+ IN SOCKET Socket,
+ IN const struct sockaddr *PeerAddr,
+ IN ULONG PeerAddrLen,
+ IN LPWSAOVERLAPPED Overlapped OPTIONAL,
+ IN LPWSAOVERLAPPED_COMPLETION_ROUTINE CompletionRoutine OPTIONAL);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSAImpersonateSocketPeer(
+ IN SOCKET Socket,
+ IN const struct sockaddr *PeerAddr OPTIONAL,
+ IN ULONG PeerAddrLen);
+
+WINSOCK_API_LINKAGE
+INT
+WSAAPI
+WSARevertImpersonation();
+
+#endif /* _SECURE_SOCKET_TYPES_DEFINED_ */
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#if !defined(_WIN32_WINNT) || (_WIN32_WINNT <= 0x0500)
+#include
+#endif
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/psdk/wsipv6ok.h b/include/psdk/wsipv6ok.h
new file mode 100644
index 00000000000..b9950254e66
--- /dev/null
+++ b/include/psdk/wsipv6ok.h
@@ -0,0 +1,83 @@
+#pragma once
+
+#ifdef IPV6STRICT
+
+#include
+#include
+
+#undef AF_INET
+#define AF_INET AF_INET_IPV6INCOMPATIBLE
+#undef PF_INET
+#define PF_INET PF_INET_IPV6INCOMPATIBLE
+#undef in_addr
+#define in_addr in_addr_IPV6INCOMPATIBLE
+#undef IN_ADDR
+#define IN_ADDR IN_ADDR_IPV6INCOMPATIBLE
+#undef PIN_ADDR
+#define PIN_ADDR PIN_ADDR_IPV6INCOMPATIBLE
+#undef LPIN_ADDR
+#define LPIN_ADDR LPIN_ADDR_IPV6INCOMPATIBLE
+#undef IPAddr
+#define IPAddr IPAddr_IPV6INCOMPATIBLE
+#undef sockaddr_in
+#define sockaddr_in sockaddr_in_IPV6INCOMPATIBLE
+#undef SOCKADDR_IN
+#define SOCKADDR_IN SOCKADDR_IN_IPV6INCOMPATIBLE
+#undef PSOCKADDR_IN
+#define PSOCKADDR_IN PSOCKADDR_IN_IPV6INCOMPATIBLE
+#undef LPSOCKADDR_IN
+#define LPSOCKADDR_IN LPSOCKADDR_IN_IPV6INCOMPATIBLE
+#undef INADDR_ANY
+#define INADDR_ANY INADDR_ANY_IPV6INCOMPATIBLE
+#undef INADDR_LOOPBACK
+#define INADDR_LOOPBACK INADDR_LOOPBACK_IPV6INCOMPATIBLE
+#undef IPPROTO_IP
+#define IPPROTO_IP IPPROTO_IP_IPV6INCOMPATIBLE
+#undef IP_MULTICAST_IF
+#define IP_MULTICAST_IF IP_MULTICAST_IF_IPV6INCOMPATIBLE
+#undef IP_MULTICAST_TTL
+#define IP_MULTICAST_TTL IP_MULTICAST_TTL_IPV6INCOMPATIBLE
+#undef IP_MULTICAST_LOOP
+#define IP_MULTICAST_LOOP IP_MULTICAST_LOOP_IPV6INCOMPATIBLE
+#undef IP_ADD_MEMBERSHIP
+#define IP_ADD_MEMBERSHIP IP_ADD_MEMBERSHIP_IPV6INCOMPATIBLE
+#undef IP_DROP_MEMBERSHIP
+#define IP_DROP_MEMBERSHIP IP_DROP_MEMBERSHIP_IPV6INCOMPATIBLE
+#undef ip_mreq
+#define ip_mreq ip_mreq_IPV6INCOMPATIBLE
+#undef gethostbyname
+#define gethostbyname(a) gethostbyname_IPV6INCOMPATIBLE
+#undef hostent
+#define hostent hostent_IPV6INCOMPATIBLE
+#undef HOSTENT
+#define HOSTENT HOSTENT_IPV6INCOMPATIBLE
+#undef PHOSTENT
+#define PHOSTENT PHOSTENT_IPV6INCOMPATIBLE
+#undef LPHOSTENT
+#define LPHOSTENT LPHOSTENT_IPV6INCOMPATIBLE
+#undef inet_addr
+#define inet_addr(a) inet_addr_IPV6INCOMPATIBLE
+#undef gethostbyaddr
+#define gethostbyaddr(a,b,c) gethostbyaddr_IPV6INCOMPATIBLE
+#undef inet_ntoa
+#define inet_ntoa(a) inet_ntoa_IPV6INCOMPATIBLE
+#undef IN_MULTICAST
+#define IN_MULTICAST(a) IN_MULTICAST_IPV6INCOMPATIBLE
+#undef IN_CLASSD
+#define IN_CLASSD(a) IN_CLASSD_IPV6INCOMPATIBLE
+#undef IP_TTL
+#define IP_TTL IP_TTL_IPV6INCOMPATIBLE
+#undef IN_CLASSA
+#define IN_CLASSA(a) IN_CLASSA_IPV6INCOMPATIBLE
+#undef IN_CLASSB
+#define IN_CLASSB(a) IN_CLASSB_IPV6INCOMPATIBLE
+#undef IN_CLASSC
+#define IN_CLASSC(a) IN_CLASSC_IPV6INCOMPATIBLE
+#undef INADDR_BROADCAST
+#define INADDR_BROADCAST(a) INADDR_BROADCAST_IPV6INCOMPATIBLE
+#undef WSAAsyncGetHostByAddr
+#define WSAAsyncGetHostByAddr(a,b,c,d,e,f,g) WSAAsyncGetHostByAddr_IPV6INCOMPATIBLE
+#undef WSAAsyncGetHostByName
+#define WSAAsyncGetHostByName(a,b,c,d,e) WSAAsyncGetHostByName_IPV6INCOMPATIBLE
+
+#endif
\ No newline at end of file
diff --git a/include/psdk/wspiapi.h b/include/psdk/wspiapi.h
new file mode 100644
index 00000000000..4b4b5ce6008
--- /dev/null
+++ b/include/psdk/wspiapi.h
@@ -0,0 +1,563 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+#include
+#include
+#include
+#include
+
+#if defined(__GOT_SECURE_LIB__) && __GOT_SECURE_LIB__ >= 200402L
+
+#define _WSPIAPI_STRCPY_S strcpy_s
+#define _WSPIAPI_STRCAT_S strcat_s
+
+#else
+
+#define _WSPIAPI_STRCPY_S(_Dst, _Size, _Src) strcpy((_Dst), (_Src))
+#define _WSPIAPI_STRCAT_S(_Dst, _Size, _Src) strcat((_Dst), (_Src))
+
+#endif /* defined(__GOT_SECURE_LIB__) && __GOT_SECURE_LIB__ >= 200402L */
+
+#define _WSPIAPI_STRNCPY_S(_Dst, _Size, _Src, _Count) strncpy((_Dst), (_Src), (_Count)); (_Dst)[(_Size) - 1] = 0 //FIXME
+#define _WSPIAPI_SPRINTF_S_1(_Dst, _Size, _Format, _Arg1) sprintf((_Dst), (_Format), (_Arg1)) //FIXME
+
+#if !defined(_WSPIAPI_COUNTOF)
+
+#if !defined(__cplusplus)
+#define _WSPIAPI_COUNTOF(_Array) (sizeof(_Array) / sizeof(_Array[0]))
+#else
+template
+char (&__wspiapi_countof_helper(__CountofType (&_Array)[_N]))[_N];
+#define _WSPIAPI_COUNTOF(_Array) sizeof(__wspiapi_countof_helper(_Array))
+#endif
+
+#endif /* !defined(_WSPIAPI_COUNTOF) */
+
+#define WspiapiMalloc(tSize) calloc(1, (tSize))
+#define WspiapiFree(p) free(p)
+#define WspiapiSwap(a, b, c) {(c) = (a); (a) = (b); (b) = (c);}
+#define getaddrinfo WspiapiGetAddrInfo
+#define getnameinfo WspiapiGetNameInfo
+#define freeaddrinfo WspiapiFreeAddrInfo
+
+typedef int
+(WINAPI *WSPIAPI_PGETADDRINFO)(
+ IN const char *nodename,
+ IN const char *servname,
+ IN const struct addrinfo *hints,
+ OUT struct addrinfo **res);
+
+typedef int
+(WINAPI *WSPIAPI_PGETNAMEINFO)(
+ IN const struct sockaddr *sa,
+ IN socklen_t salen,
+ OUT char *host,
+ IN size_t hostlen,
+ OUT char *serv,
+ IN size_t servlen,
+ IN int flags);
+
+typedef void
+(WINAPI *WSPIAPI_PFREEADDRINFO)(
+ IN struct addrinfo *ai);
+
+FORCEINLINE
+char *
+WINAPI
+WspiapiStrdup(
+ IN const char *pszString)
+{
+ char *pszMemory;
+ size_t cchMemory;
+
+ if (!pszString) return(NULL);
+ cchMemory = strlen(pszString) + 1;
+ pszMemory = (char *) WspiapiMalloc(cchMemory);
+ if (!pszMemory) return(NULL);
+ _WSPIAPI_STRCPY_S(pszMemory, cchMemory, pszString);
+ return pszMemory;
+}
+
+FORCEINLINE
+BOOL
+WINAPI
+WspiapiParseV4Address(
+ IN const char *pszAddress,
+ OUT PDWORD pdwAddress)
+{
+ DWORD dwAddress = 0;
+ const char *pcNext = NULL;
+ int iCount = 0;
+
+ for (pcNext = pszAddress; *pcNext != '\0'; pcNext++)
+ if (*pcNext == '.') iCount++;
+ if (iCount != 3) return FALSE;
+ dwAddress = inet_addr(pszAddress);
+ if (dwAddress == INADDR_NONE) return FALSE;
+ *pdwAddress = dwAddress;
+ return TRUE;
+}
+
+FORCEINLINE
+struct addrinfo *
+WINAPI
+WspiapiNewAddrInfo(
+ IN int iSocketType,
+ IN int iProtocol,
+ IN WORD wPort,
+ IN DWORD dwAddress)
+{
+ struct addrinfo *ptNew;
+ struct sockaddr_in *ptAddress;
+
+ ptNew = (struct addrinfo *) WspiapiMalloc(sizeof(struct addrinfo));
+ if (!ptNew) return NULL;
+ ptAddress = (struct sockaddr_in *) WspiapiMalloc(sizeof(struct sockaddr_in));
+ if (!ptAddress) {
+ WspiapiFree(ptNew);
+ return NULL;
+ }
+ ptAddress->sin_family = AF_INET;
+ ptAddress->sin_port = wPort;
+ ptAddress->sin_addr.s_addr = dwAddress;
+ ptNew->ai_family = PF_INET;
+ ptNew->ai_socktype = iSocketType;
+ ptNew->ai_protocol = iProtocol;
+ ptNew->ai_addrlen = sizeof(struct sockaddr_in);
+ ptNew->ai_addr = (struct sockaddr *) ptAddress;
+
+ return ptNew;
+}
+
+FORCEINLINE
+int
+WINAPI
+WspiapiQueryDNS(
+ IN const char *pszNodeName,
+ IN int iSocketType,
+ IN int iProtocol,
+ IN WORD wPort,
+ OUT char pszAlias[NI_MAXHOST],
+ OUT struct addrinfo **pptResult)
+{
+ struct addrinfo **pptNext = pptResult;
+ struct hostent *ptHost = NULL;
+ char **ppAddresses;
+
+ *pptNext = NULL;
+ pszAlias[0] = '\0';
+
+ ptHost = gethostbyname(pszNodeName);
+ if (ptHost) {
+ if ((ptHost->h_addrtype == AF_INET) && (ptHost->h_length == sizeof(struct in_addr))) {
+ for (ppAddresses = ptHost->h_addr_list; *ppAddresses != NULL; ppAddresses++) {
+ *pptNext = WspiapiNewAddrInfo(iSocketType, iProtocol, wPort, ((struct in_addr *) *ppAddresses)->s_addr);
+ if (!*pptNext) return EAI_MEMORY;
+ pptNext = &((*pptNext)->ai_next);
+ }
+ }
+ _WSPIAPI_STRNCPY_S(pszAlias, NI_MAXHOST, ptHost->h_name, NI_MAXHOST - 1);
+ return 0;
+ }
+ switch (WSAGetLastError()) {
+ case WSAHOST_NOT_FOUND: return EAI_NONAME;
+ case WSATRY_AGAIN: return EAI_AGAIN;
+ case WSANO_RECOVERY: return EAI_FAIL;
+ case WSANO_DATA: return EAI_NODATA;
+ default: return EAI_NONAME;
+ }
+}
+
+FORCEINLINE
+int
+WINAPI
+WspiapiLookupNode(
+ IN const char *pszNodeName,
+ IN int iSocketType,
+ IN int iProtocol,
+ IN WORD wPort,
+ IN BOOL bAI_CANONNAME,
+ OUT struct addrinfo **pptResult)
+{
+ int iError = 0;
+ int iAliasCount = 0;
+ char szFQDN1[NI_MAXHOST] = "";
+ char szFQDN2[NI_MAXHOST] = "";
+ char *pszName = szFQDN1;
+ char *pszAlias = szFQDN2;
+ char *pszScratch = NULL;
+
+ _WSPIAPI_STRNCPY_S(pszName, NI_MAXHOST, pszNodeName, NI_MAXHOST - 1);
+ for (;;) {
+ iError = WspiapiQueryDNS(pszNodeName, iSocketType, iProtocol, wPort, pszAlias, pptResult);
+ if (iError) break;
+ if (*pptResult) break;
+ if ((!strlen(pszAlias)) || (!strcmp(pszName, pszAlias)) || (++iAliasCount == 16)) {
+ iError = EAI_FAIL;
+ break;
+ }
+ WspiapiSwap(pszName, pszAlias, pszScratch);
+ }
+ if (!iError && bAI_CANONNAME) {
+ (*pptResult)->ai_canonname = WspiapiStrdup(pszAlias);
+ if (!(*pptResult)->ai_canonname) iError = EAI_MEMORY;
+ }
+
+ return iError;
+}
+
+
+
+FORCEINLINE
+int
+WINAPI
+WspiapiClone(
+ IN WORD wPort,
+ IN struct addrinfo *ptResult)
+{
+ struct addrinfo *ptNext = NULL;
+ struct addrinfo *ptNew = NULL;
+
+ for (ptNext = ptResult; ptNext != NULL; ) {
+ ptNew = WspiapiNewAddrInfo(SOCK_DGRAM, ptNext->ai_protocol, wPort,
+ ((struct sockaddr_in *) ptNext->ai_addr)->sin_addr.s_addr);
+ if (!ptNew) break;
+ ptNew->ai_next = ptNext->ai_next;
+ ptNext->ai_next = ptNew;
+ ptNext = ptNew->ai_next;
+ }
+ if (ptNext != NULL) return EAI_MEMORY;
+
+ return 0;
+}
+
+FORCEINLINE
+void
+WINAPI
+WspiapiLegacyFreeAddrInfo(
+ IN struct addrinfo *ptHead)
+{
+ struct addrinfo *ptNext;
+
+ for (ptNext = ptHead; ptNext != NULL; ptNext = ptHead) {
+ if (ptNext->ai_canonname) WspiapiFree(ptNext->ai_canonname);
+ if (ptNext->ai_addr) WspiapiFree(ptNext->ai_addr);
+ ptHead = ptNext->ai_next;
+ WspiapiFree(ptNext);
+ }
+}
+
+FORCEINLINE
+int
+WINAPI
+WspiapiLegacyGetAddrInfo(
+ IN const char *pszNodeName,
+ IN const char *pszServiceName,
+ IN const struct addrinfo *ptHints,
+ OUT struct addrinfo **pptResult)
+{
+ int iError = 0;
+ int iFlags = 0;
+ int iFamily = PF_UNSPEC;
+ int iSocketType = 0;
+ int iProtocol = 0;
+ WORD wPort = 0;
+ DWORD dwAddress = 0;
+ struct servent *ptService = NULL;
+ char *pc = NULL;
+ BOOL bClone = FALSE;
+ WORD wTcpPort = 0;
+ WORD wUdpPort = 0;
+ *pptResult = NULL;
+
+ if ((!pszNodeName) && (!pszServiceName)) return EAI_NONAME;
+ if (ptHints) {
+ if ((ptHints->ai_addrlen != 0) ||
+ (ptHints->ai_canonname != NULL) ||
+ (ptHints->ai_addr != NULL) ||
+ (ptHints->ai_next != NULL)) {
+ return EAI_FAIL;
+ }
+ iFlags = ptHints->ai_flags;
+ if ((iFlags & AI_CANONNAME) && !pszNodeName) return EAI_BADFLAGS;
+ iFamily = ptHints->ai_family;
+ if ((iFamily != PF_UNSPEC) && (iFamily != PF_INET)) return EAI_FAMILY;
+ iSocketType = ptHints->ai_socktype;
+ if ((iSocketType != 0) &&
+ (iSocketType != SOCK_STREAM) &&
+ (iSocketType != SOCK_DGRAM) &&
+ (iSocketType != SOCK_RAW))
+ return EAI_SOCKTYPE;
+ iProtocol = ptHints->ai_protocol;
+ }
+ if (pszServiceName) {
+ wPort = (WORD) strtoul(pszServiceName, &pc, 10);
+ if (*pc == '\0') {
+ wPort = wTcpPort = wUdpPort = htons(wPort);
+ if (iSocketType == 0) {
+ bClone = TRUE;
+ iSocketType = SOCK_STREAM;
+ }
+ }
+ else {
+ if ((iSocketType == 0) || (iSocketType == SOCK_DGRAM)) {
+ ptService = getservbyname(pszServiceName, "udp");
+ if (ptService) wPort = wUdpPort = ptService->s_port;
+ }
+ if ((iSocketType == 0) || (iSocketType == SOCK_STREAM)) {
+ ptService = getservbyname(pszServiceName, "tcp");
+ if (ptService) wPort = wTcpPort = ptService->s_port;
+ }
+ if (wPort == 0) return (iSocketType ? EAI_SERVICE : EAI_NONAME);
+ if (iSocketType == 0) {
+ iSocketType = (wTcpPort) ? SOCK_STREAM : SOCK_DGRAM;
+ bClone = (wTcpPort && wUdpPort);
+ }
+ }
+ }
+ if ((!pszNodeName) || (WspiapiParseV4Address(pszNodeName, &dwAddress))) {
+ if (!pszNodeName) dwAddress = htonl((iFlags & AI_PASSIVE) ? INADDR_ANY : INADDR_LOOPBACK);
+ *pptResult = WspiapiNewAddrInfo(iSocketType, iProtocol, wPort, dwAddress);
+ if (!(*pptResult)) iError = EAI_MEMORY;
+ if (!iError && pszNodeName) {
+ (*pptResult)->ai_flags |= AI_NUMERICHOST;
+ if (iFlags & AI_CANONNAME) {
+ (*pptResult)->ai_canonname = WspiapiStrdup(inet_ntoa(*((struct in_addr *) &dwAddress)));
+ if (!(*pptResult)->ai_canonname) iError = EAI_MEMORY;
+ }
+ }
+ }
+ else if (iFlags & AI_NUMERICHOST) {
+ iError = EAI_NONAME;
+ }
+ else {
+ iError = WspiapiLookupNode(pszNodeName, iSocketType,
+ iProtocol, wPort,
+ (iFlags & AI_CANONNAME),
+ pptResult);
+ }
+ if (!iError && bClone) {
+ iError = WspiapiClone(wUdpPort, *pptResult);
+ }
+ if (iError) {
+ WspiapiLegacyFreeAddrInfo(*pptResult);
+ *pptResult = NULL;
+ }
+
+ return (iError);
+}
+
+FORCEINLINE
+int
+WINAPI
+WspiapiLegacyGetNameInfo(
+ IN const struct sockaddr *ptSocketAddress,
+ IN socklen_t tSocketLength,
+ OUT char *pszNodeName,
+ IN size_t tNodeLength,
+ OUT char *pszServiceName,
+ IN size_t tServiceLength,
+ IN int iFlags)
+{
+ struct servent *ptService;
+ WORD wPort;
+ char szBuffer[] = "65535";
+ char *pszService = szBuffer;
+ struct hostent *ptHost;
+ struct in_addr tAddress;
+ char *pszNode = NULL;
+ char *pc = NULL;
+
+ if ((!ptSocketAddress) || (tSocketLength < sizeof(struct sockaddr))) return EAI_FAIL;
+ if (ptSocketAddress->sa_family != AF_INET) return EAI_FAMILY;
+ if (tSocketLength < sizeof(struct sockaddr_in)) return EAI_FAIL;
+ if (!(pszNodeName && tNodeLength) && !(pszServiceName && tServiceLength)) {
+ return EAI_NONAME;
+ }
+ if ((iFlags & NI_NUMERICHOST) && (iFlags & NI_NAMEREQD)) {
+ return EAI_BADFLAGS;
+ }
+ if (pszServiceName && tServiceLength) {
+ wPort = ((struct sockaddr_in *) ptSocketAddress)->sin_port;
+ if (iFlags & NI_NUMERICSERV) {
+ _WSPIAPI_SPRINTF_S_1(szBuffer, _WSPIAPI_COUNTOF(szBuffer), "%u", ntohs(wPort));
+ }
+ else {
+ ptService = getservbyport(wPort, (iFlags & NI_DGRAM) ? "udp" : NULL);
+ if (ptService && ptService->s_name) {
+ pszService = ptService->s_name;
+ }
+ else {
+ _WSPIAPI_SPRINTF_S_1(szBuffer, _WSPIAPI_COUNTOF(szBuffer), "%u", ntohs(wPort));
+ }
+ }
+ if (tServiceLength > strlen(pszService))
+ _WSPIAPI_STRCPY_S(pszServiceName, tServiceLength, pszService);
+ else return EAI_FAIL;
+ }
+ if (pszNodeName && tNodeLength) {
+ tAddress = ((struct sockaddr_in *) ptSocketAddress)->sin_addr;
+ if (iFlags & NI_NUMERICHOST) {
+ pszNode = inet_ntoa(tAddress);
+ }
+ else {
+ ptHost = gethostbyaddr((char *) &tAddress, sizeof(struct in_addr), AF_INET);
+ if (ptHost && ptHost->h_name) {
+ pszNode = ptHost->h_name;
+ if ((iFlags & NI_NOFQDN) && ((pc = strchr(pszNode, '.')) != NULL)) *pc = '\0';
+ }
+ else {
+ if (iFlags & NI_NAMEREQD) {
+ switch (WSAGetLastError()) {
+ case WSAHOST_NOT_FOUND: return EAI_NONAME;
+ case WSATRY_AGAIN: return EAI_AGAIN;
+ case WSANO_RECOVERY: return EAI_FAIL;
+ default: return EAI_NONAME;
+ }
+ }
+ else pszNode = inet_ntoa(tAddress);
+ }
+ }
+ if (tNodeLength > strlen(pszNode)) _WSPIAPI_STRCPY_S(pszNodeName, tNodeLength, pszNode);
+ else return EAI_FAIL;
+ }
+
+ return 0;
+}
+
+typedef struct {
+ char const *pszName;
+ FARPROC pfAddress;
+} WSPIAPI_FUNCTION;
+
+#define WSPIAPI_FUNCTION_ARRAY { \
+ "getaddrinfo", (FARPROC) WspiapiLegacyGetAddrInfo, \
+ "getnameinfo", (FARPROC) WspiapiLegacyGetNameInfo, \
+ "freeaddrinfo", (FARPROC) WspiapiLegacyFreeAddrInfo, \
+}
+
+FORCEINLINE
+FARPROC
+WINAPI
+WspiapiLoad(
+ IN WORD wFunction)
+{
+ HMODULE hLibrary = NULL;
+
+ static BOOL bInitialized = FALSE;
+ static WSPIAPI_FUNCTION rgtGlobal[] = WSPIAPI_FUNCTION_ARRAY;
+ static const int iNumGlobal = (sizeof(rgtGlobal) / sizeof(WSPIAPI_FUNCTION));
+ WSPIAPI_FUNCTION rgtLocal[] = WSPIAPI_FUNCTION_ARRAY;
+ FARPROC fScratch = NULL;
+ int i = 0;
+
+ if (bInitialized) return (rgtGlobal[wFunction].pfAddress);
+ for (;;) {
+ CHAR SystemDir[MAX_PATH + 1];
+ CHAR Path[MAX_PATH + 8];
+ if (GetSystemDirectoryA(SystemDir, MAX_PATH) == 0) break;
+ _WSPIAPI_STRCPY_S(Path, _WSPIAPI_COUNTOF(Path), SystemDir);
+ _WSPIAPI_STRCAT_S(Path, _WSPIAPI_COUNTOF(Path), "\\ws2_32");
+ hLibrary = LoadLibraryA(Path);
+ if (hLibrary != NULL) {
+ fScratch = GetProcAddress(hLibrary, "getaddrinfo");
+ if (fScratch == NULL) {
+ FreeLibrary(hLibrary);
+ hLibrary = NULL;
+ }
+ }
+ if (hLibrary != NULL) break;
+ _WSPIAPI_STRCPY_S(Path, _WSPIAPI_COUNTOF(Path), SystemDir);
+ _WSPIAPI_STRCAT_S(Path, _WSPIAPI_COUNTOF(Path), "\\wship6");
+ hLibrary = LoadLibraryA(Path);
+ if (hLibrary != NULL) {
+ fScratch = GetProcAddress(hLibrary, "getaddrinfo");
+ if (fScratch == NULL) {
+ FreeLibrary(hLibrary);
+ hLibrary = NULL;
+ }
+ }
+ break;
+ }
+ if (hLibrary != NULL) {
+ for (i = 0; i < iNumGlobal; i++) {
+ rgtLocal[i].pfAddress = GetProcAddress(hLibrary, rgtLocal[i].pszName);
+ if (rgtLocal[i].pfAddress == NULL) {
+ FreeLibrary(hLibrary);
+ hLibrary = NULL;
+ break;
+ }
+ }
+ if (hLibrary != NULL) {
+ for (i = 0; i < iNumGlobal; i++)
+ rgtGlobal[i].pfAddress = rgtLocal[i].pfAddress;
+ }
+ }
+ bInitialized = TRUE;
+
+ return (rgtGlobal[wFunction].pfAddress);
+}
+
+FORCEINLINE
+int
+WINAPI
+WspiapiGetAddrInfo(
+ IN const char *nodename OPTIONAL,
+ IN const char *servname OPTIONAL,
+ IN const struct addrinfo *hints OPTIONAL,
+ OUT struct addrinfo **res)
+{
+ int iError;
+ static WSPIAPI_PGETADDRINFO pfGetAddrInfo = NULL;
+
+ if (!pfGetAddrInfo) pfGetAddrInfo = (WSPIAPI_PGETADDRINFO) WspiapiLoad(0);
+ iError = (*pfGetAddrInfo)(nodename, servname, hints, res);
+ WSASetLastError(iError);
+
+ return iError;
+}
+
+FORCEINLINE
+int
+WINAPI
+WspiapiGetNameInfo(
+ IN const struct sockaddr *sa,
+ IN socklen_t salen,
+ OUT char *host,
+ IN size_t hostlen,
+ OUT char *serv,
+ IN size_t servlen,
+ IN int flags)
+{
+ int iError;
+ static WSPIAPI_PGETNAMEINFO pfGetNameInfo = NULL;
+
+ if (!pfGetNameInfo) pfGetNameInfo = (WSPIAPI_PGETNAMEINFO) WspiapiLoad(1);
+ iError = (*pfGetNameInfo)(sa, salen, host, hostlen, serv, servlen, flags);
+ WSASetLastError(iError);
+
+ return iError;
+}
+
+FORCEINLINE
+void
+WINAPI
+WspiapiFreeAddrInfo(
+ IN struct addrinfo *ai)
+{
+ static WSPIAPI_PFREEADDRINFO pfFreeAddrInfo = NULL;
+
+ if (!pfFreeAddrInfo) pfFreeAddrInfo = (WSPIAPI_PFREEADDRINFO) WspiapiLoad(2);
+ (*pfFreeAddrInfo)(ai);
+}
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/reactos/arm/armddk.h b/include/reactos/arm/armddk.h
index 82e6d9fdd72..ad235b0b56b 100644
--- a/include/reactos/arm/armddk.h
+++ b/include/reactos/arm/armddk.h
@@ -185,10 +185,40 @@ struct _TEB* NtCurrentTeb(VOID)
}
NTSYSAPI
-PKTHREAD
+struct _KTHREAD*
NTAPI
KeGetCurrentThread(VOID);
+extern volatile struct _KSYSTEM_TIME KeTickCount;
+
+#ifndef YieldProcessor
+#define YieldProcessor __yield
+#endif
+
+#define ASSERT_BREAKPOINT BREAKPOINT_COMMAND_STRING + 1
+
+#define DbgRaiseAssertionFailure() __break(ASSERT_BREAKPOINT)
+
+#define PCR_MINOR_VERSION 1
+#define PCR_MAJOR_VERSION 1
+
+#define RESULT_ZERO 0
+#define RESULT_NEGATIVE 1
+#define RESULT_POSITIVE 2
+
+DECLSPEC_IMPORT
+VOID
+__fastcall
+KfReleaseSpinLock(
+ IN OUT ULONG_PTR* SpinLock,
+ IN KIRQL NewIrql);
+
+DECLSPEC_IMPORT
+KIRQL
+__fastcall
+KfAcquireSpinLock(
+ IN OUT ULONG_PTR* SpinLock);
+
#ifndef _WINNT_H
//
// IRQL Support on ARM is similar to MIPS/ALPHA
diff --git a/include/reactos/libs/pseh/pseh2.h b/include/reactos/libs/pseh/pseh2.h
index ce1326e9ae0..6c473a4c43d 100644
--- a/include/reactos/libs/pseh/pseh2.h
+++ b/include/reactos/libs/pseh/pseh2.h
@@ -26,7 +26,7 @@
#ifndef KJK_PSEH2_H_
#define KJK_PSEH2_H_
-#if !defined (__arm__)
+#if !defined (__arm__) && !defined(__clang__)
#if defined(__GNUC__)
struct _EXCEPTION_RECORD;
@@ -395,7 +395,7 @@ __SEH_END_SCOPE_CHAIN;
#define _SEH2_END }
#define _SEH2_GetExceptionInformation()
-#define _SEH2_GetExceptionCode() STATUS_SUCCESS
+#define _SEH2_GetExceptionCode() 0
#define _SEH2_AbnormalTermination()
#define _SEH2_YIELD(STMT_) STMT_
diff --git a/include/reactos/libs/sound/mmebuddy.h b/include/reactos/libs/sound/mmebuddy.h
index 4e1583230c1..cae6f3f1489 100644
--- a/include/reactos/libs/sound/mmebuddy.h
+++ b/include/reactos/libs/sound/mmebuddy.h
@@ -400,8 +400,8 @@ ReleaseEntrypointMutex(
VOID
NotifyMmeClient(
IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance,
- IN DWORD Message,
- IN DWORD Parameter);
+ IN UINT Message,
+ IN DWORD_PTR Parameter);
MMRESULT
MmeGetSoundDeviceCapabilities(
@@ -413,20 +413,20 @@ MmeGetSoundDeviceCapabilities(
MMRESULT
MmeOpenWaveDevice(
IN MMDEVICE_TYPE DeviceType,
- IN DWORD DeviceId,
+ IN UINT DeviceId,
IN LPWAVEOPENDESC OpenParameters,
IN DWORD Flags,
- OUT DWORD* PrivateHandle);
+ OUT DWORD_PTR* PrivateHandle);
MMRESULT
MmeCloseDevice(
- IN DWORD PrivateHandle);
+ IN DWORD_PTR PrivateHandle);
MMRESULT
MmeGetPosition(
IN MMDEVICE_TYPE DeviceType,
IN DWORD DeviceId,
- IN DWORD PrivateHandle,
+ IN DWORD_PTR PrivateHandle,
IN MMTIME* Time,
IN DWORD Size);
@@ -441,7 +441,7 @@ MmeGetDeviceInterfaceString(
MMRESULT
MmeSetState(
- IN DWORD PrivateHandle,
+ IN DWORD_PTR PrivateHandle,
IN BOOL bStart);
@@ -456,7 +456,7 @@ MmeSetState(
MMRESULT
MmeResetWavePlayback(
- IN DWORD PrivateHandle);
+ IN DWORD_PTR PrivateHandle);
/*
diff --git a/include/reactos/subsys/csrss/csrss.h b/include/reactos/subsys/csrss/csrss.h
index 0b707582f6f..1156d39bd49 100644
--- a/include/reactos/subsys/csrss/csrss.h
+++ b/include/reactos/subsys/csrss/csrss.h
@@ -71,10 +71,12 @@ typedef struct
HANDLE ConsoleHandle;
BOOL Unicode;
WORD NrCharactersToRead;
- WORD nCharsCanBeDeleted; /* number of chars already in buffer that can be backspaced */
+ WORD NrCharactersRead;
HANDLE EventHandle;
- ULONG NrCharactersRead;
- BYTE Buffer[0];
+ PVOID Buffer;
+ UNICODE_STRING ExeName;
+ DWORD CtrlWakeupMask;
+ DWORD ControlKeyState;
} CSRSS_READ_CONSOLE, *PCSRSS_READ_CONSOLE;
typedef struct
@@ -207,13 +209,13 @@ typedef struct
typedef struct
{
DWORD Length;
- WCHAR Title[0];
+ PWCHAR Title;
} CSRSS_SET_TITLE, *PCSRSS_SET_TITLE;
typedef struct
{
DWORD Length;
- WCHAR Title[0];
+ PWCHAR Title;
} CSRSS_GET_TITLE, *PCSRSS_GET_TITLE;
typedef struct
@@ -479,19 +481,44 @@ typedef struct
CONSOLE_SELECTION_INFO Info;
} CSRSS_GET_CONSOLE_SELECTION_INFO, *PCSRSS_GET_CONSOLE_SELECTION_INFO;
+typedef struct
+{
+ UNICODE_STRING ExeName;
+ DWORD Length;
+} CSRSS_GET_COMMAND_HISTORY_LENGTH, *PCSRSS_GET_COMMAND_HISTORY_LENGTH;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+ PWCHAR History;
+ DWORD Length;
+} CSRSS_GET_COMMAND_HISTORY, *PCSRSS_GET_COMMAND_HISTORY;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+} CSRSS_EXPUNGE_COMMAND_HISTORY, *PCSRSS_EXPUNGE_COMMAND_HISTORY;
+
+typedef struct
+{
+ UNICODE_STRING ExeName;
+ DWORD NumCommands;
+} CSRSS_SET_HISTORY_NUMBER_COMMANDS, *PCSRSS_SET_HISTORY_NUMBER_COMMANDS;
+
+typedef struct
+{
+ DWORD HistoryBufferSize;
+ DWORD NumberOfHistoryBuffers;
+ DWORD dwFlags;
+} CSRSS_GET_HISTORY_INFO, *PCSRSS_GET_HISTORY_INFO,
+ CSRSS_SET_HISTORY_INFO, *PCSRSS_SET_HISTORY_INFO;
#define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type))
#define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE))
#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR))
#define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB))
-#define CSRSS_MAX_READ_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE))
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR))
#define CSRSS_MAX_READ_CONSOLE_OUTPUT_ATTRIB (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB))
-#define CSRSS_MAX_GET_PROCESS_LIST (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_GET_PROCESS_LIST))
-
-/* WCHARs, not bytes! */
-#define CSRSS_MAX_TITLE_LENGTH 80
-#define CSRSS_MAX_ALIAS_TARGET_LENGTH 80
#define CREATE_PROCESS (0x0)
#define TERMINATE_PROCESS (0x1)
@@ -559,6 +586,12 @@ typedef struct
#define CREATE_THREAD (0x3F)
#define SET_SCREEN_BUFFER_SIZE (0x40)
#define GET_CONSOLE_SELECTION_INFO (0x41)
+#define GET_COMMAND_HISTORY_LENGTH (0x42)
+#define GET_COMMAND_HISTORY (0x43)
+#define EXPUNGE_COMMAND_HISTORY (0x44)
+#define SET_HISTORY_NUMBER_COMMANDS (0x45)
+#define GET_HISTORY_INFO (0x46)
+#define SET_HISTORY_INFO (0x47)
/* Keep in sync with definition below. */
#define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS))
@@ -634,6 +667,12 @@ typedef struct _CSR_API_MESSAGE
CSRSS_GENERATE_CTRL_EVENT GenerateCtrlEvent;
CSRSS_SET_SCREEN_BUFFER_SIZE SetScreenBufferSize;
CSRSS_GET_CONSOLE_SELECTION_INFO GetConsoleSelectionInfo;
+ CSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength;
+ CSRSS_GET_COMMAND_HISTORY GetCommandHistory;
+ CSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory;
+ CSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands;
+ CSRSS_GET_HISTORY_INFO GetHistoryInfo;
+ CSRSS_SET_HISTORY_INFO SetHistoryInfo;
} Data;
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
diff --git a/include/reactos/win32k/callback.h b/include/reactos/win32k/callback.h
index 7dd97948adc..fc7c0bb95e2 100644
--- a/include/reactos/win32k/callback.h
+++ b/include/reactos/win32k/callback.h
@@ -33,6 +33,13 @@ typedef struct _SENDASYNCPROC_CALLBACK_ARGUMENTS
LRESULT Result;
} SENDASYNCPROC_CALLBACK_ARGUMENTS, *PSENDASYNCPROC_CALLBACK_ARGUMENTS;
+typedef struct _CALL_BACK_INFO
+{
+ SENDASYNCPROC CallBack;
+ ULONG_PTR Context;
+} CALL_BACK_INFO, * PCALL_BACK_INFO;
+
+
typedef struct _HOOKPROC_CALLBACK_ARGUMENTS
{
INT HookId;
diff --git a/include/reactos/win32k/ntuser.h b/include/reactos/win32k/ntuser.h
index 0d6d7811db7..007fa887200 100644
--- a/include/reactos/win32k/ntuser.h
+++ b/include/reactos/win32k/ntuser.h
@@ -3135,7 +3135,6 @@ typedef struct tagKMDDELPARAM
#define NOPARAM_ROUTINE_GETMESSAGEEXTRAINFO 0xffff0005
#define NOPARAM_ROUTINE_ANYPOPUP 0xffff0006
-#define NOPARAM_ROUTINE_CSRSS_INITIALIZED 0xffff0007
#define ONEPARAM_ROUTINE_CSRSS_GUICHECK 0xffff0008
#define ONEPARAM_ROUTINE_SWITCHCARETSHOWING 0xfffe0008
#define ONEPARAM_ROUTINE_ISWINDOWINDESTROY 0xfffe000c
diff --git a/include/reactos/wine/config.h b/include/reactos/wine/config.h
index 406b5fb895d..404783b1d26 100644
--- a/include/reactos/wine/config.h
+++ b/include/reactos/wine/config.h
@@ -442,6 +442,12 @@
/* Define to 1 if you have the header file. */
/* #undef HAVE_OPENSSL_SSL_H */
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_ZLIB 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_ZLIB_H 1
+
/* Define to 1 if you have the `pclose' function. */
#define HAVE_PCLOSE 1
diff --git a/include/reactos/wine/dcetypes.idl b/include/reactos/wine/dcetypes.idl
index 8bfbb09e386..5630e302d15 100644
--- a/include/reactos/wine/dcetypes.idl
+++ b/include/reactos/wine/dcetypes.idl
@@ -28,7 +28,7 @@ typedef small signed8;
typedef short signed16;
typedef long signed32;
typedef unsigned32 boolean32;
-typedef unsigned hyper u_int64;
+//typedef unsigned hyper u_int64;
typedef unsigned long u_int32;
typedef unsigned short u_int16;
typedef unsigned small u_int8;
diff --git a/include/reactos/wine/ddk/compstui.h b/include/reactos/wine/ddk/compstui.h
new file mode 100644
index 00000000000..affe933d161
--- /dev/null
+++ b/include/reactos/wine/ddk/compstui.h
@@ -0,0 +1,2 @@
+
+#include_next
diff --git a/include/reactos/wine/ddk/winddiui.h b/include/reactos/wine/ddk/winddiui.h
new file mode 100644
index 00000000000..35939098e85
--- /dev/null
+++ b/include/reactos/wine/ddk/winddiui.h
@@ -0,0 +1,2 @@
+
+#include_next
diff --git a/include/reactos/wine/ddk/winsplp.h b/include/reactos/wine/ddk/winsplp.h
new file mode 100644
index 00000000000..5014e086511
--- /dev/null
+++ b/include/reactos/wine/ddk/winsplp.h
@@ -0,0 +1,2 @@
+
+#include_next
diff --git a/include/reactos/wine/test.h b/include/reactos/wine/test.h
index d0d8208926c..bbd0c6b2d74 100644
--- a/include/reactos/wine/test.h
+++ b/include/reactos/wine/test.h
@@ -80,21 +80,21 @@ extern void winetest_vskip( const char *msg, va_list ap );
#ifdef __GNUC__
-extern int winetest_ok( int condition, const char *msg, ... ) __attribute__((format (printf,2,3) ));
+extern void winetest_ok( int condition, const char *msg, ... ) __attribute__((format (printf,2,3) ));
extern void winetest_skip( const char *msg, ... ) __attribute__((format (printf,1,2)));
extern void winetest_win_skip( const char *msg, ... ) __attribute__((format (printf,1,2)));
extern void winetest_trace( const char *msg, ... ) __attribute__((format (printf,1,2)));
#else /* __GNUC__ */
-extern int winetest_ok( int condition, const char *msg, ... );
+extern void winetest_ok( int condition, const char *msg, ... );
extern void winetest_skip( const char *msg, ... );
extern void winetest_win_skip( const char *msg, ... );
extern void winetest_trace( const char *msg, ... );
#endif /* __GNUC__ */
-#define ok_(file, line) (winetest_set_location(file, line), 0) ? 0 : winetest_ok
+#define ok_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_ok
#define skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_skip
#define win_skip_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_win_skip
#define trace_(file, line) (winetest_set_location(file, line), 0) ? (void)0 : winetest_trace
@@ -322,15 +322,13 @@ int winetest_vok( int condition, const char *msg, va_list args )
}
}
-int winetest_ok( int condition, const char *msg, ... )
+void winetest_ok( int condition, const char *msg, ... )
{
va_list valist;
- int rc;
-
+
va_start(valist, msg);
- rc=winetest_vok(condition, msg, valist);
+ winetest_vok(condition, msg, valist);
va_end(valist);
- return rc;
}
void winetest_trace( const char *msg, ... )
diff --git a/include/reactos/wine/wined3d.idl b/include/reactos/wine/wined3d.idl
index 6364f9cfe89..1da7d44b738 100644
--- a/include/reactos/wine/wined3d.idl
+++ b/include/reactos/wine/wined3d.idl
@@ -275,9 +275,7 @@ typedef enum _WINED3DFORMAT
typedef enum _WINED3DRENDERSTATETYPE
{
- WINED3DRS_TEXTUREHANDLE = 1, /* d3d7 */
WINED3DRS_ANTIALIAS = 2, /* d3d7 */
- WINED3DRS_TEXTUREADDRESS = 3, /* d3d7 */
WINED3DRS_TEXTUREPERSPECTIVE = 4, /* d3d7 */
WINED3DRS_WRAPU = 5, /* d3d7 */
WINED3DRS_WRAPV = 6, /* d3d7 */
@@ -291,11 +289,8 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_ZWRITEENABLE = 14,
WINED3DRS_ALPHATESTENABLE = 15,
WINED3DRS_LASTPIXEL = 16,
- WINED3DRS_TEXTUREMAG = 17, /* d3d7 */
- WINED3DRS_TEXTUREMIN = 18, /* d3d7 */
WINED3DRS_SRCBLEND = 19,
WINED3DRS_DESTBLEND = 20,
- WINED3DRS_TEXTUREMAPBLEND = 21, /* d3d7 */
WINED3DRS_CULLMODE = 22,
WINED3DRS_ZFUNC = 23,
WINED3DRS_ALPHAREF = 24,
@@ -316,9 +311,6 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_STIPPLEENABLE = 39, /* d3d7 */
WINED3DRS_EDGEANTIALIAS = 40, /* d3d7, d3d8 */
WINED3DRS_COLORKEYENABLE = 41, /* d3d7 */
- WINED3DRS_BORDERCOLOR = 43, /* d3d7 */
- WINED3DRS_TEXTUREADDRESSU = 44, /* d3d7 */
- WINED3DRS_TEXTUREADDRESSV = 45, /* d3d7 */
WINED3DRS_MIPMAPLODBIAS = 46, /* d3d7 */
WINED3DRS_ZBIAS = 47, /* d3d7, d3d8 */
WINED3DRS_RANGEFOGENABLE = 48,
@@ -334,38 +326,6 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_STENCILMASK = 58,
WINED3DRS_STENCILWRITEMASK = 59,
WINED3DRS_TEXTUREFACTOR = 60,
- WINED3DRS_STIPPLEPATTERN00 = 64,
- WINED3DRS_STIPPLEPATTERN01 = 65,
- WINED3DRS_STIPPLEPATTERN02 = 66,
- WINED3DRS_STIPPLEPATTERN03 = 67,
- WINED3DRS_STIPPLEPATTERN04 = 68,
- WINED3DRS_STIPPLEPATTERN05 = 69,
- WINED3DRS_STIPPLEPATTERN06 = 70,
- WINED3DRS_STIPPLEPATTERN07 = 71,
- WINED3DRS_STIPPLEPATTERN08 = 72,
- WINED3DRS_STIPPLEPATTERN09 = 73,
- WINED3DRS_STIPPLEPATTERN10 = 74,
- WINED3DRS_STIPPLEPATTERN11 = 75,
- WINED3DRS_STIPPLEPATTERN12 = 76,
- WINED3DRS_STIPPLEPATTERN13 = 77,
- WINED3DRS_STIPPLEPATTERN14 = 78,
- WINED3DRS_STIPPLEPATTERN15 = 79,
- WINED3DRS_STIPPLEPATTERN16 = 80,
- WINED3DRS_STIPPLEPATTERN17 = 81,
- WINED3DRS_STIPPLEPATTERN18 = 82,
- WINED3DRS_STIPPLEPATTERN19 = 83,
- WINED3DRS_STIPPLEPATTERN20 = 84,
- WINED3DRS_STIPPLEPATTERN21 = 85,
- WINED3DRS_STIPPLEPATTERN22 = 86,
- WINED3DRS_STIPPLEPATTERN23 = 87,
- WINED3DRS_STIPPLEPATTERN24 = 88,
- WINED3DRS_STIPPLEPATTERN25 = 89,
- WINED3DRS_STIPPLEPATTERN26 = 90,
- WINED3DRS_STIPPLEPATTERN27 = 91,
- WINED3DRS_STIPPLEPATTERN28 = 92,
- WINED3DRS_STIPPLEPATTERN29 = 93,
- WINED3DRS_STIPPLEPATTERN30 = 94,
- WINED3DRS_STIPPLEPATTERN31 = 95,
WINED3DRS_WRAP0 = 128,
WINED3DRS_WRAP1 = 129,
WINED3DRS_WRAP2 = 130,
@@ -407,8 +367,6 @@ typedef enum _WINED3DRENDERSTATETYPE
WINED3DRS_COLORWRITEENABLE = 168,
WINED3DRS_TWEENFACTOR = 170,
WINED3DRS_BLENDOP = 171,
- WINED3DRS_POSITIONORDER = 172,
- WINED3DRS_NORMALORDER = 173,
WINED3DRS_POSITIONDEGREE = 172,
WINED3DRS_NORMALDEGREE = 173,
WINED3DRS_SCISSORTESTENABLE = 174,
@@ -3452,6 +3410,15 @@ interface IWineD3DDevice : IWineD3DBase
[in] D3DCB_ENUMRESOURCES callback,
[in] void *data
);
+ HRESULT GetSurfaceFromDC(
+ [in] HDC dc,
+ [out] IWineD3DSurface **surface
+ );
+ HRESULT AcquireFocusWindow(
+ [in] HWND window
+ );
+ void ReleaseFocusWindow(
+ );
}
IWineD3D *WineDirect3DCreate(UINT dxVersion, IUnknown *parent);
diff --git a/include/xdk/amd64/ke.h b/include/xdk/amd64/ke.h
index d744cd5eca7..833aca8bee0 100644
--- a/include/xdk/amd64/ke.h
+++ b/include/xdk/amd64/ke.h
@@ -27,11 +27,6 @@ $if (_WDMDDK_)
#define EFLAG_ZERO 0x4000
#define EFLAG_SELECT (EFLAG_SIGN | EFLAG_ZERO)
-#define RESULT_NEGATIVE ((EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
-#define RESULT_ZERO ((~EFLAG_SIGN & EFLAG_ZERO) & EFLAG_SELECT)
-#define RESULT_POSITIVE ((~EFLAG_SIGN & ~EFLAG_ZERO) & EFLAG_SELECT)
-
-
typedef struct _KFLOATING_SAVE {
ULONG Dummy;
} KFLOATING_SAVE, *PKFLOATING_SAVE;
diff --git a/include/xdk/ccfuncs.h b/include/xdk/ccfuncs.h
new file mode 100644
index 00000000000..ff15927798f
--- /dev/null
+++ b/include/xdk/ccfuncs.h
@@ -0,0 +1,430 @@
+$if (_NTIFS_)
+/* Common Cache Functions */
+
+#define CcIsFileCached(FO) ( \
+ ((FO)->SectionObjectPointer != NULL) && \
+ (((PSECTION_OBJECT_POINTERS)(FO)->SectionObjectPointer)->SharedCacheMap != NULL) \
+)
+
+extern ULONG CcFastMdlReadWait;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+VOID
+NTAPI
+CcInitializeCacheMap(
+ IN PFILE_OBJECT FileObject,
+ IN PCC_FILE_SIZES FileSizes,
+ IN BOOLEAN PinAccess,
+ IN PCACHE_MANAGER_CALLBACKS Callbacks,
+ IN PVOID LazyWriteContext);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcUninitializeCacheMap(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER TruncateSize OPTIONAL,
+ IN PCACHE_UNINITIALIZE_EVENT UninitializeCompleteEvent OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetFileSizes(
+ IN PFILE_OBJECT FileObject,
+ IN PCC_FILE_SIZES FileSizes);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetDirtyPageThreshold(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG DirtyPageThreshold);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcFlushCache(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN PLARGE_INTEGER FileOffset OPTIONAL,
+ IN ULONG Length,
+ OUT PIO_STATUS_BLOCK IoStatus OPTIONAL);
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+CcGetFlushedValidData(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN BOOLEAN BcbListHeld);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcZeroData(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER StartOffset,
+ IN PLARGE_INTEGER EndOffset,
+ IN BOOLEAN Wait);
+
+NTKERNELAPI
+PVOID
+NTAPI
+CcRemapBcb(
+ IN PVOID Bcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcRepinBcb(
+ IN PVOID Bcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcUnpinRepinnedBcb(
+ IN PVOID Bcb,
+ IN BOOLEAN WriteThrough,
+ OUT PIO_STATUS_BLOCK IoStatus);
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+CcGetFileObjectFromSectionPtrs(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer);
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+CcGetFileObjectFromBcb(
+ IN PVOID Bcb);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcCanIWrite(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG BytesToWrite,
+ IN BOOLEAN Wait,
+ IN BOOLEAN Retrying);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcDeferWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PCC_POST_DEFERRED_WRITE PostRoutine,
+ IN PVOID Context1,
+ IN PVOID Context2,
+ IN ULONG BytesToWrite,
+ IN BOOLEAN Retrying);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcCopyRead(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ OUT PVOID Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcFastCopyRead(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG FileOffset,
+ IN ULONG Length,
+ IN ULONG PageCount,
+ OUT PVOID Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcCopyWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN PVOID Buffer);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcFastCopyWrite(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG FileOffset,
+ IN ULONG Length,
+ IN PVOID Buffer);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcMdlRead(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcMdlReadComplete(
+ IN PFILE_OBJECT FileObject,
+ IN PMDL MdlChain);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcPrepareMdlWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcMdlWriteComplete(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PMDL MdlChain);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcScheduleReadAhead(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+CcWaitForCurrentLazyWriterActivity(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetReadAheadGranularity(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG Granularity);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcPinRead(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG Flags,
+ OUT PVOID *Bcb,
+ OUT PVOID *Buffer);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcPinMappedData(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG Flags,
+ IN OUT PVOID *Bcb);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcPreparePinWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Zero,
+ IN ULONG Flags,
+ OUT PVOID *Bcb,
+ OUT PVOID *Buffer);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetDirtyPinnedData(
+ IN PVOID BcbVoid,
+ IN PLARGE_INTEGER Lsn OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcUnpinData(
+ IN PVOID Bcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetBcbOwnerPointer(
+ IN PVOID Bcb,
+ IN PVOID OwnerPointer);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcUnpinDataForThread(
+ IN PVOID Bcb,
+ IN ERESOURCE_THREAD ResourceThreadId);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetAdditionalCacheAttributes(
+ IN PFILE_OBJECT FileObject,
+ IN BOOLEAN DisableReadAhead,
+ IN BOOLEAN DisableWriteBehind);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcIsThereDirtyData(
+ IN PVPB Vpb);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+VOID
+NTAPI
+CcMdlWriteAbort(
+ IN PFILE_OBJECT FileObject,
+ IN PMDL MdlChain);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetLogHandleForFile(
+ IN PFILE_OBJECT FileObject,
+ IN PVOID LogHandle,
+ IN PFLUSH_TO_LSN FlushToLsnRoutine);
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+CcGetDirtyPages(
+ IN PVOID LogHandle,
+ IN PDIRTY_PAGE_ROUTINE DirtyPageRoutine,
+ IN PVOID Context1,
+ IN PVOID Context2);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcMapData(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG Flags,
+ OUT PVOID *Bcb,
+ OUT PVOID *Buffer);
+#elif (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcMapData(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ OUT PVOID *Bcb,
+ OUT PVOID *Buffer);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+CcSetFileSizesEx(
+ IN PFILE_OBJECT FileObject,
+ IN PCC_FILE_SIZES FileSizes);
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+CcGetFileObjectFromSectionPtrsRef(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer);
+
+NTKERNELAPI
+VOID
+NTAPI
+CcSetParallelFlushFile(
+ IN PFILE_OBJECT FileObject,
+ IN BOOLEAN EnableParallelFlush);
+
+NTKERNELAPI
+BOOLEAN
+CcIsThereDirtyDataEx(
+ IN PVPB Vpb,
+ IN PULONG NumberOfDirtyPages OPTIONAL);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+NTKERNELAPI
+VOID
+NTAPI
+CcCoherencyFlushAndPurgeCache(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN PLARGE_INTEGER FileOffset OPTIONAL,
+ IN ULONG Length,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN ULONG Flags OPTIONAL);
+#endif
+
+#define CcGetFileSizePointer(FO) ( \
+ ((PLARGE_INTEGER)((FO)->SectionObjectPointer->SharedCacheMap) + 1) \
+)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcPurgeCacheSection(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN PLARGE_INTEGER FileOffset OPTIONAL,
+ IN ULONG Length,
+ IN ULONG Flags);
+#elif (NTDDI_VERSION >= NTDDI_WIN2K)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcPurgeCacheSection(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN PLARGE_INTEGER FileOffset OPTIONAL,
+ IN ULONG Length,
+ IN BOOLEAN UninitializeCacheMaps);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+CcCopyWriteWontFlush(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length);
+#else
+#define CcCopyWriteWontFlush(FO, FOFF, LEN) ((LEN) <= 0x10000)
+#endif
+
+#define CcReadAhead(FO, FOFF, LEN) ( \
+ if ((LEN) >= 256) { \
+ CcScheduleReadAhead((FO), (FOFF), (LEN)); \
+ } \
+)
+$endif (_NTIFS_)
diff --git a/include/xdk/cctypes.h b/include/xdk/cctypes.h
new file mode 100644
index 00000000000..972abb78f6f
--- /dev/null
+++ b/include/xdk/cctypes.h
@@ -0,0 +1,75 @@
+$if (_NTIFS_)
+/* Common Cache Types */
+
+#define VACB_MAPPING_GRANULARITY (0x40000)
+#define VACB_OFFSET_SHIFT (18)
+
+typedef struct _PUBLIC_BCB {
+ CSHORT NodeTypeCode;
+ CSHORT NodeByteSize;
+ ULONG MappedLength;
+ LARGE_INTEGER MappedFileOffset;
+} PUBLIC_BCB, *PPUBLIC_BCB;
+
+typedef struct _CC_FILE_SIZES {
+ LARGE_INTEGER AllocationSize;
+ LARGE_INTEGER FileSize;
+ LARGE_INTEGER ValidDataLength;
+} CC_FILE_SIZES, *PCC_FILE_SIZES;
+
+typedef BOOLEAN
+(NTAPI *PACQUIRE_FOR_LAZY_WRITE) (
+ IN PVOID Context,
+ IN BOOLEAN Wait);
+
+typedef VOID
+(NTAPI *PRELEASE_FROM_LAZY_WRITE) (
+ IN PVOID Context);
+
+typedef BOOLEAN
+(NTAPI *PACQUIRE_FOR_READ_AHEAD) (
+ IN PVOID Context,
+ IN BOOLEAN Wait);
+
+typedef VOID
+(NTAPI *PRELEASE_FROM_READ_AHEAD) (
+ IN PVOID Context);
+
+typedef struct _CACHE_MANAGER_CALLBACKS {
+ PACQUIRE_FOR_LAZY_WRITE AcquireForLazyWrite;
+ PRELEASE_FROM_LAZY_WRITE ReleaseFromLazyWrite;
+ PACQUIRE_FOR_READ_AHEAD AcquireForReadAhead;
+ PRELEASE_FROM_READ_AHEAD ReleaseFromReadAhead;
+} CACHE_MANAGER_CALLBACKS, *PCACHE_MANAGER_CALLBACKS;
+
+typedef struct _CACHE_UNINITIALIZE_EVENT {
+ struct _CACHE_UNINITIALIZE_EVENT *Next;
+ KEVENT Event;
+} CACHE_UNINITIALIZE_EVENT, *PCACHE_UNINITIALIZE_EVENT;
+
+typedef VOID
+(NTAPI *PDIRTY_PAGE_ROUTINE) (
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN PLARGE_INTEGER OldestLsn,
+ IN PLARGE_INTEGER NewestLsn,
+ IN PVOID Context1,
+ IN PVOID Context2);
+
+typedef VOID
+(NTAPI *PFLUSH_TO_LSN) (
+ IN PVOID LogHandle,
+ IN LARGE_INTEGER Lsn);
+
+typedef VOID
+(NTAPI *PCC_POST_DEFERRED_WRITE) (
+ IN PVOID Context1,
+ IN PVOID Context2);
+
+#define UNINITIALIZE_CACHE_MAPS (1)
+#define DO_NOT_RETRY_PURGE (2)
+#define DO_NOT_PURGE_DIRTY_PAGES (0x4)
+
+#define CC_FLUSH_AND_PURGE_NO_PURGE (0x1)
+$endif (_NTIFS_)
diff --git a/include/xdk/cmfuncs.h b/include/xdk/cmfuncs.h
index 9fb3de09a7f..44571a7d2bc 100644
--- a/include/xdk/cmfuncs.h
+++ b/include/xdk/cmfuncs.h
@@ -66,5 +66,5 @@ CmGetBoundTransaction(
#endif // NTDDI_VERSION >= NTDDI_VISTA
-$endif
+$endif (_WDMDDK_)
diff --git a/include/xdk/cmtypes.h b/include/xdk/cmtypes.h
index 2599a78cfc4..41f52ec8f10 100644
--- a/include/xdk/cmtypes.h
+++ b/include/xdk/cmtypes.h
@@ -156,7 +156,7 @@ typedef struct _CM_PARTIAL_RESOURCE_DESCRIPTOR {
} Interrupt;
#if (NTDDI_VERSION >= NTDDI_LONGHORN)
struct {
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
struct {
#if defined(NT_PROCESSOR_GROUPS)
USHORT Group;
@@ -1005,9 +1005,8 @@ typedef enum _CM_ERROR_CONTROL_TYPE {
CM_SERVICE_VIRTUAL_DISK_BOOT_LOAD | \
CM_SERVICE_USB_DISK_BOOT_LOAD)
-$endif
+$endif (_WDMDDK_)
$if (_NTDDK_)
-
typedef struct _KEY_NAME_INFORMATION {
ULONG NameLength;
WCHAR Name[1];
@@ -1045,4 +1044,4 @@ typedef struct _CM_PCCARD_DEVICE_DATA {
UCHAR IRQMap[16];
} CM_PCCARD_DEVICE_DATA, *PCM_PCCARD_DEVICE_DATA;
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
diff --git a/include/xdk/devioctl.template.h b/include/xdk/devioctl.template.h
new file mode 100644
index 00000000000..ac7e130e822
--- /dev/null
+++ b/include/xdk/devioctl.template.h
@@ -0,0 +1,31 @@
+/*
+ * devioctl.h
+ *
+ * IOCTL definitions
+ *
+ * This file is part of the ReactOS PSDK package.
+ *
+ * Contributors:
+ * Amine Khaldi
+ * Timo Kreuzer (timo.kreuzer@reactos.org)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+#pragma once
+
+#ifndef _DEVIOCTL_
+#define _DEVIOCTL_
+
+$define (_DEVIOCTL_)
+$include (iotypes.h)
+
+#endif /*_DEVIOCTL_ */
diff --git a/include/xdk/exfuncs.h b/include/xdk/exfuncs.h
index 2879e1d4e16..9177f26ae0c 100644
--- a/include/xdk/exfuncs.h
+++ b/include/xdk/exfuncs.h
@@ -1,101 +1,6 @@
/******************************************************************************
* Executive Functions *
******************************************************************************/
-$if (_NTDDK_)
-static __inline PVOID
-ExAllocateFromZone(
- IN PZONE_HEADER Zone)
-{
- if (Zone->FreeList.Next)
- Zone->FreeList.Next = Zone->FreeList.Next->Next;
- return (PVOID) Zone->FreeList.Next;
-}
-
-static __inline PVOID
-ExFreeToZone(
- IN PZONE_HEADER Zone,
- IN PVOID Block)
-{
- ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
- Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
- return ((PSINGLE_LIST_ENTRY) Block)->Next;
-}
-
-/*
- * PVOID
- * ExInterlockedAllocateFromZone(
- * IN PZONE_HEADER Zone,
- * IN PKSPIN_LOCK Lock)
- */
-#define ExInterlockedAllocateFromZone(Zone, Lock) \
- ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
-
-/* PVOID
- * ExInterlockedFreeToZone(
- * IN PZONE_HEADER Zone,
- * IN PVOID Block,
- * IN PKSPIN_LOCK Lock);
- */
-#define ExInterlockedFreeToZone(Zone, Block, Lock) \
- ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
-
-/*
- * BOOLEAN
- * ExIsFullZone(
- * IN PZONE_HEADER Zone)
- */
-#define ExIsFullZone(Zone) \
- ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
-
-/* BOOLEAN
- * ExIsObjectInFirstZoneSegment(
- * IN PZONE_HEADER Zone,
- * IN PVOID Object);
- */
-#define ExIsObjectInFirstZoneSegment(Zone,Object) \
- ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
- ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
- (Zone)->TotalSegmentSize)) )
-
-#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
-#define ExAcquireResourceShared ExAcquireResourceSharedLite
-#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
-#define ExDeleteResource ExDeleteResourceLite
-#define ExInitializeResource ExInitializeResourceLite
-#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
-#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
-#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
-#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
-
-#ifdef _X86_
-
-typedef enum _INTERLOCKED_RESULT {
- ResultNegative = RESULT_NEGATIVE,
- ResultZero = RESULT_ZERO,
- ResultPositive = RESULT_POSITIVE
-} INTERLOCKED_RESULT;
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-FASTCALL
-Exfi386InterlockedIncrementLong(
- IN OUT LONG volatile *Addend);
-
-NTKERNELAPI
-INTERLOCKED_RESULT
-FASTCALL
-Exfi386InterlockedDecrementLong(
- IN PLONG Addend);
-
-NTKERNELAPI
-ULONG
-FASTCALL
-Exfi386InterlockedExchangeUlong(
- IN PULONG Target,
- IN ULONG Value);
-#endif
-
-$endif
$if (_WDMDDK_)
#define ExInterlockedIncrementLong(Addend,Lock) Exfi386InterlockedIncrementLong(Addend)
@@ -326,55 +231,122 @@ ExInitializeFastMutex(
KeInitializeEvent(&FastMutex->Event, SynchronizationEvent, FALSE);
return;
}
-$endif
+
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+static __inline PVOID
+ExAllocateFromZone(
+ IN PZONE_HEADER Zone)
+{
+ if (Zone->FreeList.Next)
+ Zone->FreeList.Next = Zone->FreeList.Next->Next;
+ return (PVOID) Zone->FreeList.Next;
+}
+
+static __inline PVOID
+ExFreeToZone(
+ IN PZONE_HEADER Zone,
+ IN PVOID Block)
+{
+ ((PSINGLE_LIST_ENTRY) Block)->Next = Zone->FreeList.Next;
+ Zone->FreeList.Next = ((PSINGLE_LIST_ENTRY) Block);
+ return ((PSINGLE_LIST_ENTRY) Block)->Next;
+}
+
+/*
+ * PVOID
+ * ExInterlockedAllocateFromZone(
+ * IN PZONE_HEADER Zone,
+ * IN PKSPIN_LOCK Lock)
+ */
+#define ExInterlockedAllocateFromZone(Zone, Lock) \
+ ((PVOID) ExInterlockedPopEntryList(&Zone->FreeList, Lock))
+
+/* PVOID
+ * ExInterlockedFreeToZone(
+ * IN PZONE_HEADER Zone,
+ * IN PVOID Block,
+ * IN PKSPIN_LOCK Lock);
+ */
+#define ExInterlockedFreeToZone(Zone, Block, Lock) \
+ ExInterlockedPushEntryList(&(Zone)->FreeList, (PSINGLE_LIST_ENTRY)(Block), Lock)
+
+/*
+ * BOOLEAN
+ * ExIsFullZone(
+ * IN PZONE_HEADER Zone)
+ */
+#define ExIsFullZone(Zone) \
+ ((Zone)->FreeList.Next == (PSINGLE_LIST_ENTRY) NULL)
+
+/* BOOLEAN
+ * ExIsObjectInFirstZoneSegment(
+ * IN PZONE_HEADER Zone,
+ * IN PVOID Object);
+ */
+#define ExIsObjectInFirstZoneSegment(Zone,Object) \
+ ((BOOLEAN)( ((PUCHAR)(Object) >= (PUCHAR)(Zone)->SegmentList.Next) && \
+ ((PUCHAR)(Object) < (PUCHAR)(Zone)->SegmentList.Next + \
+ (Zone)->TotalSegmentSize)) )
+
+#define ExAcquireResourceExclusive ExAcquireResourceExclusiveLite
+#define ExAcquireResourceShared ExAcquireResourceSharedLite
+#define ExConvertExclusiveToShared ExConvertExclusiveToSharedLite
+#define ExDeleteResource ExDeleteResourceLite
+#define ExInitializeResource ExInitializeResourceLite
+#define ExIsResourceAcquiredExclusive ExIsResourceAcquiredExclusiveLite
+#define ExIsResourceAcquiredShared ExIsResourceAcquiredSharedLite
+#define ExIsResourceAcquired ExIsResourceAcquiredSharedLite
+#define ExReleaseResourceForThread ExReleaseResourceForThreadLite
+
+#ifndef _M_IX86
+#define RESULT_ZERO 0
+#define RESULT_NEGATIVE 1
+#define RESULT_POSITIVE 2
+#endif
+
+#if defined(_X86_) || defined(_IA64_) || defined(_M_AMD64) && !defined(RC_INVOKED) && !defined(MIDL_PASS)
+typedef enum _INTERLOCKED_RESULT {
+ ResultNegative = RESULT_NEGATIVE,
+ ResultZero = RESULT_ZERO,
+ ResultPositive = RESULT_POSITIVE
+} INTERLOCKED_RESULT;
+#endif
+
+#ifdef _X86_
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedIncrementLong(
+ IN OUT LONG volatile *Addend);
+
+NTKERNELAPI
+INTERLOCKED_RESULT
+FASTCALL
+Exfi386InterlockedDecrementLong(
+ IN PLONG Addend);
+
+NTKERNELAPI
+ULONG
+FASTCALL
+Exfi386InterlockedExchangeUlong(
+ IN PULONG Target,
+ IN ULONG Value);
+
+#endif
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+#define ExDisableResourceBoost ExDisableResourceBoostLite
+
+VOID
+ExInitializePushLock (
+ OUT PEX_PUSH_LOCK PushLock);
+$endif (_NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-$if (_NTDDK_)
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExExtendZone(
- IN OUT PZONE_HEADER Zone,
- IN OUT PVOID Segment,
- IN ULONG SegmentSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExInitializeZone(
- OUT PZONE_HEADER Zone,
- IN ULONG BlockSize,
- IN OUT PVOID InitialSegment,
- IN ULONG InitialSegmentSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExInterlockedExtendZone(
- IN OUT PZONE_HEADER Zone,
- IN OUT PVOID Segment,
- IN ULONG SegmentSize,
- IN OUT PKSPIN_LOCK Lock);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-ExUuidCreate(
- OUT UUID *Uuid);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-ExRaiseAccessViolation(VOID);
-
-NTKERNELAPI
-DECLSPEC_NORETURN
-VOID
-NTAPI
-ExRaiseDatatypeMisalignment(VOID);
-$endif
-
$if (_WDMDDK_)
NTKERNELAPI
VOID
@@ -751,12 +723,79 @@ VOID
NTAPI
ExUnregisterCallback(
IN OUT PVOID CbRegistration);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExExtendZone(
+ IN OUT PZONE_HEADER Zone,
+ IN OUT PVOID Segment,
+ IN ULONG SegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInitializeZone(
+ OUT PZONE_HEADER Zone,
+ IN ULONG BlockSize,
+ IN OUT PVOID InitialSegment,
+ IN ULONG InitialSegmentSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExInterlockedExtendZone(
+ IN OUT PZONE_HEADER Zone,
+ IN OUT PVOID Segment,
+ IN ULONG SegmentSize,
+ IN OUT PKSPIN_LOCK Lock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ExUuidCreate(
+ OUT UUID *Uuid);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseAccessViolation(VOID);
+
+NTKERNELAPI
+DECLSPEC_NORETURN
+VOID
+NTAPI
+ExRaiseDatatypeMisalignment(VOID);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+SIZE_T
+NTAPI
+ExQueryPoolBlockSize(
+ IN PVOID PoolBlock,
+ OUT PBOOLEAN QuotaCharged);
+
+VOID
+ExAdjustLookasideDepth(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+ExDisableResourceBoostLite(
+ IN PERESOURCE Resource);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-$if (_WDMDDK_)
+$if (_WDMDDK_ || _NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WINXP)
+$endif
+$if (_WDMDDK_)
NTKERNELAPI
BOOLEAN
@@ -799,9 +838,22 @@ VOID
FASTCALL
ExWaitForRundownProtectionRelease(
IN OUT PEX_RUNDOWN_REF RunRef);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+PSLIST_ENTRY
+FASTCALL
+InterlockedPushListSList(
+ IN OUT PSLIST_HEADER ListHead,
+ IN OUT PSLIST_ENTRY List,
+ IN OUT PSLIST_ENTRY ListEnd,
+ IN ULONG Count);
+$endif (_NTIFS_)
+$if (_WDMDDK_ || _NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+$endif
+$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
NTKERNELAPI
@@ -1037,5 +1089,4 @@ ExFreeToNPagedLookasideList(
}
}
-$endif
-
+$endif (_WDMDDK_)
diff --git a/include/xdk/extypes.h b/include/xdk/extypes.h
index 4d18ac12f04..89728aa95d5 100644
--- a/include/xdk/extypes.h
+++ b/include/xdk/extypes.h
@@ -1,8 +1,9 @@
+$if (_WDMDDK_ || _NTDDK_)
/******************************************************************************
* Executive Types *
******************************************************************************/
+$endif
$if (_WDMDDK_)
-
#define EX_RUNDOWN_ACTIVE 0x1
#define EX_RUNDOWN_COUNT_SHIFT 0x1
#define EX_RUNDOWN_COUNT_INC (1 << EX_RUNDOWN_COUNT_SHIFT)
@@ -85,40 +86,36 @@ typedef VOID
typedef CALLBACK_FUNCTION *PCALLBACK_FUNCTION;
#define GENERAL_LOOKASIDE_LAYOUT \
- union { \
+ _ANONYMOUS_UNION union { \
SLIST_HEADER ListHead; \
SINGLE_LIST_ENTRY SingleListHead; \
} DUMMYUNIONNAME; \
USHORT Depth; \
USHORT MaximumDepth; \
ULONG TotalAllocates; \
- union { \
+ _ANONYMOUS_UNION union { \
ULONG AllocateMisses; \
ULONG AllocateHits; \
} DUMMYUNIONNAME2; \
- \
ULONG TotalFrees; \
- union { \
+ _ANONYMOUS_UNION union { \
ULONG FreeMisses; \
ULONG FreeHits; \
} DUMMYUNIONNAME3; \
- \
POOL_TYPE Type; \
ULONG Tag; \
ULONG Size; \
- union { \
+ _ANONYMOUS_UNION union { \
PALLOCATE_FUNCTION_EX AllocateEx; \
PALLOCATE_FUNCTION Allocate; \
} DUMMYUNIONNAME4; \
- \
- union { \
+ _ANONYMOUS_UNION union { \
PFREE_FUNCTION_EX FreeEx; \
PFREE_FUNCTION Free; \
} DUMMYUNIONNAME5; \
- \
LIST_ENTRY ListEntry; \
ULONG LastTotalAllocates; \
- union { \
+ _ANONYMOUS_UNION union { \
ULONG LastAllocateMisses; \
ULONG LastAllocateHits; \
} DUMMYUNIONNAME6; \
@@ -170,10 +167,10 @@ typedef struct _LOOKASIDE_LIST_EX {
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
typedef struct _EX_RUNDOWN_REF {
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
volatile ULONG_PTR Count;
volatile PVOID Ptr;
- };
+ } DUMMYUNIONNAME;
} EX_RUNDOWN_REF, *PEX_RUNDOWN_REF;
typedef struct _EX_RUNDOWN_REF_CACHE_AWARE *PEX_RUNDOWN_REF_CACHE_AWARE;
@@ -200,14 +197,14 @@ typedef ULONG_PTR ERESOURCE_THREAD, *PERESOURCE_THREAD;
typedef struct _OWNER_ENTRY {
ERESOURCE_THREAD OwnerThread;
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
ULONG IoPriorityBoosted:1;
ULONG OwnerReferenced:1;
ULONG OwnerCount:30;
- };
+ } DUMMYSTRUCTNAME;
ULONG TableSize;
- };
+ } DUMMYUNIONNAME;
} OWNER_ENTRY, *POWNER_ENTRY;
typedef struct _ERESOURCE {
@@ -225,10 +222,10 @@ typedef struct _ERESOURCE {
#if defined(_WIN64)
PVOID Reserved2;
#endif
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
PVOID Address;
ULONG_PTR CreatorBackTraceIndex;
- };
+ } DUMMYUNIONNAME;
KSPIN_LOCK SpinLock;
} ERESOURCE, *PERESOURCE;
@@ -268,9 +265,8 @@ extern ULONG NtGlobalFlag;
#define IF_NTOS_DEBUG(FlagName) if(FALSE)
#endif
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
$if (_NTDDK_)
-
typedef struct _ZONE_SEGMENT_HEADER {
SINGLE_LIST_ENTRY SegmentList;
PVOID Reserved;
@@ -285,5 +281,10 @@ typedef struct _ZONE_HEADER {
#define PROTECTED_POOL 0x80000000
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
+$if (_NTIFS_)
+#define INVALID_PROCESSOR_INDEX 0xffffffff
+#define EX_PUSH_LOCK ULONG_PTR
+#define PEX_PUSH_LOCK PULONG_PTR
+$endif (_NTIFS_)
diff --git a/include/xdk/fsrtlfuncs.h b/include/xdk/fsrtlfuncs.h
new file mode 100644
index 00000000000..05fdb7e19b1
--- /dev/null
+++ b/include/xdk/fsrtlfuncs.h
@@ -0,0 +1,1499 @@
+$if (_NTIFS_)
+/* FSRTL Functions */
+
+#define FsRtlEnterFileSystem KeEnterCriticalRegion
+#define FsRtlExitFileSystem KeLeaveCriticalRegion
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCopyRead(
+ 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);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCopyWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN BOOLEAN Wait,
+ IN ULONG LockKey,
+ IN PVOID Buffer,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlReadDev(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlReadCompleteDev(
+ IN PFILE_OBJECT FileObject,
+ IN PMDL MdlChain,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlPrepareMdlWriteDev(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN ULONG Length,
+ IN ULONG LockKey,
+ OUT PMDL *MdlChain,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlWriteCompleteDev(
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PMDL MdlChain,
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlAcquireFileExclusive(
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlReleaseFile(
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlGetFileSize(
+ IN PFILE_OBJECT FileObject,
+ OUT PLARGE_INTEGER FileSize);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsTotalDeviceFailure(
+ IN NTSTATUS Status);
+
+NTKERNELAPI
+PFILE_LOCK
+NTAPI
+FsRtlAllocateFileLock(
+ IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
+ IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlFreeFileLock(
+ IN PFILE_LOCK FileLock);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeFileLock(
+ IN PFILE_LOCK FileLock,
+ IN PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine OPTIONAL,
+ IN PUNLOCK_ROUTINE UnlockRoutine OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlUninitializeFileLock(
+ IN PFILE_LOCK FileLock);
+
+/*
+ FsRtlProcessFileLock:
+
+ ret:
+ -STATUS_INVALID_DEVICE_REQUEST
+ -STATUS_RANGE_NOT_LOCKED from unlock routines.
+ -STATUS_PENDING, STATUS_LOCK_NOT_GRANTED from FsRtlPrivateLock
+ (redirected IoStatus->Status).
+
+ Internals:
+ -switch ( Irp->CurrentStackLocation->MinorFunction )
+ lock: return FsRtlPrivateLock;
+ unlocksingle: return FsRtlFastUnlockSingle;
+ unlockall: return FsRtlFastUnlockAll;
+ unlockallbykey: return FsRtlFastUnlockAllByKey;
+ default: IofCompleteRequest with STATUS_INVALID_DEVICE_REQUEST;
+ return STATUS_INVALID_DEVICE_REQUEST;
+
+ -'AllwaysZero' is passed thru as 'AllwaysZero' to lock / unlock routines.
+ -'Irp' is passet thru as 'Irp' to FsRtlPrivateLock.
+*/
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlProcessFileLock(
+ IN PFILE_LOCK FileLock,
+ IN PIRP Irp,
+ IN PVOID Context OPTIONAL);
+
+/*
+ FsRtlCheckLockForReadAccess:
+
+ All this really does is pick out the lock parameters from the irp (io stack
+ location?), get IoGetRequestorProcess, and pass values on to
+ FsRtlFastCheckLockForRead.
+*/
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCheckLockForReadAccess(
+ IN PFILE_LOCK FileLock,
+ IN PIRP Irp);
+
+/*
+ FsRtlCheckLockForWriteAccess:
+
+ All this really does is pick out the lock parameters from the irp (io stack
+ location?), get IoGetRequestorProcess, and pass values on to
+ FsRtlFastCheckLockForWrite.
+*/
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCheckLockForWriteAccess(
+ IN PFILE_LOCK FileLock,
+ IN PIRP Irp);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlFastCheckLockForRead(
+ IN PFILE_LOCK FileLock,
+ IN PLARGE_INTEGER FileOffset,
+ IN PLARGE_INTEGER Length,
+ IN ULONG Key,
+ IN PFILE_OBJECT FileObject,
+ IN PVOID Process);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlFastCheckLockForWrite(
+ IN PFILE_LOCK FileLock,
+ IN PLARGE_INTEGER FileOffset,
+ IN PLARGE_INTEGER Length,
+ IN ULONG Key,
+ IN PFILE_OBJECT FileObject,
+ IN PVOID Process);
+
+/*
+ FsRtlGetNextFileLock:
+
+ ret: NULL if no more locks
+
+ Internals:
+ FsRtlGetNextFileLock uses FileLock->LastReturnedLockInfo and
+ FileLock->LastReturnedLock as storage.
+ LastReturnedLock is a pointer to the 'raw' lock inkl. double linked
+ list, and FsRtlGetNextFileLock needs this to get next lock on subsequent
+ calls with Restart = FALSE.
+*/
+NTKERNELAPI
+PFILE_LOCK_INFO
+NTAPI
+FsRtlGetNextFileLock(
+ IN PFILE_LOCK FileLock,
+ IN BOOLEAN Restart);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFastUnlockSingle(
+ IN PFILE_LOCK FileLock,
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PLARGE_INTEGER Length,
+ IN PEPROCESS Process,
+ IN ULONG Key,
+ IN PVOID Context OPTIONAL,
+ IN BOOLEAN AlreadySynchronized);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFastUnlockAll(
+ IN PFILE_LOCK FileLock,
+ IN PFILE_OBJECT FileObject,
+ IN PEPROCESS Process,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFastUnlockAllByKey(
+ IN PFILE_LOCK FileLock,
+ IN PFILE_OBJECT FileObject,
+ IN PEPROCESS Process,
+ IN ULONG Key,
+ IN PVOID Context OPTIONAL);
+
+/*
+ FsRtlPrivateLock:
+
+ ret: IoStatus->Status: STATUS_PENDING, STATUS_LOCK_NOT_GRANTED
+
+ Internals:
+ -Calls IoCompleteRequest if Irp
+ -Uses exception handling / ExRaiseStatus with STATUS_INSUFFICIENT_RESOURCES
+*/
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlPrivateLock(
+ IN PFILE_LOCK FileLock,
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PLARGE_INTEGER Length,
+ IN PEPROCESS Process,
+ IN ULONG Key,
+ IN BOOLEAN FailImmediately,
+ IN BOOLEAN ExclusiveLock,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ IN PIRP Irp OPTIONAL,
+ IN PVOID Context,
+ IN BOOLEAN AlreadySynchronized);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeTunnelCache(
+ IN PTUNNEL Cache);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlAddToTunnelCache(
+ IN PTUNNEL Cache,
+ IN ULONGLONG DirectoryKey,
+ IN PUNICODE_STRING ShortName,
+ IN PUNICODE_STRING LongName,
+ IN BOOLEAN KeyByShortName,
+ IN ULONG DataLength,
+ IN PVOID Data);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlFindInTunnelCache(
+ IN PTUNNEL Cache,
+ IN ULONGLONG DirectoryKey,
+ IN PUNICODE_STRING Name,
+ OUT PUNICODE_STRING ShortName,
+ OUT PUNICODE_STRING LongName,
+ IN OUT PULONG DataLength,
+ OUT PVOID Data);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlDeleteKeyFromTunnelCache(
+ IN PTUNNEL Cache,
+ IN ULONGLONG DirectoryKey);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlDeleteTunnelCache(
+ IN PTUNNEL Cache);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlDissectDbcs(
+ IN ANSI_STRING Name,
+ OUT PANSI_STRING FirstPart,
+ OUT PANSI_STRING RemainingPart);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlDoesDbcsContainWildCards(
+ IN PANSI_STRING Name);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsDbcsInExpression(
+ IN PANSI_STRING Expression,
+ IN PANSI_STRING Name);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsFatDbcsLegal(
+ IN ANSI_STRING DbcsName,
+ IN BOOLEAN WildCardsPermissible,
+ IN BOOLEAN PathNamePermissible,
+ IN BOOLEAN LeadingBackslashPermissible);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsHpfsDbcsLegal(
+ IN ANSI_STRING DbcsName,
+ IN BOOLEAN WildCardsPermissible,
+ IN BOOLEAN PathNamePermissible,
+ IN BOOLEAN LeadingBackslashPermissible);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlNormalizeNtstatus(
+ IN NTSTATUS Exception,
+ IN NTSTATUS GenericException);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsNtstatusExpected(
+ IN NTSTATUS Ntstatus);
+
+NTKERNELAPI
+PERESOURCE
+NTAPI
+FsRtlAllocateResource(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeLargeMcb(
+ IN PLARGE_MCB Mcb,
+ IN POOL_TYPE PoolType);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlUninitializeLargeMcb(
+ IN PLARGE_MCB Mcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlResetLargeMcb(
+ IN PLARGE_MCB Mcb,
+ IN BOOLEAN SelfSynchronized);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlTruncateLargeMcb(
+ IN PLARGE_MCB Mcb,
+ IN LONGLONG Vbn);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAddLargeMcbEntry(
+ IN PLARGE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG Lbn,
+ IN LONGLONG SectorCount);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlRemoveLargeMcbEntry(
+ IN PLARGE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupLargeMcbEntry(
+ IN PLARGE_MCB Mcb,
+ IN LONGLONG Vbn,
+ OUT PLONGLONG Lbn OPTIONAL,
+ OUT PLONGLONG SectorCountFromLbn OPTIONAL,
+ OUT PLONGLONG StartingLbn OPTIONAL,
+ OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,
+ OUT PULONG Index OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupLastLargeMcbEntry(
+ IN PLARGE_MCB Mcb,
+ OUT PLONGLONG Vbn,
+ OUT PLONGLONG Lbn);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupLastLargeMcbEntryAndIndex(
+ IN PLARGE_MCB OpaqueMcb,
+ OUT PLONGLONG LargeVbn,
+ OUT PLONGLONG LargeLbn,
+ OUT PULONG Index);
+
+NTKERNELAPI
+ULONG
+NTAPI
+FsRtlNumberOfRunsInLargeMcb(
+ IN PLARGE_MCB Mcb);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlGetNextLargeMcbEntry(
+ IN PLARGE_MCB Mcb,
+ IN ULONG RunIndex,
+ OUT PLONGLONG Vbn,
+ OUT PLONGLONG Lbn,
+ OUT PLONGLONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlSplitLargeMcb(
+ IN PLARGE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG Amount);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeMcb(
+ IN PMCB Mcb,
+ IN POOL_TYPE PoolType);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlUninitializeMcb(
+ IN PMCB Mcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlTruncateMcb(
+ IN PMCB Mcb,
+ IN VBN Vbn);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAddMcbEntry(
+ IN PMCB Mcb,
+ IN VBN Vbn,
+ IN LBN Lbn,
+ IN ULONG SectorCount);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlRemoveMcbEntry(
+ IN PMCB Mcb,
+ IN VBN Vbn,
+ IN ULONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupMcbEntry(
+ IN PMCB Mcb,
+ IN VBN Vbn,
+ OUT PLBN Lbn,
+ OUT PULONG SectorCount OPTIONAL,
+ OUT PULONG Index);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupLastMcbEntry(
+ IN PMCB Mcb,
+ OUT PVBN Vbn,
+ OUT PLBN Lbn);
+
+NTKERNELAPI
+ULONG
+NTAPI
+FsRtlNumberOfRunsInMcb(
+ IN PMCB Mcb);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlGetNextMcbEntry(
+ IN PMCB Mcb,
+ IN ULONG RunIndex,
+ OUT PVBN Vbn,
+ OUT PLBN Lbn,
+ OUT PULONG SectorCount);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlBalanceReads(
+ IN PDEVICE_OBJECT TargetDevice);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeOplock(
+ IN OUT POPLOCK Oplock);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlUninitializeOplock(
+ IN OUT POPLOCK Oplock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlOplockFsctrl(
+ IN POPLOCK Oplock,
+ IN PIRP Irp,
+ IN ULONG OpenCount);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlCheckOplock(
+ IN POPLOCK Oplock,
+ IN PIRP Irp,
+ IN PVOID Context,
+ IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
+ IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlOplockIsFastIoPossible(
+ IN POPLOCK Oplock);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCurrentBatchOplock(
+ IN POPLOCK Oplock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlNotifyVolumeEvent(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG EventCode);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyInitializeSync(
+ IN PNOTIFY_SYNC *NotifySync);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyUninitializeSync(
+ IN PNOTIFY_SYNC *NotifySync);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyFullChangeDirectory(
+ IN PNOTIFY_SYNC NotifySync,
+ IN PLIST_ENTRY NotifyList,
+ IN PVOID FsContext,
+ IN PSTRING FullDirectoryName,
+ IN BOOLEAN WatchTree,
+ IN BOOLEAN IgnoreBuffer,
+ IN ULONG CompletionFilter,
+ IN PIRP NotifyIrp OPTIONAL,
+ IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyFilterReportChange(
+ IN PNOTIFY_SYNC NotifySync,
+ IN PLIST_ENTRY NotifyList,
+ IN PSTRING FullTargetName,
+ IN USHORT TargetNameOffset,
+ IN PSTRING StreamName OPTIONAL,
+ IN PSTRING NormalizedParentName OPTIONAL,
+ IN ULONG FilterMatch,
+ IN ULONG Action,
+ IN PVOID TargetContext OPTIONAL,
+ IN PVOID FilterContext OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyFullReportChange(
+ IN PNOTIFY_SYNC NotifySync,
+ IN PLIST_ENTRY NotifyList,
+ IN PSTRING FullTargetName,
+ IN USHORT TargetNameOffset,
+ IN PSTRING StreamName OPTIONAL,
+ IN PSTRING NormalizedParentName OPTIONAL,
+ IN ULONG FilterMatch,
+ IN ULONG Action,
+ IN PVOID TargetContext OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyCleanup(
+ IN PNOTIFY_SYNC NotifySync,
+ IN PLIST_ENTRY NotifyList,
+ IN PVOID FsContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlDissectName(
+ IN UNICODE_STRING Name,
+ OUT PUNICODE_STRING FirstPart,
+ OUT PUNICODE_STRING RemainingPart);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlDoesNameContainWildCards(
+ IN PUNICODE_STRING Name);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAreNamesEqual(
+ IN PCUNICODE_STRING Name1,
+ IN PCUNICODE_STRING Name2,
+ IN BOOLEAN IgnoreCase,
+ IN PCWCH UpcaseTable OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsNameInExpression(
+ IN PUNICODE_STRING Expression,
+ IN PUNICODE_STRING Name,
+ IN BOOLEAN IgnoreCase,
+ IN PWCHAR UpcaseTable OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlPostPagingFileStackOverflow(
+ IN PVOID Context,
+ IN PKEVENT Event,
+ IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlPostStackOverflow (
+ IN PVOID Context,
+ IN PKEVENT Event,
+ IN PFSRTL_STACK_OVERFLOW_ROUTINE StackOverflowRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlRegisterUncProvider(
+ OUT PHANDLE MupHandle,
+ IN PUNICODE_STRING RedirectorDeviceName,
+ IN BOOLEAN MailslotsSupported);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlDeregisterUncProvider(
+ IN HANDLE Handle);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlTeardownPerStreamContexts(
+ IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlCreateSectionForDataScan(
+ OUT PHANDLE SectionHandle,
+ OUT PVOID *SectionObject,
+ OUT PLARGE_INTEGER SectionFileSize OPTIONAL,
+ IN PFILE_OBJECT FileObject,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN PLARGE_INTEGER MaximumSize OPTIONAL,
+ IN ULONG SectionPageProtection,
+ IN ULONG AllocationAttributes,
+ IN ULONG Flags);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyFilterChangeDirectory(
+ IN PNOTIFY_SYNC NotifySync,
+ IN PLIST_ENTRY NotifyList,
+ IN PVOID FsContext,
+ IN PSTRING FullDirectoryName,
+ IN BOOLEAN WatchTree,
+ IN BOOLEAN IgnoreBuffer,
+ IN ULONG CompletionFilter,
+ IN PIRP NotifyIrp OPTIONAL,
+ IN PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback OPTIONAL,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext OPTIONAL,
+ IN PFILTER_REPORT_CHANGE FilterCallback OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlInsertPerStreamContext(
+ IN PFSRTL_ADVANCED_FCB_HEADER PerStreamContext,
+ IN PFSRTL_PER_STREAM_CONTEXT Ptr);
+
+NTKERNELAPI
+PFSRTL_PER_STREAM_CONTEXT
+NTAPI
+FsRtlLookupPerStreamContextInternal(
+ IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
+ IN PVOID OwnerId OPTIONAL,
+ IN PVOID InstanceId OPTIONAL);
+
+NTKERNELAPI
+PFSRTL_PER_STREAM_CONTEXT
+NTAPI
+FsRtlRemovePerStreamContext(
+ IN PFSRTL_ADVANCED_FCB_HEADER StreamContext,
+ IN PVOID OwnerId OPTIONAL,
+ IN PVOID InstanceId OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlIncrementCcFastReadNotPossible(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlIncrementCcFastReadWait(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlIncrementCcFastReadNoWait(
+ VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlIncrementCcFastReadResourceMiss(
+ VOID);
+
+NTKERNELAPI
+LOGICAL
+NTAPI
+FsRtlIsPagingFile(
+ IN PFILE_OBJECT FileObject);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WS03)
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeBaseMcb(
+ IN PBASE_MCB Mcb,
+ IN POOL_TYPE PoolType);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlUninitializeBaseMcb(
+ IN PBASE_MCB Mcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlResetBaseMcb(
+ IN PBASE_MCB Mcb);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlTruncateBaseMcb(
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAddBaseMcbEntry(
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG Lbn,
+ IN LONGLONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlRemoveBaseMcbEntry(
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupBaseMcbEntry(
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn,
+ OUT PLONGLONG Lbn OPTIONAL,
+ OUT PLONGLONG SectorCountFromLbn OPTIONAL,
+ OUT PLONGLONG StartingLbn OPTIONAL,
+ OUT PLONGLONG SectorCountFromStartingLbn OPTIONAL,
+ OUT PULONG Index OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupLastBaseMcbEntry(
+ IN PBASE_MCB Mcb,
+ OUT PLONGLONG Vbn,
+ OUT PLONGLONG Lbn);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlLookupLastBaseMcbEntryAndIndex(
+ IN PBASE_MCB OpaqueMcb,
+ IN OUT PLONGLONG LargeVbn,
+ IN OUT PLONGLONG LargeLbn,
+ IN OUT PULONG Index);
+
+NTKERNELAPI
+ULONG
+NTAPI
+FsRtlNumberOfRunsInBaseMcb(
+ IN PBASE_MCB Mcb);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlGetNextBaseMcbEntry(
+ IN PBASE_MCB Mcb,
+ IN ULONG RunIndex,
+ OUT PLONGLONG Vbn,
+ OUT PLONGLONG Lbn,
+ OUT PLONGLONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlSplitBaseMcb(
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG Amount);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+BOOLEAN
+NTAPI
+FsRtlInitializeBaseMcbEx(
+ IN PBASE_MCB Mcb,
+ IN POOL_TYPE PoolType,
+ IN USHORT Flags);
+
+NTSTATUS
+NTAPI
+FsRtlAddBaseMcbEntryEx(
+ IN PBASE_MCB Mcb,
+ IN LONGLONG Vbn,
+ IN LONGLONG Lbn,
+ IN LONGLONG SectorCount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCurrentOplock(
+ IN POPLOCK Oplock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlOplockBreakToNone(
+ IN OUT POPLOCK Oplock,
+ IN PIO_STACK_LOCATION IrpSp OPTIONAL,
+ IN PIRP Irp,
+ IN PVOID Context OPTIONAL,
+ IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
+ IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlNotifyVolumeEventEx(
+ IN PFILE_OBJECT FileObject,
+ IN ULONG EventCode,
+ IN PTARGET_DEVICE_CUSTOM_NOTIFICATION Event);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyCleanupAll(
+ IN PNOTIFY_SYNC NotifySync,
+ IN PLIST_ENTRY NotifyList);
+
+NTSTATUS
+NTAPI
+FsRtlRegisterUncProviderEx(
+ OUT PHANDLE MupHandle,
+ IN PUNICODE_STRING RedirDevName,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG Flags);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlCancellableWaitForSingleObject(
+ IN PVOID Object,
+ IN PLARGE_INTEGER Timeout OPTIONAL,
+ IN PIRP Irp OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlCancellableWaitForMultipleObjects(
+ IN ULONG Count,
+ IN PVOID ObjectArray[],
+ IN WAIT_TYPE WaitType,
+ IN PLARGE_INTEGER Timeout OPTIONAL,
+ IN PKWAIT_BLOCK WaitBlockArray OPTIONAL,
+ IN PIRP Irp OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlMupGetProviderInfoFromFileObject(
+ IN PFILE_OBJECT pFileObject,
+ IN ULONG Level,
+ OUT PVOID pBuffer,
+ IN OUT PULONG pBufferSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlMupGetProviderIdFromName(
+ IN PUNICODE_STRING pProviderName,
+ OUT PULONG32 pProviderId);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlIncrementCcFastMdlReadWait(
+ VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlValidateReparsePointBuffer(
+ IN ULONG BufferLength,
+ IN PREPARSE_DATA_BUFFER ReparseBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlRemoveDotsFromPath(
+ IN OUT PWSTR OriginalString,
+ IN USHORT PathLength,
+ OUT USHORT *NewLength);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlAllocateExtraCreateParameterList(
+ IN FSRTL_ALLOCATE_ECPLIST_FLAGS Flags,
+ OUT PECP_LIST *EcpList);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlFreeExtraCreateParameterList(
+ IN PECP_LIST EcpList);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlAllocateExtraCreateParameter(
+ IN LPCGUID EcpType,
+ IN ULONG SizeOfContext,
+ IN FSRTL_ALLOCATE_ECP_FLAGS Flags,
+ IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL,
+ IN ULONG PoolTag,
+ OUT PVOID *EcpContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlFreeExtraCreateParameter(
+ IN PVOID EcpContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitExtraCreateParameterLookasideList(
+ IN OUT PVOID Lookaside,
+ IN FSRTL_ECP_LOOKASIDE_FLAGS Flags,
+ IN SIZE_T Size,
+ IN ULONG Tag);
+
+VOID
+NTAPI
+FsRtlDeleteExtraCreateParameterLookasideList(
+ IN OUT PVOID Lookaside,
+ IN FSRTL_ECP_LOOKASIDE_FLAGS Flags);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlAllocateExtraCreateParameterFromLookasideList(
+ IN LPCGUID EcpType,
+ IN ULONG SizeOfContext,
+ IN FSRTL_ALLOCATE_ECP_FLAGS Flags,
+ IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL,
+ IN OUT PVOID LookasideList,
+ OUT PVOID *EcpContext);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlInsertExtraCreateParameter(
+ IN OUT PECP_LIST EcpList,
+ IN OUT PVOID EcpContext);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlFindExtraCreateParameter(
+ IN PECP_LIST EcpList,
+ IN LPCGUID EcpType,
+ OUT PVOID *EcpContext OPTIONAL,
+ OUT ULONG *EcpContextSize OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlRemoveExtraCreateParameter(
+ IN OUT PECP_LIST EcpList,
+ IN LPCGUID EcpType,
+ OUT PVOID *EcpContext,
+ OUT ULONG *EcpContextSize OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlGetEcpListFromIrp(
+ IN PIRP Irp,
+ OUT PECP_LIST *EcpList OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlSetEcpListIntoIrp(
+ IN OUT PIRP Irp,
+ IN PECP_LIST EcpList);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlGetNextExtraCreateParameter(
+ IN PECP_LIST EcpList,
+ IN PVOID CurrentEcpContext OPTIONAL,
+ OUT LPGUID NextEcpType OPTIONAL,
+ OUT PVOID *NextEcpContext OPTIONAL,
+ OUT ULONG *NextEcpContextSize OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlAcknowledgeEcp(
+ IN PVOID EcpContext);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsEcpAcknowledged(
+ IN PVOID EcpContext);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsEcpFromUserMode(
+ IN PVOID EcpContext);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlChangeBackingFileObject(
+ IN PFILE_OBJECT CurrentFileObject OPTIONAL,
+ IN PFILE_OBJECT NewFileObject,
+ IN FSRTL_CHANGE_BACKING_TYPE ChangeBackingType,
+ IN ULONG Flags);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlLogCcFlushError(
+ IN PUNICODE_STRING FileName,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN NTSTATUS FlushError,
+ IN ULONG Flags);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAreVolumeStartupApplicationsComplete(
+ VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+FsRtlQueryMaximumVirtualDiskNestingLevel(
+ VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlGetVirtualDiskNestingLevel(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT PULONG NestingLevel,
+ OUT PULONG NestingFlags OPTIONAL);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlCheckOplockEx(
+ IN POPLOCK Oplock,
+ IN PIRP Irp,
+ IN ULONG Flags,
+ IN PVOID Context OPTIONAL,
+ IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
+ IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlAreThereCurrentOrInProgressFileLocks(
+ IN PFILE_LOCK FileLock);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlOplockIsSharedRequest(
+ IN PIRP Irp);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlOplockBreakH(
+ IN POPLOCK Oplock,
+ IN PIRP Irp,
+ IN ULONG Flags,
+ IN PVOID Context OPTIONAL,
+ IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
+ IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlCurrentOplockH(
+ IN POPLOCK Oplock);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlOplockBreakToNoneEx(
+ IN OUT POPLOCK Oplock,
+ IN PIRP Irp,
+ IN ULONG Flags,
+ IN PVOID Context OPTIONAL,
+ IN POPLOCK_WAIT_COMPLETE_ROUTINE CompletionRoutine OPTIONAL,
+ IN POPLOCK_FS_PREPOST_IRP PostIrpRoutine OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlOplockFsctrlEx(
+ IN POPLOCK Oplock,
+ IN PIRP Irp,
+ IN ULONG OpenCount,
+ IN ULONG Flags);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlOplockKeysEqual(
+ IN PFILE_OBJECT Fo1 OPTIONAL,
+ IN PFILE_OBJECT Fo2 OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlInitializeExtraCreateParameterList(
+ IN OUT PECP_LIST EcpList);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlInitializeExtraCreateParameter(
+ IN PECP_HEADER Ecp,
+ IN ULONG EcpFlags,
+ IN PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK CleanupCallback OPTIONAL,
+ IN ULONG TotalSize,
+ IN LPCGUID EcpType,
+ IN PVOID ListAllocatedFrom OPTIONAL);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlInsertPerFileContext(
+ IN PVOID* PerFileContextPointer,
+ IN PFSRTL_PER_FILE_CONTEXT Ptr);
+
+NTKERNELAPI
+PFSRTL_PER_FILE_CONTEXT
+NTAPI
+FsRtlLookupPerFileContext(
+ IN PVOID* PerFileContextPointer,
+ IN PVOID OwnerId OPTIONAL,
+ IN PVOID InstanceId OPTIONAL);
+
+NTKERNELAPI
+PFSRTL_PER_FILE_CONTEXT
+NTAPI
+FsRtlRemovePerFileContext(
+ IN PVOID* PerFileContextPointer,
+ IN PVOID OwnerId OPTIONAL,
+ IN PVOID InstanceId OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlTeardownPerFileContexts(
+ IN PVOID* PerFileContextPointer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlInsertPerFileObjectContext(
+ IN PFILE_OBJECT FileObject,
+ IN PFSRTL_PER_FILEOBJECT_CONTEXT Ptr);
+
+NTKERNELAPI
+PFSRTL_PER_FILEOBJECT_CONTEXT
+NTAPI
+FsRtlLookupPerFileObjectContext(
+ IN PFILE_OBJECT FileObject,
+ IN PVOID OwnerId OPTIONAL,
+ IN PVOID InstanceId OPTIONAL);
+
+NTKERNELAPI
+PFSRTL_PER_FILEOBJECT_CONTEXT
+NTAPI
+FsRtlRemovePerFileObjectContext(
+ IN PFILE_OBJECT FileObject,
+ IN PVOID OwnerId OPTIONAL,
+ IN PVOID InstanceId OPTIONAL);
+
+#define FsRtlFastLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ( \
+ FsRtlPrivateLock(A1, A2, A3, A4, A5, A6, A7, A8, A9, NULL, A10, A11) \
+)
+
+#define FsRtlAreThereCurrentFileLocks(FL) ( \
+ ((FL)->FastIoIsQuestionable) \
+)
+
+#define FsRtlIncrementLockRequestsInProgress(FL) { \
+ ASSERT( (FL)->LockRequestsInProgress >= 0 ); \
+ (void) \
+ (InterlockedIncrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
+}
+
+#define FsRtlDecrementLockRequestsInProgress(FL) { \
+ ASSERT( (FL)->LockRequestsInProgress > 0 ); \
+ (void) \
+ (InterlockedDecrement((LONG volatile *)&((FL)->LockRequestsInProgress)));\
+}
+
+/* GCC compatible definition, MS one is retarded */
+extern NTKERNELAPI const UCHAR * const FsRtlLegalAnsiCharacterArray;
+#define LEGAL_ANSI_CHARACTER_ARRAY FsRtlLegalAnsiCharacterArray
+
+#define FsRtlIsAnsiCharacterWild(C) ( \
+ FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], FSRTL_WILD_CHARACTER ) \
+)
+
+#define FsRtlIsAnsiCharacterLegalFat(C, WILD) ( \
+ FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_FAT_LEGAL) | \
+ ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \
+)
+
+#define FsRtlIsAnsiCharacterLegalHpfs(C, WILD) ( \
+ FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_HPFS_LEGAL) | \
+ ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \
+)
+
+#define FsRtlIsAnsiCharacterLegalNtfs(C, WILD) ( \
+ FlagOn(FsRtlLegalAnsiCharacterArray[(UCHAR)(C)], (FSRTL_NTFS_LEGAL) | \
+ ((WILD) ? FSRTL_WILD_CHARACTER : 0 )) \
+)
+
+#define FsRtlIsAnsiCharacterLegalNtfsStream(C,WILD_OK) ( \
+ FsRtlTestAnsiCharacter((C), TRUE, (WILD_OK), FSRTL_NTFS_STREAM_LEGAL) \
+)
+
+#define FsRtlIsAnsiCharacterLegal(C,FLAGS) ( \
+ FsRtlTestAnsiCharacter((C), TRUE, FALSE, (FLAGS)) \
+)
+
+#define FsRtlTestAnsiCharacter(C, DEFAULT_RET, WILD_OK, FLAGS) ( \
+ ((SCHAR)(C) < 0) ? DEFAULT_RET : \
+ FlagOn( LEGAL_ANSI_CHARACTER_ARRAY[(C)], \
+ (FLAGS) | \
+ ((WILD_OK) ? FSRTL_WILD_CHARACTER : 0) ) \
+)
+
+#define FsRtlIsLeadDbcsCharacter(DBCS_CHAR) ( \
+ (BOOLEAN)((UCHAR)(DBCS_CHAR) < 0x80 ? FALSE : \
+ (NLS_MB_CODE_PAGE_TAG && \
+ (NLS_OEM_LEAD_BYTE_INFO[(UCHAR)(DBCS_CHAR)] != 0))) \
+)
+
+#define FsRtlIsUnicodeCharacterWild(C) ( \
+ (((C) >= 0x40) ? \
+ FALSE : \
+ FlagOn(FsRtlLegalAnsiCharacterArray[(C)], FSRTL_WILD_CHARACTER )) \
+)
+
+#define FsRtlInitPerFileContext( _fc, _owner, _inst, _cb) \
+ ((_fc)->OwnerId = (_owner), \
+ (_fc)->InstanceId = (_inst), \
+ (_fc)->FreeCallback = (_cb))
+
+#define FsRtlGetPerFileContextPointer(_fo) \
+ (FsRtlSupportsPerFileContexts(_fo) ? \
+ FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer : \
+ NULL)
+
+#define FsRtlSupportsPerFileContexts(_fo) \
+ ((FsRtlGetPerStreamContextPointer(_fo) != NULL) && \
+ (FsRtlGetPerStreamContextPointer(_fo)->Version >= FSRTL_FCB_HEADER_V1) && \
+ (FsRtlGetPerStreamContextPointer(_fo)->FileContextSupportPointer != NULL))
+
+#define FsRtlSetupAdvancedHeaderEx( _advhdr, _fmutx, _fctxptr ) \
+{ \
+ FsRtlSetupAdvancedHeader( _advhdr, _fmutx ); \
+ if ((_fctxptr) != NULL) { \
+ (_advhdr)->FileContextSupportPointer = (_fctxptr); \
+ } \
+}
+
+#define FsRtlGetPerStreamContextPointer(FO) ( \
+ (PFSRTL_ADVANCED_FCB_HEADER)(FO)->FsContext \
+)
+
+#define FsRtlInitPerStreamContext(PSC, O, I, FC) ( \
+ (PSC)->OwnerId = (O), \
+ (PSC)->InstanceId = (I), \
+ (PSC)->FreeCallback = (FC) \
+)
+
+#define FsRtlSupportsPerStreamContexts(FO) ( \
+ (BOOLEAN)((NULL != FsRtlGetPerStreamContextPointer(FO) && \
+ FlagOn(FsRtlGetPerStreamContextPointer(FO)->Flags2, \
+ FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS)) \
+)
+
+#define FsRtlLookupPerStreamContext(_sc, _oid, _iid) \
+ (((NULL != (_sc)) && \
+ FlagOn((_sc)->Flags2,FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS) && \
+ !IsListEmpty(&(_sc)->FilterContexts)) ? \
+ FsRtlLookupPerStreamContextInternal((_sc), (_oid), (_iid)) : \
+ NULL)
+
+VOID
+FORCEINLINE
+NTAPI
+FsRtlSetupAdvancedHeader(
+ IN PVOID AdvHdr,
+ IN PFAST_MUTEX FMutex )
+{
+ PFSRTL_ADVANCED_FCB_HEADER localAdvHdr = (PFSRTL_ADVANCED_FCB_HEADER)AdvHdr;
+
+ localAdvHdr->Flags |= FSRTL_FLAG_ADVANCED_HEADER;
+ localAdvHdr->Flags2 |= FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS;
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+ localAdvHdr->Version = FSRTL_FCB_HEADER_V1;
+#else
+ localAdvHdr->Version = FSRTL_FCB_HEADER_V0;
+#endif
+ InitializeListHead( &localAdvHdr->FilterContexts );
+ if (FMutex != NULL) {
+ localAdvHdr->FastMutex = FMutex;
+ }
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+ *((PULONG_PTR)(&localAdvHdr->PushLock)) = 0;
+ localAdvHdr->FileContextSupportPointer = NULL;
+#endif
+}
+
+#define FsRtlInitPerFileObjectContext(_fc, _owner, _inst) \
+ ((_fc)->OwnerId = (_owner), (_fc)->InstanceId = (_inst))
+
+#define FsRtlCompleteRequest(IRP,STATUS) { \
+ (IRP)->IoStatus.Status = (STATUS); \
+ IoCompleteRequest( (IRP), IO_DISK_INCREMENT ); \
+}
+$endif (_NTIFS_)
diff --git a/include/xdk/fsrtltypes.h b/include/xdk/fsrtltypes.h
new file mode 100644
index 00000000000..cc678845be8
--- /dev/null
+++ b/include/xdk/fsrtltypes.h
@@ -0,0 +1,296 @@
+$if (_NTIFS_)
+/* FSRTL Types */
+
+typedef ULONG LBN;
+typedef LBN *PLBN;
+
+typedef ULONG VBN;
+typedef VBN *PVBN;
+
+#define FSRTL_COMMON_FCB_HEADER_LAYOUT \
+ CSHORT NodeTypeCode; \
+ CSHORT NodeByteSize; \
+ UCHAR Flags; \
+ UCHAR IsFastIoPossible; \
+ UCHAR Flags2; \
+ UCHAR Reserved:4; \
+ UCHAR Version:4; \
+ PERESOURCE Resource; \
+ PERESOURCE PagingIoResource; \
+ LARGE_INTEGER AllocationSize; \
+ LARGE_INTEGER FileSize; \
+ LARGE_INTEGER ValidDataLength;
+
+typedef struct _FSRTL_COMMON_FCB_HEADER {
+ FSRTL_COMMON_FCB_HEADER_LAYOUT
+} FSRTL_COMMON_FCB_HEADER, *PFSRTL_COMMON_FCB_HEADER;
+
+#ifdef __cplusplus
+typedef struct _FSRTL_ADVANCED_FCB_HEADER:FSRTL_COMMON_FCB_HEADER {
+#else /* __cplusplus */
+typedef struct _FSRTL_ADVANCED_FCB_HEADER {
+ FSRTL_COMMON_FCB_HEADER_LAYOUT
+#endif /* __cplusplus */
+ PFAST_MUTEX FastMutex;
+ LIST_ENTRY FilterContexts;
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+ EX_PUSH_LOCK PushLock;
+ PVOID *FileContextSupportPointer;
+#endif
+} FSRTL_ADVANCED_FCB_HEADER, *PFSRTL_ADVANCED_FCB_HEADER;
+
+#define FSRTL_FCB_HEADER_V0 (0x00)
+#define FSRTL_FCB_HEADER_V1 (0x01)
+
+#define FSRTL_FLAG_FILE_MODIFIED (0x01)
+#define FSRTL_FLAG_FILE_LENGTH_CHANGED (0x02)
+#define FSRTL_FLAG_LIMIT_MODIFIED_PAGES (0x04)
+#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_EX (0x08)
+#define FSRTL_FLAG_ACQUIRE_MAIN_RSRC_SH (0x10)
+#define FSRTL_FLAG_USER_MAPPED_FILE (0x20)
+#define FSRTL_FLAG_ADVANCED_HEADER (0x40)
+#define FSRTL_FLAG_EOF_ADVANCE_ACTIVE (0x80)
+
+#define FSRTL_FLAG2_DO_MODIFIED_WRITE (0x01)
+#define FSRTL_FLAG2_SUPPORTS_FILTER_CONTEXTS (0x02)
+#define FSRTL_FLAG2_PURGE_WHEN_MAPPED (0x04)
+#define FSRTL_FLAG2_IS_PAGING_FILE (0x08)
+
+#define FSRTL_FSP_TOP_LEVEL_IRP (0x01)
+#define FSRTL_CACHE_TOP_LEVEL_IRP (0x02)
+#define FSRTL_MOD_WRITE_TOP_LEVEL_IRP (0x03)
+#define FSRTL_FAST_IO_TOP_LEVEL_IRP (0x04)
+#define FSRTL_NETWORK1_TOP_LEVEL_IRP ((LONG_PTR)0x05)
+#define FSRTL_NETWORK2_TOP_LEVEL_IRP ((LONG_PTR)0x06)
+#define FSRTL_MAX_TOP_LEVEL_IRP_FLAG ((LONG_PTR)0xFFFF)
+
+typedef struct _FSRTL_AUXILIARY_BUFFER {
+ PVOID Buffer;
+ ULONG Length;
+ ULONG Flags;
+ PMDL Mdl;
+} FSRTL_AUXILIARY_BUFFER, *PFSRTL_AUXILIARY_BUFFER;
+
+#define FSRTL_AUXILIARY_FLAG_DEALLOCATE 0x00000001
+
+typedef enum _FSRTL_COMPARISON_RESULT {
+ LessThan = -1,
+ EqualTo = 0,
+ GreaterThan = 1
+} FSRTL_COMPARISON_RESULT;
+
+#define FSRTL_FAT_LEGAL 0x01
+#define FSRTL_HPFS_LEGAL 0x02
+#define FSRTL_NTFS_LEGAL 0x04
+#define FSRTL_WILD_CHARACTER 0x08
+#define FSRTL_OLE_LEGAL 0x10
+#define FSRTL_NTFS_STREAM_LEGAL (FSRTL_NTFS_LEGAL | FSRTL_OLE_LEGAL)
+
+#define FSRTL_VOLUME_DISMOUNT 1
+#define FSRTL_VOLUME_DISMOUNT_FAILED 2
+#define FSRTL_VOLUME_LOCK 3
+#define FSRTL_VOLUME_LOCK_FAILED 4
+#define FSRTL_VOLUME_UNLOCK 5
+#define FSRTL_VOLUME_MOUNT 6
+#define FSRTL_VOLUME_NEEDS_CHKDSK 7
+#define FSRTL_VOLUME_WORM_NEAR_FULL 8
+#define FSRTL_VOLUME_WEARING_OUT 9
+#define FSRTL_VOLUME_FORCED_CLOSED 10
+#define FSRTL_VOLUME_INFO_MAKE_COMPAT 11
+#define FSRTL_VOLUME_PREPARING_EJECT 12
+#define FSRTL_VOLUME_CHANGE_SIZE 13
+#define FSRTL_VOLUME_BACKGROUND_FORMAT 14
+
+typedef VOID
+(NTAPI *PFSRTL_STACK_OVERFLOW_ROUTINE) (
+ IN PVOID Context,
+ IN PKEVENT Event);
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+#define FSRTL_UNC_PROVIDER_FLAGS_MAILSLOTS_SUPPORTED 0x00000001
+#define FSRTL_UNC_PROVIDER_FLAGS_CSC_ENABLED 0x00000002
+#define FSRTL_UNC_PROVIDER_FLAGS_DOMAIN_SVC_AWARE 0x00000004
+
+#define FSRTL_ALLOCATE_ECPLIST_FLAG_CHARGE_QUOTA 0x00000001
+
+#define FSRTL_ALLOCATE_ECP_FLAG_CHARGE_QUOTA 0x00000001
+#define FSRTL_ALLOCATE_ECP_FLAG_NONPAGED_POOL 0x00000002
+
+#define FSRTL_ECP_LOOKASIDE_FLAG_NONPAGED_POOL 0x00000002
+
+#define FSRTL_VIRTDISK_FULLY_ALLOCATED 0x00000001
+#define FSRTL_VIRTDISK_NO_DRIVE_LETTER 0x00000002
+
+typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_1 {
+ ULONG32 ProviderId;
+} FSRTL_MUP_PROVIDER_INFO_LEVEL_1, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_1;
+
+typedef struct _FSRTL_MUP_PROVIDER_INFO_LEVEL_2 {
+ ULONG32 ProviderId;
+ UNICODE_STRING ProviderName;
+} FSRTL_MUP_PROVIDER_INFO_LEVEL_2, *PFSRTL_MUP_PROVIDER_INFO_LEVEL_2;
+
+typedef VOID
+(*PFSRTL_EXTRA_CREATE_PARAMETER_CLEANUP_CALLBACK) (
+ IN OUT PVOID EcpContext,
+ IN LPCGUID EcpType);
+
+typedef struct _ECP_LIST ECP_LIST, *PECP_LIST;
+
+typedef ULONG FSRTL_ALLOCATE_ECPLIST_FLAGS;
+typedef ULONG FSRTL_ALLOCATE_ECP_FLAGS;
+typedef ULONG FSRTL_ECP_LOOKASIDE_FLAGS;
+
+typedef enum _FSRTL_CHANGE_BACKING_TYPE {
+ ChangeDataControlArea,
+ ChangeImageControlArea,
+ ChangeSharedCacheMap
+} FSRTL_CHANGE_BACKING_TYPE, *PFSRTL_CHANGE_BACKING_TYPE;
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+typedef struct _FSRTL_PER_FILE_CONTEXT {
+ LIST_ENTRY Links;
+ PVOID OwnerId;
+ PVOID InstanceId;
+ PFREE_FUNCTION FreeCallback;
+} FSRTL_PER_FILE_CONTEXT, *PFSRTL_PER_FILE_CONTEXT;
+
+typedef struct _FSRTL_PER_STREAM_CONTEXT {
+ LIST_ENTRY Links;
+ PVOID OwnerId;
+ PVOID InstanceId;
+ PFREE_FUNCTION FreeCallback;
+} FSRTL_PER_STREAM_CONTEXT, *PFSRTL_PER_STREAM_CONTEXT;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+typedef VOID
+(*PFN_FSRTLTEARDOWNPERSTREAMCONTEXTS) (
+ IN PFSRTL_ADVANCED_FCB_HEADER AdvancedHeader);
+#endif
+
+typedef struct _FSRTL_PER_FILEOBJECT_CONTEXT {
+ LIST_ENTRY Links;
+ PVOID OwnerId;
+ PVOID InstanceId;
+} FSRTL_PER_FILEOBJECT_CONTEXT, *PFSRTL_PER_FILEOBJECT_CONTEXT;
+
+#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_HARD_ERROR 0x1
+#define FSRTL_CC_FLUSH_ERROR_FLAG_NO_LOG_ENTRY 0x2
+
+typedef NTSTATUS
+(NTAPI *PCOMPLETE_LOCK_IRP_ROUTINE) (
+ IN PVOID Context,
+ IN PIRP Irp);
+
+typedef struct _FILE_LOCK_INFO {
+ LARGE_INTEGER StartingByte;
+ LARGE_INTEGER Length;
+ BOOLEAN ExclusiveLock;
+ ULONG Key;
+ PFILE_OBJECT FileObject;
+ PVOID ProcessId;
+ LARGE_INTEGER EndingByte;
+} FILE_LOCK_INFO, *PFILE_LOCK_INFO;
+
+typedef VOID
+(NTAPI *PUNLOCK_ROUTINE) (
+ IN PVOID Context,
+ IN PFILE_LOCK_INFO FileLockInfo);
+
+typedef struct _FILE_LOCK {
+ PCOMPLETE_LOCK_IRP_ROUTINE CompleteLockIrpRoutine;
+ PUNLOCK_ROUTINE UnlockRoutine;
+ BOOLEAN FastIoIsQuestionable;
+ BOOLEAN SpareC[3];
+ PVOID LockInformation;
+ FILE_LOCK_INFO LastReturnedLockInfo;
+ PVOID LastReturnedLock;
+ LONG volatile LockRequestsInProgress;
+} FILE_LOCK, *PFILE_LOCK;
+
+typedef struct _TUNNEL {
+ FAST_MUTEX Mutex;
+ PRTL_SPLAY_LINKS Cache;
+ LIST_ENTRY TimerQueue;
+ USHORT NumEntries;
+} TUNNEL, *PTUNNEL;
+
+typedef struct _BASE_MCB {
+ ULONG MaximumPairCount;
+ ULONG PairCount;
+ USHORT PoolType;
+ USHORT Flags;
+ PVOID Mapping;
+} BASE_MCB, *PBASE_MCB;
+
+typedef struct _LARGE_MCB {
+ PKGUARDED_MUTEX GuardedMutex;
+ BASE_MCB BaseMcb;
+} LARGE_MCB, *PLARGE_MCB;
+
+#define MCB_FLAG_RAISE_ON_ALLOCATION_FAILURE 1
+
+typedef struct _MCB {
+ LARGE_MCB DummyFieldThatSizesThisStructureCorrectly;
+} MCB, *PMCB;
+
+typedef enum _FAST_IO_POSSIBLE {
+ FastIoIsNotPossible = 0,
+ FastIoIsPossible,
+ FastIoIsQuestionable
+} FAST_IO_POSSIBLE;
+
+typedef struct _EOF_WAIT_BLOCK {
+ LIST_ENTRY EofWaitLinks;
+ KEVENT Event;
+} EOF_WAIT_BLOCK, *PEOF_WAIT_BLOCK;
+
+typedef PVOID OPLOCK, *POPLOCK;
+
+typedef VOID
+(NTAPI *POPLOCK_WAIT_COMPLETE_ROUTINE) (
+ IN PVOID Context,
+ IN PIRP Irp);
+
+typedef VOID
+(NTAPI *POPLOCK_FS_PREPOST_IRP) (
+ IN PVOID Context,
+ IN PIRP Irp);
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+#define OPLOCK_FLAG_COMPLETE_IF_OPLOCKED 0x00000001
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+#define OPLOCK_FLAG_OPLOCK_KEY_CHECK_ONLY 0x00000002
+#define OPLOCK_FLAG_BACK_OUT_ATOMIC_OPLOCK 0x00000004
+#define OPLOCK_FLAG_IGNORE_OPLOCK_KEYS 0x00000008
+#define OPLOCK_FSCTRL_FLAG_ALL_KEYS_MATCH 0x00000001
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+typedef struct _OPLOCK_KEY_ECP_CONTEXT {
+ GUID OplockKey;
+ ULONG Reserved;
+} OPLOCK_KEY_ECP_CONTEXT, *POPLOCK_KEY_ECP_CONTEXT;
+
+DEFINE_GUID(GUID_ECP_OPLOCK_KEY, 0x48850596, 0x3050, 0x4be7, 0x98, 0x63, 0xfe, 0xc3, 0x50, 0xce, 0x8d, 0x7f);
+
+#endif
+
+typedef PVOID PNOTIFY_SYNC;
+
+typedef BOOLEAN
+(NTAPI *PCHECK_FOR_TRAVERSE_ACCESS) (
+ IN PVOID NotifyContext,
+ IN PVOID TargetContext OPTIONAL,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+typedef BOOLEAN
+(NTAPI *PFILTER_REPORT_CHANGE) (
+ IN PVOID NotifyContext,
+ IN PVOID FilterContext);
+$endif (_NTIFS_)
diff --git a/include/xdk/generate.bat b/include/xdk/generate.bat
index e26f34aa105..782f92f0acf 100644
--- a/include/xdk/generate.bat
+++ b/include/xdk/generate.bat
@@ -2,3 +2,5 @@
..\..\output-i386\tools\hpp\hpp.exe wdm.template.h wdm.h
..\..\output-i386\tools\hpp\hpp.exe ntddk.template.h ntddk.h
+..\..\output-i386\tools\hpp\hpp.exe ntifs.template.h ntifs.h
+..\..\output-i386\tools\hpp\hpp.exe devioctl.template.h devioctl.h
diff --git a/include/xdk/halfuncs.h b/include/xdk/halfuncs.h
index 547f4e4b7ce..d257b7407e9 100644
--- a/include/xdk/halfuncs.h
+++ b/include/xdk/halfuncs.h
@@ -3,8 +3,8 @@
#if (NTDDI_VERSION >= NTDDI_WIN2K)
#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_)
-$if (_WDMDDK_)
+$if (_WDMDDK_)
FORCEINLINE
PVOID
NTAPI
@@ -69,9 +69,8 @@ HalGetDmaAlignment(
return alignment;
}
-$endif
+$endif (_WDMDDK_)
$if (_NTDDK_)
-
/* Nothing here */
#else /* USE_DMA_MACROS ... */
@@ -141,10 +140,10 @@ HalAllocateAdapterChannel(
IN ULONG NumberOfMapRegisters,
IN PDRIVER_CONTROL ExecutionRoutine);
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
#endif /* USE_DMA_MACROS ... */
-$if (_NTDDK_)
+$if (_NTDDK_)
#if !defined(NO_LEGACY_DRIVERS)
NTHALAPI
NTSTATUS
@@ -273,10 +272,10 @@ HalPutScatterGatherList(
IN PSCATTER_GATHER_LIST ScatterGather,
IN BOOLEAN WriteToDevice);
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
-$if (_NTDDK_)
+$if (_NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WINXP)
NTKERNELAPI
VOID
@@ -342,5 +341,4 @@ HalBugCheckSystem(
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-$endif /* _NTDDK_ */
-
+$endif (_NTDDK_)
diff --git a/include/xdk/haltypes.h b/include/xdk/haltypes.h
index a9a031776fd..2084fac7f7f 100644
--- a/include/xdk/haltypes.h
+++ b/include/xdk/haltypes.h
@@ -547,5 +547,5 @@ typedef struct _HAL_PLATFORM_INFORMATION {
#define HAL_PLATFORM_DISABLE_UC_MAIN_MEMORY 0x08L
#define HAL_PLATFORM_ENABLE_WRITE_COMBINING_MMIO 0x10L
#define HAL_PLATFORM_ACPI_TABLES_CACHED 0x20L
-$endif
+$endif (_NTDDK_)
diff --git a/include/xdk/iofuncs.h b/include/xdk/iofuncs.h
index a1a2fcf88ee..526dab3fe21 100644
--- a/include/xdk/iofuncs.h
+++ b/include/xdk/iofuncs.h
@@ -1,33 +1,6 @@
/******************************************************************************
* I/O Manager Functions *
******************************************************************************/
-$if (_NTDDK_)
-/*
- * VOID IoAssignArcName(
- * IN PUNICODE_STRING ArcName,
- * IN PUNICODE_STRING DeviceName);
- */
-#define IoAssignArcName(_ArcName, _DeviceName) ( \
- IoCreateSymbolicLink((_ArcName), (_DeviceName)))
-
-/*
- * VOID
- * IoDeassignArcName(
- * IN PUNICODE_STRING ArcName)
- */
-#define IoDeassignArcName IoDeleteSymbolicLink
-
-VOID
-FORCEINLINE
-NTAPI
-IoInitializeDriverCreateContext(
- PIO_DRIVER_CREATE_CONTEXT DriverContext)
-{
- RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
- DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
-}
-$endif
-
$if (_WDMDDK_)
/*
@@ -571,208 +544,54 @@ IoMapTransfer(
WriteToDevice);
}
#endif
-$endif
-#if (NTDDI_VERSION >= NTDDI_WIN2K)
+$endif (_WDMDDK_)
$if (_NTDDK_)
-#if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
+/*
+ * VOID IoAssignArcName(
+ * IN PUNICODE_STRING ArcName,
+ * IN PUNICODE_STRING DeviceName);
+ */
+#define IoAssignArcName(_ArcName, _DeviceName) ( \
+ IoCreateSymbolicLink((_ArcName), (_DeviceName)))
+
+/*
+ * VOID
+ * IoDeassignArcName(
+ * IN PUNICODE_STRING ArcName)
+ */
+#define IoDeassignArcName IoDeleteSymbolicLink
+
+VOID
+FORCEINLINE
+NTAPI
+IoInitializeDriverCreateContext(
+ PIO_DRIVER_CREATE_CONTEXT DriverContext)
+{
+ RtlZeroMemory(DriverContext, sizeof(IO_DRIVER_CREATE_CONTEXT));
+ DriverContext->Size = sizeof(IO_DRIVER_CREATE_CONTEXT);
+}
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+#define IoIsFileOpenedExclusively(FileObject) ( \
+ (BOOLEAN) !( \
+ (FileObject)->SharedRead || \
+ (FileObject)->SharedWrite || \
+ (FileObject)->SharedDelete \
+ ) \
+)
+
+#if (NTDDI_VERSION == NTDDI_WIN2K)
NTKERNELAPI
NTSTATUS
NTAPI
-IoAllocateAdapterChannel(
- IN PADAPTER_OBJECT AdapterObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG NumberOfMapRegisters,
- IN PDRIVER_CONTROL ExecutionRoutine,
- IN PVOID Context);
+IoRegisterFsRegistrationChangeEx(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
#endif
-
-#if !defined(DMA_MACROS_DEFINED)
-//DECLSPEC_DEPRECATED_DDK
-NTHALAPI
-PHYSICAL_ADDRESS
-NTAPI
-IoMapTransfer(
- IN PADAPTER_OBJECT AdapterObject,
- IN PMDL Mdl,
- IN PVOID MapRegisterBase,
- IN PVOID CurrentVa,
- IN OUT PULONG Length,
- IN BOOLEAN WriteToDevice);
-#endif
-
-NTKERNELAPI
-VOID
-NTAPI
-IoAllocateController(
- IN PCONTROLLER_OBJECT ControllerObject,
- IN PDEVICE_OBJECT DeviceObject,
- IN PDRIVER_CONTROL ExecutionRoutine,
- IN PVOID Context OPTIONAL);
-
-NTKERNELAPI
-PCONTROLLER_OBJECT
-NTAPI
-IoCreateController(
- IN ULONG Size);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoDeleteController(
- IN PCONTROLLER_OBJECT ControllerObject);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoFreeController(
- IN PCONTROLLER_OBJECT ControllerObject);
-
-NTKERNELAPI
-PCONFIGURATION_INFORMATION
-NTAPI
-IoGetConfigurationInformation(VOID);
-
-NTKERNELAPI
-PDEVICE_OBJECT
-NTAPI
-IoGetDeviceToVerify(
- IN PETHREAD Thread);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoCancelFileOpen(
- IN PDEVICE_OBJECT DeviceObject,
- IN PFILE_OBJECT FileObject);
-
-NTKERNELAPI
-PGENERIC_MAPPING
-NTAPI
-IoGetFileObjectGenericMapping(VOID);
-
-NTKERNELAPI
-PIRP
-NTAPI
-IoMakeAssociatedIrp(
- IN PIRP Irp,
- IN CCHAR StackSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoQueryDeviceDescription(
- IN PINTERFACE_TYPE BusType OPTIONAL,
- IN PULONG BusNumber OPTIONAL,
- IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
- IN PULONG ControllerNumber OPTIONAL,
- IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
- IN PULONG PeripheralNumber OPTIONAL,
- IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
- IN OUT PVOID Context OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRaiseHardError(
- IN PIRP Irp,
- IN PVPB Vpb OPTIONAL,
- IN PDEVICE_OBJECT RealDeviceObject);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoRaiseInformationalHardError(
- IN NTSTATUS ErrorStatus,
- IN PUNICODE_STRING String OPTIONAL,
- IN PKTHREAD Thread OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterBootDriverReinitialization(
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
- IN PVOID Context OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoRegisterDriverReinitialization(
- IN PDRIVER_OBJECT DriverObject,
- IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
- IN PVOID Context OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAttachDeviceByPointer(
- IN PDEVICE_OBJECT SourceDevice,
- IN PDEVICE_OBJECT TargetDevice);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportDetectedDevice(
- IN PDRIVER_OBJECT DriverObject,
- IN INTERFACE_TYPE LegacyBusType,
- IN ULONG BusNumber,
- IN ULONG SlotNumber,
- IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
- IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
- IN BOOLEAN ResourceAssigned,
- IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportResourceForDetection(
- IN PDRIVER_OBJECT DriverObject,
- IN PCM_RESOURCE_LIST DriverList OPTIONAL,
- IN ULONG DriverListSize OPTIONAL,
- IN PDEVICE_OBJECT DeviceObject OPTIONAL,
- IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
- IN ULONG DeviceListSize OPTIONAL,
- OUT PBOOLEAN ConflictDetected);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReportResourceUsage(
- IN PUNICODE_STRING DriverClassName OPTIONAL,
- IN PDRIVER_OBJECT DriverObject,
- IN PCM_RESOURCE_LIST DriverList OPTIONAL,
- IN ULONG DriverListSize OPTIONAL,
- IN PDEVICE_OBJECT DeviceObject,
- IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
- IN ULONG DeviceListSize OPTIONAL,
- IN BOOLEAN OverrideConflict,
- OUT PBOOLEAN ConflictDetected);
-
-NTKERNELAPI
-VOID
-NTAPI
-IoSetHardErrorOrVerifyDevice(
- IN PIRP Irp,
- IN PDEVICE_OBJECT DeviceObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAssignResources(
- IN PUNICODE_STRING RegistryPath,
- IN PUNICODE_STRING DriverClassName OPTIONAL,
- IN PDRIVER_OBJECT DriverObject,
- IN PDEVICE_OBJECT DeviceObject OPTIONAL,
- IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
- IN OUT PCM_RESOURCE_LIST *AllocatedResources);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-IoSetThreadHardErrorMode(
- IN BOOLEAN EnableHardErrors);
-$endif
+$endif (_NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
$if (_WDMDDK_)
NTKERNELAPI
@@ -1423,7 +1242,457 @@ NTAPI
IoSetTopLevelIrp(
IN PIRP Irp OPTIONAL);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+#if !(defined(USE_DMA_MACROS) && (defined(_NTDDK_) || defined(_NTDRIVER_)) || defined(_WDM_INCLUDED_))
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAllocateAdapterChannel(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG NumberOfMapRegisters,
+ IN PDRIVER_CONTROL ExecutionRoutine,
+ IN PVOID Context);
+#endif
+
+#if !defined(DMA_MACROS_DEFINED)
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+PHYSICAL_ADDRESS
+NTAPI
+IoMapTransfer(
+ IN PADAPTER_OBJECT AdapterObject,
+ IN PMDL Mdl,
+ IN PVOID MapRegisterBase,
+ IN PVOID CurrentVa,
+ IN OUT PULONG Length,
+ IN BOOLEAN WriteToDevice);
+#endif
+
+NTKERNELAPI
+VOID
+NTAPI
+IoAllocateController(
+ IN PCONTROLLER_OBJECT ControllerObject,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PDRIVER_CONTROL ExecutionRoutine,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+PCONTROLLER_OBJECT
+NTAPI
+IoCreateController(
+ IN ULONG Size);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoDeleteController(
+ IN PCONTROLLER_OBJECT ControllerObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoFreeController(
+ IN PCONTROLLER_OBJECT ControllerObject);
+
+NTKERNELAPI
+PCONFIGURATION_INFORMATION
+NTAPI
+IoGetConfigurationInformation(VOID);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetDeviceToVerify(
+ IN PETHREAD Thread);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoCancelFileOpen(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+PGENERIC_MAPPING
+NTAPI
+IoGetFileObjectGenericMapping(VOID);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoMakeAssociatedIrp(
+ IN PIRP Irp,
+ IN CCHAR StackSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryDeviceDescription(
+ IN PINTERFACE_TYPE BusType OPTIONAL,
+ IN PULONG BusNumber OPTIONAL,
+ IN PCONFIGURATION_TYPE ControllerType OPTIONAL,
+ IN PULONG ControllerNumber OPTIONAL,
+ IN PCONFIGURATION_TYPE PeripheralType OPTIONAL,
+ IN PULONG PeripheralNumber OPTIONAL,
+ IN PIO_QUERY_DEVICE_ROUTINE CalloutRoutine,
+ IN OUT PVOID Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRaiseHardError(
+ IN PIRP Irp,
+ IN PVPB Vpb OPTIONAL,
+ IN PDEVICE_OBJECT RealDeviceObject);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoRaiseInformationalHardError(
+ IN NTSTATUS ErrorStatus,
+ IN PUNICODE_STRING String OPTIONAL,
+ IN PKTHREAD Thread OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterBootDriverReinitialization(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterDriverReinitialization(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_REINITIALIZE DriverReinitializationRoutine,
+ IN PVOID Context OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDeviceByPointer(
+ IN PDEVICE_OBJECT SourceDevice,
+ IN PDEVICE_OBJECT TargetDevice);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportDetectedDevice(
+ IN PDRIVER_OBJECT DriverObject,
+ IN INTERFACE_TYPE LegacyBusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ IN PCM_RESOURCE_LIST ResourceList OPTIONAL,
+ IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
+ IN BOOLEAN ResourceAssigned,
+ IN OUT PDEVICE_OBJECT *DeviceObject OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportResourceForDetection(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PCM_RESOURCE_LIST DriverList OPTIONAL,
+ IN ULONG DriverListSize OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
+ IN ULONG DeviceListSize OPTIONAL,
+ OUT PBOOLEAN ConflictDetected);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReportResourceUsage(
+ IN PUNICODE_STRING DriverClassName OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PCM_RESOURCE_LIST DriverList OPTIONAL,
+ IN ULONG DriverListSize OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
+ IN ULONG DeviceListSize OPTIONAL,
+ IN BOOLEAN OverrideConflict,
+ OUT PBOOLEAN ConflictDetected);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetHardErrorOrVerifyDevice(
+ IN PIRP Irp,
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAssignResources(
+ IN PUNICODE_STRING RegistryPath,
+ IN PUNICODE_STRING DriverClassName OPTIONAL,
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ IN PIO_RESOURCE_REQUIREMENTS_LIST RequestedResources OPTIONAL,
+ IN OUT PCM_RESOURCE_LIST *AllocatedResources);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoSetThreadHardErrorMode(
+ IN BOOLEAN EnableHardErrors);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+VOID
+NTAPI
+IoAcquireVpbSpinLock(
+ OUT PKIRQL Irql);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckDesiredAccess(
+ IN OUT PACCESS_MASK DesiredAccess,
+ IN ACCESS_MASK GrantedAccess);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckEaBufferValidity(
+ IN PFILE_FULL_EA_INFORMATION EaBuffer,
+ IN ULONG EaLength,
+ OUT PULONG ErrorOffset);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckFunctionAccess(
+ IN ACCESS_MASK GrantedAccess,
+ IN UCHAR MajorFunction,
+ IN UCHAR MinorFunction,
+ IN ULONG IoControlCode,
+ IN PVOID Argument1 OPTIONAL,
+ IN PVOID Argument2 OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckQuerySetFileInformation(
+ IN FILE_INFORMATION_CLASS FileInformationClass,
+ IN ULONG Length,
+ IN BOOLEAN SetOperation);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckQuerySetVolumeInformation(
+ IN FS_INFORMATION_CLASS FsInformationClass,
+ IN ULONG Length,
+ IN BOOLEAN SetOperation);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCheckQuotaBufferValidity(
+ IN PFILE_QUOTA_INFORMATION QuotaBuffer,
+ IN ULONG QuotaLength,
+ OUT PULONG ErrorOffset);
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+IoCreateStreamFileObject(
+ IN PFILE_OBJECT FileObject OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+IoCreateStreamFileObjectLite(
+ IN PFILE_OBJECT FileObject OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoFastQueryNetworkAttributes(
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG OpenOptions,
+ OUT PIO_STATUS_BLOCK IoStatus,
+ OUT PFILE_NETWORK_OPEN_INFORMATION Buffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoPageRead(
+ IN PFILE_OBJECT FileObject,
+ IN PMDL Mdl,
+ IN PLARGE_INTEGER Offset,
+ IN PKEVENT Event,
+ OUT PIO_STATUS_BLOCK IoStatusBlock);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetBaseFileSystemDeviceObject(
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+PCONFIGURATION_INFORMATION
+NTAPI
+IoGetConfigurationInformation(VOID);
+
+NTKERNELAPI
+ULONG
+NTAPI
+IoGetRequestorProcessId(
+ IN PIRP Irp);
+
+NTKERNELAPI
+PEPROCESS
+NTAPI
+IoGetRequestorProcess(
+ IN PIRP Irp);
+
+NTKERNELAPI
+PIRP
+NTAPI
+IoGetTopLevelIrp(VOID);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoIsOperationSynchronous(
+ IN PIRP Irp);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoIsSystemThread(
+ IN PETHREAD Thread);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+IoIsValidNameGraftingBuffer(
+ IN PIRP Irp,
+ IN PREPARSE_DATA_BUFFER ReparseBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryFileInformation(
+ IN PFILE_OBJECT FileObject,
+ IN FILE_INFORMATION_CLASS FileInformationClass,
+ IN ULONG Length,
+ OUT PVOID FileInformation,
+ OUT PULONG ReturnedLength);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryVolumeInformation(
+ IN PFILE_OBJECT FileObject,
+ IN FS_INFORMATION_CLASS FsInformationClass,
+ IN ULONG Length,
+ OUT PVOID FsInformation,
+ OUT PULONG ReturnedLength);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoQueueThreadIrp(
+ IN PIRP Irp);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoRegisterFileSystem(
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterFsRegistrationChange(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoReleaseVpbSpinLock(
+ IN KIRQL Irql);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetDeviceToVerify(
+ IN PETHREAD Thread,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetInformation(
+ IN PFILE_OBJECT FileObject,
+ IN FILE_INFORMATION_CLASS FileInformationClass,
+ IN ULONG Length,
+ IN PVOID FileInformation);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoSetTopLevelIrp(
+ IN PIRP Irp OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSynchronousPageWrite(
+ IN PFILE_OBJECT FileObject,
+ IN PMDL Mdl,
+ IN PLARGE_INTEGER FileOffset,
+ IN PKEVENT Event,
+ OUT PIO_STATUS_BLOCK IoStatusBlock);
+
+NTKERNELAPI
+PEPROCESS
+NTAPI
+IoThreadToProcess(
+ IN PETHREAD Thread);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoUnregisterFileSystem(
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+VOID
+NTAPI
+IoUnregisterFsRegistrationChange(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVerifyVolume(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN AllowRawMount);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetRequestorSessionId(
+ IN PIRP Irp,
+ OUT PULONG pSessionId);
+$endif (_NTIFS_)
+
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
$if (_NTDDK_)
@@ -1443,123 +1712,9 @@ IoSetFileOrigin(
IN BOOLEAN Remote);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2KSP3) */
-$endif
+$endif (_NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WINXP)
-$if (_NTDDK_)
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoReadPartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN BOOLEAN ReturnRecognizedPartitions,
- OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoSetPartitionInformation(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG PartitionNumber,
- IN ULONG PartitionType);
-
-NTKERNELAPI
-NTSTATUS
-FASTCALL
-IoWritePartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG SectorSize,
- IN ULONG SectorsPerTrack,
- IN ULONG NumberOfHeads,
- IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateDisk(
- IN PDEVICE_OBJECT DeviceObject,
- IN struct _CREATE_DISK* Disk OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReadDiskSignature(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG BytesPerSector,
- OUT PDISK_SIGNATURE Signature);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoReadPartitionTableEx(
- IN PDEVICE_OBJECT DeviceObject,
- OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetPartitionInformationEx(
- IN PDEVICE_OBJECT DeviceObject,
- IN ULONG PartitionNumber,
- IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoSetSystemPartition(
- IN PUNICODE_STRING VolumeNameString);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoVerifyPartitionTable(
- IN PDEVICE_OBJECT DeviceObject,
- IN BOOLEAN FixErrors);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoVolumeDeviceToDosName(
- IN PVOID VolumeDeviceObject,
- OUT PUNICODE_STRING DosName);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoWritePartitionTableEx(
- IN PDEVICE_OBJECT DeviceObject,
- IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateFileSpecifyDeviceObjectHint(
- OUT PHANDLE FileHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- IN ULONG FileAttributes,
- IN ULONG ShareAccess,
- IN ULONG Disposition,
- IN ULONG CreateOptions,
- IN PVOID EaBuffer OPTIONAL,
- IN ULONG EaLength,
- IN CREATE_FILE_TYPE CreateFileType,
- IN PVOID InternalParameters OPTIONAL,
- IN ULONG Options,
- IN PVOID DeviceObject OPTIONAL);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoAttachDeviceToDeviceStackSafe(
- IN PDEVICE_OBJECT SourceDevice,
- IN PDEVICE_OBJECT TargetDevice,
- OUT PDEVICE_OBJECT *AttachedToDeviceObject);
-$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -1719,7 +1874,168 @@ IoWMISetSingleItem(
IN ULONG Version,
IN ULONG ValueBufferSize,
IN PVOID ValueBuffer);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoReadPartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN BOOLEAN ReturnRecognizedPartitions,
+ OUT struct _DRIVE_LAYOUT_INFORMATION **PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoSetPartitionInformation(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG PartitionNumber,
+ IN ULONG PartitionType);
+
+NTKERNELAPI
+NTSTATUS
+FASTCALL
+IoWritePartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG SectorSize,
+ IN ULONG SectorsPerTrack,
+ IN ULONG NumberOfHeads,
+ IN struct _DRIVE_LAYOUT_INFORMATION *PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateDisk(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN struct _CREATE_DISK* Disk OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReadDiskSignature(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG BytesPerSector,
+ OUT PDISK_SIGNATURE Signature);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReadPartitionTableEx(
+ IN PDEVICE_OBJECT DeviceObject,
+ OUT struct _DRIVE_LAYOUT_INFORMATION_EX **PartitionBuffer);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetPartitionInformationEx(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN ULONG PartitionNumber,
+ IN struct _SET_PARTITION_INFORMATION_EX *PartitionInfo);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoSetSystemPartition(
+ IN PUNICODE_STRING VolumeNameString);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVerifyPartitionTable(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN FixErrors);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoVolumeDeviceToDosName(
+ IN PVOID VolumeDeviceObject,
+ OUT PUNICODE_STRING DosName);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoWritePartitionTableEx(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN struct _DRIVE_LAYOUT_INFORMATION_EX *DriveLayout);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateFileSpecifyDeviceObjectHint(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG Disposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength,
+ IN CREATE_FILE_TYPE CreateFileType,
+ IN PVOID InternalParameters OPTIONAL,
+ IN ULONG Options,
+ IN PVOID DeviceObject OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoAttachDeviceToDeviceStackSafe(
+ IN PDEVICE_OBJECT SourceDevice,
+ IN PDEVICE_OBJECT TargetDevice,
+ OUT PDEVICE_OBJECT *AttachedToDeviceObject);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+PFILE_OBJECT
+NTAPI
+IoCreateStreamFileObjectEx(
+ IN PFILE_OBJECT FileObject OPTIONAL,
+ IN PDEVICE_OBJECT DeviceObject OPTIONAL,
+ OUT PHANDLE FileObjectHandle OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoQueryFileDosDeviceName(
+ IN PFILE_OBJECT FileObject,
+ OUT POBJECT_NAME_INFORMATION *ObjectNameInformation);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoEnumerateDeviceObjectList(
+ IN PDRIVER_OBJECT DriverObject,
+ OUT PDEVICE_OBJECT *DeviceObjectList,
+ IN ULONG DeviceObjectListSize,
+ OUT PULONG ActualNumberDeviceObjects);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetLowerDeviceObject(
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+PDEVICE_OBJECT
+NTAPI
+IoGetDeviceAttachmentBaseRef(
+ IN PDEVICE_OBJECT DeviceObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoGetDiskDeviceObject(
+ IN PDEVICE_OBJECT FileSystemDeviceObject,
+ OUT PDEVICE_OBJECT *DiskDeviceObject);
+$endif (_NTIFS_)
+
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
$if (_WDMDDK_)
@@ -1731,17 +2047,19 @@ IoValidateDeviceIoControlAccess(
IN PIRP Irp,
IN ULONG RequiredAccess);
#endif
-$endif
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03)
+$endif
$if (_NTDDK_)
NTKERNELAPI
IO_PAGING_PRIORITY
FASTCALL
IoGetPagingIoPriority(
IN PIRP Irp);
-$endif
+$endif (_NTDDK_)
$if (_WDMDDK_)
NTKERNELAPI
NTSTATUS
@@ -1763,11 +2081,15 @@ IoCsqInsertIrpEx(
IN PIRP Irp,
IN PIO_CSQ_IRP_CONTEXT Context OPTIONAL,
IN PVOID InsertContext OPTIONAL);
-$endif
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+$endif
+$if (_NTDDK_ || _NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+$endif
$if (_NTDDK_)
-#if (NTDDI_VERSION >= NTDDI_WS03SP1)
BOOLEAN
NTAPI
IoTranslateBusAddress(
@@ -1776,67 +2098,22 @@ IoTranslateBusAddress(
IN PHYSICAL_ADDRESS BusAddress,
IN OUT PULONG AddressSpace,
OUT PPHYSICAL_ADDRESS TranslatedAddress);
-#endif
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoEnumerateRegisteredFiltersList(
+ OUT PDRIVER_OBJECT *DriverObjectList,
+ IN ULONG DriverObjectListSize,
+ OUT PULONG ActualNumberDriverObjects);
+$endif (_NTIFS_)
+$if (_NTDDK_ || _NTIFS_)
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
$endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
-$if (_NTDDK_)
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoUpdateDiskGeometry(
- IN PDEVICE_OBJECT DeviceObject,
- IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
- IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
-
-PTXN_PARAMETER_BLOCK
-NTAPI
-IoGetTransactionParameterBlock(
- IN PFILE_OBJECT FileObject);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-IoCreateFileEx(
- OUT PHANDLE FileHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN PLARGE_INTEGER AllocationSize OPTIONAL,
- IN ULONG FileAttributes,
- IN ULONG ShareAccess,
- IN ULONG Disposition,
- IN ULONG CreateOptions,
- IN PVOID EaBuffer OPTIONAL,
- IN ULONG EaLength,
- IN CREATE_FILE_TYPE CreateFileType,
- IN PVOID InternalParameters OPTIONAL,
- IN ULONG Options,
- IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
-
-NTSTATUS
-NTAPI
-IoSetIrpExtraCreateParameter(
- IN OUT PIRP Irp,
- IN struct _ECP_LIST *ExtraCreateParameter);
-
-VOID
-NTAPI
-IoClearIrpExtraCreateParameter(
- IN OUT PIRP Irp);
-
-NTSTATUS
-NTAPI
-IoGetIrpExtraCreateParameter(
- IN PIRP Irp,
- OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
-
-BOOLEAN
-NTAPI
-IoIsFileObjectIgnoringSharing(
- IN PFILE_OBJECT FileObject);
-$endif
-
$if (_WDMDDK_)
NTKERNELAPI
NTSTATUS
@@ -1970,8 +2247,79 @@ IoGetDevicePropertyData(
PVOID Data,
PULONG RequiredSize,
PDEVPROPTYPE Type);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoUpdateDiskGeometry(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN struct _DISK_GEOMETRY_EX* OldDiskGeometry,
+ IN struct _DISK_GEOMETRY_EX* NewDiskGeometry);
+
+PTXN_PARAMETER_BLOCK
+NTAPI
+IoGetTransactionParameterBlock(
+ IN PFILE_OBJECT FileObject);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoCreateFileEx(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG Disposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer OPTIONAL,
+ IN ULONG EaLength,
+ IN CREATE_FILE_TYPE CreateFileType,
+ IN PVOID InternalParameters OPTIONAL,
+ IN ULONG Options,
+ IN PIO_DRIVER_CREATE_CONTEXT DriverContext OPTIONAL);
+
+NTSTATUS
+NTAPI
+IoSetIrpExtraCreateParameter(
+ IN OUT PIRP Irp,
+ IN struct _ECP_LIST *ExtraCreateParameter);
+
+VOID
+NTAPI
+IoClearIrpExtraCreateParameter(
+ IN OUT PIRP Irp);
+
+NTSTATUS
+NTAPI
+IoGetIrpExtraCreateParameter(
+ IN PIRP Irp,
+ OUT struct _ECP_LIST **ExtraCreateParameter OPTIONAL);
+
+BOOLEAN
+NTAPI
+IoIsFileObjectIgnoringSharing(
+ IN PFILE_OBJECT FileObject);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+VOID
+FORCEINLINE
+NTAPI
+IoInitializePriorityInfo(
+ IN PIO_PRIORITY_INFO PriorityInfo)
+{
+ PriorityInfo->Size = sizeof(IO_PRIORITY_INFO);
+ PriorityInfo->ThreadPriority = 0xffff;
+ PriorityInfo->IoPriority = IoPriorityNormal;
+ PriorityInfo->PagePriority = 0;
+}
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
$if (_WDMDDK_)
@@ -1986,15 +2334,9 @@ IoReplacePartitionUnit(
IN PDEVICE_OBJECT SparePdo,
IN ULONG Flags);
#endif
-$endif
+$endif (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WIN7)
-$if (_NTDDK_)
-NTSTATUS
-NTAPI
-IoSetFileObjectIgnoreSharing(
- IN PFILE_OBJECT FileObject);
-$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -2038,8 +2380,33 @@ NTAPI
IoGetDeviceNumaNode(
IN PDEVICE_OBJECT Pdo,
OUT PUSHORT NodeNumber);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTSTATUS
+NTAPI
+IoSetFileObjectIgnoreSharing(
+ IN PFILE_OBJECT FileObject);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoRegisterFsRegistrationChangeMountAware(
+ IN PDRIVER_OBJECT DriverObject,
+ IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine,
+ IN BOOLEAN SynchronizeWithMounts);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+IoReplaceFileObjectName(
+ IN PFILE_OBJECT FileObject,
+ IN PWSTR NewFileName,
+ IN USHORT FileNameLength);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
$if (_WDMDDK_)
@@ -2280,5 +2647,5 @@ IoInitializeThreadedDpcRequest(
DeviceObject );
}
#endif
-$endif
+$endif (_WDMDDK_)
diff --git a/include/xdk/iotypes.h b/include/xdk/iotypes.h
index aac22cb3668..e519bb9d837 100644
--- a/include/xdk/iotypes.h
+++ b/include/xdk/iotypes.h
@@ -1,22 +1,10 @@
+$if (_WDMDDK_ || _NTDDK_)
/******************************************************************************
* I/O Manager Types *
******************************************************************************/
+$endif
$if (_WDMDDK_)
-#define WDM_MAJORVERSION 0x06
-#define WDM_MINORVERSION 0x00
-
-#if defined(_WIN64)
-
-#ifndef USE_DMA_MACROS
-#define USE_DMA_MACROS
-#endif
-
-#ifndef NO_LEGACY_DRIVERS
-#define NO_LEGACY_DRIVERS
-#endif
-
-#endif /* defined(_WIN64) */
#define STATUS_CONTINUE_COMPLETION STATUS_SUCCESS
@@ -53,6 +41,8 @@ $if (_WDMDDK_)
#define IO_RESOURCE_DEFAULT 0x02
#define IO_RESOURCE_ALTERNATIVE 0x08
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _DEVIOCTL_)
#define FILE_DEVICE_BEEP 0x00000001
#define FILE_DEVICE_CD_ROM 0x00000002
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM 0x00000003
@@ -121,6 +111,8 @@ $if (_WDMDDK_)
#define FILE_DEVICE_BIOMETRIC 0x00000044
#define FILE_DEVICE_PMI 0x00000045
+$endif (_WDMDDK_ || _DEVIOCTL_)
+$if (_WDMDDK_)
#if defined(NT_PROCESSOR_GROUPS)
typedef USHORT IRQ_DEVICE_POLICY, *PIRQ_DEVICE_POLICY;
@@ -207,9 +199,9 @@ typedef struct _WAIT_CONTEXT_BLOCK {
PKDPC BufferChainingDpc;
} WAIT_CONTEXT_BLOCK, *PWAIT_CONTEXT_BLOCK;
-$endif
-/* DEVICE_OBJECT.Flags */
+$endif (_WDMDDK_)
$if (_NTDDK_)
+/* DEVICE_OBJECT.Flags */
#define DO_DEVICE_HAS_NAME 0x00000040
#define DO_SYSTEM_BOOT_PARTITION 0x00000100
#define DO_LONG_TERM_REQUESTS 0x00000200
@@ -221,8 +213,10 @@ $if (_NTDDK_)
#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
#define DO_DISALLOW_EXECUTE 0x00800000
+
$endif
$if (_WDMDDK_)
+/* DEVICE_OBJECT.Flags */
#define DO_VERIFY_VOLUME 0x00000002
#define DO_BUFFERED_IO 0x00000004
#define DO_EXCLUSIVE 0x00000008
@@ -260,9 +254,13 @@ $if (_WDMDDK_)
#define FILE_256_BYTE_ALIGNMENT 0x000000ff
#define FILE_512_BYTE_ALIGNMENT 0x000001ff
+$endif
+$if (_WDMDDK_ || _DEVIOCTL_)
/* DEVICE_OBJECT.DeviceType */
#define DEVICE_TYPE ULONG
+$endif
+$if (_WDMDDK_)
typedef struct _DEVICE_OBJECT {
CSHORT Type;
USHORT Size;
@@ -371,11 +369,11 @@ typedef struct _IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS {
typedef struct _IO_CONNECT_INTERRUPT_PARAMETERS {
IN OUT ULONG Version;
- union {
+ _ANONYMOUS_UNION union {
IO_CONNECT_INTERRUPT_FULLY_SPECIFIED_PARAMETERS FullySpecified;
IO_CONNECT_INTERRUPT_LINE_BASED_PARAMETERS LineBased;
IO_CONNECT_INTERRUPT_MESSAGE_BASED_PARAMETERS MessageBased;
- };
+ } DUMMYUNIONNAME;
} IO_CONNECT_INTERRUPT_PARAMETERS, *PIO_CONNECT_INTERRUPT_PARAMETERS;
typedef struct _IO_DISCONNECT_INTERRUPT_PARAMETERS {
@@ -498,75 +496,75 @@ typedef struct _SHARE_ACCESS {
/* While MS WDK uses inheritance in C++, we cannot do this with gcc, as
inheritance, even from a struct renders the type non-POD. So we use
this hack */
-#define PCI_COMMON_HEADER_LAYOUT \
- USHORT VendorID; \
- USHORT DeviceID; \
- USHORT Command; \
- USHORT Status; \
- UCHAR RevisionID; \
- UCHAR ProgIf; \
- UCHAR SubClass; \
- UCHAR BaseClass; \
- UCHAR CacheLineSize; \
- UCHAR LatencyTimer; \
- UCHAR HeaderType; \
- UCHAR BIST; \
- union { \
- struct _PCI_HEADER_TYPE_0 { \
+#define PCI_COMMON_HEADER_LAYOUT \
+ USHORT VendorID; \
+ USHORT DeviceID; \
+ USHORT Command; \
+ USHORT Status; \
+ UCHAR RevisionID; \
+ UCHAR ProgIf; \
+ UCHAR SubClass; \
+ UCHAR BaseClass; \
+ UCHAR CacheLineSize; \
+ UCHAR LatencyTimer; \
+ UCHAR HeaderType; \
+ UCHAR BIST; \
+ union { \
+ struct _PCI_HEADER_TYPE_0 { \
ULONG BaseAddresses[PCI_TYPE0_ADDRESSES]; \
- ULONG CIS; \
- USHORT SubVendorID; \
- USHORT SubSystemID; \
- ULONG ROMBaseAddress; \
- UCHAR CapabilitiesPtr; \
- UCHAR Reserved1[3]; \
- ULONG Reserved2; \
- UCHAR InterruptLine; \
- UCHAR InterruptPin; \
- UCHAR MinimumGrant; \
- UCHAR MaximumLatency; \
- } type0; \
- struct _PCI_HEADER_TYPE_1 { \
+ ULONG CIS; \
+ USHORT SubVendorID; \
+ USHORT SubSystemID; \
+ ULONG ROMBaseAddress; \
+ UCHAR CapabilitiesPtr; \
+ UCHAR Reserved1[3]; \
+ ULONG Reserved2; \
+ UCHAR InterruptLine; \
+ UCHAR InterruptPin; \
+ UCHAR MinimumGrant; \
+ UCHAR MaximumLatency; \
+ } type0; \
+ struct _PCI_HEADER_TYPE_1 { \
ULONG BaseAddresses[PCI_TYPE1_ADDRESSES]; \
- UCHAR PrimaryBus; \
- UCHAR SecondaryBus; \
- UCHAR SubordinateBus; \
- UCHAR SecondaryLatency; \
- UCHAR IOBase; \
- UCHAR IOLimit; \
- USHORT SecondaryStatus; \
- USHORT MemoryBase; \
- USHORT MemoryLimit; \
- USHORT PrefetchBase; \
- USHORT PrefetchLimit; \
- ULONG PrefetchBaseUpper32; \
- ULONG PrefetchLimitUpper32; \
- USHORT IOBaseUpper16; \
- USHORT IOLimitUpper16; \
- UCHAR CapabilitiesPtr; \
- UCHAR Reserved1[3]; \
- ULONG ROMBaseAddress; \
- UCHAR InterruptLine; \
- UCHAR InterruptPin; \
- USHORT BridgeControl; \
- } type1; \
- struct _PCI_HEADER_TYPE_2 { \
- ULONG SocketRegistersBaseAddress; \
- UCHAR CapabilitiesPtr; \
- UCHAR Reserved; \
- USHORT SecondaryStatus; \
- UCHAR PrimaryBus; \
- UCHAR SecondaryBus; \
- UCHAR SubordinateBus; \
- UCHAR SecondaryLatency; \
- struct { \
- ULONG Base; \
- ULONG Limit; \
- } Range[PCI_TYPE2_ADDRESSES-1]; \
- UCHAR InterruptLine; \
- UCHAR InterruptPin; \
- USHORT BridgeControl; \
- } type2; \
+ UCHAR PrimaryBus; \
+ UCHAR SecondaryBus; \
+ UCHAR SubordinateBus; \
+ UCHAR SecondaryLatency; \
+ UCHAR IOBase; \
+ UCHAR IOLimit; \
+ USHORT SecondaryStatus; \
+ USHORT MemoryBase; \
+ USHORT MemoryLimit; \
+ USHORT PrefetchBase; \
+ USHORT PrefetchLimit; \
+ ULONG PrefetchBaseUpper32; \
+ ULONG PrefetchLimitUpper32; \
+ USHORT IOBaseUpper16; \
+ USHORT IOLimitUpper16; \
+ UCHAR CapabilitiesPtr; \
+ UCHAR Reserved1[3]; \
+ ULONG ROMBaseAddress; \
+ UCHAR InterruptLine; \
+ UCHAR InterruptPin; \
+ USHORT BridgeControl; \
+ } type1; \
+ struct _PCI_HEADER_TYPE_2 { \
+ ULONG SocketRegistersBaseAddress; \
+ UCHAR CapabilitiesPtr; \
+ UCHAR Reserved; \
+ USHORT SecondaryStatus; \
+ UCHAR PrimaryBus; \
+ UCHAR SecondaryBus; \
+ UCHAR SubordinateBus; \
+ UCHAR SecondaryLatency; \
+ struct { \
+ ULONG Base; \
+ ULONG Limit; \
+ } Range[PCI_TYPE2_ADDRESSES-1]; \
+ UCHAR InterruptLine; \
+ UCHAR InterruptPin; \
+ USHORT BridgeControl; \
+ } type2; \
} u;
typedef enum _CREATE_FILE_TYPE {
@@ -672,10 +670,10 @@ typedef struct _BOOTDISK_INFORMATION_EX {
typedef struct _LOADER_PARTITION_INFORMATION_EX {
ULONG PartitionStyle;
ULONG PartitionNumber;
- union {
+ _ANONYMOUS_UNION union {
ULONG Signature;
GUID DeviceId;
- };
+ } DUMMYUNIONNAME;
ULONG Flags;
} LOADER_PARTITION_INFORMATION_EX, *PLOADER_PARTITION_INFORMATION_EX;
@@ -1768,6 +1766,8 @@ typedef struct _IO_COMPLETION_CONTEXT {
#define SL_ALLOW_RAW_MOUNT 0x01
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _DEVIOCTL_)
#define CTL_CODE(DeviceType, Function, Method, Access) \
(((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
@@ -1775,6 +1775,8 @@ typedef struct _IO_COMPLETION_CONTEXT {
#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
+$endif (_WDMDDK_ || _DEVIOCTL_)
+$if (_WDMDDK_)
#define IRP_NOCACHE 0x00000001
#define IRP_PAGING_IO 0x00000002
#define IRP_MOUNT_COMPLETION 0x00000002
@@ -2826,6 +2828,8 @@ typedef struct _IO_STACK_LOCATION {
#define SL_INVOKE_ON_SUCCESS 0x40
#define SL_INVOKE_ON_ERROR 0x80
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _DEVIOCTL_)
#define METHOD_BUFFERED 0
#define METHOD_IN_DIRECT 1
#define METHOD_OUT_DIRECT 2
@@ -2834,6 +2838,8 @@ typedef struct _IO_STACK_LOCATION {
#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
+$endif (_WDMDDK_ || _DEVIOCTL_)
+$if (_WDMDDK_)
#define FILE_SUPERSEDED 0x00000000
#define FILE_OPENED 0x00000001
#define FILE_CREATED 0x00000002
@@ -2922,11 +2928,15 @@ typedef struct _IO_STACK_LOCATION {
#define FILE_OPEN_NO_RECALL 0x00400000
#define FILE_OPEN_FOR_FREE_SPACE_QUERY 0x00800000
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _DEVIOCTL_)
#define FILE_ANY_ACCESS 0x00000000
#define FILE_SPECIAL_ACCESS FILE_ANY_ACCESS
#define FILE_READ_ACCESS 0x00000001
#define FILE_WRITE_ACCESS 0x00000002
+$endif (_WDMDDK_ || _DEVIOCTL_)
+$if (_WDMDDK_)
#define FILE_ALL_ACCESS \
(STANDARD_RIGHTS_REQUIRED | \
SYNCHRONIZE | \
@@ -3188,7 +3198,7 @@ typedef struct _PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY {
} PCI_EXPRESS_SERIAL_NUMBER_CAPABILITY, *PPCI_EXPRESS_SERIAL_NUMBER_CAPABILITY;
typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG Undefined:1;
ULONG Reserved1:3;
ULONG DataLinkProtocolError:1;
@@ -3209,7 +3219,7 @@ typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS {
} PCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_STATUS;
typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG Undefined:1;
ULONG Reserved1:3;
ULONG DataLinkProtocolError:1;
@@ -3230,7 +3240,7 @@ typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK {
} PCI_EXPRESS_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_MASK;
typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG Undefined:1;
ULONG Reserved1:3;
ULONG DataLinkProtocolError:1;
@@ -3251,7 +3261,7 @@ typedef union _PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY {
} PCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_UNCORRECTABLE_ERROR_SEVERITY;
typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG ReceiverError:1;
ULONG Reserved1:5;
ULONG BadTLP:1;
@@ -3266,7 +3276,7 @@ typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_STATUS {
} PCI_EXPRESS_CORRECTABLE_ERROR_STATUS, *PPCI_CORRECTABLE_ERROR_STATUS;
typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG ReceiverError:1;
ULONG Reserved1:5;
ULONG BadTLP:1;
@@ -3281,7 +3291,7 @@ typedef union _PCI_EXPRESS_CORRECTABLE_ERROR_MASK {
} PCI_EXPRESS_CORRECTABLE_ERROR_MASK, *PPCI_CORRECTABLE_ERROR_MASK;
typedef union _PCI_EXPRESS_AER_CAPABILITIES {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG FirstErrorPointer:5;
ULONG ECRCGenerationCapable:1;
ULONG ECRCGenerationEnable:1;
@@ -3293,7 +3303,7 @@ typedef union _PCI_EXPRESS_AER_CAPABILITIES {
} PCI_EXPRESS_AER_CAPABILITIES, *PPCI_EXPRESS_AER_CAPABILITIES;
typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG CorrectableErrorReportingEnable:1;
ULONG NonFatalErrorReportingEnable:1;
ULONG FatalErrorReportingEnable:1;
@@ -3303,7 +3313,7 @@ typedef union _PCI_EXPRESS_ROOT_ERROR_COMMAND {
} PCI_EXPRESS_ROOT_ERROR_COMMAND, *PPCI_EXPRESS_ROOT_ERROR_COMMAND;
typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG CorrectableErrorReceived:1;
ULONG MultipleCorrectableErrorsReceived:1;
ULONG UncorrectableErrorReceived:1;
@@ -3318,7 +3328,7 @@ typedef union _PCI_EXPRESS_ROOT_ERROR_STATUS {
} PCI_EXPRESS_ROOT_ERROR_STATUS, *PPCI_EXPRESS_ROOT_ERROR_STATUS;
typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CorrectableSourceIdFun:3;
USHORT CorrectableSourceIdDev:5;
USHORT CorrectableSourceIdBus:8;
@@ -3330,7 +3340,7 @@ typedef union _PCI_EXPRESS_ERROR_SOURCE_ID {
} PCI_EXPRESS_ERROR_SOURCE_ID, *PPCI_EXPRESS_ERROR_SOURCE_ID;
typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG TargetAbortOnSplitCompletion:1;
ULONG MasterAbortOnSplitCompletion:1;
ULONG ReceivedTargetAbort:1;
@@ -3351,7 +3361,7 @@ typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS {
} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_STATUS;
typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG TargetAbortOnSplitCompletion:1;
ULONG MasterAbortOnSplitCompletion:1;
ULONG ReceivedTargetAbort:1;
@@ -3372,7 +3382,7 @@ typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK {
} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_MASK;
typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG TargetAbortOnSplitCompletion:1;
ULONG MasterAbortOnSplitCompletion:1;
ULONG ReceivedTargetAbort:1;
@@ -3393,7 +3403,7 @@ typedef union _PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY {
} PCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY, *PPCI_EXPRESS_SEC_UNCORRECTABLE_ERROR_SEVERITY;
typedef union _PCI_EXPRESS_SEC_AER_CAPABILITIES {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG SecondaryUncorrectableFirstErrorPtr:5;
ULONG Reserved:27;
} DUMMYSTRUCTNAME;
@@ -3456,7 +3466,7 @@ typedef struct _PCI_EXPRESS_BRIDGE_AER_CAPABILITY {
} PCI_EXPRESS_BRIDGE_AER_CAPABILITY, *PPCI_EXPRESS_BRIDGE_AER_CAPABILITY;
typedef union _PCI_EXPRESS_SRIOV_CAPS {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG VFMigrationCapable:1;
ULONG Reserved1:20;
ULONG VFMigrationInterruptNumber:11;
@@ -3465,7 +3475,7 @@ typedef union _PCI_EXPRESS_SRIOV_CAPS {
} PCI_EXPRESS_SRIOV_CAPS, *PPCI_EXPRESS_SRIOV_CAPS;
typedef union _PCI_EXPRESS_SRIOV_CONTROL {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT VFEnable:1;
USHORT VFMigrationEnable:1;
USHORT VFMigrationInterruptEnable:1;
@@ -3477,7 +3487,7 @@ typedef union _PCI_EXPRESS_SRIOV_CONTROL {
} PCI_EXPRESS_SRIOV_CONTROL, *PPCI_EXPRESS_SRIOV_CONTROL;
typedef union _PCI_EXPRESS_SRIOV_STATUS {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT VFMigrationStatus:1;
USHORT Reserved1:15;
} DUMMYSTRUCTNAME;
@@ -3485,7 +3495,7 @@ typedef union _PCI_EXPRESS_SRIOV_STATUS {
} PCI_EXPRESS_SRIOV_STATUS, *PPCI_EXPRESS_SRIOV_STATUS;
typedef union _PCI_EXPRESS_SRIOV_MIGRATION_STATE_ARRAY {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG VFMigrationStateBIR:3;
ULONG VFMigrationStateOffset:29;
} DUMMYSTRUCTNAME;
@@ -3747,9 +3757,9 @@ typedef struct _PCI_MSIX_TABLE_CONFIG_INTERFACE {
#define PCI_MSIX_TABLE_CONFIG_MINIMUM_SIZE \
RTL_SIZEOF_THROUGH_FIELD(PCI_MSIX_TABLE_CONFIG_INTERFACE, UnmaskTableEntry)
-$endif
-$if (_NTDDK_)
+$endif (_WDMDDK_)
+$if (_NTDDK_)
#ifndef _ARC_DDK_
#define _ARC_DDK_
typedef enum _CONFIGURATION_TYPE {
@@ -3835,8 +3845,7 @@ typedef enum _CONFIGURATION_TYPE {
#define IO_ATTACH_DEVICE 0x0400
#define IO_IGNORE_SHARE_ACCESS_CHECK 0x0800
-typedef
-NTSTATUS
+typedef NTSTATUS
(NTAPI *PIO_QUERY_DEVICE_ROUTINE)(
IN PVOID Context,
IN PUNICODE_STRING PathName,
@@ -4203,7 +4212,7 @@ typedef struct PCI_AGP_EXTENDED_CAPABILITY {
typedef struct _PCIX_BRIDGE_CAPABILITY {
PCI_CAPABILITIES_HEADER Header;
union {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT Bus64Bit:1;
USHORT Bus133MHzCapable:1;
USHORT SplitCompletionDiscarded:1;
@@ -4219,7 +4228,7 @@ typedef struct _PCIX_BRIDGE_CAPABILITY {
USHORT AsUSHORT;
} SecondaryStatus;
union {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG FunctionNumber:3;
ULONG DeviceNumber:5;
ULONG BusNumber:8;
@@ -4241,7 +4250,7 @@ typedef struct _PCIX_BRIDGE_CAPABILITY {
USHORT DownstreamSplitTransactionCapacity;
USHORT DownstreamSplitTransactionLimit;
union {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG SelectSecondaryRegisters:1;
ULONG ErrorPresentInOtherBank:1;
ULONG AdditionalCorrectableError:1;
@@ -4280,7 +4289,7 @@ typedef struct _PCI_SUBSYSTEM_IDS_CAPABILITY {
typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
union {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG ExtendedConfigOpRegions:1;
ULONG ActiveStatePowerManagement:1;
ULONG ClockPowerManagement:1;
@@ -4295,7 +4304,7 @@ typedef struct _PCI_ROOT_BUS_OSC_SUPPORT_FIELD {
typedef struct _PCI_ROOT_BUS_OSC_CONTROL_FIELD {
union {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG ExpressNativeHotPlug:1;
ULONG ShpcNativeHotPlug:1;
ULONG ExpressNativePME:1;
@@ -4321,7 +4330,7 @@ typedef enum {
typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
PCI_HARDWARE_INTERFACE SecondaryInterface;
- struct {
+ _ANONYMOUS_STRUCT struct {
BOOLEAN BusCapabilitiesFound;
ULONG CurrentSpeedAndMode;
ULONG SupportedSpeedsAndModes;
@@ -4334,7 +4343,7 @@ typedef struct _PCI_ROOT_BUS_HARDWARE_CAPABILITY {
} PCI_ROOT_BUS_HARDWARE_CAPABILITY, *PPCI_ROOT_BUS_HARDWARE_CAPABILITY;
typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CapabilityVersion:4;
USHORT DeviceType:4;
USHORT SlotImplemented:1;
@@ -4345,7 +4354,7 @@ typedef union _PCI_EXPRESS_CAPABILITIES_REGISTER {
} PCI_EXPRESS_CAPABILITIES_REGISTER, *PPCI_EXPRESS_CAPABILITIES_REGISTER;
typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG MaxPayloadSizeSupported:3;
ULONG PhantomFunctionsSupported:2;
ULONG ExtendedTagSupported:1;
@@ -4364,7 +4373,7 @@ typedef union _PCI_EXPRESS_DEVICE_CAPABILITIES_REGISTER {
#define PCI_EXPRESS_AER_DEVICE_CONTROL_MASK 0x07;
typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CorrectableErrorEnable:1;
USHORT NonFatalErrorEnable:1;
USHORT FatalErrorEnable:1;
@@ -4384,7 +4393,7 @@ typedef union _PCI_EXPRESS_DEVICE_CONTROL_REGISTER {
#define PCI_EXPRESS_AER_DEVICE_STATUS_MASK 0x0F;
typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CorrectableErrorDetected:1;
USHORT NonFatalErrorDetected:1;
USHORT FatalErrorDetected:1;
@@ -4397,7 +4406,7 @@ typedef union _PCI_EXPRESS_DEVICE_STATUS_REGISTER {
} PCI_EXPRESS_DEVICE_STATUS_REGISTER, *PPCI_EXPRESS_DEVICE_STATUS_REGISTER;
typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG MaximumLinkSpeed:4;
ULONG MaximumLinkWidth:6;
ULONG ActiveStatePMSupport:2;
@@ -4413,7 +4422,7 @@ typedef union _PCI_EXPRESS_LINK_CAPABILITIES_REGISTER {
} PCI_EXPRESS_LINK_CAPABILITIES_REGISTER, *PPCI_EXPRESS_LINK_CAPABILITIES_REGISTER;
typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT ActiveStatePMControl:2;
USHORT Rsvd1:1;
USHORT ReadCompletionBoundary:1;
@@ -4428,7 +4437,7 @@ typedef union _PCI_EXPRESS_LINK_CONTROL_REGISTER {
} PCI_EXPRESS_LINK_CONTROL_REGISTER, *PPCI_EXPRESS_LINK_CONTROL_REGISTER;
typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT LinkSpeed:4;
USHORT LinkWidth:6;
USHORT Undefined:1;
@@ -4441,7 +4450,7 @@ typedef union _PCI_EXPRESS_LINK_STATUS_REGISTER {
} PCI_EXPRESS_LINK_STATUS_REGISTER, *PPCI_EXPRESS_LINK_STATUS_REGISTER;
typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG AttentionButtonPresent:1;
ULONG PowerControllerPresent:1;
ULONG MRLSensorPresent:1;
@@ -4459,7 +4468,7 @@ typedef union _PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER {
} PCI_EXPRESS_SLOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_SLOT_CAPABILITIES_REGISTER;
typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT AttentionButtonEnable:1;
USHORT PowerFaultDetectEnable:1;
USHORT MRLSensorEnable:1;
@@ -4477,7 +4486,7 @@ typedef union _PCI_EXPRESS_SLOT_CONTROL_REGISTER {
} PCI_EXPRESS_SLOT_CONTROL_REGISTER, *PPCI_EXPRESS_SLOT_CONTROL_REGISTER;
typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT AttentionButtonPressed:1;
USHORT PowerFaultDetected:1;
USHORT MRLSensorChanged:1;
@@ -4493,7 +4502,7 @@ typedef union _PCI_EXPRESS_SLOT_STATUS_REGISTER {
} PCI_EXPRESS_SLOT_STATUS_REGISTER, *PPCI_EXPRESS_SLOT_STATUS_REGISTER;
typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CorrectableSerrEnable:1;
USHORT NonFatalSerrEnable:1;
USHORT FatalSerrEnable:1;
@@ -4505,7 +4514,7 @@ typedef union _PCI_EXPRESS_ROOT_CONTROL_REGISTER {
} PCI_EXPRESS_ROOT_CONTROL_REGISTER, *PPCI_EXPRESS_ROOT_CONTROL_REGISTER;
typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT CRSSoftwareVisibility:1;
USHORT Rsvd:15;
} DUMMYSTRUCTNAME;
@@ -4513,7 +4522,7 @@ typedef union _PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER {
} PCI_EXPRESS_ROOT_CAPABILITIES_REGISTER, *PPCI_EXPRESS_ROOT_CAPABILITIES_REGISTER;
typedef union _PCI_EXPRESS_ROOT_STATUS_REGISTER {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG PMERequestorId:16;
ULONG PMEStatus:1;
ULONG PMEPending:1;
@@ -4616,7 +4625,7 @@ typedef enum {
} PCI_EXPRESS_MAX_PAYLOAD_SIZE;
typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
- struct {
+ _ANONYMOUS_STRUCT struct {
USHORT FunctionNumber:3;
USHORT DeviceNumber:5;
USHORT BusNumber:8;
@@ -4624,18 +4633,6 @@ typedef union _PCI_EXPRESS_PME_REQUESTOR_ID {
USHORT AsUSHORT;
} PCI_EXPRESS_PME_REQUESTOR_ID, *PPCI_EXPRESS_PME_REQUESTOR_ID;
-#if defined(_WIN64)
-
-#ifndef USE_DMA_MACROS
-#define USE_DMA_MACROS
-#endif
-
-#ifndef NO_LEGACY_DRIVERS
-#define NO_LEGACY_DRIVERS
-#endif
-
-#endif /* defined(_WIN64) */
-
typedef enum _PHYSICAL_COUNTER_RESOURCE_DESCRIPTOR_TYPE {
ResourceTypeSingle = 0,
ResourceTypeRange,
@@ -4755,8 +4752,8 @@ typedef struct _PCI_BUS_INTERFACE_STANDARD {
#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX 0x00004000
#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX 0x00008000
#define FILE_CHARACTERISTICS_REMOVAL_POLICY_MASK_EX \
- (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
- FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
+ (FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_EX | \
+ FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_EX)
#define FILE_CHARACTERISTICS_EXPECT_ORDERLY_REMOVAL_DEPRECATED 0x00000200
#define FILE_CHARACTERISTICS_EXPECT_SURPRISE_REMOVAL_DEPRECATED 0x00000300
@@ -4774,11 +4771,11 @@ typedef struct _PCI_BUS_INTERFACE_STANDARD {
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-#define FILE_CHARACTERISTICS_PROPAGATED ( FILE_REMOVABLE_MEDIA | \
- FILE_READ_ONLY_DEVICE | \
- FILE_FLOPPY_DISKETTE | \
- FILE_WRITE_ONCE_MEDIA | \
- FILE_DEVICE_SECURE_OPEN )
+#define FILE_CHARACTERISTICS_PROPAGATED (FILE_REMOVABLE_MEDIA | \
+ FILE_READ_ONLY_DEVICE | \
+ FILE_FLOPPY_DISKETTE | \
+ FILE_WRITE_ONCE_MEDIA | \
+ FILE_DEVICE_SECURE_OPEN)
typedef struct _FILE_ALIGNMENT_INFORMATION {
ULONG AlignmentRequirement;
@@ -4865,5 +4862,2013 @@ typedef enum _BUS_DATA_TYPE {
SgiInternalConfiguration,
MaximumBusDataType
} BUS_DATA_TYPE, *PBUS_DATA_TYPE;
-$endif
+/* Some Server 2003 DDK definitions */
+#define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
+
+typedef NTSTATUS
+(NTAPI *PLEGACY_DEVICE_DETECTION_HANDLER)(
+ IN PVOID Context,
+ IN INTERFACE_TYPE LegacyBusType,
+ IN ULONG BusNumber,
+ IN ULONG SlotNumber,
+ OUT PDEVICE_OBJECT *PhysicalDeviceObject);
+
+typedef struct _ROUTING_TOKEN {
+ PVOID LinkNode;
+ ULONG StaticVector;
+ UCHAR Flags;
+} ROUTING_TOKEN, *PROUTING_TOKEN;
+
+typedef NTSTATUS
+(NTAPI *PGET_INTERRUPT_ROUTING)(
+ IN PDEVICE_OBJECT Pdo,
+ OUT ULONG *Bus,
+ OUT ULONG *PciSlot,
+ OUT UCHAR *InterruptLine,
+ OUT UCHAR *InterruptPin,
+ OUT UCHAR *ClassCode,
+ OUT UCHAR *SubClassCode,
+ OUT PDEVICE_OBJECT *ParentPdo,
+ OUT ROUTING_TOKEN *RoutingToken,
+ OUT UCHAR *Flags);
+
+typedef NTSTATUS
+(NTAPI *PSET_INTERRUPT_ROUTING_TOKEN)(
+ IN PDEVICE_OBJECT Pdo,
+ IN PROUTING_TOKEN RoutingToken);
+
+typedef VOID
+(NTAPI *PUPDATE_INTERRUPT_LINE)(
+ IN PDEVICE_OBJECT Pdo,
+ IN UCHAR LineRegister);
+
+typedef struct _INT_ROUTE_INTERFACE_STANDARD {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PGET_INTERRUPT_ROUTING GetInterruptRouting;
+ PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
+ PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
+} INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
+
+typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
+} LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
+
+/* FIXME : These definitions don't exist in public headers */
+
+#define PCI_CB_INTRF_VERSION 1
+#define PCI_PME_INTRF_STANDARD_VER 1
+#define PNP_LOCATION_INTERFACE_VERSION 1
+
+DEFINE_GUID(GUID_PCI_CARDBUS_INTERFACE_PRIVATE, 0xcca82f31, 0x54d6, 0x11d1, 0x82, 0x24, 0x00, 0xa0, 0xc9, 0x32, 0x43, 0x85);
+DEFINE_GUID(GUID_PCI_PME_INTERFACE, 0xaac7e6ac, 0xbb0b, 0x11d2, 0xb4, 0x84, 0x00, 0xc0, 0x4f, 0x72, 0xde, 0x8b);
+
+typedef NTSTATUS
+(NTAPI *PCARDBUSADD)(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN OUT PVOID *DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCARDBUSDELETE)(
+ IN PVOID DeviceContext);
+
+typedef NTSTATUS
+(NTAPI *PCARDBUSPCIDISPATCH)(
+ IN PVOID DeviceContext,
+ IN PIRP Irp);
+
+typedef VOID
+(NTAPI *PPME_SET_PME_ENABLE)(
+ IN PDEVICE_OBJECT Pdo,
+ IN BOOLEAN PmeEnable);
+
+typedef VOID
+(NTAPI *PPME_CLEAR_PME_STATUS)(
+ IN PDEVICE_OBJECT Pdo);
+
+typedef VOID
+(NTAPI *PPME_GET_INFORMATION)(
+ IN PDEVICE_OBJECT Pdo,
+ OUT PBOOLEAN PmeCapable,
+ OUT PBOOLEAN PmeStatus,
+ OUT PBOOLEAN PmeEnable);
+
+typedef struct _PCI_CARDBUS_INTERFACE_PRIVATE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PDRIVER_OBJECT DriverObject;
+ PCARDBUSADD AddCardBus;
+ PCARDBUSDELETE DeleteCardBus;
+ PCARDBUSPCIDISPATCH DispatchPnp;
+} PCI_CARDBUS_INTERFACE_PRIVATE, *PPCI_CARDBUS_INTERFACE_PRIVATE;
+
+typedef struct _PCI_PME_INTERFACE {
+ USHORT Size;
+ USHORT Version;
+ PVOID Context;
+ PINTERFACE_REFERENCE InterfaceReference;
+ PINTERFACE_DEREFERENCE InterfaceDereference;
+ PPME_GET_INFORMATION GetPmeInformation;
+ PPME_CLEAR_PME_STATUS ClearPmeStatus;
+ PPME_SET_PME_ENABLE UpdateEnable;
+} PCI_PME_INTERFACE, *PPCI_PME_INTERFACE;
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+#define FILE_OPLOCK_BROKEN_TO_LEVEL_2 0x00000007
+#define FILE_OPLOCK_BROKEN_TO_NONE 0x00000008
+#define FILE_OPBATCH_BREAK_UNDERWAY 0x00000009
+
+/* also in winnt.h */
+#define FILE_NOTIFY_CHANGE_FILE_NAME 0x00000001
+#define FILE_NOTIFY_CHANGE_DIR_NAME 0x00000002
+#define FILE_NOTIFY_CHANGE_NAME 0x00000003
+#define FILE_NOTIFY_CHANGE_ATTRIBUTES 0x00000004
+#define FILE_NOTIFY_CHANGE_SIZE 0x00000008
+#define FILE_NOTIFY_CHANGE_LAST_WRITE 0x00000010
+#define FILE_NOTIFY_CHANGE_LAST_ACCESS 0x00000020
+#define FILE_NOTIFY_CHANGE_CREATION 0x00000040
+#define FILE_NOTIFY_CHANGE_EA 0x00000080
+#define FILE_NOTIFY_CHANGE_SECURITY 0x00000100
+#define FILE_NOTIFY_CHANGE_STREAM_NAME 0x00000200
+#define FILE_NOTIFY_CHANGE_STREAM_SIZE 0x00000400
+#define FILE_NOTIFY_CHANGE_STREAM_WRITE 0x00000800
+#define FILE_NOTIFY_VALID_MASK 0x00000fff
+
+#define FILE_ACTION_ADDED 0x00000001
+#define FILE_ACTION_REMOVED 0x00000002
+#define FILE_ACTION_MODIFIED 0x00000003
+#define FILE_ACTION_RENAMED_OLD_NAME 0x00000004
+#define FILE_ACTION_RENAMED_NEW_NAME 0x00000005
+#define FILE_ACTION_ADDED_STREAM 0x00000006
+#define FILE_ACTION_REMOVED_STREAM 0x00000007
+#define FILE_ACTION_MODIFIED_STREAM 0x00000008
+#define FILE_ACTION_REMOVED_BY_DELETE 0x00000009
+#define FILE_ACTION_ID_NOT_TUNNELLED 0x0000000A
+#define FILE_ACTION_TUNNELLED_ID_COLLISION 0x0000000B
+/* end winnt.h */
+
+#define FILE_PIPE_BYTE_STREAM_TYPE 0x00000000
+#define FILE_PIPE_MESSAGE_TYPE 0x00000001
+
+#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
+#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
+
+#define FILE_PIPE_ACCEPT_REMOTE_CLIENTS 0x00000000
+#define FILE_PIPE_REJECT_REMOTE_CLIENTS 0x00000002
+#define FILE_PIPE_TYPE_VALID_MASK 0x00000003
+
+#define FILE_PIPE_BYTE_STREAM_MODE 0x00000000
+#define FILE_PIPE_MESSAGE_MODE 0x00000001
+
+#define FILE_PIPE_QUEUE_OPERATION 0x00000000
+#define FILE_PIPE_COMPLETE_OPERATION 0x00000001
+
+#define FILE_PIPE_INBOUND 0x00000000
+#define FILE_PIPE_OUTBOUND 0x00000001
+#define FILE_PIPE_FULL_DUPLEX 0x00000002
+
+#define FILE_PIPE_DISCONNECTED_STATE 0x00000001
+#define FILE_PIPE_LISTENING_STATE 0x00000002
+#define FILE_PIPE_CONNECTED_STATE 0x00000003
+#define FILE_PIPE_CLOSING_STATE 0x00000004
+
+#define FILE_PIPE_CLIENT_END 0x00000000
+#define FILE_PIPE_SERVER_END 0x00000001
+
+#define FILE_CASE_SENSITIVE_SEARCH 0x00000001
+#define FILE_CASE_PRESERVED_NAMES 0x00000002
+#define FILE_UNICODE_ON_DISK 0x00000004
+#define FILE_PERSISTENT_ACLS 0x00000008
+#define FILE_FILE_COMPRESSION 0x00000010
+#define FILE_VOLUME_QUOTAS 0x00000020
+#define FILE_SUPPORTS_SPARSE_FILES 0x00000040
+#define FILE_SUPPORTS_REPARSE_POINTS 0x00000080
+#define FILE_SUPPORTS_REMOTE_STORAGE 0x00000100
+#define FILE_VOLUME_IS_COMPRESSED 0x00008000
+#define FILE_SUPPORTS_OBJECT_IDS 0x00010000
+#define FILE_SUPPORTS_ENCRYPTION 0x00020000
+#define FILE_NAMED_STREAMS 0x00040000
+#define FILE_READ_ONLY_VOLUME 0x00080000
+#define FILE_SEQUENTIAL_WRITE_ONCE 0x00100000
+#define FILE_SUPPORTS_TRANSACTIONS 0x00200000
+#define FILE_SUPPORTS_HARD_LINKS 0x00400000
+#define FILE_SUPPORTS_EXTENDED_ATTRIBUTES 0x00800000
+#define FILE_SUPPORTS_OPEN_BY_FILE_ID 0x01000000
+#define FILE_SUPPORTS_USN_JOURNAL 0x02000000
+
+#define FILE_NEED_EA 0x00000080
+
+#define FILE_EA_TYPE_BINARY 0xfffe
+#define FILE_EA_TYPE_ASCII 0xfffd
+#define FILE_EA_TYPE_BITMAP 0xfffb
+#define FILE_EA_TYPE_METAFILE 0xfffa
+#define FILE_EA_TYPE_ICON 0xfff9
+#define FILE_EA_TYPE_EA 0xffee
+#define FILE_EA_TYPE_MVMT 0xffdf
+#define FILE_EA_TYPE_MVST 0xffde
+#define FILE_EA_TYPE_ASN1 0xffdd
+#define FILE_EA_TYPE_FAMILY_IDS 0xff01
+
+typedef struct _FILE_NOTIFY_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG Action;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_NOTIFY_INFORMATION, *PFILE_NOTIFY_INFORMATION;
+
+typedef struct _FILE_DIRECTORY_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;
+
+typedef struct _FILE_FULL_DIR_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ ULONG EaSize;
+ WCHAR FileName[1];
+} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;
+
+typedef struct _FILE_ID_FULL_DIR_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ ULONG EaSize;
+ LARGE_INTEGER FileId;
+ WCHAR FileName[1];
+} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;
+
+typedef struct _FILE_BOTH_DIR_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ ULONG EaSize;
+ CCHAR ShortNameLength;
+ WCHAR ShortName[12];
+ WCHAR FileName[1];
+} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;
+
+typedef struct _FILE_ID_BOTH_DIR_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ ULONG EaSize;
+ CCHAR ShortNameLength;
+ WCHAR ShortName[12];
+ LARGE_INTEGER FileId;
+ WCHAR FileName[1];
+} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;
+
+typedef struct _FILE_NAMES_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;
+
+typedef struct _FILE_ID_GLOBAL_TX_DIR_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ LARGE_INTEGER FileId;
+ GUID LockingTransactionId;
+ ULONG TxInfoFlags;
+ WCHAR FileName[1];
+} FILE_ID_GLOBAL_TX_DIR_INFORMATION, *PFILE_ID_GLOBAL_TX_DIR_INFORMATION;
+
+#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_WRITELOCKED 0x00000001
+#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_TO_TX 0x00000002
+#define FILE_ID_GLOBAL_TX_DIR_INFO_FLAG_VISIBLE_OUTSIDE_TX 0x00000004
+
+typedef struct _FILE_OBJECTID_INFORMATION {
+ LONGLONG FileReference;
+ UCHAR ObjectId[16];
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ UCHAR BirthVolumeId[16];
+ UCHAR BirthObjectId[16];
+ UCHAR DomainId[16];
+ } DUMMYSTRUCTNAME;
+ UCHAR ExtendedInfo[48];
+ } DUMMYUNIONNAME;
+} FILE_OBJECTID_INFORMATION, *PFILE_OBJECTID_INFORMATION;
+
+#define ANSI_DOS_STAR ('<')
+#define ANSI_DOS_QM ('>')
+#define ANSI_DOS_DOT ('"')
+
+#define DOS_STAR (L'<')
+#define DOS_QM (L'>')
+#define DOS_DOT (L'"')
+
+typedef struct _FILE_INTERNAL_INFORMATION {
+ LARGE_INTEGER IndexNumber;
+} FILE_INTERNAL_INFORMATION, *PFILE_INTERNAL_INFORMATION;
+
+typedef struct _FILE_EA_INFORMATION {
+ ULONG EaSize;
+} FILE_EA_INFORMATION, *PFILE_EA_INFORMATION;
+
+typedef struct _FILE_ACCESS_INFORMATION {
+ ACCESS_MASK AccessFlags;
+} FILE_ACCESS_INFORMATION, *PFILE_ACCESS_INFORMATION;
+
+typedef struct _FILE_MODE_INFORMATION {
+ ULONG Mode;
+} FILE_MODE_INFORMATION, *PFILE_MODE_INFORMATION;
+
+typedef struct _FILE_ALL_INFORMATION {
+ FILE_BASIC_INFORMATION BasicInformation;
+ FILE_STANDARD_INFORMATION StandardInformation;
+ FILE_INTERNAL_INFORMATION InternalInformation;
+ FILE_EA_INFORMATION EaInformation;
+ FILE_ACCESS_INFORMATION AccessInformation;
+ FILE_POSITION_INFORMATION PositionInformation;
+ FILE_MODE_INFORMATION ModeInformation;
+ FILE_ALIGNMENT_INFORMATION AlignmentInformation;
+ FILE_NAME_INFORMATION NameInformation;
+} FILE_ALL_INFORMATION, *PFILE_ALL_INFORMATION;
+
+typedef struct _FILE_ALLOCATION_INFORMATION {
+ LARGE_INTEGER AllocationSize;
+} FILE_ALLOCATION_INFORMATION, *PFILE_ALLOCATION_INFORMATION;
+
+typedef struct _FILE_COMPRESSION_INFORMATION {
+ LARGE_INTEGER CompressedFileSize;
+ USHORT CompressionFormat;
+ UCHAR CompressionUnitShift;
+ UCHAR ChunkShift;
+ UCHAR ClusterShift;
+ UCHAR Reserved[3];
+} FILE_COMPRESSION_INFORMATION, *PFILE_COMPRESSION_INFORMATION;
+
+typedef struct _FILE_LINK_INFORMATION {
+ BOOLEAN ReplaceIfExists;
+ HANDLE RootDirectory;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_LINK_INFORMATION, *PFILE_LINK_INFORMATION;
+
+typedef struct _FILE_MOVE_CLUSTER_INFORMATION {
+ ULONG ClusterCount;
+ HANDLE RootDirectory;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_MOVE_CLUSTER_INFORMATION, *PFILE_MOVE_CLUSTER_INFORMATION;
+
+typedef struct _FILE_RENAME_INFORMATION {
+ BOOLEAN ReplaceIfExists;
+ HANDLE RootDirectory;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_RENAME_INFORMATION, *PFILE_RENAME_INFORMATION;
+
+typedef struct _FILE_STREAM_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG StreamNameLength;
+ LARGE_INTEGER StreamSize;
+ LARGE_INTEGER StreamAllocationSize;
+ WCHAR StreamName[1];
+} FILE_STREAM_INFORMATION, *PFILE_STREAM_INFORMATION;
+
+typedef struct _FILE_TRACKING_INFORMATION {
+ HANDLE DestinationFile;
+ ULONG ObjectInformationLength;
+ CHAR ObjectInformation[1];
+} FILE_TRACKING_INFORMATION, *PFILE_TRACKING_INFORMATION;
+
+typedef struct _FILE_COMPLETION_INFORMATION {
+ HANDLE Port;
+ PVOID Key;
+} FILE_COMPLETION_INFORMATION, *PFILE_COMPLETION_INFORMATION;
+
+typedef struct _FILE_PIPE_INFORMATION {
+ ULONG ReadMode;
+ ULONG CompletionMode;
+} FILE_PIPE_INFORMATION, *PFILE_PIPE_INFORMATION;
+
+typedef struct _FILE_PIPE_LOCAL_INFORMATION {
+ ULONG NamedPipeType;
+ ULONG NamedPipeConfiguration;
+ ULONG MaximumInstances;
+ ULONG CurrentInstances;
+ ULONG InboundQuota;
+ ULONG ReadDataAvailable;
+ ULONG OutboundQuota;
+ ULONG WriteQuotaAvailable;
+ ULONG NamedPipeState;
+ ULONG NamedPipeEnd;
+} FILE_PIPE_LOCAL_INFORMATION, *PFILE_PIPE_LOCAL_INFORMATION;
+
+typedef struct _FILE_PIPE_REMOTE_INFORMATION {
+ LARGE_INTEGER CollectDataTime;
+ ULONG MaximumCollectionCount;
+} FILE_PIPE_REMOTE_INFORMATION, *PFILE_PIPE_REMOTE_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_QUERY_INFORMATION {
+ ULONG MaximumMessageSize;
+ ULONG MailslotQuota;
+ ULONG NextMessageSize;
+ ULONG MessagesAvailable;
+ LARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_QUERY_INFORMATION, *PFILE_MAILSLOT_QUERY_INFORMATION;
+
+typedef struct _FILE_MAILSLOT_SET_INFORMATION {
+ PLARGE_INTEGER ReadTimeout;
+} FILE_MAILSLOT_SET_INFORMATION, *PFILE_MAILSLOT_SET_INFORMATION;
+
+typedef struct _FILE_REPARSE_POINT_INFORMATION {
+ LONGLONG FileReference;
+ ULONG Tag;
+} FILE_REPARSE_POINT_INFORMATION, *PFILE_REPARSE_POINT_INFORMATION;
+
+typedef struct _FILE_LINK_ENTRY_INFORMATION {
+ ULONG NextEntryOffset;
+ LONGLONG ParentFileId;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_LINK_ENTRY_INFORMATION, *PFILE_LINK_ENTRY_INFORMATION;
+
+typedef struct _FILE_LINKS_INFORMATION {
+ ULONG BytesNeeded;
+ ULONG EntriesReturned;
+ FILE_LINK_ENTRY_INFORMATION Entry;
+} FILE_LINKS_INFORMATION, *PFILE_LINKS_INFORMATION;
+
+typedef struct _FILE_NETWORK_PHYSICAL_NAME_INFORMATION {
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_NETWORK_PHYSICAL_NAME_INFORMATION, *PFILE_NETWORK_PHYSICAL_NAME_INFORMATION;
+
+typedef struct _FILE_STANDARD_LINK_INFORMATION {
+ ULONG NumberOfAccessibleLinks;
+ ULONG TotalNumberOfLinks;
+ BOOLEAN DeletePending;
+ BOOLEAN Directory;
+} FILE_STANDARD_LINK_INFORMATION, *PFILE_STANDARD_LINK_INFORMATION;
+
+typedef struct _FILE_GET_EA_INFORMATION {
+ ULONG NextEntryOffset;
+ UCHAR EaNameLength;
+ CHAR EaName[1];
+} FILE_GET_EA_INFORMATION, *PFILE_GET_EA_INFORMATION;
+
+#define REMOTE_PROTOCOL_FLAG_LOOPBACK 0x00000001
+#define REMOTE_PROTOCOL_FLAG_OFFLINE 0x00000002
+
+typedef struct _FILE_REMOTE_PROTOCOL_INFORMATION {
+ USHORT StructureVersion;
+ USHORT StructureSize;
+ ULONG Protocol;
+ USHORT ProtocolMajorVersion;
+ USHORT ProtocolMinorVersion;
+ USHORT ProtocolRevision;
+ USHORT Reserved;
+ ULONG Flags;
+ struct {
+ ULONG Reserved[8];
+ } GenericReserved;
+ struct {
+ ULONG Reserved[16];
+ } ProtocolSpecificReserved;
+} FILE_REMOTE_PROTOCOL_INFORMATION, *PFILE_REMOTE_PROTOCOL_INFORMATION;
+
+typedef struct _FILE_GET_QUOTA_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG SidLength;
+ SID Sid;
+} FILE_GET_QUOTA_INFORMATION, *PFILE_GET_QUOTA_INFORMATION;
+
+typedef struct _FILE_QUOTA_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG SidLength;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER QuotaUsed;
+ LARGE_INTEGER QuotaThreshold;
+ LARGE_INTEGER QuotaLimit;
+ SID Sid;
+} FILE_QUOTA_INFORMATION, *PFILE_QUOTA_INFORMATION;
+
+typedef struct _FILE_FS_ATTRIBUTE_INFORMATION {
+ ULONG FileSystemAttributes;
+ ULONG MaximumComponentNameLength;
+ ULONG FileSystemNameLength;
+ WCHAR FileSystemName[1];
+} FILE_FS_ATTRIBUTE_INFORMATION, *PFILE_FS_ATTRIBUTE_INFORMATION;
+
+typedef struct _FILE_FS_DRIVER_PATH_INFORMATION {
+ BOOLEAN DriverInPath;
+ ULONG DriverNameLength;
+ WCHAR DriverName[1];
+} FILE_FS_DRIVER_PATH_INFORMATION, *PFILE_FS_DRIVER_PATH_INFORMATION;
+
+typedef struct _FILE_FS_VOLUME_FLAGS_INFORMATION {
+ ULONG Flags;
+} FILE_FS_VOLUME_FLAGS_INFORMATION, *PFILE_FS_VOLUME_FLAGS_INFORMATION;
+
+#define FILE_VC_QUOTA_NONE 0x00000000
+#define FILE_VC_QUOTA_TRACK 0x00000001
+#define FILE_VC_QUOTA_ENFORCE 0x00000002
+#define FILE_VC_QUOTA_MASK 0x00000003
+#define FILE_VC_CONTENT_INDEX_DISABLED 0x00000008
+#define FILE_VC_LOG_QUOTA_THRESHOLD 0x00000010
+#define FILE_VC_LOG_QUOTA_LIMIT 0x00000020
+#define FILE_VC_LOG_VOLUME_THRESHOLD 0x00000040
+#define FILE_VC_LOG_VOLUME_LIMIT 0x00000080
+#define FILE_VC_QUOTAS_INCOMPLETE 0x00000100
+#define FILE_VC_QUOTAS_REBUILDING 0x00000200
+#define FILE_VC_VALID_MASK 0x000003ff
+
+typedef struct _FILE_FS_CONTROL_INFORMATION {
+ LARGE_INTEGER FreeSpaceStartFiltering;
+ LARGE_INTEGER FreeSpaceThreshold;
+ LARGE_INTEGER FreeSpaceStopFiltering;
+ LARGE_INTEGER DefaultQuotaThreshold;
+ LARGE_INTEGER DefaultQuotaLimit;
+ ULONG FileSystemControlFlags;
+} FILE_FS_CONTROL_INFORMATION, *PFILE_FS_CONTROL_INFORMATION;
+
+#ifndef _FILESYSTEMFSCTL_
+#define _FILESYSTEMFSCTL_
+
+#define FSCTL_REQUEST_OPLOCK_LEVEL_1 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_OPLOCK_LEVEL_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_BATCH_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_ACKNOWLEDGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 3, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPBATCH_ACK_CLOSE_PENDING CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_OPLOCK_BREAK_NOTIFY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 5, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_LOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_UNLOCK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DISMOUNT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_VOLUME_MOUNTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_PATHNAME_VALID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_MARK_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 14, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_GET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_COMPRESSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 16, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_SET_BOOTLOADER_ACCESSED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 19, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define FSCTL_OPLOCK_BREAK_ACK_NO_2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 20, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_INVALIDATE_VOLUMES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 21, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_FAT_BPB CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 22, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_REQUEST_FILTER_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 23, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_FILESYSTEM_GET_STATISTICS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 24, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#if (_WIN32_WINNT >= 0x0400)
+
+#define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_NTFS_FILE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 26, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_VOLUME_BITMAP CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 27, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_GET_RETRIEVAL_POINTERS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 28, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_MOVE_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 29, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_VOLUME_DIRTY CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 30, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_ALLOW_EXTENDED_DASD_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 32, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0500)
+
+#define FSCTL_FIND_FILES_BY_SID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 35, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_SET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 38, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 39, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DELETE_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 40, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 41, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_GET_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 42, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DELETE_REPARSE_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 43, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_ENUM_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 44, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_SECURITY_ID_CHECK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 45, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_READ_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 46, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_SET_OBJECT_ID_EXTENDED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 47, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_CREATE_OR_GET_OBJECT_ID CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 48, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_SPARSE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 49, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_ZERO_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 50, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_QUERY_ALLOCATED_RANGES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 51, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_ENABLE_UPGRADE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 52, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 53, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_ENCRYPTION_FSCTL_IO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 54, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_WRITE_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 55, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_READ_RAW_ENCRYPTED CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 56, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_CREATE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 57, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_READ_FILE_USN_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 58, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_WRITE_USN_CLOSE_RECORD CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 59, METHOD_NEITHER, FILE_READ_DATA)
+#define FSCTL_EXTEND_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 60, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 61, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DELETE_USN_JOURNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 62, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_MARK_HANDLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 63, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SIS_COPYFILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 64, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SIS_LINK_FILES CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 65, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_RECALL_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 69, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_READ_FROM_PLEX CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 71, METHOD_OUT_DIRECT, FILE_READ_DATA)
+#define FSCTL_FILE_PREFETCH CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 72, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define FSCTL_MAKE_MEDIA_COMPATIBLE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 76, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_SET_DEFECT_MANAGEMENT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 77, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_QUERY_SPARING_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 78, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_ON_DISK_VOLUME_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 79, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_VOLUME_COMPRESSION_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 80, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define FSCTL_TXFS_MODIFY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 81, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_QUERY_RM_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 82, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_ROLLFORWARD_REDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 84, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_ROLLFORWARD_UNDO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 85, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_START_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 86, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_SHUTDOWN_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 87, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_READ_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 88, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 89, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_CREATE_SECONDARY_RM CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 90, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_GET_METADATA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 91, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_GET_TRANSACTED_VERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 92, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_SAVEPOINT_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 94, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_CREATE_MINIVERSION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 95, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_TXFS_TRANSACTION_ACTIVE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 99, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_SET_ZERO_ON_DEALLOCATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 101, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define FSCTL_SET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 102, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 103, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_WAIT_FOR_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 104, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_INITIATE_REPAIR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 106, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSC_INTERNAL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 107, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_SHRINK_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 108, METHOD_BUFFERED, FILE_SPECIAL_ACCESS)
+#define FSCTL_SET_SHORT_NAME_BEHAVIOR CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 109, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_DFSR_SET_GHOST_HANDLE_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 110, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_TXFS_LIST_TRANSACTION_LOCKED_FILES \
+ CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_TXFS_LIST_TRANSACTIONS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 121, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_QUERY_PAGEFILE_ENCRYPTION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 122, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_RESET_VOLUME_ALLOCATION_HINTS CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 123, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_TXFS_READ_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 126, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#endif
+
+#if (_WIN32_WINNT >= 0x0601)
+
+#define FSCTL_QUERY_DEPENDENT_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 124, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SD_GLOBAL_CHANGE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 125, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_LOOKUP_STREAM_FROM_CLUSTER CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 127, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_TXFS_WRITE_BACKUP_INFORMATION2 CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 128, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_FILE_TYPE_NOTIFICATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 129, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_BOOT_AREA_INFO CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 140, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_GET_RETRIEVAL_POINTER_BASE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 141, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_SET_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 142, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_QUERY_PERSISTENT_VOLUME_STATE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 143, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_REQUEST_OPLOCK CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 144, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_CSV_TUNNEL_REQUEST CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 145, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_CSV_FILE CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 146, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+#define FSCTL_QUERY_FILE_SYSTEM_RECOGNITION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 147, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSV_GET_VOLUME_PATH_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 148, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSV_GET_VOLUME_NAME_FOR_VOLUME_MOUNT_POINT CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 149, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_CSV_GET_VOLUME_PATH_NAMES_FOR_VOLUME_NAME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 150, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_IS_FILE_ON_CSV_VOLUME CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 151, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef struct _CSV_NAMESPACE_INFO {
+ ULONG Version;
+ ULONG DeviceNumber;
+ LARGE_INTEGER StartingOffset;
+ ULONG SectorSize;
+} CSV_NAMESPACE_INFO, *PCSV_NAMESPACE_INFO;
+
+#define CSV_NAMESPACE_INFO_V1 (sizeof(CSV_NAMESPACE_INFO))
+#define CSV_INVALID_DEVICE_NUMBER 0xFFFFFFFF
+
+#endif
+
+#define FSCTL_MARK_AS_SYSTEM_HIVE FSCTL_SET_BOOTLOADER_ACCESSED
+
+typedef struct _PATHNAME_BUFFER {
+ ULONG PathNameLength;
+ WCHAR Name[1];
+} PATHNAME_BUFFER, *PPATHNAME_BUFFER;
+
+typedef struct _FSCTL_QUERY_FAT_BPB_BUFFER {
+ UCHAR First0x24BytesOfBootSector[0x24];
+} FSCTL_QUERY_FAT_BPB_BUFFER, *PFSCTL_QUERY_FAT_BPB_BUFFER;
+
+#if (_WIN32_WINNT >= 0x0400)
+
+typedef struct _NTFS_VOLUME_DATA_BUFFER {
+ LARGE_INTEGER VolumeSerialNumber;
+ LARGE_INTEGER NumberSectors;
+ LARGE_INTEGER TotalClusters;
+ LARGE_INTEGER FreeClusters;
+ LARGE_INTEGER TotalReserved;
+ ULONG BytesPerSector;
+ ULONG BytesPerCluster;
+ ULONG BytesPerFileRecordSegment;
+ ULONG ClustersPerFileRecordSegment;
+ LARGE_INTEGER MftValidDataLength;
+ LARGE_INTEGER MftStartLcn;
+ LARGE_INTEGER Mft2StartLcn;
+ LARGE_INTEGER MftZoneStart;
+ LARGE_INTEGER MftZoneEnd;
+} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;
+
+typedef struct _NTFS_EXTENDED_VOLUME_DATA {
+ ULONG ByteCount;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+} NTFS_EXTENDED_VOLUME_DATA, *PNTFS_EXTENDED_VOLUME_DATA;
+
+typedef struct _STARTING_LCN_INPUT_BUFFER {
+ LARGE_INTEGER StartingLcn;
+} STARTING_LCN_INPUT_BUFFER, *PSTARTING_LCN_INPUT_BUFFER;
+
+typedef struct _VOLUME_BITMAP_BUFFER {
+ LARGE_INTEGER StartingLcn;
+ LARGE_INTEGER BitmapSize;
+ UCHAR Buffer[1];
+} VOLUME_BITMAP_BUFFER, *PVOLUME_BITMAP_BUFFER;
+
+typedef struct _STARTING_VCN_INPUT_BUFFER {
+ LARGE_INTEGER StartingVcn;
+} STARTING_VCN_INPUT_BUFFER, *PSTARTING_VCN_INPUT_BUFFER;
+
+typedef struct _RETRIEVAL_POINTERS_BUFFER {
+ ULONG ExtentCount;
+ LARGE_INTEGER StartingVcn;
+ struct {
+ LARGE_INTEGER NextVcn;
+ LARGE_INTEGER Lcn;
+ } Extents[1];
+} RETRIEVAL_POINTERS_BUFFER, *PRETRIEVAL_POINTERS_BUFFER;
+
+typedef struct _NTFS_FILE_RECORD_INPUT_BUFFER {
+ LARGE_INTEGER FileReferenceNumber;
+} NTFS_FILE_RECORD_INPUT_BUFFER, *PNTFS_FILE_RECORD_INPUT_BUFFER;
+
+typedef struct _NTFS_FILE_RECORD_OUTPUT_BUFFER {
+ LARGE_INTEGER FileReferenceNumber;
+ ULONG FileRecordLength;
+ UCHAR FileRecordBuffer[1];
+} NTFS_FILE_RECORD_OUTPUT_BUFFER, *PNTFS_FILE_RECORD_OUTPUT_BUFFER;
+
+typedef struct _MOVE_FILE_DATA {
+ HANDLE FileHandle;
+ LARGE_INTEGER StartingVcn;
+ LARGE_INTEGER StartingLcn;
+ ULONG ClusterCount;
+} MOVE_FILE_DATA, *PMOVE_FILE_DATA;
+
+typedef struct _MOVE_FILE_RECORD_DATA {
+ HANDLE FileHandle;
+ LARGE_INTEGER SourceFileRecord;
+ LARGE_INTEGER TargetFileRecord;
+} MOVE_FILE_RECORD_DATA, *PMOVE_FILE_RECORD_DATA;
+
+#if defined(_WIN64)
+typedef struct _MOVE_FILE_DATA32 {
+ UINT32 FileHandle;
+ LARGE_INTEGER StartingVcn;
+ LARGE_INTEGER StartingLcn;
+ ULONG ClusterCount;
+} MOVE_FILE_DATA32, *PMOVE_FILE_DATA32;
+#endif
+
+#endif /* (_WIN32_WINNT >= 0x0400) */
+
+#if (_WIN32_WINNT >= 0x0500)
+
+typedef struct _FIND_BY_SID_DATA {
+ ULONG Restart;
+ SID Sid;
+} FIND_BY_SID_DATA, *PFIND_BY_SID_DATA;
+
+typedef struct _FIND_BY_SID_OUTPUT {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FIND_BY_SID_OUTPUT, *PFIND_BY_SID_OUTPUT;
+
+typedef struct _MFT_ENUM_DATA {
+ ULONGLONG StartFileReferenceNumber;
+ USN LowUsn;
+ USN HighUsn;
+} MFT_ENUM_DATA, *PMFT_ENUM_DATA;
+
+typedef struct _CREATE_USN_JOURNAL_DATA {
+ ULONGLONG MaximumSize;
+ ULONGLONG AllocationDelta;
+} CREATE_USN_JOURNAL_DATA, *PCREATE_USN_JOURNAL_DATA;
+
+typedef struct _READ_USN_JOURNAL_DATA {
+ USN StartUsn;
+ ULONG ReasonMask;
+ ULONG ReturnOnlyOnClose;
+ ULONGLONG Timeout;
+ ULONGLONG BytesToWaitFor;
+ ULONGLONG UsnJournalID;
+} READ_USN_JOURNAL_DATA, *PREAD_USN_JOURNAL_DATA;
+
+typedef struct _USN_RECORD {
+ ULONG RecordLength;
+ USHORT MajorVersion;
+ USHORT MinorVersion;
+ ULONGLONG FileReferenceNumber;
+ ULONGLONG ParentFileReferenceNumber;
+ USN Usn;
+ LARGE_INTEGER TimeStamp;
+ ULONG Reason;
+ ULONG SourceInfo;
+ ULONG SecurityId;
+ ULONG FileAttributes;
+ USHORT FileNameLength;
+ USHORT FileNameOffset;
+ WCHAR FileName[1];
+} USN_RECORD, *PUSN_RECORD;
+
+#define USN_PAGE_SIZE (0x1000)
+
+#define USN_REASON_DATA_OVERWRITE (0x00000001)
+#define USN_REASON_DATA_EXTEND (0x00000002)
+#define USN_REASON_DATA_TRUNCATION (0x00000004)
+#define USN_REASON_NAMED_DATA_OVERWRITE (0x00000010)
+#define USN_REASON_NAMED_DATA_EXTEND (0x00000020)
+#define USN_REASON_NAMED_DATA_TRUNCATION (0x00000040)
+#define USN_REASON_FILE_CREATE (0x00000100)
+#define USN_REASON_FILE_DELETE (0x00000200)
+#define USN_REASON_EA_CHANGE (0x00000400)
+#define USN_REASON_SECURITY_CHANGE (0x00000800)
+#define USN_REASON_RENAME_OLD_NAME (0x00001000)
+#define USN_REASON_RENAME_NEW_NAME (0x00002000)
+#define USN_REASON_INDEXABLE_CHANGE (0x00004000)
+#define USN_REASON_BASIC_INFO_CHANGE (0x00008000)
+#define USN_REASON_HARD_LINK_CHANGE (0x00010000)
+#define USN_REASON_COMPRESSION_CHANGE (0x00020000)
+#define USN_REASON_ENCRYPTION_CHANGE (0x00040000)
+#define USN_REASON_OBJECT_ID_CHANGE (0x00080000)
+#define USN_REASON_REPARSE_POINT_CHANGE (0x00100000)
+#define USN_REASON_STREAM_CHANGE (0x00200000)
+#define USN_REASON_TRANSACTED_CHANGE (0x00400000)
+#define USN_REASON_CLOSE (0x80000000)
+
+typedef struct _USN_JOURNAL_DATA {
+ ULONGLONG UsnJournalID;
+ USN FirstUsn;
+ USN NextUsn;
+ USN LowestValidUsn;
+ USN MaxUsn;
+ ULONGLONG MaximumSize;
+ ULONGLONG AllocationDelta;
+} USN_JOURNAL_DATA, *PUSN_JOURNAL_DATA;
+
+typedef struct _DELETE_USN_JOURNAL_DATA {
+ ULONGLONG UsnJournalID;
+ ULONG DeleteFlags;
+} DELETE_USN_JOURNAL_DATA, *PDELETE_USN_JOURNAL_DATA;
+
+#define USN_DELETE_FLAG_DELETE (0x00000001)
+#define USN_DELETE_FLAG_NOTIFY (0x00000002)
+#define USN_DELETE_VALID_FLAGS (0x00000003)
+
+typedef struct _MARK_HANDLE_INFO {
+ ULONG UsnSourceInfo;
+ HANDLE VolumeHandle;
+ ULONG HandleInfo;
+} MARK_HANDLE_INFO, *PMARK_HANDLE_INFO;
+
+#if defined(_WIN64)
+typedef struct _MARK_HANDLE_INFO32 {
+ ULONG UsnSourceInfo;
+ UINT32 VolumeHandle;
+ ULONG HandleInfo;
+} MARK_HANDLE_INFO32, *PMARK_HANDLE_INFO32;
+#endif
+
+#define USN_SOURCE_DATA_MANAGEMENT (0x00000001)
+#define USN_SOURCE_AUXILIARY_DATA (0x00000002)
+#define USN_SOURCE_REPLICATION_MANAGEMENT (0x00000004)
+
+#define MARK_HANDLE_PROTECT_CLUSTERS (0x00000001)
+#define MARK_HANDLE_TXF_SYSTEM_LOG (0x00000004)
+#define MARK_HANDLE_NOT_TXF_SYSTEM_LOG (0x00000008)
+
+typedef struct _BULK_SECURITY_TEST_DATA {
+ ACCESS_MASK DesiredAccess;
+ ULONG SecurityIds[1];
+} BULK_SECURITY_TEST_DATA, *PBULK_SECURITY_TEST_DATA;
+
+#define VOLUME_IS_DIRTY (0x00000001)
+#define VOLUME_UPGRADE_SCHEDULED (0x00000002)
+#define VOLUME_SESSION_OPEN (0x00000004)
+
+typedef struct _FILE_PREFETCH {
+ ULONG Type;
+ ULONG Count;
+ ULONGLONG Prefetch[1];
+} FILE_PREFETCH, *PFILE_PREFETCH;
+
+typedef struct _FILE_PREFETCH_EX {
+ ULONG Type;
+ ULONG Count;
+ PVOID Context;
+ ULONGLONG Prefetch[1];
+} FILE_PREFETCH_EX, *PFILE_PREFETCH_EX;
+
+#define FILE_PREFETCH_TYPE_FOR_CREATE 0x1
+#define FILE_PREFETCH_TYPE_FOR_DIRENUM 0x2
+#define FILE_PREFETCH_TYPE_FOR_CREATE_EX 0x3
+#define FILE_PREFETCH_TYPE_FOR_DIRENUM_EX 0x4
+
+#define FILE_PREFETCH_TYPE_MAX 0x4
+
+typedef struct _FILE_OBJECTID_BUFFER {
+ UCHAR ObjectId[16];
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
+ UCHAR BirthVolumeId[16];
+ UCHAR BirthObjectId[16];
+ UCHAR DomainId[16];
+ } DUMMYSTRUCTNAME;
+ UCHAR ExtendedInfo[48];
+ } DUMMYUNIONNAME;
+} FILE_OBJECTID_BUFFER, *PFILE_OBJECTID_BUFFER;
+
+typedef struct _FILE_SET_SPARSE_BUFFER {
+ BOOLEAN SetSparse;
+} FILE_SET_SPARSE_BUFFER, *PFILE_SET_SPARSE_BUFFER;
+
+typedef struct _FILE_ZERO_DATA_INFORMATION {
+ LARGE_INTEGER FileOffset;
+ LARGE_INTEGER BeyondFinalZero;
+} FILE_ZERO_DATA_INFORMATION, *PFILE_ZERO_DATA_INFORMATION;
+
+typedef struct _FILE_ALLOCATED_RANGE_BUFFER {
+ LARGE_INTEGER FileOffset;
+ LARGE_INTEGER Length;
+} FILE_ALLOCATED_RANGE_BUFFER, *PFILE_ALLOCATED_RANGE_BUFFER;
+
+typedef struct _ENCRYPTION_BUFFER {
+ ULONG EncryptionOperation;
+ UCHAR Private[1];
+} ENCRYPTION_BUFFER, *PENCRYPTION_BUFFER;
+
+#define FILE_SET_ENCRYPTION 0x00000001
+#define FILE_CLEAR_ENCRYPTION 0x00000002
+#define STREAM_SET_ENCRYPTION 0x00000003
+#define STREAM_CLEAR_ENCRYPTION 0x00000004
+
+#define MAXIMUM_ENCRYPTION_VALUE 0x00000004
+
+typedef struct _DECRYPTION_STATUS_BUFFER {
+ BOOLEAN NoEncryptedStreams;
+} DECRYPTION_STATUS_BUFFER, *PDECRYPTION_STATUS_BUFFER;
+
+#define ENCRYPTION_FORMAT_DEFAULT (0x01)
+
+#define COMPRESSION_FORMAT_SPARSE (0x4000)
+
+typedef struct _REQUEST_RAW_ENCRYPTED_DATA {
+ LONGLONG FileOffset;
+ ULONG Length;
+} REQUEST_RAW_ENCRYPTED_DATA, *PREQUEST_RAW_ENCRYPTED_DATA;
+
+typedef struct _ENCRYPTED_DATA_INFO {
+ ULONGLONG StartingFileOffset;
+ ULONG OutputBufferOffset;
+ ULONG BytesWithinFileSize;
+ ULONG BytesWithinValidDataLength;
+ USHORT CompressionFormat;
+ UCHAR DataUnitShift;
+ UCHAR ChunkShift;
+ UCHAR ClusterShift;
+ UCHAR EncryptionFormat;
+ USHORT NumberOfDataBlocks;
+ ULONG DataBlockSize[ANYSIZE_ARRAY];
+} ENCRYPTED_DATA_INFO, *PENCRYPTED_DATA_INFO;
+
+typedef struct _PLEX_READ_DATA_REQUEST {
+ LARGE_INTEGER ByteOffset;
+ ULONG ByteLength;
+ ULONG PlexNumber;
+} PLEX_READ_DATA_REQUEST, *PPLEX_READ_DATA_REQUEST;
+
+typedef struct _SI_COPYFILE {
+ ULONG SourceFileNameLength;
+ ULONG DestinationFileNameLength;
+ ULONG Flags;
+ WCHAR FileNameBuffer[1];
+} SI_COPYFILE, *PSI_COPYFILE;
+
+#define COPYFILE_SIS_LINK 0x0001
+#define COPYFILE_SIS_REPLACE 0x0002
+#define COPYFILE_SIS_FLAGS 0x0003
+
+#endif /* (_WIN32_WINNT >= 0x0500) */
+
+#if (_WIN32_WINNT >= 0x0600)
+
+typedef struct _FILE_MAKE_COMPATIBLE_BUFFER {
+ BOOLEAN CloseDisc;
+} FILE_MAKE_COMPATIBLE_BUFFER, *PFILE_MAKE_COMPATIBLE_BUFFER;
+
+typedef struct _FILE_SET_DEFECT_MGMT_BUFFER {
+ BOOLEAN Disable;
+} FILE_SET_DEFECT_MGMT_BUFFER, *PFILE_SET_DEFECT_MGMT_BUFFER;
+
+typedef struct _FILE_QUERY_SPARING_BUFFER {
+ ULONG SparingUnitBytes;
+ BOOLEAN SoftwareSparing;
+ ULONG TotalSpareBlocks;
+ ULONG FreeSpareBlocks;
+} FILE_QUERY_SPARING_BUFFER, *PFILE_QUERY_SPARING_BUFFER;
+
+typedef struct _FILE_QUERY_ON_DISK_VOL_INFO_BUFFER {
+ LARGE_INTEGER DirectoryCount;
+ LARGE_INTEGER FileCount;
+ USHORT FsFormatMajVersion;
+ USHORT FsFormatMinVersion;
+ WCHAR FsFormatName[12];
+ LARGE_INTEGER FormatTime;
+ LARGE_INTEGER LastUpdateTime;
+ WCHAR CopyrightInfo[34];
+ WCHAR AbstractInfo[34];
+ WCHAR FormattingImplementationInfo[34];
+ WCHAR LastModifyingImplementationInfo[34];
+} FILE_QUERY_ON_DISK_VOL_INFO_BUFFER, *PFILE_QUERY_ON_DISK_VOL_INFO_BUFFER;
+
+#define SET_REPAIR_ENABLED (0x00000001)
+#define SET_REPAIR_VOLUME_BITMAP_SCAN (0x00000002)
+#define SET_REPAIR_DELETE_CROSSLINK (0x00000004)
+#define SET_REPAIR_WARN_ABOUT_DATA_LOSS (0x00000008)
+#define SET_REPAIR_DISABLED_AND_BUGCHECK_ON_CORRUPT (0x00000010)
+#define SET_REPAIR_VALID_MASK (0x0000001F)
+
+typedef enum _SHRINK_VOLUME_REQUEST_TYPES {
+ ShrinkPrepare = 1,
+ ShrinkCommit,
+ ShrinkAbort
+} SHRINK_VOLUME_REQUEST_TYPES, *PSHRINK_VOLUME_REQUEST_TYPES;
+
+typedef struct _SHRINK_VOLUME_INFORMATION {
+ SHRINK_VOLUME_REQUEST_TYPES ShrinkRequestType;
+ ULONGLONG Flags;
+ LONGLONG NewNumberOfSectors;
+} SHRINK_VOLUME_INFORMATION, *PSHRINK_VOLUME_INFORMATION;
+
+#define TXFS_RM_FLAG_LOGGING_MODE 0x00000001
+#define TXFS_RM_FLAG_RENAME_RM 0x00000002
+#define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000004
+#define TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000008
+#define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000010
+#define TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000020
+#define TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000040
+#define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000080
+#define TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000100
+#define TXFS_RM_FLAG_GROW_LOG 0x00000400
+#define TXFS_RM_FLAG_SHRINK_LOG 0x00000800
+#define TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE 0x00001000
+#define TXFS_RM_FLAG_PRESERVE_CHANGES 0x00002000
+#define TXFS_RM_FLAG_RESET_RM_AT_NEXT_START 0x00004000
+#define TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START 0x00008000
+#define TXFS_RM_FLAG_PREFER_CONSISTENCY 0x00010000
+#define TXFS_RM_FLAG_PREFER_AVAILABILITY 0x00020000
+
+#define TXFS_LOGGING_MODE_SIMPLE (0x0001)
+#define TXFS_LOGGING_MODE_FULL (0x0002)
+
+#define TXFS_TRANSACTION_STATE_NONE 0x00
+#define TXFS_TRANSACTION_STATE_ACTIVE 0x01
+#define TXFS_TRANSACTION_STATE_PREPARED 0x02
+#define TXFS_TRANSACTION_STATE_NOTACTIVE 0x03
+
+#define TXFS_MODIFY_RM_VALID_FLAGS (TXFS_RM_FLAG_LOGGING_MODE | \
+ TXFS_RM_FLAG_RENAME_RM | \
+ TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
+ TXFS_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
+ TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
+ TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
+ TXFS_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
+ TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
+ TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
+ TXFS_RM_FLAG_SHRINK_LOG | \
+ TXFS_RM_FLAG_GROW_LOG | \
+ TXFS_RM_FLAG_ENFORCE_MINIMUM_SIZE | \
+ TXFS_RM_FLAG_PRESERVE_CHANGES | \
+ TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
+ TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
+ TXFS_RM_FLAG_PREFER_CONSISTENCY | \
+ TXFS_RM_FLAG_PREFER_AVAILABILITY)
+
+typedef struct _TXFS_MODIFY_RM {
+ ULONG Flags;
+ ULONG LogContainerCountMax;
+ ULONG LogContainerCountMin;
+ ULONG LogContainerCount;
+ ULONG LogGrowthIncrement;
+ ULONG LogAutoShrinkPercentage;
+ ULONGLONG Reserved;
+ USHORT LoggingMode;
+} TXFS_MODIFY_RM, *PTXFS_MODIFY_RM;
+
+#define TXFS_RM_STATE_NOT_STARTED 0
+#define TXFS_RM_STATE_STARTING 1
+#define TXFS_RM_STATE_ACTIVE 2
+#define TXFS_RM_STATE_SHUTTING_DOWN 3
+
+#define TXFS_QUERY_RM_INFORMATION_VALID_FLAGS \
+ (TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
+ TXFS_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
+ TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
+ TXFS_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN | \
+ TXFS_RM_FLAG_RESET_RM_AT_NEXT_START | \
+ TXFS_RM_FLAG_DO_NOT_RESET_RM_AT_NEXT_START | \
+ TXFS_RM_FLAG_PREFER_CONSISTENCY | \
+ TXFS_RM_FLAG_PREFER_AVAILABILITY)
+
+typedef struct _TXFS_QUERY_RM_INFORMATION {
+ ULONG BytesRequired;
+ ULONGLONG TailLsn;
+ ULONGLONG CurrentLsn;
+ ULONGLONG ArchiveTailLsn;
+ ULONGLONG LogContainerSize;
+ LARGE_INTEGER HighestVirtualClock;
+ ULONG LogContainerCount;
+ ULONG LogContainerCountMax;
+ ULONG LogContainerCountMin;
+ ULONG LogGrowthIncrement;
+ ULONG LogAutoShrinkPercentage;
+ ULONG Flags;
+ USHORT LoggingMode;
+ USHORT Reserved;
+ ULONG RmState;
+ ULONGLONG LogCapacity;
+ ULONGLONG LogFree;
+ ULONGLONG TopsSize;
+ ULONGLONG TopsUsed;
+ ULONGLONG TransactionCount;
+ ULONGLONG OnePCCount;
+ ULONGLONG TwoPCCount;
+ ULONGLONG NumberLogFileFull;
+ ULONGLONG OldestTransactionAge;
+ GUID RMName;
+ ULONG TmLogPathOffset;
+} TXFS_QUERY_RM_INFORMATION, *PTXFS_QUERY_RM_INFORMATION;
+
+#define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN 0x01
+#define TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK 0x02
+
+#define TXFS_ROLLFORWARD_REDO_VALID_FLAGS \
+ (TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_REDO_LSN | \
+ TXFS_ROLLFORWARD_REDO_FLAG_USE_LAST_VIRTUAL_CLOCK)
+
+typedef struct _TXFS_ROLLFORWARD_REDO_INFORMATION {
+ LARGE_INTEGER LastVirtualClock;
+ ULONGLONG LastRedoLsn;
+ ULONGLONG HighestRecoveryLsn;
+ ULONG Flags;
+} TXFS_ROLLFORWARD_REDO_INFORMATION, *PTXFS_ROLLFORWARD_REDO_INFORMATION;
+
+#define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX 0x00000001
+#define TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN 0x00000002
+#define TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE 0x00000004
+#define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS 0x00000008
+#define TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT 0x00000010
+#define TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE 0x00000020
+#define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX 0x00000040
+#define TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MIN 0x00000080
+
+#define TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT 0x00000200
+#define TXFS_START_RM_FLAG_LOGGING_MODE 0x00000400
+#define TXFS_START_RM_FLAG_PRESERVE_CHANGES 0x00000800
+
+#define TXFS_START_RM_FLAG_PREFER_CONSISTENCY 0x00001000
+#define TXFS_START_RM_FLAG_PREFER_AVAILABILITY 0x00002000
+
+#define TXFS_START_RM_VALID_FLAGS \
+ (TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MAX | \
+ TXFS_START_RM_FLAG_LOG_CONTAINER_COUNT_MIN | \
+ TXFS_START_RM_FLAG_LOG_CONTAINER_SIZE | \
+ TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_NUM_CONTAINERS | \
+ TXFS_START_RM_FLAG_LOG_GROWTH_INCREMENT_PERCENT | \
+ TXFS_START_RM_FLAG_LOG_AUTO_SHRINK_PERCENTAGE | \
+ TXFS_START_RM_FLAG_RECOVER_BEST_EFFORT | \
+ TXFS_START_RM_FLAG_LOG_NO_CONTAINER_COUNT_MAX | \
+ TXFS_START_RM_FLAG_LOGGING_MODE | \
+ TXFS_START_RM_FLAG_PRESERVE_CHANGES | \
+ TXFS_START_RM_FLAG_PREFER_CONSISTENCY | \
+ TXFS_START_RM_FLAG_PREFER_AVAILABILITY)
+
+typedef struct _TXFS_START_RM_INFORMATION {
+ ULONG Flags;
+ ULONGLONG LogContainerSize;
+ ULONG LogContainerCountMin;
+ ULONG LogContainerCountMax;
+ ULONG LogGrowthIncrement;
+ ULONG LogAutoShrinkPercentage;
+ ULONG TmLogPathOffset;
+ USHORT TmLogPathLength;
+ USHORT LoggingMode;
+ USHORT LogPathLength;
+ USHORT Reserved;
+ WCHAR LogPath[1];
+} TXFS_START_RM_INFORMATION, *PTXFS_START_RM_INFORMATION;
+
+typedef struct _TXFS_GET_METADATA_INFO_OUT {
+ struct {
+ LONGLONG LowPart;
+ LONGLONG HighPart;
+ } TxfFileId;
+ GUID LockingTransaction;
+ ULONGLONG LastLsn;
+ ULONG TransactionState;
+} TXFS_GET_METADATA_INFO_OUT, *PTXFS_GET_METADATA_INFO_OUT;
+
+#define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_CREATED 0x00000001
+#define TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY_FLAG_DELETED 0x00000002
+
+typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY {
+ ULONGLONG Offset;
+ ULONG NameFlags;
+ LONGLONG FileId;
+ ULONG Reserved1;
+ ULONG Reserved2;
+ LONGLONG Reserved3;
+ WCHAR FileName[1];
+} TXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY, *PTXFS_LIST_TRANSACTION_LOCKED_FILES_ENTRY;
+
+typedef struct _TXFS_LIST_TRANSACTION_LOCKED_FILES {
+ GUID KtmTransaction;
+ ULONGLONG NumberOfFiles;
+ ULONGLONG BufferSizeRequired;
+ ULONGLONG Offset;
+} TXFS_LIST_TRANSACTION_LOCKED_FILES, *PTXFS_LIST_TRANSACTION_LOCKED_FILES;
+
+typedef struct _TXFS_LIST_TRANSACTIONS_ENTRY {
+ GUID TransactionId;
+ ULONG TransactionState;
+ ULONG Reserved1;
+ ULONG Reserved2;
+ LONGLONG Reserved3;
+} TXFS_LIST_TRANSACTIONS_ENTRY, *PTXFS_LIST_TRANSACTIONS_ENTRY;
+
+typedef struct _TXFS_LIST_TRANSACTIONS {
+ ULONGLONG NumberOfTransactions;
+ ULONGLONG BufferSizeRequired;
+} TXFS_LIST_TRANSACTIONS, *PTXFS_LIST_TRANSACTIONS;
+
+typedef struct _TXFS_READ_BACKUP_INFORMATION_OUT {
+ _ANONYMOUS_UNION union {
+ ULONG BufferLength;
+ UCHAR Buffer[1];
+ } DUMMYUNIONNAME;
+} TXFS_READ_BACKUP_INFORMATION_OUT, *PTXFS_READ_BACKUP_INFORMATION_OUT;
+
+typedef struct _TXFS_WRITE_BACKUP_INFORMATION {
+ UCHAR Buffer[1];
+} TXFS_WRITE_BACKUP_INFORMATION, *PTXFS_WRITE_BACKUP_INFORMATION;
+
+#define TXFS_TRANSACTED_VERSION_NONTRANSACTED 0xFFFFFFFE
+#define TXFS_TRANSACTED_VERSION_UNCOMMITTED 0xFFFFFFFF
+
+typedef struct _TXFS_GET_TRANSACTED_VERSION {
+ ULONG ThisBaseVersion;
+ ULONG LatestVersion;
+ USHORT ThisMiniVersion;
+ USHORT FirstMiniVersion;
+ USHORT LatestMiniVersion;
+} TXFS_GET_TRANSACTED_VERSION, *PTXFS_GET_TRANSACTED_VERSION;
+
+#define TXFS_SAVEPOINT_SET 0x00000001
+#define TXFS_SAVEPOINT_ROLLBACK 0x00000002
+#define TXFS_SAVEPOINT_CLEAR 0x00000004
+#define TXFS_SAVEPOINT_CLEAR_ALL 0x00000010
+
+typedef struct _TXFS_SAVEPOINT_INFORMATION {
+ HANDLE KtmTransaction;
+ ULONG ActionCode;
+ ULONG SavepointId;
+} TXFS_SAVEPOINT_INFORMATION, *PTXFS_SAVEPOINT_INFORMATION;
+
+typedef struct _TXFS_CREATE_MINIVERSION_INFO {
+ USHORT StructureVersion;
+ USHORT StructureLength;
+ ULONG BaseVersion;
+ USHORT MiniVersion;
+} TXFS_CREATE_MINIVERSION_INFO, *PTXFS_CREATE_MINIVERSION_INFO;
+
+typedef struct _TXFS_TRANSACTION_ACTIVE_INFO {
+ BOOLEAN TransactionsActiveAtSnapshot;
+} TXFS_TRANSACTION_ACTIVE_INFO, *PTXFS_TRANSACTION_ACTIVE_INFO;
+
+#endif /* (_WIN32_WINNT >= 0x0600) */
+
+#if (_WIN32_WINNT >= 0x0601)
+
+#define MARK_HANDLE_REALTIME (0x00000020)
+#define MARK_HANDLE_NOT_REALTIME (0x00000040)
+
+#define NO_8DOT3_NAME_PRESENT (0x00000001)
+#define REMOVED_8DOT3_NAME (0x00000002)
+
+#define PERSISTENT_VOLUME_STATE_SHORT_NAME_CREATION_DISABLED (0x00000001)
+
+typedef struct _BOOT_AREA_INFO {
+ ULONG BootSectorCount;
+ struct {
+ LARGE_INTEGER Offset;
+ } BootSectors[2];
+} BOOT_AREA_INFO, *PBOOT_AREA_INFO;
+
+typedef struct _RETRIEVAL_POINTER_BASE {
+ LARGE_INTEGER FileAreaOffset;
+} RETRIEVAL_POINTER_BASE, *PRETRIEVAL_POINTER_BASE;
+
+typedef struct _FILE_FS_PERSISTENT_VOLUME_INFORMATION {
+ ULONG VolumeFlags;
+ ULONG FlagMask;
+ ULONG Version;
+ ULONG Reserved;
+} FILE_FS_PERSISTENT_VOLUME_INFORMATION, *PFILE_FS_PERSISTENT_VOLUME_INFORMATION;
+
+typedef struct _FILE_SYSTEM_RECOGNITION_INFORMATION {
+ CHAR FileSystem[9];
+} FILE_SYSTEM_RECOGNITION_INFORMATION, *PFILE_SYSTEM_RECOGNITION_INFORMATION;
+
+#define OPLOCK_LEVEL_CACHE_READ (0x00000001)
+#define OPLOCK_LEVEL_CACHE_HANDLE (0x00000002)
+#define OPLOCK_LEVEL_CACHE_WRITE (0x00000004)
+
+#define REQUEST_OPLOCK_INPUT_FLAG_REQUEST (0x00000001)
+#define REQUEST_OPLOCK_INPUT_FLAG_ACK (0x00000002)
+#define REQUEST_OPLOCK_INPUT_FLAG_COMPLETE_ACK_ON_CLOSE (0x00000004)
+
+#define REQUEST_OPLOCK_CURRENT_VERSION 1
+
+typedef struct _REQUEST_OPLOCK_INPUT_BUFFER {
+ USHORT StructureVersion;
+ USHORT StructureLength;
+ ULONG RequestedOplockLevel;
+ ULONG Flags;
+} REQUEST_OPLOCK_INPUT_BUFFER, *PREQUEST_OPLOCK_INPUT_BUFFER;
+
+#define REQUEST_OPLOCK_OUTPUT_FLAG_ACK_REQUIRED (0x00000001)
+#define REQUEST_OPLOCK_OUTPUT_FLAG_MODES_PROVIDED (0x00000002)
+
+typedef struct _REQUEST_OPLOCK_OUTPUT_BUFFER {
+ USHORT StructureVersion;
+ USHORT StructureLength;
+ ULONG OriginalOplockLevel;
+ ULONG NewOplockLevel;
+ ULONG Flags;
+ ACCESS_MASK AccessMode;
+ USHORT ShareMode;
+} REQUEST_OPLOCK_OUTPUT_BUFFER, *PREQUEST_OPLOCK_OUTPUT_BUFFER;
+
+#define SD_GLOBAL_CHANGE_TYPE_MACHINE_SID 1
+
+typedef struct _SD_CHANGE_MACHINE_SID_INPUT {
+ USHORT CurrentMachineSIDOffset;
+ USHORT CurrentMachineSIDLength;
+ USHORT NewMachineSIDOffset;
+ USHORT NewMachineSIDLength;
+} SD_CHANGE_MACHINE_SID_INPUT, *PSD_CHANGE_MACHINE_SID_INPUT;
+
+typedef struct _SD_CHANGE_MACHINE_SID_OUTPUT {
+ ULONGLONG NumSDChangedSuccess;
+ ULONGLONG NumSDChangedFail;
+ ULONGLONG NumSDUnused;
+ ULONGLONG NumSDTotal;
+ ULONGLONG NumMftSDChangedSuccess;
+ ULONGLONG NumMftSDChangedFail;
+ ULONGLONG NumMftSDTotal;
+} SD_CHANGE_MACHINE_SID_OUTPUT, *PSD_CHANGE_MACHINE_SID_OUTPUT;
+
+typedef struct _SD_GLOBAL_CHANGE_INPUT {
+ ULONG Flags;
+ ULONG ChangeType;
+ _ANONYMOUS_UNION union {
+ SD_CHANGE_MACHINE_SID_INPUT SdChange;
+ } DUMMYUNIONNAME;
+} SD_GLOBAL_CHANGE_INPUT, *PSD_GLOBAL_CHANGE_INPUT;
+
+typedef struct _SD_GLOBAL_CHANGE_OUTPUT {
+ ULONG Flags;
+ ULONG ChangeType;
+ _ANONYMOUS_UNION union {
+ SD_CHANGE_MACHINE_SID_OUTPUT SdChange;
+ } DUMMYUNIONNAME;
+} SD_GLOBAL_CHANGE_OUTPUT, *PSD_GLOBAL_CHANGE_OUTPUT;
+
+#define ENCRYPTED_DATA_INFO_SPARSE_FILE 1
+
+typedef struct _EXTENDED_ENCRYPTED_DATA_INFO {
+ ULONG ExtendedCode;
+ ULONG Length;
+ ULONG Flags;
+ ULONG Reserved;
+} EXTENDED_ENCRYPTED_DATA_INFO, *PEXTENDED_ENCRYPTED_DATA_INFO;
+
+typedef struct _LOOKUP_STREAM_FROM_CLUSTER_INPUT {
+ ULONG Flags;
+ ULONG NumberOfClusters;
+ LARGE_INTEGER Cluster[1];
+} LOOKUP_STREAM_FROM_CLUSTER_INPUT, *PLOOKUP_STREAM_FROM_CLUSTER_INPUT;
+
+typedef struct _LOOKUP_STREAM_FROM_CLUSTER_OUTPUT {
+ ULONG Offset;
+ ULONG NumberOfMatches;
+ ULONG BufferSizeRequired;
+} LOOKUP_STREAM_FROM_CLUSTER_OUTPUT, *PLOOKUP_STREAM_FROM_CLUSTER_OUTPUT;
+
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_PAGE_FILE 0x00000001
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_DENY_DEFRAG_SET 0x00000002
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_FS_SYSTEM_FILE 0x00000004
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_FLAG_TXF_SYSTEM_FILE 0x00000008
+
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_MASK 0xff000000
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_DATA 0x01000000
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_INDEX 0x02000000
+#define LOOKUP_STREAM_FROM_CLUSTER_ENTRY_ATTRIBUTE_SYSTEM 0x03000000
+
+typedef struct _LOOKUP_STREAM_FROM_CLUSTER_ENTRY {
+ ULONG OffsetToNext;
+ ULONG Flags;
+ LARGE_INTEGER Reserved;
+ LARGE_INTEGER Cluster;
+ WCHAR FileName[1];
+} LOOKUP_STREAM_FROM_CLUSTER_ENTRY, *PLOOKUP_STREAM_FROM_CLUSTER_ENTRY;
+
+typedef struct _FILE_TYPE_NOTIFICATION_INPUT {
+ ULONG Flags;
+ ULONG NumFileTypeIDs;
+ GUID FileTypeID[1];
+} FILE_TYPE_NOTIFICATION_INPUT, *PFILE_TYPE_NOTIFICATION_INPUT;
+
+#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_BEGIN 0x00000001
+#define FILE_TYPE_NOTIFICATION_FLAG_USAGE_END 0x00000002
+
+DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_PAGE_FILE, 0x0d0a64a1, 0x38fc, 0x4db8, 0x9f, 0xe7, 0x3f, 0x43, 0x52, 0xcd, 0x7c, 0x5c);
+DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_HIBERNATION_FILE, 0xb7624d64, 0xb9a3, 0x4cf8, 0x80, 0x11, 0x5b, 0x86, 0xc9, 0x40, 0xe7, 0xb7);
+DEFINE_GUID(FILE_TYPE_NOTIFICATION_GUID_CRASHDUMP_FILE, 0x9d453eb7, 0xd2a6, 0x4dbd, 0xa2, 0xe3, 0xfb, 0xd0, 0xed, 0x91, 0x09, 0xa9);
+
+#ifndef _VIRTUAL_STORAGE_TYPE_DEFINED
+#define _VIRTUAL_STORAGE_TYPE_DEFINED
+typedef struct _VIRTUAL_STORAGE_TYPE {
+ ULONG DeviceId;
+ GUID VendorId;
+} VIRTUAL_STORAGE_TYPE, *PVIRTUAL_STORAGE_TYPE;
+#endif
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST {
+ ULONG RequestLevel;
+ ULONG RequestFlags;
+} STORAGE_QUERY_DEPENDENT_VOLUME_REQUEST, *PSTORAGE_QUERY_DEPENDENT_VOLUME_REQUEST;
+
+#define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_HOST_VOLUMES 0x1
+#define QUERY_DEPENDENT_VOLUME_REQUEST_FLAG_GUEST_VOLUMES 0x2
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY {
+ ULONG EntryLength;
+ ULONG DependencyTypeFlags;
+ ULONG ProviderSpecificFlags;
+ VIRTUAL_STORAGE_TYPE VirtualStorageType;
+} STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY;
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY {
+ ULONG EntryLength;
+ ULONG DependencyTypeFlags;
+ ULONG ProviderSpecificFlags;
+ VIRTUAL_STORAGE_TYPE VirtualStorageType;
+ ULONG AncestorLevel;
+ ULONG HostVolumeNameOffset;
+ ULONG HostVolumeNameSize;
+ ULONG DependentVolumeNameOffset;
+ ULONG DependentVolumeNameSize;
+ ULONG RelativePathOffset;
+ ULONG RelativePathSize;
+ ULONG DependentDeviceNameOffset;
+ ULONG DependentDeviceNameSize;
+} STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY, *PSTORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY;
+
+typedef struct _STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE {
+ ULONG ResponseLevel;
+ ULONG NumberEntries;
+ _ANONYMOUS_UNION union {
+ STORAGE_QUERY_DEPENDENT_VOLUME_LEV1_ENTRY Lev1Depends[];
+ STORAGE_QUERY_DEPENDENT_VOLUME_LEV2_ENTRY Lev2Depends[];
+ } DUMMYUNIONNAME;
+} STORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE, *PSTORAGE_QUERY_DEPENDENT_VOLUME_RESPONSE;
+
+#endif /* (_WIN32_WINNT >= 0x0601) */
+
+typedef struct _FILESYSTEM_STATISTICS {
+ USHORT FileSystemType;
+ USHORT Version;
+ ULONG SizeOfCompleteStructure;
+ ULONG UserFileReads;
+ ULONG UserFileReadBytes;
+ ULONG UserDiskReads;
+ ULONG UserFileWrites;
+ ULONG UserFileWriteBytes;
+ ULONG UserDiskWrites;
+ ULONG MetaDataReads;
+ ULONG MetaDataReadBytes;
+ ULONG MetaDataDiskReads;
+ ULONG MetaDataWrites;
+ ULONG MetaDataWriteBytes;
+ ULONG MetaDataDiskWrites;
+} FILESYSTEM_STATISTICS, *PFILESYSTEM_STATISTICS;
+
+#define FILESYSTEM_STATISTICS_TYPE_NTFS 1
+#define FILESYSTEM_STATISTICS_TYPE_FAT 2
+#define FILESYSTEM_STATISTICS_TYPE_EXFAT 3
+
+typedef struct _FAT_STATISTICS {
+ ULONG CreateHits;
+ ULONG SuccessfulCreates;
+ ULONG FailedCreates;
+ ULONG NonCachedReads;
+ ULONG NonCachedReadBytes;
+ ULONG NonCachedWrites;
+ ULONG NonCachedWriteBytes;
+ ULONG NonCachedDiskReads;
+ ULONG NonCachedDiskWrites;
+} FAT_STATISTICS, *PFAT_STATISTICS;
+
+typedef struct _EXFAT_STATISTICS {
+ ULONG CreateHits;
+ ULONG SuccessfulCreates;
+ ULONG FailedCreates;
+ ULONG NonCachedReads;
+ ULONG NonCachedReadBytes;
+ ULONG NonCachedWrites;
+ ULONG NonCachedWriteBytes;
+ ULONG NonCachedDiskReads;
+ ULONG NonCachedDiskWrites;
+} EXFAT_STATISTICS, *PEXFAT_STATISTICS;
+
+typedef struct _NTFS_STATISTICS {
+ ULONG LogFileFullExceptions;
+ ULONG OtherExceptions;
+ ULONG MftReads;
+ ULONG MftReadBytes;
+ ULONG MftWrites;
+ ULONG MftWriteBytes;
+ struct {
+ USHORT Write;
+ USHORT Create;
+ USHORT SetInfo;
+ USHORT Flush;
+ } MftWritesUserLevel;
+ USHORT MftWritesFlushForLogFileFull;
+ USHORT MftWritesLazyWriter;
+ USHORT MftWritesUserRequest;
+ ULONG Mft2Writes;
+ ULONG Mft2WriteBytes;
+ struct {
+ USHORT Write;
+ USHORT Create;
+ USHORT SetInfo;
+ USHORT Flush;
+ } Mft2WritesUserLevel;
+ USHORT Mft2WritesFlushForLogFileFull;
+ USHORT Mft2WritesLazyWriter;
+ USHORT Mft2WritesUserRequest;
+ ULONG RootIndexReads;
+ ULONG RootIndexReadBytes;
+ ULONG RootIndexWrites;
+ ULONG RootIndexWriteBytes;
+ ULONG BitmapReads;
+ ULONG BitmapReadBytes;
+ ULONG BitmapWrites;
+ ULONG BitmapWriteBytes;
+ USHORT BitmapWritesFlushForLogFileFull;
+ USHORT BitmapWritesLazyWriter;
+ USHORT BitmapWritesUserRequest;
+ struct {
+ USHORT Write;
+ USHORT Create;
+ USHORT SetInfo;
+ } BitmapWritesUserLevel;
+ ULONG MftBitmapReads;
+ ULONG MftBitmapReadBytes;
+ ULONG MftBitmapWrites;
+ ULONG MftBitmapWriteBytes;
+ USHORT MftBitmapWritesFlushForLogFileFull;
+ USHORT MftBitmapWritesLazyWriter;
+ USHORT MftBitmapWritesUserRequest;
+ struct {
+ USHORT Write;
+ USHORT Create;
+ USHORT SetInfo;
+ USHORT Flush;
+ } MftBitmapWritesUserLevel;
+ ULONG UserIndexReads;
+ ULONG UserIndexReadBytes;
+ ULONG UserIndexWrites;
+ ULONG UserIndexWriteBytes;
+ ULONG LogFileReads;
+ ULONG LogFileReadBytes;
+ ULONG LogFileWrites;
+ ULONG LogFileWriteBytes;
+ struct {
+ ULONG Calls;
+ ULONG Clusters;
+ ULONG Hints;
+ ULONG RunsReturned;
+ ULONG HintsHonored;
+ ULONG HintsClusters;
+ ULONG Cache;
+ ULONG CacheClusters;
+ ULONG CacheMiss;
+ ULONG CacheMissClusters;
+ } Allocate;
+} NTFS_STATISTICS, *PNTFS_STATISTICS;
+
+#endif /* _FILESYSTEMFSCTL_ */
+
+#define SYMLINK_FLAG_RELATIVE 1
+
+typedef struct _REPARSE_DATA_BUFFER {
+ ULONG ReparseTag;
+ USHORT ReparseDataLength;
+ USHORT Reserved;
+ _ANONYMOUS_UNION union {
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ ULONG Flags;
+ WCHAR PathBuffer[1];
+ } SymbolicLinkReparseBuffer;
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ WCHAR PathBuffer[1];
+ } MountPointReparseBuffer;
+ struct {
+ UCHAR DataBuffer[1];
+ } GenericReparseBuffer;
+ } DUMMYUNIONNAME;
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+
+#define REPARSE_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_DATA_BUFFER, GenericReparseBuffer)
+
+typedef struct _REPARSE_GUID_DATA_BUFFER {
+ ULONG ReparseTag;
+ USHORT ReparseDataLength;
+ USHORT Reserved;
+ GUID ReparseGuid;
+ struct {
+ UCHAR DataBuffer[1];
+ } GenericReparseBuffer;
+} REPARSE_GUID_DATA_BUFFER, *PREPARSE_GUID_DATA_BUFFER;
+
+#define REPARSE_GUID_DATA_BUFFER_HEADER_SIZE FIELD_OFFSET(REPARSE_GUID_DATA_BUFFER, GenericReparseBuffer)
+
+#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE ( 16 * 1024 )
+
+/* Reserved reparse tags */
+#define IO_REPARSE_TAG_RESERVED_ZERO (0)
+#define IO_REPARSE_TAG_RESERVED_ONE (1)
+#define IO_REPARSE_TAG_RESERVED_RANGE IO_REPARSE_TAG_RESERVED_ONE
+
+#define IsReparseTagMicrosoft(_tag) (((_tag) & 0x80000000))
+#define IsReparseTagNameSurrogate(_tag) (((_tag) & 0x20000000))
+
+#define IO_REPARSE_TAG_VALID_VALUES (0xF000FFFF)
+
+#define IsReparseTagValid(tag) ( \
+ !((tag) & ~IO_REPARSE_TAG_VALID_VALUES) && \
+ ((tag) > IO_REPARSE_TAG_RESERVED_RANGE) \
+ )
+
+/* MicroSoft reparse point tags */
+#define IO_REPARSE_TAG_MOUNT_POINT (0xA0000003L)
+#define IO_REPARSE_TAG_HSM (0xC0000004L)
+#define IO_REPARSE_TAG_DRIVE_EXTENDER (0x80000005L)
+#define IO_REPARSE_TAG_HSM2 (0x80000006L)
+#define IO_REPARSE_TAG_SIS (0x80000007L)
+#define IO_REPARSE_TAG_WIM (0x80000008L)
+#define IO_REPARSE_TAG_CSV (0x80000009L)
+#define IO_REPARSE_TAG_DFS (0x8000000AL)
+#define IO_REPARSE_TAG_FILTER_MANAGER (0x8000000BL)
+#define IO_REPARSE_TAG_SYMLINK (0xA000000CL)
+#define IO_REPARSE_TAG_IIS_CACHE (0xA0000010L)
+#define IO_REPARSE_TAG_DFSR (0x80000012L)
+
+#pragma pack(4)
+typedef struct _REPARSE_INDEX_KEY {
+ ULONG FileReparseTag;
+ LARGE_INTEGER FileId;
+} REPARSE_INDEX_KEY, *PREPARSE_INDEX_KEY;
+#pragma pack()
+
+#define FSCTL_LMR_GET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,58,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define FSCTL_LMR_SET_LINK_TRACKING_INFORMATION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,59,METHOD_BUFFERED,FILE_ANY_ACCESS)
+#define IOCTL_LMR_ARE_FILE_OBJECTS_ON_SAME_SERVER CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM,60,METHOD_BUFFERED,FILE_ANY_ACCESS)
+
+#define FSCTL_PIPE_ASSIGN_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_DISCONNECT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_LISTEN CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_PEEK CTL_CODE(FILE_DEVICE_NAMED_PIPE, 3, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_QUERY_EVENT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 4, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 5, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_WAIT CTL_CODE(FILE_DEVICE_NAMED_PIPE, 6, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_IMPERSONATE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 7, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 8, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_QUERY_CLIENT_PROCESS CTL_CODE(FILE_DEVICE_NAMED_PIPE, 9, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_GET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 10, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_PIPE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 11, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_GET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 12, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_CONNECTION_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 13, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_GET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 14, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_SET_HANDLE_ATTRIBUTE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 15, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_PIPE_FLUSH CTL_CODE(FILE_DEVICE_NAMED_PIPE, 16, METHOD_BUFFERED, FILE_WRITE_DATA)
+
+#define FSCTL_PIPE_INTERNAL_READ CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2045, METHOD_BUFFERED, FILE_READ_DATA)
+#define FSCTL_PIPE_INTERNAL_WRITE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2046, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_TRANSCEIVE CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2047, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_PIPE_INTERNAL_READ_OVFLOW CTL_CODE(FILE_DEVICE_NAMED_PIPE, 2048, METHOD_BUFFERED, FILE_READ_DATA)
+
+#define FILE_PIPE_READ_DATA 0x00000000
+#define FILE_PIPE_WRITE_SPACE 0x00000001
+
+typedef struct _FILE_PIPE_ASSIGN_EVENT_BUFFER {
+ HANDLE EventHandle;
+ ULONG KeyValue;
+} FILE_PIPE_ASSIGN_EVENT_BUFFER, *PFILE_PIPE_ASSIGN_EVENT_BUFFER;
+
+typedef struct _FILE_PIPE_EVENT_BUFFER {
+ ULONG NamedPipeState;
+ ULONG EntryType;
+ ULONG ByteCount;
+ ULONG KeyValue;
+ ULONG NumberRequests;
+} FILE_PIPE_EVENT_BUFFER, *PFILE_PIPE_EVENT_BUFFER;
+
+typedef struct _FILE_PIPE_PEEK_BUFFER {
+ ULONG NamedPipeState;
+ ULONG ReadDataAvailable;
+ ULONG NumberOfMessages;
+ ULONG MessageLength;
+ CHAR Data[1];
+} FILE_PIPE_PEEK_BUFFER, *PFILE_PIPE_PEEK_BUFFER;
+
+typedef struct _FILE_PIPE_WAIT_FOR_BUFFER {
+ LARGE_INTEGER Timeout;
+ ULONG NameLength;
+ BOOLEAN TimeoutSpecified;
+ WCHAR Name[1];
+} FILE_PIPE_WAIT_FOR_BUFFER, *PFILE_PIPE_WAIT_FOR_BUFFER;
+
+typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER {
+#if !defined(BUILD_WOW6432)
+ PVOID ClientSession;
+ PVOID ClientProcess;
+#else
+ ULONGLONG ClientSession;
+ ULONGLONG ClientProcess;
+#endif
+} FILE_PIPE_CLIENT_PROCESS_BUFFER, *PFILE_PIPE_CLIENT_PROCESS_BUFFER;
+
+#define FILE_PIPE_COMPUTER_NAME_LENGTH 15
+
+typedef struct _FILE_PIPE_CLIENT_PROCESS_BUFFER_EX {
+#if !defined(BUILD_WOW6432)
+ PVOID ClientSession;
+ PVOID ClientProcess;
+#else
+ ULONGLONG ClientSession;
+ ULONGLONG ClientProcess;
+#endif
+ USHORT ClientComputerNameLength;
+ WCHAR ClientComputerBuffer[FILE_PIPE_COMPUTER_NAME_LENGTH+1];
+} FILE_PIPE_CLIENT_PROCESS_BUFFER_EX, *PFILE_PIPE_CLIENT_PROCESS_BUFFER_EX;
+
+#define FSCTL_MAILSLOT_PEEK CTL_CODE(FILE_DEVICE_MAILSLOT, 0, METHOD_NEITHER, FILE_READ_DATA)
+
+typedef enum _LINK_TRACKING_INFORMATION_TYPE {
+ NtfsLinkTrackingInformation,
+ DfsLinkTrackingInformation
+} LINK_TRACKING_INFORMATION_TYPE, *PLINK_TRACKING_INFORMATION_TYPE;
+
+typedef struct _LINK_TRACKING_INFORMATION {
+ LINK_TRACKING_INFORMATION_TYPE Type;
+ UCHAR VolumeId[16];
+} LINK_TRACKING_INFORMATION, *PLINK_TRACKING_INFORMATION;
+
+typedef struct _REMOTE_LINK_TRACKING_INFORMATION {
+ PVOID TargetFileObject;
+ ULONG TargetLinkTrackingInformationLength;
+ UCHAR TargetLinkTrackingInformationBuffer[1];
+} REMOTE_LINK_TRACKING_INFORMATION, *PREMOTE_LINK_TRACKING_INFORMATION;
+
+#define IO_OPEN_PAGING_FILE 0x0002
+#define IO_OPEN_TARGET_DIRECTORY 0x0004
+#define IO_STOP_ON_SYMLINK 0x0008
+#define IO_MM_PAGING_FILE 0x0010
+
+typedef VOID
+(NTAPI *PDRIVER_FS_NOTIFICATION) (
+ IN PDEVICE_OBJECT DeviceObject,
+ IN BOOLEAN FsActive);
+
+typedef enum _FS_FILTER_SECTION_SYNC_TYPE {
+ SyncTypeOther = 0,
+ SyncTypeCreateSection
+} FS_FILTER_SECTION_SYNC_TYPE, *PFS_FILTER_SECTION_SYNC_TYPE;
+
+typedef enum _FS_FILTER_STREAM_FO_NOTIFICATION_TYPE {
+ NotifyTypeCreate = 0,
+ NotifyTypeRetired
+} FS_FILTER_STREAM_FO_NOTIFICATION_TYPE, *PFS_FILTER_STREAM_FO_NOTIFICATION_TYPE;
+
+typedef union _FS_FILTER_PARAMETERS {
+ struct {
+ PLARGE_INTEGER EndingOffset;
+ PERESOURCE *ResourceToRelease;
+ } AcquireForModifiedPageWriter;
+ struct {
+ PERESOURCE ResourceToRelease;
+ } ReleaseForModifiedPageWriter;
+ struct {
+ FS_FILTER_SECTION_SYNC_TYPE SyncType;
+ ULONG PageProtection;
+ } AcquireForSectionSynchronization;
+ struct {
+ FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType;
+ BOOLEAN POINTER_ALIGNMENT SafeToRecurse;
+ } NotifyStreamFileObject;
+ struct {
+ PVOID Argument1;
+ PVOID Argument2;
+ PVOID Argument3;
+ PVOID Argument4;
+ PVOID Argument5;
+ } Others;
+} FS_FILTER_PARAMETERS, *PFS_FILTER_PARAMETERS;
+
+#define FS_FILTER_ACQUIRE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-1
+#define FS_FILTER_RELEASE_FOR_SECTION_SYNCHRONIZATION (UCHAR)-2
+#define FS_FILTER_ACQUIRE_FOR_MOD_WRITE (UCHAR)-3
+#define FS_FILTER_RELEASE_FOR_MOD_WRITE (UCHAR)-4
+#define FS_FILTER_ACQUIRE_FOR_CC_FLUSH (UCHAR)-5
+#define FS_FILTER_RELEASE_FOR_CC_FLUSH (UCHAR)-6
+
+typedef struct _FS_FILTER_CALLBACK_DATA {
+ ULONG SizeOfFsFilterCallbackData;
+ UCHAR Operation;
+ UCHAR Reserved;
+ struct _DEVICE_OBJECT *DeviceObject;
+ struct _FILE_OBJECT *FileObject;
+ FS_FILTER_PARAMETERS Parameters;
+} FS_FILTER_CALLBACK_DATA, *PFS_FILTER_CALLBACK_DATA;
+
+typedef NTSTATUS
+(NTAPI *PFS_FILTER_CALLBACK) (
+ IN PFS_FILTER_CALLBACK_DATA Data,
+ OUT PVOID *CompletionContext);
+
+typedef VOID
+(NTAPI *PFS_FILTER_COMPLETION_CALLBACK) (
+ IN PFS_FILTER_CALLBACK_DATA Data,
+ IN NTSTATUS OperationStatus,
+ IN PVOID CompletionContext);
+
+typedef struct _FS_FILTER_CALLBACKS {
+ ULONG SizeOfFsFilterCallbacks;
+ ULONG Reserved;
+ PFS_FILTER_CALLBACK PreAcquireForSectionSynchronization;
+ PFS_FILTER_COMPLETION_CALLBACK PostAcquireForSectionSynchronization;
+ PFS_FILTER_CALLBACK PreReleaseForSectionSynchronization;
+ PFS_FILTER_COMPLETION_CALLBACK PostReleaseForSectionSynchronization;
+ PFS_FILTER_CALLBACK PreAcquireForCcFlush;
+ PFS_FILTER_COMPLETION_CALLBACK PostAcquireForCcFlush;
+ PFS_FILTER_CALLBACK PreReleaseForCcFlush;
+ PFS_FILTER_COMPLETION_CALLBACK PostReleaseForCcFlush;
+ PFS_FILTER_CALLBACK PreAcquireForModifiedPageWriter;
+ PFS_FILTER_COMPLETION_CALLBACK PostAcquireForModifiedPageWriter;
+ PFS_FILTER_CALLBACK PreReleaseForModifiedPageWriter;
+ PFS_FILTER_COMPLETION_CALLBACK PostReleaseForModifiedPageWriter;
+} FS_FILTER_CALLBACKS, *PFS_FILTER_CALLBACKS;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlRegisterFileSystemFilterCallbacks(
+ IN struct _DRIVER_OBJECT *FilterDriverObject,
+ IN PFS_FILTER_CALLBACKS Callbacks);
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+FsRtlNotifyStreamFileObject(
+ IN struct _FILE_OBJECT * StreamFileObject,
+ IN struct _DEVICE_OBJECT *DeviceObjectHint OPTIONAL,
+ IN FS_FILTER_STREAM_FO_NOTIFICATION_TYPE NotificationType,
+ IN BOOLEAN SafeToRecurse);
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#define DO_VERIFY_VOLUME 0x00000002
+#define DO_BUFFERED_IO 0x00000004
+#define DO_EXCLUSIVE 0x00000008
+#define DO_DIRECT_IO 0x00000010
+#define DO_MAP_IO_BUFFER 0x00000020
+#define DO_DEVICE_HAS_NAME 0x00000040
+#define DO_DEVICE_INITIALIZING 0x00000080
+#define DO_SYSTEM_BOOT_PARTITION 0x00000100
+#define DO_LONG_TERM_REQUESTS 0x00000200
+#define DO_NEVER_LAST_DEVICE 0x00000400
+#define DO_SHUTDOWN_REGISTERED 0x00000800
+#define DO_BUS_ENUMERATED_DEVICE 0x00001000
+#define DO_POWER_PAGABLE 0x00002000
+#define DO_POWER_INRUSH 0x00004000
+#define DO_LOW_PRIORITY_FILESYSTEM 0x00010000
+#define DO_SUPPORTS_TRANSACTIONS 0x00040000
+#define DO_FORCE_NEITHER_IO 0x00080000
+#define DO_VOLUME_DEVICE_OBJECT 0x00100000
+#define DO_SYSTEM_SYSTEM_PARTITION 0x00200000
+#define DO_SYSTEM_CRITICAL_PARTITION 0x00400000
+#define DO_DISALLOW_EXECUTE 0x00800000
+
+extern KSPIN_LOCK IoStatisticsLock;
+extern ULONG IoReadOperationCount;
+extern ULONG IoWriteOperationCount;
+extern ULONG IoOtherOperationCount;
+extern LARGE_INTEGER IoReadTransferCount;
+extern LARGE_INTEGER IoWriteTransferCount;
+extern LARGE_INTEGER IoOtherTransferCount;
+
+#define IO_FILE_OBJECT_NON_PAGED_POOL_CHARGE 64
+#define IO_FILE_OBJECT_PAGED_POOL_CHARGE 1024
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+typedef struct _IO_PRIORITY_INFO {
+ ULONG Size;
+ ULONG ThreadPriority;
+ ULONG PagePriority;
+ IO_PRIORITY_HINT IoPriority;
+} IO_PRIORITY_INFO, *PIO_PRIORITY_INFO;
+#endif
+$endif (_NTIFS_)
diff --git a/include/xdk/kefuncs.h b/include/xdk/kefuncs.h
index 716ee872db8..27049e651ba 100644
--- a/include/xdk/kefuncs.h
+++ b/include/xdk/kefuncs.h
@@ -1,15 +1,6 @@
/******************************************************************************
* Kernel Functions *
******************************************************************************/
-$if (_NTDDK_)
-NTKERNELAPI
-VOID
-FASTCALL
-KeInvalidateRangeAllCaches(
- IN PVOID BaseAddress,
- IN ULONG Length);
-$endif
-
$if (_WDMDDK_)
NTKERNELAPI
VOID
@@ -24,10 +15,52 @@ VOID
NTAPI
KeClearEvent(
IN OUT PRKEVENT Event);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+
+NTKERNELAPI
+VOID
+FASTCALL
+KeInvalidateRangeAllCaches(
+ IN PVOID BaseAddress,
+ IN ULONG Length);
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTSTATUS
+NTAPI
+KeGetProcessorNumberFromIndex(
+ IN ULONG ProcIndex,
+ OUT PPROCESSOR_NUMBER ProcNumber);
+
+ULONG
+NTAPI
+KeGetProcessorIndexFromNumber(
+ IN PPROCESSOR_NUMBER ProcNumber);
+$endif (_NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WIN2K)
+$if (_WDMDDK_)
+#if defined(_NTDDK_) || defined(_NTIFS_)
+NTKERNELAPI
+VOID
+NTAPI
+ProbeForRead(
+ IN CONST VOID *Address, /* CONST is added */
+ IN SIZE_T Length,
+ IN ULONG Alignment);
+#endif /* defined(_NTDDK_) || defined(_NTIFS_) */
+
+NTKERNELAPI
+VOID
+NTAPI
+ProbeForWrite(
+ IN PVOID Address,
+ IN SIZE_T Length,
+ IN ULONG Alignment);
+
+$endif (_WDMDDK_)
$if (_NTDDK_)
NTKERNELAPI
VOID
@@ -67,30 +100,10 @@ VOID
NTAPI
KeBugCheck(
IN ULONG BugCheckCode);
-$endif /* _NTDDK_ */
-
-$if (_WDMDDK_)
-#if defined(_NTDDK_) || defined(_NTIFS_)
-NTKERNELAPI
-VOID
-NTAPI
-ProbeForRead(
- IN CONST VOID *Address, /* CONST is added */
- IN SIZE_T Length,
- IN ULONG Alignment);
-#endif /* defined(_NTDDK_) || defined(_NTIFS_) */
-
-NTKERNELAPI
-VOID
-NTAPI
-ProbeForWrite(
- IN PVOID Address,
- IN SIZE_T Length,
- IN ULONG Alignment);
-
-$endif /* _WDMDDK_ */
-
+$endif(_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#if defined(SINGLE_GROUP_LEGACY_API)
+$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -115,9 +128,9 @@ NTKERNELAPI
KAFFINITY
NTAPI
KeQueryActiveProcessors(VOID);
-$endif
-
+$endif (_WDMDDK_)
$if (_NTDDK_)
+
NTKERNELAPI
VOID
NTAPI
@@ -129,9 +142,10 @@ NTKERNELAPI
KAFFINITY
NTAPI
KeQueryActiveProcessors(VOID);
-$endif
-
+$endif (_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#endif /* defined(SINGLE_GROUP_LEGACY_API) */
+$endif
$if (_WDMDDK_)
#if !defined(_M_AMD64)
@@ -475,17 +489,127 @@ KeWaitForSingleObject(
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout OPTIONAL);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeMutant(
+ OUT PRKMUTANT Mutant,
+ IN BOOLEAN InitialOwner);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateMutant(
+ IN PRKMUTANT Mutant);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReleaseMutant(
+ IN OUT PRKMUTANT Mutant,
+ IN KPRIORITY Increment,
+ IN BOOLEAN Abandoned,
+ IN BOOLEAN Wait);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeInitializeQueue(
+ OUT PRKQUEUE Queue,
+ IN ULONG Count);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeReadStateQueue(
+ IN PRKQUEUE Queue);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeInsertQueue(
+ IN OUT PRKQUEUE Queue,
+ IN OUT PLIST_ENTRY Entry);
+
+NTKERNELAPI
+LONG
+NTAPI
+KeInsertHeadQueue(
+ IN OUT PRKQUEUE Queue,
+ IN OUT PLIST_ENTRY Entry);
+
+NTKERNELAPI
+PLIST_ENTRY
+NTAPI
+KeRemoveQueue(
+ IN OUT PRKQUEUE Queue,
+ IN KPROCESSOR_MODE WaitMode,
+ IN PLARGE_INTEGER Timeout OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeAttachProcess(
+ IN OUT PKPROCESS Process);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeDetachProcess(
+ VOID);
+
+NTKERNELAPI
+PLIST_ENTRY
+NTAPI
+KeRundownQueue(
+ IN OUT PRKQUEUE Queue);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeStackAttachProcess(
+ IN OUT PKPROCESS Process,
+ OUT PKAPC_STATE ApcState);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeUnstackDetachProcess(
+ IN PKAPC_STATE ApcState);
+
+NTKERNELAPI
+UCHAR
+NTAPI
+KeSetIdealProcessorThread(
+ IN OUT PKTHREAD Thread,
+ IN UCHAR Processor);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeSetKernelStackSwapEnable(
+ IN BOOLEAN Enable);
+
+#if defined(_X86_)
+NTHALAPI
+KIRQL
+FASTCALL
+KeAcquireSpinLockRaiseToSynch(
+ IN OUT PKSPIN_LOCK SpinLock);
+#else
+NTKERNELAPI
+KIRQL
+KeAcquireSpinLockRaiseToSynch(
+ IN OUT PKSPIN_LOCK SpinLock);
+#endif
$endif
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_WINXP)
-$if (_NTDDK_)
-NTKERNELAPI
-BOOLEAN
-NTAPI
-KeAreApcsDisabled(VOID);
-$endif
$if (_WDMDDK_)
_DECL_HAL_KE_IMPORT
@@ -550,7 +674,35 @@ VOID
FASTCALL
KeReleaseInStackQueuedSpinLock(
IN PKLOCK_QUEUE_HANDLE LockHandle);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+KeAreApcsDisabled(VOID);
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+_DECL_HAL_KE_IMPORT
+KIRQL
+FASTCALL
+KeAcquireQueuedSpinLock(
+ IN OUT KSPIN_LOCK_QUEUE_NUMBER Number);
+
+_DECL_HAL_KE_IMPORT
+VOID
+FASTCALL
+KeReleaseQueuedSpinLock(
+ IN OUT KSPIN_LOCK_QUEUE_NUMBER Number,
+ IN KIRQL OldIrql);
+
+_DECL_HAL_KE_IMPORT
+LOGICAL
+FASTCALL
+KeTryToAcquireQueuedSpinLock(
+ IN KSPIN_LOCK_QUEUE_NUMBER Number,
+ OUT PKIRQL OldIrql);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
@@ -580,9 +732,10 @@ VOID
NTAPI
KeFlushQueuedDpcs(VOID);
#endif /* (NTDDI_VERSION >= NTDDI_WINXPSP2) */
-$endif /* _WDMDDK_ */
-
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03)
+$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -631,38 +784,20 @@ BOOLEAN
FASTCALL
KeTestSpinLock(
IN PKSPIN_LOCK SpinLock);
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
$if (_NTDDK_)
NTKERNELAPI
BOOLEAN
NTAPI
KeInvalidateAllCaches(VOID);
-$endif /* _NTDDK_ */
-
+$endif (_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
-
+$endif
+$if (_WDMDDK_ || _NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
-
-$if (_NTDDK_)
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeExpandKernelStackAndCallout(
- IN PEXPAND_STACK_CALLOUT Callout,
- IN PVOID Parameter OPTIONAL,
- IN SIZE_T Size);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeEnterGuardedRegion(VOID);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeLeaveGuardedRegion(VOID);
-$endif /* _NTDDK_ */
+$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -721,12 +856,31 @@ BOOLEAN
FASTCALL
KeTryToAcquireGuardedMutex(
IN OUT PKGUARDED_MUTEX GuardedMutex);
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeExpandKernelStackAndCallout(
+ IN PEXPAND_STACK_CALLOUT Callout,
+ IN PVOID Parameter OPTIONAL,
+ IN SIZE_T Size);
+NTKERNELAPI
+VOID
+NTAPI
+KeEnterGuardedRegion(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeLeaveGuardedRegion(VOID);
+$endif (_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+$endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
$if (_WDMDDK_)
NTKERNELAPI
VOID
@@ -746,21 +900,10 @@ NTSTATUS
NTAPI
KeQueryDpcWatchdogInformation(
OUT PKDPC_WATCHDOG_INFORMATION WatchdogInformation);
-$endif /* _WDMDDK_ */
-
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#if defined(SINGLE_GROUP_LEGACY_API)
-$if (_NTDDK_)
-NTKERNELAPI
-ULONG
-NTAPI
-KeQueryActiveProcessorCount(
- OUT PKAFFINITY ActiveProcessors OPTIONAL);
-
-NTKERNELAPI
-ULONG
-NTAPI
-KeQueryMaximumProcessorCount(VOID);
-$endif /* _NTDDK_ */
+$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -785,8 +928,39 @@ NTKERNELAPI
ULONG
NTAPI
KeQueryMaximumProcessorCount(VOID);
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCount(
+ OUT PKAFFINITY ActiveProcessors OPTIONAL);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCount(VOID);
+$endif (_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#endif /* SINGLE_GROUP_LEGACY_API */
+$endif
+$if (_NTIFS_)
+NTKERNELAPI
+VOID
+KeQueryOwnerMutant(
+ IN PKMUTANT Mutant,
+ OUT PCLIENT_ID ClientId);
+
+NTKERNELAPI
+ULONG
+KeRemoveQueueEx (
+ IN OUT PKQUEUE Queue,
+ IN KPROCESSOR_MODE WaitMode,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Timeout OPTIONAL,
+ OUT PLIST_ENTRY *EntryArray,
+ IN ULONG Count);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
@@ -804,93 +978,10 @@ KeDeregisterProcessorChangeCallback(
IN PVOID CallbackHandle);
#endif /* (NTDDI_VERSION >= NTDDI_WS08) */
-$endif /* _WDMDDK_ */
-
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-$if (_NTDDK_)
-NTKERNELAPI
-ULONG
-NTAPI
-KeQueryActiveProcessorCountEx(
- IN USHORT GroupNumber);
-
-NTKERNELAPI
-ULONG
-NTAPI
-KeQueryMaximumProcessorCountEx(
- IN USHORT GroupNumber);
-
-NTKERNELAPI
-USHORT
-NTAPI
-KeQueryActiveGroupCount(VOID);
-
-NTKERNELAPI
-USHORT
-NTAPI
-KeQueryMaximumGroupCount(VOID);
-
-NTKERNELAPI
-KAFFINITY
-NTAPI
-KeQueryGroupAffinity(
- IN USHORT GroupNumber);
-
-NTKERNELAPI
-ULONG
-NTAPI
-KeGetCurrentProcessorNumberEx(
- OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
-
-NTKERNELAPI
-VOID
-NTAPI
-KeQueryNodeActiveAffinity(
- IN USHORT NodeNumber,
- OUT PGROUP_AFFINITY Affinity OPTIONAL,
- OUT PUSHORT Count OPTIONAL);
-
-NTKERNELAPI
-USHORT
-NTAPI
-KeQueryNodeMaximumProcessorCount(
- IN USHORT NodeNumber);
-
-NTKERNELAPI
-USHORT
-NTAPI
-KeQueryHighestNodeNumber(VOID);
-
-NTKERNELAPI
-USHORT
-NTAPI
-KeGetCurrentNodeNumber(VOID);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeQueryLogicalProcessorRelationship(
- IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
- IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
- OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
- IN OUT PULONG Length);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeSetHardwareCounterConfiguration(
- IN PHARDWARE_COUNTER CounterArray,
- IN ULONG Count);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-KeQueryHardwareCounterConfiguration(
- OUT PHARDWARE_COUNTER CounterArray,
- IN ULONG MaximumCount,
- OUT PULONG Count);
-$endif /* _NTDDK_ */
+$endif
$if (_WDMDDK_)
ULONG64
@@ -1030,10 +1121,93 @@ ULONG
NTAPI
KeGetProcessorIndexFromNumber(
IN PPROCESSOR_NUMBER ProcNumber);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryActiveProcessorCountEx(
+ IN USHORT GroupNumber);
+NTKERNELAPI
+ULONG
+NTAPI
+KeQueryMaximumProcessorCountEx(
+ IN USHORT GroupNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryActiveGroupCount(VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryMaximumGroupCount(VOID);
+
+NTKERNELAPI
+KAFFINITY
+NTAPI
+KeQueryGroupAffinity(
+ IN USHORT GroupNumber);
+
+NTKERNELAPI
+ULONG
+NTAPI
+KeGetCurrentProcessorNumberEx(
+ OUT PPROCESSOR_NUMBER ProcNumber OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+KeQueryNodeActiveAffinity(
+ IN USHORT NodeNumber,
+ OUT PGROUP_AFFINITY Affinity OPTIONAL,
+ OUT PUSHORT Count OPTIONAL);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryNodeMaximumProcessorCount(
+ IN USHORT NodeNumber);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeQueryHighestNodeNumber(VOID);
+
+NTKERNELAPI
+USHORT
+NTAPI
+KeGetCurrentNodeNumber(VOID);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryLogicalProcessorRelationship(
+ IN PPROCESSOR_NUMBER ProcessorNumber OPTIONAL,
+ IN LOGICAL_PROCESSOR_RELATIONSHIP RelationshipType,
+ OUT PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Information OPTIONAL,
+ IN OUT PULONG Length);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeSetHardwareCounterConfiguration(
+ IN PHARDWARE_COUNTER CounterArray,
+ IN ULONG Count);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+KeQueryHardwareCounterConfiguration(
+ OUT PHARDWARE_COUNTER CounterArray,
+ IN ULONG MaximumCount,
+ OUT PULONG Count);
+$endif (_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-
+$endif
$if (_WDMDDK_)
#if !defined(_IA64_)
NTHALAPI
@@ -1071,5 +1245,5 @@ KeFlushWriteBuffer(VOID);
#endif /* DBG */
#define PAGED_CODE_LOCKED() NOP_FUNCTION;
-$endif
+$endif (_WDMDDK_)
diff --git a/include/xdk/ketypes.h b/include/xdk/ketypes.h
index a4bb36303a2..ff80f3204e5 100644
--- a/include/xdk/ketypes.h
+++ b/include/xdk/ketypes.h
@@ -57,7 +57,7 @@ typedef struct _CACHE_DESCRIPTOR {
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
ULONG_PTR ProcessorMask;
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
- union {
+ _ANONYMOUS_UNION union {
struct {
UCHAR Flags;
} ProcessorCore;
@@ -65,7 +65,7 @@ typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
ULONG NodeNumber;
} NumaNode;
CACHE_DESCRIPTOR Cache;
- ULONGLONG Reserved[2];
+ ULONGLONG Reserved[2];
} DUMMYUNIONNAME;
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
@@ -109,7 +109,7 @@ typedef struct _GROUP_RELATIONSHIP {
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
ULONG Size;
- union {
+ _ANONYMOUS_UNION union {
PROCESSOR_RELATIONSHIP Processor;
NUMA_NODE_RELATIONSHIP NumaNode;
CACHE_RELATIONSHIP Cache;
@@ -679,13 +679,13 @@ typedef struct _KDEVICE_QUEUE {
LIST_ENTRY DeviceListHead;
KSPIN_LOCK Lock;
#if defined(_AMD64_)
- union {
+ _ANONYMOUS_UNION union {
BOOLEAN Busy;
- struct {
+ _ANONYMOUS_STRUCT struct {
LONG64 Reserved:8;
LONG64 Hint:56;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
#else
BOOLEAN Busy;
#endif
@@ -785,13 +785,13 @@ typedef struct _KGUARDED_MUTEX {
PKTHREAD Owner;
ULONG Contention;
KGATE Gate;
- __GNU_EXTENSION union {
- __GNU_EXTENSION struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
SHORT KernelApcDisable;
SHORT SpecialApcDisable;
- };
+ } DUMMYSTRUCTNAME;
ULONG CombinedApcDisable;
- };
+ } DUMMYUNIONNAME;
} KGUARDED_MUTEX, *PKGUARDED_MUTEX;
typedef struct _KMUTANT {
@@ -942,8 +942,8 @@ typedef struct _XSTATE_SAVE {
#elif defined(_IA64_)
ULONG Dummy;
#elif defined(_X86_)
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
LONG64 Reserved1;
ULONG Reserved2;
struct _XSTATE_SAVE* Prev;
@@ -951,9 +951,9 @@ typedef struct _XSTATE_SAVE {
struct _KTHREAD* Thread;
PVOID Reserved4;
UCHAR Level;
- };
+ } DUMMYSTRUCTNAME;
XSTATE_CONTEXT XStateContext;
- };
+ } DUMMYUNIONNAME;
#endif
} XSTATE_SAVE, *PXSTATE_SAVE;
@@ -1094,9 +1094,9 @@ typedef struct _KUSER_SHARED_DATA {
ULONG NumberOfPhysicalPages;
BOOLEAN SafeBootMode;
#if (NTDDI_VERSION >= NTDDI_WIN7)
- union {
+ _ANONYMOUS_UNION union {
UCHAR TscQpcData;
- struct {
+ _ANONYMOUS_STRUCT struct {
UCHAR TscQpcEnabled:1;
UCHAR TscQpcSpareFlag:1;
UCHAR TscQpcShift:6;
@@ -1105,9 +1105,9 @@ typedef struct _KUSER_SHARED_DATA {
UCHAR TscQpcPad[2];
#endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
- union {
+ _ANONYMOUS_UNION union {
ULONG SharedDataFlags;
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG DbgErrorPortPresent:1;
ULONG DbgElevationEnabled:1;
ULONG DbgVirtEnabled:1;
diff --git a/include/xdk/mmfuncs.h b/include/xdk/mmfuncs.h
index b714f97845a..f3a0cea81c2 100644
--- a/include/xdk/mmfuncs.h
+++ b/include/xdk/mmfuncs.h
@@ -174,185 +174,21 @@ $if (_WDMDDK_)
ASSERT(((_Mdl)->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA) == 0); \
} \
}
-$endif
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+
+FORCEINLINE
+ULONG
+HEAP_MAKE_TAG_FLAGS(
+ IN ULONG TagBase,
+ IN ULONG Tag)
+{
+ //__assume_bound(TagBase); // FIXME
+ return ((ULONG)((TagBase) + ((Tag) << HEAP_TAG_SHIFT)));
+}
+$endif (_NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-$if (_NTDDK_)
-NTKERNELAPI
-PPHYSICAL_MEMORY_RANGE
-NTAPI
-MmGetPhysicalMemoryRanges(VOID);
-
-NTKERNELAPI
-PHYSICAL_ADDRESS
-NTAPI
-MmGetPhysicalAddress(
- IN PVOID BaseAddress);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsNonPagedSystemAddressValid(
- IN PVOID VirtualAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateNonCachedMemory(
- IN SIZE_T NumberOfBytes);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeNonCachedMemory(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmGetVirtualForPhysical(
- IN PHYSICAL_ADDRESS PhysicalAddress);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapUserAddressesToPage(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes,
- IN PVOID PageAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmMapVideoDisplay(
- IN PHYSICAL_ADDRESS PhysicalAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheType);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapViewInSessionSpace(
- IN PVOID Section,
- OUT PVOID *MappedBase,
- IN OUT PSIZE_T ViewSize);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmMapViewInSystemSpace(
- IN PVOID Section,
- OUT PVOID *MappedBase,
- IN OUT PSIZE_T ViewSize);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsAddressValid(
- IN PVOID VirtualAddress);
-
-NTKERNELAPI
-BOOLEAN
-NTAPI
-MmIsThisAnNtAsSystem(VOID);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmLockPagableSectionByHandle(
- IN PVOID ImageSectionHandle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmUnmapViewInSessionSpace(
- IN PVOID MappedBase);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmUnmapViewInSystemSpace(
- IN PVOID MappedBase);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnsecureVirtualMemory(
- IN HANDLE SecureHandle);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmRemovePhysicalMemory(
- IN PPHYSICAL_ADDRESS StartAddress,
- IN OUT PLARGE_INTEGER NumberOfBytes);
-
-NTKERNELAPI
-HANDLE
-NTAPI
-MmSecureVirtualMemory(
- IN PVOID Address,
- IN SIZE_T Size,
- IN ULONG ProbeMode);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmUnmapVideoDisplay(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes);
-
-NTKERNELAPI
-NTSTATUS
-NTAPI
-MmAddPhysicalMemory(
- IN PPHYSICAL_ADDRESS StartAddress,
- IN OUT PLARGE_INTEGER NumberOfBytes);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateContiguousMemory(
- IN SIZE_T NumberOfBytes,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateContiguousMemorySpecifyCache(
- IN SIZE_T NumberOfBytes,
- IN PHYSICAL_ADDRESS LowestAcceptableAddress,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress,
- IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
- IN MEMORY_CACHING_TYPE CacheType);
-
-NTKERNELAPI
-PVOID
-NTAPI
-MmAllocateContiguousMemorySpecifyCacheNode(
- IN SIZE_T NumberOfBytes,
- IN PHYSICAL_ADDRESS LowestAcceptableAddress,
- IN PHYSICAL_ADDRESS HighestAcceptableAddress,
- IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
- IN MEMORY_CACHING_TYPE CacheType,
- IN NODE_REQUIREMENT PreferredNode);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeContiguousMemory(
- IN PVOID BaseAddress);
-
-NTKERNELAPI
-VOID
-NTAPI
-MmFreeContiguousMemorySpecifyCache(
- IN PVOID BaseAddress,
- IN SIZE_T NumberOfBytes,
- IN MEMORY_CACHING_TYPE CacheType);
-$endif
-
$if (_WDMDDK_)
NTKERNELAPI
PVOID
@@ -536,12 +372,227 @@ MmAllocateContiguousMemorySpecifyCacheNode(
IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
IN MEMORY_CACHING_TYPE CacheType,
IN NODE_REQUIREMENT PreferredNode);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+
+NTKERNELAPI
+PPHYSICAL_MEMORY_RANGE
+NTAPI
+MmGetPhysicalMemoryRanges(VOID);
+
+NTKERNELAPI
+PHYSICAL_ADDRESS
+NTAPI
+MmGetPhysicalAddress(
+ IN PVOID BaseAddress);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsNonPagedSystemAddressValid(
+ IN PVOID VirtualAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateNonCachedMemory(
+ IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeNonCachedMemory(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmGetVirtualForPhysical(
+ IN PHYSICAL_ADDRESS PhysicalAddress);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapUserAddressesToPage(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes,
+ IN PVOID PageAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmMapVideoDisplay(
+ IN PHYSICAL_ADDRESS PhysicalAddress,
+ IN SIZE_T NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapViewInSessionSpace(
+ IN PVOID Section,
+ OUT PVOID *MappedBase,
+ IN OUT PSIZE_T ViewSize);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmMapViewInSystemSpace(
+ IN PVOID Section,
+ OUT PVOID *MappedBase,
+ IN OUT PSIZE_T ViewSize);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsAddressValid(
+ IN PVOID VirtualAddress);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsThisAnNtAsSystem(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmLockPagableSectionByHandle(
+ IN PVOID ImageSectionHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmUnmapViewInSessionSpace(
+ IN PVOID MappedBase);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmUnmapViewInSystemSpace(
+ IN PVOID MappedBase);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnsecureVirtualMemory(
+ IN HANDLE SecureHandle);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmRemovePhysicalMemory(
+ IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+MmSecureVirtualMemory(
+ IN PVOID Address,
+ IN SIZE_T Size,
+ IN ULONG ProbeMode);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmUnmapVideoDisplay(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmAddPhysicalMemory(
+ IN PPHYSICAL_ADDRESS StartAddress,
+ IN OUT PLARGE_INTEGER NumberOfBytes);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemory(
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCache(
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+ IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+ IN MEMORY_CACHING_TYPE CacheType);
+
+NTKERNELAPI
+PVOID
+NTAPI
+MmAllocateContiguousMemorySpecifyCacheNode(
+ IN SIZE_T NumberOfBytes,
+ IN PHYSICAL_ADDRESS LowestAcceptableAddress,
+ IN PHYSICAL_ADDRESS HighestAcceptableAddress,
+ IN PHYSICAL_ADDRESS BoundaryAddressMultiple OPTIONAL,
+ IN MEMORY_CACHING_TYPE CacheType,
+ IN NODE_REQUIREMENT PreferredNode);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemory(
+ IN PVOID BaseAddress);
+
+NTKERNELAPI
+VOID
+NTAPI
+MmFreeContiguousMemorySpecifyCache(
+ IN PVOID BaseAddress,
+ IN SIZE_T NumberOfBytes,
+ IN MEMORY_CACHING_TYPE CacheType);
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmIsRecursiveIoFault(
+ VOID);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmForceSectionClosed(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN BOOLEAN DelayClose);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmFlushImageSection(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN MMFLUSH_TYPE FlushType);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmCanFileBeTruncated(
+ IN PSECTION_OBJECT_POINTERS SectionObjectPointer,
+ IN PLARGE_INTEGER NewFileSize OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+MmSetAddressRangeModified(
+ IN PVOID Address,
+ IN SIZE_T Length);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+$if (_WDMDDK_ || _NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WINXP)
+$endif
+$if (_WDMDDK_)
NTKERNELAPI
NTSTATUS
NTAPI
@@ -599,15 +650,22 @@ NTAPI
MmAddVerifierThunks(
IN PVOID ThunkBuffer,
IN ULONG ThunkBufferSize);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
-#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
-
-#if (NTDDI_VERSION >= NTDDI_WS03)
-$if (_NTDDK_)
NTKERNELAPI
NTSTATUS
NTAPI
-MmCreateMirror(VOID);
+MmPrefetchPages(
+ IN ULONG NumberOfLists,
+ IN PREAD_LIST *ReadLists);
+$endif (_NTIFS_)
+
+$if (_WDMDDK_ || _NTIFS_)
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+$endif
+$if (_WDMDDK_ || _NTDDK_)
+#if (NTDDI_VERSION >= NTDDI_WS03)
$endif
$if (_WDMDDK_)
NTKERNELAPI
@@ -616,9 +674,17 @@ NTAPI
MmIsIoSpaceActive(
IN PHYSICAL_ADDRESS StartAddress,
IN SIZE_T NumberOfBytes);
-$endif
-#endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+MmCreateMirror(VOID);
+$endif (_NTDDK_)
+$if (_WDMDDK_ || _NTDDK_)
+#endif /* (NTDDI_VERSION >= NTDDI_WS03) */
+$endif
$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
NTKERNELAPI
@@ -635,6 +701,13 @@ MmAllocatePagesForMdlEx(
$endif
#if (NTDDI_VERSION >= NTDDI_VISTA)
+$if (_WDMDDK_)
+NTKERNELAPI
+LOGICAL
+NTAPI
+MmIsDriverVerifyingByAddress(
+ IN PVOID AddressWithinSection);
+$endif (_WDMDDK_)
$if (_NTDDK_)
NTSTATUS
NTAPI
@@ -645,14 +718,14 @@ MmRotatePhysicalView(
IN MM_ROTATE_DIRECTION Direction,
IN PMM_ROTATE_COPY_CALLBACK_FUNCTION CopyFunction,
IN PVOID Context OPTIONAL);
-$endif
+$endif (_NTDDK_)
+$if (_NTIFS_)
-$if (_WDMDDK_)
NTKERNELAPI
-LOGICAL
+ULONG
NTAPI
-MmIsDriverVerifyingByAddress(
- IN PVOID AddressWithinSection);
-$endif
-#endif
+MmDoesFileHaveUserWritableReferences(
+ IN PSECTION_OBJECT_POINTERS SectionPointer);
+$endif (_NTIFS_)
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
diff --git a/include/xdk/mmtypes.h b/include/xdk/mmtypes.h
index e4a23f48215..e7b248c9234 100644
--- a/include/xdk/mmtypes.h
+++ b/include/xdk/mmtypes.h
@@ -32,16 +32,15 @@ typedef ULONG NODE_REQUIREMENT;
#define MDL_ALLOCATED_MUST_SUCCEED 0x4000
#define MDL_INTERNAL 0x8000
-#define MDL_MAPPING_FLAGS ( \
- MDL_MAPPED_TO_SYSTEM_VA | \
- MDL_PAGES_LOCKED | \
- MDL_SOURCE_IS_NONPAGED_POOL | \
- MDL_PARTIAL_HAS_BEEN_MAPPED | \
- MDL_PARENT_MAPPED_SYSTEM_VA | \
- MDL_SYSTEM_VA | \
- MDL_IO_SPACE)
+#define MDL_MAPPING_FLAGS (MDL_MAPPED_TO_SYSTEM_VA | \
+ MDL_PAGES_LOCKED | \
+ MDL_SOURCE_IS_NONPAGED_POOL | \
+ MDL_PARTIAL_HAS_BEEN_MAPPED | \
+ MDL_PARENT_MAPPED_SYSTEM_VA | \
+ MDL_SYSTEM_VA | \
+ MDL_IO_SPACE)
-#define FLUSH_MULTIPLE_MAXIMUM 32
+#define FLUSH_MULTIPLE_MAXIMUM 32
/* Section access rights */
#define SECTION_QUERY 0x0001
@@ -51,17 +50,17 @@ typedef ULONG NODE_REQUIREMENT;
#define SECTION_EXTEND_SIZE 0x0010
#define SECTION_MAP_EXECUTE_EXPLICIT 0x0020
-#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY|\
- SECTION_MAP_WRITE | \
- SECTION_MAP_READ | \
- SECTION_MAP_EXECUTE | \
+#define SECTION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED|SECTION_QUERY| \
+ SECTION_MAP_WRITE | \
+ SECTION_MAP_READ | \
+ SECTION_MAP_EXECUTE | \
SECTION_EXTEND_SIZE)
-#define SESSION_QUERY_ACCESS 0x0001
-#define SESSION_MODIFY_ACCESS 0x0002
+#define SESSION_QUERY_ACCESS 0x0001
+#define SESSION_MODIFY_ACCESS 0x0002
#define SESSION_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | \
- SESSION_QUERY_ACCESS | \
+ SESSION_QUERY_ACCESS | \
SESSION_MODIFY_ACCESS)
#define SEGMENT_ALL_ACCESS SECTION_ALL_ACCESS
@@ -145,7 +144,7 @@ typedef enum _MM_SYSTEM_SIZE {
extern NTKERNELAPI BOOLEAN Mm64BitPhysicalAddress;
extern PVOID MmBadPointer;
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
$if (_NTDDK_)
typedef struct _PHYSICAL_MEMORY_RANGE {
@@ -167,5 +166,81 @@ typedef enum _MM_ROTATE_DIRECTION {
MmMaximumRotateDirection
} MM_ROTATE_DIRECTION, *PMM_ROTATE_DIRECTION;
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
+$if (_NTIFS_)
+typedef enum _MMFLUSH_TYPE {
+ MmFlushForDelete,
+ MmFlushForWrite
+} MMFLUSH_TYPE;
+
+typedef struct _READ_LIST {
+ PFILE_OBJECT FileObject;
+ ULONG NumberOfEntries;
+ LOGICAL IsImage;
+ FILE_SEGMENT_ELEMENT List[ANYSIZE_ARRAY];
+} READ_LIST, *PREAD_LIST;
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+typedef union _MM_PREFETCH_FLAGS {
+ struct {
+ ULONG Priority : SYSTEM_PAGE_PRIORITY_BITS;
+ ULONG RepurposePriority : SYSTEM_PAGE_PRIORITY_BITS;
+ } Flags;
+ ULONG AllFlags;
+} MM_PREFETCH_FLAGS, *PMM_PREFETCH_FLAGS;
+
+#define MM_PREFETCH_FLAGS_MASK ((1 << (2*SYSTEM_PAGE_PRIORITY_BITS)) - 1)
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#define HEAP_NO_SERIALIZE 0x00000001
+#define HEAP_GROWABLE 0x00000002
+#define HEAP_GENERATE_EXCEPTIONS 0x00000004
+#define HEAP_ZERO_MEMORY 0x00000008
+#define HEAP_REALLOC_IN_PLACE_ONLY 0x00000010
+#define HEAP_TAIL_CHECKING_ENABLED 0x00000020
+#define HEAP_FREE_CHECKING_ENABLED 0x00000040
+#define HEAP_DISABLE_COALESCE_ON_FREE 0x00000080
+
+#define HEAP_CREATE_ALIGN_16 0x00010000
+#define HEAP_CREATE_ENABLE_TRACING 0x00020000
+#define HEAP_CREATE_ENABLE_EXECUTE 0x00040000
+
+#define HEAP_SETTABLE_USER_VALUE 0x00000100
+#define HEAP_SETTABLE_USER_FLAG1 0x00000200
+#define HEAP_SETTABLE_USER_FLAG2 0x00000400
+#define HEAP_SETTABLE_USER_FLAG3 0x00000800
+#define HEAP_SETTABLE_USER_FLAGS 0x00000E00
+
+#define HEAP_CLASS_0 0x00000000
+#define HEAP_CLASS_1 0x00001000
+#define HEAP_CLASS_2 0x00002000
+#define HEAP_CLASS_3 0x00003000
+#define HEAP_CLASS_4 0x00004000
+#define HEAP_CLASS_5 0x00005000
+#define HEAP_CLASS_6 0x00006000
+#define HEAP_CLASS_7 0x00007000
+#define HEAP_CLASS_8 0x00008000
+#define HEAP_CLASS_MASK 0x0000F000
+
+#define HEAP_MAXIMUM_TAG 0x0FFF
+#define HEAP_GLOBAL_TAG 0x0800
+#define HEAP_PSEUDO_TAG_FLAG 0x8000
+#define HEAP_TAG_SHIFT 18
+#define HEAP_TAG_MASK (HEAP_MAXIMUM_TAG << HEAP_TAG_SHIFT)
+
+#define HEAP_CREATE_VALID_MASK (HEAP_NO_SERIALIZE | \
+ HEAP_GROWABLE | \
+ HEAP_GENERATE_EXCEPTIONS | \
+ HEAP_ZERO_MEMORY | \
+ HEAP_REALLOC_IN_PLACE_ONLY | \
+ HEAP_TAIL_CHECKING_ENABLED | \
+ HEAP_FREE_CHECKING_ENABLED | \
+ HEAP_DISABLE_COALESCE_ON_FREE | \
+ HEAP_CLASS_MASK | \
+ HEAP_CREATE_ALIGN_16 | \
+ HEAP_CREATE_ENABLE_TRACING | \
+ HEAP_CREATE_ENABLE_EXECUTE)
+$endif (_NTIFS_)
diff --git a/include/xdk/ntddk.template.h b/include/xdk/ntddk.template.h
index 003e9b7397d..90d8a1afd2b 100644
--- a/include/xdk/ntddk.template.h
+++ b/include/xdk/ntddk.template.h
@@ -40,11 +40,8 @@
#include
#include
#include
-
-/* FIXME
#include
#include
-*/
#include // FIXME
#include // FIXME
@@ -136,9 +133,9 @@ $include (zwfuncs.h)
/* UNSORTED */
-#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
- ((ConditionMask) = VerSetConditionMask((ConditionMask), \
- (TypeBitMask), (ComparisonType)))
+#define VER_SET_CONDITION(ConditionMask, TypeBitMask, ComparisonType) \
+ ((ConditionMask) = VerSetConditionMask((ConditionMask), \
+ (TypeBitMask), (ComparisonType)))
#if (NTDDI_VERSION >= NTDDI_WIN2K)
NTSYSAPI
@@ -209,28 +206,28 @@ typedef struct _DRIVER_VERIFIER_THUNK_PAIRS {
#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V 0x3
#define SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED \
- (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
+ (1UL << SHARED_GLOBAL_FLAGS_INSTALLER_DETECT_ENABLED_V)
#define SHARED_GLOBAL_FLAGS_SPARE_V 0x4
#define SHARED_GLOBAL_FLAGS_SPARE \
- (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
+ (1UL << SHARED_GLOBAL_FLAGS_SPARE_V)
#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V 0x5
#define SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED \
- (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
+ (1UL << SHARED_GLOBAL_FLAGS_DYNAMIC_PROC_ENABLED_V)
#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V 0x6
#define SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED \
- (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
+ (1UL << SHARED_GLOBAL_FLAGS_SEH_VALIDATION_ENABLED_V)
#define EX_INIT_BITS(Flags, Bit) \
- *((Flags)) |= (Bit) // Safe to use before concurrently accessible
+ *((Flags)) |= (Bit) // Safe to use before concurrently accessible
#define EX_TEST_SET_BIT(Flags, Bit) \
- InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
+ InterlockedBitTestAndSet ((PLONG)(Flags), (Bit))
#define EX_TEST_CLEAR_BIT(Flags, Bit) \
- InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
+ InterlockedBitTestAndReset ((PLONG)(Flags), (Bit))
#define PCCARD_MAP_ERROR 0x01
#define PCCARD_DEVICE_PCI 0x10
@@ -255,8 +252,6 @@ FsRtlIsTotalDeviceFailure(
IN NTSTATUS Status);
#endif
-/* FIXME : These definitions below doesn't belong to NTDDK */
-
#ifdef __cplusplus
}
#endif
diff --git a/include/xdk/ntifs.template.h b/include/xdk/ntifs.template.h
new file mode 100644
index 00000000000..d374331a2db
--- /dev/null
+++ b/include/xdk/ntifs.template.h
@@ -0,0 +1,2113 @@
+/*
+ * ntifs.h
+ *
+ * Windows NT Filesystem Driver Developer Kit
+ *
+ * This file is part of the ReactOS DDK package.
+ *
+ * Contributors:
+ * Amine Khaldi
+ * Timo Kreuzer (timo.kreuzer@reactos.org)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ */
+
+#pragma once
+
+#define _NTIFS_INCLUDED_
+#define _GNU_NTIFS_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Dependencies */
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+$define (_NTIFS_)
+
+#ifndef FlagOn
+#define FlagOn(_F,_SF) ((_F) & (_SF))
+#endif
+
+#ifndef BooleanFlagOn
+#define BooleanFlagOn(F,SF) ((BOOLEAN)(((F) & (SF)) != 0))
+#endif
+
+#ifndef SetFlag
+#define SetFlag(_F,_SF) ((_F) |= (_SF))
+#endif
+
+#ifndef ClearFlag
+#define ClearFlag(_F,_SF) ((_F) &= ~(_SF))
+#endif
+
+typedef UNICODE_STRING LSA_UNICODE_STRING, *PLSA_UNICODE_STRING;
+typedef STRING LSA_STRING, *PLSA_STRING;
+typedef OBJECT_ATTRIBUTES LSA_OBJECT_ATTRIBUTES, *PLSA_OBJECT_ATTRIBUTES;
+
+$include (setypes.h)
+$include (rtltypes.h)
+$include (rtlfuncs.h)
+
+typedef enum _OBJECT_INFORMATION_CLASS {
+ ObjectBasicInformation = 0,
+ ObjectNameInformation = 1, /* FIXME, not in WDK */
+ ObjectTypeInformation = 2,
+ ObjectTypesInformation = 3, /* FIXME, not in WDK */
+ ObjectHandleFlagInformation = 4, /* FIXME, not in WDK */
+ ObjectSessionInformation = 5, /* FIXME, not in WDK */
+ MaxObjectInfoClass /* FIXME, not in WDK */
+} OBJECT_INFORMATION_CLASS;
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryObject(
+ IN HANDLE Handle OPTIONAL,
+ IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
+ OUT PVOID ObjectInformation OPTIONAL,
+ IN ULONG ObjectInformationLength,
+ OUT PULONG ReturnLength OPTIONAL);
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenThreadToken(
+ IN HANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN OpenAsSelf,
+ OUT PHANDLE TokenHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenProcessToken(
+ IN HANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE TokenHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryInformationToken(
+ IN HANDLE TokenHandle,
+ IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+ OUT PVOID TokenInformation OPTIONAL,
+ IN ULONG TokenInformationLength,
+ OUT PULONG ReturnLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAdjustPrivilegesToken(
+ IN HANDLE TokenHandle,
+ IN BOOLEAN DisableAllPrivileges,
+ IN PTOKEN_PRIVILEGES NewState OPTIONAL,
+ IN ULONG BufferLength,
+ OUT PTOKEN_PRIVILEGES PreviousState,
+ OUT PULONG ReturnLength OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtCreateFile(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER AllocationSize OPTIONAL,
+ IN ULONG FileAttributes,
+ IN ULONG ShareAccess,
+ IN ULONG CreateDisposition,
+ IN ULONG CreateOptions,
+ IN PVOID EaBuffer,
+ IN ULONG EaLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtDeviceIoControlFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG IoControlCode,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtFsControlFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG FsControlCode,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtLockFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PLARGE_INTEGER Length,
+ IN ULONG Key,
+ IN BOOLEAN FailImmediately,
+ IN BOOLEAN ExclusiveLock);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenFile(
+ OUT PHANDLE FileHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG ShareAccess,
+ IN ULONG OpenOptions);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryDirectoryFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PUNICODE_STRING FileName OPTIONAL,
+ IN BOOLEAN RestartScan);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryQuotaInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PVOID SidList,
+ IN ULONG SidListLength,
+ IN PSID StartSid OPTIONAL,
+ IN BOOLEAN RestartScan);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQueryVolumeInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FsInformation,
+ IN ULONG Length,
+ IN FS_INFORMATION_CLASS FsInformationClass);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtReadFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN PLARGE_INTEGER ByteOffset OPTIONAL,
+ IN PULONG Key OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetQuotaInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID Buffer,
+ IN ULONG Length);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetVolumeInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID FsInformation,
+ IN ULONG Length,
+ IN FS_INFORMATION_CLASS FsInformationClass);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtWriteFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID Buffer,
+ IN ULONG Length,
+ IN PLARGE_INTEGER ByteOffset OPTIONAL,
+ IN PULONG Key OPTIONAL);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtUnlockFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PLARGE_INTEGER Length,
+ IN ULONG Key);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetSecurityObject(
+ IN HANDLE Handle,
+ IN SECURITY_INFORMATION SecurityInformation,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtQuerySecurityObject(
+ IN HANDLE Handle,
+ IN SECURITY_INFORMATION SecurityInformation,
+ OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN ULONG Length,
+ OUT PULONG LengthNeeded);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtClose(
+ IN HANDLE Handle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAllocateVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN ULONG_PTR ZeroBits,
+ IN OUT PSIZE_T RegionSize,
+ IN ULONG AllocationType,
+ IN ULONG Protect);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtFreeVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN OUT PSIZE_T RegionSize,
+ IN ULONG FreeType);
+
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenThreadTokenEx(
+ IN HANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN OpenAsSelf,
+ IN ULONG HandleAttributes,
+ OUT PHANDLE TokenHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenProcessTokenEx(
+ IN HANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG HandleAttributes,
+ OUT PHANDLE TokenHandle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+NtOpenJobObjectToken(
+ IN HANDLE JobHandle,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE TokenHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtDuplicateToken(
+ IN HANDLE ExistingTokenHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN EffectiveOnly,
+ IN TOKEN_TYPE TokenType,
+ OUT PHANDLE NewTokenHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtFilterToken(
+ IN HANDLE ExistingTokenHandle,
+ IN ULONG Flags,
+ IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
+ IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
+ IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
+ OUT PHANDLE NewTokenHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtImpersonateAnonymousToken(
+ IN HANDLE ThreadHandle);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetInformationToken(
+ IN HANDLE TokenHandle,
+ IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+ IN PVOID TokenInformation,
+ IN ULONG TokenInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAdjustGroupsToken(
+ IN HANDLE TokenHandle,
+ IN BOOLEAN ResetToDefault,
+ IN PTOKEN_GROUPS NewState OPTIONAL,
+ IN ULONG BufferLength OPTIONAL,
+ OUT PTOKEN_GROUPS PreviousState,
+ OUT PULONG ReturnLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtPrivilegeCheck(
+ IN HANDLE ClientToken,
+ IN OUT PPRIVILEGE_SET RequiredPrivileges,
+ OUT PBOOLEAN Result);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAccessCheckAndAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PUNICODE_STRING ObjectName,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN ACCESS_MASK DesiredAccess,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN BOOLEAN ObjectCreation,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PNTSTATUS AccessStatus,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAccessCheckByTypeAndAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId,
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PUNICODE_STRING ObjectName,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID PrincipalSelfSid OPTIONAL,
+ IN ACCESS_MASK DesiredAccess,
+ IN AUDIT_EVENT_TYPE AuditType,
+ IN ULONG Flags,
+ IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
+ IN ULONG ObjectTypeLength,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN BOOLEAN ObjectCreation,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PNTSTATUS AccessStatus,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtAccessCheckByTypeResultListAndAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PUNICODE_STRING ObjectName,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID PrincipalSelfSid OPTIONAL,
+ IN ACCESS_MASK DesiredAccess,
+ IN AUDIT_EVENT_TYPE AuditType,
+ IN ULONG Flags,
+ IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
+ IN ULONG ObjectTypeLength,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN BOOLEAN ObjectCreation,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PNTSTATUS AccessStatus,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTSTATUS
+NTAPI
+NtAccessCheckByTypeResultListAndAuditAlarmByHandle(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN HANDLE ClientToken,
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PUNICODE_STRING ObjectName,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID PrincipalSelfSid OPTIONAL,
+ IN ACCESS_MASK DesiredAccess,
+ IN AUDIT_EVENT_TYPE AuditType,
+ IN ULONG Flags,
+ IN POBJECT_TYPE_LIST ObjectTypeList OPTIONAL,
+ IN ULONG ObjectTypeLength,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN BOOLEAN ObjectCreation,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PNTSTATUS AccessStatus,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtOpenObjectAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PUNICODE_STRING ObjectName,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL,
+ IN HANDLE ClientToken,
+ IN ACCESS_MASK DesiredAccess,
+ IN ACCESS_MASK GrantedAccess,
+ IN PPRIVILEGE_SET Privileges OPTIONAL,
+ IN BOOLEAN ObjectCreation,
+ IN BOOLEAN AccessGranted,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtPrivilegeObjectAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN HANDLE ClientToken,
+ IN ACCESS_MASK DesiredAccess,
+ IN PPRIVILEGE_SET Privileges,
+ IN BOOLEAN AccessGranted);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtCloseObjectAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN BOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtDeleteObjectAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId OPTIONAL,
+ IN BOOLEAN GenerateOnClose);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtPrivilegedServiceAuditAlarm(
+ IN PUNICODE_STRING SubsystemName,
+ IN PUNICODE_STRING ServiceName,
+ IN HANDLE ClientToken,
+ IN PPRIVILEGE_SET Privileges,
+ IN BOOLEAN AccessGranted);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtSetInformationThread(
+ IN HANDLE ThreadHandle,
+ IN THREADINFOCLASS ThreadInformationClass,
+ IN PVOID ThreadInformation,
+ IN ULONG ThreadInformationLength);
+
+NTSYSCALLAPI
+NTSTATUS
+NTAPI
+NtCreateSection(
+ OUT PHANDLE SectionHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN PLARGE_INTEGER MaximumSize OPTIONAL,
+ IN ULONG SectionPageProtection,
+ IN ULONG AllocationAttributes,
+ IN HANDLE FileHandle OPTIONAL);
+
+#endif
+
+#define COMPRESSION_FORMAT_NONE (0x0000)
+#define COMPRESSION_FORMAT_DEFAULT (0x0001)
+#define COMPRESSION_FORMAT_LZNT1 (0x0002)
+#define COMPRESSION_ENGINE_STANDARD (0x0000)
+#define COMPRESSION_ENGINE_MAXIMUM (0x0100)
+#define COMPRESSION_ENGINE_HIBER (0x0200)
+
+#define MAX_UNICODE_STACK_BUFFER_LENGTH 256
+
+#define METHOD_FROM_CTL_CODE(ctrlCode) ((ULONG)(ctrlCode & 3))
+
+#define METHOD_DIRECT_TO_HARDWARE METHOD_IN_DIRECT
+#define METHOD_DIRECT_FROM_HARDWARE METHOD_OUT_DIRECT
+
+typedef ULONG LSA_OPERATIONAL_MODE, *PLSA_OPERATIONAL_MODE;
+
+typedef enum _SECURITY_LOGON_TYPE {
+ UndefinedLogonType = 0,
+ Interactive = 2,
+ Network,
+ Batch,
+ Service,
+ Proxy,
+ Unlock,
+ NetworkCleartext,
+ NewCredentials,
+#if (_WIN32_WINNT >= 0x0501)
+ RemoteInteractive,
+ CachedInteractive,
+#endif
+#if (_WIN32_WINNT >= 0x0502)
+ CachedRemoteInteractive,
+ CachedUnlock
+#endif
+} SECURITY_LOGON_TYPE, *PSECURITY_LOGON_TYPE;
+
+#ifndef _NTLSA_AUDIT_
+#define _NTLSA_AUDIT_
+
+#ifndef GUID_DEFINED
+#include
+#endif
+
+#endif /* _NTLSA_AUDIT_ */
+
+NTSTATUS
+NTAPI
+LsaRegisterLogonProcess(
+ IN PLSA_STRING LogonProcessName,
+ OUT PHANDLE LsaHandle,
+ OUT PLSA_OPERATIONAL_MODE SecurityMode);
+
+NTSTATUS
+NTAPI
+LsaLogonUser(
+ IN HANDLE LsaHandle,
+ IN PLSA_STRING OriginName,
+ IN SECURITY_LOGON_TYPE LogonType,
+ IN ULONG AuthenticationPackage,
+ IN PVOID AuthenticationInformation,
+ IN ULONG AuthenticationInformationLength,
+ IN PTOKEN_GROUPS LocalGroups OPTIONAL,
+ IN PTOKEN_SOURCE SourceContext,
+ OUT PVOID *ProfileBuffer,
+ OUT PULONG ProfileBufferLength,
+ OUT PLUID LogonId,
+ OUT PHANDLE Token,
+ OUT PQUOTA_LIMITS Quotas,
+ OUT PNTSTATUS SubStatus);
+
+NTSTATUS
+NTAPI
+LsaFreeReturnBuffer(
+ IN PVOID Buffer);
+
+#ifndef _NTLSA_IFS_
+#define _NTLSA_IFS_
+#endif
+
+#define MSV1_0_PACKAGE_NAME "MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
+#define MSV1_0_PACKAGE_NAMEW L"MICROSOFT_AUTHENTICATION_PACKAGE_V1_0"
+#define MSV1_0_PACKAGE_NAMEW_LENGTH sizeof(MSV1_0_PACKAGE_NAMEW) - sizeof(WCHAR)
+
+#define MSV1_0_SUBAUTHENTICATION_KEY "SYSTEM\\CurrentControlSet\\Control\\Lsa\\MSV1_0"
+#define MSV1_0_SUBAUTHENTICATION_VALUE "Auth"
+
+#define MSV1_0_CHALLENGE_LENGTH 8
+#define MSV1_0_USER_SESSION_KEY_LENGTH 16
+#define MSV1_0_LANMAN_SESSION_KEY_LENGTH 8
+
+#define MSV1_0_CLEARTEXT_PASSWORD_ALLOWED 0x02
+#define MSV1_0_UPDATE_LOGON_STATISTICS 0x04
+#define MSV1_0_RETURN_USER_PARAMETERS 0x08
+#define MSV1_0_DONT_TRY_GUEST_ACCOUNT 0x10
+#define MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT 0x20
+#define MSV1_0_RETURN_PASSWORD_EXPIRY 0x40
+#define MSV1_0_USE_CLIENT_CHALLENGE 0x80
+#define MSV1_0_TRY_GUEST_ACCOUNT_ONLY 0x100
+#define MSV1_0_RETURN_PROFILE_PATH 0x200
+#define MSV1_0_TRY_SPECIFIED_DOMAIN_ONLY 0x400
+#define MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT 0x800
+
+#define MSV1_0_DISABLE_PERSONAL_FALLBACK 0x00001000
+#define MSV1_0_ALLOW_FORCE_GUEST 0x00002000
+
+#if (_WIN32_WINNT >= 0x0502)
+#define MSV1_0_CLEARTEXT_PASSWORD_SUPPLIED 0x00004000
+#define MSV1_0_USE_DOMAIN_FOR_ROUTING_ONLY 0x00008000
+#endif
+
+#define MSV1_0_SUBAUTHENTICATION_DLL_EX 0x00100000
+#define MSV1_0_ALLOW_MSVCHAPV2 0x00010000
+
+#if (_WIN32_WINNT >= 0x0600)
+#define MSV1_0_S4U2SELF 0x00020000
+#define MSV1_0_CHECK_LOGONHOURS_FOR_S4U 0x00040000
+#endif
+
+#define MSV1_0_SUBAUTHENTICATION_DLL 0xFF000000
+#define MSV1_0_SUBAUTHENTICATION_DLL_SHIFT 24
+#define MSV1_0_MNS_LOGON 0x01000000
+
+#define MSV1_0_SUBAUTHENTICATION_DLL_RAS 2
+#define MSV1_0_SUBAUTHENTICATION_DLL_IIS 132
+
+#define LOGON_GUEST 0x01
+#define LOGON_NOENCRYPTION 0x02
+#define LOGON_CACHED_ACCOUNT 0x04
+#define LOGON_USED_LM_PASSWORD 0x08
+#define LOGON_EXTRA_SIDS 0x20
+#define LOGON_SUBAUTH_SESSION_KEY 0x40
+#define LOGON_SERVER_TRUST_ACCOUNT 0x80
+#define LOGON_NTLMV2_ENABLED 0x100
+#define LOGON_RESOURCE_GROUPS 0x200
+#define LOGON_PROFILE_PATH_RETURNED 0x400
+#define LOGON_NT_V2 0x800
+#define LOGON_LM_V2 0x1000
+#define LOGON_NTLM_V2 0x2000
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define LOGON_OPTIMIZED 0x4000
+#define LOGON_WINLOGON 0x8000
+#define LOGON_PKINIT 0x10000
+#define LOGON_NO_OPTIMIZED 0x20000
+
+#endif
+
+#define MSV1_0_SUBAUTHENTICATION_FLAGS 0xFF000000
+
+#define LOGON_GRACE_LOGON 0x01000000
+
+#define MSV1_0_OWF_PASSWORD_LENGTH 16
+#define MSV1_0_CRED_LM_PRESENT 0x1
+#define MSV1_0_CRED_NT_PRESENT 0x2
+#define MSV1_0_CRED_VERSION 0
+
+#define MSV1_0_NTLM3_RESPONSE_LENGTH 16
+#define MSV1_0_NTLM3_OWF_LENGTH 16
+
+#if (_WIN32_WINNT == 0x0500)
+#define MSV1_0_MAX_NTLM3_LIFE 1800
+#else
+#define MSV1_0_MAX_NTLM3_LIFE 129600
+#endif
+#define MSV1_0_MAX_AVL_SIZE 64000
+
+#if (_WIN32_WINNT >= 0x0501)
+
+#define MSV1_0_AV_FLAG_FORCE_GUEST 0x00000001
+
+#if (_WIN32_WINNT >= 0x0600)
+#define MSV1_0_AV_FLAG_MIC_HANDSHAKE_MESSAGES 0x00000002
+#endif
+
+#endif
+
+#define MSV1_0_NTLM3_INPUT_LENGTH (sizeof(MSV1_0_NTLM3_RESPONSE) - MSV1_0_NTLM3_RESPONSE_LENGTH)
+
+#if(_WIN32_WINNT >= 0x0502)
+#define MSV1_0_NTLM3_MIN_NT_RESPONSE_LENGTH RTL_SIZEOF_THROUGH_FIELD(MSV1_0_NTLM3_RESPONSE, AvPairsOff)
+#endif
+
+#define USE_PRIMARY_PASSWORD 0x01
+#define RETURN_PRIMARY_USERNAME 0x02
+#define RETURN_PRIMARY_LOGON_DOMAINNAME 0x04
+#define RETURN_NON_NT_USER_SESSION_KEY 0x08
+#define GENERATE_CLIENT_CHALLENGE 0x10
+#define GCR_NTLM3_PARMS 0x20
+#define GCR_TARGET_INFO 0x40
+#define RETURN_RESERVED_PARAMETER 0x80
+#define GCR_ALLOW_NTLM 0x100
+#define GCR_USE_OEM_SET 0x200
+#define GCR_MACHINE_CREDENTIAL 0x400
+#define GCR_USE_OWF_PASSWORD 0x800
+#define GCR_ALLOW_LM 0x1000
+#define GCR_ALLOW_NO_TARGET 0x2000
+
+typedef enum _MSV1_0_LOGON_SUBMIT_TYPE {
+ MsV1_0InteractiveLogon = 2,
+ MsV1_0Lm20Logon,
+ MsV1_0NetworkLogon,
+ MsV1_0SubAuthLogon,
+ MsV1_0WorkstationUnlockLogon = 7,
+ MsV1_0S4ULogon = 12,
+ MsV1_0VirtualLogon = 82
+} MSV1_0_LOGON_SUBMIT_TYPE, *PMSV1_0_LOGON_SUBMIT_TYPE;
+
+typedef enum _MSV1_0_PROFILE_BUFFER_TYPE {
+ MsV1_0InteractiveProfile = 2,
+ MsV1_0Lm20LogonProfile,
+ MsV1_0SmartCardProfile
+} MSV1_0_PROFILE_BUFFER_TYPE, *PMSV1_0_PROFILE_BUFFER_TYPE;
+
+typedef struct _MSV1_0_INTERACTIVE_LOGON {
+ MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+ UNICODE_STRING LogonDomainName;
+ UNICODE_STRING UserName;
+ UNICODE_STRING Password;
+} MSV1_0_INTERACTIVE_LOGON, *PMSV1_0_INTERACTIVE_LOGON;
+
+typedef struct _MSV1_0_INTERACTIVE_PROFILE {
+ MSV1_0_PROFILE_BUFFER_TYPE MessageType;
+ USHORT LogonCount;
+ USHORT BadPasswordCount;
+ LARGE_INTEGER LogonTime;
+ LARGE_INTEGER LogoffTime;
+ LARGE_INTEGER KickOffTime;
+ LARGE_INTEGER PasswordLastSet;
+ LARGE_INTEGER PasswordCanChange;
+ LARGE_INTEGER PasswordMustChange;
+ UNICODE_STRING LogonScript;
+ UNICODE_STRING HomeDirectory;
+ UNICODE_STRING FullName;
+ UNICODE_STRING ProfilePath;
+ UNICODE_STRING HomeDirectoryDrive;
+ UNICODE_STRING LogonServer;
+ ULONG UserFlags;
+} MSV1_0_INTERACTIVE_PROFILE, *PMSV1_0_INTERACTIVE_PROFILE;
+
+typedef struct _MSV1_0_LM20_LOGON {
+ MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+ UNICODE_STRING LogonDomainName;
+ UNICODE_STRING UserName;
+ UNICODE_STRING Workstation;
+ UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+ STRING CaseSensitiveChallengeResponse;
+ STRING CaseInsensitiveChallengeResponse;
+ ULONG ParameterControl;
+} MSV1_0_LM20_LOGON, * PMSV1_0_LM20_LOGON;
+
+typedef struct _MSV1_0_SUBAUTH_LOGON {
+ MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+ UNICODE_STRING LogonDomainName;
+ UNICODE_STRING UserName;
+ UNICODE_STRING Workstation;
+ UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+ STRING AuthenticationInfo1;
+ STRING AuthenticationInfo2;
+ ULONG ParameterControl;
+ ULONG SubAuthPackageId;
+} MSV1_0_SUBAUTH_LOGON, * PMSV1_0_SUBAUTH_LOGON;
+
+#if (_WIN32_WINNT >= 0x0600)
+
+#define MSV1_0_S4U_LOGON_FLAG_CHECK_LOGONHOURS 0x2
+
+typedef struct _MSV1_0_S4U_LOGON {
+ MSV1_0_LOGON_SUBMIT_TYPE MessageType;
+ ULONG Flags;
+ UNICODE_STRING UserPrincipalName;
+ UNICODE_STRING DomainName;
+} MSV1_0_S4U_LOGON, *PMSV1_0_S4U_LOGON;
+
+#endif
+
+typedef struct _MSV1_0_LM20_LOGON_PROFILE {
+ MSV1_0_PROFILE_BUFFER_TYPE MessageType;
+ LARGE_INTEGER KickOffTime;
+ LARGE_INTEGER LogoffTime;
+ ULONG UserFlags;
+ UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
+ UNICODE_STRING LogonDomainName;
+ UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
+ UNICODE_STRING LogonServer;
+ UNICODE_STRING UserParameters;
+} MSV1_0_LM20_LOGON_PROFILE, * PMSV1_0_LM20_LOGON_PROFILE;
+
+typedef struct _MSV1_0_SUPPLEMENTAL_CREDENTIAL {
+ ULONG Version;
+ ULONG Flags;
+ UCHAR LmPassword[MSV1_0_OWF_PASSWORD_LENGTH];
+ UCHAR NtPassword[MSV1_0_OWF_PASSWORD_LENGTH];
+} MSV1_0_SUPPLEMENTAL_CREDENTIAL, *PMSV1_0_SUPPLEMENTAL_CREDENTIAL;
+
+typedef struct _MSV1_0_NTLM3_RESPONSE {
+ UCHAR Response[MSV1_0_NTLM3_RESPONSE_LENGTH];
+ UCHAR RespType;
+ UCHAR HiRespType;
+ USHORT Flags;
+ ULONG MsgWord;
+ ULONGLONG TimeStamp;
+ UCHAR ChallengeFromClient[MSV1_0_CHALLENGE_LENGTH];
+ ULONG AvPairsOff;
+ UCHAR Buffer[1];
+} MSV1_0_NTLM3_RESPONSE, *PMSV1_0_NTLM3_RESPONSE;
+
+typedef enum _MSV1_0_AVID {
+ MsvAvEOL,
+ MsvAvNbComputerName,
+ MsvAvNbDomainName,
+ MsvAvDnsComputerName,
+ MsvAvDnsDomainName,
+#if (_WIN32_WINNT >= 0x0501)
+ MsvAvDnsTreeName,
+ MsvAvFlags,
+#if (_WIN32_WINNT >= 0x0600)
+ MsvAvTimestamp,
+ MsvAvRestrictions,
+ MsvAvTargetName,
+ MsvAvChannelBindings,
+#endif
+#endif
+} MSV1_0_AVID;
+
+typedef struct _MSV1_0_AV_PAIR {
+ USHORT AvId;
+ USHORT AvLen;
+} MSV1_0_AV_PAIR, *PMSV1_0_AV_PAIR;
+
+typedef enum _MSV1_0_PROTOCOL_MESSAGE_TYPE {
+ MsV1_0Lm20ChallengeRequest = 0,
+ MsV1_0Lm20GetChallengeResponse,
+ MsV1_0EnumerateUsers,
+ MsV1_0GetUserInfo,
+ MsV1_0ReLogonUsers,
+ MsV1_0ChangePassword,
+ MsV1_0ChangeCachedPassword,
+ MsV1_0GenericPassthrough,
+ MsV1_0CacheLogon,
+ MsV1_0SubAuth,
+ MsV1_0DeriveCredential,
+ MsV1_0CacheLookup,
+#if (_WIN32_WINNT >= 0x0501)
+ MsV1_0SetProcessOption,
+#endif
+#if (_WIN32_WINNT >= 0x0600)
+ MsV1_0ConfigLocalAliases,
+ MsV1_0ClearCachedCredentials,
+#endif
+} MSV1_0_PROTOCOL_MESSAGE_TYPE, *PMSV1_0_PROTOCOL_MESSAGE_TYPE;
+
+typedef struct _MSV1_0_LM20_CHALLENGE_REQUEST {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+} MSV1_0_LM20_CHALLENGE_REQUEST, *PMSV1_0_LM20_CHALLENGE_REQUEST;
+
+typedef struct _MSV1_0_LM20_CHALLENGE_RESPONSE {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+} MSV1_0_LM20_CHALLENGE_RESPONSE, *PMSV1_0_LM20_CHALLENGE_RESPONSE;
+
+typedef struct _MSV1_0_GETCHALLENRESP_REQUEST_V1 {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ ULONG ParameterControl;
+ LUID LogonId;
+ UNICODE_STRING Password;
+ UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+} MSV1_0_GETCHALLENRESP_REQUEST_V1, *PMSV1_0_GETCHALLENRESP_REQUEST_V1;
+
+typedef struct _MSV1_0_GETCHALLENRESP_REQUEST {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ ULONG ParameterControl;
+ LUID LogonId;
+ UNICODE_STRING Password;
+ UCHAR ChallengeToClient[MSV1_0_CHALLENGE_LENGTH];
+ UNICODE_STRING UserName;
+ UNICODE_STRING LogonDomainName;
+ UNICODE_STRING ServerName;
+} MSV1_0_GETCHALLENRESP_REQUEST, *PMSV1_0_GETCHALLENRESP_REQUEST;
+
+typedef struct _MSV1_0_GETCHALLENRESP_RESPONSE {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ STRING CaseSensitiveChallengeResponse;
+ STRING CaseInsensitiveChallengeResponse;
+ UNICODE_STRING UserName;
+ UNICODE_STRING LogonDomainName;
+ UCHAR UserSessionKey[MSV1_0_USER_SESSION_KEY_LENGTH];
+ UCHAR LanmanSessionKey[MSV1_0_LANMAN_SESSION_KEY_LENGTH];
+} MSV1_0_GETCHALLENRESP_RESPONSE, *PMSV1_0_GETCHALLENRESP_RESPONSE;
+
+typedef struct _MSV1_0_ENUMUSERS_REQUEST {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+} MSV1_0_ENUMUSERS_REQUEST, *PMSV1_0_ENUMUSERS_REQUEST;
+
+typedef struct _MSV1_0_ENUMUSERS_RESPONSE {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ ULONG NumberOfLoggedOnUsers;
+ PLUID LogonIds;
+ PULONG EnumHandles;
+} MSV1_0_ENUMUSERS_RESPONSE, *PMSV1_0_ENUMUSERS_RESPONSE;
+
+typedef struct _MSV1_0_GETUSERINFO_REQUEST {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ LUID LogonId;
+} MSV1_0_GETUSERINFO_REQUEST, *PMSV1_0_GETUSERINFO_REQUEST;
+
+typedef struct _MSV1_0_GETUSERINFO_RESPONSE {
+ MSV1_0_PROTOCOL_MESSAGE_TYPE MessageType;
+ PSID UserSid;
+ UNICODE_STRING UserName;
+ UNICODE_STRING LogonDomainName;
+ UNICODE_STRING LogonServer;
+ SECURITY_LOGON_TYPE LogonType;
+} MSV1_0_GETUSERINFO_RESPONSE, *PMSV1_0_GETUSERINFO_RESPONSE;
+
+$include (iotypes.h)
+
+typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
+ ULONG Attributes;
+ ACCESS_MASK GrantedAccess;
+ ULONG HandleCount;
+ ULONG PointerCount;
+ ULONG Reserved[10];
+} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;
+
+typedef struct _PUBLIC_OBJECT_TYPE_INFORMATION {
+ UNICODE_STRING TypeName;
+ ULONG Reserved [22];
+} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;
+
+typedef struct _SECURITY_CLIENT_CONTEXT {
+ SECURITY_QUALITY_OF_SERVICE SecurityQos;
+ PACCESS_TOKEN ClientToken;
+ BOOLEAN DirectlyAccessClientToken;
+ BOOLEAN DirectAccessEffectiveOnly;
+ BOOLEAN ServerIsRemote;
+ TOKEN_CONTROL ClientTokenControl;
+} SECURITY_CLIENT_CONTEXT, *PSECURITY_CLIENT_CONTEXT;
+
+#define SYSTEM_PAGE_PRIORITY_BITS 3
+#define SYSTEM_PAGE_PRIORITY_LEVELS (1 << SYSTEM_PAGE_PRIORITY_BITS)
+
+typedef struct _KAPC_STATE {
+ LIST_ENTRY ApcListHead[MaximumMode];
+ PKPROCESS Process;
+ BOOLEAN KernelApcInProgress;
+ BOOLEAN KernelApcPending;
+ BOOLEAN UserApcPending;
+} KAPC_STATE, *PKAPC_STATE, *RESTRICTED_POINTER PRKAPC_STATE;
+
+#define KAPC_STATE_ACTUAL_LENGTH (FIELD_OFFSET(KAPC_STATE, UserApcPending) + sizeof(BOOLEAN))
+
+#define ASSERT_QUEUE(Q) ASSERT(((Q)->Header.Type & KOBJECT_TYPE_MASK) == QueueObject);
+
+typedef struct _KQUEUE {
+ DISPATCHER_HEADER Header;
+ LIST_ENTRY EntryListHead;
+ volatile ULONG CurrentCount;
+ ULONG MaximumCount;
+ LIST_ENTRY ThreadListHead;
+} KQUEUE, *PKQUEUE, *RESTRICTED_POINTER PRKQUEUE;
+
+$include (kefuncs.h)
+$include (extypes.h)
+$include (exfuncs.h)
+$include (sefuncs.h)
+$include (psfuncs.h)
+$include (iofuncs.h)
+$include (potypes.h)
+$include (pofuncs.h)
+$include (mmtypes.h)
+$include (mmfuncs.h)
+$include (obfuncs.h)
+$include (fsrtltypes.h)
+$include (fsrtlfuncs.h)
+$include (cctypes.h)
+$include (ccfuncs.h)
+$include (zwfuncs.h)
+
+/* #if !defined(_X86AMD64_) FIXME : WHAT ?! */
+#if defined(_WIN64)
+
+C_ASSERT(sizeof(ERESOURCE) == 0x68);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x18);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x1a);
+
+#else
+
+C_ASSERT(sizeof(ERESOURCE) == 0x38);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,ActiveCount) == 0x0c);
+C_ASSERT(FIELD_OFFSET(ERESOURCE,Flag) == 0x0e);
+
+#endif
+/* #endif */
+
+#if defined(_IA64_)
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+//DECLSPEC_DEPRECATED_DDK
+NTHALAPI
+ULONG
+NTAPI
+HalGetDmaAlignmentRequirement(
+ VOID);
+#endif
+#endif
+
+#if defined(_M_IX86) || defined(_M_AMD64)
+#define HalGetDmaAlignmentRequirement() 1L
+#endif
+
+extern NTKERNELAPI PUSHORT NlsOemLeadByteInfo;
+#define NLS_OEM_LEAD_BYTE_INFO NlsOemLeadByteInfo
+
+#ifdef NLS_MB_CODE_PAGE_TAG
+#undef NLS_MB_CODE_PAGE_TAG
+#endif
+#define NLS_MB_CODE_PAGE_TAG NlsMbOemCodePageTag
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+typedef struct _ECP_HEADER ECP_HEADER, *PECP_HEADER;
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef enum _NETWORK_OPEN_LOCATION_QUALIFIER {
+ NetworkOpenLocationAny,
+ NetworkOpenLocationRemote,
+ NetworkOpenLocationLoopback
+} NETWORK_OPEN_LOCATION_QUALIFIER;
+
+typedef enum _NETWORK_OPEN_INTEGRITY_QUALIFIER {
+ NetworkOpenIntegrityAny,
+ NetworkOpenIntegrityNone,
+ NetworkOpenIntegritySigned,
+ NetworkOpenIntegrityEncrypted,
+ NetworkOpenIntegrityMaximum
+} NETWORK_OPEN_INTEGRITY_QUALIFIER;
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_COLLAPSING 0x1
+#define NETWORK_OPEN_ECP_IN_FLAG_DISABLE_HANDLE_DURABILITY 0x2
+#define NETWORK_OPEN_ECP_IN_FLAG_FORCE_BUFFERED_SYNCHRONOUS_IO_HACK 0x80000000
+
+typedef struct _NETWORK_OPEN_ECP_CONTEXT {
+ USHORT Size;
+ USHORT Reserved;
+ _ANONYMOUS_STRUCT struct {
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ ULONG Flags;
+ } in;
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ ULONG Flags;
+ } out;
+ } DUMMYSTRUCTNAME;
+} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
+
+typedef struct _NETWORK_OPEN_ECP_CONTEXT_V0 {
+ USHORT Size;
+ USHORT Reserved;
+ _ANONYMOUS_STRUCT struct {
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } in;
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } out;
+ } DUMMYSTRUCTNAME;
+} NETWORK_OPEN_ECP_CONTEXT_V0, *PNETWORK_OPEN_ECP_CONTEXT_V0;
+
+#elif (NTDDI_VERSION >= NTDDI_VISTA)
+typedef struct _NETWORK_OPEN_ECP_CONTEXT {
+ USHORT Size;
+ USHORT Reserved;
+ _ANONYMOUS_STRUCT struct {
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } in;
+ struct {
+ NETWORK_OPEN_LOCATION_QUALIFIER Location;
+ NETWORK_OPEN_INTEGRITY_QUALIFIER Integrity;
+ } out;
+ } DUMMYSTRUCTNAME;
+} NETWORK_OPEN_ECP_CONTEXT, *PNETWORK_OPEN_ECP_CONTEXT;
+#endif
+
+DEFINE_GUID(GUID_ECP_NETWORK_OPEN_CONTEXT, 0xc584edbf, 0x00df, 0x4d28, 0xb8, 0x84, 0x35, 0xba, 0xca, 0x89, 0x11, 0xe8);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+
+#if (NTDDI_VERSION >= NTDDI_VISTA)
+
+typedef struct _PREFETCH_OPEN_ECP_CONTEXT {
+ PVOID Context;
+} PREFETCH_OPEN_ECP_CONTEXT, *PPREFETCH_OPEN_ECP_CONTEXT;
+
+DEFINE_GUID(GUID_ECP_PREFETCH_OPEN, 0xe1777b21, 0x847e, 0x4837, 0xaa, 0x45, 0x64, 0x16, 0x1d, 0x28, 0x6, 0x55);
+
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+DEFINE_GUID (GUID_ECP_NFS_OPEN, 0xf326d30c, 0xe5f8, 0x4fe7, 0xab, 0x74, 0xf5, 0xa3, 0x19, 0x6d, 0x92, 0xdb);
+DEFINE_GUID (GUID_ECP_SRV_OPEN, 0xbebfaebc, 0xaabf, 0x489d, 0x9d, 0x2c, 0xe9, 0xe3, 0x61, 0x10, 0x28, 0x53);
+
+typedef struct sockaddr_storage *PSOCKADDR_STORAGE_NFS;
+
+typedef struct _NFS_OPEN_ECP_CONTEXT {
+ PUNICODE_STRING ExportAlias;
+ PSOCKADDR_STORAGE_NFS ClientSocketAddress;
+} NFS_OPEN_ECP_CONTEXT, *PNFS_OPEN_ECP_CONTEXT, **PPNFS_OPEN_ECP_CONTEXT;
+
+typedef struct _SRV_OPEN_ECP_CONTEXT {
+ PUNICODE_STRING ShareName;
+ PSOCKADDR_STORAGE_NFS SocketAddress;
+ BOOLEAN OplockBlockState;
+ BOOLEAN OplockAppState;
+ BOOLEAN OplockFinalState;
+} SRV_OPEN_ECP_CONTEXT, *PSRV_OPEN_ECP_CONTEXT;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+#define PIN_WAIT (1)
+#define PIN_EXCLUSIVE (2)
+#define PIN_NO_READ (4)
+#define PIN_IF_BCB (8)
+#define PIN_CALLER_TRACKS_DIRTY_DATA (32)
+#define PIN_HIGH_PRIORITY (64)
+
+#define MAP_WAIT 1
+#define MAP_NO_READ (16)
+#define MAP_HIGH_PRIORITY (64)
+
+#define IOCTL_REDIR_QUERY_PATH CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 99, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define IOCTL_REDIR_QUERY_PATH_EX CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 100, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+typedef struct _QUERY_PATH_REQUEST {
+ ULONG PathNameLength;
+ PIO_SECURITY_CONTEXT SecurityContext;
+ WCHAR FilePathName[1];
+} QUERY_PATH_REQUEST, *PQUERY_PATH_REQUEST;
+
+typedef struct _QUERY_PATH_REQUEST_EX {
+ PIO_SECURITY_CONTEXT pSecurityContext;
+ ULONG EaLength;
+ PVOID pEaBuffer;
+ UNICODE_STRING PathName;
+ UNICODE_STRING DomainServiceName;
+ ULONG_PTR Reserved[ 3 ];
+} QUERY_PATH_REQUEST_EX, *PQUERY_PATH_REQUEST_EX;
+
+typedef struct _QUERY_PATH_RESPONSE {
+ ULONG LengthAccepted;
+} QUERY_PATH_RESPONSE, *PQUERY_PATH_RESPONSE;
+
+#define VOLSNAPCONTROLTYPE 0x00000053
+#define IOCTL_VOLSNAP_FLUSH_AND_HOLD_WRITES CTL_CODE(VOLSNAPCONTROLTYPE, 0, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
+
+/* FIXME : These definitions below don't belong here (or anywhere in ddk really) */
+#pragma pack(push,4)
+
+#ifndef VER_PRODUCTBUILD
+#define VER_PRODUCTBUILD 10000
+#endif
+
+#include "csq.h"
+
+extern PACL SePublicDefaultDacl;
+extern PACL SeSystemDefaultDacl;
+
+#define FS_LFN_APIS 0x00004000
+
+#define FILE_STORAGE_TYPE_SPECIFIED 0x00000041 /* FILE_DIRECTORY_FILE | FILE_NON_DIRECTORY_FILE */
+#define FILE_STORAGE_TYPE_DEFAULT (StorageTypeDefault << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_DIRECTORY (StorageTypeDirectory << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_FILE (StorageTypeFile << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_DOCFILE (StorageTypeDocfile << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_JUNCTION_POINT (StorageTypeJunctionPoint << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_CATALOG (StorageTypeCatalog << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_STRUCTURED_STORAGE (StorageTypeStructuredStorage << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_EMBEDDING (StorageTypeEmbedding << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_STORAGE_TYPE_STREAM (StorageTypeStream << FILE_STORAGE_TYPE_SHIFT)
+#define FILE_MINIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_DEFAULT
+#define FILE_MAXIMUM_STORAGE_TYPE FILE_STORAGE_TYPE_STREAM
+#define FILE_STORAGE_TYPE_MASK 0x000f0000
+#define FILE_STORAGE_TYPE_SHIFT 16
+
+#define FILE_VC_QUOTAS_LOG_VIOLATIONS 0x00000004
+
+#ifdef _X86_
+#define HARDWARE_PTE HARDWARE_PTE_X86
+#define PHARDWARE_PTE PHARDWARE_PTE_X86
+#endif
+
+#define IO_ATTACH_DEVICE_API 0x80000000
+
+#define IO_TYPE_APC 18
+#define IO_TYPE_DPC 19
+#define IO_TYPE_DEVICE_QUEUE 20
+#define IO_TYPE_EVENT_PAIR 21
+#define IO_TYPE_INTERRUPT 22
+#define IO_TYPE_PROFILE 23
+
+#define IRP_BEING_VERIFIED 0x10
+
+#define MAILSLOT_CLASS_FIRSTCLASS 1
+#define MAILSLOT_CLASS_SECONDCLASS 2
+
+#define MAILSLOT_SIZE_AUTO 0
+
+#define MEM_DOS_LIM 0x40000000
+
+#define OB_TYPE_TYPE 1
+#define OB_TYPE_DIRECTORY 2
+#define OB_TYPE_SYMBOLIC_LINK 3
+#define OB_TYPE_TOKEN 4
+#define OB_TYPE_PROCESS 5
+#define OB_TYPE_THREAD 6
+#define OB_TYPE_EVENT 7
+#define OB_TYPE_EVENT_PAIR 8
+#define OB_TYPE_MUTANT 9
+#define OB_TYPE_SEMAPHORE 10
+#define OB_TYPE_TIMER 11
+#define OB_TYPE_PROFILE 12
+#define OB_TYPE_WINDOW_STATION 13
+#define OB_TYPE_DESKTOP 14
+#define OB_TYPE_SECTION 15
+#define OB_TYPE_KEY 16
+#define OB_TYPE_PORT 17
+#define OB_TYPE_ADAPTER 18
+#define OB_TYPE_CONTROLLER 19
+#define OB_TYPE_DEVICE 20
+#define OB_TYPE_DRIVER 21
+#define OB_TYPE_IO_COMPLETION 22
+#define OB_TYPE_FILE 23
+
+#define SEC_BASED 0x00200000
+
+/* end winnt.h */
+
+#define TOKEN_HAS_ADMIN_GROUP 0x08
+
+#if (VER_PRODUCTBUILD >= 1381)
+#define FSCTL_GET_HFS_INFORMATION CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 31, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#endif /* (VER_PRODUCTBUILD >= 1381) */
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+#define FSCTL_READ_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 33, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_WRITE_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 34, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define FSCTL_DUMP_PROPERTY_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 37, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define FSCTL_HSM_MSG CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 66, METHOD_BUFFERED, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_NSS_CONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 67, METHOD_BUFFERED, FILE_WRITE_DATA)
+#define FSCTL_HSM_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 68, METHOD_NEITHER, FILE_READ_DATA | FILE_WRITE_DATA)
+#define FSCTL_NSS_RCONTROL CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 70, METHOD_BUFFERED, FILE_READ_DATA)
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+#define FSCTL_NETWORK_SET_CONFIGURATION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 102, METHOD_IN_DIRECT, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_GET_CONFIGURATION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 103, METHOD_OUT_DIRECT, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_GET_CONNECTION_INFO CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 104, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_ENUMERATE_CONNECTIONS CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 105, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_DELETE_CONNECTION CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 107, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_GET_STATISTICS CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 116, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_SET_DOMAIN_NAME CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 120, METHOD_BUFFERED, FILE_ANY_ACCESS)
+#define FSCTL_NETWORK_REMOTE_BOOT_INIT_SCRT CTL_CODE(FILE_DEVICE_NETWORK_FILE_SYSTEM, 250, METHOD_BUFFERED, FILE_ANY_ACCESS)
+
+typedef enum _FILE_STORAGE_TYPE {
+ StorageTypeDefault = 1,
+ StorageTypeDirectory,
+ StorageTypeFile,
+ StorageTypeJunctionPoint,
+ StorageTypeCatalog,
+ StorageTypeStructuredStorage,
+ StorageTypeEmbedding,
+ StorageTypeStream
+} FILE_STORAGE_TYPE;
+
+typedef struct _OBJECT_BASIC_INFORMATION
+{
+ ULONG Attributes;
+ ACCESS_MASK GrantedAccess;
+ ULONG HandleCount;
+ ULONG PointerCount;
+ ULONG PagedPoolCharge;
+ ULONG NonPagedPoolCharge;
+ ULONG Reserved[ 3 ];
+ ULONG NameInfoSize;
+ ULONG TypeInfoSize;
+ ULONG SecurityDescriptorSize;
+ LARGE_INTEGER CreationTime;
+} OBJECT_BASIC_INFORMATION, *POBJECT_BASIC_INFORMATION;
+
+typedef struct _BITMAP_RANGE {
+ LIST_ENTRY Links;
+ LONGLONG BasePage;
+ ULONG FirstDirtyPage;
+ ULONG LastDirtyPage;
+ ULONG DirtyPages;
+ PULONG Bitmap;
+} BITMAP_RANGE, *PBITMAP_RANGE;
+
+typedef struct _FILE_COPY_ON_WRITE_INFORMATION {
+ BOOLEAN ReplaceIfExists;
+ HANDLE RootDirectory;
+ ULONG FileNameLength;
+ WCHAR FileName[1];
+} FILE_COPY_ON_WRITE_INFORMATION, *PFILE_COPY_ON_WRITE_INFORMATION;
+
+typedef struct _FILE_FULL_DIRECTORY_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ ULONG EaSize;
+ WCHAR FileName[ANYSIZE_ARRAY];
+} FILE_FULL_DIRECTORY_INFORMATION, *PFILE_FULL_DIRECTORY_INFORMATION;
+
+/* raw internal file lock struct returned from FsRtlGetNextFileLock */
+typedef struct _FILE_SHARED_LOCK_ENTRY {
+ PVOID Unknown1;
+ PVOID Unknown2;
+ FILE_LOCK_INFO FileLock;
+} FILE_SHARED_LOCK_ENTRY, *PFILE_SHARED_LOCK_ENTRY;
+
+/* raw internal file lock struct returned from FsRtlGetNextFileLock */
+typedef struct _FILE_EXCLUSIVE_LOCK_ENTRY {
+ LIST_ENTRY ListEntry;
+ PVOID Unknown1;
+ PVOID Unknown2;
+ FILE_LOCK_INFO FileLock;
+} FILE_EXCLUSIVE_LOCK_ENTRY, *PFILE_EXCLUSIVE_LOCK_ENTRY;
+
+typedef struct _FILE_MAILSLOT_PEEK_BUFFER {
+ ULONG ReadDataAvailable;
+ ULONG NumberOfMessages;
+ ULONG MessageLength;
+} FILE_MAILSLOT_PEEK_BUFFER, *PFILE_MAILSLOT_PEEK_BUFFER;
+
+typedef struct _FILE_OLE_CLASSID_INFORMATION {
+ GUID ClassId;
+} FILE_OLE_CLASSID_INFORMATION, *PFILE_OLE_CLASSID_INFORMATION;
+
+typedef struct _FILE_OLE_ALL_INFORMATION {
+ FILE_BASIC_INFORMATION BasicInformation;
+ FILE_STANDARD_INFORMATION StandardInformation;
+ FILE_INTERNAL_INFORMATION InternalInformation;
+ FILE_EA_INFORMATION EaInformation;
+ FILE_ACCESS_INFORMATION AccessInformation;
+ FILE_POSITION_INFORMATION PositionInformation;
+ FILE_MODE_INFORMATION ModeInformation;
+ FILE_ALIGNMENT_INFORMATION AlignmentInformation;
+ USN LastChangeUsn;
+ USN ReplicationUsn;
+ LARGE_INTEGER SecurityChangeTime;
+ FILE_OLE_CLASSID_INFORMATION OleClassIdInformation;
+ FILE_OBJECTID_INFORMATION ObjectIdInformation;
+ FILE_STORAGE_TYPE StorageType;
+ ULONG OleStateBits;
+ ULONG OleId;
+ ULONG NumberOfStreamReferences;
+ ULONG StreamIndex;
+ ULONG SecurityId;
+ BOOLEAN ContentIndexDisable;
+ BOOLEAN InheritContentIndexDisable;
+ FILE_NAME_INFORMATION NameInformation;
+} FILE_OLE_ALL_INFORMATION, *PFILE_OLE_ALL_INFORMATION;
+
+typedef struct _FILE_OLE_DIR_INFORMATION {
+ ULONG NextEntryOffset;
+ ULONG FileIndex;
+ LARGE_INTEGER CreationTime;
+ LARGE_INTEGER LastAccessTime;
+ LARGE_INTEGER LastWriteTime;
+ LARGE_INTEGER ChangeTime;
+ LARGE_INTEGER EndOfFile;
+ LARGE_INTEGER AllocationSize;
+ ULONG FileAttributes;
+ ULONG FileNameLength;
+ FILE_STORAGE_TYPE StorageType;
+ GUID OleClassId;
+ ULONG OleStateBits;
+ BOOLEAN ContentIndexDisable;
+ BOOLEAN InheritContentIndexDisable;
+ WCHAR FileName[1];
+} FILE_OLE_DIR_INFORMATION, *PFILE_OLE_DIR_INFORMATION;
+
+typedef struct _FILE_OLE_INFORMATION {
+ LARGE_INTEGER SecurityChangeTime;
+ FILE_OLE_CLASSID_INFORMATION OleClassIdInformation;
+ FILE_OBJECTID_INFORMATION ObjectIdInformation;
+ FILE_STORAGE_TYPE StorageType;
+ ULONG OleStateBits;
+ BOOLEAN ContentIndexDisable;
+ BOOLEAN InheritContentIndexDisable;
+} FILE_OLE_INFORMATION, *PFILE_OLE_INFORMATION;
+
+typedef struct _FILE_OLE_STATE_BITS_INFORMATION {
+ ULONG StateBits;
+ ULONG StateBitsMask;
+} FILE_OLE_STATE_BITS_INFORMATION, *PFILE_OLE_STATE_BITS_INFORMATION;
+
+typedef struct _MAPPING_PAIR {
+ ULONGLONG Vcn;
+ ULONGLONG Lcn;
+} MAPPING_PAIR, *PMAPPING_PAIR;
+
+typedef struct _GET_RETRIEVAL_DESCRIPTOR {
+ ULONG NumberOfPairs;
+ ULONGLONG StartVcn;
+ MAPPING_PAIR Pair[1];
+} GET_RETRIEVAL_DESCRIPTOR, *PGET_RETRIEVAL_DESCRIPTOR;
+
+typedef struct _MBCB {
+ CSHORT NodeTypeCode;
+ CSHORT NodeIsInZone;
+ ULONG PagesToWrite;
+ ULONG DirtyPages;
+ ULONG Reserved;
+ LIST_ENTRY BitmapRanges;
+ LONGLONG ResumeWritePage;
+ BITMAP_RANGE BitmapRange1;
+ BITMAP_RANGE BitmapRange2;
+ BITMAP_RANGE BitmapRange3;
+} MBCB, *PMBCB;
+
+typedef struct _MOVEFILE_DESCRIPTOR {
+ HANDLE FileHandle;
+ ULONG Reserved;
+ LARGE_INTEGER StartVcn;
+ LARGE_INTEGER TargetLcn;
+ ULONG NumVcns;
+ ULONG Reserved1;
+} MOVEFILE_DESCRIPTOR, *PMOVEFILE_DESCRIPTOR;
+
+typedef struct _OBJECT_BASIC_INFO {
+ ULONG Attributes;
+ ACCESS_MASK GrantedAccess;
+ ULONG HandleCount;
+ ULONG ReferenceCount;
+ ULONG PagedPoolUsage;
+ ULONG NonPagedPoolUsage;
+ ULONG Reserved[3];
+ ULONG NameInformationLength;
+ ULONG TypeInformationLength;
+ ULONG SecurityDescriptorLength;
+ LARGE_INTEGER CreateTime;
+} OBJECT_BASIC_INFO, *POBJECT_BASIC_INFO;
+
+typedef struct _OBJECT_HANDLE_ATTRIBUTE_INFO {
+ BOOLEAN Inherit;
+ BOOLEAN ProtectFromClose;
+} OBJECT_HANDLE_ATTRIBUTE_INFO, *POBJECT_HANDLE_ATTRIBUTE_INFO;
+
+typedef struct _OBJECT_NAME_INFO {
+ UNICODE_STRING ObjectName;
+ WCHAR ObjectNameBuffer[1];
+} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;
+
+typedef struct _OBJECT_PROTECTION_INFO {
+ BOOLEAN Inherit;
+ BOOLEAN ProtectHandle;
+} OBJECT_PROTECTION_INFO, *POBJECT_PROTECTION_INFO;
+
+typedef struct _OBJECT_TYPE_INFO {
+ UNICODE_STRING ObjectTypeName;
+ UCHAR Unknown[0x58];
+ WCHAR ObjectTypeNameBuffer[1];
+} OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO;
+
+typedef struct _OBJECT_ALL_TYPES_INFO {
+ ULONG NumberOfObjectTypes;
+ OBJECT_TYPE_INFO ObjectsTypeInfo[1];
+} OBJECT_ALL_TYPES_INFO, *POBJECT_ALL_TYPES_INFO;
+
+#if defined(USE_LPC6432)
+#define LPC_CLIENT_ID CLIENT_ID64
+#define LPC_SIZE_T ULONGLONG
+#define LPC_PVOID ULONGLONG
+#define LPC_HANDLE ULONGLONG
+#else
+#define LPC_CLIENT_ID CLIENT_ID
+#define LPC_SIZE_T SIZE_T
+#define LPC_PVOID PVOID
+#define LPC_HANDLE HANDLE
+#endif
+
+typedef struct _PORT_MESSAGE
+{
+ union
+ {
+ struct
+ {
+ CSHORT DataLength;
+ CSHORT TotalLength;
+ } s1;
+ ULONG Length;
+ } u1;
+ union
+ {
+ struct
+ {
+ CSHORT Type;
+ CSHORT DataInfoOffset;
+ } s2;
+ ULONG ZeroInit;
+ } u2;
+ __GNU_EXTENSION union
+ {
+ LPC_CLIENT_ID ClientId;
+ double DoNotUseThisField;
+ };
+ ULONG MessageId;
+ __GNU_EXTENSION union
+ {
+ LPC_SIZE_T ClientViewSize;
+ ULONG CallbackId;
+ };
+} PORT_MESSAGE, *PPORT_MESSAGE;
+
+#define LPC_KERNELMODE_MESSAGE (CSHORT)((USHORT)0x8000)
+
+typedef struct _PORT_VIEW
+{
+ ULONG Length;
+ LPC_HANDLE SectionHandle;
+ ULONG SectionOffset;
+ LPC_SIZE_T ViewSize;
+ LPC_PVOID ViewBase;
+ LPC_PVOID ViewRemoteBase;
+} PORT_VIEW, *PPORT_VIEW;
+
+typedef struct _REMOTE_PORT_VIEW
+{
+ ULONG Length;
+ LPC_SIZE_T ViewSize;
+ LPC_PVOID ViewBase;
+} REMOTE_PORT_VIEW, *PREMOTE_PORT_VIEW;
+
+typedef struct _VAD_HEADER {
+ PVOID StartVPN;
+ PVOID EndVPN;
+ struct _VAD_HEADER* ParentLink;
+ struct _VAD_HEADER* LeftLink;
+ struct _VAD_HEADER* RightLink;
+ ULONG Flags; /* LSB = CommitCharge */
+ PVOID ControlArea;
+ PVOID FirstProtoPte;
+ PVOID LastPTE;
+ ULONG Unknown;
+ LIST_ENTRY Secured;
+} VAD_HEADER, *PVAD_HEADER;
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+CcGetLsnForFileObject (
+ IN PFILE_OBJECT FileObject,
+ OUT PLARGE_INTEGER OldestLsn OPTIONAL
+);
+
+NTKERNELAPI
+PVOID
+NTAPI
+FsRtlAllocatePool (
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes
+);
+
+NTKERNELAPI
+PVOID
+NTAPI
+FsRtlAllocatePoolWithQuota (
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes
+);
+
+NTKERNELAPI
+PVOID
+NTAPI
+FsRtlAllocatePoolWithQuotaTag (
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes,
+ IN ULONG Tag
+);
+
+NTKERNELAPI
+PVOID
+NTAPI
+FsRtlAllocatePoolWithTag (
+ IN POOL_TYPE PoolType,
+ IN ULONG NumberOfBytes,
+ IN ULONG Tag
+);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlIsFatDbcsLegal (
+ IN ANSI_STRING DbcsName,
+ IN BOOLEAN WildCardsPermissible,
+ IN BOOLEAN PathNamePermissible,
+ IN BOOLEAN LeadingBackslashPermissible
+);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlReadComplete (
+ IN PFILE_OBJECT FileObject,
+ IN PMDL MdlChain
+);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+FsRtlMdlWriteComplete (
+ IN PFILE_OBJECT FileObject,
+ IN PLARGE_INTEGER FileOffset,
+ IN PMDL MdlChain
+);
+
+NTKERNELAPI
+VOID
+NTAPI
+FsRtlNotifyChangeDirectory (
+ IN PNOTIFY_SYNC NotifySync,
+ IN PVOID FsContext,
+ IN PSTRING FullDirectoryName,
+ IN PLIST_ENTRY NotifyList,
+ IN BOOLEAN WatchTree,
+ IN ULONG CompletionFilter,
+ IN PIRP NotifyIrp
+);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObCreateObject (
+ IN KPROCESSOR_MODE ObjectAttributesAccessMode OPTIONAL,
+ IN POBJECT_TYPE ObjectType,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN KPROCESSOR_MODE AccessMode,
+ IN OUT PVOID ParseContext OPTIONAL,
+ IN ULONG ObjectSize,
+ IN ULONG PagedPoolCharge OPTIONAL,
+ IN ULONG NonPagedPoolCharge OPTIONAL,
+ OUT PVOID *Object
+);
+
+NTKERNELAPI
+ULONG
+NTAPI
+ObGetObjectPointerCount (
+ IN PVOID Object
+);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObReferenceObjectByName (
+ IN PUNICODE_STRING ObjectName,
+ IN ULONG Attributes,
+ IN PACCESS_STATE PassedAccessState OPTIONAL,
+ IN ACCESS_MASK DesiredAccess OPTIONAL,
+ IN POBJECT_TYPE ObjectType,
+ IN KPROCESSOR_MODE AccessMode,
+ IN OUT PVOID ParseContext OPTIONAL,
+ OUT PVOID *Object
+);
+
+#define PsDereferenceImpersonationToken(T) \
+ {if (ARGUMENT_PRESENT(T)) { \
+ (ObDereferenceObject((T))); \
+ } else { \
+ ; \
+ } \
+}
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupProcessThreadByCid (
+ IN PCLIENT_ID Cid,
+ OUT PEPROCESS *Process OPTIONAL,
+ OUT PETHREAD *Thread
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetSaclSecurityDescriptor (
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN BOOLEAN SaclPresent,
+ IN PACL Sacl,
+ IN BOOLEAN SaclDefaulted
+);
+
+#define SeEnableAccessToExports() SeExports = *(PSE_EXPORTS *)SeExports;
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwAdjustPrivilegesToken (
+ IN HANDLE TokenHandle,
+ IN BOOLEAN DisableAllPrivileges,
+ IN PTOKEN_PRIVILEGES NewState,
+ IN ULONG BufferLength,
+ OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL,
+ OUT PULONG ReturnLength
+);
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwAlertThread (
+ IN HANDLE ThreadHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwAccessCheckAndAuditAlarm (
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId,
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PUNICODE_STRING ObjectName,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN ACCESS_MASK DesiredAccess,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN BOOLEAN ObjectCreation,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PBOOLEAN AccessStatus,
+ OUT PBOOLEAN GenerateOnClose
+);
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCancelIoFile (
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock
+);
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwClearEvent (
+ IN HANDLE EventHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCloseObjectAuditAlarm (
+ IN PUNICODE_STRING SubsystemName,
+ IN PVOID HandleId,
+ IN BOOLEAN GenerateOnClose
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCreateSymbolicLinkObject (
+ OUT PHANDLE SymbolicLinkHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PUNICODE_STRING TargetName
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFlushInstructionCache (
+ IN HANDLE ProcessHandle,
+ IN PVOID BaseAddress OPTIONAL,
+ IN ULONG FlushSize
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFlushBuffersFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock
+);
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwInitiatePowerAction (
+ IN POWER_ACTION SystemAction,
+ IN SYSTEM_POWER_STATE MinSystemState,
+ IN ULONG Flags,
+ IN BOOLEAN Asynchronous
+);
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwLoadKey (
+ IN POBJECT_ATTRIBUTES KeyObjectAttributes,
+ IN POBJECT_ATTRIBUTES FileObjectAttributes
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenProcessToken (
+ IN HANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ OUT PHANDLE TokenHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenThread (
+ OUT PHANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN PCLIENT_ID ClientId
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenThreadToken (
+ IN HANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN OpenAsSelf,
+ OUT PHANDLE TokenHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwPulseEvent (
+ IN HANDLE EventHandle,
+ OUT PLONG PreviousState OPTIONAL
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryDefaultLocale (
+ IN BOOLEAN ThreadOrSystem,
+ OUT PLCID Locale
+);
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryDirectoryObject (
+ IN HANDLE DirectoryHandle,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN BOOLEAN ReturnSingleEntry,
+ IN BOOLEAN RestartScan,
+ IN OUT PULONG Context,
+ OUT PULONG ReturnLength OPTIONAL
+);
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationProcess (
+ IN HANDLE ProcessHandle,
+ IN PROCESSINFOCLASS ProcessInformationClass,
+ OUT PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength,
+ OUT PULONG ReturnLength OPTIONAL
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwReplaceKey (
+ IN POBJECT_ATTRIBUTES NewFileObjectAttributes,
+ IN HANDLE KeyHandle,
+ IN POBJECT_ATTRIBUTES OldFileObjectAttributes
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwResetEvent (
+ IN HANDLE EventHandle,
+ OUT PLONG PreviousState OPTIONAL
+);
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwRestoreKey (
+ IN HANDLE KeyHandle,
+ IN HANDLE FileHandle,
+ IN ULONG Flags
+);
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSaveKey (
+ IN HANDLE KeyHandle,
+ IN HANDLE FileHandle
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetDefaultLocale (
+ IN BOOLEAN ThreadOrSystem,
+ IN LCID Locale
+);
+
+#if (VER_PRODUCTBUILD >= 2195)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetDefaultUILanguage (
+ IN LANGID LanguageId
+);
+
+#endif /* (VER_PRODUCTBUILD >= 2195) */
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationProcess (
+ IN HANDLE ProcessHandle,
+ IN PROCESSINFOCLASS ProcessInformationClass,
+ IN PVOID ProcessInformation,
+ IN ULONG ProcessInformationLength
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetSystemTime (
+ IN PLARGE_INTEGER NewTime,
+ OUT PLARGE_INTEGER OldTime OPTIONAL
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwUnloadKey (
+ IN POBJECT_ATTRIBUTES KeyObjectAttributes
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwWaitForMultipleObjects (
+ IN ULONG HandleCount,
+ IN PHANDLE Handles,
+ IN WAIT_TYPE WaitType,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Timeout OPTIONAL
+);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwYieldExecution (
+ VOID
+);
+
+#pragma pack(pop)
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/include/xdk/obfuncs.h b/include/xdk/obfuncs.h
index 40912fa411c..ac427516c97 100644
--- a/include/xdk/obfuncs.h
+++ b/include/xdk/obfuncs.h
@@ -1,10 +1,11 @@
+$if (_WDMDDK_)
/******************************************************************************
* Object Manager Functions *
******************************************************************************/
+$endif (_WDMDDK_)
-$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
+$if (_WDMDDK_)
NTKERNELAPI
LONG_PTR
FASTCALL
@@ -53,17 +54,75 @@ NTAPI
ObReleaseObjectSecurity(
IN PSECURITY_DESCRIPTOR SecurityDescriptor,
IN BOOLEAN MemoryAllocated);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObInsertObject(
+ IN PVOID Object,
+ IN OUT PACCESS_STATE PassedAccessState OPTIONAL,
+ IN ACCESS_MASK DesiredAccess OPTIONAL,
+ IN ULONG ObjectPointerBias,
+ OUT PVOID *NewObject OPTIONAL,
+ OUT PHANDLE Handle OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObOpenObjectByPointer(
+ IN PVOID Object,
+ IN ULONG HandleAttributes,
+ IN PACCESS_STATE PassedAccessState OPTIONAL,
+ IN ACCESS_MASK DesiredAccess OPTIONAL,
+ IN POBJECT_TYPE ObjectType OPTIONAL,
+ IN KPROCESSOR_MODE AccessMode,
+ OUT PHANDLE Handle);
+
+NTKERNELAPI
+VOID
+NTAPI
+ObMakeTemporaryObject(
+ IN PVOID Object);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObQueryNameString(
+ IN PVOID Object,
+ OUT POBJECT_NAME_INFORMATION ObjectNameInfo OPTIONAL,
+ IN ULONG Length,
+ OUT PULONG ReturnLength);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObQueryObjectAuditingByHandle(
+ IN HANDLE Handle,
+ OUT PBOOLEAN GenerateOnClose);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
#if (NTDDI_VERSION >= NTDDI_VISTA)
+$if (_WDMDDK_)
NTKERNELAPI
VOID
NTAPI
ObDereferenceObjectDeferDelete(
IN PVOID Object);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+ObIsKernelHandle(
+ IN HANDLE Handle);
+$endif (_NTIFS_)
#endif
+$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_VISTASP1)
NTKERNELAPI
NTSTATUS
@@ -84,9 +143,10 @@ NTAPI
ObGetFilterVersion(VOID);
#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
+$endif (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WIN7)
-
+$if (_WDMDDK_)
NTKERNELAPI
NTSTATUS
NTAPI
@@ -134,8 +194,21 @@ ObDereferenceObjectDeferDeleteWithTag(
#define ObReferenceObject ObfReferenceObject
#define ObDereferenceObjectWithTag ObfDereferenceObjectWithTag
#define ObReferenceObjectWithTag ObfReferenceObjectWithTag
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+ObOpenObjectByPointerWithTag(
+ IN PVOID Object,
+ IN ULONG HandleAttributes,
+ IN PACCESS_STATE PassedAccessState OPTIONAL,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_TYPE ObjectType OPTIONAL,
+ IN KPROCESSOR_MODE AccessMode,
+ IN ULONG Tag,
+ OUT PHANDLE Handle);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
-$endif
-
diff --git a/include/xdk/obtypes.h b/include/xdk/obtypes.h
index 84310a968db..4efaed8fe36 100644
--- a/include/xdk/obtypes.h
+++ b/include/xdk/obtypes.h
@@ -3,16 +3,16 @@
******************************************************************************/
#define MAXIMUM_FILENAME_LENGTH 256
-#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
+#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
-#define OBJECT_TYPE_CREATE 0x0001
-#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
+#define OBJECT_TYPE_CREATE 0x0001
+#define OBJECT_TYPE_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
-#define DIRECTORY_QUERY 0x0001
-#define DIRECTORY_TRAVERSE 0x0002
-#define DIRECTORY_CREATE_OBJECT 0x0004
-#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
-#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
+#define DIRECTORY_QUERY 0x0001
+#define DIRECTORY_TRAVERSE 0x0002
+#define DIRECTORY_CREATE_OBJECT 0x0004
+#define DIRECTORY_CREATE_SUBDIRECTORY 0x0008
+#define DIRECTORY_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0xF)
#define SYMBOLIC_LINK_QUERY 0x0001
#define SYMBOLIC_LINK_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x1)
@@ -21,13 +21,13 @@
#define DUPLICATE_SAME_ACCESS 0x00000002
#define DUPLICATE_SAME_ATTRIBUTES 0x00000004
-#define OB_FLT_REGISTRATION_VERSION_0100 0x0100
-#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
+#define OB_FLT_REGISTRATION_VERSION_0100 0x0100
+#define OB_FLT_REGISTRATION_VERSION OB_FLT_REGISTRATION_VERSION_0100
typedef ULONG OB_OPERATION;
-#define OB_OPERATION_HANDLE_CREATE 0x00000001
-#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
+#define OB_OPERATION_HANDLE_CREATE 0x00000001
+#define OB_OPERATION_HANDLE_DUPLICATE 0x00000002
typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {
IN OUT ACCESS_MASK DesiredAccess;
@@ -48,13 +48,13 @@ typedef union _OB_PRE_OPERATION_PARAMETERS {
typedef struct _OB_PRE_OPERATION_INFORMATION {
IN OB_OPERATION Operation;
- union {
+ _ANONYMOUS_UNION union {
IN ULONG Flags;
- struct {
+ _ANONYMOUS_STRUCT struct {
IN ULONG KernelHandle:1;
IN ULONG Reserved:31;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
IN PVOID Object;
IN POBJECT_TYPE ObjectType;
OUT PVOID CallContext;
@@ -76,13 +76,13 @@ typedef union _OB_POST_OPERATION_PARAMETERS {
typedef struct _OB_POST_OPERATION_INFORMATION {
IN OB_OPERATION Operation;
- union {
- IN ULONG Flags;
- struct {
- IN ULONG KernelHandle:1;
- IN ULONG Reserved:31;
- };
- };
+ _ANONYMOUS_UNION union {
+ IN ULONG Flags;
+ _ANONYMOUS_STRUCT struct {
+ IN ULONG KernelHandle:1;
+ IN ULONG Reserved:31;
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
IN PVOID Object;
IN POBJECT_TYPE ObjectType;
IN PVOID CallContext;
@@ -132,4 +132,3 @@ extern POBJECT_TYPE NTSYSAPI PsThreadType;
extern POBJECT_TYPE NTSYSAPI SeTokenObjectType;
extern POBJECT_TYPE NTSYSAPI PsProcessType;
-
diff --git a/include/xdk/pofuncs.h b/include/xdk/pofuncs.h
index 9fd1ec6d2b0..a713c891340 100644
--- a/include/xdk/pofuncs.h
+++ b/include/xdk/pofuncs.h
@@ -1,3 +1,4 @@
+$if (_WDMDDK_)
/******************************************************************************
* Power Management Support Functions *
******************************************************************************/
@@ -73,7 +74,18 @@ PoRequestShutdownEvent(
OUT PVOID *Event);
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PoQueueShutdownWorkItem(
+ IN OUT PWORK_QUEUE_ITEM WorkItem);
+#endif
+$endif (_NTIFS_)
+$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_VISTA)
NTKERNELAPI
diff --git a/include/xdk/potypes.h b/include/xdk/potypes.h
index 3caf8254d55..3344aafd880 100644
--- a/include/xdk/potypes.h
+++ b/include/xdk/potypes.h
@@ -1,3 +1,4 @@
+$if (_WDMDDK_)
/******************************************************************************
* Power Management Support Types *
******************************************************************************/
@@ -120,8 +121,8 @@ typedef enum _POWER_STATE_TYPE {
#if (NTDDI_VERSION >= NTDDI_VISTA)
typedef struct _SYSTEM_POWER_STATE_CONTEXT {
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
ULONG Reserved1:8;
ULONG TargetSystemState:4;
ULONG EffectiveSystemState:4;
@@ -139,8 +140,8 @@ typedef struct _SYSTEM_POWER_STATE_CONTEXT {
typedef struct _COUNTED_REASON_CONTEXT {
ULONG Version;
ULONG Flags;
- union {
- struct {
+ _ANONYMOUS_UNION union {
+ _ANONYMOUS_STRUCT struct {
UNICODE_STRING ResourceFileName;
USHORT ResourceReasonId;
ULONG StringCount;
@@ -270,74 +271,74 @@ typedef struct {
#define CORE_PARKING_POLICY_CHANGE_ROCKET 2
#define CORE_PARKING_POLICY_CHANGE_MAX CORE_PARKING_POLICY_CHANGE_ROCKET
-DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A );
-DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C );
-DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E );
-DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94 );
-DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0 );
-DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7 );
-DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63 );
-DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99 );
-DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E );
-DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63 );
-DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64 );
+DEFINE_GUID(GUID_MAX_POWER_SAVINGS, 0xA1841308, 0x3541, 0x4FAB, 0xBC, 0x81, 0xF7, 0x15, 0x56, 0xF2, 0x0B, 0x4A);
+DEFINE_GUID(GUID_MIN_POWER_SAVINGS, 0x8C5E7FDA, 0xE8BF, 0x4A96, 0x9A, 0x85, 0xA6, 0xE2, 0x3A, 0x8C, 0x63, 0x5C);
+DEFINE_GUID(GUID_TYPICAL_POWER_SAVINGS, 0x381B4222, 0xF694, 0x41F0, 0x96, 0x85, 0xFF, 0x5B, 0xB2, 0x60, 0xDF, 0x2E);
+DEFINE_GUID(NO_SUBGROUP_GUID, 0xFEA3413E, 0x7E05, 0x4911, 0x9A, 0x71, 0x70, 0x03, 0x31, 0xF1, 0xC2, 0x94);
+DEFINE_GUID(ALL_POWERSCHEMES_GUID, 0x68A1E95E, 0x13EA, 0x41E1, 0x80, 0x11, 0x0C, 0x49, 0x6C, 0xA4, 0x90, 0xB0);
+DEFINE_GUID(GUID_POWERSCHEME_PERSONALITY, 0x245D8541, 0x3943, 0x4422, 0xB0, 0x25, 0x13, 0xA7, 0x84, 0xF6, 0x79, 0xB7);
+DEFINE_GUID(GUID_ACTIVE_POWERSCHEME, 0x31F9F286, 0x5084, 0x42FE, 0xB7, 0x20, 0x2B, 0x02, 0x64, 0x99, 0x37, 0x63);
+DEFINE_GUID(GUID_VIDEO_SUBGROUP, 0x7516B95F, 0xF776, 0x4464, 0x8C, 0x53, 0x06, 0x16, 0x7F, 0x40, 0xCC, 0x99);
+DEFINE_GUID(GUID_VIDEO_POWERDOWN_TIMEOUT, 0x3C0BC021, 0xC8A8, 0x4E07, 0xA9, 0x73, 0x6B, 0x14, 0xCB, 0xCB, 0x2B, 0x7E);
+DEFINE_GUID(GUID_VIDEO_ANNOYANCE_TIMEOUT, 0x82DBCF2D, 0xCD67, 0x40C5, 0xBF, 0xDC, 0x9F, 0x1A, 0x5C, 0xCD, 0x46, 0x63);
+DEFINE_GUID(GUID_VIDEO_ADAPTIVE_PERCENT_INCREASE, 0xEED904DF, 0xB142, 0x4183, 0xB1, 0x0B, 0x5A, 0x11, 0x97, 0xA3, 0x78, 0x64);
DEFINE_GUID(GUID_VIDEO_DIM_TIMEOUT, 0x17aaa29b, 0x8b43, 0x4b94, 0xaa, 0xfe, 0x35, 0xf6, 0x4d, 0xaa, 0xf1, 0xee);
-DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B );
-DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA );
+DEFINE_GUID(GUID_VIDEO_ADAPTIVE_POWERDOWN, 0x90959D22, 0xD6A1, 0x49B9, 0xAF, 0x93, 0xBC, 0xE8, 0x85, 0xAD, 0x33, 0x5B);
+DEFINE_GUID(GUID_MONITOR_POWER_ON, 0x02731015, 0x4510, 0x4526, 0x99, 0xE6, 0xE5, 0xA1, 0x7E, 0xBD, 0x1A, 0xEA);
DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_BRIGHTNESS, 0xaded5e82L, 0xb909, 0x4619, 0x99, 0x49, 0xf5, 0xd7, 0x1d, 0xac, 0x0b, 0xcb);
DEFINE_GUID(GUID_DEVICE_POWER_POLICY_VIDEO_DIM_BRIGHTNESS, 0xf1fbfde2, 0xa960, 0x4165, 0x9f, 0x88, 0x50, 0x66, 0x79, 0x11, 0xce, 0x96);
DEFINE_GUID(GUID_VIDEO_CURRENT_MONITOR_BRIGHTNESS, 0x8ffee2c6, 0x2d01, 0x46be, 0xad, 0xb9, 0x39, 0x8a, 0xdd, 0xc5, 0xb4, 0xff);
DEFINE_GUID(GUID_VIDEO_ADAPTIVE_DISPLAY_BRIGHTNESS, 0xFBD9AA66, 0x9553, 0x4097, 0xBA, 0x44, 0xED, 0x6E, 0x9D, 0x65, 0xEA, 0xB8);
-DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67 );
+DEFINE_GUID(GUID_SESSION_DISPLAY_STATE, 0x73A5E93A, 0x5BB1, 0x4F93, 0x89, 0x5B, 0xDB, 0xD0, 0xDA, 0x85, 0x59, 0x67);
DEFINE_GUID(GUID_CONSOLE_DISPLAY_STATE, 0x6fe69556, 0x704a, 0x47a0, 0x8f, 0x24, 0xc2, 0x8d, 0x93, 0x6f, 0xda, 0x47);
-DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23 );
-DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42 );
-DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E );
-DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63 );
-DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67 );
-DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20 );
-DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70 );
-DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA );
-DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0 );
-DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64 );
-DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E );
+DEFINE_GUID(GUID_ALLOW_DISPLAY_REQUIRED, 0xA9CEB8DA, 0xCD46, 0x44FB, 0xA9, 0x8B, 0x02, 0xAF, 0x69, 0xDE, 0x46, 0x23);
+DEFINE_GUID(GUID_DISK_SUBGROUP, 0x0012EE47, 0x9041, 0x4B5D, 0x9B, 0x77, 0x53, 0x5F, 0xBA, 0x8B, 0x14, 0x42);
+DEFINE_GUID(GUID_DISK_POWERDOWN_TIMEOUT, 0x6738E2C4, 0xE8A5, 0x4A42, 0xB1, 0x6A, 0xE0, 0x40, 0xE7, 0x69, 0x75, 0x6E);
+DEFINE_GUID(GUID_DISK_BURST_IGNORE_THRESHOLD, 0x80e3c60e, 0xbb94, 0x4ad8, 0xbb, 0xe0, 0x0d, 0x31, 0x95, 0xef, 0xc6, 0x63);
+DEFINE_GUID(GUID_DISK_ADAPTIVE_POWERDOWN, 0x396A32E1, 0x499A, 0x40B2, 0x91, 0x24, 0xA9, 0x6A, 0xFE, 0x70, 0x76, 0x67);
+DEFINE_GUID(GUID_SLEEP_SUBGROUP, 0x238C9FA8, 0x0AAD, 0x41ED, 0x83, 0xF4, 0x97, 0xBE, 0x24, 0x2C, 0x8F, 0x20);
+DEFINE_GUID(GUID_SLEEP_IDLE_THRESHOLD, 0x81cd32e0, 0x7833, 0x44f3, 0x87, 0x37, 0x70, 0x81, 0xf3, 0x8d, 0x1f, 0x70);
+DEFINE_GUID(GUID_STANDBY_TIMEOUT, 0x29F6C1DB, 0x86DA, 0x48C5, 0x9F, 0xDB, 0xF2, 0xB6, 0x7B, 0x1F, 0x44, 0xDA);
+DEFINE_GUID(GUID_UNATTEND_SLEEP_TIMEOUT, 0x7bc4a2f9, 0xd8fc, 0x4469, 0xb0, 0x7b, 0x33, 0xeb, 0x78, 0x5a, 0xac, 0xa0);
+DEFINE_GUID(GUID_HIBERNATE_TIMEOUT, 0x9D7815A6, 0x7EE4, 0x497E, 0x88, 0x88, 0x51, 0x5A, 0x05, 0xF0, 0x23, 0x64);
+DEFINE_GUID(GUID_HIBERNATE_FASTS4_POLICY, 0x94AC6D29, 0x73CE, 0x41A6, 0x80, 0x9F, 0x63, 0x63, 0xBA, 0x21, 0xB4, 0x7E);
DEFINE_GUID(GUID_CRITICAL_POWER_TRANSITION, 0xB7A27025, 0xE569, 0x46c2, 0xA5, 0x04, 0x2B, 0x96, 0xCA, 0xD2, 0x25, 0xA1);
-DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0 );
-DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87 );
-DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab );
-DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D );
-DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2 );
-DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47 );
-DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80 );
-DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78 );
-DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB );
-DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93 );
-DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5 );
-DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36 );
-DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B );
-DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4 );
-DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65 );
-DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3 );
-DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00 );
-DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36 );
-DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC );
-DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C );
-DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb );
+DEFINE_GUID(GUID_SYSTEM_AWAYMODE, 0x98A7F580, 0x01F7, 0x48AA, 0x9C, 0x0F, 0x44, 0x35, 0x2C, 0x29, 0xE5, 0xC0);
+DEFINE_GUID(GUID_ALLOW_AWAYMODE, 0x25dfa149, 0x5dd1, 0x4736, 0xb5, 0xab, 0xe8, 0xa3, 0x7b, 0x5b, 0x81, 0x87);
+DEFINE_GUID(GUID_ALLOW_STANDBY_STATES, 0xabfc2519, 0x3608, 0x4c2a, 0x94, 0xea, 0x17, 0x1b, 0x0e, 0xd5, 0x46, 0xab);
+DEFINE_GUID(GUID_ALLOW_RTC_WAKE, 0xBD3B718A, 0x0680, 0x4D9D, 0x8A, 0xB2, 0xE1, 0xD2, 0xB4, 0xAC, 0x80, 0x6D);
+DEFINE_GUID(GUID_ALLOW_SYSTEM_REQUIRED, 0xA4B195F5, 0x8225, 0x47D8, 0x80, 0x12, 0x9D, 0x41, 0x36, 0x97, 0x86, 0xE2);
+DEFINE_GUID(GUID_SYSTEM_BUTTON_SUBGROUP, 0x4F971E89, 0xEEBD, 0x4455, 0xA8, 0xDE, 0x9E, 0x59, 0x04, 0x0E, 0x73, 0x47);
+DEFINE_GUID(GUID_POWERBUTTON_ACTION, 0x7648EFA3, 0xDD9C, 0x4E3E, 0xB5, 0x66, 0x50, 0xF9, 0x29, 0x38, 0x62, 0x80);
+DEFINE_GUID(GUID_POWERBUTTON_ACTION_FLAGS, 0x857E7FAC, 0x034B, 0x4704, 0xAB, 0xB1, 0xBC, 0xA5, 0x4A, 0xA3, 0x14, 0x78);
+DEFINE_GUID(GUID_SLEEPBUTTON_ACTION, 0x96996BC0, 0xAD50, 0x47EC, 0x92, 0x3B, 0x6F, 0x41, 0x87, 0x4D, 0xD9, 0xEB);
+DEFINE_GUID(GUID_SLEEPBUTTON_ACTION_FLAGS, 0x2A160AB1, 0xB69D, 0x4743, 0xB7, 0x18, 0xBF, 0x14, 0x41, 0xD5, 0xE4, 0x93);
+DEFINE_GUID(GUID_USERINTERFACEBUTTON_ACTION, 0xA7066653, 0x8D6C, 0x40A8, 0x91, 0x0E, 0xA1, 0xF5, 0x4B, 0x84, 0xC7, 0xE5);
+DEFINE_GUID(GUID_LIDCLOSE_ACTION, 0x5CA83367, 0x6E45, 0x459F, 0xA2, 0x7B, 0x47, 0x6B, 0x1D, 0x01, 0xC9, 0x36);
+DEFINE_GUID(GUID_LIDCLOSE_ACTION_FLAGS, 0x97E969AC, 0x0D6C, 0x4D08, 0x92, 0x7C, 0xD7, 0xBD, 0x7A, 0xD7, 0x85, 0x7B);
+DEFINE_GUID(GUID_LIDOPEN_POWERSTATE, 0x99FF10E7, 0x23B1, 0x4C07, 0xA9, 0xD1, 0x5C, 0x32, 0x06, 0xD7, 0x41, 0xB4);
+DEFINE_GUID(GUID_BATTERY_SUBGROUP, 0xE73A048D, 0xBF27, 0x4F12, 0x97, 0x31, 0x8B, 0x20, 0x76, 0xE8, 0x89, 0x1F);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_0, 0x637EA02F, 0xBBCB, 0x4015, 0x8E, 0x2C, 0xA1, 0xC7, 0xB9, 0xC0, 0xB5, 0x46);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_0, 0x9A66D8D7, 0x4FF7, 0x4EF9, 0xB5, 0xA2, 0x5A, 0x32, 0x6C, 0xA2, 0xA4, 0x69);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_0, 0x5dbb7c9f, 0x38e9, 0x40d2, 0x97, 0x49, 0x4f, 0x8a, 0x0e, 0x9f, 0x64, 0x0f);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_1, 0xD8742DCB, 0x3E6A, 0x4B3C, 0xB3, 0xFE, 0x37, 0x46, 0x23, 0xCD, 0xCF, 0x06);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_1, 0x8183BA9A, 0xE910, 0x48DA, 0x87, 0x69, 0x14, 0xAE, 0x6D, 0xC1, 0x17, 0x0A);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_1, 0xbcded951, 0x187b, 0x4d05, 0xbc, 0xcc, 0xf7, 0xe5, 0x19, 0x60, 0xc2, 0x58);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_2, 0x421CBA38, 0x1A8E, 0x4881, 0xAC, 0x89, 0xE3, 0x3A, 0x8B, 0x04, 0xEC, 0xE4);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_2, 0x07A07CA2, 0xADAF, 0x40D7, 0xB0, 0x77, 0x53, 0x3A, 0xAD, 0xED, 0x1B, 0xFA);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_2, 0x7fd2f0c4, 0xfeb7, 0x4da3, 0x81, 0x17, 0xe3, 0xfb, 0xed, 0xc4, 0x65, 0x82);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_ACTION_3, 0x80472613, 0x9780, 0x455E, 0xB3, 0x08, 0x72, 0xD3, 0x00, 0x3C, 0xF2, 0xF8);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_LEVEL_3, 0x58AFD5A6, 0xC2DD, 0x47D2, 0x9F, 0xBF, 0xEF, 0x70, 0xCC, 0x5C, 0x59, 0x65);
+DEFINE_GUID(GUID_BATTERY_DISCHARGE_FLAGS_3, 0x73613ccf, 0xdbfa, 0x4279, 0x83, 0x56, 0x49, 0x35, 0xf6, 0xbf, 0x62, 0xf3);
+DEFINE_GUID(GUID_PROCESSOR_SETTINGS_SUBGROUP, 0x54533251, 0x82BE, 0x4824, 0x96, 0xC1, 0x47, 0xB6, 0x0B, 0x74, 0x0D, 0x00);
+DEFINE_GUID(GUID_PROCESSOR_THROTTLE_POLICY, 0x57027304, 0x4AF6, 0x4104, 0x92, 0x60, 0xE3, 0xD9, 0x52, 0x48, 0xFC, 0x36);
+DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MAXIMUM, 0xBC5038F7, 0x23E0, 0x4960, 0x96, 0xDA, 0x33, 0xAB, 0xAF, 0x59, 0x35, 0xEC);
+DEFINE_GUID(GUID_PROCESSOR_THROTTLE_MINIMUM, 0x893DEE8E, 0x2BEF, 0x41E0, 0x89, 0xC6, 0xB5, 0x5D, 0x09, 0x29, 0x96, 0x4C);
+DEFINE_GUID(GUID_PROCESSOR_ALLOW_THROTTLING, 0x3b04d4fd, 0x1cc7, 0x4f23, 0xab, 0x1c, 0xd1, 0x33, 0x78, 0x19, 0xc4, 0xbb);
DEFINE_GUID(GUID_PROCESSOR_IDLESTATE_POLICY, 0x68f262a7, 0xf621, 0x4069, 0xb9, 0xa5, 0x48, 0x74, 0x16, 0x9b, 0xe2, 0x3c);
DEFINE_GUID(GUID_PROCESSOR_PERFSTATE_POLICY, 0xBBDC3814, 0x18E9, 0x4463, 0x8A, 0x55, 0xD1, 0x97, 0x32, 0x7C, 0x45, 0xC0);
-DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d );
-DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6 );
+DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_THRESHOLD, 0x06cadf0e, 0x64ed, 0x448a, 0x89, 0x27, 0xce, 0x7b, 0xf9, 0x0e, 0xb3, 0x5d);
+DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_THRESHOLD, 0x12a0ab44, 0xfe28, 0x4fa9, 0xb3, 0xbd, 0x4b, 0x64, 0xf4, 0x49, 0x60, 0xa6);
DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_POLICY, 0x465e1f50, 0xb610, 0x473a, 0xab, 0x58, 0x0, 0xd1, 0x7, 0x7d, 0xc4, 0x18);
DEFINE_GUID(GUID_PROCESSOR_PERF_DECREASE_POLICY, 0x40fbefc7, 0x2e9d, 0x4d25, 0xa1, 0x85, 0xc, 0xfd, 0x85, 0x74, 0xba, 0xc6);
DEFINE_GUID(GUID_PROCESSOR_PERF_INCREASE_TIME, 0x984cf492, 0x3bed, 0x4488, 0xa8, 0xf9, 0x42, 0x86, 0xc9, 0x7b, 0xf5, 0xaa);
@@ -349,7 +350,7 @@ DEFINE_GUID(GUID_PROCESSOR_IDLE_DISABLE, 0x5d76a2ca, 0xe8c0, 0x402f, 0xa1, 0x33,
DEFINE_GUID(GUID_PROCESSOR_IDLE_TIME_CHECK, 0xc4581c31, 0x89ab, 0x4597, 0x8e, 0x2b, 0x9c, 0x9c, 0xab, 0x44, 0xe, 0x6b);
DEFINE_GUID(GUID_PROCESSOR_IDLE_DEMOTE_THRESHOLD, 0x4b92d758, 0x5a24, 0x4851, 0xa4, 0x70, 0x81, 0x5d, 0x78, 0xae, 0xe1, 0x19);
DEFINE_GUID(GUID_PROCESSOR_IDLE_PROMOTE_THRESHOLD, 0x7b224883, 0xb3cc, 0x4d79, 0x81, 0x9f, 0x83, 0x74, 0x15, 0x2c, 0xbe, 0x7c);
-DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1 );
+DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_THRESHOLD, 0xdf142941, 0x20f3, 0x4edf, 0x9a, 0x4a, 0x9c, 0x83, 0xd3, 0xd7, 0x17, 0xd1);
DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_THRESHOLD, 0x68dd2f27, 0xa4ce, 0x4e11, 0x84, 0x87, 0x37, 0x94, 0xe4, 0x13, 0x5d, 0xfa);
DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_INCREASE_POLICY, 0xc7be0679, 0x2817, 0x4d69, 0x9d, 0x02, 0x51, 0x9a, 0x53, 0x7e, 0xd0, 0xc6);
DEFINE_GUID(GUID_PROCESSOR_CORE_PARKING_DECREASE_POLICY, 0x71021b41, 0xc749, 0x4d21, 0xbe, 0x74, 0xa0, 0x0f, 0x33, 0x5d, 0x58, 0x2b);
@@ -368,17 +369,17 @@ DEFINE_GUID(GUID_PROCESSOR_PARKING_CORE_OVERRIDE, 0xa55612aa, 0xf624, 0x42c6, 0x
DEFINE_GUID(GUID_PROCESSOR_PARKING_PERF_STATE, 0x447235c7, 0x6a8d, 0x4cc0, 0x8e, 0x24, 0x9e, 0xaf, 0x70, 0xb9, 0x6e, 0x2b);
DEFINE_GUID(GUID_PROCESSOR_PERF_HISTORY, 0x7d24baa7, 0x0b84, 0x480f, 0x84, 0x0c, 0x1b, 0x07, 0x43, 0xc0, 0x0f, 0x5f);
DEFINE_GUID(GUID_SYSTEM_COOLING_POLICY, 0x94D3A615, 0xA899, 0x4AC5, 0xAE, 0x2B, 0xE4, 0xD8, 0xF6, 0x34, 0x36, 0x7F);
-DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51 );
-DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19 );
-DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48 );
-DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3 );
-DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1 );
-DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1 );
-DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E );
-DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA );
-DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20 );
-DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5 );
-DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6 );
+DEFINE_GUID(GUID_LOCK_CONSOLE_ON_WAKE, 0x0E796BDB, 0x100D, 0x47D6, 0xA2, 0xD5, 0xF7, 0xD2, 0xDA, 0xA5, 0x1F, 0x51);
+DEFINE_GUID(GUID_DEVICE_IDLE_POLICY, 0x4faab71a, 0x92e5, 0x4726, 0xb5, 0x31, 0x22, 0x45, 0x59, 0x67, 0x2d, 0x19);
+DEFINE_GUID(GUID_ACDC_POWER_SOURCE, 0x5D3E9A59, 0xE9D5, 0x4B00, 0xA6, 0xBD, 0xFF, 0x34, 0xFF, 0x51, 0x65, 0x48);
+DEFINE_GUID(GUID_LIDSWITCH_STATE_CHANGE, 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3);
+DEFINE_GUID(GUID_BATTERY_PERCENTAGE_REMAINING, 0xA7AD8041, 0xB45A, 0x4CAE, 0x87, 0xA3, 0xEE, 0xCB, 0xB4, 0x68, 0xA9, 0xE1);
+DEFINE_GUID(GUID_IDLE_BACKGROUND_TASK, 0x515C31D8, 0xF734, 0x163D, 0xA0, 0xFD, 0x11, 0xA0, 0x8C, 0x91, 0xE8, 0xF1);
+DEFINE_GUID(GUID_BACKGROUND_TASK_NOTIFICATION, 0xCF23F240, 0x2A54, 0x48D8, 0xB1, 0x14, 0xDE, 0x15, 0x18, 0xFF, 0x05, 0x2E);
+DEFINE_GUID(GUID_APPLAUNCH_BUTTON, 0x1A689231, 0x7399, 0x4E9A, 0x8F, 0x99, 0xB7, 0x1F, 0x99, 0x9D, 0xB3, 0xFA);
+DEFINE_GUID(GUID_PCIEXPRESS_SETTINGS_SUBGROUP, 0x501a4d13, 0x42af,0x4429, 0x9f, 0xd1, 0xa8, 0x21, 0x8c, 0x26, 0x8e, 0x20);
+DEFINE_GUID(GUID_PCIEXPRESS_ASPM_POLICY, 0xee12f906, 0xd277, 0x404b, 0xb6, 0xda, 0xe5, 0xfa, 0x1a, 0x57, 0x6d, 0xf5);
+DEFINE_GUID(GUID_ENABLE_SWITCH_FORCED_SHUTDOWN, 0x833a6b62, 0xdfa4, 0x46d1, 0x82, 0xf8, 0xe0, 0x9e, 0x34, 0xd0, 0x29, 0xd6);
#define PERFSTATE_POLICY_CHANGE_IDEAL 0
#define PERFSTATE_POLICY_CHANGE_SINGLE 1
@@ -408,5 +409,14 @@ NTSTATUS
IN ULONG ValueLength,
IN OUT PVOID Context OPTIONAL);
typedef POWER_SETTING_CALLBACK *PPOWER_SETTING_CALLBACK;
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+#define PO_CB_SYSTEM_POWER_POLICY 0
+#define PO_CB_AC_STATUS 1
+#define PO_CB_BUTTON_COLLISION 2
+#define PO_CB_SYSTEM_STATE_LOCK 3
+#define PO_CB_LID_SWITCH_STATE 4
+#define PO_CB_PROCESSOR_POWER_POLICY 5
+$endif (_NTIFS_)
diff --git a/include/xdk/psfuncs.h b/include/xdk/psfuncs.h
index 48666e64ab8..8564bd92693 100644
--- a/include/xdk/psfuncs.h
+++ b/include/xdk/psfuncs.h
@@ -27,7 +27,7 @@ PsGetCurrentThread(VOID)
}
#endif /* !_PSGETCURRENTTHREAD_ */
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
$if (_NTDDK_)
NTSYSCALLAPI
@@ -48,7 +48,23 @@ NtQueryInformationProcess(
OUT PVOID ProcessInformation OPTIONAL,
IN ULONG ProcessInformationLength,
OUT PULONG ReturnLength OPTIONAL);
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupProcessByProcessId(
+ IN HANDLE ProcessId,
+ OUT PEPROCESS *Process);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsLookupThreadByThreadId(
+ IN HANDLE UniqueThreadId,
+ OUT PETHREAD *Thread);
+$endif (_NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WIN2K)
@@ -71,7 +87,7 @@ NTAPI
PsTerminateSystemThread(
IN NTSTATUS ExitStatus);
-$endif /* _WDMDDK_ */
+$endif (_WDMDDK_)
$if (_NTDDK_)
NTKERNELAPI
@@ -111,13 +127,93 @@ PsGetVersion(
OUT PULONG MinorVersion OPTIONAL,
OUT PULONG BuildNumber OPTIONAL,
OUT PUNICODE_STRING CSDVersion OPTIONAL);
-$endif /* _NTDDK_ */
+$endif (_NTDDK_)
+$if (_NTIFS_)
+NTKERNELAPI
+PACCESS_TOKEN
+NTAPI
+PsReferenceImpersonationToken(
+ IN OUT PETHREAD Thread,
+ OUT PBOOLEAN CopyOnOpen,
+ OUT PBOOLEAN EffectiveOnly,
+ OUT PSECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
+
+NTKERNELAPI
+LARGE_INTEGER
+NTAPI
+PsGetProcessExitTime(VOID);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsIsThreadTerminating(
+ IN PETHREAD Thread);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsImpersonateClient(
+ IN OUT PETHREAD Thread,
+ IN PACCESS_TOKEN Token,
+ IN BOOLEAN CopyOnOpen,
+ IN BOOLEAN EffectiveOnly,
+ IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsDisableImpersonation(
+ IN OUT PETHREAD Thread,
+ IN OUT PSE_IMPERSONATION_STATE ImpersonationState);
+
+NTKERNELAPI
+VOID
+NTAPI
+PsRestoreImpersonation(
+ IN PETHREAD Thread,
+ IN PSE_IMPERSONATION_STATE ImpersonationState);
+
+NTKERNELAPI
+VOID
+NTAPI
+PsRevertToSelf(VOID);
+
+NTKERNELAPI
+VOID
+NTAPI
+PsChargePoolQuota(
+ IN PEPROCESS Process,
+ IN POOL_TYPE PoolType,
+ IN ULONG_PTR Amount);
+
+NTKERNELAPI
+VOID
+NTAPI
+PsReturnPoolQuota(
+ IN PEPROCESS Process,
+ IN POOL_TYPE PoolType,
+ IN ULONG_PTR Amount);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsAssignImpersonationToken(
+ IN PETHREAD Thread,
+ IN HANDLE Token OPTIONAL);
+
+NTKERNELAPI
+HANDLE
+NTAPI
+PsReferencePrimaryToken(
+ IN OUT PEPROCESS Process);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+$if (_NTDDK_ || _NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+$endif
$if (_NTDDK_)
-#if (NTDDI_VERSION >= NTDDI_WINXP)
-
NTKERNELAPI
HANDLE
NTAPI
@@ -147,9 +243,40 @@ LONGLONG
NTAPI
PsGetProcessCreateTimeQuadPart(
IN PEPROCESS Process);
+$endif (_NTDDK_)
+$if (_NTIFS_)
+NTKERNELAPI
+VOID
+NTAPI
+PsDereferencePrimaryToken(
+ IN PACCESS_TOKEN PrimaryToken);
+
+NTKERNELAPI
+VOID
+NTAPI
+PsDereferenceImpersonationToken(
+ IN PACCESS_TOKEN ImpersonationToken);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+PsChargeProcessPoolQuota(
+ IN PEPROCESS Process,
+ IN POOL_TYPE PoolType,
+ IN ULONG_PTR Amount);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+PsIsSystemThread(
+ IN PETHREAD Thread);
+$endif (_NTIFS_)
+$if (_NTDDK_ || _NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+$endif
+$if (_NTDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03)
NTKERNELAPI
HANDLE
@@ -181,4 +308,4 @@ PsSetCreateProcessNotifyRoutineEx(
IN PCREATE_PROCESS_NOTIFY_ROUTINE_EX NotifyRoutine,
IN BOOLEAN Remove);
#endif /* (NTDDI_VERSION >= NTDDI_VISTASP1) */
-$endif
+$endif (_NTDDK_)
diff --git a/include/xdk/pstypes.h b/include/xdk/pstypes.h
index adda1fb12b5..3cd35ff9821 100644
--- a/include/xdk/pstypes.h
+++ b/include/xdk/pstypes.h
@@ -19,7 +19,7 @@ $if (_WDMDDK_)
#define THREAD_SET_LIMITED_INFORMATION 0x0400
#define THREAD_QUERY_LIMITED_INFORMATION 0x0800
-#define PROCESS_DUP_HANDLE (0x0040)
+#define PROCESS_DUP_HANDLE (0x0040)
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define PROCESS_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xFFFF)
@@ -58,7 +58,7 @@ typedef struct _QUOTA_LIMITS {
typedef union _RATE_QUOTA_LIMIT {
ULONG RateData;
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG RatePercent:7;
ULONG Reserved0:25;
} DUMMYSTRUCTNAME;
@@ -164,13 +164,13 @@ typedef VOID
typedef struct _PS_CREATE_NOTIFY_INFO {
IN SIZE_T Size;
- union {
+ _ANONYMOUS_UNION union {
IN ULONG Flags;
- struct {
+ _ANONYMOUS_STRUCT struct {
IN ULONG FileOpenNameAvailable:1;
IN ULONG Reserved:31;
- };
- };
+ } DUMMYSTRUCTNAME;
+ } DUMMYUNIONNAME;
IN HANDLE ParentProcessId;
IN CLIENT_ID CreatingThreadId;
IN OUT struct _FILE_OBJECT *FileObject;
@@ -247,10 +247,10 @@ typedef struct _NT_TIB32 {
ULONG StackBase;
ULONG StackLimit;
ULONG SubSystemTib;
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
ULONG FiberData;
ULONG Version;
- };
+ } DUMMYUNIONNAME;
ULONG ArbitraryUserPointer;
ULONG Self;
} NT_TIB32,*PNT_TIB32;
@@ -260,10 +260,10 @@ typedef struct _NT_TIB64 {
ULONG64 StackBase;
ULONG64 StackLimit;
ULONG64 SubSystemTib;
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
ULONG64 FiberData;
ULONG Version;
- };
+ } DUMMYUNIONNAME;
ULONG64 ArbitraryUserPointer;
ULONG64 Self;
} NT_TIB64,*PNT_TIB64;
@@ -382,9 +382,9 @@ typedef struct _PROCESS_BASIC_INFORMATION {
typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
SIZE_T Size;
PROCESS_BASIC_INFORMATION BasicInfo;
- union {
+ _ANONYMOUS_UNION union {
ULONG Flags;
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONG IsProtectedProcess:1;
ULONG IsWow64Process:1;
ULONG IsProcessDeleting:1;
@@ -395,7 +395,7 @@ typedef struct _PROCESS_EXTENDED_BASIC_INFORMATION {
} PROCESS_EXTENDED_BASIC_INFORMATION, *PPROCESS_EXTENDED_BASIC_INFORMATION;
typedef struct _PROCESS_DEVICEMAP_INFORMATION {
- __GNU_EXTENSION union {
+ _ANONYMOUS_UNION union {
struct {
HANDLE DirectoryHandle;
} Set;
@@ -403,11 +403,11 @@ typedef struct _PROCESS_DEVICEMAP_INFORMATION {
ULONG DriveMap;
UCHAR DriveType[32];
} Query;
- };
+ } DUMMYUNIONNAME;
} PROCESS_DEVICEMAP_INFORMATION, *PPROCESS_DEVICEMAP_INFORMATION;
typedef struct _PROCESS_DEVICEMAP_INFORMATION_EX {
- union {
+ _ANONYMOUS_UNION union {
struct {
HANDLE DirectoryHandle;
} Set;
diff --git a/include/xdk/rtlfuncs.h b/include/xdk/rtlfuncs.h
index a5302dcea9f..a8cd1c6d490 100644
--- a/include/xdk/rtlfuncs.h
+++ b/include/xdk/rtlfuncs.h
@@ -241,264 +241,10 @@ RtlStringFromGUID(
memset(Destination, 0, Length)
#define RtlZeroBytes RtlZeroMemory
+$endif (_WDMDDK_)
-$endif
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-$if (_NTIFS_)
-NTSYSAPI
-PVOID
-NTAPI
-RtlAllocateHeap(
- IN HANDLE HeapHandle,
- IN ULONG Flags OPTIONAL,
- IN SIZE_T Size);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlFreeHeap(
- IN PVOID HeapHandle,
- IN ULONG Flags OPTIONAL,
- IN PVOID BaseAddress);
-
-$endif
-
-$if (_NTDDK_)
-
-#ifndef RTL_USE_AVL_TABLES
-
-NTSYSAPI
-VOID
-NTAPI
-RtlInitializeGenericTable(
- OUT PRTL_GENERIC_TABLE Table,
- IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
- IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
- IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
- IN PVOID TableContext OPTIONAL);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlInsertElementGenericTable(
- IN PRTL_GENERIC_TABLE Table,
- IN PVOID Buffer,
- IN CLONG BufferSize,
- OUT PBOOLEAN NewElement OPTIONAL);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlInsertElementGenericTableFull(
- IN PRTL_GENERIC_TABLE Table,
- IN PVOID Buffer,
- IN CLONG BufferSize,
- OUT PBOOLEAN NewElement OPTIONAL,
- IN PVOID NodeOrParent,
- IN TABLE_SEARCH_RESULT SearchResult);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlDeleteElementGenericTable(
- IN PRTL_GENERIC_TABLE Table,
- IN PVOID Buffer);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlLookupElementGenericTable(
- IN PRTL_GENERIC_TABLE Table,
- IN PVOID Buffer);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlLookupElementGenericTableFull(
- IN PRTL_GENERIC_TABLE Table,
- IN PVOID Buffer,
- OUT PVOID *NodeOrParent,
- OUT TABLE_SEARCH_RESULT *SearchResult);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlEnumerateGenericTable(
- IN PRTL_GENERIC_TABLE Table,
- IN BOOLEAN Restart);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlEnumerateGenericTableWithoutSplaying(
- IN PRTL_GENERIC_TABLE Table,
- IN OUT PVOID *RestartKey);
-
-NTSYSAPI
-PVOID
-NTAPI
-RtlGetElementGenericTable(
- IN PRTL_GENERIC_TABLE Table,
- IN ULONG I);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlNumberGenericTableElements(
- IN PRTL_GENERIC_TABLE Table);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlIsGenericTableEmpty(
- IN PRTL_GENERIC_TABLE Table);
-
-#endif /* !RTL_USE_AVL_TABLES */
-
-#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlSplay(
- IN OUT PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlDelete(
- IN PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlDeleteNoSplay(
- IN PRTL_SPLAY_LINKS Links,
- IN OUT PRTL_SPLAY_LINKS *Root);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlSubtreeSuccessor(
- IN PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlSubtreePredecessor(
- IN PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlRealSuccessor(
- IN PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-PRTL_SPLAY_LINKS
-NTAPI
-RtlRealPredecessor(
- IN PRTL_SPLAY_LINKS Links);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlPrefixUnicodeString(
- IN PCUNICODE_STRING String1,
- IN PCUNICODE_STRING String2,
- IN BOOLEAN CaseInSensitive);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlUpperString(
- IN OUT PSTRING DestinationString,
- IN const PSTRING SourceString);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlUpcaseUnicodeString(
- IN OUT PUNICODE_STRING DestinationString,
- IN PCUNICODE_STRING SourceString,
- IN BOOLEAN AllocateDestinationString);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlMapGenericMask(
- IN OUT PACCESS_MASK AccessMask,
- IN PGENERIC_MAPPING GenericMapping);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVolumeDeviceToDosName(
- IN PVOID VolumeDeviceObject,
- OUT PUNICODE_STRING DosName);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlGetVersion(
- IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlVerifyVersionInfo(
- IN PRTL_OSVERSIONINFOEXW VersionInfo,
- IN ULONG TypeMask,
- IN ULONGLONG ConditionMask);
-
-NTSYSAPI
-LONG
-NTAPI
-RtlCompareString(
- IN const PSTRING String1,
- IN const PSTRING String2,
- IN BOOLEAN CaseInSensitive);
-
-NTSYSAPI
-VOID
-NTAPI
-RtlCopyString(
- OUT PSTRING DestinationString,
- IN const PSTRING SourceString OPTIONAL);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlEqualString(
- IN const PSTRING String1,
- IN const PSTRING String2,
- IN BOOLEAN CaseInSensitive);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlCharToInteger(
- IN PCSZ String,
- IN ULONG Base OPTIONAL,
- OUT PULONG Value);
-
-NTSYSAPI
-CHAR
-NTAPI
-RtlUpperChar(
- IN CHAR Character);
-
-NTSYSAPI
-ULONG
-NTAPI
-RtlWalkFrameChain(
- OUT PVOID *Callers,
- IN ULONG Count,
- IN ULONG Flags);
-
-$endif
-
$if (_WDMDDK_)
NTSYSAPI
BOOLEAN
@@ -978,7 +724,6 @@ RtlSetDaclSecurityDescriptor(
#define RtlStoreUlongPtr(Address,Value) RtlStoreUlong(Address,Value)
#endif /* _WIN64 */
-
NTSYSAPI
BOOLEAN
NTAPI
@@ -1070,6 +815,791 @@ RtlWriteRegistryValue(
IN PVOID ValueData,
IN ULONG ValueLength);
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+
+#ifndef RTL_USE_AVL_TABLES
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeGenericTable(
+ OUT PRTL_GENERIC_TABLE Table,
+ IN PRTL_GENERIC_COMPARE_ROUTINE CompareRoutine,
+ IN PRTL_GENERIC_ALLOCATE_ROUTINE AllocateRoutine,
+ IN PRTL_GENERIC_FREE_ROUTINE FreeRoutine,
+ IN PVOID TableContext OPTIONAL);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer,
+ IN CLONG BufferSize,
+ OUT PBOOLEAN NewElement OPTIONAL);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlInsertElementGenericTableFull(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer,
+ IN CLONG BufferSize,
+ OUT PBOOLEAN NewElement OPTIONAL,
+ IN PVOID NodeOrParent,
+ IN TABLE_SEARCH_RESULT SearchResult);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlDeleteElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlLookupElementGenericTableFull(
+ IN PRTL_GENERIC_TABLE Table,
+ IN PVOID Buffer,
+ OUT PVOID *NodeOrParent,
+ OUT TABLE_SEARCH_RESULT *SearchResult);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN BOOLEAN Restart);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlEnumerateGenericTableWithoutSplaying(
+ IN PRTL_GENERIC_TABLE Table,
+ IN OUT PVOID *RestartKey);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlGetElementGenericTable(
+ IN PRTL_GENERIC_TABLE Table,
+ IN ULONG I);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNumberGenericTableElements(
+ IN PRTL_GENERIC_TABLE Table);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsGenericTableEmpty(
+ IN PRTL_GENERIC_TABLE Table);
+
+#endif /* !RTL_USE_AVL_TABLES */
+
+#define RTL_STACK_WALKING_MODE_FRAMES_TO_SKIP_SHIFT 8
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSplay(
+ IN OUT PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlDelete(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlDeleteNoSplay(
+ IN PRTL_SPLAY_LINKS Links,
+ IN OUT PRTL_SPLAY_LINKS *Root);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreeSuccessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlSubtreePredecessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlRealSuccessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+PRTL_SPLAY_LINKS
+NTAPI
+RtlRealPredecessor(
+ IN PRTL_SPLAY_LINKS Links);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlPrefixUnicodeString(
+ IN PCUNICODE_STRING String1,
+ IN PCUNICODE_STRING String2,
+ IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlUpperString(
+ IN OUT PSTRING DestinationString,
+ IN const PSTRING SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeString(
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlMapGenericMask(
+ IN OUT PACCESS_MASK AccessMask,
+ IN PGENERIC_MAPPING GenericMapping);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVolumeDeviceToDosName(
+ IN PVOID VolumeDeviceObject,
+ OUT PUNICODE_STRING DosName);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetVersion(
+ IN OUT PRTL_OSVERSIONINFOW lpVersionInformation);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlVerifyVersionInfo(
+ IN PRTL_OSVERSIONINFOEXW VersionInfo,
+ IN ULONG TypeMask,
+ IN ULONGLONG ConditionMask);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareString(
+ IN const PSTRING String1,
+ IN const PSTRING String2,
+ IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyString(
+ OUT PSTRING DestinationString,
+ IN const PSTRING SourceString OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualString(
+ IN const PSTRING String1,
+ IN const PSTRING String2,
+ IN BOOLEAN CaseInSensitive);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCharToInteger(
+ IN PCSZ String,
+ IN ULONG Base OPTIONAL,
+ OUT PULONG Value);
+
+NTSYSAPI
+CHAR
+NTAPI
+RtlUpperChar(
+ IN CHAR Character);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlWalkFrameChain(
+ OUT PVOID *Callers,
+ IN ULONG Count,
+ IN ULONG Flags);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlAllocateHeap(
+ IN HANDLE HeapHandle,
+ IN ULONG Flags OPTIONAL,
+ IN SIZE_T Size);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlFreeHeap(
+ IN PVOID HeapHandle,
+ IN ULONG Flags OPTIONAL,
+ IN PVOID BaseAddress);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCaptureContext(
+ OUT PCONTEXT ContextRecord);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlRandom(
+ IN OUT PULONG Seed);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlCreateUnicodeString(
+ OUT PUNICODE_STRING DestinationString,
+ IN PCWSTR SourceString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAppendStringToString(
+ IN OUT PSTRING Destination,
+ IN const STRING *Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemStringToUnicodeString(
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCOEM_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeStringToOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemStringToCountedUnicodeString(
+ IN OUT PUNICODE_STRING DestinationString,
+ IN PCOEM_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeStringToCountedOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeStringToCountedOemString(
+ IN OUT POEM_STRING DestinationString,
+ IN PCUNICODE_STRING SourceString,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDowncaseUnicodeString(
+ IN OUT PUNICODE_STRING UniDest,
+ IN PCUNICODE_STRING UniSource,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFreeOemString (
+ IN OUT POEM_STRING OemString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxUnicodeStringToOemSize(
+ IN PCUNICODE_STRING UnicodeString);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlxOemStringToUnicodeSize(
+ IN PCOEM_STRING OemString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultiByteToUnicodeN(
+ OUT PWCH UnicodeString,
+ IN ULONG MaxBytesInUnicodeString,
+ OUT PULONG BytesInUnicodeString OPTIONAL,
+ IN const CHAR *MultiByteString,
+ IN ULONG BytesInMultiByteString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlMultiByteToUnicodeSize(
+ OUT PULONG BytesInUnicodeString,
+ IN const CHAR *MultiByteString,
+ IN ULONG BytesInMultiByteString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToMultiByteSize(
+ OUT PULONG BytesInMultiByteString,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToMultiByteN(
+ OUT PCHAR MultiByteString,
+ IN ULONG MaxBytesInMultiByteString,
+ OUT PULONG BytesInMultiByteString OPTIONAL,
+ IN PWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToMultiByteN(
+ OUT PCHAR MultiByteString,
+ IN ULONG MaxBytesInMultiByteString,
+ OUT PULONG BytesInMultiByteString OPTIONAL,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlOemToUnicodeN(
+ OUT PWSTR UnicodeString,
+ IN ULONG MaxBytesInUnicodeString,
+ OUT PULONG BytesInUnicodeString OPTIONAL,
+ IN PCCH OemString,
+ IN ULONG BytesInOemString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToOemN(
+ OUT PCHAR OemString,
+ IN ULONG MaxBytesInOemString,
+ OUT PULONG BytesInOemString OPTIONAL,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToOemN(
+ OUT PCHAR OemString,
+ IN ULONG MaxBytesInOemString,
+ OUT PULONG BytesInOemString OPTIONAL,
+ IN PCWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+#if (NTDDI_VERSION >= NTDDI_VISTASP1)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGenerate8dot3Name(
+ IN PCUNICODE_STRING Name,
+ IN BOOLEAN AllowExtendedCharacters,
+ IN OUT PGENERATE_NAME_CONTEXT Context,
+ IN OUT PUNICODE_STRING Name8dot3);
+#else
+NTSYSAPI
+VOID
+NTAPI
+RtlGenerate8dot3Name(
+ IN PCUNICODE_STRING Name,
+ IN BOOLEAN AllowExtendedCharacters,
+ IN OUT PGENERATE_NAME_CONTEXT Context,
+ IN OUT PUNICODE_STRING Name8dot3);
+#endif
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsNameLegalDOS8Dot3(
+ IN PCUNICODE_STRING Name,
+ IN OUT POEM_STRING OemName OPTIONAL,
+ IN OUT PBOOLEAN NameContainsSpaces OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlIsValidOemCharacter(
+ IN OUT PWCHAR Char);
+
+NTSYSAPI
+VOID
+NTAPI
+PfxInitialize(
+ OUT PPREFIX_TABLE PrefixTable);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+PfxInsertPrefix(
+ IN PPREFIX_TABLE PrefixTable,
+ IN PSTRING Prefix,
+ OUT PPREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+VOID
+NTAPI
+PfxRemovePrefix(
+ IN PPREFIX_TABLE PrefixTable,
+ IN PPREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+PPREFIX_TABLE_ENTRY
+NTAPI
+PfxFindPrefix(
+ IN PPREFIX_TABLE PrefixTable,
+ IN PSTRING FullName);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitializeUnicodePrefix(
+ OUT PUNICODE_PREFIX_TABLE PrefixTable);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlInsertUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN PUNICODE_STRING Prefix,
+ OUT PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlRemoveUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN PUNICODE_PREFIX_TABLE_ENTRY PrefixTableEntry);
+
+NTSYSAPI
+PUNICODE_PREFIX_TABLE_ENTRY
+NTAPI
+RtlFindUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN PUNICODE_STRING FullName,
+ IN ULONG CaseInsensitiveIndex);
+
+NTSYSAPI
+PUNICODE_PREFIX_TABLE_ENTRY
+NTAPI
+RtlNextUnicodePrefix(
+ IN PUNICODE_PREFIX_TABLE PrefixTable,
+ IN BOOLEAN Restart);
+
+NTSYSAPI
+SIZE_T
+NTAPI
+RtlCompareMemoryUlong(
+ IN PVOID Source,
+ IN SIZE_T Length,
+ IN ULONG Pattern);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeToSecondsSince1980(
+ IN PLARGE_INTEGER Time,
+ OUT PULONG ElapsedSeconds);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSecondsSince1980ToTime(
+ IN ULONG ElapsedSeconds,
+ OUT PLARGE_INTEGER Time);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTimeToSecondsSince1970(
+ IN PLARGE_INTEGER Time,
+ OUT PULONG ElapsedSeconds);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSecondsSince1970ToTime(
+ IN ULONG ElapsedSeconds,
+ OUT PLARGE_INTEGER Time);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlValidSid(
+ IN PSID Sid);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualSid(
+ IN PSID Sid1,
+ IN PSID Sid2);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlEqualPrefixSid(
+ IN PSID Sid1,
+ IN PSID Sid2);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthRequiredSid(
+ IN ULONG SubAuthorityCount);
+
+NTSYSAPI
+PVOID
+NTAPI
+RtlFreeSid(
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAllocateAndInitializeSid(
+ IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
+ IN UCHAR SubAuthorityCount,
+ IN ULONG SubAuthority0,
+ IN ULONG SubAuthority1,
+ IN ULONG SubAuthority2,
+ IN ULONG SubAuthority3,
+ IN ULONG SubAuthority4,
+ IN ULONG SubAuthority5,
+ IN ULONG SubAuthority6,
+ IN ULONG SubAuthority7,
+ OUT PSID *Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitializeSid(
+ OUT PSID Sid,
+ IN PSID_IDENTIFIER_AUTHORITY IdentifierAuthority,
+ IN UCHAR SubAuthorityCount);
+
+NTSYSAPI
+PULONG
+NTAPI
+RtlSubAuthoritySid(
+ IN PSID Sid,
+ IN ULONG SubAuthority);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlLengthSid(
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCopySid(
+ IN ULONG Length,
+ IN PSID Destination,
+ IN PSID Source);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlConvertSidToUnicodeString(
+ IN OUT PUNICODE_STRING UnicodeString,
+ IN PSID Sid,
+ IN BOOLEAN AllocateDestinationString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlCopyLuid(
+ OUT PLUID DestinationLuid,
+ IN PLUID SourceLuid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateAcl(
+ OUT PACL Acl,
+ IN ULONG AclLength,
+ IN ULONG AclRevision);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAce(
+ IN OUT PACL Acl,
+ IN ULONG AceRevision,
+ IN ULONG StartingAceIndex,
+ IN PVOID AceList,
+ IN ULONG AceListLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDeleteAce(
+ IN OUT PACL Acl,
+ IN ULONG AceIndex);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetAce(
+ IN PACL Acl,
+ IN ULONG AceIndex,
+ OUT PVOID *Ace);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAccessAllowedAce(
+ IN OUT PACL Acl,
+ IN ULONG AceRevision,
+ IN ACCESS_MASK AccessMask,
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAddAccessAllowedAceEx(
+ IN OUT PACL Acl,
+ IN ULONG AceRevision,
+ IN ULONG AceFlags,
+ IN ACCESS_MASK AccessMask,
+ IN PSID Sid);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSecurityDescriptorRelative(
+ OUT PISECURITY_DESCRIPTOR_RELATIVE SecurityDescriptor,
+ IN ULONG Revision);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetDaclSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PBOOLEAN DaclPresent,
+ OUT PACL *Dacl,
+ OUT PBOOLEAN DaclDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetOwnerSecurityDescriptor(
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID Owner OPTIONAL,
+ IN BOOLEAN OwnerDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetOwnerSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PSID *Owner,
+ OUT PBOOLEAN OwnerDefaulted);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNtStatusToDosError(
+ IN NTSTATUS Status);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCustomCPToUnicodeN(
+ IN PCPTABLEINFO CustomCP,
+ OUT PWCH UnicodeString,
+ IN ULONG MaxBytesInUnicodeString,
+ OUT PULONG BytesInUnicodeString OPTIONAL,
+ IN PCH CustomCPString,
+ IN ULONG BytesInCustomCPString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToCustomCPN(
+ IN PCPTABLEINFO CustomCP,
+ OUT PCH CustomCPString,
+ IN ULONG MaxBytesInCustomCPString,
+ OUT PULONG BytesInCustomCPString OPTIONAL,
+ IN PWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUpcaseUnicodeToCustomCPN(
+ IN PCPTABLEINFO CustomCP,
+ OUT PCH CustomCPString,
+ IN ULONG MaxBytesInCustomCPString,
+ OUT PULONG BytesInCustomCPString OPTIONAL,
+ IN PWCH UnicodeString,
+ IN ULONG BytesInUnicodeString);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlInitCodePageTable(
+ IN PUSHORT TableBase,
+ IN OUT PCPTABLEINFO CodePageTable);
+
$endif
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
@@ -1089,6 +1619,46 @@ $endif
#if (NTDDI_VERSION >= NTDDI_WINXP)
+$if (_WDMDDK_)
+
+NTSYSAPI
+VOID
+NTAPI
+RtlClearBit(
+ PRTL_BITMAP BitMapHeader,
+ ULONG BitNumber);
+
+NTSYSAPI
+WCHAR
+NTAPI
+RtlDowncaseUnicodeChar(
+ IN WCHAR SourceCharacter);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlSetBit(
+ PRTL_BITMAP BitMapHeader,
+ ULONG BitNumber);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlTestBit(
+ IN PRTL_BITMAP BitMapHeader,
+ IN ULONG BitNumber);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlHashUnicodeString(
+ IN CONST UNICODE_STRING *String,
+ IN BOOLEAN CaseInSensitive,
+ IN ULONG HashAlgorithm,
+ OUT PULONG HashValue);
+
+$endif (_WDMDDK_)
+
$if (_NTDDK_)
NTSYSAPI
@@ -1197,99 +1767,293 @@ NTAPI
RtlIsGenericTableEmptyAvl(
IN PRTL_AVL_TABLE Table);
-$endif
-
-$if (_WDMDDK_)
+$endif (_NTDDK_)
+$if (_NTIFS_)
NTSYSAPI
-VOID
+PVOID
NTAPI
-RtlClearBit(
- PRTL_BITMAP BitMapHeader,
- ULONG BitNumber);
+RtlCreateHeap(
+ IN ULONG Flags,
+ IN PVOID HeapBase OPTIONAL,
+ IN SIZE_T ReserveSize OPTIONAL,
+ IN SIZE_T CommitSize OPTIONAL,
+ IN PVOID Lock OPTIONAL,
+ IN PRTL_HEAP_PARAMETERS Parameters OPTIONAL);
NTSYSAPI
-WCHAR
+PVOID
NTAPI
-RtlDowncaseUnicodeChar(
- IN WCHAR SourceCharacter);
+RtlDestroyHeap(
+ IN PVOID HeapHandle);
NTSYSAPI
-VOID
+USHORT
NTAPI
-RtlSetBit(
- PRTL_BITMAP BitMapHeader,
- ULONG BitNumber);
+RtlCaptureStackBackTrace(
+ IN ULONG FramesToSkip,
+ IN ULONG FramesToCapture,
+ OUT PVOID *BackTrace,
+ OUT PULONG BackTraceHash OPTIONAL);
NTSYSAPI
-BOOLEAN
+ULONG
NTAPI
-RtlTestBit(
- IN PRTL_BITMAP BitMapHeader,
- IN ULONG BitNumber);
+RtlRandomEx(
+ IN OUT PULONG Seed);
NTSYSAPI
NTSTATUS
NTAPI
-RtlHashUnicodeString(
- IN CONST UNICODE_STRING *String,
- IN BOOLEAN CaseInSensitive,
- IN ULONG HashAlgorithm,
- OUT PULONG HashValue);
+RtlInitUnicodeStringEx(
+ OUT PUNICODE_STRING DestinationString,
+ IN PCWSTR SourceString OPTIONAL);
-$endif
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlValidateUnicodeString(
+ IN ULONG Flags,
+ IN PCUNICODE_STRING String);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDuplicateUnicodeString(
+ IN ULONG Flags,
+ IN PCUNICODE_STRING SourceString,
+ OUT PUNICODE_STRING DestinationString);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetCompressionWorkSpaceSize(
+ IN USHORT CompressionFormatAndEngine,
+ OUT PULONG CompressBufferWorkSpaceSize,
+ OUT PULONG CompressFragmentWorkSpaceSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCompressBuffer(
+ IN USHORT CompressionFormatAndEngine,
+ IN PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ OUT PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN ULONG UncompressedChunkSize,
+ OUT PULONG FinalCompressedSize,
+ IN PVOID WorkSpace);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressBuffer(
+ IN USHORT CompressionFormat,
+ OUT PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ IN PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ OUT PULONG FinalUncompressedSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressFragment(
+ IN USHORT CompressionFormat,
+ OUT PUCHAR UncompressedFragment,
+ IN ULONG UncompressedFragmentSize,
+ IN PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN ULONG FragmentOffset,
+ OUT PULONG FinalUncompressedSize,
+ IN PVOID WorkSpace);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDescribeChunk(
+ IN USHORT CompressionFormat,
+ IN OUT PUCHAR *CompressedBuffer,
+ IN PUCHAR EndOfCompressedBufferPlus1,
+ OUT PUCHAR *ChunkBuffer,
+ OUT PULONG ChunkSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlReserveChunk(
+ IN USHORT CompressionFormat,
+ IN OUT PUCHAR *CompressedBuffer,
+ IN PUCHAR EndOfCompressedBufferPlus1,
+ OUT PUCHAR *ChunkBuffer,
+ IN ULONG ChunkSize);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlDecompressChunks(
+ OUT PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ IN PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN PUCHAR CompressedTail,
+ IN ULONG CompressedTailSize,
+ IN PCOMPRESSED_DATA_INFO CompressedDataInfo);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCompressChunks(
+ IN PUCHAR UncompressedBuffer,
+ IN ULONG UncompressedBufferSize,
+ OUT PUCHAR CompressedBuffer,
+ IN ULONG CompressedBufferSize,
+ IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
+ IN ULONG CompressedDataInfoLength,
+ IN PVOID WorkSpace);
+
+NTSYSAPI
+PSID_IDENTIFIER_AUTHORITY
+NTAPI
+RtlIdentifierAuthoritySid(
+ IN PSID Sid);
+
+NTSYSAPI
+PUCHAR
+NTAPI
+RtlSubAuthorityCountSid(
+ IN PSID Sid);
+
+NTSYSAPI
+ULONG
+NTAPI
+RtlNtStatusToDosErrorNoTeb(
+ IN NTSTATUS Status);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateSystemVolumeInformationFolder(
+ IN PCUNICODE_STRING VolumeRootPath);
+
+#if defined(_M_AMD64)
+
+FORCEINLINE
+VOID
+RtlFillMemoryUlong (
+ OUT PVOID Destination,
+ IN SIZE_T Length,
+ IN ULONG Pattern)
+{
+ PULONG Address = (PULONG)Destination;
+ if ((Length /= 4) != 0) {
+ if (((ULONG64)Address & 4) != 0) {
+ *Address = Pattern;
+ if ((Length -= 1) == 0) {
+ return;
+ }
+ Address += 1;
+ }
+ __stosq((PULONG64)(Address), Pattern | ((ULONG64)Pattern << 32), Length / 2);
+ if ((Length & 1) != 0) Address[Length - 1] = Pattern;
+ }
+ return;
+}
+
+#define RtlFillMemoryUlonglong(Destination, Length, Pattern) \
+ __stosq((PULONG64)(Destination), Pattern, (Length) / 8)
+
+#else
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlong(
+ OUT PVOID Destination,
+ IN SIZE_T Length,
+ IN ULONG Pattern);
+
+NTSYSAPI
+VOID
+NTAPI
+RtlFillMemoryUlonglong(
+ OUT PVOID Destination,
+ IN SIZE_T Length,
+ IN ULONGLONG Pattern);
+
+#endif /* defined(_M_AMD64) */
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+$if (_NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WS03)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlInitAnsiStringEx(
+ OUT PANSI_STRING DestinationString,
+ IN PCSZ SourceString OPTIONAL);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WS03SP1)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetSaclSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PBOOLEAN SaclPresent,
+ OUT PACL *Sacl,
+ OUT PBOOLEAN SaclDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSetGroupSecurityDescriptor(
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID Group OPTIONAL,
+ IN BOOLEAN GroupDefaulted OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlGetGroupSecurityDescriptor(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ OUT PSID *Group,
+ OUT PBOOLEAN GroupDefaulted);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlAbsoluteToSelfRelativeSD(
+ IN PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor,
+ OUT PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor OPTIONAL,
+ IN OUT PULONG BufferLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlSelfRelativeToAbsoluteSD(
+ IN PSECURITY_DESCRIPTOR SelfRelativeSecurityDescriptor,
+ OUT PSECURITY_DESCRIPTOR AbsoluteSecurityDescriptor OPTIONAL,
+ IN OUT PULONG AbsoluteSecurityDescriptorSize,
+ OUT PACL Dacl OPTIONAL,
+ IN OUT PULONG DaclSize,
+ OUT PACL Sacl OPTIONAL,
+ IN OUT PULONG SaclSize,
+ OUT PSID Owner OPTIONAL,
+ IN OUT PULONG OwnerSize,
+ OUT PSID PrimaryGroup OPTIONAL,
+ IN OUT PULONG PrimaryGroupSize);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+$endif (_NTIFS_)
+
#if (NTDDI_VERSION >= NTDDI_VISTA)
-$if (_NTDDK_)
-
-NTSYSAPI
-VOID
-NTAPI
-RtlRunOnceInitialize(
- OUT PRTL_RUN_ONCE RunOnce);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlRunOnceExecuteOnce(
- IN OUT PRTL_RUN_ONCE RunOnce,
- IN PRTL_RUN_ONCE_INIT_FN InitFn,
- IN OUT PVOID Parameter OPTIONAL,
- OUT PVOID *Context OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlRunOnceBeginInitialize(
- IN OUT PRTL_RUN_ONCE RunOnce,
- IN ULONG Flags,
- OUT PVOID *Context OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-RtlRunOnceComplete(
- IN OUT PRTL_RUN_ONCE RunOnce,
- IN ULONG Flags,
- IN PVOID Context OPTIONAL);
-
-NTSYSAPI
-BOOLEAN
-NTAPI
-RtlGetProductInfo(
- IN ULONG OSMajorVersion,
- IN ULONG OSMinorVersion,
- IN ULONG SpMajorVersion,
- IN ULONG SpMinorVersion,
- OUT PULONG ReturnedProductType);
-
-$endif
-
$if (_WDMDDK_)
-
NTSYSAPI
ULONG
NTAPI
@@ -1339,12 +2103,150 @@ RtlCmEncodeMemIoResource(
IN ULONGLONG Length,
IN ULONGLONG Start);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+
+NTSYSAPI
+VOID
+NTAPI
+RtlRunOnceInitialize(
+ OUT PRTL_RUN_ONCE RunOnce);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlRunOnceExecuteOnce(
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN PRTL_RUN_ONCE_INIT_FN InitFn,
+ IN OUT PVOID Parameter OPTIONAL,
+ OUT PVOID *Context OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlRunOnceBeginInitialize(
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN ULONG Flags,
+ OUT PVOID *Context OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlRunOnceComplete(
+ IN OUT PRTL_RUN_ONCE RunOnce,
+ IN ULONG Flags,
+ IN PVOID Context OPTIONAL);
+
+NTSYSAPI
+BOOLEAN
+NTAPI
+RtlGetProductInfo(
+ IN ULONG OSMajorVersion,
+ IN ULONG OSMinorVersion,
+ IN ULONG SpMajorVersion,
+ IN ULONG SpMinorVersion,
+ OUT PULONG ReturnedProductType);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlNormalizeString(
+ IN ULONG NormForm,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIsNormalizedString(
+ IN ULONG NormForm,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PBOOLEAN Normalized);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToAscii(
+ IN ULONG Flags,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToUnicode(
+ IN ULONG Flags,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlIdnToNameprepUnicode(
+ IN ULONG Flags,
+ IN PCWSTR SourceString,
+ IN LONG SourceStringLength,
+ OUT PWSTR DestinationString,
+ IN OUT PLONG DestinationStringLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateServiceSid(
+ IN PUNICODE_STRING ServiceName,
+ OUT PSID ServiceSid,
+ IN OUT PULONG ServiceSidLength);
+
+NTSYSAPI
+LONG
+NTAPI
+RtlCompareAltitudes(
+ IN PCUNICODE_STRING Altitude1,
+ IN PCUNICODE_STRING Altitude2);
+
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
#if (NTDDI_VERSION >= NTDDI_WIN7)
+$if (_WDMDDK_)
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUnicodeToUTF8N(
+ OUT PCHAR UTF8StringDestination,
+ IN ULONG UTF8StringMaxByteCount,
+ OUT PULONG UTF8StringActualByteCount,
+ IN PCWCH UnicodeStringSource,
+ IN ULONG UnicodeStringByteCount);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlUTF8ToUnicodeN(
+ OUT PWSTR UnicodeStringDestination,
+ IN ULONG UnicodeStringMaxByteCount,
+ OUT PULONG UnicodeStringActualByteCount,
+ IN PCCH UTF8StringSource,
+ IN ULONG UTF8StringByteCount);
+
+NTSYSAPI
+ULONG64
+NTAPI
+RtlGetEnabledExtendedFeatures(
+ IN ULONG64 FeatureMask);
+
+$endif (_WDMDDK_)
$if (_NTDDK_)
NTSYSAPI
@@ -1447,10 +2349,8 @@ NTAPI
RtlContractHashTable(
IN PRTL_DYNAMIC_HASH_TABLE HashTable);
-$endif
-
-$if (_WDMDDK_)
-
+$endif (_NTDDK_)
+$if (_NTIFS_)
NTSYSAPI
NTSTATUS
NTAPI
@@ -1472,12 +2372,23 @@ RtlUTF8ToUnicodeN(
IN ULONG UTF8StringByteCount);
NTSYSAPI
-ULONG64
+NTSTATUS
NTAPI
-RtlGetEnabledExtendedFeatures(
- IN ULONG64 FeatureMask);
+RtlReplaceSidInSd(
+ IN OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSID OldSid,
+ IN PSID NewSid,
+ OUT ULONG *NumChanges);
-$endif
+NTSYSAPI
+NTSTATUS
+NTAPI
+RtlCreateVirtualAccountSid(
+ IN PCUNICODE_STRING Name,
+ IN ULONG BaseSubAuthority,
+ OUT PSID Sid,
+ IN OUT PULONG SidLength);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
@@ -1627,7 +2538,7 @@ RtlInitEmptyUnicodeString(
UnicodeString->MaximumLength = BufferSize;
UnicodeString->Buffer = Buffer;
}
-$endif
+$endif (_WDMDDK_)
#if defined(_AMD64_) || defined(_IA64_)
@@ -1660,7 +2571,7 @@ RtlExtendedLargeIntegerDivide(
return ret;
}
-$endif
+$endif (_WDMDDK_)
$if (_NTDDK_)
@@ -1692,7 +2603,7 @@ RtlLargeIntegerDivide(
OUT PLARGE_INTEGER Remainder OPTIONAL);
#endif
-$endif
+$endif (_NTDDK_)
#endif /* defined(_AMD64_) || defined(_IA64_) */
@@ -1858,7 +2769,7 @@ RtlCheckBit(
#define ASSERTMSG(msg, exp) \
(VOID)((!(exp)) ? \
- RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, msg ), FALSE : TRUE)
+ RtlAssert( (PVOID)#exp, (PVOID)__FILE__, __LINE__, (PCHAR)msg ), FALSE : TRUE)
#define RTL_SOFT_ASSERT(exp) \
(VOID)((!(exp)) ? \
@@ -2059,7 +2970,7 @@ RTLVERLIB_DDI(RtlIsServicePackVersionInstalled)(
#define RtlInterlockedClearBitsDiscardReturn(Flags, Flag) \
RtlInterlockedAndBitsDiscardReturn(Flags, ~(Flag))
-$endif
+$endif (_WDMDDK_)
$if (_NTDDK_)
@@ -2256,4 +3167,27 @@ RtlActiveEnumeratorsHashTable(
#endif /* !defined(MIDL_PASS) && !defined(SORTPP_PASS) */
-$endif
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE 1
+#define RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING 2
+
+#define RtlUnicodeStringToOemSize(STRING) (NLS_MB_OEM_CODE_PAGE_TAG ? \
+ RtlxUnicodeStringToOemSize(STRING) : \
+ ((STRING)->Length + sizeof(UNICODE_NULL)) / sizeof(WCHAR) \
+)
+
+#define RtlOemStringToUnicodeSize(STRING) ( \
+ NLS_MB_OEM_CODE_PAGE_TAG ? \
+ RtlxOemStringToUnicodeSize(STRING) : \
+ ((STRING)->Length + sizeof(ANSI_NULL)) * sizeof(WCHAR) \
+)
+
+#define RtlOemStringToCountedUnicodeSize(STRING) ( \
+ (ULONG)(RtlOemStringToUnicodeSize(STRING) - sizeof(UNICODE_NULL)) \
+)
+
+#define RtlOffsetToPointer(B,O) ((PCHAR)(((PCHAR)(B)) + ((ULONG_PTR)(O))))
+#define RtlPointerToOffset(B,P) ((ULONG)(((PCHAR)(P)) - ((PCHAR)(B))))
+$endif (_NTIFS_)
diff --git a/include/xdk/rtltypes.h b/include/xdk/rtltypes.h
index ab74f7016c1..797382cb1f0 100644
--- a/include/xdk/rtltypes.h
+++ b/include/xdk/rtltypes.h
@@ -81,7 +81,7 @@ typedef struct _SLIST_ENTRY32 {
} SLIST_ENTRY32, *PSLIST_ENTRY32;
typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
- struct {
+ _ANONYMOUS_STRUCT struct {
ULONGLONG Alignment;
ULONGLONG Region;
} DUMMYSTRUCTNAME;
@@ -113,7 +113,7 @@ typedef union DECLSPEC_ALIGN(16) _SLIST_HEADER {
typedef union _SLIST_HEADER32 {
ULONGLONG Alignment;
- struct {
+ _ANONYMOUS_STRUCT struct {
SLIST_ENTRY32 Next;
USHORT Depth;
USHORT Sequence;
@@ -130,7 +130,7 @@ typedef SLIST_ENTRY SLIST_ENTRY32, *PSLIST_ENTRY32;
typedef union _SLIST_HEADER {
ULONGLONG Alignment;
- struct {
+ _ANONYMOUS_STRUCT struct {
SLIST_ENTRY Next;
USHORT Depth;
USHORT Sequence;
@@ -167,8 +167,7 @@ typedef BOOLEAN
(*PFN_RTL_IS_SERVICE_PACK_VERSION_INSTALLED)(
IN ULONG Version);
-$endif
-
+$endif (_WDMDDK_)
$if (_NTDDK_)
#ifndef _RTL_RUN_ONCE_DEF
@@ -445,4 +444,106 @@ typedef LPOSVERSIONINFOA LPOSVERSIONINFO;
#define HASH_ENTRY_KEY(x) ((x)->Signature)
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+#define RTL_SYSTEM_VOLUME_INFORMATION_FOLDER L"System Volume Information"
+
+typedef PVOID
+(NTAPI *PRTL_ALLOCATE_STRING_ROUTINE)(
+ IN SIZE_T NumberOfBytes);
+
+#if _WIN32_WINNT >= 0x0600
+typedef PVOID
+(NTAPI *PRTL_REALLOCATE_STRING_ROUTINE)(
+ IN SIZE_T NumberOfBytes,
+ IN PVOID Buffer);
+#endif
+
+typedef VOID
+(NTAPI *PRTL_FREE_STRING_ROUTINE)(
+ IN PVOID Buffer);
+
+extern const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine;
+extern const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine;
+
+#if _WIN32_WINNT >= 0x0600
+extern const PRTL_REALLOCATE_STRING_ROUTINE RtlReallocateStringRoutine;
+#endif
+
+typedef NTSTATUS
+(NTAPI * PRTL_HEAP_COMMIT_ROUTINE) (
+ IN PVOID Base,
+ IN OUT PVOID *CommitAddress,
+ IN OUT PSIZE_T CommitSize);
+
+typedef struct _RTL_HEAP_PARAMETERS {
+ ULONG Length;
+ SIZE_T SegmentReserve;
+ SIZE_T SegmentCommit;
+ SIZE_T DeCommitFreeBlockThreshold;
+ SIZE_T DeCommitTotalFreeThreshold;
+ SIZE_T MaximumAllocationSize;
+ SIZE_T VirtualMemoryThreshold;
+ SIZE_T InitialCommit;
+ SIZE_T InitialReserve;
+ PRTL_HEAP_COMMIT_ROUTINE CommitRoutine;
+ SIZE_T Reserved[2];
+} RTL_HEAP_PARAMETERS, *PRTL_HEAP_PARAMETERS;
+
+#if (NTDDI_VERSION >= NTDDI_WIN2K)
+
+typedef struct _GENERATE_NAME_CONTEXT {
+ USHORT Checksum;
+ BOOLEAN CheckSumInserted;
+ UCHAR NameLength;
+ WCHAR NameBuffer[8];
+ ULONG ExtensionLength;
+ WCHAR ExtensionBuffer[4];
+ ULONG LastIndexValue;
+} GENERATE_NAME_CONTEXT, *PGENERATE_NAME_CONTEXT;
+
+typedef struct _PREFIX_TABLE_ENTRY {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ struct _PREFIX_TABLE_ENTRY *NextPrefixTree;
+ RTL_SPLAY_LINKS Links;
+ PSTRING Prefix;
+} PREFIX_TABLE_ENTRY, *PPREFIX_TABLE_ENTRY;
+
+typedef struct _PREFIX_TABLE {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ PPREFIX_TABLE_ENTRY NextPrefixTree;
+} PREFIX_TABLE, *PPREFIX_TABLE;
+
+typedef struct _UNICODE_PREFIX_TABLE_ENTRY {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ struct _UNICODE_PREFIX_TABLE_ENTRY *NextPrefixTree;
+ struct _UNICODE_PREFIX_TABLE_ENTRY *CaseMatch;
+ RTL_SPLAY_LINKS Links;
+ PUNICODE_STRING Prefix;
+} UNICODE_PREFIX_TABLE_ENTRY, *PUNICODE_PREFIX_TABLE_ENTRY;
+
+typedef struct _UNICODE_PREFIX_TABLE {
+ CSHORT NodeTypeCode;
+ CSHORT NameLength;
+ PUNICODE_PREFIX_TABLE_ENTRY NextPrefixTree;
+ PUNICODE_PREFIX_TABLE_ENTRY LastNextEntry;
+} UNICODE_PREFIX_TABLE, *PUNICODE_PREFIX_TABLE;
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+typedef struct _COMPRESSED_DATA_INFO {
+ USHORT CompressionFormatAndEngine;
+ UCHAR CompressionUnitShift;
+ UCHAR ChunkShift;
+ UCHAR ClusterShift;
+ UCHAR Reserved;
+ USHORT NumberOfChunks;
+ ULONG CompressedChunkSizes[ANYSIZE_ARRAY];
+} COMPRESSED_DATA_INFO, *PCOMPRESSED_DATA_INFO;
+#endif
$endif
diff --git a/include/xdk/sefuncs.h b/include/xdk/sefuncs.h
index 6c8922024ec..8a8e805eac4 100644
--- a/include/xdk/sefuncs.h
+++ b/include/xdk/sefuncs.h
@@ -3,15 +3,6 @@
******************************************************************************/
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-$if (_NTDDK_)
-NTKERNELAPI
-BOOLEAN
-NTAPI
-SeSinglePrivilegeCheck(
- IN LUID PrivilegeValue,
- IN KPROCESSOR_MODE PreviousMode);
-$endif
-
$if (_WDMDDK_)
NTKERNELAPI
BOOLEAN
@@ -96,9 +87,272 @@ VOID
NTAPI
SeLockSubjectContext(
IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
-$endif
+$endif (_WDMDDK_)
+
+$if (_NTDDK_)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeSinglePrivilegeCheck(
+ IN LUID PrivilegeValue,
+ IN KPROCESSOR_MODE PreviousMode);
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTKERNELAPI
+VOID
+NTAPI
+SeReleaseSubjectContext(
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SePrivilegeCheck(
+ IN OUT PPRIVILEGE_SET RequiredPrivileges,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
+ IN KPROCESSOR_MODE AccessMode);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeOpenObjectAuditAlarm(
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PVOID Object OPTIONAL,
+ IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PACCESS_STATE AccessState,
+ IN BOOLEAN ObjectCreated,
+ IN BOOLEAN AccessGranted,
+ IN KPROCESSOR_MODE AccessMode,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeOpenObjectForDeleteAuditAlarm(
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PVOID Object OPTIONAL,
+ IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PACCESS_STATE AccessState,
+ IN BOOLEAN ObjectCreated,
+ IN BOOLEAN AccessGranted,
+ IN KPROCESSOR_MODE AccessMode,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeDeleteObjectAuditAlarm(
+ IN PVOID Object,
+ IN HANDLE Handle);
+
+NTKERNELAPI
+TOKEN_TYPE
+NTAPI
+SeTokenType(
+ IN PACCESS_TOKEN Token);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeTokenIsAdmin(
+ IN PACCESS_TOKEN Token);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeTokenIsRestricted(
+ IN PACCESS_TOKEN Token);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeQueryAuthenticationIdToken(
+ IN PACCESS_TOKEN Token,
+ OUT PLUID AuthenticationId);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeQuerySessionIdToken(
+ IN PACCESS_TOKEN Token,
+ OUT PULONG SessionId);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeCreateClientSecurity(
+ IN PETHREAD ClientThread,
+ IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos,
+ IN BOOLEAN RemoteSession,
+ OUT PSECURITY_CLIENT_CONTEXT ClientContext);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeImpersonateClient(
+ IN PSECURITY_CLIENT_CONTEXT ClientContext,
+ IN PETHREAD ServerThread OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeImpersonateClientEx(
+ IN PSECURITY_CLIENT_CONTEXT ClientContext,
+ IN PETHREAD ServerThread OPTIONAL);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeCreateClientSecurityFromSubjectContext(
+ IN PSECURITY_SUBJECT_CONTEXT SubjectContext,
+ IN PSECURITY_QUALITY_OF_SERVICE ClientSecurityQos,
+ IN BOOLEAN ServerIsRemote,
+ OUT PSECURITY_CLIENT_CONTEXT ClientContext);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeQuerySecurityDescriptorInfo(
+ IN PSECURITY_INFORMATION SecurityInformation,
+ OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN OUT PULONG Length,
+ IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeSetSecurityDescriptorInfo(
+ IN PVOID Object OPTIONAL,
+ IN PSECURITY_INFORMATION SecurityInformation,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
+ IN POOL_TYPE PoolType,
+ IN PGENERIC_MAPPING GenericMapping);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeSetSecurityDescriptorInfoEx(
+ IN PVOID Object OPTIONAL,
+ IN PSECURITY_INFORMATION SecurityInformation,
+ IN PSECURITY_DESCRIPTOR ModificationDescriptor,
+ IN OUT PSECURITY_DESCRIPTOR *ObjectsSecurityDescriptor,
+ IN ULONG AutoInheritFlags,
+ IN POOL_TYPE PoolType,
+ IN PGENERIC_MAPPING GenericMapping);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeAppendPrivileges(
+ IN OUT PACCESS_STATE AccessState,
+ IN PPRIVILEGE_SET Privileges);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAuditingFileEvents(
+ IN BOOLEAN AccessGranted,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAuditingFileOrGlobalEvents(
+ IN BOOLEAN AccessGranted,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext);
+
+VOID
+NTAPI
+SeSetAccessStateGenericMapping(
+ IN OUT PACCESS_STATE AccessState,
+ IN PGENERIC_MAPPING GenericMapping);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeRegisterLogonSessionTerminatedRoutine(
+ IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeUnregisterLogonSessionTerminatedRoutine(
+ IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeMarkLogonSessionForTerminationNotification(
+ IN PLUID LogonId);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeQueryInformationToken(
+ IN PACCESS_TOKEN Token,
+ IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+ OUT PVOID *TokenInformation);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+$if (_NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WIN2KSP3)
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAuditingHardLinkEvents(
+ IN BOOLEAN AccessGranted,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeFilterToken(
+ IN PACCESS_TOKEN ExistingToken,
+ IN ULONG Flags,
+ IN PTOKEN_GROUPS SidsToDisable OPTIONAL,
+ IN PTOKEN_PRIVILEGES PrivilegesToDelete OPTIONAL,
+ IN PTOKEN_GROUPS RestrictedSids OPTIONAL,
+ OUT PACCESS_TOKEN *FilteredToken);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeAuditHardLinkCreation(
+ IN PUNICODE_STRING FileName,
+ IN PUNICODE_STRING LinkName,
+ IN BOOLEAN bSuccess);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+
+#if (NTDDI_VERSION >= NTDDI_WINXPSP2)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAuditingFileEventsWithContext(
+ IN BOOLEAN AccessGranted,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAuditingHardLinkEventsWithContext(
+ IN BOOLEAN AccessGranted,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
+
+#endif
+$endif (_NTIFS_)
$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03SP1)
@@ -120,9 +374,12 @@ SeReportSecurityEvent(
IN PSE_ADT_PARAMETER_ARRAY AuditParameters);
#endif /* (NTDDI_VERSION >= NTDDI_WS03SP1) */
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTIFS_)
#if (NTDDI_VERSION >= NTDDI_VISTA)
-
+$endif
+$if (_WDMDDK_)
NTKERNELAPI
ULONG
NTAPI
@@ -139,6 +396,187 @@ SeGetWorldRights(
IN PGENERIC_MAPPING GenericMapping,
OUT PACCESS_MASK GrantedAccess);
#endif /* SE_NTFS_WORLD_CACHE */
+$endif (_WDMDDK_)
+$if (_NTIFS_)
+NTKERNELAPI
+VOID
+NTAPI
+SeOpenObjectAuditAlarmWithTransaction(
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PVOID Object OPTIONAL,
+ IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PACCESS_STATE AccessState,
+ IN BOOLEAN ObjectCreated,
+ IN BOOLEAN AccessGranted,
+ IN KPROCESSOR_MODE AccessMode,
+ IN GUID *TransactionId OPTIONAL,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeOpenObjectForDeleteAuditAlarmWithTransaction(
+ IN PUNICODE_STRING ObjectTypeName,
+ IN PVOID Object OPTIONAL,
+ IN PUNICODE_STRING AbsoluteObjectName OPTIONAL,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PACCESS_STATE AccessState,
+ IN BOOLEAN ObjectCreated,
+ IN BOOLEAN AccessGranted,
+ IN KPROCESSOR_MODE AccessMode,
+ IN GUID *TransactionId OPTIONAL,
+ OUT PBOOLEAN GenerateOnClose);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeExamineSacl(
+ IN PACL Sacl,
+ IN PACCESS_TOKEN Token,
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN AccessGranted,
+ OUT PBOOLEAN GenerateAudit,
+ OUT PBOOLEAN GenerateAlarm);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeDeleteObjectAuditAlarmWithTransaction(
+ IN PVOID Object,
+ IN HANDLE Handle,
+ IN GUID *TransactionId OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeQueryTokenIntegrity(
+ IN PACCESS_TOKEN Token,
+ IN OUT PSID_AND_ATTRIBUTES IntegritySA);
+
+NTKERNELAPI
+NTSTATUS
+NTAPI
+SeSetSessionIdToken(
+ IN PACCESS_TOKEN Token,
+ IN ULONG SessionId);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeAuditHardLinkCreationWithTransaction(
+ IN PUNICODE_STRING FileName,
+ IN PUNICODE_STRING LinkName,
+ IN BOOLEAN bSuccess,
+ IN GUID *TransactionId OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeAuditTransactionStateChange(
+ IN GUID *TransactionId,
+ IN GUID *ResourceManagerId,
+ IN ULONG NewTransactionState);
+$endif (_NTIFS_)
+$if (_WDMDDK_ || _NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
$endif
+$if (_NTIFS_)
+
+#if (NTDDI_VERSION >= NTDDI_VISTA || (NTDDI_VERSION >= NTDDI_WINXPSP2 && NTDDI_VERSION < NTDDI_WS03))
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeTokenIsWriteRestricted(
+ IN PACCESS_TOKEN Token);
+#endif
+
+#if (NTDDI_VERSION >= NTDDI_WIN7)
+
+NTKERNELAPI
+BOOLEAN
+NTAPI
+SeAuditingAnyFileEventsWithContext(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeExamineGlobalSacl(
+ IN PUNICODE_STRING ObjectType,
+ IN PACCESS_TOKEN Token,
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN AccessGranted,
+ IN OUT PBOOLEAN GenerateAudit,
+ IN OUT PBOOLEAN GenerateAlarm OPTIONAL);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeMaximumAuditMaskFromGlobalSacl(
+ IN PUNICODE_STRING ObjectTypeName OPTIONAL,
+ IN ACCESS_MASK GrantedAccess,
+ IN PACCESS_TOKEN Token,
+ IN OUT PACCESS_MASK AuditMask);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
+
+NTSTATUS
+NTAPI
+SeReportSecurityEventWithSubCategory(
+ IN ULONG Flags,
+ IN PUNICODE_STRING SourceName,
+ IN PSID UserSid OPTIONAL,
+ IN PSE_ADT_PARAMETER_ARRAY AuditParameters,
+ IN ULONG AuditSubcategoryId);
+
+BOOLEAN
+NTAPI
+SeAccessCheckFromState(
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN PTOKEN_ACCESS_INFORMATION PrimaryTokenInformation,
+ IN PTOKEN_ACCESS_INFORMATION ClientTokenInformation OPTIONAL,
+ IN ACCESS_MASK DesiredAccess,
+ IN ACCESS_MASK PreviouslyGrantedAccess,
+ OUT PPRIVILEGE_SET *Privileges OPTIONAL,
+ IN PGENERIC_MAPPING GenericMapping,
+ IN KPROCESSOR_MODE AccessMode,
+ OUT PACCESS_MASK GrantedAccess,
+ OUT PNTSTATUS AccessStatus);
+
+NTKERNELAPI
+VOID
+NTAPI
+SeFreePrivileges(
+ IN PPRIVILEGE_SET Privileges);
+
+NTSTATUS
+NTAPI
+SeLocateProcessImageName(
+ IN OUT PEPROCESS Process,
+ OUT PUNICODE_STRING *pImageFileName);
+
+#define SeLengthSid( Sid ) \
+ (8 + (4 * ((SID *)Sid)->SubAuthorityCount))
+
+#define SeDeleteClientSecurity(C) { \
+ if (SeTokenType((C)->ClientToken) == TokenPrimary) { \
+ PsDereferencePrimaryToken( (C)->ClientToken ); \
+ } else { \
+ PsDereferenceImpersonationToken( (C)->ClientToken ); \
+ } \
+}
+
+#define SeStopImpersonatingClient() PsRevertToSelf()
+
+#define SeQuerySubjectContextToken( SubjectContext ) \
+ ( ARGUMENT_PRESENT( \
+ ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken \
+ ) ? \
+ ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->ClientToken : \
+ ((PSECURITY_SUBJECT_CONTEXT) SubjectContext)->PrimaryToken )
+
+extern NTKERNELAPI PSE_EXPORTS SeExports;
+$endif (_NTIFS_)
diff --git a/include/xdk/setypes.h b/include/xdk/setypes.h
index 6892aee0d2d..68e51c4a3cf 100644
--- a/include/xdk/setypes.h
+++ b/include/xdk/setypes.h
@@ -1,97 +1,8 @@
/******************************************************************************
* Security Manager Types *
******************************************************************************/
-$if (_NTDDK_)
-#define SE_UNSOLICITED_INPUT_PRIVILEGE 6
-
-typedef enum _WELL_KNOWN_SID_TYPE {
- WinNullSid = 0,
- WinWorldSid = 1,
- WinLocalSid = 2,
- WinCreatorOwnerSid = 3,
- WinCreatorGroupSid = 4,
- WinCreatorOwnerServerSid = 5,
- WinCreatorGroupServerSid = 6,
- WinNtAuthoritySid = 7,
- WinDialupSid = 8,
- WinNetworkSid = 9,
- WinBatchSid = 10,
- WinInteractiveSid = 11,
- WinServiceSid = 12,
- WinAnonymousSid = 13,
- WinProxySid = 14,
- WinEnterpriseControllersSid = 15,
- WinSelfSid = 16,
- WinAuthenticatedUserSid = 17,
- WinRestrictedCodeSid = 18,
- WinTerminalServerSid = 19,
- WinRemoteLogonIdSid = 20,
- WinLogonIdsSid = 21,
- WinLocalSystemSid = 22,
- WinLocalServiceSid = 23,
- WinNetworkServiceSid = 24,
- WinBuiltinDomainSid = 25,
- WinBuiltinAdministratorsSid = 26,
- WinBuiltinUsersSid = 27,
- WinBuiltinGuestsSid = 28,
- WinBuiltinPowerUsersSid = 29,
- WinBuiltinAccountOperatorsSid = 30,
- WinBuiltinSystemOperatorsSid = 31,
- WinBuiltinPrintOperatorsSid = 32,
- WinBuiltinBackupOperatorsSid = 33,
- WinBuiltinReplicatorSid = 34,
- WinBuiltinPreWindows2000CompatibleAccessSid = 35,
- WinBuiltinRemoteDesktopUsersSid = 36,
- WinBuiltinNetworkConfigurationOperatorsSid = 37,
- WinAccountAdministratorSid = 38,
- WinAccountGuestSid = 39,
- WinAccountKrbtgtSid = 40,
- WinAccountDomainAdminsSid = 41,
- WinAccountDomainUsersSid = 42,
- WinAccountDomainGuestsSid = 43,
- WinAccountComputersSid = 44,
- WinAccountControllersSid = 45,
- WinAccountCertAdminsSid = 46,
- WinAccountSchemaAdminsSid = 47,
- WinAccountEnterpriseAdminsSid = 48,
- WinAccountPolicyAdminsSid = 49,
- WinAccountRasAndIasServersSid = 50,
- WinNTLMAuthenticationSid = 51,
- WinDigestAuthenticationSid = 52,
- WinSChannelAuthenticationSid = 53,
- WinThisOrganizationSid = 54,
- WinOtherOrganizationSid = 55,
- WinBuiltinIncomingForestTrustBuildersSid = 56,
- WinBuiltinPerfMonitoringUsersSid = 57,
- WinBuiltinPerfLoggingUsersSid = 58,
- WinBuiltinAuthorizationAccessSid = 59,
- WinBuiltinTerminalServerLicenseServersSid = 60,
- WinBuiltinDCOMUsersSid = 61,
- WinBuiltinIUsersSid = 62,
- WinIUserSid = 63,
- WinBuiltinCryptoOperatorsSid = 64,
- WinUntrustedLabelSid = 65,
- WinLowLabelSid = 66,
- WinMediumLabelSid = 67,
- WinHighLabelSid = 68,
- WinSystemLabelSid = 69,
- WinWriteRestrictedCodeSid = 70,
- WinCreatorOwnerRightsSid = 71,
- WinCacheablePrincipalsGroupSid = 72,
- WinNonCacheablePrincipalsGroupSid = 73,
- WinEnterpriseReadonlyControllersSid = 74,
- WinAccountReadonlyControllersSid = 75,
- WinBuiltinEventLogReadersGroup = 76,
- WinNewEnterpriseReadonlyControllersSid = 77,
- WinBuiltinCertSvcDComAccessGroup = 78,
- WinMediumPlusLabelSid = 79,
- WinLocalLogonSid = 80,
- WinConsoleLogonSid = 81,
- WinThisOrganizationCertificateSid = 82,
-} WELL_KNOWN_SID_TYPE;
-$endif
-
$if (_WDMDDK_)
+
/* Simple types */
typedef PVOID PSECURITY_DESCRIPTOR;
typedef ULONG SECURITY_INFORMATION, *PSECURITY_INFORMATION;
@@ -393,4 +304,831 @@ typedef struct _SE_ADT_PARAMETER_ARRAY {
#endif /* !_NTLSA_AUDIT_ */
#endif /* !_NTLSA_IFS_ */
$endif
+$if (_NTDDK_)
+#define SE_UNSOLICITED_INPUT_PRIVILEGE 6
+typedef enum _WELL_KNOWN_SID_TYPE {
+ WinNullSid = 0,
+ WinWorldSid = 1,
+ WinLocalSid = 2,
+ WinCreatorOwnerSid = 3,
+ WinCreatorGroupSid = 4,
+ WinCreatorOwnerServerSid = 5,
+ WinCreatorGroupServerSid = 6,
+ WinNtAuthoritySid = 7,
+ WinDialupSid = 8,
+ WinNetworkSid = 9,
+ WinBatchSid = 10,
+ WinInteractiveSid = 11,
+ WinServiceSid = 12,
+ WinAnonymousSid = 13,
+ WinProxySid = 14,
+ WinEnterpriseControllersSid = 15,
+ WinSelfSid = 16,
+ WinAuthenticatedUserSid = 17,
+ WinRestrictedCodeSid = 18,
+ WinTerminalServerSid = 19,
+ WinRemoteLogonIdSid = 20,
+ WinLogonIdsSid = 21,
+ WinLocalSystemSid = 22,
+ WinLocalServiceSid = 23,
+ WinNetworkServiceSid = 24,
+ WinBuiltinDomainSid = 25,
+ WinBuiltinAdministratorsSid = 26,
+ WinBuiltinUsersSid = 27,
+ WinBuiltinGuestsSid = 28,
+ WinBuiltinPowerUsersSid = 29,
+ WinBuiltinAccountOperatorsSid = 30,
+ WinBuiltinSystemOperatorsSid = 31,
+ WinBuiltinPrintOperatorsSid = 32,
+ WinBuiltinBackupOperatorsSid = 33,
+ WinBuiltinReplicatorSid = 34,
+ WinBuiltinPreWindows2000CompatibleAccessSid = 35,
+ WinBuiltinRemoteDesktopUsersSid = 36,
+ WinBuiltinNetworkConfigurationOperatorsSid = 37,
+ WinAccountAdministratorSid = 38,
+ WinAccountGuestSid = 39,
+ WinAccountKrbtgtSid = 40,
+ WinAccountDomainAdminsSid = 41,
+ WinAccountDomainUsersSid = 42,
+ WinAccountDomainGuestsSid = 43,
+ WinAccountComputersSid = 44,
+ WinAccountControllersSid = 45,
+ WinAccountCertAdminsSid = 46,
+ WinAccountSchemaAdminsSid = 47,
+ WinAccountEnterpriseAdminsSid = 48,
+ WinAccountPolicyAdminsSid = 49,
+ WinAccountRasAndIasServersSid = 50,
+ WinNTLMAuthenticationSid = 51,
+ WinDigestAuthenticationSid = 52,
+ WinSChannelAuthenticationSid = 53,
+ WinThisOrganizationSid = 54,
+ WinOtherOrganizationSid = 55,
+ WinBuiltinIncomingForestTrustBuildersSid = 56,
+ WinBuiltinPerfMonitoringUsersSid = 57,
+ WinBuiltinPerfLoggingUsersSid = 58,
+ WinBuiltinAuthorizationAccessSid = 59,
+ WinBuiltinTerminalServerLicenseServersSid = 60,
+ WinBuiltinDCOMUsersSid = 61,
+ WinBuiltinIUsersSid = 62,
+ WinIUserSid = 63,
+ WinBuiltinCryptoOperatorsSid = 64,
+ WinUntrustedLabelSid = 65,
+ WinLowLabelSid = 66,
+ WinMediumLabelSid = 67,
+ WinHighLabelSid = 68,
+ WinSystemLabelSid = 69,
+ WinWriteRestrictedCodeSid = 70,
+ WinCreatorOwnerRightsSid = 71,
+ WinCacheablePrincipalsGroupSid = 72,
+ WinNonCacheablePrincipalsGroupSid = 73,
+ WinEnterpriseReadonlyControllersSid = 74,
+ WinAccountReadonlyControllersSid = 75,
+ WinBuiltinEventLogReadersGroup = 76,
+ WinNewEnterpriseReadonlyControllersSid = 77,
+ WinBuiltinCertSvcDComAccessGroup = 78,
+ WinMediumPlusLabelSid = 79,
+ WinLocalLogonSid = 80,
+ WinConsoleLogonSid = 81,
+ WinThisOrganizationCertificateSid = 82,
+} WELL_KNOWN_SID_TYPE;
+$endif
+$if (_NTIFS_)
+#ifndef SID_IDENTIFIER_AUTHORITY_DEFINED
+#define SID_IDENTIFIER_AUTHORITY_DEFINED
+typedef struct _SID_IDENTIFIER_AUTHORITY {
+ UCHAR Value[6];
+} SID_IDENTIFIER_AUTHORITY,*PSID_IDENTIFIER_AUTHORITY,*LPSID_IDENTIFIER_AUTHORITY;
+#endif
+
+#ifndef SID_DEFINED
+#define SID_DEFINED
+typedef struct _SID {
+ UCHAR Revision;
+ UCHAR SubAuthorityCount;
+ SID_IDENTIFIER_AUTHORITY IdentifierAuthority;
+ ULONG SubAuthority[ANYSIZE_ARRAY];
+} SID, *PISID;
+#endif
+
+#define SID_REVISION 1
+#define SID_MAX_SUB_AUTHORITIES 15
+#define SID_RECOMMENDED_SUB_AUTHORITIES 1
+
+typedef enum _SID_NAME_USE {
+ SidTypeUser = 1,
+ SidTypeGroup,
+ SidTypeDomain,
+ SidTypeAlias,
+ SidTypeWellKnownGroup,
+ SidTypeDeletedAccount,
+ SidTypeInvalid,
+ SidTypeUnknown,
+ SidTypeComputer,
+ SidTypeLabel
+} SID_NAME_USE, *PSID_NAME_USE;
+
+typedef struct _SID_AND_ATTRIBUTES {
+ PSID Sid;
+ ULONG Attributes;
+} SID_AND_ATTRIBUTES, *PSID_AND_ATTRIBUTES;
+typedef SID_AND_ATTRIBUTES SID_AND_ATTRIBUTES_ARRAY[ANYSIZE_ARRAY];
+typedef SID_AND_ATTRIBUTES_ARRAY *PSID_AND_ATTRIBUTES_ARRAY;
+
+#define SID_HASH_SIZE 32
+typedef ULONG_PTR SID_HASH_ENTRY, *PSID_HASH_ENTRY;
+
+typedef struct _SID_AND_ATTRIBUTES_HASH {
+ ULONG SidCount;
+ PSID_AND_ATTRIBUTES SidAttr;
+ SID_HASH_ENTRY Hash[SID_HASH_SIZE];
+} SID_AND_ATTRIBUTES_HASH, *PSID_AND_ATTRIBUTES_HASH;
+
+/* Universal well-known SIDs */
+
+#define SECURITY_NULL_SID_AUTHORITY {0,0,0,0,0,0}
+#define SECURITY_WORLD_SID_AUTHORITY {0,0,0,0,0,1}
+#define SECURITY_LOCAL_SID_AUTHORITY {0,0,0,0,0,2}
+#define SECURITY_CREATOR_SID_AUTHORITY {0,0,0,0,0,3}
+#define SECURITY_NON_UNIQUE_AUTHORITY {0,0,0,0,0,4}
+#define SECURITY_RESOURCE_MANAGER_AUTHORITY {0,0,0,0,0,9}
+
+#define SECURITY_NULL_RID (0x00000000L)
+#define SECURITY_WORLD_RID (0x00000000L)
+#define SECURITY_LOCAL_RID (0x00000000L)
+#define SECURITY_LOCAL_LOGON_RID (0x00000001L)
+
+#define SECURITY_CREATOR_OWNER_RID (0x00000000L)
+#define SECURITY_CREATOR_GROUP_RID (0x00000001L)
+#define SECURITY_CREATOR_OWNER_SERVER_RID (0x00000002L)
+#define SECURITY_CREATOR_GROUP_SERVER_RID (0x00000003L)
+#define SECURITY_CREATOR_OWNER_RIGHTS_RID (0x00000004L)
+
+/* NT well-known SIDs */
+
+#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5}
+
+#define SECURITY_DIALUP_RID (0x00000001L)
+#define SECURITY_NETWORK_RID (0x00000002L)
+#define SECURITY_BATCH_RID (0x00000003L)
+#define SECURITY_INTERACTIVE_RID (0x00000004L)
+#define SECURITY_LOGON_IDS_RID (0x00000005L)
+#define SECURITY_LOGON_IDS_RID_COUNT (3L)
+#define SECURITY_SERVICE_RID (0x00000006L)
+#define SECURITY_ANONYMOUS_LOGON_RID (0x00000007L)
+#define SECURITY_PROXY_RID (0x00000008L)
+#define SECURITY_ENTERPRISE_CONTROLLERS_RID (0x00000009L)
+#define SECURITY_SERVER_LOGON_RID SECURITY_ENTERPRISE_CONTROLLERS_RID
+#define SECURITY_PRINCIPAL_SELF_RID (0x0000000AL)
+#define SECURITY_AUTHENTICATED_USER_RID (0x0000000BL)
+#define SECURITY_RESTRICTED_CODE_RID (0x0000000CL)
+#define SECURITY_TERMINAL_SERVER_RID (0x0000000DL)
+#define SECURITY_REMOTE_LOGON_RID (0x0000000EL)
+#define SECURITY_THIS_ORGANIZATION_RID (0x0000000FL)
+#define SECURITY_IUSER_RID (0x00000011L)
+#define SECURITY_LOCAL_SYSTEM_RID (0x00000012L)
+#define SECURITY_LOCAL_SERVICE_RID (0x00000013L)
+#define SECURITY_NETWORK_SERVICE_RID (0x00000014L)
+#define SECURITY_NT_NON_UNIQUE (0x00000015L)
+#define SECURITY_NT_NON_UNIQUE_SUB_AUTH_COUNT (3L)
+#define SECURITY_ENTERPRISE_READONLY_CONTROLLERS_RID (0x00000016L)
+
+#define SECURITY_BUILTIN_DOMAIN_RID (0x00000020L)
+#define SECURITY_WRITE_RESTRICTED_CODE_RID (0x00000021L)
+
+
+#define SECURITY_PACKAGE_BASE_RID (0x00000040L)
+#define SECURITY_PACKAGE_RID_COUNT (2L)
+#define SECURITY_PACKAGE_NTLM_RID (0x0000000AL)
+#define SECURITY_PACKAGE_SCHANNEL_RID (0x0000000EL)
+#define SECURITY_PACKAGE_DIGEST_RID (0x00000015L)
+
+#define SECURITY_CRED_TYPE_BASE_RID (0x00000041L)
+#define SECURITY_CRED_TYPE_RID_COUNT (2L)
+#define SECURITY_CRED_TYPE_THIS_ORG_CERT_RID (0x00000001L)
+
+#define SECURITY_MIN_BASE_RID (0x00000050L)
+#define SECURITY_SERVICE_ID_BASE_RID (0x00000050L)
+#define SECURITY_SERVICE_ID_RID_COUNT (6L)
+#define SECURITY_RESERVED_ID_BASE_RID (0x00000051L)
+#define SECURITY_APPPOOL_ID_BASE_RID (0x00000052L)
+#define SECURITY_APPPOOL_ID_RID_COUNT (6L)
+#define SECURITY_VIRTUALSERVER_ID_BASE_RID (0x00000053L)
+#define SECURITY_VIRTUALSERVER_ID_RID_COUNT (6L)
+#define SECURITY_USERMODEDRIVERHOST_ID_BASE_RID (0x00000054L)
+#define SECURITY_USERMODEDRIVERHOST_ID_RID_COUNT (6L)
+#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_BASE_RID (0x00000055L)
+#define SECURITY_CLOUD_INFRASTRUCTURE_SERVICES_ID_RID_COUNT (6L)
+#define SECURITY_WMIHOST_ID_BASE_RID (0x00000056L)
+#define SECURITY_WMIHOST_ID_RID_COUNT (6L)
+#define SECURITY_TASK_ID_BASE_RID (0x00000057L)
+#define SECURITY_NFS_ID_BASE_RID (0x00000058L)
+#define SECURITY_COM_ID_BASE_RID (0x00000059L)
+#define SECURITY_VIRTUALACCOUNT_ID_RID_COUNT (6L)
+
+#define SECURITY_MAX_BASE_RID (0x0000006FL)
+
+#define SECURITY_MAX_ALWAYS_FILTERED (0x000003E7L)
+#define SECURITY_MIN_NEVER_FILTERED (0x000003E8L)
+
+#define SECURITY_OTHER_ORGANIZATION_RID (0x000003E8L)
+
+#define SECURITY_WINDOWSMOBILE_ID_BASE_RID (0x00000070L)
+
+/* Well-known domain relative sub-authority values (RIDs) */
+
+#define DOMAIN_GROUP_RID_ENTERPRISE_READONLY_DOMAIN_CONTROLLERS (0x000001F2L)
+
+#define FOREST_USER_RID_MAX (0x000001F3L)
+
+/* Well-known users */
+
+#define DOMAIN_USER_RID_ADMIN (0x000001F4L)
+#define DOMAIN_USER_RID_GUEST (0x000001F5L)
+#define DOMAIN_USER_RID_KRBTGT (0x000001F6L)
+
+#define DOMAIN_USER_RID_MAX (0x000003E7L)
+
+/* Well-known groups */
+
+#define DOMAIN_GROUP_RID_ADMINS (0x00000200L)
+#define DOMAIN_GROUP_RID_USERS (0x00000201L)
+#define DOMAIN_GROUP_RID_GUESTS (0x00000202L)
+#define DOMAIN_GROUP_RID_COMPUTERS (0x00000203L)
+#define DOMAIN_GROUP_RID_CONTROLLERS (0x00000204L)
+#define DOMAIN_GROUP_RID_CERT_ADMINS (0x00000205L)
+#define DOMAIN_GROUP_RID_SCHEMA_ADMINS (0x00000206L)
+#define DOMAIN_GROUP_RID_ENTERPRISE_ADMINS (0x00000207L)
+#define DOMAIN_GROUP_RID_POLICY_ADMINS (0x00000208L)
+#define DOMAIN_GROUP_RID_READONLY_CONTROLLERS (0x00000209L)
+
+/* Well-known aliases */
+
+#define DOMAIN_ALIAS_RID_ADMINS (0x00000220L)
+#define DOMAIN_ALIAS_RID_USERS (0x00000221L)
+#define DOMAIN_ALIAS_RID_GUESTS (0x00000222L)
+#define DOMAIN_ALIAS_RID_POWER_USERS (0x00000223L)
+
+#define DOMAIN_ALIAS_RID_ACCOUNT_OPS (0x00000224L)
+#define DOMAIN_ALIAS_RID_SYSTEM_OPS (0x00000225L)
+#define DOMAIN_ALIAS_RID_PRINT_OPS (0x00000226L)
+#define DOMAIN_ALIAS_RID_BACKUP_OPS (0x00000227L)
+
+#define DOMAIN_ALIAS_RID_REPLICATOR (0x00000228L)
+#define DOMAIN_ALIAS_RID_RAS_SERVERS (0x00000229L)
+#define DOMAIN_ALIAS_RID_PREW2KCOMPACCESS (0x0000022AL)
+#define DOMAIN_ALIAS_RID_REMOTE_DESKTOP_USERS (0x0000022BL)
+#define DOMAIN_ALIAS_RID_NETWORK_CONFIGURATION_OPS (0x0000022CL)
+#define DOMAIN_ALIAS_RID_INCOMING_FOREST_TRUST_BUILDERS (0x0000022DL)
+
+#define DOMAIN_ALIAS_RID_MONITORING_USERS (0x0000022EL)
+#define DOMAIN_ALIAS_RID_LOGGING_USERS (0x0000022FL)
+#define DOMAIN_ALIAS_RID_AUTHORIZATIONACCESS (0x00000230L)
+#define DOMAIN_ALIAS_RID_TS_LICENSE_SERVERS (0x00000231L)
+#define DOMAIN_ALIAS_RID_DCOM_USERS (0x00000232L)
+#define DOMAIN_ALIAS_RID_IUSERS (0x00000238L)
+#define DOMAIN_ALIAS_RID_CRYPTO_OPERATORS (0x00000239L)
+#define DOMAIN_ALIAS_RID_CACHEABLE_PRINCIPALS_GROUP (0x0000023BL)
+#define DOMAIN_ALIAS_RID_NON_CACHEABLE_PRINCIPALS_GROUP (0x0000023CL)
+#define DOMAIN_ALIAS_RID_EVENT_LOG_READERS_GROUP (0x0000023DL)
+#define DOMAIN_ALIAS_RID_CERTSVC_DCOM_ACCESS_GROUP (0x0000023EL)
+
+#define SECURITY_MANDATORY_LABEL_AUTHORITY {0,0,0,0,0,16}
+#define SECURITY_MANDATORY_UNTRUSTED_RID (0x00000000L)
+#define SECURITY_MANDATORY_LOW_RID (0x00001000L)
+#define SECURITY_MANDATORY_MEDIUM_RID (0x00002000L)
+#define SECURITY_MANDATORY_HIGH_RID (0x00003000L)
+#define SECURITY_MANDATORY_SYSTEM_RID (0x00004000L)
+#define SECURITY_MANDATORY_PROTECTED_PROCESS_RID (0x00005000L)
+
+/* SECURITY_MANDATORY_MAXIMUM_USER_RID is the highest RID that
+ can be set by a usermode caller.*/
+
+#define SECURITY_MANDATORY_MAXIMUM_USER_RID SECURITY_MANDATORY_SYSTEM_RID
+
+#define MANDATORY_LEVEL_TO_MANDATORY_RID(IL) (IL * 0x1000)
+
+/* Allocate the System Luid. The first 1000 LUIDs are reserved.
+ Use #999 here (0x3e7 = 999) */
+
+#define SYSTEM_LUID {0x3e7, 0x0}
+#define ANONYMOUS_LOGON_LUID {0x3e6, 0x0}
+#define LOCALSERVICE_LUID {0x3e5, 0x0}
+#define NETWORKSERVICE_LUID {0x3e4, 0x0}
+#define IUSER_LUID {0x3e3, 0x0}
+
+typedef struct _ACE_HEADER {
+ UCHAR AceType;
+ UCHAR AceFlags;
+ USHORT AceSize;
+} ACE_HEADER, *PACE_HEADER;
+
+/* also in winnt.h */
+#define ACCESS_MIN_MS_ACE_TYPE (0x0)
+#define ACCESS_ALLOWED_ACE_TYPE (0x0)
+#define ACCESS_DENIED_ACE_TYPE (0x1)
+#define SYSTEM_AUDIT_ACE_TYPE (0x2)
+#define SYSTEM_ALARM_ACE_TYPE (0x3)
+#define ACCESS_MAX_MS_V2_ACE_TYPE (0x3)
+#define ACCESS_ALLOWED_COMPOUND_ACE_TYPE (0x4)
+#define ACCESS_MAX_MS_V3_ACE_TYPE (0x4)
+#define ACCESS_MIN_MS_OBJECT_ACE_TYPE (0x5)
+#define ACCESS_ALLOWED_OBJECT_ACE_TYPE (0x5)
+#define ACCESS_DENIED_OBJECT_ACE_TYPE (0x6)
+#define SYSTEM_AUDIT_OBJECT_ACE_TYPE (0x7)
+#define SYSTEM_ALARM_OBJECT_ACE_TYPE (0x8)
+#define ACCESS_MAX_MS_OBJECT_ACE_TYPE (0x8)
+#define ACCESS_MAX_MS_V4_ACE_TYPE (0x8)
+#define ACCESS_MAX_MS_ACE_TYPE (0x8)
+#define ACCESS_ALLOWED_CALLBACK_ACE_TYPE (0x9)
+#define ACCESS_DENIED_CALLBACK_ACE_TYPE (0xA)
+#define ACCESS_ALLOWED_CALLBACK_OBJECT_ACE_TYPE (0xB)
+#define ACCESS_DENIED_CALLBACK_OBJECT_ACE_TYPE (0xC)
+#define SYSTEM_AUDIT_CALLBACK_ACE_TYPE (0xD)
+#define SYSTEM_ALARM_CALLBACK_ACE_TYPE (0xE)
+#define SYSTEM_AUDIT_CALLBACK_OBJECT_ACE_TYPE (0xF)
+#define SYSTEM_ALARM_CALLBACK_OBJECT_ACE_TYPE (0x10)
+#define ACCESS_MAX_MS_V5_ACE_TYPE (0x11)
+#define SYSTEM_MANDATORY_LABEL_ACE_TYPE (0x11)
+
+/* The following are the inherit flags that go into the AceFlags field
+ of an Ace header. */
+
+#define OBJECT_INHERIT_ACE (0x1)
+#define CONTAINER_INHERIT_ACE (0x2)
+#define NO_PROPAGATE_INHERIT_ACE (0x4)
+#define INHERIT_ONLY_ACE (0x8)
+#define INHERITED_ACE (0x10)
+#define VALID_INHERIT_FLAGS (0x1F)
+
+#define SUCCESSFUL_ACCESS_ACE_FLAG (0x40)
+#define FAILED_ACCESS_ACE_FLAG (0x80)
+
+typedef struct _ACCESS_ALLOWED_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ ULONG SidStart;
+} ACCESS_ALLOWED_ACE, *PACCESS_ALLOWED_ACE;
+
+typedef struct _ACCESS_DENIED_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ ULONG SidStart;
+} ACCESS_DENIED_ACE, *PACCESS_DENIED_ACE;
+
+typedef struct _SYSTEM_AUDIT_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ ULONG SidStart;
+} SYSTEM_AUDIT_ACE, *PSYSTEM_AUDIT_ACE;
+
+typedef struct _SYSTEM_ALARM_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ ULONG SidStart;
+} SYSTEM_ALARM_ACE, *PSYSTEM_ALARM_ACE;
+
+typedef struct _SYSTEM_MANDATORY_LABEL_ACE {
+ ACE_HEADER Header;
+ ACCESS_MASK Mask;
+ ULONG SidStart;
+} SYSTEM_MANDATORY_LABEL_ACE, *PSYSTEM_MANDATORY_LABEL_ACE;
+
+#define SYSTEM_MANDATORY_LABEL_NO_WRITE_UP 0x1
+#define SYSTEM_MANDATORY_LABEL_NO_READ_UP 0x2
+#define SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP 0x4
+#define SYSTEM_MANDATORY_LABEL_VALID_MASK (SYSTEM_MANDATORY_LABEL_NO_WRITE_UP | \
+ SYSTEM_MANDATORY_LABEL_NO_READ_UP | \
+ SYSTEM_MANDATORY_LABEL_NO_EXECUTE_UP)
+
+#define SECURITY_DESCRIPTOR_MIN_LENGTH (sizeof(SECURITY_DESCRIPTOR))
+
+typedef USHORT SECURITY_DESCRIPTOR_CONTROL,*PSECURITY_DESCRIPTOR_CONTROL;
+
+#define SE_OWNER_DEFAULTED 0x0001
+#define SE_GROUP_DEFAULTED 0x0002
+#define SE_DACL_PRESENT 0x0004
+#define SE_DACL_DEFAULTED 0x0008
+#define SE_SACL_PRESENT 0x0010
+#define SE_SACL_DEFAULTED 0x0020
+#define SE_DACL_UNTRUSTED 0x0040
+#define SE_SERVER_SECURITY 0x0080
+#define SE_DACL_AUTO_INHERIT_REQ 0x0100
+#define SE_SACL_AUTO_INHERIT_REQ 0x0200
+#define SE_DACL_AUTO_INHERITED 0x0400
+#define SE_SACL_AUTO_INHERITED 0x0800
+#define SE_DACL_PROTECTED 0x1000
+#define SE_SACL_PROTECTED 0x2000
+#define SE_RM_CONTROL_VALID 0x4000
+#define SE_SELF_RELATIVE 0x8000
+
+typedef struct _SECURITY_DESCRIPTOR_RELATIVE {
+ UCHAR Revision;
+ UCHAR Sbz1;
+ SECURITY_DESCRIPTOR_CONTROL Control;
+ ULONG Owner;
+ ULONG Group;
+ ULONG Sacl;
+ ULONG Dacl;
+} SECURITY_DESCRIPTOR_RELATIVE, *PISECURITY_DESCRIPTOR_RELATIVE;
+
+typedef struct _SECURITY_DESCRIPTOR {
+ UCHAR Revision;
+ UCHAR Sbz1;
+ SECURITY_DESCRIPTOR_CONTROL Control;
+ PSID Owner;
+ PSID Group;
+ PACL Sacl;
+ PACL Dacl;
+} SECURITY_DESCRIPTOR, *PISECURITY_DESCRIPTOR;
+
+typedef struct _OBJECT_TYPE_LIST {
+ USHORT Level;
+ USHORT Sbz;
+ GUID *ObjectType;
+} OBJECT_TYPE_LIST, *POBJECT_TYPE_LIST;
+
+#define ACCESS_OBJECT_GUID 0
+#define ACCESS_PROPERTY_SET_GUID 1
+#define ACCESS_PROPERTY_GUID 2
+#define ACCESS_MAX_LEVEL 4
+
+typedef enum _AUDIT_EVENT_TYPE {
+ AuditEventObjectAccess,
+ AuditEventDirectoryServiceAccess
+} AUDIT_EVENT_TYPE, *PAUDIT_EVENT_TYPE;
+
+#define AUDIT_ALLOW_NO_PRIVILEGE 0x1
+
+#define ACCESS_DS_SOURCE_A "DS"
+#define ACCESS_DS_SOURCE_W L"DS"
+#define ACCESS_DS_OBJECT_TYPE_NAME_A "Directory Service Object"
+#define ACCESS_DS_OBJECT_TYPE_NAME_W L"Directory Service Object"
+
+#define ACCESS_REASON_TYPE_MASK 0xffff0000
+#define ACCESS_REASON_DATA_MASK 0x0000ffff
+
+typedef enum _ACCESS_REASON_TYPE {
+ AccessReasonNone = 0x00000000,
+ AccessReasonAllowedAce = 0x00010000,
+ AccessReasonDeniedAce = 0x00020000,
+ AccessReasonAllowedParentAce = 0x00030000,
+ AccessReasonDeniedParentAce = 0x00040000,
+ AccessReasonMissingPrivilege = 0x00100000,
+ AccessReasonFromPrivilege = 0x00200000,
+ AccessReasonIntegrityLevel = 0x00300000,
+ AccessReasonOwnership = 0x00400000,
+ AccessReasonNullDacl = 0x00500000,
+ AccessReasonEmptyDacl = 0x00600000,
+ AccessReasonNoSD = 0x00700000,
+ AccessReasonNoGrant = 0x00800000
+} ACCESS_REASON_TYPE;
+
+typedef ULONG ACCESS_REASON;
+
+typedef struct _ACCESS_REASONS {
+ ACCESS_REASON Data[32];
+} ACCESS_REASONS, *PACCESS_REASONS;
+
+#define SE_SECURITY_DESCRIPTOR_FLAG_NO_OWNER_ACE 0x00000001
+#define SE_SECURITY_DESCRIPTOR_FLAG_NO_LABEL_ACE 0x00000002
+#define SE_SECURITY_DESCRIPTOR_VALID_FLAGS 0x00000003
+
+typedef struct _SE_SECURITY_DESCRIPTOR {
+ ULONG Size;
+ ULONG Flags;
+ PSECURITY_DESCRIPTOR SecurityDescriptor;
+} SE_SECURITY_DESCRIPTOR, *PSE_SECURITY_DESCRIPTOR;
+
+typedef struct _SE_ACCESS_REQUEST {
+ ULONG Size;
+ PSE_SECURITY_DESCRIPTOR SeSecurityDescriptor;
+ ACCESS_MASK DesiredAccess;
+ ACCESS_MASK PreviouslyGrantedAccess;
+ PSID PrincipalSelfSid;
+ PGENERIC_MAPPING GenericMapping;
+ ULONG ObjectTypeListCount;
+ POBJECT_TYPE_LIST ObjectTypeList;
+} SE_ACCESS_REQUEST, *PSE_ACCESS_REQUEST;
+
+typedef struct _SE_ACCESS_REPLY {
+ ULONG Size;
+ ULONG ResultListCount;
+ PACCESS_MASK GrantedAccess;
+ PNTSTATUS AccessStatus;
+ PACCESS_REASONS AccessReason;
+ PPRIVILEGE_SET* Privileges;
+} SE_ACCESS_REPLY, *PSE_ACCESS_REPLY;
+
+typedef enum _SE_AUDIT_OPERATION {
+ AuditPrivilegeObject,
+ AuditPrivilegeService,
+ AuditAccessCheck,
+ AuditOpenObject,
+ AuditOpenObjectWithTransaction,
+ AuditCloseObject,
+ AuditDeleteObject,
+ AuditOpenObjectForDelete,
+ AuditOpenObjectForDeleteWithTransaction,
+ AuditCloseNonObject,
+ AuditOpenNonObject,
+ AuditObjectReference,
+ AuditHandleCreation,
+} SE_AUDIT_OPERATION, *PSE_AUDIT_OPERATION;
+
+typedef struct _SE_AUDIT_INFO {
+ ULONG Size;
+ AUDIT_EVENT_TYPE AuditType;
+ SE_AUDIT_OPERATION AuditOperation;
+ ULONG AuditFlags;
+ UNICODE_STRING SubsystemName;
+ UNICODE_STRING ObjectTypeName;
+ UNICODE_STRING ObjectName;
+ PVOID HandleId;
+ GUID* TransactionId;
+ LUID* OperationId;
+ BOOLEAN ObjectCreation;
+ BOOLEAN GenerateOnClose;
+} SE_AUDIT_INFO, *PSE_AUDIT_INFO;
+
+#define TOKEN_ASSIGN_PRIMARY (0x0001)
+#define TOKEN_DUPLICATE (0x0002)
+#define TOKEN_IMPERSONATE (0x0004)
+#define TOKEN_QUERY (0x0008)
+#define TOKEN_QUERY_SOURCE (0x0010)
+#define TOKEN_ADJUST_PRIVILEGES (0x0020)
+#define TOKEN_ADJUST_GROUPS (0x0040)
+#define TOKEN_ADJUST_DEFAULT (0x0080)
+#define TOKEN_ADJUST_SESSIONID (0x0100)
+
+#define TOKEN_ALL_ACCESS_P (STANDARD_RIGHTS_REQUIRED |\
+ TOKEN_ASSIGN_PRIMARY |\
+ TOKEN_DUPLICATE |\
+ TOKEN_IMPERSONATE |\
+ TOKEN_QUERY |\
+ TOKEN_QUERY_SOURCE |\
+ TOKEN_ADJUST_PRIVILEGES |\
+ TOKEN_ADJUST_GROUPS |\
+ TOKEN_ADJUST_DEFAULT )
+
+#if ((defined(_WIN32_WINNT) && (_WIN32_WINNT > 0x0400)) || (!defined(_WIN32_WINNT)))
+#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P |\
+ TOKEN_ADJUST_SESSIONID )
+#else
+#define TOKEN_ALL_ACCESS (TOKEN_ALL_ACCESS_P)
+#endif
+
+#define TOKEN_READ (STANDARD_RIGHTS_READ |\
+ TOKEN_QUERY)
+
+#define TOKEN_WRITE (STANDARD_RIGHTS_WRITE |\
+ TOKEN_ADJUST_PRIVILEGES |\
+ TOKEN_ADJUST_GROUPS |\
+ TOKEN_ADJUST_DEFAULT)
+
+#define TOKEN_EXECUTE (STANDARD_RIGHTS_EXECUTE)
+
+typedef enum _TOKEN_TYPE {
+ TokenPrimary = 1,
+ TokenImpersonation
+} TOKEN_TYPE,*PTOKEN_TYPE;
+
+typedef enum _TOKEN_INFORMATION_CLASS {
+ TokenUser = 1,
+ TokenGroups,
+ TokenPrivileges,
+ TokenOwner,
+ TokenPrimaryGroup,
+ TokenDefaultDacl,
+ TokenSource,
+ TokenType,
+ TokenImpersonationLevel,
+ TokenStatistics,
+ TokenRestrictedSids,
+ TokenSessionId,
+ TokenGroupsAndPrivileges,
+ TokenSessionReference,
+ TokenSandBoxInert,
+ TokenAuditPolicy,
+ TokenOrigin,
+ TokenElevationType,
+ TokenLinkedToken,
+ TokenElevation,
+ TokenHasRestrictions,
+ TokenAccessInformation,
+ TokenVirtualizationAllowed,
+ TokenVirtualizationEnabled,
+ TokenIntegrityLevel,
+ TokenUIAccess,
+ TokenMandatoryPolicy,
+ TokenLogonSid,
+ MaxTokenInfoClass
+} TOKEN_INFORMATION_CLASS, *PTOKEN_INFORMATION_CLASS;
+
+typedef struct _TOKEN_USER {
+ SID_AND_ATTRIBUTES User;
+} TOKEN_USER, *PTOKEN_USER;
+
+typedef struct _TOKEN_GROUPS {
+ ULONG GroupCount;
+ SID_AND_ATTRIBUTES Groups[ANYSIZE_ARRAY];
+} TOKEN_GROUPS,*PTOKEN_GROUPS,*LPTOKEN_GROUPS;
+
+typedef struct _TOKEN_PRIVILEGES {
+ ULONG PrivilegeCount;
+ LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
+} TOKEN_PRIVILEGES,*PTOKEN_PRIVILEGES,*LPTOKEN_PRIVILEGES;
+
+typedef struct _TOKEN_OWNER {
+ PSID Owner;
+} TOKEN_OWNER,*PTOKEN_OWNER;
+
+typedef struct _TOKEN_PRIMARY_GROUP {
+ PSID PrimaryGroup;
+} TOKEN_PRIMARY_GROUP,*PTOKEN_PRIMARY_GROUP;
+
+typedef struct _TOKEN_DEFAULT_DACL {
+ PACL DefaultDacl;
+} TOKEN_DEFAULT_DACL,*PTOKEN_DEFAULT_DACL;
+
+typedef struct _TOKEN_GROUPS_AND_PRIVILEGES {
+ ULONG SidCount;
+ ULONG SidLength;
+ PSID_AND_ATTRIBUTES Sids;
+ ULONG RestrictedSidCount;
+ ULONG RestrictedSidLength;
+ PSID_AND_ATTRIBUTES RestrictedSids;
+ ULONG PrivilegeCount;
+ ULONG PrivilegeLength;
+ PLUID_AND_ATTRIBUTES Privileges;
+ LUID AuthenticationId;
+} TOKEN_GROUPS_AND_PRIVILEGES, *PTOKEN_GROUPS_AND_PRIVILEGES;
+
+typedef struct _TOKEN_LINKED_TOKEN {
+ HANDLE LinkedToken;
+} TOKEN_LINKED_TOKEN, *PTOKEN_LINKED_TOKEN;
+
+typedef struct _TOKEN_ELEVATION {
+ ULONG TokenIsElevated;
+} TOKEN_ELEVATION, *PTOKEN_ELEVATION;
+
+typedef struct _TOKEN_MANDATORY_LABEL {
+ SID_AND_ATTRIBUTES Label;
+} TOKEN_MANDATORY_LABEL, *PTOKEN_MANDATORY_LABEL;
+
+#define TOKEN_MANDATORY_POLICY_OFF 0x0
+#define TOKEN_MANDATORY_POLICY_NO_WRITE_UP 0x1
+#define TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN 0x2
+
+#define TOKEN_MANDATORY_POLICY_VALID_MASK (TOKEN_MANDATORY_POLICY_NO_WRITE_UP | \
+ TOKEN_MANDATORY_POLICY_NEW_PROCESS_MIN)
+
+typedef struct _TOKEN_MANDATORY_POLICY {
+ ULONG Policy;
+} TOKEN_MANDATORY_POLICY, *PTOKEN_MANDATORY_POLICY;
+
+typedef struct _TOKEN_ACCESS_INFORMATION {
+ PSID_AND_ATTRIBUTES_HASH SidHash;
+ PSID_AND_ATTRIBUTES_HASH RestrictedSidHash;
+ PTOKEN_PRIVILEGES Privileges;
+ LUID AuthenticationId;
+ TOKEN_TYPE TokenType;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ TOKEN_MANDATORY_POLICY MandatoryPolicy;
+ ULONG Flags;
+} TOKEN_ACCESS_INFORMATION, *PTOKEN_ACCESS_INFORMATION;
+
+#define POLICY_AUDIT_SUBCATEGORY_COUNT (53)
+
+typedef struct _TOKEN_AUDIT_POLICY {
+ UCHAR PerUserPolicy[((POLICY_AUDIT_SUBCATEGORY_COUNT) >> 1) + 1];
+} TOKEN_AUDIT_POLICY, *PTOKEN_AUDIT_POLICY;
+
+#define TOKEN_SOURCE_LENGTH 8
+
+typedef struct _TOKEN_SOURCE {
+ CHAR SourceName[TOKEN_SOURCE_LENGTH];
+ LUID SourceIdentifier;
+} TOKEN_SOURCE,*PTOKEN_SOURCE;
+
+typedef struct _TOKEN_STATISTICS {
+ LUID TokenId;
+ LUID AuthenticationId;
+ LARGE_INTEGER ExpirationTime;
+ TOKEN_TYPE TokenType;
+ SECURITY_IMPERSONATION_LEVEL ImpersonationLevel;
+ ULONG DynamicCharged;
+ ULONG DynamicAvailable;
+ ULONG GroupCount;
+ ULONG PrivilegeCount;
+ LUID ModifiedId;
+} TOKEN_STATISTICS, *PTOKEN_STATISTICS;
+
+typedef struct _TOKEN_CONTROL {
+ LUID TokenId;
+ LUID AuthenticationId;
+ LUID ModifiedId;
+ TOKEN_SOURCE TokenSource;
+} TOKEN_CONTROL,*PTOKEN_CONTROL;
+
+typedef struct _TOKEN_ORIGIN {
+ LUID OriginatingLogonSession;
+} TOKEN_ORIGIN, *PTOKEN_ORIGIN;
+
+typedef enum _MANDATORY_LEVEL {
+ MandatoryLevelUntrusted = 0,
+ MandatoryLevelLow,
+ MandatoryLevelMedium,
+ MandatoryLevelHigh,
+ MandatoryLevelSystem,
+ MandatoryLevelSecureProcess,
+ MandatoryLevelCount
+} MANDATORY_LEVEL, *PMANDATORY_LEVEL;
+
+#define TOKEN_HAS_TRAVERSE_PRIVILEGE 0x0001
+#define TOKEN_HAS_BACKUP_PRIVILEGE 0x0002
+#define TOKEN_HAS_RESTORE_PRIVILEGE 0x0004
+#define TOKEN_WRITE_RESTRICTED 0x0008
+#define TOKEN_IS_RESTRICTED 0x0010
+#define TOKEN_SESSION_NOT_REFERENCED 0x0020
+#define TOKEN_SANDBOX_INERT 0x0040
+#define TOKEN_HAS_IMPERSONATE_PRIVILEGE 0x0080
+#define SE_BACKUP_PRIVILEGES_CHECKED 0x0100
+#define TOKEN_VIRTUALIZE_ALLOWED 0x0200
+#define TOKEN_VIRTUALIZE_ENABLED 0x0400
+#define TOKEN_IS_FILTERED 0x0800
+#define TOKEN_UIACCESS 0x1000
+#define TOKEN_NOT_LOW 0x2000
+
+typedef struct _SE_EXPORTS {
+ LUID SeCreateTokenPrivilege;
+ LUID SeAssignPrimaryTokenPrivilege;
+ LUID SeLockMemoryPrivilege;
+ LUID SeIncreaseQuotaPrivilege;
+ LUID SeUnsolicitedInputPrivilege;
+ LUID SeTcbPrivilege;
+ LUID SeSecurityPrivilege;
+ LUID SeTakeOwnershipPrivilege;
+ LUID SeLoadDriverPrivilege;
+ LUID SeCreatePagefilePrivilege;
+ LUID SeIncreaseBasePriorityPrivilege;
+ LUID SeSystemProfilePrivilege;
+ LUID SeSystemtimePrivilege;
+ LUID SeProfileSingleProcessPrivilege;
+ LUID SeCreatePermanentPrivilege;
+ LUID SeBackupPrivilege;
+ LUID SeRestorePrivilege;
+ LUID SeShutdownPrivilege;
+ LUID SeDebugPrivilege;
+ LUID SeAuditPrivilege;
+ LUID SeSystemEnvironmentPrivilege;
+ LUID SeChangeNotifyPrivilege;
+ LUID SeRemoteShutdownPrivilege;
+ PSID SeNullSid;
+ PSID SeWorldSid;
+ PSID SeLocalSid;
+ PSID SeCreatorOwnerSid;
+ PSID SeCreatorGroupSid;
+ PSID SeNtAuthoritySid;
+ PSID SeDialupSid;
+ PSID SeNetworkSid;
+ PSID SeBatchSid;
+ PSID SeInteractiveSid;
+ PSID SeLocalSystemSid;
+ PSID SeAliasAdminsSid;
+ PSID SeAliasUsersSid;
+ PSID SeAliasGuestsSid;
+ PSID SeAliasPowerUsersSid;
+ PSID SeAliasAccountOpsSid;
+ PSID SeAliasSystemOpsSid;
+ PSID SeAliasPrintOpsSid;
+ PSID SeAliasBackupOpsSid;
+ PSID SeAuthenticatedUsersSid;
+ PSID SeRestrictedSid;
+ PSID SeAnonymousLogonSid;
+ LUID SeUndockPrivilege;
+ LUID SeSyncAgentPrivilege;
+ LUID SeEnableDelegationPrivilege;
+ PSID SeLocalServiceSid;
+ PSID SeNetworkServiceSid;
+ LUID SeManageVolumePrivilege;
+ LUID SeImpersonatePrivilege;
+ LUID SeCreateGlobalPrivilege;
+ LUID SeTrustedCredManAccessPrivilege;
+ LUID SeRelabelPrivilege;
+ LUID SeIncreaseWorkingSetPrivilege;
+ LUID SeTimeZonePrivilege;
+ LUID SeCreateSymbolicLinkPrivilege;
+ PSID SeIUserSid;
+ PSID SeUntrustedMandatorySid;
+ PSID SeLowMandatorySid;
+ PSID SeMediumMandatorySid;
+ PSID SeHighMandatorySid;
+ PSID SeSystemMandatorySid;
+ PSID SeOwnerRightsSid;
+} SE_EXPORTS, *PSE_EXPORTS;
+
+typedef NTSTATUS
+(NTAPI *PSE_LOGON_SESSION_TERMINATED_ROUTINE)(
+ IN PLUID LogonId);
+$endif (_NTIFS_)
diff --git a/include/xdk/wdm.template.h b/include/xdk/wdm.template.h
index 1005bf13d94..7181ca7f764 100644
--- a/include/xdk/wdm.template.h
+++ b/include/xdk/wdm.template.h
@@ -25,6 +25,9 @@
#ifndef _WDMDDK_
#define _WDMDDK_
+#define WDM_MAJORVERSION 0x06
+#define WDM_MINORVERSION 0x00
+
/* Included via ntddk.h? */
#ifndef _NTDDK_
#define _NTDDK_
@@ -124,6 +127,15 @@ extern "C" {
#endif
+#if defined(_WIN64)
+#if !defined(USE_DMA_MACROS) && !defined(_NTHAL_)
+#define USE_DMA_MACROS
+#endif
+#ifndef NO_LEGACY_DRIVERS
+#define NO_LEGACY_DRIVERS
+#endif
+#endif /* defined(_WIN64) */
+
/* Forward declarations */
struct _IRP;
struct _MDL;
@@ -153,7 +165,7 @@ typedef struct _KPROCESS *PKPROCESS;
typedef struct _KTHREAD *PKTHREAD, *PRKTHREAD;
typedef struct _CONTEXT *PCONTEXT;
-#if defined(USE_DMA_MACROS) && !defined(_NTHAL_) && ( defined(_NTDDK_) || defined(_NTDRIVER_) || defined(_NTOSP_))
+#if defined(USE_DMA_MACROS) && !defined(_NTHAL_)
typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
#elif defined(_WDM_INCLUDED_)
typedef struct _DMA_ADAPTER *PADAPTER_OBJECT;
diff --git a/include/xdk/zwfuncs.h b/include/xdk/zwfuncs.h
index 3299df523ee..f8e5c49694c 100644
--- a/include/xdk/zwfuncs.h
+++ b/include/xdk/zwfuncs.h
@@ -9,11 +9,9 @@ $if (_WDMDDK_)
#define ZwCurrentProcess() NtCurrentProcess()
#define NtCurrentThread() ( (HANDLE)(LONG_PTR) -2 )
#define ZwCurrentThread() NtCurrentThread()
-
-$endif
+$endif (_WDMDDK_)
$if (_NTDDK_)
-
NTSYSAPI
NTSTATUS
NTAPI
@@ -35,97 +33,45 @@ ZwOpenProcess(
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL);
+$endif (_NTDDK_)
+$if (_NTIFS_)
-$endif
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryEaFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PVOID EaList OPTIONAL,
+ IN ULONG EaListLength,
+ IN PULONG EaIndex OPTIONAL,
+ IN BOOLEAN RestartScan);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetEaFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDuplicateToken(
+ IN HANDLE ExistingTokenHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes,
+ IN BOOLEAN EffectiveOnly,
+ IN TOKEN_TYPE TokenType,
+ OUT PHANDLE NewTokenHandle);
+$endif (_NTIFS_)
#if (NTDDI_VERSION >= NTDDI_WIN2K)
-
-$if (_NTDDK_)
-
-NTSTATUS
-NTAPI
-ZwCancelTimer(
- IN HANDLE TimerHandle,
- OUT PBOOLEAN CurrentState OPTIONAL);
-
-NTSTATUS
-NTAPI
-ZwCreateTimer(
- OUT PHANDLE TimerHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
- IN TIMER_TYPE TimerType);
-
-NTSTATUS
-NTAPI
-ZwOpenTimer(
- OUT PHANDLE TimerHandle,
- IN ACCESS_MASK DesiredAccess,
- IN POBJECT_ATTRIBUTES ObjectAttributes);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwSetInformationThread(
- IN HANDLE ThreadHandle,
- IN THREADINFOCLASS ThreadInformationClass,
- IN PVOID ThreadInformation,
- IN ULONG ThreadInformationLength);
-
-NTSTATUS
-NTAPI
-ZwSetTimer(
- IN HANDLE TimerHandle,
- IN PLARGE_INTEGER DueTime,
- IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
- IN PVOID TimerContext OPTIONAL,
- IN BOOLEAN ResumeTimer,
- IN LONG Period OPTIONAL,
- OUT PBOOLEAN PreviousState OPTIONAL);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwDisplayString(
- IN PUNICODE_STRING String);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwPowerInformation(
- IN POWER_INFORMATION_LEVEL PowerInformationLevel,
- IN PVOID InputBuffer OPTIONAL,
- IN ULONG InputBufferLength,
- OUT PVOID OutputBuffer OPTIONAL,
- IN ULONG OutputBufferLength);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwQueryVolumeInformationFile(
- IN HANDLE FileHandle,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- OUT PVOID FsInformation,
- IN ULONG Length,
- IN FS_INFORMATION_CLASS FsInformationClass);
-
-NTSYSAPI
-NTSTATUS
-NTAPI
-ZwDeviceIoControlFile(
- IN HANDLE FileHandle,
- IN HANDLE Event OPTIONAL,
- IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
- IN PVOID ApcContext OPTIONAL,
- OUT PIO_STATUS_BLOCK IoStatusBlock,
- IN ULONG IoControlCode,
- IN PVOID InputBuffer OPTIONAL,
- IN ULONG InputBufferLength,
- OUT PVOID OutputBuffer OPTIONAL,
- IN ULONG OutputBufferLength);
-
-$endif
-
$if (_WDMDDK_)
NTSYSAPI
@@ -393,10 +339,294 @@ ZwQueryFullAttributesFile(
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PFILE_NETWORK_OPEN_INFORMATION FileInformation);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTSTATUS
+NTAPI
+ZwCancelTimer(
+ IN HANDLE TimerHandle,
+ OUT PBOOLEAN CurrentState OPTIONAL);
+
+NTSTATUS
+NTAPI
+ZwCreateTimer(
+ OUT PHANDLE TimerHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN TIMER_TYPE TimerType);
+
+NTSTATUS
+NTAPI
+ZwOpenTimer(
+ OUT PHANDLE TimerHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationThread(
+ IN HANDLE ThreadHandle,
+ IN THREADINFOCLASS ThreadInformationClass,
+ IN PVOID ThreadInformation,
+ IN ULONG ThreadInformationLength);
+
+NTSTATUS
+NTAPI
+ZwSetTimer(
+ IN HANDLE TimerHandle,
+ IN PLARGE_INTEGER DueTime,
+ IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL,
+ IN PVOID TimerContext OPTIONAL,
+ IN BOOLEAN ResumeTimer,
+ IN LONG Period OPTIONAL,
+ OUT PBOOLEAN PreviousState OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDisplayString(
+ IN PUNICODE_STRING String);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwPowerInformation(
+ IN POWER_INFORMATION_LEVEL PowerInformationLevel,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryVolumeInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FsInformation,
+ IN ULONG Length,
+ IN FS_INFORMATION_CLASS FsInformationClass);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDeviceIoControlFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG IoControlCode,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryObject(
+ IN HANDLE Handle OPTIONAL,
+ IN OBJECT_INFORMATION_CLASS ObjectInformationClass,
+ OUT PVOID ObjectInformation OPTIONAL,
+ IN ULONG ObjectInformationLength,
+ OUT PULONG ReturnLength OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwNotifyChangeKey(
+ IN HANDLE KeyHandle,
+ IN HANDLE EventHandle OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG NotifyFilter,
+ IN BOOLEAN WatchSubtree,
+ OUT PVOID Buffer,
+ IN ULONG BufferLength,
+ IN BOOLEAN Asynchronous);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwCreateEvent(
+ OUT PHANDLE EventHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
+ IN EVENT_TYPE EventType,
+ IN BOOLEAN InitialState);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDeleteFile(
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryDirectoryFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID FileInformation,
+ IN ULONG Length,
+ IN FILE_INFORMATION_CLASS FileInformationClass,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PUNICODE_STRING FileName OPTIONAL,
+ IN BOOLEAN RestartScan);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetVolumeInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID FsInformation,
+ IN ULONG Length,
+ IN FS_INFORMATION_CLASS FsInformationClass);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFsControlFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN ULONG FsControlCode,
+ IN PVOID InputBuffer OPTIONAL,
+ IN ULONG InputBufferLength,
+ OUT PVOID OutputBuffer OPTIONAL,
+ IN ULONG OutputBufferLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwDuplicateObject(
+ IN HANDLE SourceProcessHandle,
+ IN HANDLE SourceHandle,
+ IN HANDLE TargetProcessHandle OPTIONAL,
+ OUT PHANDLE TargetHandle OPTIONAL,
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG HandleAttributes,
+ IN ULONG Options);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenDirectoryObject(
+ OUT PHANDLE DirectoryHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN POBJECT_ATTRIBUTES ObjectAttributes);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwAllocateVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN ULONG_PTR ZeroBits,
+ IN OUT PSIZE_T RegionSize,
+ IN ULONG AllocationType,
+ IN ULONG Protect);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFreeVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN OUT PSIZE_T RegionSize,
+ IN ULONG FreeType);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwWaitForSingleObject(
+ IN HANDLE Handle,
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER Timeout OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetEvent(
+ IN HANDLE EventHandle,
+ OUT PLONG PreviousState OPTIONAL);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFlushVirtualMemory(
+ IN HANDLE ProcessHandle,
+ IN OUT PVOID *BaseAddress,
+ IN OUT PSIZE_T RegionSize,
+ OUT PIO_STATUS_BLOCK IoStatusBlock);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryInformationToken(
+ IN HANDLE TokenHandle,
+ IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+ OUT PVOID TokenInformation,
+ IN ULONG Length,
+ OUT PULONG ResultLength);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetSecurityObject(
+ IN HANDLE Handle,
+ IN SECURITY_INFORMATION SecurityInformation,
+ IN PSECURITY_DESCRIPTOR SecurityDescriptor);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQuerySecurityObject(
+ IN HANDLE FileHandle,
+ IN SECURITY_INFORMATION SecurityInformation,
+ OUT PSECURITY_DESCRIPTOR SecurityDescriptor,
+ IN ULONG Length,
+ OUT PULONG ResultLength);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN2K) */
+$if (_NTIFS_)
+#if (NTDDI_VERSION >= NTDDI_WINXP)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenProcessTokenEx(
+ IN HANDLE ProcessHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN ULONG HandleAttributes,
+ OUT PHANDLE TokenHandle);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwOpenThreadTokenEx(
+ IN HANDLE ThreadHandle,
+ IN ACCESS_MASK DesiredAccess,
+ IN BOOLEAN OpenAsSelf,
+ IN ULONG HandleAttributes,
+ OUT PHANDLE TokenHandle);
+
+#endif /* (NTDDI_VERSION >= NTDDI_WINXP) */
+$endif (_NTIFS_)
$if (_WDMDDK_)
#if (NTDDI_VERSION >= NTDDI_WS03)
@@ -408,8 +638,12 @@ ZwOpenEvent(
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes);
#endif
+$endif (_WDMDDK_)
+$if (_WDMDDK_ || _NTIFS_)
#if (NTDDI_VERSION >= NTDDI_VISTA)
+$endif
+$if (_WDMDDK_)
NTSYSAPI
NTSTATUS
@@ -731,24 +965,68 @@ NTAPI
ZwSinglePhaseReject(
IN HANDLE EnlistmentHandle,
IN PLARGE_INTEGER TmVirtualClock OPTIONAL);
+$endif (_WDMDDK_)
+$if (_NTIFS_)
-
-#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
-
-$endif
-
-#if (NTDDI_VERSION >= NTDDI_WIN7)
-
-$if (_NTDDK_)
+NTSYSAPI
NTSTATUS
NTAPI
-ZwSetTimerEx(
- IN HANDLE TimerHandle,
- IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
- IN OUT PVOID TimerSetInformation,
- IN ULONG TimerSetInformationLength);
-$endif
+ZwLockFile(
+ IN HANDLE FileHandle,
+ IN HANDLE Event OPTIONAL,
+ IN PIO_APC_ROUTINE ApcRoutine OPTIONAL,
+ IN PVOID ApcContext OPTIONAL,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PLARGE_INTEGER Length,
+ IN ULONG Key,
+ IN BOOLEAN FailImmediately,
+ IN BOOLEAN ExclusiveLock);
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwUnlockFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PLARGE_INTEGER ByteOffset,
+ IN PLARGE_INTEGER Length,
+ IN ULONG Key);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwQueryQuotaInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ OUT PVOID Buffer,
+ IN ULONG Length,
+ IN BOOLEAN ReturnSingleEntry,
+ IN PVOID SidList,
+ IN ULONG SidListLength,
+ IN PSID StartSid OPTIONAL,
+ IN BOOLEAN RestartScan);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetQuotaInformationFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock,
+ IN PVOID Buffer,
+ IN ULONG Length);
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwFlushBuffersFile(
+ IN HANDLE FileHandle,
+ OUT PIO_STATUS_BLOCK IoStatusBlock);
+$endif (_NTIFS_)
+$if (_WDMDDK_ || _NTIFS_)
+#endif /* (NTDDI_VERSION >= NTDDI_VISTA) */
+$endif
+#if (NTDDI_VERSION >= NTDDI_WIN7)
$if (_WDMDDK_)
NTSYSAPI
@@ -814,7 +1092,27 @@ ZwSetInformationKey(
IN PVOID KeySetInformation,
IN ULONG KeySetInformationLength);
-$endif
+$endif (_WDMDDK_)
+$if (_NTDDK_)
+NTSTATUS
+NTAPI
+ZwSetTimerEx(
+ IN HANDLE TimerHandle,
+ IN TIMER_SET_INFORMATION_CLASS TimerSetInformationClass,
+ IN OUT PVOID TimerSetInformation,
+ IN ULONG TimerSetInformationLength);
+$endif (_NTDDK_)
+$if (_NTIFS_)
+
+NTSYSAPI
+NTSTATUS
+NTAPI
+ZwSetInformationToken(
+ IN HANDLE TokenHandle,
+ IN TOKEN_INFORMATION_CLASS TokenInformationClass,
+ IN PVOID TokenInformation,
+ IN ULONG TokenInformationLength);
+$endif (_NTIFS_)
#endif /* (NTDDI_VERSION >= NTDDI_WIN7) */
diff --git a/lib/3rdparty/3rdparty.rbuild b/lib/3rdparty/3rdparty.rbuild
index 7f0c2006e45..92ecd8abc7c 100644
--- a/lib/3rdparty/3rdparty.rbuild
+++ b/lib/3rdparty/3rdparty.rbuild
@@ -1,6 +1,9 @@
+
+ -Wno-unused-value
+
diff --git a/lib/3rdparty/libxml2/config.h b/lib/3rdparty/libxml2/config.h
index 9587db1f3c6..351dc6ef303 100644
--- a/lib/3rdparty/libxml2/config.h
+++ b/lib/3rdparty/libxml2/config.h
@@ -287,7 +287,7 @@
#define XML_SOCKLEN_T int
/* Using the Win32 Socket implementation */
-#define _WINSOCKAPI_ 1
+//#define _WINSOCKAPI_ 1
/* Define like PROTOTYPES; this can be used by system headers. */
#define __PROTOTYPES 1
@@ -301,3 +301,7 @@
#if !defined(__MINGW32__) || defined(__NO_ISOCEXT)
#define vsnprintf _vsnprintf
#endif
+
+#if defined(__MINGW32__)
+#include
+#endif
diff --git a/lib/3rdparty/zlib/ChangeLog b/lib/3rdparty/zlib/ChangeLog
index 7f6869d3235..f310bb0fcdb 100644
--- a/lib/3rdparty/zlib/ChangeLog
+++ b/lib/3rdparty/zlib/ChangeLog
@@ -1,6 +1,359 @@
ChangeLog file for zlib
+Changes in 1.2.5 (19 Apr 2010)
+- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev]
+- Default to libdir as sharedlibdir in configure [Nieder]
+- Update copyright dates on modified source files
+- Update trees.c to be able to generate modified trees.h
+- Exit configure for MinGW, suggesting win32/Makefile.gcc
+
+Changes in 1.2.4.5 (18 Apr 2010)
+- Set sharedlibdir in configure [Torok]
+- Set LDFLAGS in Makefile.in [Bar-Lev]
+- Avoid mkdir objs race condition in Makefile.in [Bowler]
+- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays
+- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C
+- Don't use hidden attribute when it is a warning generator (e.g. Solaris)
+
+Changes in 1.2.4.4 (18 Apr 2010)
+- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok]
+- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty
+- Try to use bash or ksh regardless of functionality of /bin/sh
+- Fix configure incompatibility with NetBSD sh
+- Remove attempt to run under bash or ksh since have better NetBSD fix
+- Fix win32/Makefile.gcc for MinGW [Bar-Lev]
+- Add diagnostic messages when using CROSS_PREFIX in configure
+- Added --sharedlibdir option to configure [Weigelt]
+- Use hidden visibility attribute when available [Frysinger]
+
+Changes in 1.2.4.3 (10 Apr 2010)
+- Only use CROSS_PREFIX in configure for ar and ranlib if they exist
+- Use CROSS_PREFIX for nm [Bar-Lev]
+- Assume _LARGEFILE64_SOURCE defined is equivalent to true
+- Avoid use of undefined symbols in #if with && and ||
+- Make *64 prototypes in gzguts.h consistent with functions
+- Add -shared load option for MinGW in configure [Bowler]
+- Move z_off64_t to public interface, use instead of off64_t
+- Remove ! from shell test in configure (not portable to Solaris)
+- Change +0 macro tests to -0 for possibly increased portability
+
+Changes in 1.2.4.2 (9 Apr 2010)
+- Add consistent carriage returns to readme.txt's in masmx86 and masmx64
+- Really provide prototypes for *64 functions when building without LFS
+- Only define unlink() in minigzip.c if unistd.h not included
+- Update README to point to contrib/vstudio project files
+- Move projects/vc6 to old/ and remove projects/
+- Include stdlib.h in minigzip.c for setmode() definition under WinCE
+- Clean up assembler builds in win32/Makefile.msc [Rowe]
+- Include sys/types.h for Microsoft for off_t definition
+- Fix memory leak on error in gz_open()
+- Symbolize nm as $NM in configure [Weigelt]
+- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt]
+- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined
+- Fix bug in gzeof() to take into account unused input data
+- Avoid initialization of structures with variables in puff.c
+- Updated win32/README-WIN32.txt [Rowe]
+
+Changes in 1.2.4.1 (28 Mar 2010)
+- Remove the use of [a-z] constructs for sed in configure [gentoo 310225]
+- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech]
+- Restore "for debugging" comment on sprintf() in gzlib.c
+- Remove fdopen for MVS from gzguts.h
+- Put new README-WIN32.txt in win32 [Rowe]
+- Add check for shell to configure and invoke another shell if needed
+- Fix big fat stinking bug in gzseek() on uncompressed files
+- Remove vestigial F_OPEN64 define in zutil.h
+- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE
+- Avoid errors on non-LFS systems when applications define LFS macros
+- Set EXE to ".exe" in configure for MINGW [Kahle]
+- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill]
+- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev]
+- Add DLL install in win32/makefile.gcc [Bar-Lev]
+- Allow Linux* or linux* from uname in configure [Bar-Lev]
+- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev]
+- Add cross-compilation prefixes to configure [Bar-Lev]
+- Match type exactly in gz_load() invocation in gzread.c
+- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func
+- Provide prototypes for *64 functions when building zlib without LFS
+- Don't use -lc when linking shared library on MinGW
+- Remove errno.h check in configure and vestigial errno code in zutil.h
+
+Changes in 1.2.4 (14 Mar 2010)
+- Fix VER3 extraction in configure for no fourth subversion
+- Update zlib.3, add docs to Makefile.in to make .pdf out of it
+- Add zlib.3.pdf to distribution
+- Don't set error code in gzerror() if passed pointer is NULL
+- Apply destination directory fixes to CMakeLists.txt [Lowman]
+- Move #cmakedefine's to a new zconf.in.cmakein
+- Restore zconf.h for builds that don't use configure or cmake
+- Add distclean to dummy Makefile for convenience
+- Update and improve INDEX, README, and FAQ
+- Update CMakeLists.txt for the return of zconf.h [Lowman]
+- Update contrib/vstudio/vc9 and vc10 [Vollant]
+- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc
+- Apply license and readme changes to contrib/asm686 [Raiter]
+- Check file name lengths and add -c option in minigzip.c [Li]
+- Update contrib/amd64 and contrib/masmx86/ [Vollant]
+- Avoid use of "eof" parameter in trees.c to not shadow library variable
+- Update make_vms.com for removal of zlibdefs.h [Zinser]
+- Update assembler code and vstudio projects in contrib [Vollant]
+- Remove outdated assembler code contrib/masm686 and contrib/asm586
+- Remove old vc7 and vc8 from contrib/vstudio
+- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe]
+- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open()
+- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant]
+- Remove *64 functions from win32/zlib.def (they're not 64-bit yet)
+- Fix bug in void-returning vsprintf() case in gzwrite.c
+- Fix name change from inflate.h in contrib/inflate86/inffas86.c
+- Check if temporary file exists before removing in make_vms.com [Zinser]
+- Fix make install and uninstall for --static option
+- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta]
+- Update readme.txt in contrib/masmx64 and masmx86 to assemble
+
+Changes in 1.2.3.9 (21 Feb 2010)
+- Expunge gzio.c
+- Move as400 build information to old
+- Fix updates in contrib/minizip and contrib/vstudio
+- Add const to vsnprintf test in configure to avoid warnings [Weigelt]
+- Delete zconf.h (made by configure) [Weigelt]
+- Change zconf.in.h to zconf.h.in per convention [Weigelt]
+- Check for NULL buf in gzgets()
+- Return empty string for gzgets() with len == 1 (like fgets())
+- Fix description of gzgets() in zlib.h for end-of-file, NULL return
+- Update minizip to 1.1 [Vollant]
+- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c
+- Note in zlib.h that gzerror() should be used to distinguish from EOF
+- Remove use of snprintf() from gzlib.c
+- Fix bug in gzseek()
+- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant]
+- Fix zconf.h generation in CMakeLists.txt [Lowman]
+- Improve comments in zconf.h where modified by configure
+
+Changes in 1.2.3.8 (13 Feb 2010)
+- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer]
+- Use z_off64_t in gz_zero() and gz_skip() to match state->skip
+- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t)
+- Revert to Makefile.in from 1.2.3.6 (live with the clutter)
+- Fix missing error return in gzflush(), add zlib.h note
+- Add *64 functions to zlib.map [Levin]
+- Fix signed/unsigned comparison in gz_comp()
+- Use SFLAGS when testing shared linking in configure
+- Add --64 option to ./configure to use -m64 with gcc
+- Fix ./configure --help to correctly name options
+- Have make fail if a test fails [Levin]
+- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson]
+- Remove assembler object files from contrib
+
+Changes in 1.2.3.7 (24 Jan 2010)
+- Always gzopen() with O_LARGEFILE if available
+- Fix gzdirect() to work immediately after gzopen() or gzdopen()
+- Make gzdirect() more precise when the state changes while reading
+- Improve zlib.h documentation in many places
+- Catch memory allocation failure in gz_open()
+- Complete close operation if seek forward in gzclose_w() fails
+- Return Z_ERRNO from gzclose_r() if close() fails
+- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL
+- Return zero for gzwrite() errors to match zlib.h description
+- Return -1 on gzputs() error to match zlib.h description
+- Add zconf.in.h to allow recovery from configure modification [Weigelt]
+- Fix static library permissions in Makefile.in [Weigelt]
+- Avoid warnings in configure tests that hide functionality [Weigelt]
+- Add *BSD and DragonFly to Linux case in configure [gentoo 123571]
+- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212]
+- Avoid access of uninitialized data for first inflateReset2 call [Gomes]
+- Keep object files in subdirectories to reduce the clutter somewhat
+- Remove default Makefile and zlibdefs.h, add dummy Makefile
+- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_
+- Remove zlibdefs.h completely -- modify zconf.h instead
+
+Changes in 1.2.3.6 (17 Jan 2010)
+- Avoid void * arithmetic in gzread.c and gzwrite.c
+- Make compilers happier with const char * for gz_error message
+- Avoid unused parameter warning in inflate.c
+- Avoid signed-unsigned comparison warning in inflate.c
+- Indent #pragma's for traditional C
+- Fix usage of strwinerror() in glib.c, change to gz_strwinerror()
+- Correct email address in configure for system options
+- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser]
+- Update zlib.map [Brown]
+- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok]
+- Apply various fixes to CMakeLists.txt [Lowman]
+- Add checks on len in gzread() and gzwrite()
+- Add error message for no more room for gzungetc()
+- Remove zlib version check in gzwrite()
+- Defer compression of gzprintf() result until need to
+- Use snprintf() in gzdopen() if available
+- Remove USE_MMAP configuration determination (only used by minigzip)
+- Remove examples/pigz.c (available separately)
+- Update examples/gun.c to 1.6
+
+Changes in 1.2.3.5 (8 Jan 2010)
+- Add space after #if in zutil.h for some compilers
+- Fix relatively harmless bug in deflate_fast() [Exarevsky]
+- Fix same problem in deflate_slow()
+- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown]
+- Add deflate_rle() for faster Z_RLE strategy run-length encoding
+- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding
+- Change name of "write" variable in inffast.c to avoid library collisions
+- Fix premature EOF from gzread() in gzio.c [Brown]
+- Use zlib header window size if windowBits is 0 in inflateInit2()
+- Remove compressBound() call in deflate.c to avoid linking compress.o
+- Replace use of errno in gz* with functions, support WinCE [Alves]
+- Provide alternative to perror() in minigzip.c for WinCE [Alves]
+- Don't use _vsnprintf on later versions of MSVC [Lowman]
+- Add CMake build script and input file [Lowman]
+- Update contrib/minizip to 1.1 [Svensson, Vollant]
+- Moved nintendods directory from contrib to .
+- Replace gzio.c with a new set of routines with the same functionality
+- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
+- Update contrib/minizip to 1.1b
+- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h
+
+Changes in 1.2.3.4 (21 Dec 2009)
+- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility
+- Update comments in configure and Makefile.in for default --shared
+- Fix test -z's in configure [Marquess]
+- Build examplesh and minigzipsh when not testing
+- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h
+- Import LDFLAGS from the environment in configure
+- Fix configure to populate SFLAGS with discovered CFLAGS options
+- Adapt make_vms.com to the new Makefile.in [Zinser]
+- Add zlib2ansi script for C++ compilation [Marquess]
+- Add _FILE_OFFSET_BITS=64 test to make test (when applicable)
+- Add AMD64 assembler code for longest match to contrib [Teterin]
+- Include options from $SFLAGS when doing $LDSHARED
+- Simplify 64-bit file support by introducing z_off64_t type
+- Make shared object files in objs directory to work around old Sun cc
+- Use only three-part version number for Darwin shared compiles
+- Add rc option to ar in Makefile.in for when ./configure not run
+- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4*
+- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile
+- Protect against _FILE_OFFSET_BITS being defined when compiling zlib
+- Rename Makefile.in targets allstatic to static and allshared to shared
+- Fix static and shared Makefile.in targets to be independent
+- Correct error return bug in gz_open() by setting state [Brown]
+- Put spaces before ;;'s in configure for better sh compatibility
+- Add pigz.c (parallel implementation of gzip) to examples/
+- Correct constant in crc32.c to UL [Leventhal]
+- Reject negative lengths in crc32_combine()
+- Add inflateReset2() function to work like inflateEnd()/inflateInit2()
+- Include sys/types.h for _LARGEFILE64_SOURCE [Brown]
+- Correct typo in doc/algorithm.txt [Janik]
+- Fix bug in adler32_combine() [Zhu]
+- Catch missing-end-of-block-code error in all inflates and in puff
+ Assures that random input to inflate eventually results in an error
+- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/
+- Update ENOUGH and its usage to reflect discovered bounds
+- Fix gzerror() error report on empty input file [Brown]
+- Add ush casts in trees.c to avoid pedantic runtime errors
+- Fix typo in zlib.h uncompress() description [Reiss]
+- Correct inflate() comments with regard to automatic header detection
+- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays)
+- Put new version of gzlog (2.0) in examples with interruption recovery
+- Add puff compile option to permit invalid distance-too-far streams
+- Add puff TEST command options, ability to read piped input
+- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but
+ _LARGEFILE64_SOURCE not defined
+- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart
+- Fix deflateSetDictionary() to use all 32K for output consistency
+- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h)
+- Clear bytes after deflate lookahead to avoid use of uninitialized data
+- Change a limit in inftrees.c to be more transparent to Coverity Prevent
+- Update win32/zlib.def with exported symbols from zlib.h
+- Correct spelling error in zlib.h [Willem]
+- Allow Z_BLOCK for deflate() to force a new block
+- Allow negative bits in inflatePrime() to delete existing bit buffer
+- Add Z_TREES flush option to inflate() to return at end of trees
+- Add inflateMark() to return current state information for random access
+- Add Makefile for NintendoDS to contrib [Costa]
+- Add -w in configure compile tests to avoid spurious warnings [Beucler]
+- Fix typos in zlib.h comments for deflateSetDictionary()
+- Fix EOF detection in transparent gzread() [Maier]
+
+Changes in 1.2.3.3 (2 October 2006)
+- Make --shared the default for configure, add a --static option
+- Add compile option to permit invalid distance-too-far streams
+- Add inflateUndermine() function which is required to enable above
+- Remove use of "this" variable name for C++ compatibility [Marquess]
+- Add testing of shared library in make test, if shared library built
+- Use ftello() and fseeko() if available instead of ftell() and fseek()
+- Provide two versions of all functions that use the z_off_t type for
+ binary compatibility -- a normal version and a 64-bit offset version,
+ per the Large File Support Extension when _LARGEFILE64_SOURCE is
+ defined; use the 64-bit versions by default when _FILE_OFFSET_BITS
+ is defined to be 64
+- Add a --uname= option to configure to perhaps help with cross-compiling
+
+Changes in 1.2.3.2 (3 September 2006)
+- Turn off silly Borland warnings [Hay]
+- Use off64_t and define _LARGEFILE64_SOURCE when present
+- Fix missing dependency on inffixed.h in Makefile.in
+- Rig configure --shared to build both shared and static [Teredesai, Truta]
+- Remove zconf.in.h and instead create a new zlibdefs.h file
+- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant]
+- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt]
+
+Changes in 1.2.3.1 (16 August 2006)
+- Add watcom directory with OpenWatcom make files [Daniel]
+- Remove #undef of FAR in zconf.in.h for MVS [Fedtke]
+- Update make_vms.com [Zinser]
+- Use -fPIC for shared build in configure [Teredesai, Nicholson]
+- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen]
+- Use fdopen() (not _fdopen()) for Interix in zutil.h [BŠck]
+- Add some FAQ entries about the contrib directory
+- Update the MVS question in the FAQ
+- Avoid extraneous reads after EOF in gzio.c [Brown]
+- Correct spelling of "successfully" in gzio.c [Randers-Pehrson]
+- Add comments to zlib.h about gzerror() usage [Brown]
+- Set extra flags in gzip header in gzopen() like deflate() does
+- Make configure options more compatible with double-dash conventions
+ [Weigelt]
+- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen]
+- Fix uninstall target in Makefile.in [Truta]
+- Add pkgconfig support [Weigelt]
+- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt]
+- Replace set_data_type() with a more accurate detect_data_type() in
+ trees.c, according to the txtvsbin.txt document [Truta]
+- Swap the order of #include and #include "zlib.h" in
+ gzio.c, example.c and minigzip.c [Truta]
+- Shut up annoying VS2005 warnings about standard C deprecation [Rowe,
+ Truta] (where?)
+- Fix target "clean" from win32/Makefile.bor [Truta]
+- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe]
+- Update zlib www home address in win32/DLL_FAQ.txt [Truta]
+- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove]
+- Enable browse info in the "Debug" and "ASM Debug" configurations in
+ the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta]
+- Add pkgconfig support [Weigelt]
+- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h,
+ for use in win32/zlib1.rc [Polushin, Rowe, Truta]
+- Add a document that explains the new text detection scheme to
+ doc/txtvsbin.txt [Truta]
+- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta]
+- Move algorithm.txt into doc/ [Truta]
+- Synchronize FAQ with website
+- Fix compressBound(), was low for some pathological cases [Fearnley]
+- Take into account wrapper variations in deflateBound()
+- Set examples/zpipe.c input and output to binary mode for Windows
+- Update examples/zlib_how.html with new zpipe.c (also web site)
+- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems
+ that gcc became pickier in 4.0)
+- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain
+ un-versioned, the patch adds versioning only for symbols introduced in
+ zlib-1.2.0 or later. It also declares as local those symbols which are
+ not designed to be exported." [Levin]
+- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure
+- Do not initialize global static by default in trees.c, add a response
+ NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess]
+- Don't use strerror() in gzio.c under WinCE [Yakimov]
+- Don't use errno.h in zutil.h under WinCE [Yakimov]
+- Move arguments for AR to its usage to allow replacing ar [Marot]
+- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson]
+- Improve inflateInit() and inflateInit2() documentation
+- Fix structure size comment in inflate.h
+- Change configure help option from --h* to --help [Santos]
+
Changes in 1.2.3 (18 July 2005)
- Apply security vulnerability fixes to contrib/infback9 as well
- Clean up some text files (carriage returns, trailing space)
@@ -13,7 +366,7 @@ Changes in 1.2.2.4 (11 July 2005)
compile
- Fix some spelling errors in comments [Betts]
- Correct inflateInit2() error return documentation in zlib.h
-- Added zran.c example of compressed data random access to examples
+- Add zran.c example of compressed data random access to examples
directory, shows use of inflatePrime()
- Fix cast for assignments to strm->state in inflate.c and infback.c
- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer]
diff --git a/lib/3rdparty/zlib/FAQ b/lib/3rdparty/zlib/FAQ
index 441d910daa1..1a22750a58e 100644
--- a/lib/3rdparty/zlib/FAQ
+++ b/lib/3rdparty/zlib/FAQ
@@ -3,8 +3,8 @@
If your question is not there, please check the zlib home page
-http://www.zlib.org which may have more recent information.
-The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
+http://zlib.net/ which may have more recent information.
+The lastest zlib FAQ is at http://zlib.net/zlib_faq.html
1. Is zlib Y2K-compliant?
@@ -13,54 +13,51 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
2. Where can I get a Windows DLL version?
- The zlib sources can be compiled without change to produce a DLL.
- See the file win32/DLL_FAQ.txt in the zlib distribution.
- Pointers to the precompiled DLL are found in the zlib web site at
- http://www.zlib.org.
+ The zlib sources can be compiled without change to produce a DLL. See the
+ file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
+ precompiled DLL are found in the zlib web site at http://zlib.net/ .
3. Where can I get a Visual Basic interface to zlib?
See
- * http://www.dogma.net/markn/articles/zlibtool/zlibtool.htm
- * contrib/visual-basic.txt in the zlib distribution
+ * http://marknelson.us/1997/01/01/zlib-engine/
* win32/DLL_FAQ.txt in the zlib distribution
4. compress() returns Z_BUF_ERROR.
- Make sure that before the call of compress, the length of the compressed
- buffer is equal to the total size of the compressed buffer and not
- zero. For Visual Basic, check that this parameter is passed by reference
+ Make sure that before the call of compress(), the length of the compressed
+ buffer is equal to the available size of the compressed buffer and not
+ zero. For Visual Basic, check that this parameter is passed by reference
("as any"), not by value ("as long").
5. deflate() or inflate() returns Z_BUF_ERROR.
- Before making the call, make sure that avail_in and avail_out are not
- zero. When setting the parameter flush equal to Z_FINISH, also make sure
- that avail_out is big enough to allow processing all pending input.
- Note that a Z_BUF_ERROR is not fatal--another call to deflate() or
- inflate() can be made with more input or output space. A Z_BUF_ERROR
- may in fact be unavoidable depending on how the functions are used, since
- it is not possible to tell whether or not there is more output pending
- when strm.avail_out returns with zero.
+ Before making the call, make sure that avail_in and avail_out are not zero.
+ When setting the parameter flush equal to Z_FINISH, also make sure that
+ avail_out is big enough to allow processing all pending input. Note that a
+ Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
+ made with more input or output space. A Z_BUF_ERROR may in fact be
+ unavoidable depending on how the functions are used, since it is not
+ possible to tell whether or not there is more output pending when
+ strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a
+ heavily annotated example.
6. Where's the zlib documentation (man pages, etc.)?
- It's in zlib.h for the moment, and Francis S. Lin has converted it to a
- web page zlib.html. Volunteers to transform this to Unix-style man pages,
- please contact us (zlib@gzip.org). Examples of zlib usage are in the files
- example.c and minigzip.c.
+ It's in zlib.h . Examples of zlib usage are in the files example.c and
+ minigzip.c, with more in examples/ .
7. Why don't you use GNU autoconf or libtool or ...?
- Because we would like to keep zlib as a very small and simple
- package. zlib is rather portable and doesn't need much configuration.
+ Because we would like to keep zlib as a very small and simple package.
+ zlib is rather portable and doesn't need much configuration.
8. I found a bug in zlib.
- Most of the time, such problems are due to an incorrect usage of
- zlib. Please try to reproduce the problem with a small program and send
- the corresponding source to us at zlib@gzip.org . Do not send
- multi-megabyte data files without prior agreement.
+ Most of the time, such problems are due to an incorrect usage of zlib.
+ Please try to reproduce the problem with a small program and send the
+ corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
+ data files without prior agreement.
9. Why do I get "undefined reference to gzputc"?
@@ -82,7 +79,7 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
12. Can zlib handle .Z files?
- No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
+ No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
the code of uncompress on your own.
13. How can I make a Unix shared library?
@@ -99,8 +96,10 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
However, many flavors of Unix come with a shared zlib already installed.
Before going to the trouble of compiling a shared version of zlib and
- trying to install it, you may want to check if it's already there! If you
- can #include , it's there. The -lz option will probably link to it.
+ trying to install it, you may want to check if it's already there! If you
+ can #include , it's there. The -lz option will probably link to
+ it. You can check the version at the top of zlib.h or with the
+ ZLIB_VERSION symbol defined in zlib.h .
15. I have a question about OttoPDF.
@@ -109,8 +108,8 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
16. Can zlib decode Flate data in an Adobe PDF file?
- Yes. See http://www.fastio.com/ (ClibPDF), or http://www.pdflib.com/ .
- To modify PDF forms, see http://sourceforge.net/projects/acroformtool/ .
+ Yes. See http://www.pdflib.com/ . To modify PDF forms, see
+ http://sourceforge.net/projects/acroformtool/ .
17. Why am I getting this "register_frame_info not found" error on Solaris?
@@ -121,67 +120,67 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
symbol __register_frame_info: referenced symbol not found
The symbol __register_frame_info is not part of zlib, it is generated by
- the C compiler (cc or gcc). You must recompile applications using zlib
- which have this problem. This problem is specific to Solaris. See
+ the C compiler (cc or gcc). You must recompile applications using zlib
+ which have this problem. This problem is specific to Solaris. See
http://www.sunfreeware.com for Solaris versions of zlib and applications
using zlib.
18. Why does gzip give an error on a file I make with compress/deflate?
The compress and deflate functions produce data in the zlib format, which
- is different and incompatible with the gzip format. The gz* functions in
- zlib on the other hand use the gzip format. Both the zlib and gzip
- formats use the same compressed data format internally, but have different
- headers and trailers around the compressed data.
+ is different and incompatible with the gzip format. The gz* functions in
+ zlib on the other hand use the gzip format. Both the zlib and gzip formats
+ use the same compressed data format internally, but have different headers
+ and trailers around the compressed data.
19. Ok, so why are there two different formats?
- The gzip format was designed to retain the directory information about
- a single file, such as the name and last modification date. The zlib
- format on the other hand was designed for in-memory and communication
- channel applications, and has a much more compact header and trailer and
- uses a faster integrity check than gzip.
+ The gzip format was designed to retain the directory information about a
+ single file, such as the name and last modification date. The zlib format
+ on the other hand was designed for in-memory and communication channel
+ applications, and has a much more compact header and trailer and uses a
+ faster integrity check than gzip.
20. Well that's nice, but how do I make a gzip file in memory?
You can request that deflate write the gzip format instead of the zlib
- format using deflateInit2(). You can also request that inflate decode
- the gzip format using inflateInit2(). Read zlib.h for more details.
+ format using deflateInit2(). You can also request that inflate decode the
+ gzip format using inflateInit2(). Read zlib.h for more details.
21. Is zlib thread-safe?
- Yes. However any library routines that zlib uses and any application-
- provided memory allocation routines must also be thread-safe. zlib's gz*
+ Yes. However any library routines that zlib uses and any application-
+ provided memory allocation routines must also be thread-safe. zlib's gz*
functions use stdio library routines, and most of zlib's functions use the
- library memory allocation routines by default. zlib's Init functions allow
- for the application to provide custom memory allocation routines.
+ library memory allocation routines by default. zlib's *Init* functions
+ allow for the application to provide custom memory allocation routines.
Of course, you should only operate on any given zlib or gzip stream from a
single thread at a time.
22. Can I use zlib in my commercial application?
- Yes. Please read the license in zlib.h.
+ Yes. Please read the license in zlib.h.
23. Is zlib under the GNU license?
- No. Please read the license in zlib.h.
+ No. Please read the license in zlib.h.
24. The license says that altered source versions must be "plainly marked". So
what exactly do I need to do to meet that requirement?
- You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
+ You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
particular, the final version number needs to be changed to "f", and an
- identification string should be appended to ZLIB_VERSION. Version numbers
+ identification string should be appended to ZLIB_VERSION. Version numbers
x.x.x.f are reserved for modifications to zlib by others than the zlib
- maintainers. For example, if the version of the base zlib you are altering
+ maintainers. For example, if the version of the base zlib you are altering
is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
- ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
+ ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
update the version strings in deflate.c and inftrees.c.
For altered source distributions, you should also note the origin and
nature of the changes in zlib.h, as well as in ChangeLog and README, along
- with the dates of the alterations. The origin should include at least your
+ with the dates of the alterations. The origin should include at least your
name (or your company's name), and an email address to contact for help or
issues with the library.
@@ -197,105 +196,112 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
26. Will zlib work on a 64-bit machine?
- It should. It has been tested on 64-bit machines, and has no dependence
- on any data types being limited to 32-bits in length. If you have any
+ Yes. It has been tested on 64-bit machines, and has no dependence on any
+ data types being limited to 32-bits in length. If you have any
difficulties, please provide a complete problem report to zlib@gzip.org
27. Will zlib decompress data from the PKWare Data Compression Library?
- No. The PKWare DCL uses a completely different compressed data format
- than does PKZIP and zlib. However, you can look in zlib's contrib/blast
+ No. The PKWare DCL uses a completely different compressed data format than
+ does PKZIP and zlib. However, you can look in zlib's contrib/blast
directory for a possible solution to your problem.
28. Can I access data randomly in a compressed stream?
- No, not without some preparation. If when compressing you periodically
- use Z_FULL_FLUSH, carefully write all the pending data at those points,
- and keep an index of those locations, then you can start decompression
- at those points. You have to be careful to not use Z_FULL_FLUSH too
- often, since it can significantly degrade compression.
+ No, not without some preparation. If when compressing you periodically use
+ Z_FULL_FLUSH, carefully write all the pending data at those points, and
+ keep an index of those locations, then you can start decompression at those
+ points. You have to be careful to not use Z_FULL_FLUSH too often, since it
+ can significantly degrade compression. Alternatively, you can scan a
+ deflate stream once to generate an index, and then use that index for
+ random access. See examples/zran.c .
29. Does zlib work on MVS, OS/390, CICS, etc.?
- We don't know for sure. We have heard occasional reports of success on
- these systems. If you do use it on one of these, please provide us with
- a report, instructions, and patches that we can reference when we get
- these questions. Thanks.
+ It has in the past, but we have not heard of any recent evidence. There
+ were working ports of zlib 1.1.4 to MVS, but those links no longer work.
+ If you know of recent, successful applications of zlib on these operating
+ systems, please let us know. Thanks.
-30. Is there some simpler, easier to read version of inflate I can look at
- to understand the deflate format?
+30. Is there some simpler, easier to read version of inflate I can look at to
+ understand the deflate format?
- First off, you should read RFC 1951. Second, yes. Look in zlib's
+ First off, you should read RFC 1951. Second, yes. Look in zlib's
contrib/puff directory.
31. Does zlib infringe on any patents?
- As far as we know, no. In fact, that was originally the whole point behind
- zlib. Look here for some more information:
+ As far as we know, no. In fact, that was originally the whole point behind
+ zlib. Look here for some more information:
http://www.gzip.org/#faq11
32. Can zlib work with greater than 4 GB of data?
- Yes. inflate() and deflate() will process any amount of data correctly.
+ Yes. inflate() and deflate() will process any amount of data correctly.
Each call of inflate() or deflate() is limited to input and output chunks
of the maximum value that can be stored in the compiler's "unsigned int"
- type, but there is no limit to the number of chunks. Note however that the
- strm.total_in and strm_total_out counters may be limited to 4 GB. These
+ type, but there is no limit to the number of chunks. Note however that the
+ strm.total_in and strm_total_out counters may be limited to 4 GB. These
counters are provided as a convenience and are not used internally by
- inflate() or deflate(). The application can easily set up its own counters
+ inflate() or deflate(). The application can easily set up its own counters
updated after each call of inflate() or deflate() to count beyond 4 GB.
compress() and uncompress() may be limited to 4 GB, since they operate in a
- single call. gzseek() and gztell() may be limited to 4 GB depending on how
- zlib is compiled. See the zlibCompileFlags() function in zlib.h.
+ single call. gzseek() and gztell() may be limited to 4 GB depending on how
+ zlib is compiled. See the zlibCompileFlags() function in zlib.h.
- The word "may" appears several times above since there is a 4 GB limit
- only if the compiler's "long" type is 32 bits. If the compiler's "long"
- type is 64 bits, then the limit is 16 exabytes.
+ The word "may" appears several times above since there is a 4 GB limit only
+ if the compiler's "long" type is 32 bits. If the compiler's "long" type is
+ 64 bits, then the limit is 16 exabytes.
33. Does zlib have any security vulnerabilities?
- The only one that we are aware of is potentially in gzprintf(). If zlib
- is compiled to use sprintf() or vsprintf(), then there is no protection
- against a buffer overflow of a 4K string space, other than the caller of
- gzprintf() assuring that the output will not exceed 4K. On the other
- hand, if zlib is compiled to use snprintf() or vsnprintf(), which should
- normally be the case, then there is no vulnerability. The ./configure
- script will display warnings if an insecure variation of sprintf() will
- be used by gzprintf(). Also the zlibCompileFlags() function will return
- information on what variant of sprintf() is used by gzprintf().
+ The only one that we are aware of is potentially in gzprintf(). If zlib is
+ compiled to use sprintf() or vsprintf(), then there is no protection
+ against a buffer overflow of an 8K string space (or other value as set by
+ gzbuffer()), other than the caller of gzprintf() assuring that the output
+ will not exceed 8K. On the other hand, if zlib is compiled to use
+ snprintf() or vsnprintf(), which should normally be the case, then there is
+ no vulnerability. The ./configure script will display warnings if an
+ insecure variation of sprintf() will be used by gzprintf(). Also the
+ zlibCompileFlags() function will return information on what variant of
+ sprintf() is used by gzprintf().
If you don't have snprintf() or vsnprintf() and would like one, you can
find a portable implementation here:
http://www.ijs.si/software/snprintf/
- Note that you should be using the most recent version of zlib. Versions
- 1.1.3 and before were subject to a double-free vulnerability.
+ Note that you should be using the most recent version of zlib. Versions
+ 1.1.3 and before were subject to a double-free vulnerability, and versions
+ 1.2.1 and 1.2.2 were subject to an access exception when decompressing
+ invalid compressed data.
34. Is there a Java version of zlib?
Probably what you want is to use zlib in Java. zlib is already included
as part of the Java SDK in the java.util.zip package. If you really want
a version of zlib written in the Java language, look on the zlib home
- page for links: http://www.zlib.org/
+ page for links: http://zlib.net/ .
35. I get this or that compiler or source-code scanner warning when I crank it
up to maximally-pedantic. Can't you guys write proper code?
Many years ago, we gave up attempting to avoid warnings on every compiler
- in the universe. It just got to be a waste of time, and some compilers
- were downright silly. So now, we simply make sure that the code always
- works.
+ in the universe. It just got to be a waste of time, and some compilers
+ were downright silly as well as contradicted each other. So now, we simply
+ make sure that the code always works.
36. Valgrind (or some similar memory access checker) says that deflate is
performing a conditional jump that depends on an uninitialized value.
Isn't that a bug?
- No. That is intentional for performance reasons, and the output of
- deflate is not affected. This only started showing up recently since
- zlib 1.2.x uses malloc() by default for allocations, whereas earlier
- versions used calloc(), which zeros out the allocated memory.
+ No. That is intentional for performance reasons, and the output of deflate
+ is not affected. This only started showing up recently since zlib 1.2.x
+ uses malloc() by default for allocations, whereas earlier versions used
+ calloc(), which zeros out the allocated memory. Even though the code was
+ correct, versions 1.2.4 and later was changed to not stimulate these
+ checkers.
37. Will zlib read the (insert any ancient or arcane format here) compressed
data format?
@@ -305,20 +311,21 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
38. How can I encrypt/decrypt zip files with zlib?
- zlib doesn't support encryption. The original PKZIP encryption is very weak
- and can be broken with freely available programs. To get strong encryption,
- use GnuPG, http://www.gnupg.org/ , which already includes zlib compression.
- For PKZIP compatible "encryption", look at http://www.info-zip.org/
+ zlib doesn't support encryption. The original PKZIP encryption is very
+ weak and can be broken with freely available programs. To get strong
+ encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib
+ compression. For PKZIP compatible "encryption", look at
+ http://www.info-zip.org/
39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
- "gzip" is the gzip format, and "deflate" is the zlib format. They should
- probably have called the second one "zlib" instead to avoid confusion
- with the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
+ "gzip" is the gzip format, and "deflate" is the zlib format. They should
+ probably have called the second one "zlib" instead to avoid confusion with
+ the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
correctly points to the zlib specification in RFC 1950 for the "deflate"
transfer encoding, there have been reports of servers and browsers that
incorrectly produce or expect raw deflate data per the deflate
- specficiation in RFC 1951, most notably Microsoft. So even though the
+ specficiation in RFC 1951, most notably Microsoft. So even though the
"deflate" transfer encoding using the zlib format would be the more
efficient approach (and in fact exactly what the zlib format was designed
for), using the "gzip" transfer encoding is probably more reliable due to
@@ -328,12 +335,32 @@ The lastest zlib FAQ is at http://www.gzip.org/zlib/zlib_faq.html
40. Does zlib support the new "Deflate64" format introduced by PKWare?
- No. PKWare has apparently decided to keep that format proprietary, since
- they have not documented it as they have previous compression formats.
- In any case, the compression improvements are so modest compared to other
- more modern approaches, that it's not worth the effort to implement.
+ No. PKWare has apparently decided to keep that format proprietary, since
+ they have not documented it as they have previous compression formats. In
+ any case, the compression improvements are so modest compared to other more
+ modern approaches, that it's not worth the effort to implement.
-41. Can you please sign these lengthy legal documents and fax them back to us
+41. I'm having a problem with the zip functions in zlib, can you help?
+
+ There are no zip functions in zlib. You are probably using minizip by
+ Giles Vollant, which is found in the contrib directory of zlib. It is not
+ part of zlib. In fact none of the stuff in contrib is part of zlib. The
+ files in there are not supported by the zlib authors. You need to contact
+ the authors of the respective contribution for help.
+
+42. The match.asm code in contrib is under the GNU General Public License.
+ Since it's part of zlib, doesn't that mean that all of zlib falls under the
+ GNU GPL?
+
+ No. The files in contrib are not part of zlib. They were contributed by
+ other authors and are provided as a convenience to the user within the zlib
+ distribution. Each item in contrib has its own license.
+
+43. Is zlib subject to export controls? What is its ECCN?
+
+ zlib is not subject to export controls, and so is classified as EAR99.
+
+44. Can you please sign these lengthy legal documents and fax them back to us
so that we can use your software in our product?
No. Go away. Shoo.
diff --git a/lib/3rdparty/zlib/INDEX b/lib/3rdparty/zlib/INDEX
index 0587e5902bd..f6c51ca1759 100644
--- a/lib/3rdparty/zlib/INDEX
+++ b/lib/3rdparty/zlib/INDEX
@@ -1,23 +1,32 @@
+CMakeLists.txt cmake build file
ChangeLog history of changes
FAQ Frequently Asked Questions about zlib
INDEX this file
-Makefile makefile for Unix (generated by configure)
-Makefile.in makefile for Unix (template for configure)
+Makefile dummy Makefile that tells you to ./configure
+Makefile.in template for Unix Makefile
README guess what
-algorithm.txt description of the (de)compression algorithm
configure configure script for Unix
-zconf.in.h template for zconf.h (used by configure)
+make_vms.com makefile for VMS
+treebuild.xml XML description of source file dependencies
+zconf.h.cmakein zconf.h template for cmake
+zconf.h.in zconf.h template for configure
+zlib.3 Man page for zlib
+zlib.3.pdf Man page in PDF format
+zlib.map Linux symbol information
+zlib.pc.in Template for pkg-config descriptor
+zlib2ansi perl script to convert source files for C++ compilation
amiga/ makefiles for Amiga SAS C
-as400/ makefiles for IBM AS/400
+doc/ documentation for formats and algorithms
msdos/ makefiles for MSDOS
+nintendods/ makefile for Nintendo DS
old/ makefiles for various architectures and zlib documentation
files that have not yet been updated for zlib 1.2.x
-projects/ projects for various Integrated Development Environments
qnx/ makefiles for QNX
+watcom/ makefiles for OpenWatcom
win32/ makefiles for Windows
- zlib public header files (must be kept):
+ zlib public header files (required for library use):
zconf.h
zlib.h
@@ -28,7 +37,11 @@ crc32.c
crc32.h
deflate.c
deflate.h
-gzio.c
+gzclose.c
+gzguts.h
+gzlib.c
+gzread.c
+gzwrite.c
infback.c
inffast.c
inffast.h
@@ -46,6 +59,7 @@ zutil.h
source files for sample programs:
example.c
minigzip.c
+See examples/README.examples for more
unsupported contribution by third parties
See contrib/README.contrib
diff --git a/lib/3rdparty/zlib/Makefile.host b/lib/3rdparty/zlib/Makefile.host
deleted file mode 100755
index 6a2a9b38267..00000000000
--- a/lib/3rdparty/zlib/Makefile.host
+++ /dev/null
@@ -1,46 +0,0 @@
-# $Id$
-PATH_TO_TOP = ../..
-
-TARGET = zlib.host.a
-
-CFLAGS = \
- -MMD -O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
- -Wstrict-prototypes -Wmissing-prototypes
-
-OBJECTS = \
- adler32.o \
- compress.o \
- crc32.o \
- gzio.o \
- uncompr.o \
- deflate.o \
- trees.o \
- zutil.o \
- inflate.o \
- infblock.o \
- inftrees.o \
- infcodes.o \
- infutil.o \
- inffast.o
-
-OBJECTS := $(OBJECTS:%=hostobjs/%)
-
-all: hostobjs $(TARGET)
-
-hostobjs:
- - $(RMKDIR) hostobjs
-
-hostobjs/%.o: %.c
- $(HOST_CC) $(CFLAGS) -c $< -o $@
-
-$(TARGET): $(OBJECTS)
- $(HOST_AR) -r $(TARGET) $^
-
-clean:
- - $(RM) hostobjs/*
- - $(RM) $(TARGET)
- - $(RMDIR) hostobjs
-
-.phony: clean
-
-include $(PATH_TO_TOP)/rules.mak
diff --git a/lib/3rdparty/zlib/Makefile.in b/lib/3rdparty/zlib/Makefile.in
index 2fd6e45c48d..5b15bd00d73 100644
--- a/lib/3rdparty/zlib/Makefile.in
+++ b/lib/3rdparty/zlib/Makefile.in
@@ -1,11 +1,11 @@
# Makefile for zlib
-# Copyright (C) 1995-2005 Jean-loup Gailly.
+# Copyright (C) 1995-2010 Jean-loup Gailly.
# For conditions of distribution and use, see copyright notice in zlib.h
# To compile and test, type:
# ./configure; make test
-# The call of configure is optional if you don't have special requirements
-# If you wish to build zlib as a shared library, use: ./configure -s
+# Normally configure builds both a static and a shared library.
+# If you want to build just a static library, use: ./configure --static
# To use the asm code, type:
# cp contrib/asm?86/match.S ./match.S
@@ -24,17 +24,22 @@ CFLAGS=-O
#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
# -Wstrict-prototypes -Wmissing-prototypes
-LDFLAGS=libz.a
+SFLAGS=-O
+LDFLAGS=
+TEST_LDFLAGS=-L. libz.a
LDSHARED=$(CC)
CPP=$(CC) -E
-LIBS=libz.a
+STATICLIB=libz.a
SHAREDLIB=libz.so
-SHAREDLIBV=libz.so.1.2.3
+SHAREDLIBV=libz.so.1.2.5
SHAREDLIBM=libz.so.1
+LIBS=$(STATICLIB) $(SHAREDLIBV)
AR=ar rc
RANLIB=ranlib
+LDCONFIG=ldconfig
+LDSHAREDLIBC=-lc
TAR=tar
SHELL=/bin/sh
EXE=
@@ -42,33 +47,68 @@ EXE=
prefix = /usr/local
exec_prefix = ${prefix}
libdir = ${exec_prefix}/lib
+sharedlibdir = ${libdir}
includedir = ${prefix}/include
mandir = ${prefix}/share/man
man3dir = ${mandir}/man3
+pkgconfigdir = ${libdir}/pkgconfig
-OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
- zutil.o inflate.o infback.o inftrees.o inffast.o
+OBJC = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \
+ gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
+PIC_OBJC = adler32.lo compress.lo crc32.lo deflate.lo gzclose.lo gzlib.lo gzread.lo \
+ gzwrite.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo uncompr.lo zutil.lo
+
+# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo
OBJA =
-# to use the asm code: make OBJA=match.o
+PIC_OBJA =
-TEST_OBJS = example.o minigzip.o
+OBJS = $(OBJC) $(OBJA)
-all: example$(EXE) minigzip$(EXE)
+PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA)
+
+all: static shared
+
+static: example$(EXE) minigzip$(EXE)
+
+shared: examplesh$(EXE) minigzipsh$(EXE)
+
+all64: example64$(EXE) minigzip64$(EXE)
check: test
-test: all
- @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
- echo hello world | ./minigzip | ./minigzip -d || \
- echo ' *** minigzip test FAILED ***' ; \
- if ./example; then \
+
+test: all teststatic testshared
+
+teststatic: static
+ @if echo hello world | ./minigzip | ./minigzip -d && ./example; then \
echo ' *** zlib test OK ***'; \
else \
- echo ' *** zlib test FAILED ***'; \
+ echo ' *** zlib test FAILED ***'; false; \
fi
+ -@rm -f foo.gz
-libz.a: $(OBJS) $(OBJA)
- $(AR) $@ $(OBJS) $(OBJA)
+testshared: shared
+ @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
+ LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \
+ DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \
+ SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \
+ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh; then \
+ echo ' *** zlib shared test OK ***'; \
+ else \
+ echo ' *** zlib shared test FAILED ***'; false; \
+ fi
+ -@rm -f foo.gz
+
+test64: all64
+ @if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64; then \
+ echo ' *** zlib 64-bit test OK ***'; \
+ else \
+ echo ' *** zlib 64-bit test FAILED ***'; false; \
+ fi
+ -@rm -f foo.gz
+
+libz.a: $(OBJS)
+ $(AR) $@ $(OBJS)
-@ ($(RANLIB) $@ || true) >/dev/null 2>&1
match.o: match.S
@@ -77,58 +117,116 @@ match.o: match.S
mv _match.o match.o
rm -f _match.s
-$(SHAREDLIBV): $(OBJS)
- $(LDSHARED) -o $@ $(OBJS)
+match.lo: match.S
+ $(CPP) match.S > _match.s
+ $(CC) -c -fPIC _match.s
+ mv _match.o match.lo
+ rm -f _match.s
+
+example64.o: example.c zlib.h zconf.h
+ $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ example.c
+
+minigzip64.o: minigzip.c zlib.h zconf.h
+ $(CC) $(CFLAGS) -D_FILE_OFFSET_BITS=64 -c -o $@ minigzip.c
+
+.SUFFIXES: .lo
+
+.c.lo:
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) -DPIC -c -o objs/$*.o $<
+ -@mv objs/$*.o $@
+
+$(SHAREDLIBV): $(PIC_OBJS)
+ $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS)
rm -f $(SHAREDLIB) $(SHAREDLIBM)
ln -s $@ $(SHAREDLIB)
ln -s $@ $(SHAREDLIBM)
+ -@rmdir objs
-example$(EXE): example.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
+example$(EXE): example.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS)
-minigzip$(EXE): minigzip.o $(LIBS)
- $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
+minigzip$(EXE): minigzip.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS)
-install: $(LIBS)
- -@if [ ! -d $(exec_prefix) ]; then mkdir -p $(exec_prefix); fi
- -@if [ ! -d $(includedir) ]; then mkdir -p $(includedir); fi
- -@if [ ! -d $(libdir) ]; then mkdir -p $(libdir); fi
- -@if [ ! -d $(man3dir) ]; then mkdir -p $(man3dir); fi
- cp zlib.h zconf.h $(includedir)
- chmod 644 $(includedir)/zlib.h $(includedir)/zconf.h
- cp $(LIBS) $(libdir)
- cd $(libdir); chmod 755 $(LIBS)
- -@(cd $(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
- cd $(libdir); if test -f $(SHAREDLIBV); then \
+examplesh$(EXE): example.o $(SHAREDLIBV)
+ $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV)
+
+minigzipsh$(EXE): minigzip.o $(SHAREDLIBV)
+ $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV)
+
+example64$(EXE): example64.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS)
+
+minigzip64$(EXE): minigzip64.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS)
+
+install-libs: $(LIBS)
+ -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi
+ -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi
+ -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi
+ -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi
+ -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi
+ cp $(STATICLIB) $(DESTDIR)$(libdir)
+ cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)
+ cd $(DESTDIR)$(libdir); chmod u=rw,go=r $(STATICLIB)
+ -@(cd $(DESTDIR)$(libdir); $(RANLIB) libz.a || true) >/dev/null 2>&1
+ -@cd $(DESTDIR)$(sharedlibdir); if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \
+ chmod 755 $(SHAREDLIBV); \
rm -f $(SHAREDLIB) $(SHAREDLIBM); \
ln -s $(SHAREDLIBV) $(SHAREDLIB); \
ln -s $(SHAREDLIBV) $(SHAREDLIBM); \
- (ldconfig || true) >/dev/null 2>&1; \
+ ($(LDCONFIG) || true) >/dev/null 2>&1; \
fi
- cp zlib.3 $(man3dir)
- chmod 644 $(man3dir)/zlib.3
+ cp zlib.3 $(DESTDIR)$(man3dir)
+ chmod 644 $(DESTDIR)$(man3dir)/zlib.3
+ cp zlib.pc $(DESTDIR)$(pkgconfigdir)
+ chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc
# The ranlib in install is needed on NeXTSTEP which checks file times
# ldconfig is for Linux
+install: install-libs
+ -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi
+ cp zlib.h zconf.h $(DESTDIR)$(includedir)
+ chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
+
uninstall:
- cd $(includedir); \
- cd $(libdir); rm -f libz.a; \
- if test -f $(SHAREDLIBV); then \
+ cd $(DESTDIR)$(includedir); rm -f zlib.h zconf.h
+ cd $(DESTDIR)$(libdir); rm -f libz.a; \
+ if test "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \
rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \
fi
- cd $(man3dir); rm -f zlib.3
+ cd $(DESTDIR)$(man3dir); rm -f zlib.3
+ cd $(DESTDIR)$(pkgconfigdir); rm -f zlib.pc
+
+docs: zlib.3.pdf
+
+zlib.3.pdf: zlib.3
+ groff -mandoc -f H -T ps zlib.3 | ps2pdf - zlib.3.pdf
+
+zconf.h.in: zconf.h.cmakein
+ sed "/^#cmakedefine/D" < zconf.h.cmakein > zconf.h.in
+ touch -r zconf.h.cmakein zconf.h.in
+
+zconf: zconf.h.in
+ cp -p zconf.h.in zconf.h
mostlyclean: clean
clean:
- rm -f *.o *~ example$(EXE) minigzip$(EXE) \
+ rm -f *.o *.lo *~ \
+ example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \
+ example64$(EXE) minigzip64$(EXE) \
libz.* foo.gz so_locations \
_match.s maketree contrib/infback9/*.o
+ rm -rf objs
maintainer-clean: distclean
-distclean: clean
- cp -p Makefile.in Makefile
- cp -p zconf.in.h zconf.h
- rm -f .DS_Store
+distclean: clean zconf docs
+ rm -f Makefile zlib.pc
+ -@rm -f .DS_Store
+ -@printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile
+ -@printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile
+ -@touch -r Makefile.in Makefile
tags:
etags *.[ch]
@@ -138,17 +236,22 @@ depend:
# DO NOT DELETE THIS LINE -- make depend depends on it.
-adler32.o: zlib.h zconf.h
-compress.o: zlib.h zconf.h
-crc32.o: crc32.h zlib.h zconf.h
+adler32.o zutil.o: zutil.h zlib.h zconf.h
+gzclose.o gzlib.o gzread.o gzwrite.o: zlib.h zconf.h gzguts.h
+compress.o example.o minigzip.o uncompr.o: zlib.h zconf.h
+crc32.o: zutil.h zlib.h zconf.h crc32.h
deflate.o: deflate.h zutil.h zlib.h zconf.h
-example.o: zlib.h zconf.h
-gzio.o: zutil.h zlib.h zconf.h
+infback.o inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h
inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
-inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
-infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
inftrees.o: zutil.h zlib.h zconf.h inftrees.h
-minigzip.o: zlib.h zconf.h
trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
-uncompr.o: zlib.h zconf.h
-zutil.o: zutil.h zlib.h zconf.h
+
+adler32.lo zutil.lo: zutil.h zlib.h zconf.h
+gzclose.lo gzlib.lo gzread.lo gzwrite.lo: zlib.h zconf.h gzguts.h
+compress.lo example.lo minigzip.lo uncompr.lo: zlib.h zconf.h
+crc32.lo: zutil.h zlib.h zconf.h crc32.h
+deflate.lo: deflate.h zutil.h zlib.h zconf.h
+infback.lo inflate.lo: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h inffixed.h
+inffast.lo: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+inftrees.lo: zutil.h zlib.h zconf.h inftrees.h
+trees.lo: deflate.h zutil.h zlib.h zconf.h trees.h
diff --git a/lib/3rdparty/zlib/README b/lib/3rdparty/zlib/README
index 758cc50020d..d4219bf889f 100644
--- a/lib/3rdparty/zlib/README
+++ b/lib/3rdparty/zlib/README
@@ -1,56 +1,52 @@
ZLIB DATA COMPRESSION LIBRARY
-zlib 1.2.3 is a general purpose data compression library. All the code is
+zlib 1.2.5 is a general purpose data compression library. All the code is
thread safe. The data format used by the zlib library is described by RFCs
(Request for Comments) 1950 to 1952 in the files
http://www.ietf.org/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate format)
-and rfc1952.txt (gzip format). These documents are also available in other
-formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
+and rfc1952.txt (gzip format).
All functions of the compression library are documented in the file zlib.h
-(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
+(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
of the library is given in the file example.c which also tests that the library
-is working correctly. Another example is given in the file minigzip.c. The
+is working correctly. Another example is given in the file minigzip.c. The
compression library itself is composed of all source files except example.c and
minigzip.c.
To compile all files and run the test program, follow the instructions given at
-the top of Makefile. In short "make test; make install" should work for most
-machines. For Unix: "./configure; make test; make install". For MSDOS, use one
-of the special makefiles such as Makefile.msc. For VMS, use make_vms.com.
+the top of Makefile.in. In short "./configure; make test", and if that goes
+well, "make install" should work for most flavors of Unix. For Windows, use one
+of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
+make_vms.com.
Questions about zlib should be sent to , or to Gilles Vollant
- for the Windows DLL version. The zlib home page is
-http://www.zlib.org or http://www.gzip.org/zlib/ Before reporting a problem,
-please check this site to verify that you have the latest version of zlib;
-otherwise get the latest version and check whether the problem still exists or
-not.
+ for the Windows DLL version. The zlib home page is
+http://zlib.net/ . Before reporting a problem, please check this site to
+verify that you have the latest version of zlib; otherwise get the latest
+version and check whether the problem still exists or not.
-PLEASE read the zlib FAQ http://www.gzip.org/zlib/zlib_faq.html before asking
-for help.
+PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
-Mark Nelson wrote an article about zlib for the Jan. 1997
-issue of Dr. Dobb's Journal; a copy of the article is available in
-http://dogma.net/markn/articles/zlibtool/zlibtool.htm
+Mark Nelson wrote an article about zlib for the Jan. 1997
+issue of Dr. Dobb's Journal; a copy of the article is available at
+http://marknelson.us/1997/01/01/zlib-engine/ .
-The changes made in version 1.2.3 are documented in the file ChangeLog.
+The changes made in version 1.2.5 are documented in the file ChangeLog.
-Unsupported third party contributions are provided in directory "contrib".
+Unsupported third party contributions are provided in directory contrib/ .
-A Java implementation of zlib is available in the Java Development Kit
-http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html
-See the zlib home page http://www.zlib.org for details.
+zlib is available in Java using the java.util.zip package, documented at
+http://java.sun.com/developer/technicalArticles/Programming/compression/ .
-A Perl interface to zlib written by Paul Marquess is in the
-CPAN (Comprehensive Perl Archive Network) sites
-http://www.cpan.org/modules/by-module/Compress/
+A Perl interface to zlib written by Paul Marquess is available
+at CPAN (Comprehensive Perl Archive Network) sites, including
+http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
A Python interface to zlib written by A.M. Kuchling is
available in Python 1.5 and later versions, see
-http://www.python.org/doc/lib/module-zlib.html
+http://www.python.org/doc/lib/module-zlib.html .
-A zlib binding for TCL written by Andreas Kupries is
-availlable at http://www.oche.de/~akupries/soft/trf/trf_zip.html
+zlib is built into tcl: http://wiki.tcl.tk/4610 .
An experimental package to read and write files in .zip format, written on top
of zlib by Gilles Vollant , is available in the
@@ -74,25 +70,21 @@ Notes for some targets:
- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
other compilers. Use "make test" to check your compiler.
-- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
+- gzdopen is not supported on RISCOS or BEOS.
- For PalmOs, see http://palmzlib.sourceforge.net/
-- When building a shared, i.e. dynamic library on Mac OS X, the library must be
- installed before testing (do "make install" before "make test"), since the
- library location is specified in the library.
-
Acknowledgments:
- The deflate format used by zlib was defined by Phil Katz. The deflate
- and zlib specifications were written by L. Peter Deutsch. Thanks to all the
- people who reported problems and suggested various improvements in zlib;
- they are too numerous to cite here.
+ The deflate format used by zlib was defined by Phil Katz. The deflate and
+ zlib specifications were written by L. Peter Deutsch. Thanks to all the
+ people who reported problems and suggested various improvements in zlib; they
+ are too numerous to cite here.
Copyright notice:
- (C) 1995-2004 Jean-loup Gailly and Mark Adler
+ (C) 1995-2010 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -113,13 +105,11 @@ Copyright notice:
Jean-loup Gailly Mark Adler
jloup@gzip.org madler@alumni.caltech.edu
-If you use the zlib library in a product, we would appreciate *not*
-receiving lengthy legal documents to sign. The sources are provided
-for free but without warranty of any kind. The library has been
-entirely written by Jean-loup Gailly and Mark Adler; it does not
-include third-party code.
+If you use the zlib library in a product, we would appreciate *not* receiving
+lengthy legal documents to sign. The sources are provided for free but without
+warranty of any kind. The library has been entirely written by Jean-loup
+Gailly and Mark Adler; it does not include third-party code.
-If you redistribute modified sources, we would appreciate that you include
-in the file ChangeLog history information documenting your changes. Please
-read the FAQ for more information on the distribution of modified source
-versions.
+If you redistribute modified sources, we would appreciate that you include in
+the file ChangeLog history information documenting your changes. Please read
+the FAQ for more information on the distribution of modified source versions.
diff --git a/lib/3rdparty/zlib/adler32.c b/lib/3rdparty/zlib/adler32.c
index 007ba26277c..65ad6a5adc4 100644
--- a/lib/3rdparty/zlib/adler32.c
+++ b/lib/3rdparty/zlib/adler32.c
@@ -1,12 +1,15 @@
/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995-2004 Mark Adler
+ * Copyright (C) 1995-2007 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
/* @(#) $Id$ */
-#define ZLIB_INTERNAL
-#include "zlib.h"
+#include "zutil.h"
+
+#define local static
+
+local uLong adler32_combine_(uLong adler1, uLong adler2, z_off64_t len2);
#define BASE 65521UL /* largest prime smaller than 65536 */
#define NMAX 5552
@@ -125,10 +128,10 @@ uLong ZEXPORT adler32(adler, buf, len)
}
/* ========================================================================= */
-uLong ZEXPORT adler32_combine(adler1, adler2, len2)
+local uLong adler32_combine_(adler1, adler2, len2)
uLong adler1;
uLong adler2;
- z_off_t len2;
+ z_off64_t len2;
{
unsigned long sum1;
unsigned long sum2;
@@ -141,9 +144,26 @@ uLong ZEXPORT adler32_combine(adler1, adler2, len2)
MOD(sum2);
sum1 += (adler2 & 0xffff) + BASE - 1;
sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
- if (sum1 > BASE) sum1 -= BASE;
- if (sum1 > BASE) sum1 -= BASE;
- if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
- if (sum2 > BASE) sum2 -= BASE;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
+ if (sum2 >= BASE) sum2 -= BASE;
return sum1 | (sum2 << 16);
}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_combine(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off_t len2;
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
+
+uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off64_t len2;
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
diff --git a/lib/3rdparty/zlib/algorithm.txt b/lib/3rdparty/zlib/algorithm.txt
index b022dde312a..34960bddacc 100644
--- a/lib/3rdparty/zlib/algorithm.txt
+++ b/lib/3rdparty/zlib/algorithm.txt
@@ -121,7 +121,7 @@ At least for deflate's output that generates new trees every several 10's of
kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
would take too long if you're only decoding several thousand symbols. At the
other extreme, you could make a new table for every bit in the code. In fact,
-that's essentially a Huffman tree. But then you spend two much time
+that's essentially a Huffman tree. But then you spend too much time
traversing the tree while decoding, even for short symbols.
So the number of bits for the first lookup table is a trade of the time to
diff --git a/lib/3rdparty/zlib/compress.c b/lib/3rdparty/zlib/compress.c
index df04f0148e6..ea4dfbe9d7b 100644
--- a/lib/3rdparty/zlib/compress.c
+++ b/lib/3rdparty/zlib/compress.c
@@ -1,5 +1,5 @@
/* compress.c -- compress a memory buffer
- * Copyright (C) 1995-2003 Jean-loup Gailly.
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -75,5 +75,6 @@ int ZEXPORT compress (dest, destLen, source, sourceLen)
uLong ZEXPORT compressBound (sourceLen)
uLong sourceLen;
{
- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13;
}
diff --git a/lib/3rdparty/zlib/configure b/lib/3rdparty/zlib/configure
index d7ffdc3458d..bd9edd26cdd 100644
--- a/lib/3rdparty/zlib/configure
+++ b/lib/3rdparty/zlib/configure
@@ -1,37 +1,61 @@
#!/bin/sh
-# configure script for zlib. This script is needed only if
-# you wish to build a shared library and your system supports them,
-# of if you need special compiler, flags or install directory.
-# Otherwise, you can just use directly "make test; make install"
+# configure script for zlib.
#
-# To create a shared library, use "configure --shared"; by default a static
-# library is created. If the primitive shared library support provided here
-# does not work, use ftp://prep.ai.mit.edu/pub/gnu/libtool-*.tar.gz
+# Normally configure builds both a static and a shared library.
+# If you want to build just a static library, use: ./configure --static
#
# To impose specific compiler or flags or install directory, use for example:
# prefix=$HOME CC=cc CFLAGS="-O4" ./configure
# or for csh/tcsh users:
# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
-# LDSHARED is the command to be used to create a shared library
# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
# If you have problems, try without defining CC and CFLAGS before reporting
# an error.
-LIBS=libz.a
-LDFLAGS="-L. ${LIBS}"
+if [ -n "${CHOST}" ]; then
+ uname="$(echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/')"
+ CROSS_PREFIX="${CHOST}-"
+fi
+
+STATICLIB=libz.a
+LDFLAGS="${LDFLAGS} -L. ${STATICLIB}"
VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`
+VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < zlib.h`
VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h`
VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h`
-AR=${AR-"ar rc"}
-RANLIB=${RANLIB-"ranlib"}
+if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then
+ AR=${AR-"${CROSS_PREFIX}ar"}
+ test -n "${CROSS_PREFIX}" && echo Using ${AR}
+else
+ AR=${AR-"ar"}
+ test -n "${CROSS_PREFIX}" && echo Using ${AR}
+fi
+AR_RC="${AR} rc"
+if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then
+ RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"}
+ test -n "${CROSS_PREFIX}" && echo Using ${RANLIB}
+else
+ RANLIB=${RANLIB-"ranlib"}
+fi
+if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then
+ NM=${NM-"${CROSS_PREFIX}nm"}
+ test -n "${CROSS_PREFIX}" && echo Using ${NM}
+else
+ NM=${NM-"nm"}
+fi
+LDCONFIG=${LDCONFIG-"ldconfig"}
+LDSHAREDLIBC="${LDSHAREDLIBC--lc}"
prefix=${prefix-/usr/local}
exec_prefix=${exec_prefix-'${prefix}'}
libdir=${libdir-'${exec_prefix}/lib'}
+sharedlibdir=${sharedlibdir-'${libdir}'}
includedir=${includedir-'${prefix}/include'}
mandir=${mandir-'${prefix}/share/man'}
shared_ext='.so'
-shared=0
+shared=1
+zprefix=0
+build64=0
gcc=0
old_cc="$CC"
old_cflags="$CFLAGS"
@@ -39,21 +63,29 @@ old_cflags="$CFLAGS"
while test $# -ge 1
do
case "$1" in
- -h* | --h*)
+ -h* | --help)
echo 'usage:'
- echo ' configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]'
- echo ' [--libdir=LIBDIR] [--includedir=INCLUDEDIR]'
- exit 0;;
- -p*=* | --p*=*) prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -e*=* | --e*=*) exec_prefix=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -l*=* | --libdir=*) libdir=`echo $1 | sed 's/[-a-z_]*=//'`; shift;;
- -i*=* | --includedir=*) includedir=`echo $1 | sed 's/[-a-z_]*=//'`;shift;;
- -p* | --p*) prefix="$2"; shift; shift;;
- -e* | --e*) exec_prefix="$2"; shift; shift;;
- -l* | --l*) libdir="$2"; shift; shift;;
- -i* | --i*) includedir="$2"; shift; shift;;
- -s* | --s*) shared=1; shift;;
- *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1;;
+ echo ' configure [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]'
+ echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]'
+ echo ' [--includedir=INCLUDEDIR]'
+ exit 0 ;;
+ -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;;
+ -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;;
+ -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;;
+ --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;;
+ -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;;
+ -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;;
+ -p* | --prefix) prefix="$2"; shift; shift ;;
+ -e* | --eprefix) exec_prefix="$2"; shift; shift ;;
+ -l* | --libdir) libdir="$2"; shift; shift ;;
+ -i* | --includedir) includedir="$2"; shift; shift ;;
+ -s* | --shared | --enable-shared) shared=1; shift ;;
+ -t | --static) shared=0; shift ;;
+ -z* | --zprefix) zprefix=1; shift ;;
+ -6* | --64) build64=1; shift ;;
+ --sysconfdir=*) echo "ignored option: --sysconfdir"; shift ;;
+ --localstatedir=*) echo "ignored option: --localstatedir"; shift ;;
+ *) echo "unknown option: $1"; echo "$0 --help for help"; exit 1 ;;
esac
done
@@ -63,46 +95,68 @@ extern int getchar();
int hello() {return getchar();}
EOF
-test -z "$CC" && echo Checking for gcc...
-cc=${CC-gcc}
+test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc...
+cc=${CC-${CROSS_PREFIX}gcc}
cflags=${CFLAGS-"-O3"}
# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
case "$cc" in
- *gcc*) gcc=1;;
+ *gcc*) gcc=1 ;;
esac
if test "$gcc" -eq 1 && ($cc -c $cflags $test.c) 2>/dev/null; then
CC="$cc"
- SFLAGS=${CFLAGS-"-fPIC -O3"}
- CFLAGS="$cflags"
- case `(uname -s || echo unknown) 2>/dev/null` in
- Linux | linux | GNU | GNU/*) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1"};;
- CYGWIN* | Cygwin* | cygwin* | OS/2* )
- EXE='.exe';;
+ SFLAGS="${CFLAGS--O3} -fPIC"
+ CFLAGS="${CFLAGS--O3}"
+ if test $build64 -eq 1; then
+ CFLAGS="${CFLAGS} -m64"
+ SFLAGS="${SFLAGS} -m64"
+ fi
+ if test "${ZLIBGCCWARN}" = "YES"; then
+ CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"
+ fi
+ if test -z "$uname"; then
+ uname=`(uname -s || echo unknown) 2>/dev/null`
+ fi
+ case "$uname" in
+ Linux* | linux* | GNU | GNU/* | *BSD | DragonFly) LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;;
+ CYGWIN* | Cygwin* | cygwin* | OS/2*)
+ EXE='.exe' ;;
+ MINGW*|mingw*)
+# temporary bypass
+ rm -f $test.[co] $test $test$shared_ext
+ echo "Please use win32/Makefile.gcc instead."
+ exit 1
+ LDSHARED=${LDSHARED-"$cc -shared"}
+ LDSHAREDLIBC=""
+ EXE='.exe' ;;
QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4
# (alain.bonnefoy@icbt.com)
- LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"};;
+ LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;;
HP-UX*)
LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"}
case `(uname -m || echo unknown) 2>/dev/null` in
ia64)
shared_ext='.so'
- SHAREDLIB='libz.so';;
+ SHAREDLIB='libz.so' ;;
*)
shared_ext='.sl'
- SHAREDLIB='libz.sl';;
- esac;;
+ SHAREDLIB='libz.sl' ;;
+ esac ;;
Darwin*) shared_ext='.dylib'
SHAREDLIB=libz$shared_ext
SHAREDLIBV=libz.$VER$shared_ext
SHAREDLIBM=libz.$VER1$shared_ext
- LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER"};;
- *) LDSHARED=${LDSHARED-"$cc -shared"};;
+ LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"} ;;
+ *) LDSHARED=${LDSHARED-"$cc -shared"} ;;
esac
else
# find system name and corresponding cc options
CC=${CC-cc}
- case `(uname -sr || echo unknown) 2>/dev/null` in
+ gcc=0
+ if test -z "$uname"; then
+ uname=`(uname -sr || echo unknown) 2>/dev/null`
+ fi
+ case "$uname" in
HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
CFLAGS=${CFLAGS-"-O"}
# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
@@ -110,57 +164,64 @@ else
case `(uname -m || echo unknown) 2>/dev/null` in
ia64)
shared_ext='.so'
- SHAREDLIB='libz.so';;
+ SHAREDLIB='libz.so' ;;
*)
shared_ext='.sl'
- SHAREDLIB='libz.sl';;
- esac;;
+ SHAREDLIB='libz.sl' ;;
+ esac ;;
IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
CFLAGS=${CFLAGS-"-ansi -O2"}
- LDSHARED=${LDSHARED-"cc -shared"};;
+ LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;
OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
CFLAGS=${CFLAGS-"-O -std1"}
- LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"};;
+ LDFLAGS="${LDFLAGS} -Wl,-rpath,."
+ LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;;
OSF1*) SFLAGS=${CFLAGS-"-O -std1"}
CFLAGS=${CFLAGS-"-O -std1"}
- LDSHARED=${LDSHARED-"cc -shared"};;
+ LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;
QNX*) SFLAGS=${CFLAGS-"-4 -O"}
CFLAGS=${CFLAGS-"-4 -O"}
LDSHARED=${LDSHARED-"cc"}
RANLIB=${RANLIB-"true"}
- AR="cc -A";;
+ AR_RC="cc -A" ;;
SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
CFLAGS=${CFLAGS-"-O3"}
- LDSHARED=${LDSHARED-"cc -dy -KPIC -G"};;
- SunOS\ 5*) SFLAGS=${CFLAGS-"-fast -xcg89 -KPIC -R."}
- CFLAGS=${CFLAGS-"-fast -xcg89"}
- LDSHARED=${LDSHARED-"cc -G"};;
+ LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;;
+ SunOS\ 5*) LDSHARED=${LDSHARED-"cc -G"}
+ case `(uname -m || echo unknown) 2>/dev/null` in
+ i86*)
+ SFLAGS=${CFLAGS-"-xpentium -fast -KPIC -R."}
+ CFLAGS=${CFLAGS-"-xpentium -fast"} ;;
+ *)
+ SFLAGS=${CFLAGS-"-fast -xcg92 -KPIC -R."}
+ CFLAGS=${CFLAGS-"-fast -xcg92"} ;;
+ esac ;;
SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
CFLAGS=${CFLAGS-"-O2"}
- LDSHARED=${LDSHARED-"ld"};;
- SunStudio\ 9*) SFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"}
- CFLAGS=${CFLAGS-"-DUSE_MMAP -fast -xtarget=ultra3 -xarch=v9b"}
- LDSHARED=${LDSHARED-"cc -xarch=v9b"};;
+ LDSHARED=${LDSHARED-"ld"} ;;
+ SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"}
+ CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"}
+ LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;;
UNIX_System_V\ 4.2.0)
SFLAGS=${CFLAGS-"-KPIC -O"}
CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
+ LDSHARED=${LDSHARED-"cc -G"} ;;
UNIX_SV\ 4.2MP)
SFLAGS=${CFLAGS-"-Kconform_pic -O"}
CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
+ LDSHARED=${LDSHARED-"cc -G"} ;;
OpenUNIX\ 5)
SFLAGS=${CFLAGS-"-KPIC -O"}
CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -G"};;
+ LDSHARED=${LDSHARED-"cc -G"} ;;
AIX*) # Courtesy of dbakker@arrayasolutions.com
SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
- LDSHARED=${LDSHARED-"xlc -G"};;
- # send working options for other systems to support@gzip.org
+ LDSHARED=${LDSHARED-"xlc -G"} ;;
+ # send working options for other systems to zlib@gzip.org
*) SFLAGS=${CFLAGS-"-O"}
CFLAGS=${CFLAGS-"-O"}
- LDSHARED=${LDSHARED-"cc -shared"};;
+ LDSHARED=${LDSHARED-"cc -shared"} ;;
esac
fi
@@ -171,38 +232,83 @@ SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"}
if test $shared -eq 1; then
echo Checking for shared library support...
# we must test in two steps (cc then ld), required at least on SunOS 4.x
- if test "`($CC -c $SFLAGS $test.c) 2>&1`" = "" &&
- test "`($LDSHARED -o $test$shared_ext $test.o) 2>&1`" = ""; then
- CFLAGS="$SFLAGS"
- LIBS="$SHAREDLIBV"
+ if test "`($CC -w -c $SFLAGS $test.c) 2>&1`" = "" &&
+ test "`($LDSHARED $SFLAGS -o $test$shared_ext $test.o) 2>&1`" = ""; then
echo Building shared library $SHAREDLIBV with $CC.
elif test -z "$old_cc" -a -z "$old_cflags"; then
echo No shared library support.
shared=0;
else
+ echo Tested $CC -w -c $SFLAGS $test.c
+ $CC -w -c $SFLAGS $test.c
+ echo Tested $LDSHARED $SFLAGS -o $test$shared_ext $test.o
+ $LDSHARED $SFLAGS -o $test$shared_ext $test.o
echo 'No shared library support; try without defining CC and CFLAGS'
shared=0;
fi
fi
if test $shared -eq 0; then
LDSHARED="$CC"
- echo Building static library $LIBS version $VER with $CC.
+ ALL="static"
+ TEST="all teststatic"
+ SHAREDLIB=""
+ SHAREDLIBV=""
+ SHAREDLIBM=""
+ echo Building static library $STATICLIB version $VER with $CC.
else
- LDFLAGS="-L. ${SHAREDLIBV}"
+ ALL="static shared"
+ TEST="all teststatic testshared"
fi
+cat > $test.c <
+off64_t dummy = 0;
+EOF
+if test "`($CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c) 2>&1`" = ""; then
+ CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"
+ SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"
+ ALL="${ALL} all64"
+ TEST="${TEST} test64"
+ echo "Checking for off64_t... Yes."
+ echo "Checking for fseeko... Yes."
+else
+ echo "Checking for off64_t... No."
+ cat > $test.c <
+int main(void) {
+ fseeko(NULL, 0, 0);
+ return 0;
+}
+EOF
+ if test "`($CC $CFLAGS -o $test $test.c) 2>&1`" = ""; then
+ echo "Checking for fseeko... Yes."
+ else
+ CFLAGS="${CFLAGS} -DNO_FSEEKO"
+ SFLAGS="${SFLAGS} -DNO_FSEEKO"
+ echo "Checking for fseeko... No."
+ fi
+fi
+
+cp -p zconf.h.in zconf.h
+
cat > $test.c <
int main() { return 0; }
EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- sed < zconf.in.h "/HAVE_UNISTD_H/s%0%1%" > zconf.h
+ sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h
+ mv zconf.temp.h zconf.h
echo "Checking for unistd.h... Yes."
else
- cp -p zconf.in.h zconf.h
echo "Checking for unistd.h... No."
fi
+if test $zprefix -eq 1; then
+ sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h
+ mv zconf.temp.h zconf.h
+ echo "Using z_ prefix on all symbols."
+fi
+
cat > $test.c <
#include
@@ -219,13 +325,13 @@ int main()
EOF
if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()"
+ echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()."
cat > $test.c <
#include
-int mytest(char *fmt, ...)
+int mytest(const char *fmt, ...)
{
char buf[20];
va_list ap;
@@ -249,7 +355,7 @@ EOF
#include
#include
-int mytest(char *fmt, ...)
+int mytest(const char *fmt, ...)
{
int n;
char buf[20];
@@ -271,6 +377,7 @@ EOF
echo "Checking for return value of vsnprintf()... Yes."
else
CFLAGS="$CFLAGS -DHAS_vsnprintf_void"
+ SFLAGS="$SFLAGS -DHAS_vsnprintf_void"
echo "Checking for return value of vsnprintf()... No."
echo " WARNING: apparently vsnprintf() does not return a value. zlib"
echo " can build but will be open to possible string-format security"
@@ -278,6 +385,7 @@ EOF
fi
else
CFLAGS="$CFLAGS -DNO_vsnprintf"
+ SFLAGS="$SFLAGS -DNO_vsnprintf"
echo "Checking for vsnprintf() in stdio.h... No."
echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib"
echo " can build but will be open to possible buffer-overflow security"
@@ -287,7 +395,7 @@ EOF
#include
#include
-int mytest(char *fmt, ...)
+int mytest(const char *fmt, ...)
{
int n;
char buf[20];
@@ -309,6 +417,7 @@ EOF
echo "Checking for return value of vsprintf()... Yes."
else
CFLAGS="$CFLAGS -DHAS_vsprintf_void"
+ SFLAGS="$SFLAGS -DHAS_vsprintf_void"
echo "Checking for return value of vsprintf()... No."
echo " WARNING: apparently vsprintf() does not return a value. zlib"
echo " can build but will be open to possible string-format security"
@@ -316,7 +425,7 @@ EOF
fi
fi
else
- echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()"
+ echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()."
cat >$test.c <
@@ -358,6 +467,7 @@ EOF
echo "Checking for return value of snprintf()... Yes."
else
CFLAGS="$CFLAGS -DHAS_snprintf_void"
+ SFLAGS="$SFLAGS -DHAS_snprintf_void"
echo "Checking for return value of snprintf()... No."
echo " WARNING: apparently snprintf() does not return a value. zlib"
echo " can build but will be open to possible string-format security"
@@ -365,6 +475,7 @@ EOF
fi
else
CFLAGS="$CFLAGS -DNO_snprintf"
+ SFLAGS="$SFLAGS -DNO_snprintf"
echo "Checking for snprintf() in stdio.h... No."
echo " WARNING: snprintf() not found, falling back to sprintf(). zlib"
echo " can build but will be open to possible buffer-overflow security"
@@ -390,6 +501,7 @@ EOF
echo "Checking for return value of sprintf()... Yes."
else
CFLAGS="$CFLAGS -DHAS_sprintf_void"
+ SFLAGS="$SFLAGS -DHAS_sprintf_void"
echo "Checking for return value of sprintf()... No."
echo " WARNING: apparently sprintf() does not return a value. zlib"
echo " can build but will be open to possible string-format security"
@@ -398,41 +510,37 @@ EOF
fi
fi
-cat >$test.c <
-int main() { return 0; }
-EOF
-if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then
- echo "Checking for errno.h... Yes."
-else
- echo "Checking for errno.h... No."
- CFLAGS="$CFLAGS -DNO_ERRNO_H"
-fi
-
-cat > $test.c <
-#include
-#include
-caddr_t hello() {
- return mmap((caddr_t)0, (off_t)0, PROT_READ, MAP_SHARED, 0, (off_t)0);
+if test "$gcc" -eq 1; then
+ cat > $test.c <