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 <= 33) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif +int ZLIB_INTERNAL foo; +int main() +{ + return 0; } EOF -if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then - CFLAGS="$CFLAGS -DUSE_MMAP" - echo Checking for mmap support... Yes. -else - echo Checking for mmap support... No. + if test "`($CC -c $CFLAGS $test.c) 2>&1`" = ""; then + echo "Checking for attribute(visibility) support... Yes." + else + CFLAGS="$CFLAGS -DNO_VIZ" + SFLAGS="$SFLAGS -DNO_VIZ" + echo "Checking for attribute(visibility) support... No." + fi fi CPP=${CPP-"$CC -E"} case $CFLAGS in *ASMV*) - if test "`nm $test.o | grep _hello`" = ""; then + if test "`$NM $test.o | grep _hello`" = ""; then CPP="$CPP -DNO_UNDERLINE" echo Checking for underline in external names... No. else echo Checking for underline in external names... Yes. - fi;; + fi ;; esac rm -f $test.[co] $test $test$shared_ext @@ -441,19 +549,48 @@ rm -f $test.[co] $test $test$shared_ext sed < Makefile.in " /^CC *=/s#=.*#=$CC# /^CFLAGS *=/s#=.*#=$CFLAGS# -/^CPP *=/s#=.*#=$CPP# +/^SFLAGS *=/s#=.*#=$SFLAGS# +/^LDFLAGS *=/s#=.*#=$LDFLAGS# /^LDSHARED *=/s#=.*#=$LDSHARED# -/^LIBS *=/s#=.*#=$LIBS# +/^CPP *=/s#=.*#=$CPP# +/^STATICLIB *=/s#=.*#=$STATICLIB# /^SHAREDLIB *=/s#=.*#=$SHAREDLIB# /^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# /^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# -/^AR *=/s#=.*#=$AR# +/^AR *=/s#=.*#=$AR_RC# +/^RANLIB *=/s#=.*#=$RANLIB# +/^LDCONFIG *=/s#=.*#=$LDCONFIG# +/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC# +/^EXE *=/s#=.*#=$EXE# +/^prefix *=/s#=.*#=$prefix# +/^exec_prefix *=/s#=.*#=$exec_prefix# +/^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# +/^includedir *=/s#=.*#=$includedir# +/^mandir *=/s#=.*#=$mandir# +/^all: */s#:.*#: $ALL# +/^test: */s#:.*#: $TEST# +" > Makefile + +sed < zlib.pc.in " +/^CC *=/s#=.*#=$CC# +/^CFLAGS *=/s#=.*#=$CFLAGS# +/^CPP *=/s#=.*#=$CPP# +/^LDSHARED *=/s#=.*#=$LDSHARED# +/^STATICLIB *=/s#=.*#=$STATICLIB# +/^SHAREDLIB *=/s#=.*#=$SHAREDLIB# +/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV# +/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM# +/^AR *=/s#=.*#=$AR_RC# /^RANLIB *=/s#=.*#=$RANLIB# /^EXE *=/s#=.*#=$EXE# /^prefix *=/s#=.*#=$prefix# /^exec_prefix *=/s#=.*#=$exec_prefix# /^libdir *=/s#=.*#=$libdir# +/^sharedlibdir *=/s#=.*#=$sharedlibdir# /^includedir *=/s#=.*#=$includedir# /^mandir *=/s#=.*#=$mandir# /^LDFLAGS *=/s#=.*#=$LDFLAGS# -" > Makefile +" | sed -e " +s/\@VERSION\@/$VER/g; +" > zlib.pc diff --git a/lib/3rdparty/zlib/crc32.c b/lib/3rdparty/zlib/crc32.c index f658a9ef55e..91be372d224 100644 --- a/lib/3rdparty/zlib/crc32.c +++ b/lib/3rdparty/zlib/crc32.c @@ -1,5 +1,5 @@ /* crc32.c -- compute the CRC-32 of a data stream - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2006, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h * * Thanks to Rodney Brown for his contribution of faster @@ -53,7 +53,7 @@ /* Definitions for doing the crc four data bytes at a time. */ #ifdef BYFOUR -# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \ +# define REV(w) ((((w)>>24)&0xff)+(((w)>>8)&0xff00)+ \ (((w)&0xff00)<<8)+(((w)&0xff)<<24)) local unsigned long crc32_little OF((unsigned long, const unsigned char FAR *, unsigned)); @@ -68,6 +68,8 @@ local unsigned long gf2_matrix_times OF((unsigned long *mat, unsigned long vec)); local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat)); +local uLong crc32_combine_(uLong crc1, uLong crc2, z_off64_t len2); + #ifdef DYNAMIC_CRC_TABLE @@ -219,7 +221,7 @@ const unsigned long FAR * ZEXPORT get_crc_table() unsigned long ZEXPORT crc32(crc, buf, len) unsigned long crc; const unsigned char FAR *buf; - unsigned len; + uInt len; { if (buf == Z_NULL) return 0UL; @@ -367,22 +369,22 @@ local void gf2_matrix_square(square, mat) } /* ========================================================================= */ -uLong ZEXPORT crc32_combine(crc1, crc2, len2) +local uLong crc32_combine_(crc1, crc2, len2) uLong crc1; uLong crc2; - z_off_t len2; + z_off64_t len2; { int n; unsigned long row; unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */ - /* degenerate case */ - if (len2 == 0) + /* degenerate case (also disallow negative lengths) */ + if (len2 <= 0) return crc1; /* put operator for one zero bit in odd */ - odd[0] = 0xedb88320L; /* CRC-32 polynomial */ + odd[0] = 0xedb88320UL; /* CRC-32 polynomial */ row = 1; for (n = 1; n < GF2_DIM; n++) { odd[n] = row; @@ -421,3 +423,20 @@ uLong ZEXPORT crc32_combine(crc1, crc2, len2) crc1 ^= crc2; return crc1; } + +/* ========================================================================= */ +uLong ZEXPORT crc32_combine(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} + +uLong ZEXPORT crc32_combine64(crc1, crc2, len2) + uLong crc1; + uLong crc2; + z_off64_t len2; +{ + return crc32_combine_(crc1, crc2, len2); +} diff --git a/lib/3rdparty/zlib/deflate.c b/lib/3rdparty/zlib/deflate.c index 29ce1f64a57..5c4022f3d47 100644 --- a/lib/3rdparty/zlib/deflate.c +++ b/lib/3rdparty/zlib/deflate.c @@ -1,5 +1,5 @@ /* deflate.c -- compress data using the deflation algorithm - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -52,7 +52,7 @@ #include "deflate.h" const char deflate_copyright[] = - " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly "; + " deflate 1.2.5 Copyright 1995-2010 Jean-loup Gailly and Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -79,19 +79,18 @@ local block_state deflate_fast OF((deflate_state *s, int flush)); #ifndef FASTEST local block_state deflate_slow OF((deflate_state *s, int flush)); #endif +local block_state deflate_rle OF((deflate_state *s, int flush)); +local block_state deflate_huff OF((deflate_state *s, int flush)); local void lm_init OF((deflate_state *s)); local void putShortMSB OF((deflate_state *s, uInt b)); local void flush_pending OF((z_streamp strm)); local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size)); -#ifndef FASTEST #ifdef ASMV void match_init OF((void)); /* asm code initialization */ uInt longest_match OF((deflate_state *s, IPos cur_match)); #else local uInt longest_match OF((deflate_state *s, IPos cur_match)); #endif -#endif -local uInt longest_match_fast OF((deflate_state *s, IPos cur_match)); #ifdef DEBUG local void check_match OF((deflate_state *s, IPos start, IPos match, @@ -110,11 +109,6 @@ local void check_match OF((deflate_state *s, IPos start, IPos match, #endif /* Matches of length 3 are discarded if their distance exceeds TOO_FAR */ -#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1) -/* Minimum amount of lookahead, except at the end of the input file. - * See deflate.c for comments about the MIN_MATCH+1. - */ - /* Values for max_lazy_match, good_match and max_chain_length, depending on * the desired pack level (0..9). The values given below have been tuned to * exclude worst case performance for pathological files. Better values may be @@ -288,6 +282,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy, s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos)); s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos)); + s->high_water = 0; /* nothing written to s->window yet */ + s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); @@ -332,8 +328,8 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength) strm->adler = adler32(strm->adler, dictionary, dictLength); if (length < MIN_MATCH) return Z_OK; - if (length > MAX_DIST(s)) { - length = MAX_DIST(s); + if (length > s->w_size) { + length = s->w_size; dictionary += dictLength - length; /* use the tail of the dictionary */ } zmemcpy(s->window, dictionary, length); @@ -435,9 +431,10 @@ int ZEXPORT deflateParams(strm, level, strategy) } func = configuration_table[s->level].func; - if (func != configuration_table[level].func && strm->total_in != 0) { + if ((strategy != s->strategy || func != configuration_table[level].func) && + strm->total_in != 0) { /* Flush the last buffer: */ - err = deflate(strm, Z_PARTIAL_FLUSH); + err = deflate(strm, Z_BLOCK); } if (s->level != level) { s->level = level; @@ -481,33 +478,66 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain) * resulting from using fixed blocks instead of stored blocks, which deflate * can emit on compressed data for some combinations of the parameters. * - * This function could be more sophisticated to provide closer upper bounds - * for every combination of windowBits and memLevel, as well as wrap. - * But even the conservative upper bound of about 14% expansion does not - * seem onerous for output buffer allocation. + * This function could be more sophisticated to provide closer upper bounds for + * every combination of windowBits and memLevel. But even the conservative + * upper bound of about 14% expansion does not seem onerous for output buffer + * allocation. */ uLong ZEXPORT deflateBound(strm, sourceLen) z_streamp strm; uLong sourceLen; { deflate_state *s; - uLong destLen; + uLong complen, wraplen; + Bytef *str; - /* conservative upper bound */ - destLen = sourceLen + - ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11; + /* conservative upper bound for compressed data */ + complen = sourceLen + + ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5; - /* if can't get parameters, return conservative bound */ + /* if can't get parameters, return conservative bound plus zlib wrapper */ if (strm == Z_NULL || strm->state == Z_NULL) - return destLen; + return complen + 6; + + /* compute wrapper length */ + s = strm->state; + switch (s->wrap) { + case 0: /* raw deflate */ + wraplen = 0; + break; + case 1: /* zlib wrapper */ + wraplen = 6 + (s->strstart ? 4 : 0); + break; + case 2: /* gzip wrapper */ + wraplen = 18; + if (s->gzhead != Z_NULL) { /* user-supplied gzip header */ + if (s->gzhead->extra != Z_NULL) + wraplen += 2 + s->gzhead->extra_len; + str = s->gzhead->name; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + str = s->gzhead->comment; + if (str != Z_NULL) + do { + wraplen++; + } while (*str++); + if (s->gzhead->hcrc) + wraplen += 2; + } + break; + default: /* for compiler happiness */ + wraplen = 6; + } /* if not default parameters, return conservative bound */ - s = strm->state; if (s->w_bits != 15 || s->hash_bits != 8 + 7) - return destLen; + return complen + wraplen; /* default settings: return tight bound for that case */ - return compressBound(sourceLen); + return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + + (sourceLen >> 25) + 13 - 6 + wraplen; } /* ========================================================================= @@ -557,7 +587,7 @@ int ZEXPORT deflate (strm, flush) deflate_state *s; if (strm == Z_NULL || strm->state == Z_NULL || - flush > Z_FINISH || flush < 0) { + flush > Z_BLOCK || flush < 0) { return Z_STREAM_ERROR; } s = strm->state; @@ -581,7 +611,7 @@ int ZEXPORT deflate (strm, flush) put_byte(s, 31); put_byte(s, 139); put_byte(s, 8); - if (s->gzhead == NULL) { + if (s->gzhead == Z_NULL) { put_byte(s, 0); put_byte(s, 0); put_byte(s, 0); @@ -608,7 +638,7 @@ int ZEXPORT deflate (strm, flush) (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ? 4 : 0)); put_byte(s, s->gzhead->os & 0xff); - if (s->gzhead->extra != NULL) { + if (s->gzhead->extra != Z_NULL) { put_byte(s, s->gzhead->extra_len & 0xff); put_byte(s, (s->gzhead->extra_len >> 8) & 0xff); } @@ -650,7 +680,7 @@ int ZEXPORT deflate (strm, flush) } #ifdef GZIP if (s->status == EXTRA_STATE) { - if (s->gzhead->extra != NULL) { + if (s->gzhead->extra != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) { @@ -678,7 +708,7 @@ int ZEXPORT deflate (strm, flush) s->status = NAME_STATE; } if (s->status == NAME_STATE) { - if (s->gzhead->name != NULL) { + if (s->gzhead->name != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; @@ -709,7 +739,7 @@ int ZEXPORT deflate (strm, flush) s->status = COMMENT_STATE; } if (s->status == COMMENT_STATE) { - if (s->gzhead->comment != NULL) { + if (s->gzhead->comment != Z_NULL) { uInt beg = s->pending; /* start of bytes to update crc */ int val; @@ -787,7 +817,9 @@ int ZEXPORT deflate (strm, flush) (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) { block_state bstate; - bstate = (*(configuration_table[s->level].func))(s, flush); + bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : + (s->strategy == Z_RLE ? deflate_rle(s, flush) : + (*(configuration_table[s->level].func))(s, flush)); if (bstate == finish_started || bstate == finish_done) { s->status = FINISH_STATE; @@ -808,13 +840,17 @@ int ZEXPORT deflate (strm, flush) if (bstate == block_done) { if (flush == Z_PARTIAL_FLUSH) { _tr_align(s); - } else { /* FULL_FLUSH or SYNC_FLUSH */ + } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */ _tr_stored_block(s, (char*)0, 0L, 0); /* For a full flush, this empty block will be recognized * as a special marker by inflate_sync(). */ if (flush == Z_FULL_FLUSH) { CLEAR_HASH(s); /* forget history */ + if (s->lookahead == 0) { + s->strstart = 0; + s->block_start = 0L; + } } } flush_pending(strm); @@ -1167,12 +1203,13 @@ local uInt longest_match(s, cur_match) return s->lookahead; } #endif /* ASMV */ -#endif /* FASTEST */ + +#else /* FASTEST */ /* --------------------------------------------------------------------------- - * Optimized version for level == 1 or strategy == Z_RLE only + * Optimized version for FASTEST only */ -local uInt longest_match_fast(s, cur_match) +local uInt longest_match(s, cur_match) deflate_state *s; IPos cur_match; /* current match */ { @@ -1225,6 +1262,8 @@ local uInt longest_match_fast(s, cur_match) return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead; } +#endif /* FASTEST */ + #ifdef DEBUG /* =========================================================================== * Check that the match at match_start is indeed a match. @@ -1303,7 +1342,6 @@ local void fill_window(s) later. (Using level 0 permanently is not an optimal usage of zlib, so we don't care about this pathological case.) */ - /* %%% avoid this when Z_RLE */ n = s->hash_size; p = &s->head[n]; do { @@ -1355,27 +1393,61 @@ local void fill_window(s) */ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0); + + /* If the WIN_INIT bytes after the end of the current data have never been + * written, then zero those bytes in order to avoid memory check reports of + * the use of uninitialized (or uninitialised as Julian writes) bytes by + * the longest match routines. Update the high water mark for the next + * time through here. WIN_INIT is set to MAX_MATCH since the longest match + * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead. + */ + if (s->high_water < s->window_size) { + ulg curr = s->strstart + (ulg)(s->lookahead); + ulg init; + + if (s->high_water < curr) { + /* Previous high water mark below current data -- zero WIN_INIT + * bytes or up to end of window, whichever is less. + */ + init = s->window_size - curr; + if (init > WIN_INIT) + init = WIN_INIT; + zmemzero(s->window + curr, (unsigned)init); + s->high_water = curr + init; + } + else if (s->high_water < (ulg)curr + WIN_INIT) { + /* High water mark at or above current data, but below current data + * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up + * to end of window, whichever is less. + */ + init = (ulg)curr + WIN_INIT - s->high_water; + if (init > s->window_size - s->high_water) + init = s->window_size - s->high_water; + zmemzero(s->window + s->high_water, (unsigned)init); + s->high_water += init; + } + } } /* =========================================================================== * Flush the current block, with given end-of-file flag. * IN assertion: strstart is set to the end of the current match. */ -#define FLUSH_BLOCK_ONLY(s, eof) { \ +#define FLUSH_BLOCK_ONLY(s, last) { \ _tr_flush_block(s, (s->block_start >= 0L ? \ (charf *)&s->window[(unsigned)s->block_start] : \ (charf *)Z_NULL), \ (ulg)((long)s->strstart - s->block_start), \ - (eof)); \ + (last)); \ s->block_start = s->strstart; \ flush_pending(s->strm); \ Tracev((stderr,"[FLUSH]")); \ } /* Same but force premature exit if necessary. */ -#define FLUSH_BLOCK(s, eof) { \ - FLUSH_BLOCK_ONLY(s, eof); \ - if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \ +#define FLUSH_BLOCK(s, last) { \ + FLUSH_BLOCK_ONLY(s, last); \ + if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \ } /* =========================================================================== @@ -1449,7 +1521,7 @@ local block_state deflate_fast(s, flush) deflate_state *s; int flush; { - IPos hash_head = NIL; /* head of the hash chain */ + IPos hash_head; /* head of the hash chain */ int bflush; /* set if current block must be flushed */ for (;;) { @@ -1469,6 +1541,7 @@ local block_state deflate_fast(s, flush) /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ + hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } @@ -1481,19 +1554,8 @@ local block_state deflate_fast(s, flush) * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ -#ifdef FASTEST - if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) || - (s->strategy == Z_RLE && s->strstart - hash_head == 1)) { - s->match_length = longest_match_fast (s, hash_head); - } -#else - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } -#endif - /* longest_match() or longest_match_fast() sets match_start */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ } if (s->match_length >= MIN_MATCH) { check_match(s, s->strstart, s->match_start, s->match_length); @@ -1555,7 +1617,7 @@ local block_state deflate_slow(s, flush) deflate_state *s; int flush; { - IPos hash_head = NIL; /* head of hash chain */ + IPos hash_head; /* head of hash chain */ int bflush; /* set if current block must be flushed */ /* Process the input block. */ @@ -1576,6 +1638,7 @@ local block_state deflate_slow(s, flush) /* Insert the string window[strstart .. strstart+2] in the * dictionary, and set hash_head to the head of the hash chain: */ + hash_head = NIL; if (s->lookahead >= MIN_MATCH) { INSERT_STRING(s, s->strstart, hash_head); } @@ -1591,12 +1654,8 @@ local block_state deflate_slow(s, flush) * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). */ - if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) { - s->match_length = longest_match (s, hash_head); - } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) { - s->match_length = longest_match_fast (s, hash_head); - } - /* longest_match() or longest_match_fast() sets match_start */ + s->match_length = longest_match (s, hash_head); + /* longest_match() sets match_start */ if (s->match_length <= 5 && (s->strategy == Z_FILTERED #if TOO_FAR <= 32767 @@ -1674,7 +1733,6 @@ local block_state deflate_slow(s, flush) } #endif /* FASTEST */ -#if 0 /* =========================================================================== * For Z_RLE, simply look for runs of bytes, generate matches only of distance * one. Do not maintain a hash table. (It will be regenerated if this run of @@ -1684,11 +1742,9 @@ local block_state deflate_rle(s, flush) deflate_state *s; int flush; { - int bflush; /* set if current block must be flushed */ - uInt run; /* length of run */ - uInt max; /* maximum length of run */ - uInt prev; /* byte at distance one to match */ - Bytef *scan; /* scan for end of run */ + int bflush; /* set if current block must be flushed */ + uInt prev; /* byte at distance one to match */ + Bytef *scan, *strend; /* scan goes up to strend for length of run */ for (;;) { /* Make sure that we always have enough lookahead, except @@ -1704,23 +1760,33 @@ local block_state deflate_rle(s, flush) } /* See how many times the previous byte repeats */ - run = 0; - if (s->strstart > 0) { /* if there is a previous byte, that is */ - max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH; + s->match_length = 0; + if (s->lookahead >= MIN_MATCH && s->strstart > 0) { scan = s->window + s->strstart - 1; - prev = *scan++; - do { - if (*scan++ != prev) - break; - } while (++run < max); + prev = *scan; + if (prev == *++scan && prev == *++scan && prev == *++scan) { + strend = s->window + s->strstart + MAX_MATCH; + do { + } while (prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + prev == *++scan && prev == *++scan && + scan < strend); + s->match_length = MAX_MATCH - (int)(strend - scan); + if (s->match_length > s->lookahead) + s->match_length = s->lookahead; + } } /* Emit match if have run of MIN_MATCH or longer, else emit literal */ - if (run >= MIN_MATCH) { - check_match(s, s->strstart, s->strstart - 1, run); - _tr_tally_dist(s, 1, run - MIN_MATCH, bflush); - s->lookahead -= run; - s->strstart += run; + if (s->match_length >= MIN_MATCH) { + check_match(s, s->strstart, s->strstart - 1, s->match_length); + + _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush); + + s->lookahead -= s->match_length; + s->strstart += s->match_length; + s->match_length = 0; } else { /* No match, output a literal byte */ Tracevv((stderr,"%c", s->window[s->strstart])); @@ -1733,4 +1799,36 @@ local block_state deflate_rle(s, flush) FLUSH_BLOCK(s, flush == Z_FINISH); return flush == Z_FINISH ? finish_done : block_done; } -#endif + +/* =========================================================================== + * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table. + * (It will be regenerated if this run of deflate switches away from Huffman.) + */ +local block_state deflate_huff(s, flush) + deflate_state *s; + int flush; +{ + int bflush; /* set if current block must be flushed */ + + for (;;) { + /* Make sure that we have a literal to write. */ + if (s->lookahead == 0) { + fill_window(s); + if (s->lookahead == 0) { + if (flush == Z_NO_FLUSH) + return need_more; + break; /* flush the current block */ + } + } + + /* Output a literal byte */ + s->match_length = 0; + Tracevv((stderr,"%c", s->window[s->strstart])); + _tr_tally_lit (s, s->window[s->strstart], bflush); + s->lookahead--; + s->strstart++; + if (bflush) FLUSH_BLOCK(s, 0); + } + FLUSH_BLOCK(s, flush == Z_FINISH); + return flush == Z_FINISH ? finish_done : block_done; +} diff --git a/lib/3rdparty/zlib/deflate.h b/lib/3rdparty/zlib/deflate.h index 05a5ab3a2c1..e970d73baad 100644 --- a/lib/3rdparty/zlib/deflate.h +++ b/lib/3rdparty/zlib/deflate.h @@ -1,5 +1,5 @@ /* deflate.h -- internal compression state - * Copyright (C) 1995-2004 Jean-loup Gailly + * Copyright (C) 1995-2010 Jean-loup Gailly * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -260,6 +260,13 @@ typedef struct internal_state { * are always zero. */ + ulg high_water; + /* High water mark offset in window for initialized bytes -- bytes above + * this are set to zero in order to avoid memory check warnings when + * longest match routines access bytes past the input. This is then + * updated to the new high water mark. + */ + } FAR deflate_state; /* Output a byte on the stream. @@ -278,14 +285,18 @@ typedef struct internal_state { * distances are limited to MAX_DIST instead of WSIZE. */ +#define WIN_INIT MAX_MATCH +/* Number of bytes after end of data in window to initialize in order to avoid + memory checker errors from longest match routines */ + /* in trees.c */ -void _tr_init OF((deflate_state *s)); -int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); -void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); -void _tr_align OF((deflate_state *s)); -void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len, - int eof)); +void _tr_init OF((deflate_state *s)); +int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc)); +void _tr_flush_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); +void _tr_align OF((deflate_state *s)); +void _tr_stored_block OF((deflate_state *s, charf *buf, + ulg stored_len, int last)); #define d_code(dist) \ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)]) diff --git a/lib/3rdparty/zlib/example.c b/lib/3rdparty/zlib/example.c index 6c8a0ee7633..604736f15f6 100644 --- a/lib/3rdparty/zlib/example.c +++ b/lib/3rdparty/zlib/example.c @@ -1,12 +1,12 @@ /* example.c -- usage example of the zlib compression library - * Copyright (C) 1995-2004 Jean-loup Gailly. + * Copyright (C) 1995-2006 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ /* @(#) $Id$ */ -#include #include "zlib.h" +#include #ifdef STDC # include diff --git a/lib/3rdparty/zlib/gzio.c b/lib/3rdparty/zlib/gzio.c deleted file mode 100644 index 7e90f4928fc..00000000000 --- a/lib/3rdparty/zlib/gzio.c +++ /dev/null @@ -1,1026 +0,0 @@ -/* gzio.c -- IO on .gz files - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - * - * Compile this file with -DNO_GZCOMPRESS to avoid the compression code. - */ - -/* @(#) $Id$ */ - -#include - -#include "zutil.h" - -#ifdef NO_DEFLATE /* for compatibility with old definition */ -# define NO_GZCOMPRESS -#endif - -#ifndef NO_DUMMY_DECL -struct internal_state {int dummy;}; /* for buggy compilers */ -#endif - -#ifndef Z_BUFSIZE -# ifdef MAXSEG_64K -# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */ -# else -# define Z_BUFSIZE 16384 -# endif -#endif -#ifndef Z_PRINTF_BUFSIZE -# define Z_PRINTF_BUFSIZE 4096 -#endif - -#ifdef __MVS__ -# pragma map (fdopen , "\174\174FDOPEN") - FILE *fdopen(int, const char *); -#endif - -#ifndef STDC -extern voidp malloc OF((uInt size)); -extern void free OF((voidpf ptr)); -#endif - -#define ALLOC(size) malloc(size) -#define TRYFREE(p) {if (p) free(p);} - -static int const gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */ - -/* gzip flag byte */ -#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */ -#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */ -#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */ -#define ORIG_NAME 0x08 /* bit 3 set: original file name present */ -#define COMMENT 0x10 /* bit 4 set: file comment present */ -#define RESERVED 0xE0 /* bits 5..7: reserved */ - -typedef struct gz_stream { - z_stream stream; - int z_err; /* error code for last stream operation */ - int z_eof; /* set if end of input file */ - FILE *file; /* .gz file */ - Byte *inbuf; /* input buffer */ - Byte *outbuf; /* output buffer */ - uLong crc; /* crc32 of uncompressed data */ - char *msg; /* error message */ - char *path; /* path name for debugging only */ - int transparent; /* 1 if input file is not a .gz file */ - char mode; /* 'w' or 'r' */ - z_off_t start; /* start of compressed data in file (header skipped) */ - z_off_t in; /* bytes into deflate or inflate */ - z_off_t out; /* bytes out of deflate or inflate */ - int back; /* one character push-back */ - int last; /* true if push-back is last character */ -} gz_stream; - - -local gzFile gz_open OF((const char *path, const char *mode, int fd)); -local int do_flush OF((gzFile file, int flush)); -local int get_byte OF((gz_stream *s)); -local void check_header OF((gz_stream *s)); -local int destroy OF((gz_stream *s)); -local void putLong OF((FILE *file, uLong x)); -local uLong getLong OF((gz_stream *s)); - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb"). The file is given either by file descriptor - or path name (if fd == -1). - gz_open returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). -*/ -local gzFile gz_open (path, mode, fd) - const char *path; - const char *mode; - int fd; -{ - int err; - int level = Z_DEFAULT_COMPRESSION; /* compression level */ - int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */ - char *p = (char*)mode; - gz_stream *s; - char fmode[80]; /* copy of mode, without the compression level */ - char *m = fmode; - - if (!path || !mode) return Z_NULL; - - s = (gz_stream *)ALLOC(sizeof(gz_stream)); - if (!s) return Z_NULL; - - s->stream.zalloc = (alloc_func)0; - s->stream.zfree = (free_func)0; - s->stream.opaque = (voidpf)0; - s->stream.next_in = s->inbuf = Z_NULL; - s->stream.next_out = s->outbuf = Z_NULL; - s->stream.avail_in = s->stream.avail_out = 0; - s->file = NULL; - s->z_err = Z_OK; - s->z_eof = 0; - s->in = 0; - s->out = 0; - s->back = EOF; - s->crc = crc32(0L, Z_NULL, 0); - s->msg = NULL; - s->transparent = 0; - - s->path = (char*)ALLOC(strlen(path)+1); - if (s->path == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - strcpy(s->path, path); /* do this early for debugging */ - - s->mode = '\0'; - do { - if (*p == 'r') s->mode = 'r'; - if (*p == 'w' || *p == 'a') s->mode = 'w'; - if (*p >= '0' && *p <= '9') { - level = *p - '0'; - } else if (*p == 'f') { - strategy = Z_FILTERED; - } else if (*p == 'h') { - strategy = Z_HUFFMAN_ONLY; - } else if (*p == 'R') { - strategy = Z_RLE; - } else { - *m++ = *p; /* copy the mode */ - } - } while (*p++ && m != fmode + sizeof(fmode)); - if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateInit2(&(s->stream), level, - Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy); - /* windowBits is passed < 0 to suppress zlib header */ - - s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); -#endif - if (err != Z_OK || s->outbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } else { - s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); - - err = inflateInit2(&(s->stream), -MAX_WBITS); - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are - * present after the compressed stream. - */ - if (err != Z_OK || s->inbuf == Z_NULL) { - return destroy(s), (gzFile)Z_NULL; - } - } - s->stream.avail_out = Z_BUFSIZE; - - errno = 0; - s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode); - - if (s->file == NULL) { - return destroy(s), (gzFile)Z_NULL; - } - if (s->mode == 'w') { - /* Write a very simple .gz header: - */ - fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1], - Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE); - s->start = 10L; - /* We use 10L instead of ftell(s->file) to because ftell causes an - * fflush on some systems. This version of the library doesn't use - * start anyway in write mode, so this initialization is not - * necessary. - */ - } else { - check_header(s); /* skip the .gz header */ - s->start = ftell(s->file) - s->stream.avail_in; - } - - return (gzFile)s; -} - -/* =========================================================================== - Opens a gzip (.gz) file for reading or writing. -*/ -gzFile ZEXPORT gzopen (path, mode) - const char *path; - const char *mode; -{ - return gz_open (path, mode, -1); -} - -/* =========================================================================== - Associate a gzFile with the file descriptor fd. fd is not dup'ed here - to mimic the behavio(u)r of fdopen. -*/ -gzFile ZEXPORT gzdopen (fd, mode) - int fd; - const char *mode; -{ - char name[46]; /* allow for up to 128-bit integers */ - - if (fd < 0) return (gzFile)Z_NULL; - sprintf(name, "", fd); /* for debugging */ - - return gz_open (name, mode, fd); -} - -/* =========================================================================== - * Update the compression level and strategy - */ -int ZEXPORT gzsetparams (file, level, strategy) - gzFile file; - int level; - int strategy; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - /* Make room to allow flushing */ - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - } - s->stream.avail_out = Z_BUFSIZE; - } - - return deflateParams (&(s->stream), level, strategy); -} - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ -local int get_byte(s) - gz_stream *s; -{ - if (s->z_eof) return EOF; - if (s->stream.avail_in == 0) { - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) s->z_err = Z_ERRNO; - return EOF; - } - s->stream.next_in = s->inbuf; - } - s->stream.avail_in--; - return *(s->stream.next_in)++; -} - -/* =========================================================================== - Check the gzip header of a gz_stream opened for reading. Set the stream - mode to transparent if the gzip magic header is not present; set s->err - to Z_DATA_ERROR if the magic header is present but the rest of the header - is incorrect. - IN assertion: the stream s has already been created sucessfully; - s->stream.avail_in is zero for the first time, but may be non-zero - for concatenated .gz files. -*/ -local void check_header(s) - gz_stream *s; -{ - int method; /* method byte */ - int flags; /* flags byte */ - uInt len; - int c; - - /* Assure two bytes in the buffer so we can peek ahead -- handle case - where first byte of header is at the end of the buffer after the last - gzip segment */ - len = s->stream.avail_in; - if (len < 2) { - if (len) s->inbuf[0] = s->stream.next_in[0]; - errno = 0; - len = (uInt)fread(s->inbuf + len, 1, Z_BUFSIZE >> len, s->file); - if (len == 0 && ferror(s->file)) s->z_err = Z_ERRNO; - s->stream.avail_in += len; - s->stream.next_in = s->inbuf; - if (s->stream.avail_in < 2) { - s->transparent = s->stream.avail_in; - return; - } - } - - /* Peek ahead to check the gzip magic header */ - if (s->stream.next_in[0] != gz_magic[0] || - s->stream.next_in[1] != gz_magic[1]) { - s->transparent = 1; - return; - } - s->stream.avail_in -= 2; - s->stream.next_in += 2; - - /* Check the rest of the gzip header */ - method = get_byte(s); - flags = get_byte(s); - if (method != Z_DEFLATED || (flags & RESERVED) != 0) { - s->z_err = Z_DATA_ERROR; - return; - } - - /* Discard time, xflags and OS code: */ - for (len = 0; len < 6; len++) (void)get_byte(s); - - if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */ - len = (uInt)get_byte(s); - len += ((uInt)get_byte(s))<<8; - /* len is garbage if EOF but the loop below will quit anyway */ - while (len-- != 0 && get_byte(s) != EOF) ; - } - if ((flags & ORIG_NAME) != 0) { /* skip the original file name */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & COMMENT) != 0) { /* skip the .gz file comment */ - while ((c = get_byte(s)) != 0 && c != EOF) ; - } - if ((flags & HEAD_CRC) != 0) { /* skip the header crc */ - for (len = 0; len < 2; len++) (void)get_byte(s); - } - s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK; -} - - /* =========================================================================== - * Cleanup then free the given gz_stream. Return a zlib error code. - Try freeing in the reverse order of allocations. - */ -local int destroy (s) - gz_stream *s; -{ - int err = Z_OK; - - if (!s) return Z_STREAM_ERROR; - - TRYFREE(s->msg); - - if (s->stream.state != NULL) { - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - err = Z_STREAM_ERROR; -#else - err = deflateEnd(&(s->stream)); -#endif - } else if (s->mode == 'r') { - err = inflateEnd(&(s->stream)); - } - } - if (s->file != NULL && fclose(s->file)) { -#ifdef ESPIPE - if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */ -#endif - err = Z_ERRNO; - } - if (s->z_err < 0) err = s->z_err; - - TRYFREE(s->inbuf); - TRYFREE(s->outbuf); - TRYFREE(s->path); - TRYFREE(s); - return err; -} - -/* =========================================================================== - Reads the given number of uncompressed bytes from the compressed file. - gzread returns the number of bytes actually read (0 for end of file). -*/ -int ZEXPORT gzread (file, buf, len) - gzFile file; - voidp buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - Bytef *start = (Bytef*)buf; /* starting point for crc computation */ - Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */ - - if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR; - - if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1; - if (s->z_err == Z_STREAM_END) return 0; /* EOF */ - - next_out = (Byte*)buf; - s->stream.next_out = (Bytef*)buf; - s->stream.avail_out = len; - - if (s->stream.avail_out && s->back != EOF) { - *next_out++ = s->back; - s->stream.next_out++; - s->stream.avail_out--; - s->back = EOF; - s->out++; - start++; - if (s->last) { - s->z_err = Z_STREAM_END; - return 1; - } - } - - while (s->stream.avail_out != 0) { - - if (s->transparent) { - /* Copy first the lookahead bytes: */ - uInt n = s->stream.avail_in; - if (n > s->stream.avail_out) n = s->stream.avail_out; - if (n > 0) { - zmemcpy(s->stream.next_out, s->stream.next_in, n); - next_out += n; - s->stream.next_out = next_out; - s->stream.next_in += n; - s->stream.avail_out -= n; - s->stream.avail_in -= n; - } - if (s->stream.avail_out > 0) { - s->stream.avail_out -= - (uInt)fread(next_out, 1, s->stream.avail_out, s->file); - } - len -= s->stream.avail_out; - s->in += len; - s->out += len; - if (len == 0) s->z_eof = 1; - return (int)len; - } - if (s->stream.avail_in == 0 && !s->z_eof) { - - errno = 0; - s->stream.avail_in = (uInt)fread(s->inbuf, 1, Z_BUFSIZE, s->file); - if (s->stream.avail_in == 0) { - s->z_eof = 1; - if (ferror(s->file)) { - s->z_err = Z_ERRNO; - break; - } - } - s->stream.next_in = s->inbuf; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = inflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - - if (s->z_err == Z_STREAM_END) { - /* Check CRC and original size */ - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - start = s->stream.next_out; - - if (getLong(s) != s->crc) { - s->z_err = Z_DATA_ERROR; - } else { - (void)getLong(s); - /* The uncompressed length returned by above getlong() may be - * different from s->out in case of concatenated .gz files. - * Check for such files: - */ - check_header(s); - if (s->z_err == Z_OK) { - inflateReset(&(s->stream)); - s->crc = crc32(0L, Z_NULL, 0); - } - } - } - if (s->z_err != Z_OK || s->z_eof) break; - } - s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start)); - - if (len == s->stream.avail_out && - (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO)) - return -1; - return (int)(len - s->stream.avail_out); -} - - -/* =========================================================================== - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. -*/ -int ZEXPORT gzgetc(file) - gzFile file; -{ - unsigned char c; - - return gzread(file, &c, 1) == 1 ? c : -1; -} - - -/* =========================================================================== - Push one byte back onto the stream. -*/ -int ZEXPORT gzungetc(c, file) - int c; - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r' || c == EOF || s->back != EOF) return EOF; - s->back = c; - s->out--; - s->last = (s->z_err == Z_STREAM_END); - if (s->last) s->z_err = Z_OK; - s->z_eof = 0; - return c; -} - - -/* =========================================================================== - Reads bytes from the compressed file until len-1 characters are - read, or a newline character is read and transferred to buf, or an - end-of-file condition is encountered. The string is then terminated - with a null character. - gzgets returns buf, or Z_NULL in case of error. - - The current implementation is not optimized at all. -*/ -char * ZEXPORT gzgets(file, buf, len) - gzFile file; - char *buf; - int len; -{ - char *b = buf; - if (buf == Z_NULL || len <= 0) return Z_NULL; - - while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ; - *buf = '\0'; - return b == buf && len > 0 ? Z_NULL : b; -} - - -#ifndef NO_GZCOMPRESS -/* =========================================================================== - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of bytes actually written (0 in case of error). -*/ -int ZEXPORT gzwrite (file, buf, len) - gzFile file; - voidpc buf; - unsigned len; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.next_in = (Bytef*)buf; - s->stream.avail_in = len; - - while (s->stream.avail_in != 0) { - - if (s->stream.avail_out == 0) { - - s->stream.next_out = s->outbuf; - if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) { - s->z_err = Z_ERRNO; - break; - } - s->stream.avail_out = Z_BUFSIZE; - } - s->in += s->stream.avail_in; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), Z_NO_FLUSH); - s->in -= s->stream.avail_in; - s->out -= s->stream.avail_out; - if (s->z_err != Z_OK) break; - } - s->crc = crc32(s->crc, (const Bytef *)buf, len); - - return (int)(len - s->stream.avail_in); -} - - -/* =========================================================================== - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). -*/ -#ifdef STDC -#include - -int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...) -{ - char buf[Z_PRINTF_BUFSIZE]; - va_list va; - int len; - - buf[sizeof(buf) - 1] = 0; - va_start(va, format); -#ifdef NO_vsnprintf -# ifdef HAS_vsprintf_void - (void)vsprintf(buf, format, va); - va_end(va); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = vsprintf(buf, format, va); - va_end(va); -# endif -#else -# ifdef HAS_vsnprintf_void - (void)vsnprintf(buf, sizeof(buf), format, va); - va_end(va); - len = strlen(buf); -# else - len = vsnprintf(buf, sizeof(buf), format, va); - va_end(va); -# endif -#endif - if (len <= 0 || len >= (int)sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, (unsigned)len); -} -#else /* not ANSI C */ - -int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) - gzFile file; - const char *format; - int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, - a11, a12, a13, a14, a15, a16, a17, a18, a19, a20; -{ - char buf[Z_PRINTF_BUFSIZE]; - int len; - - buf[sizeof(buf) - 1] = 0; -#ifdef NO_snprintf -# ifdef HAS_sprintf_void - sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - for (len = 0; len < sizeof(buf); len++) - if (buf[len] == 0) break; -# else - len = sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#else -# ifdef HAS_snprintf_void - snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); - len = strlen(buf); -# else - len = snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8, - a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20); -# endif -#endif - if (len <= 0 || len >= sizeof(buf) || buf[sizeof(buf) - 1] != 0) - return 0; - return gzwrite(file, buf, len); -} -#endif - -/* =========================================================================== - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. -*/ -int ZEXPORT gzputc(file, c) - gzFile file; - int c; -{ - unsigned char cc = (unsigned char) c; /* required for big endian systems */ - - return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1; -} - - -/* =========================================================================== - Writes the given null-terminated string to the compressed file, excluding - the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. -*/ -int ZEXPORT gzputs(file, s) - gzFile file; - const char *s; -{ - return gzwrite(file, (char*)s, (unsigned)strlen(s)); -} - - -/* =========================================================================== - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. -*/ -local int do_flush (file, flush) - gzFile file; - int flush; -{ - uInt len; - int done = 0; - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR; - - s->stream.avail_in = 0; /* should be zero already anyway */ - - for (;;) { - len = Z_BUFSIZE - s->stream.avail_out; - - if (len != 0) { - if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) { - s->z_err = Z_ERRNO; - return Z_ERRNO; - } - s->stream.next_out = s->outbuf; - s->stream.avail_out = Z_BUFSIZE; - } - if (done) break; - s->out += s->stream.avail_out; - s->z_err = deflate(&(s->stream), flush); - s->out -= s->stream.avail_out; - - /* Ignore the second of two consecutive flushes: */ - if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK; - - /* deflate has finished flushing only when it hasn't used up - * all the available space in the output buffer: - */ - done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END); - - if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break; - } - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} - -int ZEXPORT gzflush (file, flush) - gzFile file; - int flush; -{ - gz_stream *s = (gz_stream*)file; - int err = do_flush (file, flush); - - if (err) return err; - fflush(s->file); - return s->z_err == Z_STREAM_END ? Z_OK : s->z_err; -} -#endif /* NO_GZCOMPRESS */ - -/* =========================================================================== - Sets the starting position for the next gzread or gzwrite on the given - compressed file. The offset represents a number of bytes in the - gzseek returns the resulting offset location as measured in bytes from - the beginning of the uncompressed stream, or -1 in case of error. - SEEK_END is not implemented, returns error. - In this version of the library, gzseek can be extremely slow. -*/ -z_off_t ZEXPORT gzseek (file, offset, whence) - gzFile file; - z_off_t offset; - int whence; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || whence == SEEK_END || - s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) { - return -1L; - } - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return -1L; -#else - if (whence == SEEK_SET) { - offset -= s->in; - } - if (offset < 0) return -1L; - - /* At this point, offset is the number of zero bytes to write. */ - if (s->inbuf == Z_NULL) { - s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */ - if (s->inbuf == Z_NULL) return -1L; - zmemzero(s->inbuf, Z_BUFSIZE); - } - while (offset > 0) { - uInt size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (uInt)offset; - - size = gzwrite(file, s->inbuf, size); - if (size == 0) return -1L; - - offset -= size; - } - return s->in; -#endif - } - /* Rest of function is for reading only */ - - /* compute absolute position */ - if (whence == SEEK_CUR) { - offset += s->out; - } - if (offset < 0) return -1L; - - if (s->transparent) { - /* map to fseek */ - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - if (fseek(s->file, offset, SEEK_SET) < 0) return -1L; - - s->in = s->out = offset; - return offset; - } - - /* For a negative seek, rewind and use positive seek */ - if (offset >= s->out) { - offset -= s->out; - } else if (gzrewind(file) < 0) { - return -1L; - } - /* offset is now the number of bytes to skip. */ - - if (offset != 0 && s->outbuf == Z_NULL) { - s->outbuf = (Byte*)ALLOC(Z_BUFSIZE); - if (s->outbuf == Z_NULL) return -1L; - } - if (offset && s->back != EOF) { - s->back = EOF; - s->out++; - offset--; - if (s->last) s->z_err = Z_STREAM_END; - } - while (offset > 0) { - int size = Z_BUFSIZE; - if (offset < Z_BUFSIZE) size = (int)offset; - - size = gzread(file, s->outbuf, (uInt)size); - if (size <= 0) return -1L; - offset -= size; - } - return s->out; -} - -/* =========================================================================== - Rewinds input file. -*/ -int ZEXPORT gzrewind (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return -1; - - s->z_err = Z_OK; - s->z_eof = 0; - s->back = EOF; - s->stream.avail_in = 0; - s->stream.next_in = s->inbuf; - s->crc = crc32(0L, Z_NULL, 0); - if (!s->transparent) (void)inflateReset(&s->stream); - s->in = 0; - s->out = 0; - return fseek(s->file, s->start, SEEK_SET); -} - -/* =========================================================================== - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. -*/ -z_off_t ZEXPORT gztell (file) - gzFile file; -{ - return gzseek(file, 0L, SEEK_CUR); -} - -/* =========================================================================== - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. -*/ -int ZEXPORT gzeof (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - /* With concatenated compressed files that can have embedded - * crc trailers, z_eof is no longer the only/best indicator of EOF - * on a gz_stream. Handle end-of-stream error explicitly here. - */ - if (s == NULL || s->mode != 'r') return 0; - if (s->z_eof) return 1; - return s->z_err == Z_STREAM_END; -} - -/* =========================================================================== - Returns 1 if reading and doing so transparently, otherwise zero. -*/ -int ZEXPORT gzdirect (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL || s->mode != 'r') return 0; - return s->transparent; -} - -/* =========================================================================== - Outputs a long in LSB order to the given file -*/ -local void putLong (file, x) - FILE *file; - uLong x; -{ - int n; - for (n = 0; n < 4; n++) { - fputc((int)(x & 0xff), file); - x >>= 8; - } -} - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets z_err in case - of error. -*/ -local uLong getLong (s) - gz_stream *s; -{ - uLong x = (uLong)get_byte(s); - int c; - - x += ((uLong)get_byte(s))<<8; - x += ((uLong)get_byte(s))<<16; - c = get_byte(s); - if (c == EOF) s->z_err = Z_DATA_ERROR; - x += ((uLong)c)<<24; - return x; -} - -/* =========================================================================== - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. -*/ -int ZEXPORT gzclose (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return Z_STREAM_ERROR; - - if (s->mode == 'w') { -#ifdef NO_GZCOMPRESS - return Z_STREAM_ERROR; -#else - if (do_flush (file, Z_FINISH) != Z_OK) - return destroy((gz_stream*)file); - - putLong (s->file, s->crc); - putLong (s->file, (uLong)(s->in & 0xffffffff)); -#endif - } - return destroy((gz_stream*)file); -} - -#ifdef STDC -# define zstrerror(errnum) strerror(errnum) -#else -# define zstrerror(errnum) "" -#endif - -/* =========================================================================== - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. -*/ -const char * ZEXPORT gzerror (file, errnum) - gzFile file; - int *errnum; -{ - char *m; - gz_stream *s = (gz_stream*)file; - - if (s == NULL) { - *errnum = Z_STREAM_ERROR; - return (const char*)ERR_MSG(Z_STREAM_ERROR); - } - *errnum = s->z_err; - if (*errnum == Z_OK) return (const char*)""; - - m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg); - - if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err); - - TRYFREE(s->msg); - s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3); - if (s->msg == Z_NULL) return (const char*)ERR_MSG(Z_MEM_ERROR); - strcpy(s->msg, s->path); - strcat(s->msg, ": "); - strcat(s->msg, m); - return (const char*)s->msg; -} - -/* =========================================================================== - Clear the error and end-of-file flags, and do the same for the real file. -*/ -void ZEXPORT gzclearerr (file) - gzFile file; -{ - gz_stream *s = (gz_stream*)file; - - if (s == NULL) return; - if (s->z_err != Z_STREAM_END) s->z_err = Z_OK; - s->z_eof = 0; - clearerr(s->file); -} diff --git a/lib/3rdparty/zlib/infback.c b/lib/3rdparty/zlib/infback.c index 455dbc9ee84..af3a8c965d5 100644 --- a/lib/3rdparty/zlib/infback.c +++ b/lib/3rdparty/zlib/infback.c @@ -1,5 +1,5 @@ /* infback.c -- inflate using a call-back interface - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -55,7 +55,7 @@ int stream_size; state->wbits = windowBits; state->wsize = 1U << windowBits; state->window = window; - state->write = 0; + state->wnext = 0; state->whave = 0; return Z_OK; } @@ -253,7 +253,7 @@ void FAR *out_desc; unsigned bits; /* bits in bit buffer */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ + code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ @@ -389,19 +389,19 @@ void FAR *out_desc; state->have = 0; while (state->have < state->nlen + state->ndist) { for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; } else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; @@ -411,16 +411,16 @@ void FAR *out_desc; copy = 3 + BITS(2); DROPBITS(2); } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); @@ -438,7 +438,16 @@ void FAR *out_desc; /* handle error breaks in while */ if (state->mode == BAD) break; - /* build code tables */ + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; @@ -474,28 +483,28 @@ void FAR *out_desc; /* get a literal, length, or end-of-block code */ for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.op && (this.op & 0xf0) == 0) { - last = this; + if (here.op && (here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->lencode[last.val + + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } - DROPBITS(this.bits); - state->length = (unsigned)this.val; + DROPBITS(here.bits); + state->length = (unsigned)here.val; /* process literal */ - if (this.op == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + if (here.op == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); + "inflate: literal 0x%02x\n", here.val)); ROOM(); *put++ = (unsigned char)(state->length); left--; @@ -504,21 +513,21 @@ void FAR *out_desc; } /* process end of block */ - if (this.op & 32) { + if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); state->mode = TYPE; break; } /* invalid code */ - if (this.op & 64) { + if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } /* length code -- get extra bits, if any */ - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->length += BITS(state->extra); @@ -528,30 +537,30 @@ void FAR *out_desc; /* get distance code */ for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if ((this.op & 0xf0) == 0) { - last = this; + if ((here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->distcode[last.val + + here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); } - DROPBITS(this.bits); - if (this.op & 64) { + DROPBITS(here.bits); + if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } - state->offset = (unsigned)this.val; + state->offset = (unsigned)here.val; /* get distance extra bits, if any */ - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; if (state->extra != 0) { NEEDBITS(state->extra); state->offset += BITS(state->extra); diff --git a/lib/3rdparty/zlib/inffast.c b/lib/3rdparty/zlib/inffast.c index bbee92ed1e6..a9e584fbd25 100644 --- a/lib/3rdparty/zlib/inffast.c +++ b/lib/3rdparty/zlib/inffast.c @@ -1,5 +1,5 @@ /* inffast.c -- fast decoding - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2008, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -79,7 +79,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #endif unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ + unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */ unsigned long hold; /* local strm->hold */ unsigned bits; /* local strm->bits */ @@ -87,7 +87,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ code const FAR *dcode; /* local strm->distcode */ unsigned lmask; /* mask for first level of length codes */ unsigned dmask; /* mask for first level of distance codes */ - code this; /* retrieved table entry */ + code here; /* retrieved table entry */ unsigned op; /* code bits, operation, extra bits, or */ /* window position, window bytes to copy */ unsigned len; /* match length, unused bytes */ @@ -106,7 +106,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ #endif wsize = state->wsize; whave = state->whave; - write = state->write; + wnext = state->wnext; window = state->window; hold = state->hold; bits = state->bits; @@ -124,20 +124,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(PUP(in)) << bits; bits += 8; } - this = lcode[hold & lmask]; + here = lcode[hold & lmask]; dolen: - op = (unsigned)(this.bits); + op = (unsigned)(here.bits); hold >>= op; bits -= op; - op = (unsigned)(this.op); + op = (unsigned)(here.op); if (op == 0) { /* literal */ - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); - PUP(out) = (unsigned char)(this.val); + "inflate: literal 0x%02x\n", here.val)); + PUP(out) = (unsigned char)(here.val); } else if (op & 16) { /* length base */ - len = (unsigned)(this.val); + len = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (op) { if (bits < op) { @@ -155,14 +155,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ hold += (unsigned long)(PUP(in)) << bits; bits += 8; } - this = dcode[hold & dmask]; + here = dcode[hold & dmask]; dodist: - op = (unsigned)(this.bits); + op = (unsigned)(here.bits); hold >>= op; bits -= op; - op = (unsigned)(this.op); + op = (unsigned)(here.op); if (op & 16) { /* distance base */ - dist = (unsigned)(this.val); + dist = (unsigned)(here.val); op &= 15; /* number of extra bits */ if (bits < op) { hold += (unsigned long)(PUP(in)) << bits; @@ -187,12 +187,34 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ if (dist > op) { /* see if copy from window */ op = dist - op; /* distance back in window */ if (op > whave) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; + if (state->sane) { + strm->msg = + (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + if (len <= op - whave) { + do { + PUP(out) = 0; + } while (--len); + continue; + } + len -= op - whave; + do { + PUP(out) = 0; + } while (--op > whave); + if (op == 0) { + from = out - dist; + do { + PUP(out) = PUP(from); + } while (--len); + continue; + } +#endif } from = window - OFF; - if (write == 0) { /* very common case */ + if (wnext == 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; @@ -202,17 +224,17 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ from = out - dist; /* rest from output */ } } - else if (write < op) { /* wrap around window */ - from += wsize + write - op; - op -= write; + else if (wnext < op) { /* wrap around window */ + from += wsize + wnext - op; + op -= wnext; if (op < len) { /* some from end of window */ len -= op; do { PUP(out) = PUP(from); } while (--op); from = window - OFF; - if (write < len) { /* some from start of window */ - op = write; + if (wnext < len) { /* some from start of window */ + op = wnext; len -= op; do { PUP(out) = PUP(from); @@ -222,7 +244,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else { /* contiguous in window */ - from += write - op; + from += wnext - op; if (op < len) { /* some from window */ len -= op; do { @@ -259,7 +281,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level distance code */ - this = dcode[this.val + (hold & ((1U << op) - 1))]; + here = dcode[here.val + (hold & ((1U << op) - 1))]; goto dodist; } else { @@ -269,7 +291,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ } } else if ((op & 64) == 0) { /* 2nd level length code */ - this = lcode[this.val + (hold & ((1U << op) - 1))]; + here = lcode[here.val + (hold & ((1U << op) - 1))]; goto dolen; } else if (op & 32) { /* end-of-block */ @@ -305,7 +327,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe): - Using bit fields for code structure - Different op definition to avoid & for extra bits (do & for table bits) - - Three separate decoding do-loops for direct, window, and write == 0 + - Three separate decoding do-loops for direct, window, and wnext == 0 - Special case for distance > 1 copies to do overlapped load and store copy - Explicit branch predictions (based on measured branch probabilities) - Deferring match copy and interspersed it with decoding subsequent codes diff --git a/lib/3rdparty/zlib/inffast.h b/lib/3rdparty/zlib/inffast.h index 1e88d2d97b5..4d5c03abdd5 100644 --- a/lib/3rdparty/zlib/inffast.h +++ b/lib/3rdparty/zlib/inffast.h @@ -1,5 +1,5 @@ /* inffast.h -- header to use inffast.c - * Copyright (C) 1995-2003 Mark Adler + * Copyright (C) 1995-2003, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ diff --git a/lib/3rdparty/zlib/inflate.c b/lib/3rdparty/zlib/inflate.c index 792fdee8e9c..a8431abeacf 100644 --- a/lib/3rdparty/zlib/inflate.c +++ b/lib/3rdparty/zlib/inflate.c @@ -1,5 +1,5 @@ /* inflate.c -- zlib decompression - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -45,7 +45,7 @@ * - Rearrange window copies in inflate_fast() for speed and simplification * - Unroll last copy for window match in inflate_fast() * - Use local copies of window variables in inflate_fast() for speed - * - Pull out common write == 0 case for speed in inflate_fast() + * - Pull out common wnext == 0 case for speed in inflate_fast() * - Make op and len in inflate_fast() unsigned for consistency * - Add FAR to lcode and dcode declarations in inflate_fast() * - Simplified bad distance check in inflate_fast() @@ -117,28 +117,52 @@ z_streamp strm; state->head = Z_NULL; state->wsize = 0; state->whave = 0; - state->write = 0; + state->wnext = 0; state->hold = 0; state->bits = 0; state->lencode = state->distcode = state->next = state->codes; + state->sane = 1; + state->back = -1; Tracev((stderr, "inflate: reset\n")); return Z_OK; } -int ZEXPORT inflatePrime(strm, bits, value) +int ZEXPORT inflateReset2(strm, windowBits) z_streamp strm; -int bits; -int value; +int windowBits; { + int wrap; struct inflate_state FAR *state; + /* get the state */ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; state = (struct inflate_state FAR *)strm->state; - if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; - value &= (1L << bits) - 1; - state->hold += value << state->bits; - state->bits += bits; - return Z_OK; + + /* extract wrap request from windowBits parameter */ + if (windowBits < 0) { + wrap = 0; + windowBits = -windowBits; + } + else { + wrap = (windowBits >> 4) + 1; +#ifdef GUNZIP + if (windowBits < 48) + windowBits &= 15; +#endif + } + + /* set number of window bits, free window if different */ + if (windowBits && (windowBits < 8 || windowBits > 15)) + return Z_STREAM_ERROR; + if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) { + ZFREE(strm, state->window); + state->window = Z_NULL; + } + + /* update state and reset the rest of it */ + state->wrap = wrap; + state->wbits = (unsigned)windowBits; + return inflateReset(strm); } int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size) @@ -147,6 +171,7 @@ int windowBits; const char *version; int stream_size; { + int ret; struct inflate_state FAR *state; if (version == Z_NULL || version[0] != ZLIB_VERSION[0] || @@ -164,24 +189,13 @@ int stream_size; if (state == Z_NULL) return Z_MEM_ERROR; Tracev((stderr, "inflate: allocated\n")); strm->state = (struct internal_state FAR *)state; - if (windowBits < 0) { - state->wrap = 0; - windowBits = -windowBits; - } - else { - state->wrap = (windowBits >> 4) + 1; -#ifdef GUNZIP - if (windowBits < 48) windowBits &= 15; -#endif - } - if (windowBits < 8 || windowBits > 15) { + state->window = Z_NULL; + ret = inflateReset2(strm, windowBits); + if (ret != Z_OK) { ZFREE(strm, state); strm->state = Z_NULL; - return Z_STREAM_ERROR; } - state->wbits = (unsigned)windowBits; - state->window = Z_NULL; - return inflateReset(strm); + return ret; } int ZEXPORT inflateInit_(strm, version, stream_size) @@ -192,6 +206,27 @@ int stream_size; return inflateInit2_(strm, DEF_WBITS, version, stream_size); } +int ZEXPORT inflatePrime(strm, bits, value) +z_streamp strm; +int bits; +int value; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + if (bits < 0) { + state->hold = 0; + state->bits = 0; + return Z_OK; + } + if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR; + value &= (1L << bits) - 1; + state->hold += value << state->bits; + state->bits += bits; + return Z_OK; +} + /* Return state with length and distance decoding tables and index sizes set to fixed code decoding. Normally this returns fixed tables from inffixed.h. @@ -340,7 +375,7 @@ unsigned out; /* if window not in use yet, initialize */ if (state->wsize == 0) { state->wsize = 1U << state->wbits; - state->write = 0; + state->wnext = 0; state->whave = 0; } @@ -348,22 +383,22 @@ unsigned out; copy = out - strm->avail_out; if (copy >= state->wsize) { zmemcpy(state->window, strm->next_out - state->wsize, state->wsize); - state->write = 0; + state->wnext = 0; state->whave = state->wsize; } else { - dist = state->wsize - state->write; + dist = state->wsize - state->wnext; if (dist > copy) dist = copy; - zmemcpy(state->window + state->write, strm->next_out - copy, dist); + zmemcpy(state->window + state->wnext, strm->next_out - copy, dist); copy -= dist; if (copy) { zmemcpy(state->window, strm->next_out - copy, copy); - state->write = copy; + state->wnext = copy; state->whave = state->wsize; } else { - state->write += dist; - if (state->write == state->wsize) state->write = 0; + state->wnext += dist; + if (state->wnext == state->wsize) state->wnext = 0; if (state->whave < state->wsize) state->whave += dist; } } @@ -564,7 +599,7 @@ int flush; unsigned in, out; /* save starting available input and output */ unsigned copy; /* number of stored or match bytes to copy */ unsigned char FAR *from; /* where to copy match bytes from */ - code this; /* current decoding table entry */ + code here; /* current decoding table entry */ code last; /* parent table entry */ unsigned len; /* length to copy for repeats, bits to drop */ int ret; /* return code */ @@ -619,7 +654,9 @@ int flush; } DROPBITS(4); len = BITS(4) + 8; - if (len > state->wbits) { + if (state->wbits == 0) + state->wbits = len; + else if (len > state->wbits) { strm->msg = (char *)"invalid window size"; state->mode = BAD; break; @@ -771,7 +808,7 @@ int flush; strm->adler = state->check = adler32(0L, Z_NULL, 0); state->mode = TYPE; case TYPE: - if (flush == Z_BLOCK) goto inf_leave; + if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave; case TYPEDO: if (state->last) { BYTEBITS(); @@ -791,7 +828,11 @@ int flush; fixedtables(state); Tracev((stderr, "inflate: fixed codes block%s\n", state->last ? " (last)" : "")); - state->mode = LEN; /* decode codes */ + state->mode = LEN_; /* decode codes */ + if (flush == Z_TREES) { + DROPBITS(2); + goto inf_leave; + } break; case 2: /* dynamic block */ Tracev((stderr, "inflate: dynamic codes block%s\n", @@ -816,6 +857,9 @@ int flush; Tracev((stderr, "inflate: stored length %u\n", state->length)); INITBITS(); + state->mode = COPY_; + if (flush == Z_TREES) goto inf_leave; + case COPY_: state->mode = COPY; case COPY: copy = state->length; @@ -876,19 +920,19 @@ int flush; case CODELENS: while (state->have < state->nlen + state->ndist) { for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.val < 16) { - NEEDBITS(this.bits); - DROPBITS(this.bits); - state->lens[state->have++] = this.val; + if (here.val < 16) { + NEEDBITS(here.bits); + DROPBITS(here.bits); + state->lens[state->have++] = here.val; } else { - if (this.val == 16) { - NEEDBITS(this.bits + 2); - DROPBITS(this.bits); + if (here.val == 16) { + NEEDBITS(here.bits + 2); + DROPBITS(here.bits); if (state->have == 0) { strm->msg = (char *)"invalid bit length repeat"; state->mode = BAD; @@ -898,16 +942,16 @@ int flush; copy = 3 + BITS(2); DROPBITS(2); } - else if (this.val == 17) { - NEEDBITS(this.bits + 3); - DROPBITS(this.bits); + else if (here.val == 17) { + NEEDBITS(here.bits + 3); + DROPBITS(here.bits); len = 0; copy = 3 + BITS(3); DROPBITS(3); } else { - NEEDBITS(this.bits + 7); - DROPBITS(this.bits); + NEEDBITS(here.bits + 7); + DROPBITS(here.bits); len = 0; copy = 11 + BITS(7); DROPBITS(7); @@ -925,7 +969,16 @@ int flush; /* handle error breaks in while */ if (state->mode == BAD) break; - /* build code tables */ + /* check for end-of-block code (better have one) */ + if (state->lens[256] == 0) { + strm->msg = (char *)"invalid code -- missing end-of-block"; + state->mode = BAD; + break; + } + + /* build code tables -- note: do not change the lenbits or distbits + values here (9 and 6) without reading the comments in inftrees.h + concerning the ENOUGH constants, which depend on those values */ state->next = state->codes; state->lencode = (code const FAR *)(state->next); state->lenbits = 9; @@ -946,88 +999,102 @@ int flush; break; } Tracev((stderr, "inflate: codes ok\n")); + state->mode = LEN_; + if (flush == Z_TREES) goto inf_leave; + case LEN_: state->mode = LEN; case LEN: if (have >= 6 && left >= 258) { RESTORE(); inflate_fast(strm, out); LOAD(); + if (state->mode == TYPE) + state->back = -1; break; } + state->back = 0; for (;;) { - this = state->lencode[BITS(state->lenbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->lencode[BITS(state->lenbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if (this.op && (this.op & 0xf0) == 0) { - last = this; + if (here.op && (here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->lencode[last.val + + here = state->lencode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); + state->back += last.bits; } - DROPBITS(this.bits); - state->length = (unsigned)this.val; - if ((int)(this.op) == 0) { - Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ? + DROPBITS(here.bits); + state->back += here.bits; + state->length = (unsigned)here.val; + if ((int)(here.op) == 0) { + Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ? "inflate: literal '%c'\n" : - "inflate: literal 0x%02x\n", this.val)); + "inflate: literal 0x%02x\n", here.val)); state->mode = LIT; break; } - if (this.op & 32) { + if (here.op & 32) { Tracevv((stderr, "inflate: end of block\n")); + state->back = -1; state->mode = TYPE; break; } - if (this.op & 64) { + if (here.op & 64) { strm->msg = (char *)"invalid literal/length code"; state->mode = BAD; break; } - state->extra = (unsigned)(this.op) & 15; + state->extra = (unsigned)(here.op) & 15; state->mode = LENEXT; case LENEXT: if (state->extra) { NEEDBITS(state->extra); state->length += BITS(state->extra); DROPBITS(state->extra); + state->back += state->extra; } Tracevv((stderr, "inflate: length %u\n", state->length)); + state->was = state->length; state->mode = DIST; case DIST: for (;;) { - this = state->distcode[BITS(state->distbits)]; - if ((unsigned)(this.bits) <= bits) break; + here = state->distcode[BITS(state->distbits)]; + if ((unsigned)(here.bits) <= bits) break; PULLBYTE(); } - if ((this.op & 0xf0) == 0) { - last = this; + if ((here.op & 0xf0) == 0) { + last = here; for (;;) { - this = state->distcode[last.val + + here = state->distcode[last.val + (BITS(last.bits + last.op) >> last.bits)]; - if ((unsigned)(last.bits + this.bits) <= bits) break; + if ((unsigned)(last.bits + here.bits) <= bits) break; PULLBYTE(); } DROPBITS(last.bits); + state->back += last.bits; } - DROPBITS(this.bits); - if (this.op & 64) { + DROPBITS(here.bits); + state->back += here.bits; + if (here.op & 64) { strm->msg = (char *)"invalid distance code"; state->mode = BAD; break; } - state->offset = (unsigned)this.val; - state->extra = (unsigned)(this.op) & 15; + state->offset = (unsigned)here.val; + state->extra = (unsigned)(here.op) & 15; state->mode = DISTEXT; case DISTEXT: if (state->extra) { NEEDBITS(state->extra); state->offset += BITS(state->extra); DROPBITS(state->extra); + state->back += state->extra; } #ifdef INFLATE_STRICT if (state->offset > state->dmax) { @@ -1036,11 +1103,6 @@ int flush; break; } #endif - if (state->offset > state->whave + out - left) { - strm->msg = (char *)"invalid distance too far back"; - state->mode = BAD; - break; - } Tracevv((stderr, "inflate: distance %u\n", state->offset)); state->mode = MATCH; case MATCH: @@ -1048,12 +1110,32 @@ int flush; copy = out - left; if (state->offset > copy) { /* copy from window */ copy = state->offset - copy; - if (copy > state->write) { - copy -= state->write; + if (copy > state->whave) { + if (state->sane) { + strm->msg = (char *)"invalid distance too far back"; + state->mode = BAD; + break; + } +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + Trace((stderr, "inflate.c too far\n")); + copy -= state->whave; + if (copy > state->length) copy = state->length; + if (copy > left) copy = left; + left -= copy; + state->length -= copy; + do { + *put++ = 0; + } while (--copy); + if (state->length == 0) state->mode = LEN; + break; +#endif + } + if (copy > state->wnext) { + copy -= state->wnext; from = state->window + (state->wsize - copy); } else - from = state->window + (state->write - copy); + from = state->window + (state->wnext - copy); if (copy > state->length) copy = state->length; } else { /* copy from output */ @@ -1146,7 +1228,8 @@ int flush; strm->adler = state->check = UPDATE(state->check, strm->next_out - out, out); strm->data_type = state->bits + (state->last ? 64 : 0) + - (state->mode == TYPE ? 128 : 0); + (state->mode == TYPE ? 128 : 0) + + (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0); if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK) ret = Z_BUF_ERROR; return ret; @@ -1366,3 +1449,32 @@ z_streamp source; dest->state = (struct internal_state FAR *)copy; return Z_OK; } + +int ZEXPORT inflateUndermine(strm, subvert) +z_streamp strm; +int subvert; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR; + state = (struct inflate_state FAR *)strm->state; + state->sane = !subvert; +#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR + return Z_OK; +#else + state->sane = 1; + return Z_DATA_ERROR; +#endif +} + +long ZEXPORT inflateMark(strm) +z_streamp strm; +{ + struct inflate_state FAR *state; + + if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16; + state = (struct inflate_state FAR *)strm->state; + return ((long)(state->back) << 16) + + (state->mode == COPY ? state->length : + (state->mode == MATCH ? state->was - state->length : 0)); +} diff --git a/lib/3rdparty/zlib/inflate.h b/lib/3rdparty/zlib/inflate.h index 07bd3e78a7c..95f4986d400 100644 --- a/lib/3rdparty/zlib/inflate.h +++ b/lib/3rdparty/zlib/inflate.h @@ -1,5 +1,5 @@ /* inflate.h -- internal inflate state definition - * Copyright (C) 1995-2004 Mark Adler + * Copyright (C) 1995-2009 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -32,11 +32,13 @@ typedef enum { TYPE, /* i: waiting for type bits, including last-flag bit */ TYPEDO, /* i: same, but skip check to exit inflate on new block */ STORED, /* i: waiting for stored size (length and complement) */ + COPY_, /* i/o: same as COPY below, but only first time in */ COPY, /* i/o: waiting for input or output to copy stored block */ TABLE, /* i: waiting for dynamic block table lengths */ LENLENS, /* i: waiting for code length code lengths */ CODELENS, /* i: waiting for length/lit and distance code lengths */ - LEN, /* i: waiting for length/lit code */ + LEN_, /* i: same as LEN below, but only first time in */ + LEN, /* i: waiting for length/lit/eob code */ LENEXT, /* i: waiting for length extra bits */ DIST, /* i: waiting for distance code */ DISTEXT, /* i: waiting for distance extra bits */ @@ -53,19 +55,21 @@ typedef enum { /* State transitions between above modes - - (most modes can go to the BAD or MEM mode -- not shown for clarity) + (most modes can go to BAD or MEM on error -- not shown for clarity) Process header: - HEAD -> (gzip) or (zlib) - (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME - NAME -> COMMENT -> HCRC -> TYPE + HEAD -> (gzip) or (zlib) or (raw) + (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT -> + HCRC -> TYPE (zlib) -> DICTID or TYPE DICTID -> DICT -> TYPE + (raw) -> TYPEDO Read deflate blocks: - TYPE -> STORED or TABLE or LEN or CHECK - STORED -> COPY -> TYPE - TABLE -> LENLENS -> CODELENS -> LEN - Read deflate codes: + TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK + STORED -> COPY_ -> COPY -> TYPE + TABLE -> LENLENS -> CODELENS -> LEN_ + LEN_ -> LEN + Read deflate codes in fixed or dynamic block: LEN -> LENEXT or LIT or TYPE LENEXT -> DIST -> DISTEXT -> MATCH -> LEN LIT -> LEN @@ -73,7 +77,7 @@ typedef enum { CHECK -> LENGTH -> DONE */ -/* state maintained between inflate() calls. Approximately 7K bytes. */ +/* state maintained between inflate() calls. Approximately 10K bytes. */ struct inflate_state { inflate_mode mode; /* current inflate mode */ int last; /* true if processing last block */ @@ -88,7 +92,7 @@ struct inflate_state { unsigned wbits; /* log base 2 of requested window size */ unsigned wsize; /* window size or zero if not using window */ unsigned whave; /* valid bytes in the window */ - unsigned write; /* window write index */ + unsigned wnext; /* window write index */ unsigned char FAR *window; /* allocated sliding window, if needed */ /* bit accumulator */ unsigned long hold; /* input bit accumulator */ @@ -112,4 +116,7 @@ struct inflate_state { unsigned short lens[320]; /* temporary storage for code lengths */ unsigned short work[288]; /* work area for code table building */ code codes[ENOUGH]; /* space for code tables */ + int sane; /* if false, allow invalid distance too far */ + int back; /* bits back of last unprocessed length/lit */ + unsigned was; /* initial length of match */ }; diff --git a/lib/3rdparty/zlib/inftrees.c b/lib/3rdparty/zlib/inftrees.c index 8a9c13ff03d..6f7afcb306d 100644 --- a/lib/3rdparty/zlib/inftrees.c +++ b/lib/3rdparty/zlib/inftrees.c @@ -1,5 +1,5 @@ /* inftrees.c -- generate Huffman trees for efficient decoding - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -9,7 +9,7 @@ #define MAXBITS 15 const char inflate_copyright[] = - " inflate 1.2.3 Copyright 1995-2005 Mark Adler "; + " inflate 1.2.5 Copyright 1995-2010 Mark Adler "; /* If you use the zlib library in a product, an acknowledgment is welcome in the documentation of your product. If for some reason you cannot @@ -50,7 +50,7 @@ unsigned short FAR *work; unsigned fill; /* index for replicating entries */ unsigned low; /* low bits for current root entry */ unsigned mask; /* mask for low root bits */ - code this; /* table entry for duplication */ + code here; /* table entry for duplication */ code FAR *next; /* next available space in table */ const unsigned short FAR *base; /* base value table to use */ const unsigned short FAR *extra; /* extra bits table to use */ @@ -62,7 +62,7 @@ unsigned short FAR *work; 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0}; static const unsigned short lext[31] = { /* Length codes 257..285 extra */ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196}; + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 73, 195}; static const unsigned short dbase[32] = { /* Distance codes 0..29 base */ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, @@ -115,15 +115,15 @@ unsigned short FAR *work; if (count[max] != 0) break; if (root > max) root = max; if (max == 0) { /* no symbols to code at all */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)1; - this.val = (unsigned short)0; - *(*table)++ = this; /* make a table to force an error */ - *(*table)++ = this; + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)1; + here.val = (unsigned short)0; + *(*table)++ = here; /* make a table to force an error */ + *(*table)++ = here; *bits = 1; return 0; /* no symbols, but wait for decoding to report error */ } - for (min = 1; min <= MAXBITS; min++) + for (min = 1; min < max; min++) if (count[min] != 0) break; if (root < min) root = min; @@ -166,11 +166,10 @@ unsigned short FAR *work; entered in the tables. used keeps track of how many table entries have been allocated from the - provided *table space. It is checked when a LENS table is being made - against the space in *table, ENOUGH, minus the maximum space needed by - the worst case distance code, MAXD. This should never happen, but the - sufficiency of ENOUGH has not been proven exhaustively, hence the check. - This assumes that when type == LENS, bits == 9. + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. sym increments through all symbols, and the loop terminates when all codes of length max, i.e. all codes, have been processed. This @@ -209,24 +208,25 @@ unsigned short FAR *work; mask = used - 1; /* mask for comparing low */ /* check available table space */ - if (type == LENS && used >= ENOUGH - MAXD) + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* process all codes and make table entries */ for (;;) { /* create table entry */ - this.bits = (unsigned char)(len - drop); + here.bits = (unsigned char)(len - drop); if ((int)(work[sym]) < end) { - this.op = (unsigned char)0; - this.val = work[sym]; + here.op = (unsigned char)0; + here.val = work[sym]; } else if ((int)(work[sym]) > end) { - this.op = (unsigned char)(extra[work[sym]]); - this.val = base[work[sym]]; + here.op = (unsigned char)(extra[work[sym]]); + here.val = base[work[sym]]; } else { - this.op = (unsigned char)(32 + 64); /* end of block */ - this.val = 0; + here.op = (unsigned char)(32 + 64); /* end of block */ + here.val = 0; } /* replicate for those indices with low len bits equal to huff */ @@ -235,7 +235,7 @@ unsigned short FAR *work; min = fill; /* save offset to next table */ do { fill -= incr; - next[(huff >> drop) + fill] = this; + next[(huff >> drop) + fill] = here; } while (fill != 0); /* backwards increment the len-bit code huff */ @@ -277,7 +277,8 @@ unsigned short FAR *work; /* check for enough space */ used += 1U << curr; - if (type == LENS && used >= ENOUGH - MAXD) + if ((type == LENS && used >= ENOUGH_LENS) || + (type == DISTS && used >= ENOUGH_DISTS)) return 1; /* point entry in root table to sub-table */ @@ -295,20 +296,20 @@ unsigned short FAR *work; through high index bits. When the current sub-table is filled, the loop drops back to the root table to fill in any remaining entries there. */ - this.op = (unsigned char)64; /* invalid code marker */ - this.bits = (unsigned char)(len - drop); - this.val = (unsigned short)0; + here.op = (unsigned char)64; /* invalid code marker */ + here.bits = (unsigned char)(len - drop); + here.val = (unsigned short)0; while (huff != 0) { /* when done with sub-table, drop back to root table */ if (drop != 0 && (huff & mask) != low) { drop = 0; len = root; next = *table; - this.bits = (unsigned char)len; + here.bits = (unsigned char)len; } /* put invalid code marker in table */ - next[huff >> drop] = this; + next[huff >> drop] = here; /* backwards increment the len-bit code huff */ incr = 1U << (len - 1); diff --git a/lib/3rdparty/zlib/inftrees.h b/lib/3rdparty/zlib/inftrees.h index b1104c87e76..3098b6513a6 100644 --- a/lib/3rdparty/zlib/inftrees.h +++ b/lib/3rdparty/zlib/inftrees.h @@ -1,5 +1,5 @@ /* inftrees.h -- header to use inftrees.c - * Copyright (C) 1995-2005 Mark Adler + * Copyright (C) 1995-2005, 2010 Mark Adler * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -35,21 +35,28 @@ typedef struct { 01000000 - invalid code */ -/* Maximum size of dynamic tree. The maximum found in a long but non- - exhaustive search was 1444 code structures (852 for length/literals - and 592 for distances, the latter actually the result of an - exhaustive search). The true maximum is not known, but the value - below is more than safe. */ -#define ENOUGH 2048 -#define MAXD 592 +/* Maximum size of the dynamic table. The maximum number of code structures is + 1444, which is the sum of 852 for literal/length codes and 592 for distance + codes. These values were found by exhaustive searches using the program + examples/enough.c found in the zlib distribtution. The arguments to that + program are the number of symbols, the initial root table size, and the + maximum bit length of a code. "enough 286 9 15" for literal/length codes + returns returns 852, and "enough 30 6 15" for distance codes returns 592. + The initial root table size (9 or 6) is found in the fifth argument of the + inflate_table() calls in inflate.c and infback.c. If the root table size is + changed, then these maximum sizes would be need to be recalculated and + updated. */ +#define ENOUGH_LENS 852 +#define ENOUGH_DISTS 592 +#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS) -/* Type of code to build for inftable() */ +/* Type of code to build for inflate_table() */ typedef enum { CODES, LENS, DISTS } codetype; -extern int inflate_table OF((codetype type, unsigned short FAR *lens, +int inflate_table OF((codetype type, unsigned short FAR *lens, unsigned codes, code FAR * FAR *table, unsigned FAR *bits, unsigned short FAR *work)); diff --git a/lib/3rdparty/zlib/minigzip.c b/lib/3rdparty/zlib/minigzip.c index 4524b96a1d6..9825ccc3a71 100644 --- a/lib/3rdparty/zlib/minigzip.c +++ b/lib/3rdparty/zlib/minigzip.c @@ -1,5 +1,5 @@ /* minigzip.c -- simulate gzip using the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2006, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -15,8 +15,8 @@ /* @(#) $Id$ */ -#include #include "zlib.h" +#include #ifdef STDC # include @@ -32,6 +32,9 @@ #if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__) # include # include +# ifdef UNDER_CE +# include +# endif # define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY) #else # define SET_BINARY_MODE(file) @@ -50,9 +53,75 @@ # include /* for fileno */ #endif +#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE) #ifndef WIN32 /* unlink already in stdio.h for WIN32 */ extern int unlink OF((const char *)); #endif +#endif + +#if defined(UNDER_CE) +# include +# define perror(s) pwinerror(s) + +/* Map the Windows error number in ERROR to a locale-dependent error + message string and return a pointer to it. Typically, the values + for ERROR come from GetLastError. + + The string pointed to shall not be modified by the application, + but may be overwritten by a subsequent call to strwinerror + + The strwinerror function does not change the current setting + of GetLastError. */ + +static char *strwinerror (error) + DWORD error; +{ + static char buf[1024]; + + wchar_t *msgbuf; + DWORD lasterr = GetLastError(); + DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM + | FORMAT_MESSAGE_ALLOCATE_BUFFER, + NULL, + error, + 0, /* Default language */ + (LPVOID)&msgbuf, + 0, + NULL); + if (chars != 0) { + /* If there is an \r\n appended, zap it. */ + if (chars >= 2 + && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') { + chars -= 2; + msgbuf[chars] = 0; + } + + if (chars > sizeof (buf) - 1) { + chars = sizeof (buf) - 1; + msgbuf[chars] = 0; + } + + wcstombs(buf, msgbuf, chars + 1); + LocalFree(msgbuf); + } + else { + sprintf(buf, "unknown win32 error (%ld)", error); + } + + SetLastError(lasterr); + return buf; +} + +static void pwinerror (s) + const char *s; +{ + if (s && *s) + fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ())); + else + fprintf(stderr, "%s\n", strwinerror(GetLastError ())); +} + +#endif /* UNDER_CE */ #ifndef GZ_SUFFIX # define GZ_SUFFIX ".gz" @@ -198,6 +267,11 @@ void file_compress(file, mode) FILE *in; gzFile out; + if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } + strcpy(outfile, file); strcat(outfile, GZ_SUFFIX); @@ -227,7 +301,12 @@ void file_uncompress(file) char *infile, *outfile; FILE *out; gzFile in; - uInt len = (uInt)strlen(file); + size_t len = strlen(file); + + if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) { + fprintf(stderr, "%s: filename too long\n", prog); + exit(1); + } strcpy(buf, file); @@ -258,7 +337,8 @@ void file_uncompress(file) /* =========================================================================== - * Usage: minigzip [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...] + * -c : write to standard output * -d : decompress * -f : compress with Z_FILTERED * -h : compress with Z_HUFFMAN_ONLY @@ -270,17 +350,30 @@ int main(argc, argv) int argc; char *argv[]; { + int copyout = 0; int uncompr = 0; gzFile file; - char outmode[20]; + char *bname, outmode[20]; strcpy(outmode, "wb6 "); prog = argv[0]; + bname = strrchr(argv[0], '/'); + if (bname) + bname++; + else + bname = argv[0]; argc--, argv++; + if (!strcmp(bname, "gunzip")) + uncompr = 1; + else if (!strcmp(bname, "zcat")) + copyout = uncompr = 1; + while (argc > 0) { - if (strcmp(*argv, "-d") == 0) + if (strcmp(*argv, "-c") == 0) + copyout = 1; + else if (strcmp(*argv, "-d") == 0) uncompr = 1; else if (strcmp(*argv, "-f") == 0) outmode[3] = 'f'; @@ -310,11 +403,36 @@ int main(argc, argv) gz_compress(stdin, file); } } else { + if (copyout) { + SET_BINARY_MODE(stdout); + } do { if (uncompr) { - file_uncompress(*argv); + if (copyout) { + file = gzopen(*argv, "rb"); + if (file == NULL) + fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv); + else + gz_uncompress(file, stdout); + } else { + file_uncompress(*argv); + } } else { - file_compress(*argv, outmode); + if (copyout) { + FILE * in = fopen(*argv, "rb"); + + if (in == NULL) { + perror(*argv); + } else { + file = gzdopen(fileno(stdout), outmode); + if (file == NULL) error("can't gzdopen stdout"); + + gz_compress(in, file); + } + + } else { + file_compress(*argv, outmode); + } } } while (argv++, --argc); } diff --git a/lib/3rdparty/zlib/trees.c b/lib/3rdparty/zlib/trees.c index 395e4e16814..a05ec378b3a 100644 --- a/lib/3rdparty/zlib/trees.c +++ b/lib/3rdparty/zlib/trees.c @@ -1,5 +1,6 @@ /* trees.c -- output deflated data using Huffman coding - * Copyright (C) 1995-2005 Jean-loup Gailly + * Copyright (C) 1995-2010 Jean-loup Gailly + * detect_data_type() function provided freely by Cosmin Truta, 2006 * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -152,7 +153,7 @@ local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, int blcodes)); local void compress_block OF((deflate_state *s, ct_data *ltree, ct_data *dtree)); -local void set_data_type OF((deflate_state *s)); +local int detect_data_type OF((deflate_state *s)); local unsigned bi_reverse OF((unsigned value, int length)); local void bi_windup OF((deflate_state *s)); local void bi_flush OF((deflate_state *s)); @@ -203,12 +204,12 @@ local void send_bits(s, value, length) * unused bits in value. */ if (s->bi_valid > (int)Buf_size - length) { - s->bi_buf |= (value << s->bi_valid); + s->bi_buf |= (ush)value << s->bi_valid; put_short(s, s->bi_buf); s->bi_buf = (ush)value >> (Buf_size - s->bi_valid); s->bi_valid += length - Buf_size; } else { - s->bi_buf |= value << s->bi_valid; + s->bi_buf |= (ush)value << s->bi_valid; s->bi_valid += length; } } @@ -218,12 +219,12 @@ local void send_bits(s, value, length) { int len = length;\ if (s->bi_valid > (int)Buf_size - len) {\ int val = value;\ - s->bi_buf |= (val << s->bi_valid);\ + s->bi_buf |= (ush)val << s->bi_valid;\ put_short(s, s->bi_buf);\ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\ s->bi_valid += len - Buf_size;\ } else {\ - s->bi_buf |= (value) << s->bi_valid;\ + s->bi_buf |= (ush)(value) << s->bi_valid;\ s->bi_valid += len;\ }\ } @@ -250,11 +251,13 @@ local void tr_static_init() if (static_init_done) return; /* For some embedded targets, global variables are not initialized: */ +#ifdef NO_INIT_GLOBAL_POINTERS static_l_desc.static_tree = static_ltree; static_l_desc.extra_bits = extra_lbits; static_d_desc.static_tree = static_dtree; static_d_desc.extra_bits = extra_dbits; static_bl_desc.extra_bits = extra_blbits; +#endif /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; @@ -348,13 +351,14 @@ void gen_trees_header() static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5)); } - fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n"); + fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n"); for (i = 0; i < DIST_CODE_LEN; i++) { fprintf(header, "%2u%s", _dist_code[i], SEPARATOR(i, DIST_CODE_LEN-1, 20)); } - fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); + fprintf(header, + "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n"); for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) { fprintf(header, "%2u%s", _length_code[i], SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20)); @@ -864,13 +868,13 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) /* =========================================================================== * Send a stored block */ -void _tr_stored_block(s, buf, stored_len, eof) +void _tr_stored_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block */ ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ + int last; /* one if this is the last block for a file */ { - send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */ + send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */ #ifdef DEBUG s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L; s->compressed_len += (stored_len + 4) << 3; @@ -918,11 +922,11 @@ void _tr_align(s) * Determine the best encoding for the current block: dynamic trees, static * trees or store, and output the encoded block to the zip file. */ -void _tr_flush_block(s, buf, stored_len, eof) +void _tr_flush_block(s, buf, stored_len, last) deflate_state *s; charf *buf; /* input block, or NULL if too old */ ulg stored_len; /* length of input block */ - int eof; /* true if this is the last block for a file */ + int last; /* one if this is the last block for a file */ { ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ int max_blindex = 0; /* index of last bit length code of non zero freq */ @@ -931,8 +935,8 @@ void _tr_flush_block(s, buf, stored_len, eof) if (s->level > 0) { /* Check if the file is binary or text */ - if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN) - set_data_type(s); + if (s->strm->data_type == Z_UNKNOWN) + s->strm->data_type = detect_data_type(s); /* Construct the literal and distance trees */ build_tree(s, (tree_desc *)(&(s->l_desc))); @@ -978,20 +982,20 @@ void _tr_flush_block(s, buf, stored_len, eof) * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to * transform a block into a stored block. */ - _tr_stored_block(s, buf, stored_len, eof); + _tr_stored_block(s, buf, stored_len, last); #ifdef FORCE_STATIC } else if (static_lenb >= 0) { /* force static trees */ #else } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) { #endif - send_bits(s, (STATIC_TREES<<1)+eof, 3); + send_bits(s, (STATIC_TREES<<1)+last, 3); compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree); #ifdef DEBUG s->compressed_len += 3 + s->static_len; #endif } else { - send_bits(s, (DYN_TREES<<1)+eof, 3); + send_bits(s, (DYN_TREES<<1)+last, 3); send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1, max_blindex+1); compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree); @@ -1005,14 +1009,14 @@ void _tr_flush_block(s, buf, stored_len, eof) */ init_block(s); - if (eof) { + if (last) { bi_windup(s); #ifdef DEBUG s->compressed_len += 7; /* align on byte boundary */ #endif } Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - s->compressed_len-7*eof)); + s->compressed_len-7*last)); } /* =========================================================================== @@ -1118,24 +1122,45 @@ local void compress_block(s, ltree, dtree) } /* =========================================================================== - * Set the data type to BINARY or TEXT, using a crude approximation: - * set it to Z_TEXT if all symbols are either printable characters (33 to 255) - * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise. + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). * IN assertion: the fields Freq of dyn_ltree are set. */ -local void set_data_type(s) +local int detect_data_type(s) deflate_state *s; { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + unsigned long black_mask = 0xf3ffc07fUL; int n; - for (n = 0; n < 9; n++) + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>= 1) + if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0)) + return Z_BINARY; + + /* Check for textual ("white-listed") bytes. */ + if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 + || s->dyn_ltree[13].Freq != 0) + return Z_TEXT; + for (n = 32; n < LITERALS; n++) if (s->dyn_ltree[n].Freq != 0) - break; - if (n == 9) - for (n = 14; n < 32; n++) - if (s->dyn_ltree[n].Freq != 0) - break; - s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY; + return Z_TEXT; + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; } /* =========================================================================== diff --git a/lib/3rdparty/zlib/uncompr.c b/lib/3rdparty/zlib/uncompr.c index b59e3d0defb..ad98be3a5d8 100644 --- a/lib/3rdparty/zlib/uncompr.c +++ b/lib/3rdparty/zlib/uncompr.c @@ -1,5 +1,5 @@ /* uncompr.c -- decompress a memory buffer - * Copyright (C) 1995-2003 Jean-loup Gailly. + * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -16,8 +16,6 @@ been saved previously by the compressor and transmitted to the decompressor by some mechanism outside the scope of this compression library.) Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output diff --git a/lib/3rdparty/zlib/zconf.h b/lib/3rdparty/zlib/zconf.h index 03a9431c8be..02ce56c4313 100644 --- a/lib/3rdparty/zlib/zconf.h +++ b/lib/3rdparty/zlib/zconf.h @@ -1,5 +1,5 @@ /* zconf.h -- configuration of the zlib compression library - * 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 */ @@ -11,52 +11,124 @@ /* * If you *really* need a unique prefix for all types and library functions, * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 # define compress z_compress # define compress2 z_compress2 # define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 # define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright # define get_crc_table z_get_crc_table +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# define gzprintf z_gzprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# define uncompress z_uncompress # define zError z_zError +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func +/* all zlib typedefs in zlib.h and zconf.h */ # define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong # define Bytef z_Bytef +# define alloc_func z_alloc_func # define charf z_charf +# define free_func z_free_func +# define gzFile z_gzFile +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func # define intf z_intf +# define out_func z_out_func +# define uInt z_uInt # define uIntf z_uIntf +# define uLong z_uLong # define uLongf z_uLongf -# define voidpf z_voidpf # define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + #endif #if defined(__MSDOS__) && !defined(MSDOS) @@ -284,49 +356,73 @@ typedef uLong FAR uLongf; typedef Byte *voidp; #endif -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t +#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H #endif + +#ifdef STDC +# include /* for off_t */ +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include /* for SEEK_* and off_t */ +# ifdef VMS +# include /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +#endif + #ifndef SEEK_SET # define SEEK_SET 0 /* Seek from beginning of file. */ # define SEEK_CUR 1 /* Seek from current position. */ # define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ #endif + #ifndef z_off_t # define z_off_t long #endif +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 +# define z_off64_t off64_t +#else +# define z_off64_t z_off_t +#endif + #if defined(__OS400__) # define NO_vsnprintf #endif #if defined(__MVS__) # define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif #endif /* MVS linker does not support external names larger than 8 bytes */ #if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") #endif #endif /* ZCONF_H */ diff --git a/lib/3rdparty/zlib/zconf.in.h b/lib/3rdparty/zlib/zconf.in.h deleted file mode 100644 index 03a9431c8be..00000000000 --- a/lib/3rdparty/zlib/zconf.in.h +++ /dev/null @@ -1,332 +0,0 @@ -/* zconf.h -- configuration of the zlib compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. - * For conditions of distribution and use, see copyright notice in zlib.h - */ - -/* @(#) $Id$ */ - -#ifndef ZCONF_H -#define ZCONF_H - -/* - * If you *really* need a unique prefix for all types and library functions, - * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. - */ -#ifdef Z_PREFIX -# define deflateInit_ z_deflateInit_ -# define deflate z_deflate -# define deflateEnd z_deflateEnd -# define inflateInit_ z_inflateInit_ -# define inflate z_inflate -# define inflateEnd z_inflateEnd -# define deflateInit2_ z_deflateInit2_ -# define deflateSetDictionary z_deflateSetDictionary -# define deflateCopy z_deflateCopy -# define deflateReset z_deflateReset -# define deflateParams z_deflateParams -# define deflateBound z_deflateBound -# define deflatePrime z_deflatePrime -# define inflateInit2_ z_inflateInit2_ -# define inflateSetDictionary z_inflateSetDictionary -# define inflateSync z_inflateSync -# define inflateSyncPoint z_inflateSyncPoint -# define inflateCopy z_inflateCopy -# define inflateReset z_inflateReset -# define inflateBack z_inflateBack -# define inflateBackEnd z_inflateBackEnd -# define compress z_compress -# define compress2 z_compress2 -# define compressBound z_compressBound -# define uncompress z_uncompress -# define adler32 z_adler32 -# define crc32 z_crc32 -# define get_crc_table z_get_crc_table -# define zError z_zError - -# define alloc_func z_alloc_func -# define free_func z_free_func -# define in_func z_in_func -# define out_func z_out_func -# define Byte z_Byte -# define uInt z_uInt -# define uLong z_uLong -# define Bytef z_Bytef -# define charf z_charf -# define intf z_intf -# define uIntf z_uIntf -# define uLongf z_uLongf -# define voidpf z_voidpf -# define voidp z_voidp -#endif - -#if defined(__MSDOS__) && !defined(MSDOS) -# define MSDOS -#endif -#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) -# define OS2 -#endif -#if defined(_WINDOWS) && !defined(WINDOWS) -# define WINDOWS -#endif -#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) -# ifndef WIN32 -# define WIN32 -# endif -#endif -#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) -# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) -# ifndef SYS16BIT -# define SYS16BIT -# endif -# endif -#endif - -/* - * Compile with -DMAXSEG_64K if the alloc function cannot allocate more - * than 64k bytes at a time (needed on systems with 16-bit int). - */ -#ifdef SYS16BIT -# define MAXSEG_64K -#endif -#ifdef MSDOS -# define UNALIGNED_OK -#endif - -#ifdef __STDC_VERSION__ -# ifndef STDC -# define STDC -# endif -# if __STDC_VERSION__ >= 199901L -# ifndef STDC99 -# define STDC99 -# endif -# endif -#endif -#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) -# define STDC -#endif -#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) -# define STDC -#endif -#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) -# define STDC -#endif -#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) -# define STDC -#endif - -#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ -# define STDC -#endif - -#ifndef STDC -# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ -# define const /* note: need a more gentle solution here */ -# endif -#endif - -/* Some Mac compilers merge all .h files incorrectly: */ -#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) -# define NO_DUMMY_DECL -#endif - -/* Maximum value for memLevel in deflateInit2 */ -#ifndef MAX_MEM_LEVEL -# ifdef MAXSEG_64K -# define MAX_MEM_LEVEL 8 -# else -# define MAX_MEM_LEVEL 9 -# endif -#endif - -/* Maximum value for windowBits in deflateInit2 and inflateInit2. - * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files - * created by gzip. (Files created by minigzip can still be extracted by - * gzip.) - */ -#ifndef MAX_WBITS -# define MAX_WBITS 15 /* 32K LZ77 window */ -#endif - -/* The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) - plus a few kilobytes for small objects. For example, if you want to reduce - the default memory requirements from 256K to 128K, compile with - make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" - Of course this will generally degrade compression (there's no free lunch). - - The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects. -*/ - - /* Type declarations */ - -#ifndef OF /* function prototypes */ -# ifdef STDC -# define OF(args) args -# else -# define OF(args) () -# endif -#endif - -/* The following definitions for FAR are needed only for MSDOS mixed - * model programming (small or medium model with some far allocations). - * This was tested only with MSC; for other MSDOS compilers you may have - * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, - * just define FAR to be empty. - */ -#ifdef SYS16BIT -# if defined(M_I86SM) || defined(M_I86MM) - /* MSC small or medium model */ -# define SMALL_MEDIUM -# ifdef _MSC_VER -# define FAR _far -# else -# define FAR far -# endif -# endif -# if (defined(__SMALL__) || defined(__MEDIUM__)) - /* Turbo C small or medium model */ -# define SMALL_MEDIUM -# ifdef __BORLANDC__ -# define FAR _far -# else -# define FAR far -# endif -# endif -#endif - -#if defined(WINDOWS) || defined(WIN32) - /* If building or using zlib as a DLL, define ZLIB_DLL. - * This is not mandatory, but it offers a little performance increase. - */ -# ifdef ZLIB_DLL -# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) -# ifdef ZLIB_INTERNAL -# define ZEXTERN extern __declspec(dllexport) -# else -# define ZEXTERN extern __declspec(dllimport) -# endif -# endif -# endif /* ZLIB_DLL */ - /* If building or using zlib with the WINAPI/WINAPIV calling convention, - * define ZLIB_WINAPI. - * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. - */ -# ifdef ZLIB_WINAPI -# ifdef FAR -# undef FAR -# endif -# include - /* No need for _export, use ZLIB.DEF instead. */ - /* For complete Windows compatibility, use WINAPI, not __stdcall. */ -# define ZEXPORT WINAPI -# ifdef WIN32 -# define ZEXPORTVA WINAPIV -# else -# define ZEXPORTVA FAR CDECL -# endif -# endif -#endif - -#if defined (__BEOS__) -# ifdef ZLIB_DLL -# ifdef ZLIB_INTERNAL -# define ZEXPORT __declspec(dllexport) -# define ZEXPORTVA __declspec(dllexport) -# else -# define ZEXPORT __declspec(dllimport) -# define ZEXPORTVA __declspec(dllimport) -# endif -# endif -#endif - -#ifndef ZEXTERN -# define ZEXTERN extern -#endif -#ifndef ZEXPORT -# define ZEXPORT -#endif -#ifndef ZEXPORTVA -# define ZEXPORTVA -#endif - -#ifndef FAR -# define FAR -#endif - -#if !defined(__MACTYPES__) -typedef unsigned char Byte; /* 8 bits */ -#endif -typedef unsigned int uInt; /* 16 bits or more */ -typedef unsigned long uLong; /* 32 bits or more */ - -#ifdef SMALL_MEDIUM - /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ -# define Bytef Byte FAR -#else - typedef Byte FAR Bytef; -#endif -typedef char FAR charf; -typedef int FAR intf; -typedef uInt FAR uIntf; -typedef uLong FAR uLongf; - -#ifdef STDC - typedef void const *voidpc; - typedef void FAR *voidpf; - typedef void *voidp; -#else - typedef Byte const *voidpc; - typedef Byte FAR *voidpf; - typedef Byte *voidp; -#endif - -#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */ -# include /* for off_t */ -# include /* for SEEK_* and off_t */ -# ifdef VMS -# include /* for off_t */ -# endif -# define z_off_t off_t -#endif -#ifndef SEEK_SET -# define SEEK_SET 0 /* Seek from beginning of file. */ -# define SEEK_CUR 1 /* Seek from current position. */ -# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ -#endif -#ifndef z_off_t -# define z_off_t long -#endif - -#if defined(__OS400__) -# define NO_vsnprintf -#endif - -#if defined(__MVS__) -# define NO_vsnprintf -# ifdef FAR -# undef FAR -# endif -#endif - -/* MVS linker does not support external names larger than 8 bytes */ -#if defined(__MVS__) -# pragma map(deflateInit_,"DEIN") -# pragma map(deflateInit2_,"DEIN2") -# pragma map(deflateEnd,"DEEND") -# pragma map(deflateBound,"DEBND") -# pragma map(inflateInit_,"ININ") -# pragma map(inflateInit2_,"ININ2") -# pragma map(inflateEnd,"INEND") -# pragma map(inflateSync,"INSY") -# pragma map(inflateSetDictionary,"INSEDI") -# pragma map(compressBound,"CMBND") -# pragma map(inflate_table,"INTABL") -# pragma map(inflate_fast,"INFA") -# pragma map(inflate_copyright,"INCOPY") -#endif - -#endif /* ZCONF_H */ diff --git a/lib/3rdparty/zlib/zlib.h b/lib/3rdparty/zlib/zlib.h index 022817927ce..bfbba83e8ee 100644 --- a/lib/3rdparty/zlib/zlib.h +++ b/lib/3rdparty/zlib/zlib.h @@ -1,7 +1,7 @@ /* zlib.h -- interface of the 'zlib' general purpose compression library - version 1.2.3, July 18th, 2005 + version 1.2.5, April 19th, 2010 - Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler + Copyright (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 @@ -37,41 +37,44 @@ extern "C" { #endif -#define ZLIB_VERSION "1.2.3" -#define ZLIB_VERNUM 0x1230 +#define ZLIB_VERSION "1.2.5" +#define ZLIB_VERNUM 0x1250 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 5 +#define ZLIB_VER_SUBREVISION 0 /* - The 'zlib' compression library provides in-memory compression and - decompression functions, including integrity checks of the uncompressed - data. This version of the library supports only one compression method - (deflation) but other algorithms will be added later and will have the same - stream interface. + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. - Compression can be done in a single step if the buffers are large - enough (for example if an input file is mmap'ed), or can be done by - repeated calls of the compression function. In the latter case, the - application must provide more input and/or consume the output + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output (providing more output space) before each call. - The compressed data format used by default by the in-memory functions is + The compressed data format used by default by the in-memory functions is the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped around a deflate stream, which is itself documented in RFC 1951. - The library also supports reading and writing files in gzip (.gz) format + The library also supports reading and writing files in gzip (.gz) format with an interface similar to that of stdio using the functions that start with "gz". The gzip format is different from the zlib format. gzip is a gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. - This library can optionally read and write gzip streams in memory as well. + This library can optionally read and write gzip streams in memory as well. - The zlib format was designed to be compact and fast for use in memory + The zlib format was designed to be compact and fast for use in memory and on communications channels. The gzip format was designed for single- file compression on file systems, has a larger header than zlib to maintain directory information, and uses a different, slower check method than zlib. - The library does not install any signal handler. The decoder checks - the consistency of the compressed data, so the library should never - crash even in case of corrupted input. + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. */ typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); @@ -126,45 +129,45 @@ typedef struct gz_header_s { typedef gz_header FAR *gz_headerp; /* - The application must update next_in and avail_in when avail_in has - dropped to zero. It must update next_out and avail_out when avail_out - has dropped to zero. The application must initialize zalloc, zfree and - opaque before calling the init function. All other fields are set by the - compression library and must not be updated by the application. + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. - The opaque value provided by the application will be passed as the first - parameter for calls of zalloc and zfree. This can be useful for custom - memory management. The compression library attaches no meaning to the + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the opaque value. - zalloc must return Z_NULL if there is not enough memory for the object. + zalloc must return Z_NULL if there is not enough memory for the object. If zlib is used in a multi-threaded application, zalloc and zfree must be thread safe. - On 16-bit systems, the functions zalloc and zfree must be able to allocate - exactly 65536 bytes, but will not be required to allocate more than this - if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, - pointers returned by zalloc for objects of exactly 65536 bytes *must* - have their offset normalized to zero. The default allocation function - provided by this library ensures this (see zutil.c). To reduce memory - requirements and avoid any allocation of 64K objects, at the expense of - compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h). + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). - The fields total_in and total_out can be used for statistics or - progress reports. After compression, total_in holds the total size of - the uncompressed data and may be saved for use in the decompressor - (particularly if the decompressor wants to decompress everything in - a single step). + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). */ /* constants */ #define Z_NO_FLUSH 0 -#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */ +#define Z_PARTIAL_FLUSH 1 #define Z_SYNC_FLUSH 2 #define Z_FULL_FLUSH 3 #define Z_FINISH 4 #define Z_BLOCK 5 +#define Z_TREES 6 /* Allowed flush values; see deflate() and inflate() below for details */ #define Z_OK 0 @@ -176,8 +179,8 @@ typedef gz_header FAR *gz_headerp; #define Z_MEM_ERROR (-4) #define Z_BUF_ERROR (-5) #define Z_VERSION_ERROR (-6) -/* Return codes for the compression/decompression functions. Negative - * values are errors, positive values are used for special but normal events. +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. */ #define Z_NO_COMPRESSION 0 @@ -207,119 +210,140 @@ typedef gz_header FAR *gz_headerp; #define zlib_version zlibVersion() /* for compatibility with versions < 1.0.2 */ + /* basic functions */ ZEXTERN const char * ZEXPORT zlibVersion OF((void)); /* The application can compare zlibVersion and ZLIB_VERSION for consistency. - If the first character differs, the library code actually used is - not compatible with the zlib.h header file used by the application. - This check is automatically made by deflateInit and inflateInit. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. */ /* ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); - Initializes the internal stream state for compression. The fields - zalloc, zfree and opaque must be initialized before by the caller. - If zalloc and zfree are set to Z_NULL, deflateInit updates them to - use default allocation functions. + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: - 1 gives best speed, 9 gives best compression, 0 gives no compression at - all (the input data is simply copied a block at a time). - Z_DEFAULT_COMPRESSION requests a default compromise between speed and - compression (currently equivalent to level 6). + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). - deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not - enough memory, Z_STREAM_ERROR if level is not a valid compression level, + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible - with the version assumed by the caller (ZLIB_VERSION). - msg is set to null if there is no error message. deflateInit does not - perform any compression: this will be done by deflate(). + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). */ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); /* deflate compresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce some - output latency (reading input without producing any output) except when + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when forced to flush. - The detailed semantics are as follows. deflate performs one or both of the + The detailed semantics are as follows. deflate performs one or both of the following actions: - Compress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not + accordingly. If not all input can be processed (because there is not enough room in the output buffer), next_in and avail_in are updated and processing will resume at this point for the next call of deflate(). - Provide more output starting at next_out and update next_out and avail_out - accordingly. This action is forced if the parameter flush is non zero. + accordingly. This action is forced if the parameter flush is non zero. Forcing flush frequently degrades the compression ratio, so this parameter - should be set only when necessary (in interactive applications). - Some output may be provided even if flush is not set. + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. - Before the call of deflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating avail_in or avail_out accordingly; avail_out - should never be zero before the call. The application can consume the - compressed output when it wants, for example when the output buffer is full - (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK - and with zero avail_out, it must be called again after making room in the - output buffer because there might be more output pending. + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to - decide how much data to accumualte before producing output, in order to + decide how much data to accumulate before producing output, in order to maximize compression. If the parameter flush is set to Z_SYNC_FLUSH, all pending output is flushed to the output buffer and the output is aligned on a byte boundary, so - that the decompressor can get all input data available so far. (In particular - avail_in is zero after the call if enough output space has been provided - before the call.) Flushing may degrade compression for some compression - algorithms and so it should be used only when necessary. + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. If flush is set to Z_FULL_FLUSH, all output is flushed as with Z_SYNC_FLUSH, and the compression state is reset so that decompression can restart from this point if previous compressed data has been damaged or if - random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade compression. If deflate returns with avail_out == 0, this function must be called again with the same value of the flush parameter and more output space (updated avail_out), until the flush is complete (deflate returns with non-zero - avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that avail_out is greater than six to avoid repeated flush markers due to avail_out == 0 on return. If the parameter flush is set to Z_FINISH, pending input is processed, - pending output is flushed and deflate returns with Z_STREAM_END if there - was enough output space; if deflate returns with Z_OK, this function must be + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be called again with Z_FINISH and more output space (updated avail_out) but no - more input data, until it returns with Z_STREAM_END or an error. After - deflate has returned Z_STREAM_END, the only possible operations on the - stream are deflateReset or deflateEnd. + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. Z_FINISH can be used immediately after deflateInit if all the compression - is to be done in a single step. In this case, avail_out must be at least - the value returned by deflateBound (see below). If deflate does not return + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). If deflate does not return Z_STREAM_END, then it must be called again as described above. deflate() sets strm->adler to the adler32 checksum of all input read so far (that is, total_in bytes). deflate() may update strm->data_type if it can make a good guess about - the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered - binary. This field is only for information purposes and does not affect - the compression algorithm in any manner. + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. deflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if all input has been consumed and all output has been produced (only when flush is set to Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example - if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible - (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and deflate() can be called again with more input and more output space to continue compressing. */ @@ -328,13 +352,13 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. + This function discards any unprocessed input and does not flush any pending + output. deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state was inconsistent, Z_DATA_ERROR if the stream was freed - prematurely (some input or output was discarded). In the error case, - msg may be set but then points to a static string (which must not be + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be deallocated). */ @@ -342,10 +366,10 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); /* ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); - Initializes the internal stream state for decompression. The fields + Initializes the internal stream state for decompression. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by - the caller. If next_in is not Z_NULL and avail_in is large enough (the exact - value depends on the compression method), inflateInit determines the + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the compression method from the zlib header and allocates all data structures accordingly; otherwise the allocation will be deferred to the first call of inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to @@ -353,95 +377,108 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_VERSION_ERROR if the zlib library version is incompatible with the - version assumed by the caller. msg is set to null if there is no error - message. inflateInit does not perform any decompression apart from reading - the zlib header if present: this will be done by inflate(). (So next_in and - avail_in may be modified, but next_out and avail_out are unchanged.) + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. */ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); /* inflate decompresses as much data as possible, and stops when the input - buffer becomes empty or the output buffer becomes full. It may introduce + buffer becomes empty or the output buffer becomes full. It may introduce some output latency (reading input without producing any output) except when forced to flush. - The detailed semantics are as follows. inflate performs one or both of the + The detailed semantics are as follows. inflate performs one or both of the following actions: - Decompress more input starting at next_in and update next_in and avail_in - accordingly. If not all input can be processed (because there is not - enough room in the output buffer), next_in is updated and processing - will resume at this point for the next call of inflate(). + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). - Provide more output starting at next_out and update next_out and avail_out - accordingly. inflate() provides as much output as possible, until there - is no more input data or no more space in the output buffer (see below - about the flush parameter). + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). - Before the call of inflate(), the application should ensure that at least - one of the actions is possible, by providing more input and/or consuming - more output, and updating the next_* and avail_* values accordingly. - The application can consume the uncompressed output when it wants, for - example when the output buffer is full (avail_out == 0), or after each - call of inflate(). If inflate returns Z_OK and with zero avail_out, it - must be called again after making room in the output buffer because there - might be more output pending. + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. - The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, - Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much - output as possible to the output buffer. Z_BLOCK requests that inflate() stop - if and when it gets to the next deflate block boundary. When decoding the - zlib or gzip format, this will cause inflate() to return immediately after - the header and before the first block. When doing a raw inflate, inflate() - will go ahead and process the first block, and will return when it gets to - the end of that block, or when it runs out of data. + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. The Z_BLOCK option assists in appending to or combining deflate streams. Also to assist in this, on return inflate() will set strm->data_type to the - number of unused bits in the last byte taken from strm->next_in, plus 64 - if inflate() is currently decoding the last block in the deflate stream, - plus 128 if inflate() returned immediately after decoding an end-of-block - code or decoding the complete header up to just before the first byte of the - deflate stream. The end-of-block will not be indicated until all of the - uncompressed data from that block has been written to strm->next_out. The - number of unused bits may in general be greater than seven, except when - bit 7 of data_type is set, in which case the number of unused bits will be - less than eight. + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. inflate() should normally be called until it returns Z_STREAM_END or an - error. However if all decompression is to be performed in a single step - (a single call of inflate), the parameter flush should be set to - Z_FINISH. In this case all pending input is processed and all pending - output is flushed; avail_out must be large enough to hold all the - uncompressed data. (The size of the uncompressed data may have been saved - by the compressor for this purpose.) The next operation on this stream must - be inflateEnd to deallocate the decompression state. The use of Z_FINISH - is never required, but can be used to inform inflate that a faster approach - may be used for the single inflate() call. + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all the uncompressed data. (The size + of the uncompressed data may have been saved by the compressor for this + purpose.) The next operation on this stream must be inflateEnd to deallocate + the decompression state. The use of Z_FINISH is never required, but can be + used to inform inflate that a faster approach may be used for the single + inflate() call. In this implementation, inflate() always flushes as much output as possible to the output buffer, and always uses the faster approach on the - first call. So the only effect of the flush parameter in this implementation + first call. So the only effect of the flush parameter in this implementation is on the return value of inflate(), as noted below, or when it returns early - because Z_BLOCK is used. + because Z_BLOCK or Z_TREES is used. If a preset dictionary is needed after this call (see inflateSetDictionary below), inflate sets strm->adler to the adler32 checksum of the dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise it sets strm->adler to the adler32 checksum of all output produced so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described - below. At the end of the stream, inflate() checks that its computed adler32 + below. At the end of the stream, inflate() checks that its computed adler32 checksum is equal to that saved by the compressor and returns Z_STREAM_END only if the checksum is correct. - inflate() will decompress and check either zlib-wrapped or gzip-wrapped - deflate data. The header type is detected automatically. Any information - contained in the gzip header is not retained, so applications that need that - information should instead use raw inflate, see inflateInit2() below, or - inflateBack() and perform their own processing of the gzip header and - trailer. + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. inflate() returns Z_OK if some progress has been made (more input processed or more output produced), Z_STREAM_END if the end of the compressed data has @@ -449,27 +486,28 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); preset dictionary is needed at this point, Z_DATA_ERROR if the input data was corrupted (input stream not conforming to the zlib format or incorrect check value), Z_STREAM_ERROR if the stream structure was inconsistent (for example - if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory, + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if no progress is possible or if there was not enough room in the - output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and inflate() can be called again with more input and more output space to - continue decompressing. If Z_DATA_ERROR is returned, the application may then - call inflateSync() to look for a good compression block if a partial recovery - of the data is desired. + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. */ ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); /* All dynamically allocated data structures for this stream are freed. - This function discards any unprocessed input and does not flush any - pending output. + This function discards any unprocessed input and does not flush any pending + output. inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state - was inconsistent. In the error case, msg may be set but then points to a + was inconsistent. In the error case, msg may be set but then points to a static string (which must not be deallocated). */ + /* Advanced functions */ /* @@ -484,55 +522,57 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, int memLevel, int strategy)); - This is another version of deflateInit with more compression options. The - fields next_in, zalloc, zfree and opaque must be initialized before by - the caller. + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. - The method parameter is the compression method. It must be Z_DEFLATED in + The method parameter is the compression method. It must be Z_DEFLATED in this version of the library. The windowBits parameter is the base two logarithm of the window size - (the size of the history buffer). It should be in the range 8..15 for this - version of the library. Larger values of this parameter result in better - compression at the expense of memory usage. The default value is 15 if + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if deflateInit is used instead. - windowBits can also be -8..-15 for raw deflate. In this case, -windowBits - determines the window size. deflate() will then generate raw deflate data + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data with no zlib header or trailer, and will not compute an adler32 check value. - windowBits can also be greater than 15 for optional gzip encoding. Add + windowBits can also be greater than 15 for optional gzip encoding. Add 16 to windowBits to write a simple gzip header and trailer around the - compressed data instead of a zlib wrapper. The gzip header will have no - file name, no extra data, no comment, no modification time (set to zero), - no header crc, and the operating system will be set to 255 (unknown). If a + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a gzip stream is being written, strm->adler is a crc32 instead of an adler32. The memLevel parameter specifies how much memory should be allocated - for the internal compression state. memLevel=1 uses minimum memory but - is slow and reduces compression ratio; memLevel=9 uses maximum memory - for optimal speed. The default value is 8. See zconf.h for total memory - usage as a function of windowBits and memLevel. + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. - The strategy parameter is used to tune the compression algorithm. Use the + The strategy parameter is used to tune the compression algorithm. Use the value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no string match), or Z_RLE to limit match distances to one (run-length - encoding). Filtered data consists mostly of small values with a somewhat - random distribution. In this case, the compression algorithm is tuned to - compress them better. The effect of Z_FILTERED is to force more Huffman + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman coding and less string matching; it is somewhat intermediate between - Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as - Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy - parameter only affects the compression ratio but not the correctness of the - compressed output even if it is not set appropriately. Z_FIXED prevents the - use of dynamic Huffman codes, allowing for a simpler decoder for special - applications. + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. - deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid - method). msg is set to null if there is no error message. deflateInit2 does - not perform any compression: this will be done by deflate(). + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). */ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, @@ -540,37 +580,37 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the compression dictionary from the given byte sequence - without producing any compressed output. This function must be called - immediately after deflateInit, deflateInit2 or deflateReset, before any - call of deflate. The compressor and decompressor must use exactly the same + without producing any compressed output. This function must be called + immediately after deflateInit, deflateInit2 or deflateReset, before any call + of deflate. The compressor and decompressor must use exactly the same dictionary (see inflateSetDictionary). The dictionary should consist of strings (byte sequences) that are likely to be encountered later in the data to be compressed, with the most commonly - used strings preferably put towards the end of the dictionary. Using a + used strings preferably put towards the end of the dictionary. Using a dictionary is most useful when the data to be compressed is short and can be predicted with good accuracy; the data can then be compressed better than with the default empty dictionary. Depending on the size of the compression data structures selected by deflateInit or deflateInit2, a part of the dictionary may in effect be - discarded, for example if the dictionary is larger than the window size in - deflate or deflate2. Thus the strings most likely to be useful should be - put at the end of the dictionary, not at the front. In addition, the - current implementation of deflate will use at most the window size minus - 262 bytes of the provided dictionary. + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. Upon return of this function, strm->adler is set to the adler32 value of the dictionary; the decompressor may later use this value to determine - which dictionary has been used by the compressor. (The adler32 value + which dictionary has been used by the compressor. (The adler32 value applies to the whole dictionary even if only a subset of the dictionary is actually used by the compressor.) If a raw deflate was requested, then the adler32 value is not computed and strm->adler is not set. deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent (for example if deflate has already been called for this stream - or if the compression method is bsort). deflateSetDictionary does not + or if the compression method is bsort). deflateSetDictionary does not perform any compression: this will be done by deflate(). */ @@ -581,26 +621,26 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, This function can be useful when several compression strategies will be tried, for example when there are several ways of pre-processing the input - data with a filter. The streams that will be discarded should then be freed + data with a filter. The streams that will be discarded should then be freed by calling deflateEnd. Note that deflateCopy duplicates the internal - compression state which can be quite large, so this strategy is slow and - can consume lots of memory. + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and + (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); /* This function is equivalent to deflateEnd followed by deflateInit, - but does not free and reallocate all the internal compression state. - The stream will keep the same compression level and any other attributes - that may have been set by deflateInit2. + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. - deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). */ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, @@ -610,18 +650,18 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, Dynamically update the compression level and compression strategy. The interpretation of level and strategy is as in deflateInit2. This can be used to switch between compression and straight copy of the input data, or - to switch to a different kind of input data requiring a different - strategy. If the compression level is changed, the input available so far - is compressed with the old level (and may be flushed); the new level will - take effect only at the next call of deflate(). + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). Before the call of deflateParams, the stream state must be set as for - a call of deflate(), since the currently available input may have to - be compressed and flushed. In particular, strm->avail_out must be non-zero. + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source - stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR - if strm->avail_out was zero. + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. */ ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, @@ -645,9 +685,10 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, uLong sourceLen)); /* deflateBound() returns an upper bound on the compressed size after - deflation of sourceLen bytes. It must be called after deflateInit() - or deflateInit2(). This would be used to allocate an output buffer - for deflation in a single pass, and so would be called before deflate(). + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). */ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, @@ -655,21 +696,21 @@ ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, int value)); /* deflatePrime() inserts bits in the deflate output stream. The intent - is that this function is used to start off the deflate output with the - bits leftover from a previous deflate stream when appending to it. As such, - this function can only be used for raw deflate, and must be used before the - first deflate() call after a deflateInit2() or deflateReset(). bits must be - less than or equal to 16, and that many of the least significant bits of - value will be inserted in the output. + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. - deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, gz_headerp head)); /* - deflateSetHeader() provides gzip header information for when a gzip + deflateSetHeader() provides gzip header information for when a gzip stream is requested by deflateInit2(). deflateSetHeader() may be called after deflateInit2() or deflateReset() and before the first call of deflate(). The text, time, os, extra field, name, and comment information @@ -682,11 +723,11 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, 1.3.x) do not support header crc's, and will report that it is a "multi-part gzip file" and give up. - If deflateSetHeader is not used, the default gzip header has text false, + If deflateSetHeader is not used, the default gzip header has text false, the time set to zero, and os set to 255, with no extra, name, or comment fields. The gzip header is returned to the default state by deflateReset(). - deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -694,43 +735,50 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, int windowBits)); - This is another version of inflateInit with an extra parameter. The + This is another version of inflateInit with an extra parameter. The fields next_in, avail_in, zalloc, zfree and opaque must be initialized before by the caller. The windowBits parameter is the base two logarithm of the maximum window size (the size of the history buffer). It should be in the range 8..15 for - this version of the library. The default value is 15 if inflateInit is used - instead. windowBits must be greater than or equal to the windowBits value + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value provided to deflateInit2() while compressing, or it must be equal to 15 if - deflateInit2() was not used. If a compressed stream with a larger window + deflateInit2() was not used. If a compressed stream with a larger window size is given as input, inflate() will return with the error code Z_DATA_ERROR instead of trying to allocate a larger window. - windowBits can also be -8..-15 for raw inflate. In this case, -windowBits - determines the window size. inflate() will then process raw deflate data, + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, not looking for a zlib or gzip header, not generating a check value, and not - looking for any check values for comparison at the end of the stream. This + looking for any check values for comparison at the end of the stream. This is for use with other formats that use the deflate compressed data format - such as zip. Those formats provide their own check values. If a custom + such as zip. Those formats provide their own check values. If a custom format is developed using the raw deflate format for compressed data, it is recommended that a check value such as an adler32 or a crc32 be applied to the uncompressed data as is done in the zlib, gzip, and zip formats. For - most applications, the zlib format should be used as is. Note that comments + most applications, the zlib format should be used as is. Note that comments above on the use in deflateInit2() applies to the magnitude of windowBits. - windowBits can also be greater than 15 for optional gzip decoding. Add + windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will - return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is - a crc32 instead of an adler32. + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough - memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg - is set to null if there is no error message. inflateInit2 does not perform - any decompression apart from reading the zlib header if present: this will - be done by inflate(). (So next_in and avail_in may be modified, but next_out - and avail_out are unchanged.) + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. */ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, @@ -738,8 +786,8 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, uInt dictLength)); /* Initializes the decompression dictionary from the given uncompressed byte - sequence. This function must be called immediately after a call of inflate, - if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor can be determined from the adler32 value returned by that call of inflate. The compressor and decompressor must use exactly the same dictionary (see deflateSetDictionary). For raw inflate, this function can be called @@ -748,26 +796,26 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, dictionary that was used for compression is provided. inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a - parameter is invalid (such as NULL dictionary) or the stream state is + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the - expected one (incorrect adler32 value). inflateSetDictionary does not + expected one (incorrect adler32 value). inflateSetDictionary does not perform any decompression: this will be done by subsequent calls of inflate(). */ ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); /* - Skips invalid compressed data until a full flush point (see above the - description of deflate with Z_FULL_FLUSH) can be found, or until all - available input is skipped. No output is provided. + Skips invalid compressed data until a full flush point (see above the + description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. - inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR - if no more input was provided, Z_DATA_ERROR if no flush point has been found, - or Z_STREAM_ERROR if the stream structure was inconsistent. In the success - case, the application may save the current current value of total_in which - indicates where valid compressed data was found. In the error case, the - application may repeatedly call inflateSync, providing more input each time, - until success or end of the input data. + inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR + if no more input was provided, Z_DATA_ERROR if no flush point has been + found, or Z_STREAM_ERROR if the stream structure was inconsistent. In the + success case, the application may save the current current value of total_in + which indicates where valid compressed data was found. In the error case, + the application may repeatedly call inflateSync, providing more input each + time, until success or end of the input data. */ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, @@ -782,18 +830,30 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_STREAM_ERROR if the source stream state was inconsistent - (such as zalloc being NULL). msg is left unchanged in both source and + (such as zalloc being Z_NULL). msg is left unchanged in both source and destination. */ ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); /* This function is equivalent to inflateEnd followed by inflateInit, - but does not free and reallocate all the internal decompression state. - The stream will keep attributes that may have been set by inflateInit2. + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. - inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source - stream state was inconsistent (such as zalloc or state being NULL). + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. */ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, @@ -801,54 +861,87 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, int value)); /* This function inserts bits in the inflate input stream. The intent is - that this function is used to start inflating at a bit position in the - middle of a byte. The provided bits will be used before any bytes are used - from next_in. This function should only be used with raw inflate, and - should be used before the first inflate() call after inflateInit2() or - inflateReset(). bits must be less than or equal to 16, and that many of the - least significant bits of value will be inserted in the input. + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. - inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, gz_headerp head)); /* - inflateGetHeader() requests that gzip header information be stored in the + inflateGetHeader() requests that gzip header information be stored in the provided gz_header structure. inflateGetHeader() may be called after inflateInit2() or inflateReset(), and before the first call of inflate(). As inflate() processes the gzip stream, head->done is zero until the header is completed, at which time head->done is set to one. If a zlib stream is being decoded, then head->done is set to -1 to indicate that there will be - no gzip header information forthcoming. Note that Z_BLOCK can be used to - force inflate() to return immediately after header processing is complete - and before any actual data is decompressed. + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. - The text, time, xflags, and os fields are filled in with the gzip header + The text, time, xflags, and os fields are filled in with the gzip header contents. hcrc is set to true if there is a header CRC. (The header CRC - was valid if done is set to one.) If extra is not Z_NULL, then extra_max + was valid if done is set to one.) If extra is not Z_NULL, then extra_max contains the maximum number of bytes to write to extra. Once done is true, extra_len contains the actual extra field length, and extra contains the extra field, or that field truncated if extra_max is less than extra_len. If name is not Z_NULL, then up to name_max characters are written there, terminated with a zero unless the length is greater than name_max. If comment is not Z_NULL, then up to comm_max characters are written there, - terminated with a zero unless the length is greater than comm_max. When - any of extra, name, or comment are not Z_NULL and the respective field is - not present in the header, then that field is set to Z_NULL to signal its + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its absence. This allows the use of deflateSetHeader() with the returned structure to duplicate the header. However if those fields are set to allocated memory, then the application will need to save those pointers elsewhere so that they can be eventually freed. - If inflateGetHeader is not used, then the header information is simply + If inflateGetHeader is not used, then the header information is simply discarded. The header is always checked for validity, including the header CRC if present. inflateReset() will reset the process to discard the header information. The application would need to call inflateGetHeader() again to retrieve the header from the next gzip stream. - inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source stream state was inconsistent. */ @@ -869,9 +962,9 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, See inflateBack() for the usage of these routines. inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of - the paramaters are invalid, Z_MEM_ERROR if the internal state could not - be allocated, or Z_VERSION_ERROR if the version of the library does not - match the version of the header file. + the paramaters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. */ typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *)); @@ -891,15 +984,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, inflateBackInit() must be called first to allocate the internal state and to initialize the state with the user-provided window buffer. inflateBack() may then be used multiple times to inflate a complete, raw - deflate stream with each call. inflateBackEnd() is then called to free - the allocated state. + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. A raw deflate stream is one with no zlib or gzip header or trailer. This routine would normally be used in a utility that reads zip or gzip files and writes out uncompressed files. The utility would decode the - header and process the trailer on its own, hence this routine expects - only the raw deflate stream to decompress. This is different from the - normal behavior of inflate(), which expects either a zlib or gzip header and + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and trailer around the deflate stream. inflateBack() uses two subroutines supplied by the caller that are then @@ -925,7 +1018,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in must also be initialized, and then if strm->avail_in is not zero, input will - initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. The in_desc and out_desc parameters of inflateBack() is passed as the first parameter of in() and out() respectively when they are called. These @@ -935,15 +1028,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, On return, inflateBack() will set strm->next_in and strm->avail_in to pass back any unused input that was provided by the last in() call. The return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR - if in() or out() returned an error, Z_DATA_ERROR if there was a format - error in the deflate stream (in which case strm->msg is set to indicate the - nature of the error), or Z_STREAM_ERROR if the stream was not properly - initialized. In the case of Z_BUF_ERROR, an input or output error can be - distinguished using strm->next_in which will be Z_NULL only if in() returned - an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to - out() returning non-zero. (in() will always be called before out(), so - strm->next_in is assured to be defined if out() returns non-zero.) Note - that inflateBack() cannot return Z_OK. + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. */ ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); @@ -999,23 +1092,22 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); /* utility functions */ /* - The following utility functions are implemented on top of the - basic stream-oriented functions. To simplify the interface, some - default options are assumed (compression level and memory usage, - standard memory allocation functions). The source code of these - utility functions can easily be modified if you need special options. + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. */ ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Compresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be at least the value returned - by compressBound(sourceLen). Upon exit, destLen is the actual size of the + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to compress a whole file at once if the - input file is mmap'ed. + compress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output buffer. @@ -1025,11 +1117,11 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)); /* - Compresses the source buffer into the destination buffer. The level + Compresses the source buffer into the destination buffer. The level parameter has the same meaning as in deflateInit. sourceLen is the byte - length of the source buffer. Upon entry, destLen is the total size of the + length of the source buffer. Upon entry, destLen is the total size of the destination buffer, which must be at least the value returned by - compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressBound(sourceLen). Upon exit, destLen is the actual size of the compressed buffer. compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough @@ -1040,22 +1132,20 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); /* compressBound() returns an upper bound on the compressed size after - compress() or compress2() on sourceLen bytes. It would be used before - a compress() or compress2() call to allocate the destination buffer. + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. */ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)); /* Decompresses the source buffer into the destination buffer. sourceLen is - the byte length of the source buffer. Upon entry, destLen is the total - size of the destination buffer, which must be large enough to hold the - entire uncompressed data. (The size of the uncompressed data must have - been saved previously by the compressor and transmitted to the decompressor - by some mechanism outside the scope of this compression library.) - Upon exit, destLen is the actual size of the compressed buffer. - This function can be used to decompress a whole file at once if the - input file is mmap'ed. + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR if there was not enough room in the output @@ -1063,136 +1153,199 @@ ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, */ -typedef voidp gzFile; + /* gzip file access functions */ -ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); /* - Opens a gzip (.gz) file for reading or writing. The mode parameter - is as in fopen ("rb" or "wb") but can also include a compression level - ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for - Huffman only compression as in "wb1h", or 'R' for run-length encoding - as in "wb1R". (See the description of deflateInit2 for more information - about the strategy parameter.) + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef voidp gzFile; /* opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) Also "a" + can be used instead of "w" to request that the gzip stream that will be + written be appended to the file. "+" will result in an error, since reading + and writing to the same gzip file is not supported. gzopen can be used to read a file which is not in gzip format; in this case gzread will directly read from the file without decompression. - gzopen returns NULL if the file could not be opened or if there was - insufficient memory to allocate the (de)compression state; errno - can be checked to distinguish the two cases (if errno is zero, the - zlib error is Z_MEM_ERROR). */ + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ -ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); /* - gzdopen() associates a gzFile with the file descriptor fd. File - descriptors are obtained from calls like open, dup, creat, pipe or - fileno (in the file has been previously opened with fopen). - The mode parameter is as in gzopen. - The next call of gzclose on the returned gzFile will also close the - file descriptor fd, just like fclose(fdopen(fd), mode) closes the file - descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode). - gzdopen returns NULL if there was insufficient memory to allocate - the (de)compression state. + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. */ ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); /* - Dynamically update the compression level or strategy. See the description + Dynamically update the compression level or strategy. See the description of deflateInit2 for the meaning of these parameters. + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not opened for writing. */ -ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); /* - Reads the given number of uncompressed bytes from the compressed file. - If the input file was not in gzip format, gzread copies the given number - of bytes into the buffer. - gzread returns the number of uncompressed bytes actually read (0 for - end of file, -1 for error). */ + Reads the given number of uncompressed bytes from the compressed file. If + the input file was not in gzip format, gzread copies the given number of + bytes into the buffer. -ZEXTERN int ZEXPORT gzwrite OF((gzFile file, - voidpc buf, unsigned len)); -/* - Writes the given number of uncompressed bytes into the compressed file. - gzwrite returns the number of uncompressed bytes actually written - (0 in case of error). + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream, or failing that, reading the rest + of the input file directly without decompression. The entire input file + will be read if gzread is called until it returns less than the requested + len. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. */ -ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); /* - Converts, formats, and writes the args to the compressed file under - control of the format string, as in fprintf. gzprintf returns the number of - uncompressed bytes actually written (0 in case of error). The number of - uncompressed bytes written is limited to 4095. The caller should assure that - this limit is not exceeded. If it is exceeded, then gzprintf() will return - return an error (0) with nothing written. In this case, there may also be a - buffer overflow with unpredictable consequences, which is possible only if - zlib was compiled with the insecure functions sprintf() or vsprintf() - because the secure snprintf() or vsnprintf() functions were not available. + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). */ ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); /* - Writes the given null-terminated string to the compressed file, excluding + Writes the given null-terminated string to the compressed file, excluding the terminating null character. - gzputs returns the number of characters written, or -1 in case of error. + + gzputs returns the number of characters written, or -1 in case of error. */ ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); /* - Reads bytes from the compressed file until len-1 characters are read, or - a newline character is read and transferred to buf, or an end-of-file - condition is encountered. The string is then terminated with a null - character. - gzgets returns buf, or Z_NULL in case of error. + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. */ -ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); /* - Writes c, converted to an unsigned char, into the compressed file. - gzputc returns the value that was written, or -1 in case of error. + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. */ -ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); /* - Reads one byte from the compressed file. gzgetc returns this byte - or -1 in case of end of file or error. + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. */ -ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); /* - Push one character back onto the stream to be read again later. - Only one character of push-back is allowed. gzungetc() returns the - character pushed, or -1 on failure. gzungetc() will fail if a - character has been pushed but not read yet, or if c is -1. The pushed - character will be discarded if the stream is repositioned with gzseek() - or gzrewind(). + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). */ -ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); /* - Flushes all pending output into the compressed file. The parameter - flush is as in the deflate() function. The return value is the zlib - error number (see function gzerror below). gzflush returns Z_OK if - the flush parameter is Z_FINISH and all output could be flushed. - gzflush should be called only when strictly necessary because it can - degrade compression. + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. */ -ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, - z_off_t offset, int whence)); /* - Sets the starting position for the next gzread or gzwrite on the - given compressed file. The offset represents a number of bytes in the - uncompressed data stream. The whence parameter is defined as in lseek(2); +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); the value SEEK_END is not supported. + If the file is opened for reading, this function is emulated but can be - extremely slow. If the file is opened for writing, only forward seeks are + extremely slow. If the file is opened for writing, only forward seeks are supported; gzseek then compresses a sequence of zeroes up to the new starting position. - gzseek returns the resulting offset location as measured in bytes from + gzseek returns the resulting offset location as measured in bytes from the beginning of the uncompressed stream, or -1 in case of error, in particular if the file is opened for writing and the new starting position would be before the current position. @@ -1202,68 +1355,127 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); /* Rewinds the given file. This function is supported only for reading. - gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) */ -ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); /* - Returns the starting position for the next gzread or gzwrite on the - given compressed file. This position represents a number of bytes in the - uncompressed data stream. +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); - gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. */ ZEXTERN int ZEXPORT gzeof OF((gzFile file)); /* - Returns 1 when EOF has previously been detected reading the given - input stream, otherwise zero. + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. */ ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); /* - Returns 1 if file is being read directly without decompression, otherwise - zero. + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. This state can change from + false to true while reading the input file if the end of a gzip stream is + reached, but is followed by data that is not another gzip stream. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). */ ZEXTERN int ZEXPORT gzclose OF((gzFile file)); /* - Flushes all pending output if necessary, closes the compressed file - and deallocates all the (de)compression state. The return value is the zlib - error number (see function gzerror below). + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. */ ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); /* - Returns the error message for the last error which occurred on the - given compressed file. errnum is set to zlib error number. If an - error occurred in the file system and not in the compression library, - errnum is set to Z_ERRNO and the application may consult errno - to get the exact error code. + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. */ ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); /* - Clears the error and end-of-file flags for file. This is analogous to the - clearerr() function in stdio. This is useful for continuing to read a gzip + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip file that is being written concurrently. */ + /* checksum functions */ /* These functions are not related to compression but are exported - anyway because they might be useful in applications using the - compression library. + anyway because they might be useful in applications using the compression + library. */ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); /* Update a running Adler-32 checksum with the bytes buf[0..len-1] and - return the updated checksum. If buf is NULL, this function returns - the required initial value for the checksum. - An Adler-32 checksum is almost as reliable as a CRC32 but can be computed - much faster. Usage example: + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: uLong adler = adler32(0L, Z_NULL, 0); @@ -1273,9 +1485,10 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); if (adler != original_adler) error(); */ +/* ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, z_off_t len2)); -/* + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of @@ -1285,9 +1498,11 @@ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); /* Update a running CRC-32 with the bytes buf[0..len-1] and return the - updated CRC-32. If buf is NULL, this function returns the required initial - value for the for the crc. Pre- and post-conditioning (one's complement) is - performed within this function so it shouldn't be done by the application. + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the for the crc. Pre- and post-conditioning (one's + complement) is performed within this function so it shouldn't be done by the + application. + Usage example: uLong crc = crc32(0L, Z_NULL, 0); @@ -1298,9 +1513,9 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); if (crc != original_crc) error(); */ +/* ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); -/* Combine two CRC-32 check values into one. For two sequences of bytes, seq1 and seq2 with lengths len1 and len2, CRC-32 check values were calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 @@ -1339,16 +1554,57 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream)) #define inflateBackInit(strm, windowBits, window) \ inflateBackInit_((strm), (windowBits), (window), \ - ZLIB_VERSION, sizeof(z_stream)) + ZLIB_VERSION, sizeof(z_stream)) - -#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) - struct internal_state {int dummy;}; /* hack for buggy compilers */ +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); #endif +#if !defined(ZLIB_INTERNAL) && _FILE_OFFSET_BITS-0 == 64 && _LFS64_LARGEFILE-0 +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# ifdef _LARGEFILE64_SOURCE + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ ZEXTERN const char * ZEXPORT zError OF((int)); -ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); #ifdef __cplusplus } diff --git a/lib/3rdparty/zlib/zlib.rbuild b/lib/3rdparty/zlib/zlib.rbuild index 27082adfacb..c10e794ee05 100644 --- a/lib/3rdparty/zlib/zlib.rbuild +++ b/lib/3rdparty/zlib/zlib.rbuild @@ -1,34 +1,40 @@ - + . adler32.c compress.c crc32.c - gzio.c - uncompr.c deflate.c - trees.c - zutil.c - inflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c infback.c - inftrees.c inffast.c + inflate.c + inftrees.c + trees.c + uncompr.c + zutil.c - + . adler32.c compress.c crc32.c - gzio.c - uncompr.c deflate.c - trees.c - zutil.c - inflate.c + gzclose.c + gzlib.c + gzread.c + gzwrite.c infback.c - inftrees.c inffast.c + inflate.c + inftrees.c + trees.c + uncompr.c + zutil.c diff --git a/lib/3rdparty/zlib/zutil.c b/lib/3rdparty/zlib/zutil.c index d55f5948a37..e2880ea35d0 100644 --- a/lib/3rdparty/zlib/zutil.c +++ b/lib/3rdparty/zlib/zutil.c @@ -1,5 +1,5 @@ /* zutil.c -- target dependent utility functions for the compression library - * Copyright (C) 1995-2005 Jean-loup Gailly. + * Copyright (C) 1995-2005, 2010 Jean-loup Gailly. * For conditions of distribution and use, see copyright notice in zlib.h */ @@ -34,25 +34,25 @@ uLong ZEXPORT zlibCompileFlags() uLong flags; flags = 0; - switch (sizeof(uInt)) { + switch ((int)(sizeof(uInt))) { case 2: break; case 4: flags += 1; break; case 8: flags += 2; break; default: flags += 3; } - switch (sizeof(uLong)) { + switch ((int)(sizeof(uLong))) { case 2: break; case 4: flags += 1 << 2; break; case 8: flags += 2 << 2; break; default: flags += 3 << 2; } - switch (sizeof(voidpf)) { + switch ((int)(sizeof(voidpf))) { case 2: break; case 4: flags += 1 << 4; break; case 8: flags += 2 << 4; break; default: flags += 3 << 4; } - switch (sizeof(z_off_t)) { + switch ((int)(sizeof(z_off_t))) { case 2: break; case 4: flags += 1 << 6; break; case 8: flags += 2 << 6; break; @@ -237,7 +237,7 @@ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) return buf; } -void zcfree (voidpf opaque, voidpf ptr) +void zcfree (voidpf opaque, voidpf ptr) { int n; if (*(ush*)&ptr != 0) { /* object < 64K */ @@ -272,13 +272,13 @@ void zcfree (voidpf opaque, voidpf ptr) # define _hfree hfree #endif -voidpf zcalloc (voidpf opaque, unsigned items, unsigned size) +voidpf zcalloc (voidpf opaque, uInt items, uInt size) { if (opaque) opaque = 0; /* to make compiler happy */ return _halloc((long)items, size); } -void zcfree (voidpf opaque, voidpf ptr) +void zcfree (voidpf opaque, voidpf ptr) { if (opaque) opaque = 0; /* to make compiler happy */ _hfree(ptr); @@ -307,7 +307,7 @@ voidpf zcalloc (opaque, items, size) (voidpf)calloc(items, size); } -void zcfree (opaque, ptr) +void zcfree (opaque, ptr) voidpf opaque; voidpf ptr; { diff --git a/lib/3rdparty/zlib/zutil.h b/lib/3rdparty/zlib/zutil.h index b7d5eff81b6..69f84f17ccd 100644 --- a/lib/3rdparty/zlib/zutil.h +++ b/lib/3rdparty/zlib/zutil.h @@ -1,5 +1,5 @@ /* zutil.h -- internal interface and configuration of the compression library - * 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 */ @@ -13,31 +13,21 @@ #ifndef ZUTIL_H #define ZUTIL_H -#define ZLIB_INTERNAL +#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) +# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) +#else +# define ZLIB_INTERNAL +#endif + #include "zlib.h" #ifdef STDC -# ifndef _WIN32_WCE +# if !(defined(_WIN32_WCE) && defined(_MSC_VER)) # include # endif # include # include #endif -#ifdef NO_ERRNO_H -# ifdef _WIN32_WCE - /* The Microsoft C Run-Time Library for Windows CE doesn't have - * errno. We define it as a global variable to simplify porting. - * Its value is always 0 and should not be used. We rename it to - * avoid conflict with other libraries that use the same workaround. - */ -# define errno z_errno -# endif - extern int errno; -#else -# ifndef _WIN32_WCE -# include -# endif -#endif #ifndef local # define local static @@ -89,7 +79,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32)) # define OS_CODE 0x00 # if defined(__TURBOC__) || defined(__BORLANDC__) -# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) +# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__)) /* Allow compilation with ANSI keywords only enabled */ void _Cdecl farfree( void *block ); void *_Cdecl farmalloc( unsigned long nbytes ); @@ -118,7 +108,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #ifdef OS2 # define OS_CODE 0x06 # ifdef M_I86 - #include +# include # endif #endif @@ -151,7 +141,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define fdopen(fd,mode) NULL /* No fdopen() */ #endif -#if (defined(_MSC_VER) && (_MSC_VER > 600)) +#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX # if defined(_WIN32_WCE) # define fdopen(fd,mode) NULL /* No fdopen() */ # ifndef _PTRDIFF_T_DEFINED @@ -163,6 +153,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # endif #endif +#if defined(__BORLANDC__) + #pragma warn -8004 + #pragma warn -8008 + #pragma warn -8066 +#endif + +/* provide prototypes for these when building zlib without LFS */ +#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +#endif + /* common defaults */ #ifndef OS_CODE @@ -197,7 +199,9 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # ifdef WIN32 /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ # if !defined(vsnprintf) && !defined(NO_vsnprintf) -# define vsnprintf _vsnprintf +# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) +# define vsnprintf _vsnprintf +# endif # endif # endif # ifdef __SASC @@ -232,16 +236,16 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ # define zmemzero(dest, len) memset(dest, 0, len) # endif #else - extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); - extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); - extern void zmemzero OF((Bytef* dest, uInt len)); + void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len)); + int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len)); + void zmemzero OF((Bytef* dest, uInt len)); #endif /* Diagnostic functions */ #ifdef DEBUG # include - extern int z_verbose; - extern void z_error OF((char *m)); + extern int _verbose; + extern void z_error OF((char *m)); # define Assert(cond,msg) {if(!(cond)) z_error(msg);} # define Trace(x) {if (z_verbose>=0) fprintf x ;} # define Tracev(x) {if (z_verbose>0) fprintf x ;} @@ -258,8 +262,9 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */ #endif -voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size)); -void zcfree OF((voidpf opaque, voidpf ptr)); +voidpf zcalloc OF((voidpf opaque, unsigned items, + unsigned size)); +void zcfree OF((voidpf opaque, voidpf ptr)); #define ZALLOC(strm, items, size) \ (*((strm)->zalloc))((strm)->opaque, (items), (size)) diff --git a/lib/drivers/ip/transport/tcp/tcp.c b/lib/drivers/ip/transport/tcp/tcp.c index 187c9a56cc7..e8ea9bb290f 100644 --- a/lib/drivers/ip/transport/tcp/tcp.c +++ b/lib/drivers/ip/transport/tcp/tcp.c @@ -25,7 +25,6 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) NTSTATUS Status; PIRP Irp; PMDL Mdl; - ULONG SocketError = 0; KIRQL OldIrql; PTCP_COMPLETION_ROUTINE Complete; @@ -35,69 +34,6 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) TI_DbgPrint(MID_TRACE,("Handling signalled state on %x (%x)\n", Connection, Connection->SocketContext)); - if( Connection->SignalState & SEL_FIN ) { - TI_DbgPrint(DEBUG_TCP, ("EOF From socket\n")); - - /* If OskitTCP initiated the disconnect, try to read the socket error that occurred */ - if (Connection->SocketContext) - SocketError = TCPTranslateError(OskitTCPGetSocketError(Connection->SocketContext)); - - /* Default to STATUS_CANCELLED if we initiated the disconnect or no socket error was reported */ - if (!Connection->SocketContext || !SocketError) - SocketError = STATUS_CANCELLED; - - while (!IsListEmpty(&Connection->ReceiveRequest)) - { - Entry = RemoveHeadList( &Connection->ReceiveRequest ); - - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - - Bucket->Status = SocketError; - Bucket->Information = 0; - - InsertTailList(&Connection->CompletionQueue, &Bucket->Entry); - } - - while (!IsListEmpty(&Connection->SendRequest)) - { - Entry = RemoveHeadList( &Connection->SendRequest ); - - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - - Bucket->Status = SocketError; - Bucket->Information = 0; - - InsertTailList(&Connection->CompletionQueue, &Bucket->Entry); - } - - while (!IsListEmpty(&Connection->ListenRequest)) - { - Entry = RemoveHeadList( &Connection->ListenRequest ); - - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - - Bucket->Status = SocketError; - Bucket->Information = 0; - DereferenceObject(Bucket->AssociatedEndpoint); - - InsertTailList(&Connection->CompletionQueue, &Bucket->Entry); - } - - while (!IsListEmpty(&Connection->ConnectRequest)) - { - Entry = RemoveHeadList( &Connection->ConnectRequest ); - - Bucket = CONTAINING_RECORD( Entry, TDI_BUCKET, Entry ); - - Bucket->Status = SocketError; - Bucket->Information = 0; - - InsertTailList(&Connection->CompletionQueue, &Bucket->Entry); - } - - Connection->SignalState = SEL_FIN; - } - /* Things that can happen when we try the initial connection */ if( Connection->SignalState & SEL_CONNECT ) { while (!IsListEmpty(&Connection->ConnectRequest)) { @@ -140,11 +76,11 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) TI_DbgPrint(DEBUG_TCP,("Socket: Status: %x\n")); - if( Status == STATUS_PENDING ) { + if( Status == STATUS_PENDING && !(Connection->SignalState & SEL_FIN) ) { InsertHeadList( &Connection->ListenRequest, &Bucket->Entry ); break; } else { - Bucket->Status = Status; + Bucket->Status = (Status == STATUS_PENDING) ? STATUS_CANCELLED : Status; Bucket->Information = 0; DereferenceObject(Bucket->AssociatedEndpoint); @@ -194,7 +130,7 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Received)); - if( Status == STATUS_PENDING ) { + if( Status == STATUS_PENDING && !(Connection->SignalState & SEL_FIN) ) { InsertHeadList( &Connection->ReceiveRequest, &Bucket->Entry ); break; } else { @@ -202,8 +138,8 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) ("Completing Receive request: %x %x\n", Bucket->Request, Status)); - Bucket->Status = Status; - Bucket->Information = (Status == STATUS_SUCCESS) ? Received : 0; + Bucket->Status = (Status == STATUS_PENDING) ? STATUS_CANCELLED : Status; + Bucket->Information = (Bucket->Status == STATUS_SUCCESS) ? Received : 0; InsertTailList(&Connection->CompletionQueue, &Bucket->Entry); } @@ -248,7 +184,7 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) TI_DbgPrint(DEBUG_TCP,("TCP Bytes: %d\n", Sent)); - if( Status == STATUS_PENDING ) { + if( Status == STATUS_PENDING && !(Connection->SignalState & SEL_FIN) ) { InsertHeadList( &Connection->SendRequest, &Bucket->Entry ); break; } else { @@ -256,8 +192,8 @@ VOID HandleSignalledConnection(PCONNECTION_ENDPOINT Connection) ("Completing Send request: %x %x\n", Bucket->Request, Status)); - Bucket->Status = Status; - Bucket->Information = (Status == STATUS_SUCCESS) ? Sent : 0; + Bucket->Status = (Status == STATUS_PENDING) ? STATUS_CANCELLED : Status; + Bucket->Information = (Bucket->Status == STATUS_SUCCESS) ? Sent : 0; InsertTailList(&Connection->CompletionQueue, &Bucket->Entry); } @@ -574,10 +510,11 @@ NTSTATUS TCPTranslateError( int OskitError ) { switch( OskitError ) { case 0: Status = STATUS_SUCCESS; break; case OSK_EADDRNOTAVAIL: Status = STATUS_INVALID_ADDRESS; break; + case OSK_EADDRINUSE: Status = STATUS_ADDRESS_ALREADY_EXISTS; break; case OSK_EAFNOSUPPORT: Status = STATUS_INVALID_CONNECTION; break; case OSK_ECONNREFUSED: Status = STATUS_REMOTE_NOT_LISTENING; break; - case OSK_ECONNRESET: - case OSK_ECONNABORTED: Status = STATUS_REMOTE_DISCONNECT; break; + case OSK_ECONNRESET: Status = STATUS_REMOTE_DISCONNECT; break; + case OSK_ECONNABORTED: Status = STATUS_LOCAL_DISCONNECT; break; case OSK_EWOULDBLOCK: case OSK_EINPROGRESS: Status = STATUS_PENDING; break; case OSK_EINVAL: Status = STATUS_INVALID_PARAMETER; break; @@ -736,7 +673,7 @@ NTSTATUS TCPClose Connection->SocketContext = NULL; /* Don't try to close again if the other side closed us already */ - if (Connection->SignalState != SEL_FIN) + if (!(Connection->SignalState & SEL_FIN)) { /* We need to close here otherwise oskit will never indicate * SEL_FIN and we will never fully close the connection */ diff --git a/lib/drivers/oskittcp/oskittcp/rtsock.c b/lib/drivers/oskittcp/oskittcp/rtsock.c index 5654b7b41f6..b7caadc5eab 100644 --- a/lib/drivers/oskittcp/oskittcp/rtsock.c +++ b/lib/drivers/oskittcp/oskittcp/rtsock.c @@ -277,7 +277,7 @@ route_output(m, so) #ifndef __REACTOS__ ifp = ifa->ifa_ifp; #else - ; + (void)0; #endif if (ifa) { register struct ifaddr *oifa = rt->rt_ifa; diff --git a/lib/drivers/sound/mmebuddy/auxiliary/auxMessage.c b/lib/drivers/sound/mmebuddy/auxiliary/auxMessage.c index f248a48e400..9cfa0d941e6 100644 --- a/lib/drivers/sound/mmebuddy/auxiliary/auxMessage.c +++ b/lib/drivers/sound/mmebuddy/auxiliary/auxMessage.c @@ -24,11 +24,11 @@ DWORD APIENTRY auxMessage( - DWORD DeviceId, - DWORD Message, - DWORD PrivateHandle, - DWORD Parameter1, - DWORD Parameter2) + UINT DeviceId, + UINT Message, + DWORD_PTR PrivateHandle, + DWORD_PTR Parameter1, + DWORD_PTR Parameter2) { MMRESULT Result = MMSYSERR_NOTSUPPORTED; diff --git a/lib/drivers/sound/mmebuddy/midi/midMessage.c b/lib/drivers/sound/mmebuddy/midi/midMessage.c index a99b6dc29ad..9e1a0ec24f6 100644 --- a/lib/drivers/sound/mmebuddy/midi/midMessage.c +++ b/lib/drivers/sound/mmebuddy/midi/midMessage.c @@ -24,11 +24,11 @@ DWORD APIENTRY midMessage( - DWORD DeviceId, - DWORD Message, - DWORD PrivateHandle, - DWORD Parameter1, - DWORD Parameter2) + UINT DeviceId, + UINT Message, + DWORD_PTR PrivateHandle, + DWORD_PTR Parameter1, + DWORD_PTR Parameter2) { MMRESULT Result = MMSYSERR_NOTSUPPORTED; diff --git a/lib/drivers/sound/mmebuddy/midi/modMessage.c b/lib/drivers/sound/mmebuddy/midi/modMessage.c index bde698719e4..febfca516b5 100644 --- a/lib/drivers/sound/mmebuddy/midi/modMessage.c +++ b/lib/drivers/sound/mmebuddy/midi/modMessage.c @@ -24,11 +24,11 @@ DWORD APIENTRY modMessage( - DWORD DeviceId, - DWORD Message, - DWORD PrivateHandle, - DWORD Parameter1, - DWORD Parameter2) + UINT DeviceId, + UINT Message, + DWORD_PTR PrivateHandle, + DWORD_PTR Parameter1, + DWORD_PTR Parameter2) { MMRESULT Result = MMSYSERR_NOTSUPPORTED; diff --git a/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c b/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c index 86e63773c0e..cf870540ba1 100644 --- a/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c +++ b/lib/drivers/sound/mmebuddy/mixer/mxdMessage.c @@ -20,10 +20,10 @@ MMRESULT MmeGetLineInfo( - IN DWORD Message, - IN DWORD PrivateHandle, - IN DWORD Parameter1, - IN DWORD Parameter2) + IN UINT Message, + IN DWORD_PTR PrivateHandle, + IN DWORD_PTR Parameter1, + IN DWORD_PTR Parameter2) { MMRESULT Result; PSOUND_DEVICE_INSTANCE SoundDeviceInstance; @@ -54,7 +54,7 @@ MmeGetLineInfo( MMRESULT MmeCloseMixerDevice( - IN DWORD PrivateHandle) + IN DWORD_PTR PrivateHandle) { MMRESULT Result; PSOUND_DEVICE_INSTANCE SoundDeviceInstance; @@ -122,7 +122,7 @@ MmeOpenMixerDevice( } /* Store the device instance pointer in the private handle - is DWORD safe here? */ - *PrivateHandle = (DWORD) SoundDeviceInstance; + *PrivateHandle = (DWORD_PTR) SoundDeviceInstance; /* Store the additional information we were given - FIXME: Need flags! */ SetSoundDeviceInstanceMmeData(SoundDeviceInstance, @@ -151,11 +151,11 @@ MmeOpenMixerDevice( DWORD APIENTRY mxdMessage( - DWORD DeviceId, - DWORD Message, - DWORD PrivateHandle, - DWORD Parameter1, - DWORD Parameter2) + UINT DeviceId, + UINT Message, + DWORD_PTR PrivateHandle, + DWORD_PTR Parameter1, + DWORD_PTR Parameter2) { MMRESULT Result = MMSYSERR_NOTSUPPORTED; diff --git a/lib/drivers/sound/mmebuddy/mmewrap.c b/lib/drivers/sound/mmebuddy/mmewrap.c index 63f3e6f5c5a..960c4839a50 100644 --- a/lib/drivers/sound/mmebuddy/mmewrap.c +++ b/lib/drivers/sound/mmebuddy/mmewrap.c @@ -22,7 +22,7 @@ MMRESULT MmeSetState( - IN DWORD PrivateHandle, + IN DWORD_PTR PrivateHandle, IN BOOL bStart) { MMRESULT Result; @@ -64,8 +64,8 @@ MmeSetState( VOID NotifyMmeClient( IN PSOUND_DEVICE_INSTANCE SoundDeviceInstance, - IN DWORD Message, - IN DWORD Parameter) + IN UINT Message, + IN DWORD_PTR Parameter) { SND_ASSERT( SoundDeviceInstance ); @@ -121,10 +121,10 @@ 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 Result; @@ -170,8 +170,8 @@ MmeOpenWaveDevice( return TranslateInternalMmResult(Result); } - /* Store the device instance pointer in the private handle - is DWORD safe here? */ - *PrivateHandle = (DWORD) SoundDeviceInstance; + /* Store the device instance pointer in the private handle */ + *PrivateHandle = (DWORD_PTR)SoundDeviceInstance; /* Store the additional information we were given - FIXME: Need flags! */ SetSoundDeviceInstanceMmeData(SoundDeviceInstance, @@ -195,7 +195,7 @@ MmeOpenWaveDevice( MMRESULT MmeCloseDevice( - IN DWORD PrivateHandle) + IN DWORD_PTR PrivateHandle) { MMRESULT Result; PSOUND_DEVICE_INSTANCE SoundDeviceInstance; @@ -235,7 +235,7 @@ MmeCloseDevice( MMRESULT MmeResetWavePlayback( - IN DWORD PrivateHandle) + IN DWORD_PTR PrivateHandle) { PSOUND_DEVICE_INSTANCE SoundDeviceInstance; @@ -284,7 +284,7 @@ MMRESULT MmeGetPosition( IN MMDEVICE_TYPE DeviceType, IN DWORD DeviceId, - IN DWORD PrivateHandle, + IN DWORD_PTR PrivateHandle, IN MMTIME* Time, IN DWORD Size) { diff --git a/lib/drivers/sound/mmebuddy/wave/header.c b/lib/drivers/sound/mmebuddy/wave/header.c index bf5b80b6496..b4d7fdcf119 100644 --- a/lib/drivers/sound/mmebuddy/wave/header.c +++ b/lib/drivers/sound/mmebuddy/wave/header.c @@ -359,5 +359,5 @@ CompleteWaveHeader( /* Safe to do this without thread protection, as we're done with the header */ NotifyMmeClient(SoundDeviceInstance, DeviceType == WAVE_OUT_DEVICE_TYPE ? WOM_DONE : WIM_DATA, - (DWORD) Header); + (DWORD_PTR)Header); } diff --git a/lib/drivers/sound/mmebuddy/wave/widMessage.c b/lib/drivers/sound/mmebuddy/wave/widMessage.c index ce1e4dffce3..47825aeccd9 100644 --- a/lib/drivers/sound/mmebuddy/wave/widMessage.c +++ b/lib/drivers/sound/mmebuddy/wave/widMessage.c @@ -25,11 +25,11 @@ DWORD APIENTRY widMessage( - DWORD DeviceId, - DWORD Message, - DWORD PrivateHandle, - DWORD Parameter1, - DWORD Parameter2) + UINT DeviceId, + UINT Message, + DWORD_PTR PrivateHandle, + DWORD_PTR Parameter1, + DWORD_PTR Parameter2) { MMRESULT Result = MMSYSERR_NOTSUPPORTED; @@ -72,7 +72,7 @@ widMessage( DeviceId, (LPWAVEOPENDESC) Parameter1, Parameter2, - (DWORD*) PrivateHandle); + (DWORD_PTR*) PrivateHandle); break; } diff --git a/lib/drivers/sound/mmebuddy/wave/wodMessage.c b/lib/drivers/sound/mmebuddy/wave/wodMessage.c index de579f32200..70bd6b70d05 100644 --- a/lib/drivers/sound/mmebuddy/wave/wodMessage.c +++ b/lib/drivers/sound/mmebuddy/wave/wodMessage.c @@ -34,11 +34,11 @@ MMRESULT HelloWorld(PSOUND_DEVICE_INSTANCE Instance, PVOID String) DWORD APIENTRY wodMessage( - DWORD DeviceId, - DWORD Message, - DWORD PrivateHandle, - DWORD Parameter1, - DWORD Parameter2) + UINT DeviceId, + UINT Message, + DWORD_PTR PrivateHandle, + DWORD_PTR Parameter1, + DWORD_PTR Parameter2) { MMRESULT Result = MMSYSERR_NOTSUPPORTED; @@ -69,7 +69,7 @@ wodMessage( DeviceId, (LPWAVEOPENDESC) Parameter1, Parameter2, - (DWORD*) PrivateHandle); + (DWORD_PTR*)PrivateHandle); break; } diff --git a/lib/drivers/sound/mment4/control.c b/lib/drivers/sound/mment4/control.c index 87a9a4f9d50..077620bf7ec 100644 --- a/lib/drivers/sound/mment4/control.c +++ b/lib/drivers/sound/mment4/control.c @@ -101,7 +101,7 @@ GetNt4SoundDeviceCapabilities( Result = GetSoundDeviceType(SoundDevice, &DeviceType); SND_ASSERT( Result == MMSYSERR_NOERROR ); - if ( ! MMSUCCESS(Result) ); + if ( ! MMSUCCESS(Result) ) return TranslateInternalMmResult(Result); /* Choose the appropriate IOCTL */ @@ -117,6 +117,7 @@ GetNt4SoundDeviceCapabilities( { /* FIXME - need to support AUX and mixer devices */ SND_ASSERT( FALSE ); + IoCtl = 0; } /* Get the capabilities information from the driver */ diff --git a/lib/drivers/sound/mmixer/controls.c b/lib/drivers/sound/mmixer/controls.c index 0b2e499f1d8..36794dfc69a 100644 --- a/lib/drivers/sound/mmixer/controls.c +++ b/lib/drivers/sound/mmixer/controls.c @@ -385,6 +385,8 @@ MMixerAddMixerSourceLine( SrcLine->Line.Target.wPid = MixerInfo->MixCaps.wPid; SrcLine->Line.Target.vDriverVersion = MixerInfo->MixCaps.vDriverVersion; InitializeListHead(&SrcLine->LineControlsExtraData); + + ASSERT(MixerInfo->MixCaps.szPname[MAXPNAMELEN-1] == L'\0'); wcscpy(SrcLine->Line.Target.szPname, MixerInfo->MixCaps.szPname); } diff --git a/lib/drivers/sound/mmixer/mixer.c b/lib/drivers/sound/mmixer/mixer.c index a05f2a77122..46e2c6d8711 100644 --- a/lib/drivers/sound/mmixer/mixer.c +++ b/lib/drivers/sound/mmixer/mixer.c @@ -472,6 +472,13 @@ MMixerInitialize( // enumeration has finished break; } + else + { + DPRINT1("Failed to enumerate device %lu\n", DeviceIndex); + + // TODO cleanup + return Status; + } } else { diff --git a/lib/rtl/actctx.c b/lib/rtl/actctx.c index 7960f587490..40883a8ff22 100644 --- a/lib/rtl/actctx.c +++ b/lib/rtl/actctx.c @@ -1578,6 +1578,7 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident { /* let's assume utf-8 for now */ int len; + WCHAR *new_buff; _SEH2_TRY { @@ -1591,20 +1592,19 @@ static NTSTATUS parse_manifest( struct actctx_loader* acl, struct assembly_ident _SEH2_END; DPRINT("len = %x\n", len); - WCHAR *new_buff; if (len == -1) { DPRINT1( "utf-8 conversion failed\n" ); return STATUS_SXS_CANT_GEN_ACTCTX; } - if (!(new_buff = RtlAllocateHeap( RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len * sizeof(WCHAR) ))) + if (!(new_buff = RtlAllocateHeap( RtlGetProcessHeap(), HEAP_ZERO_MEMORY, len))) return STATUS_NO_MEMORY; - mbstowcs( new_buff, buffer, len); + mbstowcs( new_buff, buffer, size); xmlbuf.ptr = new_buff; - DPRINT("Buffer %S\n", new_buff); - xmlbuf.end = xmlbuf.ptr + len; + + xmlbuf.end = xmlbuf.ptr + len / sizeof(WCHAR); status = parse_manifest_buffer( acl, assembly, ai, &xmlbuf ); RtlFreeHeap( RtlGetProcessHeap(), 0, new_buff ); diff --git a/lib/rtl/network.c b/lib/rtl/network.c index 356d3510fc4..e8b0d6b9fd5 100644 --- a/lib/rtl/network.c +++ b/lib/rtl/network.c @@ -103,9 +103,9 @@ RtlIpv4StringToAddressExA(IN PCHAR AddressString, */ NTSTATUS NTAPI -RtlIpv4StringToAddressW(IN PWCHAR String, - IN UCHAR Strict, - OUT PWCHAR Terminator, +RtlIpv4StringToAddressW(IN PCWSTR String, + IN BOOLEAN Strict, + OUT LPWSTR *Terminator, OUT struct in_addr *Addr) { UNIMPLEMENTED; diff --git a/lib/rtl/process.c b/lib/rtl/process.c index b8585b0fe6f..ae91e2423f7 100644 --- a/lib/rtl/process.c +++ b/lib/rtl/process.c @@ -5,6 +5,7 @@ * PURPOSE: Process functions * PROGRAMMER: Alex Ionescu (alex@relsoft.net) * Ariadne (ariadne@xs4all.nl) + * Eric Kohl */ /* INCLUDES ****************************************************************/ @@ -42,7 +43,7 @@ RtlpMapFile(PUNICODE_STRING ImageFileName, if (!NT_SUCCESS(Status)) { DPRINT1("Failed to read image file from disk\n"); - return(Status); + return Status; } /* Now create a section for this image */ @@ -93,7 +94,7 @@ RtlpInitEnvironment(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DPRINT1("Failed to reserve 1MB of space \n"); - return(Status); + return Status; } } @@ -117,7 +118,7 @@ RtlpInitEnvironment(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DPRINT1("Failed to allocate Environment Block\n"); - return(Status); + return Status; } /* Write the Environment Block */ @@ -143,7 +144,7 @@ RtlpInitEnvironment(HANDLE ProcessHandle, if (!NT_SUCCESS(Status)) { DPRINT1("Failed to allocate Parameter Block\n"); - return(Status); + return Status; } /* Write the Parameter Block */ @@ -244,7 +245,7 @@ RtlCreateUserProcess(IN PUNICODE_STRING ImageFileName, { DPRINT1("Could not create Kernel Process Object\n"); ZwClose(hSection); - return(Status); + return Status; } /* Get some information on the image */ @@ -258,7 +259,7 @@ RtlCreateUserProcess(IN PUNICODE_STRING ImageFileName, DPRINT1("Could not query Section Info\n"); ZwClose(ProcessInfo->ProcessHandle); ZwClose(hSection); - return(Status); + return Status; } /* Get some information about the process */ @@ -272,7 +273,7 @@ RtlCreateUserProcess(IN PUNICODE_STRING ImageFileName, DPRINT1("Could not query Process Info\n"); ZwClose(ProcessInfo->ProcessHandle); ZwClose(hSection); - return(Status); + return Status; } /* Create Process Environment */ @@ -311,22 +312,21 @@ PVOID NTAPI RtlEncodePointer(IN PVOID Pointer) { - ULONG Cookie; - NTSTATUS Status; + ULONG Cookie; + NTSTATUS Status; - Status = ZwQueryInformationProcess(NtCurrentProcess(), - ProcessCookie, - &Cookie, - sizeof(Cookie), - NULL); + Status = ZwQueryInformationProcess(NtCurrentProcess(), + ProcessCookie, + &Cookie, + sizeof(Cookie), + NULL); + if(!NT_SUCCESS(Status)) + { + DPRINT1("Failed to receive the process cookie! Status: 0x%lx\n", Status); + return Pointer; + } - if(!NT_SUCCESS(Status)) - { - DPRINT1("Failed to receive the process cookie! Status: 0x%lx\n", Status); - return Pointer; - } - - return (PVOID)((ULONG_PTR)Pointer ^ Cookie); + return (PVOID)((ULONG_PTR)Pointer ^ Cookie); } /* @@ -336,33 +336,59 @@ PVOID NTAPI RtlDecodePointer(IN PVOID Pointer) { - return RtlEncodePointer(Pointer); + return RtlEncodePointer(Pointer); } /* - * @unimplemented + * @implemented */ PVOID NTAPI RtlEncodeSystemPointer(IN PVOID Pointer) { - UNIMPLEMENTED; - return NULL; + return (PVOID)((ULONG_PTR)Pointer ^ SharedUserData->Cookie); } /* - * @unimplemented + * @implemented + * + * NOTES: + * Implementation based on the documentation from: + * http://www.geoffchappell.com/studies/windows/win32/ntdll/api/rtl/peb/setprocessiscritical.htm */ -NTSYSAPI -VOID +NTSTATUS NTAPI -RtlSetProcessIsCritical( - IN BOOLEAN NewValue, - OUT PBOOLEAN OldValue OPTIONAL, - IN BOOLEAN IsWinlogon) +RtlSetProcessIsCritical(IN BOOLEAN NewValue, + OUT PBOOLEAN OldValue OPTIONAL, + IN BOOLEAN NeedBreaks) { - //TODO - UNIMPLEMENTED; + ULONG BreakOnTermination = FALSE; + + if (OldValue) + *OldValue = FALSE; + + /* Fail, if the critical breaks flag is required but is not set */ + if (NeedBreaks == TRUE && + !(NtCurrentPeb()->NtGlobalFlag & FLG_ENABLE_SYSTEM_CRIT_BREAKS)) + return STATUS_UNSUCCESSFUL; + + if (OldValue) + { + /* Query and return the old break on termination flag for the process */ + ZwQueryInformationProcess(NtCurrentProcess(), + ProcessBreakOnTermination, + &BreakOnTermination, + sizeof(ULONG), + NULL); + *OldValue = (BOOLEAN)BreakOnTermination; + } + + /* Set the break on termination flag for the process */ + BreakOnTermination = NewValue; + return ZwSetInformationProcess(NtCurrentProcess(), + ProcessBreakOnTermination, + &BreakOnTermination, + sizeof(ULONG)); } ULONG diff --git a/lib/sdk/crt/math/i386/ldexp.c b/lib/sdk/crt/math/i386/ldexp.c index b240275ef95..327e72a27b8 100644 --- a/lib/sdk/crt/math/i386/ldexp.c +++ b/lib/sdk/crt/math/i386/ldexp.c @@ -21,24 +21,32 @@ #include -double ldexp (double __x, int __y); - -double ldexp (double __x, int __y) +double ldexp (double value, int exp) { - register double __val; + register double result; #ifdef __GNUC__ - __asm __volatile__ - ("fscale" - : "=t" (__val) : "0" (__x), "u" ((double) __y)); +#if defined(__clang__) + asm ("fild %[exp]\n" + "fscale\n" + "fstp %%st(1)\n" + : [result] "=t" (result) + : [value] "0" (value), [exp] "m" (exp)); #else - register double __dy = (double)__y; + asm ("fscale" + : "=t" (result) + : "0" (value), "u" ((double)exp) + : "1"); +#endif +#else /* !__GNUC__ */ + register double __dy = (double)exp; __asm { fld __dy - fld __x + fld value fscale - fstp __val + fstp result } -#endif /*__GNUC__*/ - return __val; +#endif /* !__GNUC__ */ + return result; } + diff --git a/lib/sdk/crt/misc/getargs.c b/lib/sdk/crt/misc/getargs.c index 1bdb409ab46..18672e6bd44 100644 --- a/lib/sdk/crt/misc/getargs.c +++ b/lib/sdk/crt/misc/getargs.c @@ -22,7 +22,7 @@ int __argc = 0; extern wchar_t **__winitenv; -char* strndup(char* name, size_t len) +char* strndup(char const* name, size_t len) { char *s = malloc(len + 1); if (s != NULL) diff --git a/lib/sdk/crt/process/_system.c b/lib/sdk/crt/process/_system.c index f6173db03c6..3f9712b5737 100644 --- a/lib/sdk/crt/process/_system.c +++ b/lib/sdk/crt/process/_system.c @@ -35,11 +35,14 @@ int system(const char *command) // system should return 0 if command is null and the shell is found if (command == NULL) { - if (szComSpec == NULL) - return 0; - else - return -1; - } + if (szComSpec == NULL) + return 0; + else + return 1; + } + + if (szComSpec == NULL) + return -1; // should return 127 or 0 ( MS ) if the shell is not found // __set_errno(ENOENT); diff --git a/lib/sdk/crt/signal/signal.c b/lib/sdk/crt/signal/signal.c index 6cfe3f64b5a..5dd6381c53d 100644 --- a/lib/sdk/crt/signal/signal.c +++ b/lib/sdk/crt/signal/signal.c @@ -42,7 +42,7 @@ __p_sig_fn_t signal(int sig, __p_sig_fn_t func) } // check with IsBadCodePtr - if ( func < (__p_sig_fn_t)4096 && func != SIG_DFL && func != SIG_IGN) + if ( (uintptr_t)func < 4096 && func != SIG_DFL && func != SIG_IGN) { __set_errno(EINVAL); return SIG_ERR; diff --git a/lib/sdk/crt/string/mbstowcs_nt.c b/lib/sdk/crt/string/mbstowcs_nt.c index 8ab1edd23e3..4b613368c3e 100644 --- a/lib/sdk/crt/string/mbstowcs_nt.c +++ b/lib/sdk/crt/string/mbstowcs_nt.c @@ -47,7 +47,7 @@ size_t mbstowcs (wchar_t *wcstr, const char *mbstr, size_t count) } Status = RtlMultiByteToUnicodeN (wcstr, - count, + count * sizeof(WCHAR), &Size, mbstr, Length); diff --git a/lib/sdk/crt/string/strset.c b/lib/sdk/crt/string/strset.c index e6c422d4f9c..29a72121197 100644 --- a/lib/sdk/crt/string/strset.c +++ b/lib/sdk/crt/string/strset.c @@ -1,14 +1,14 @@ /* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS system libraries - * FILE: lib/crt/?????? - * PURPOSE: Unknown + * FILE: lib/crt/strset.c + * PURPOSE: Implementation of _strnset and _strset * PROGRAMER: Unknown * UPDATE HISTORY: * 25/11/05: Added license header */ -#if defined(__GNUC__) +#if defined(__GNUC__) && !defined(__clang__) #define __int64 long long #endif diff --git a/media/fonts/DejaVuSans-Bold.ttf b/media/fonts/DejaVuSans-Bold.ttf index ec1a2ebaf24..7b29accc131 100644 Binary files a/media/fonts/DejaVuSans-Bold.ttf and b/media/fonts/DejaVuSans-Bold.ttf differ diff --git a/media/fonts/DejaVuSans-BoldOblique.ttf b/media/fonts/DejaVuSans-BoldOblique.ttf index 1a5576460d5..b5440d95e79 100644 Binary files a/media/fonts/DejaVuSans-BoldOblique.ttf and b/media/fonts/DejaVuSans-BoldOblique.ttf differ diff --git a/media/fonts/DejaVuSans-Oblique.ttf b/media/fonts/DejaVuSans-Oblique.ttf index becc5499273..e233295c464 100644 Binary files a/media/fonts/DejaVuSans-Oblique.ttf and b/media/fonts/DejaVuSans-Oblique.ttf differ diff --git a/media/fonts/DejaVuSans.ttf b/media/fonts/DejaVuSans.ttf index c1b19d87059..a36615b2081 100644 Binary files a/media/fonts/DejaVuSans.ttf and b/media/fonts/DejaVuSans.ttf differ diff --git a/media/fonts/DejaVuSansMono-Bold.ttf b/media/fonts/DejaVuSansMono-Bold.ttf index 32a8695f70c..98bb6f62e21 100644 Binary files a/media/fonts/DejaVuSansMono-Bold.ttf and b/media/fonts/DejaVuSansMono-Bold.ttf differ diff --git a/media/fonts/DejaVuSansMono-BoldOblique.ttf b/media/fonts/DejaVuSansMono-BoldOblique.ttf index 5e2ee0339c9..42bbcdee974 100644 Binary files a/media/fonts/DejaVuSansMono-BoldOblique.ttf and b/media/fonts/DejaVuSansMono-BoldOblique.ttf differ diff --git a/media/fonts/DejaVuSansMono-Oblique.ttf b/media/fonts/DejaVuSansMono-Oblique.ttf index 9789ea057c5..d6ab52298c1 100644 Binary files a/media/fonts/DejaVuSansMono-Oblique.ttf and b/media/fonts/DejaVuSansMono-Oblique.ttf differ diff --git a/media/fonts/DejaVuSansMono.ttf b/media/fonts/DejaVuSansMono.ttf index 6bc854ddae9..b464c52ade0 100644 Binary files a/media/fonts/DejaVuSansMono.ttf and b/media/fonts/DejaVuSansMono.ttf differ diff --git a/media/fonts/DejaVuSerif-Bold.ttf b/media/fonts/DejaVuSerif-Bold.ttf index aee1ae626fe..8c53b1a1124 100644 Binary files a/media/fonts/DejaVuSerif-Bold.ttf and b/media/fonts/DejaVuSerif-Bold.ttf differ diff --git a/media/fonts/DejaVuSerif-BoldItalic.ttf b/media/fonts/DejaVuSerif-BoldItalic.ttf index 1b55e27214e..688c2b70f71 100644 Binary files a/media/fonts/DejaVuSerif-BoldItalic.ttf and b/media/fonts/DejaVuSerif-BoldItalic.ttf differ diff --git a/media/fonts/DejaVuSerif-Italic.ttf b/media/fonts/DejaVuSerif-Italic.ttf index 4464868f753..b2ed04a1230 100644 Binary files a/media/fonts/DejaVuSerif-Italic.ttf and b/media/fonts/DejaVuSerif-Italic.ttf differ diff --git a/media/fonts/DejaVuSerif.ttf b/media/fonts/DejaVuSerif.ttf index 1f2c94fa01b..19eba334572 100644 Binary files a/media/fonts/DejaVuSerif.ttf and b/media/fonts/DejaVuSerif.ttf differ diff --git a/media/fonts/LiberationMono-Bold.ttf b/media/fonts/LiberationMono-Bold.ttf index 95de75300f7..c11a84dba71 100644 Binary files a/media/fonts/LiberationMono-Bold.ttf and b/media/fonts/LiberationMono-Bold.ttf differ diff --git a/media/fonts/LiberationMono-BoldItalic.ttf b/media/fonts/LiberationMono-BoldItalic.ttf index 11ec3e7793a..ef185adaabc 100644 Binary files a/media/fonts/LiberationMono-BoldItalic.ttf and b/media/fonts/LiberationMono-BoldItalic.ttf differ diff --git a/media/fonts/LiberationMono-Italic.ttf b/media/fonts/LiberationMono-Italic.ttf index 08f55d6367d..ce27ca7c250 100644 Binary files a/media/fonts/LiberationMono-Italic.ttf and b/media/fonts/LiberationMono-Italic.ttf differ diff --git a/media/fonts/LiberationMono-Regular.ttf b/media/fonts/LiberationMono-Regular.ttf index e3024a09d8c..a74d2277682 100644 Binary files a/media/fonts/LiberationMono-Regular.ttf and b/media/fonts/LiberationMono-Regular.ttf differ diff --git a/media/fonts/LiberationSans-Bold.ttf b/media/fonts/LiberationSans-Bold.ttf index 53200d956c9..f9ad862c37e 100644 Binary files a/media/fonts/LiberationSans-Bold.ttf and b/media/fonts/LiberationSans-Bold.ttf differ diff --git a/media/fonts/LiberationSans-BoldItalic.ttf b/media/fonts/LiberationSans-BoldItalic.ttf index d06deca60d1..b7b5b5b4476 100644 Binary files a/media/fonts/LiberationSans-BoldItalic.ttf and b/media/fonts/LiberationSans-BoldItalic.ttf differ diff --git a/media/fonts/LiberationSans-Italic.ttf b/media/fonts/LiberationSans-Italic.ttf index 07275adf6c1..b23254f6f41 100644 Binary files a/media/fonts/LiberationSans-Italic.ttf and b/media/fonts/LiberationSans-Italic.ttf differ diff --git a/media/fonts/LiberationSans-Regular.ttf b/media/fonts/LiberationSans-Regular.ttf index 09fac2ff94a..9d557bbb7b8 100644 Binary files a/media/fonts/LiberationSans-Regular.ttf and b/media/fonts/LiberationSans-Regular.ttf differ diff --git a/media/fonts/LiberationSerif-Bold.ttf b/media/fonts/LiberationSerif-Bold.ttf index 3a4ab92ac48..f45b38205d3 100644 Binary files a/media/fonts/LiberationSerif-Bold.ttf and b/media/fonts/LiberationSerif-Bold.ttf differ diff --git a/media/fonts/LiberationSerif-BoldItalic.ttf b/media/fonts/LiberationSerif-BoldItalic.ttf index dc75de89c0f..b0ca8c6dc76 100644 Binary files a/media/fonts/LiberationSerif-BoldItalic.ttf and b/media/fonts/LiberationSerif-BoldItalic.ttf differ diff --git a/media/fonts/LiberationSerif-Italic.ttf b/media/fonts/LiberationSerif-Italic.ttf index d92b5e39292..006db7e16e1 100644 Binary files a/media/fonts/LiberationSerif-Italic.ttf and b/media/fonts/LiberationSerif-Italic.ttf differ diff --git a/media/fonts/LiberationSerif-Regular.ttf b/media/fonts/LiberationSerif-Regular.ttf index d100691a255..394c75c1df9 100644 Binary files a/media/fonts/LiberationSerif-Regular.ttf and b/media/fonts/LiberationSerif-Regular.ttf differ diff --git a/ntoskrnl/config/cmkcbncb.c b/ntoskrnl/config/cmkcbncb.c index a26de07cf1b..a123a3cee56 100644 --- a/ntoskrnl/config/cmkcbncb.c +++ b/ntoskrnl/config/cmkcbncb.c @@ -234,7 +234,9 @@ CmpGetNameControlBlock(IN PUNICODE_STRING NodeName) if (Found) { /* Reference it */ + ASSERT(Ncb->RefCount != 0xFFFF); Ncb->RefCount++; + break; } } @@ -320,6 +322,7 @@ CmpDereferenceNameControlBlockWithLock(IN PCM_NAME_CONTROL_BLOCK Ncb) CmpAcquireNcbLockExclusiveByKey(ConvKey); /* Decrease the reference count */ + ASSERT(Ncb->RefCount >= 1); if (!(--Ncb->RefCount)) { /* Find the NCB in the table */ @@ -579,7 +582,7 @@ CmpDereferenceKeyControlBlock(IN PCM_KEY_CONTROL_BLOCK Kcb) NewRefCount = OldRefCount - 1; /* Check if we still have references */ - if( (NewRefCount & 0xFFFF) > 0) + if ((NewRefCount & 0xFFFF) > 0) { /* Do the dereference */ if (InterlockedCompareExchange((PLONG)&Kcb->RefCount, diff --git a/ntoskrnl/ex/fastinterlck.c b/ntoskrnl/ex/fastinterlck.c index e98400aedc4..d16968a0ea0 100644 --- a/ntoskrnl/ex/fastinterlck.c +++ b/ntoskrnl/ex/fastinterlck.c @@ -255,7 +255,7 @@ ExInterlockedPopEntryList(IN PSINGLE_LIST_ENTRY ListHead, KIRQL OldIrql; PSINGLE_LIST_ENTRY OldHead = NULL; KeAcquireSpinLock(Lock, &OldIrql); - if (!ListHead->Next) OldHead = PopEntryList(ListHead); + OldHead = PopEntryList(ListHead); KeReleaseSpinLock(Lock, OldIrql); return OldHead; } @@ -269,7 +269,8 @@ ExInterlockedPushEntryList(IN PSINGLE_LIST_ENTRY ListHead, KIRQL OldIrql; PSINGLE_LIST_ENTRY OldHead = NULL; KeAcquireSpinLock(Lock, &OldIrql); - if (!ListHead->Next) OldHead = PushEntryList(ListHead, ListEntry); + OldHead = ListHead->Next; + PushEntryList(ListHead, ListEntry); KeReleaseSpinLock(Lock, OldIrql); return OldHead; } diff --git a/ntoskrnl/include/internal/amd64/ke.h b/ntoskrnl/include/internal/amd64/ke.h index 2e43edc248d..9b5340ce6e9 100644 --- a/ntoskrnl/include/internal/amd64/ke.h +++ b/ntoskrnl/include/internal/amd64/ke.h @@ -116,6 +116,12 @@ extern ULONG KeI386CpuStep; #define KeGetContextSwitches(Prcb) \ (Prcb->KeContextSwitches) +// +// Macro to get the second level cache size field name which differs between +// CISC and RISC architectures, as the former has unified I/D cache +// +#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelCacheSize + #define KeGetExceptionFrame(Thread) \ (PKEXCEPTION_FRAME)((ULONG_PTR)KeGetTrapFrame(Thread) - \ sizeof(KEXCEPTION_FRAME)) @@ -157,6 +163,52 @@ KiRundownThread(IN PKTHREAD Thread) #endif } +/* Registers an interrupt handler with an IDT vector */ +FORCEINLINE +VOID +KeRegisterInterruptHandler(IN ULONG Vector, + IN PVOID Handler) +{ + UCHAR Entry; + PKIDTENTRY64 Idt; + + /* Get the entry from the HAL */ + Entry = HalVectorToIDTEntry(Vector); + + /* Now set the data */ + Idt = &KeGetPcr()->IdtBase[Entry]; + Idt->OffsetLow = (ULONG_PTR)Handler & 0xffff; + Idt->OffsetMiddle = ((ULONG_PTR)Handler >> 16) & 0xffff; + Idt->OffsetHigh = (ULONG_PTR)Handler >> 32; + Idt->Selector = KGDT64_R0_CODE; + Idt->IstIndex = 0; + Idt->Type = 0x0e; + Idt->Dpl = 0; + Idt->Present = 1; + Idt->Reserved0 = 0; + Idt->Reserved1 = 0; +} + +/* Returns the registered interrupt handler for a given IDT vector */ +FORCEINLINE +PVOID +KeQueryInterruptHandler(IN ULONG Vector) +{ + UCHAR Entry; + PKIDTENTRY64 Idt; + + /* Get the entry from the HAL */ + Entry = HalVectorToIDTEntry(Vector); + + /* Get the IDT entry */ + Idt = &KeGetPcr()->IdtBase[Entry]; + + /* Return the address */ + return (PVOID)((ULONG64)Idt->OffsetHigh << 32 | + (ULONG64)Idt->OffsetMiddle << 16 | + (ULONG64)Idt->OffsetLow); +} + VOID FORCEINLINE KiEndInterrupt(IN KIRQL Irql, diff --git a/ntoskrnl/include/internal/amd64/mm.h b/ntoskrnl/include/internal/amd64/mm.h index 6f0b2fd390c..515f7290146 100644 --- a/ntoskrnl/include/internal/amd64/mm.h +++ b/ntoskrnl/include/internal/amd64/mm.h @@ -112,6 +112,8 @@ MiIsPdeForAddressValid(PVOID Address) #define ADDR_TO_PDE_OFFSET(v) ((((ULONG_PTR)(v)) / (512 * PAGE_SIZE))) #define ADDR_TO_PTE_OFFSET(v) ((((ULONG_PTR)(v)) % (512 * PAGE_SIZE)) / PAGE_SIZE) +#define MiGetPdeOffset ADDR_TO_PDE_OFFSET + #define VAtoPXI(va) ((((ULONG64)va) >> PXI_SHIFT) & 0x1FF) #define VAtoPPI(va) ((((ULONG64)va) >> PPI_SHIFT) & 0x1FF) #define VAtoPDI(va) ((((ULONG64)va) >> PDI_SHIFT) & 0x1FF) diff --git a/ntoskrnl/include/internal/arm/ke.h b/ntoskrnl/include/internal/arm/ke.h index 80fee0a7e19..b5b8fe7f5d3 100644 --- a/ntoskrnl/include/internal/arm/ke.h +++ b/ntoskrnl/include/internal/arm/ke.h @@ -55,6 +55,12 @@ #define KeGetContextSwitches(Prcb) \ CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches +// +// Macro to get the second level cache size field name which differs between +// CISC and RISC architectures, as the former has unified I/D cache +// +#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelDcacheSize + // // Returns the Interrupt State from a Trap Frame. // ON = TRUE, OFF = FALSE diff --git a/ntoskrnl/include/internal/arm/mm.h b/ntoskrnl/include/internal/arm/mm.h index 67eae35e1a5..03bb7bf1372 100644 --- a/ntoskrnl/include/internal/arm/mm.h +++ b/ntoskrnl/include/internal/arm/mm.h @@ -1,10 +1,6 @@ #pragma once -// -// Number of bits corresponding to the area that a PDE entry represents (1MB) -// #define PDE_SHIFT 20 -#define PDE_SIZE (1 << PDE_SHIFT) // // Number of bits corresponding to the area that a coarse page table entry represents (4KB) diff --git a/ntoskrnl/include/internal/i386/ke.h b/ntoskrnl/include/internal/i386/ke.h index 701688ead1f..bc5f293e482 100644 --- a/ntoskrnl/include/internal/i386/ke.h +++ b/ntoskrnl/include/internal/i386/ke.h @@ -59,6 +59,12 @@ #define KeGetContextSwitches(Prcb) \ CONTAINING_RECORD(Prcb, KIPCR, PrcbData)->ContextSwitches +// +// Macro to get the second level cache size field name which differs between +// CISC and RISC architectures, as the former has unified I/D cache +// +#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelCacheSize + // // Returns the Interrupt State from a Trap Frame. // ON = TRUE, OFF = FALSE @@ -774,8 +780,7 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack) VOID NTAPI KiSystemStartupBootStack(VOID); __asm { - mov ecx, InitialStack - mov esp, ecx + mov esp, InitialStack sub esp, (NPX_FRAME_LENGTH + KTRAP_FRAME_ALIGN + KTRAP_FRAME_LENGTH) push (CR0_EM | CR0_TS | CR0_MP) jmp KiSystemStartupBootStack @@ -785,6 +790,30 @@ KiSwitchToBootStack(IN ULONG_PTR InitialStack) #endif } +// +// Emits the iret instruction for C code +// +DECLSPEC_NORETURN +VOID +FORCEINLINE +KiIret(VOID) +{ +#if defined(__GNUC__) + __asm__ __volatile__ + ( + "iret\n" + ); +#elif defined(_MSC_VER) + __asm + { + iret + } +#else +#error Unsupported compiler +#endif + UNREACHABLE; +} + // // Normally this is done by the HAL, but on x86 as an optimization, the kernel // initiates the end by calling back into the HAL and exiting the trap here. diff --git a/ntoskrnl/include/internal/i386/mm.h b/ntoskrnl/include/internal/i386/mm.h index 68f312a6f24..edd86bbaab4 100644 --- a/ntoskrnl/include/internal/i386/mm.h +++ b/ntoskrnl/include/internal/i386/mm.h @@ -38,6 +38,8 @@ PULONG MmGetPageDirectory(VOID); #define ADDR_TO_PDE_OFFSET(v) ((((ULONG)(v)) / (1024 * PAGE_SIZE))) #define ADDR_TO_PTE_OFFSET(v) ((((ULONG)(v)) % (1024 * PAGE_SIZE)) / PAGE_SIZE) +#define MiGetPdeOffset ADDR_TO_PDE_OFFSET + /* Easy accessing PFN in PTE */ #define PFN_FROM_PTE(v) ((v)->u.Hard.PageFrameNumber) diff --git a/ntoskrnl/include/internal/io.h b/ntoskrnl/include/internal/io.h index 9398ef1d7ff..326f19c4dc6 100644 --- a/ntoskrnl/include/internal/io.h +++ b/ntoskrnl/include/internal/io.h @@ -496,9 +496,7 @@ typedef struct _DEVICETREE_TRAVERSE_CONTEXT // ULONG NTAPI -IopCalculateResourceListSize( - IN PCM_RESOURCE_LIST ResourceList -); +PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList); NTSTATUS NTAPI diff --git a/ntoskrnl/include/internal/mm.h b/ntoskrnl/include/internal/mm.h index db7003d1438..d8c61786f3f 100644 --- a/ntoskrnl/include/internal/mm.h +++ b/ntoskrnl/include/internal/mm.h @@ -364,7 +364,7 @@ typedef struct _MMPFN } u4; } MMPFN, *PMMPFN; -extern PMMPFN MmPfnDatabase[2]; +extern PMMPFN MmPfnDatabase; typedef struct _MMPFNLIST { @@ -1095,7 +1095,7 @@ MiGetPfnEntry(IN PFN_TYPE Pfn) if ((MiPfnBitMap.Buffer) && !(RtlTestBit(&MiPfnBitMap, Pfn))) return NULL; /* Get the entry */ - Page = &MmPfnDatabase[0][Pfn]; + Page = &MmPfnDatabase[Pfn]; /* Return it */ return Page; @@ -1108,7 +1108,7 @@ MiGetPfnEntryIndex(IN PMMPFN Pfn1) // // This will return the Page Frame Number (PFN) from the MMPFN // - return Pfn1 - MmPfnDatabase[0]; + return Pfn1 - MmPfnDatabase; } PFN_TYPE diff --git a/ntoskrnl/include/internal/powerpc/ke.h b/ntoskrnl/include/internal/powerpc/ke.h index 87f48fde67a..ec19a3f1332 100644 --- a/ntoskrnl/include/internal/powerpc/ke.h +++ b/ntoskrnl/include/internal/powerpc/ke.h @@ -41,6 +41,12 @@ extern ULONG KePPCCacheAlignment; //#define KD_BREAKPOINT_SIZE //#define KD_BREAKPOINT_VALUE +// +// Macro to get the second level cache size field name which differs between +// CISC and RISC architectures, as the former has unified I/D cache +// +#define KiGetSecondLevelDCacheSize() ((PKIPCR)KeGetPcr())->SecondLevelDcacheSize + // // Macros for getting and setting special purpose registers in portable code // diff --git a/ntoskrnl/include/internal/ps_i.h b/ntoskrnl/include/internal/ps_i.h index 75a4994f24a..13251f8e901 100644 --- a/ntoskrnl/include/internal/ps_i.h +++ b/ntoskrnl/include/internal/ps_i.h @@ -249,9 +249,9 @@ static const INFORMATION_CLASS_INFO PsProcessInfoClass[] = /* ProcessBreakOnTermination */ IQS_SAME ( - UCHAR, - UCHAR, - 0 + ULONG, + ULONG, + ICIF_QUERY | ICIF_SET ), /* ProcessDebugObjectHandle */ diff --git a/ntoskrnl/include/internal/trap_x.h b/ntoskrnl/include/internal/trap_x.h index 3da69917d70..0d61dd6f78b 100644 --- a/ntoskrnl/include/internal/trap_x.h +++ b/ntoskrnl/include/internal/trap_x.h @@ -8,7 +8,7 @@ #pragma once -//#define TRAP_DEBUG 1 +#define TRAP_DEBUG 0 // // Unreachable code hint for GCC 4.5.x, older GCC versions, and MSVC @@ -81,7 +81,7 @@ KiDumpTrapFrame(IN PKTRAP_FRAME TrapFrame) DbgPrint("V86Gs: %x\n", TrapFrame->V86Gs); } -#ifdef TRAP_DEBUG +#if TRAP_DEBUG VOID FORCEINLINE KiFillTrapFrameDebug(IN PKTRAP_FRAME TrapFrame) @@ -168,7 +168,7 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, 0, 0); } -#if 0 + /* Make sure we're not attached and that APCs are not disabled */ if ((KeGetCurrentThread()->ApcStateIndex != CurrentApcEnvironment) || (KeGetCurrentThread()->CombinedApcDisable != 0)) @@ -180,7 +180,6 @@ KiExitSystemCallDebugChecks(IN ULONG SystemCall, KeGetCurrentThread()->CombinedApcDisable, 0); } -#endif } } #else @@ -200,9 +199,11 @@ DECLSPEC_NORETURN VOID FASTCALL KiTrapReturn(IN PKTRAP_FRAME TrapFrame); DECLSPEC_NORETURN VOID FASTCALL KiTrapReturnNoSegments(IN PKTRAP_FRAME TrapFrame); typedef +DECLSPEC_NORETURN VOID -(FASTCALL -*PFAST_SYSTEM_CALL_EXIT)(IN PKTRAP_FRAME TrapFrame); +(FASTCALL *PFAST_SYSTEM_CALL_EXIT)( + IN PKTRAP_FRAME TrapFrame +); extern PFAST_SYSTEM_CALL_EXIT KiFastCallExitHandler; @@ -222,7 +223,7 @@ KiExitV86Trap(IN PKTRAP_FRAME TrapFrame) while (TRUE) { /* Return if this isn't V86 mode anymore */ - if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame);; + if (!(TrapFrame->EFlags & EFLAGS_V86_MASK)) KiEoiHelper(TrapFrame); /* Turn off the alerted state for kernel mode */ Thread->Alerted[KernelMode] = FALSE; diff --git a/ntoskrnl/io/iomgr/irp.c b/ntoskrnl/io/iomgr/irp.c index 0863f58907b..d7e4ed2741f 100644 --- a/ntoskrnl/io/iomgr/irp.c +++ b/ntoskrnl/io/iomgr/irp.c @@ -1217,15 +1217,22 @@ IofCompleteRequest(IN PIRP Irp, ErrorCode = PtrToUlong(LastStackPtr->Parameters.Others.Argument4); } - /* Get the Current Stack */ - StackPtr = IoGetCurrentIrpStackLocation(Irp); - - /* Loop the Stacks and complete the IRPs */ - do + /* + * Start the loop with the current stack and point the IRP to the next stack + * and then keep incrementing the stack as we loop through. The IRP should + * always point to the next stack location w.r.t the one currently being + * analyzed, so completion routine code will see the appropriate value. + * Because of this, we must loop until the current stack location is +1 of + * the stack count, because when StackPtr is at the end, CurrentLocation is +1. + */ + for (StackPtr = IoGetCurrentIrpStackLocation(Irp), + Irp->CurrentLocation++, + Irp->Tail.Overlay.CurrentStackLocation++; + Irp->CurrentLocation <= (Irp->StackCount + 1); + StackPtr++, + Irp->CurrentLocation++, + Irp->Tail.Overlay.CurrentStackLocation++) { - /* Skip current stack location */ - IoSkipCurrentIrpStackLocation(Irp); - /* Set Pending Returned */ Irp->PendingReturned = StackPtr->Control & SL_PENDING_RETURNED; @@ -1287,10 +1294,7 @@ IofCompleteRequest(IN PIRP Irp, /* Clear the stack location */ IopClearStackLocation(StackPtr); } - - /* Move pointer to next stack location */ - StackPtr++; - } while (Irp->CurrentLocation <= Irp->StackCount); + } /* Check if the IRP is an associated IRP */ if (Irp->Flags & IRP_ASSOCIATED_IRP) diff --git a/ntoskrnl/io/pnpmgr/pnpmgr.c b/ntoskrnl/io/pnpmgr/pnpmgr.c index 645b837de81..9d130eca9df 100644 --- a/ntoskrnl/io/pnpmgr/pnpmgr.c +++ b/ntoskrnl/io/pnpmgr/pnpmgr.c @@ -948,7 +948,7 @@ IopSetDeviceInstanceData(HANDLE InstanceKey, 0, REG_RESOURCE_LIST, DeviceNode->BootResources, - IopCalculateResourceListSize(DeviceNode->BootResources)); + PnpDetermineResourceListSize(DeviceNode->BootResources)); } } @@ -3003,6 +3003,241 @@ PipAllocateDeviceNode(IN PDEVICE_OBJECT PhysicalDeviceObject) /* PUBLIC FUNCTIONS **********************************************************/ +NTSTATUS +NTAPI +PnpBusTypeGuidGet(IN USHORT Index, + IN LPGUID BusTypeGuid) +{ + NTSTATUS Status = STATUS_SUCCESS; + + /* Acquire the lock */ + ExAcquireFastMutex(&PnpBusTypeGuidList->Lock); + + /* Validate size */ + if (Index < PnpBusTypeGuidList->GuidCount) + { + /* Copy the data */ + RtlCopyMemory(BusTypeGuid, &PnpBusTypeGuidList->Guids[Index], sizeof(GUID)); + } + else + { + /* Failure path */ + Status = STATUS_OBJECT_NAME_NOT_FOUND; + } + + /* Release lock and return status */ + ExReleaseFastMutex(&PnpBusTypeGuidList->Lock); + return Index; +} + +NTSTATUS +NTAPI +PpIrpQueryCapabilities(IN PDEVICE_OBJECT DeviceObject, + OUT PDEVICE_CAPABILITIES DeviceCaps) +{ + PAGED_CODE(); + PVOID Dummy; + IO_STACK_LOCATION Stack; + + /* Set up the Header */ + RtlZeroMemory(DeviceCaps, sizeof(DEVICE_CAPABILITIES)); + DeviceCaps->Size = sizeof(DEVICE_CAPABILITIES); + DeviceCaps->Version = 1; + DeviceCaps->Address = -1; + DeviceCaps->UINumber = -1; + + /* Set up the Stack */ + RtlZeroMemory(&Stack, sizeof(IO_STACK_LOCATION)); + Stack.MajorFunction = IRP_MJ_PNP; + Stack.MinorFunction = IRP_MN_QUERY_CAPABILITIES; + Stack.Parameters.DeviceCapabilities.Capabilities = DeviceCaps; + + /* Send the IRP */ + return IopSynchronousCall(DeviceObject, &Stack, &Dummy); +} + +NTSTATUS +NTAPI +PnpDeviceObjectToDeviceInstance(IN PDEVICE_OBJECT DeviceObject, + IN PHANDLE DeviceInstanceHandle, + IN ACCESS_MASK DesiredAccess) +{ + NTSTATUS Status; + HANDLE KeyHandle; + PDEVICE_NODE DeviceNode; + UNICODE_STRING KeyName = RTL_CONSTANT_STRING(L"\\REGISTRY\\MACHINE\\SYSTEM\\CURRENTCONTROLSET\\ENUM"); + PAGED_CODE(); + + /* Open the enum key */ + Status = IopOpenRegistryKeyEx(&KeyHandle, + NULL, + &KeyName, + KEY_READ); + if (!NT_SUCCESS(Status)) return Status; + + /* Make sure we have an instance path */ + DeviceNode = IopGetDeviceNode(DeviceObject); + if ((DeviceNode) && (DeviceNode->InstancePath.Length)) + { + /* Get the instance key */ + Status = IopOpenRegistryKeyEx(DeviceInstanceHandle, + KeyHandle, + &DeviceNode->InstancePath, + DesiredAccess); + } + else + { + /* Fail */ + Status = STATUS_INVALID_DEVICE_REQUEST; + } + + /* Close the handle and return status */ + ZwClose(KeyHandle); + return Status; +} + +ULONG +NTAPI +PnpDetermineResourceListSize(IN PCM_RESOURCE_LIST ResourceList) +{ + ULONG FinalSize, PartialSize, EntrySize, i, j; + PCM_FULL_RESOURCE_DESCRIPTOR FullDescriptor; + PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor; + + /* If we don't have one, that's easy */ + if (!ResourceList) return 0; + + /* Start with the minimum size possible */ + FinalSize = FIELD_OFFSET(CM_RESOURCE_LIST, List); + + /* Loop each full descriptor */ + FullDescriptor = ResourceList->List; + for (i = 0; i < ResourceList->Count; i++) + { + /* Start with the minimum size possible */ + PartialSize = FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList) + + FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors); + + /* Loop each partial descriptor */ + PartialDescriptor = FullDescriptor->PartialResourceList.PartialDescriptors; + for (j = 0; j < FullDescriptor->PartialResourceList.Count; j++) + { + /* Start with the minimum size possible */ + EntrySize = sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); + + /* Check if there is extra data */ + if (PartialDescriptor->Type == CmResourceTypeDeviceSpecific) + { + /* Add that data */ + EntrySize += PartialDescriptor->u.DeviceSpecificData.DataSize; + } + + /* The size of partial descriptors is bigger */ + PartialSize += EntrySize; + + /* Go to the next partial descriptor */ + PartialDescriptor = (PVOID)((ULONG_PTR)PartialDescriptor + EntrySize); + } + + /* The size of full descriptors is bigger */ + FinalSize += PartialSize; + + /* Go to the next full descriptor */ + FullDescriptor = (PVOID)((ULONG_PTR)FullDescriptor + PartialSize); + } + + /* Return the final size */ + return FinalSize; +} + +NTSTATUS +NTAPI +PiGetDeviceRegistryProperty(IN PDEVICE_OBJECT DeviceObject, + IN ULONG ValueType, + IN PWSTR ValueName, + IN PWSTR KeyName, + OUT PVOID Buffer, + IN PULONG BufferLength) +{ + NTSTATUS Status; + HANDLE KeyHandle, SubHandle; + UNICODE_STRING KeyString; + PKEY_VALUE_FULL_INFORMATION KeyValueInfo = NULL; + ULONG Length; + PAGED_CODE(); + + /* Find the instance key */ + Status = PnpDeviceObjectToDeviceInstance(DeviceObject, &KeyHandle, KEY_READ); + if (NT_SUCCESS(Status)) + { + /* Check for name given by caller */ + if (KeyName) + { + /* Open this key */ + RtlInitUnicodeString(&KeyString, KeyName); + Status = IopOpenRegistryKeyEx(&SubHandle, + KeyHandle, + &KeyString, + KEY_READ); + if (NT_SUCCESS(Status)) + { + /* And use this handle instead */ + ZwClose(KeyHandle); + KeyHandle = SubHandle; + } + } + + /* Check if sub-key handle succeeded (or no-op if no key name given) */ + if (NT_SUCCESS(Status)) + { + /* Now get the size of the property */ + Status = IopGetRegistryValue(KeyHandle, + ValueName, + &KeyValueInfo); + } + + /* Close the key */ + ZwClose(KeyHandle); + } + + /* Fail if any of the registry operations failed */ + if (!NT_SUCCESS(Status)) return Status; + + /* Check how much data we have to copy */ + Length = KeyValueInfo->DataLength; + if (*BufferLength >= Length) + { + /* Check for a match in the value type */ + if (KeyValueInfo->Type == ValueType) + { + /* Copy the data */ + RtlCopyMemory(Buffer, + (PVOID)((ULONG_PTR)KeyValueInfo + + KeyValueInfo->DataOffset), + Length); + } + else + { + /* Invalid registry property type, fail */ + Status = STATUS_INVALID_PARAMETER_2; + } + } + else + { + /* Buffer is too small to hold data */ + Status = STATUS_BUFFER_TOO_SMALL; + } + + /* Return the required buffer length, free the buffer, and return status */ + *BufferLength = Length; + ExFreePool(KeyValueInfo); + return Status; +} + +#define PIP_RETURN_DATA(x, y) {ReturnLength = x; Data = y; Status = STATUS_SUCCESS; break;} +#define PIP_REGISTRY_DATA(x, y) {ValueName = x; ValueType = y; break;} +#define PIP_UNIMPLEMENTED() {UNIMPLEMENTED; while(TRUE); break;} + /* * @implemented */ @@ -3016,281 +3251,205 @@ IoGetDeviceProperty(IN PDEVICE_OBJECT DeviceObject, { PDEVICE_NODE DeviceNode = IopGetDeviceNode(DeviceObject); DEVICE_CAPABILITIES DeviceCaps; - ULONG Length; + ULONG ReturnLength = 0, Length = 0, ValueType; + PWCHAR ValueName = NULL, EnumeratorNameEnd, DeviceInstanceName; PVOID Data = NULL; - PWSTR Ptr; - NTSTATUS Status; + NTSTATUS Status = STATUS_BUFFER_TOO_SMALL; + GUID BusTypeGuid; POBJECT_NAME_INFORMATION ObjectNameInfo = NULL; - ULONG RequiredLength, ObjectNameInfoLength; - DPRINT("IoGetDeviceProperty(0x%p %d)\n", DeviceObject, DeviceProperty); + /* Assume failure */ *ResultLength = 0; - if (DeviceNode == NULL) - return STATUS_INVALID_DEVICE_REQUEST; + /* Only PDOs can call this */ + if (!DeviceNode) return STATUS_INVALID_DEVICE_REQUEST; + /* Handle all properties */ switch (DeviceProperty) { - case DevicePropertyBusNumber: - Length = sizeof(ULONG); - Data = &DeviceNode->ChildBusNumber; - break; + case DevicePropertyBusTypeGuid: - /* Complete, untested */ - case DevicePropertyBusTypeGuid: - /* Sanity check */ - if ((DeviceNode->ChildBusTypeIndex != 0xFFFF) && - (DeviceNode->ChildBusTypeIndex < PnpBusTypeGuidList->GuidCount)) - { - /* Return the GUID */ - *ResultLength = sizeof(GUID); + /* Get the GUID from the internal cache */ + Status = PnpBusTypeGuidGet(DeviceNode->ChildBusTypeIndex, &BusTypeGuid); + if (!NT_SUCCESS(Status)) return Status; - /* Check if the buffer given was large enough */ - if (BufferLength < *ResultLength) + /* This is the format of the returned data */ + PIP_RETURN_DATA(sizeof(GUID), &BusTypeGuid); + + case DevicePropertyLegacyBusType: + + /* Validate correct interface type */ + if (DeviceNode->ChildInterfaceType == InterfaceTypeUndefined) + return STATUS_OBJECT_NAME_NOT_FOUND; + + /* This is the format of the returned data */ + PIP_RETURN_DATA(sizeof(INTERFACE_TYPE), &DeviceNode->ChildInterfaceType); + + case DevicePropertyBusNumber: + + /* Validate correct bus number */ + if ((DeviceNode->ChildBusNumber & 0x80000000) == 0x80000000) + return STATUS_OBJECT_NAME_NOT_FOUND; + + /* This is the format of the returned data */ + PIP_RETURN_DATA(sizeof(ULONG), &DeviceNode->ChildBusNumber); + + case DevicePropertyEnumeratorName: + + /* Get the instance path */ + DeviceInstanceName = DeviceNode->InstancePath.Buffer; + + /* Sanity checks */ + ASSERT((BufferLength & 1) == 0); + ASSERT(DeviceInstanceName != NULL); + + /* Get the name from the path */ + EnumeratorNameEnd = wcschr(DeviceInstanceName, OBJ_NAME_PATH_SEPARATOR); + ASSERT(EnumeratorNameEnd); + + /* This is the format of the returned data */ + PIP_RETURN_DATA((EnumeratorNameEnd - DeviceInstanceName) * 2, + &DeviceNode->ChildBusNumber); + + case DevicePropertyAddress: + + /* Query the device caps */ + Status = PpIrpQueryCapabilities(DeviceObject, &DeviceCaps); + if (!NT_SUCCESS(Status) || (DeviceCaps.Address == MAXULONG)) + return STATUS_OBJECT_NAME_NOT_FOUND; + + /* This is the format of the returned data */ + PIP_RETURN_DATA(sizeof(ULONG), &DeviceCaps.Address); + + case DevicePropertyBootConfigurationTranslated: + + /* Validate we have resources */ + if (!DeviceNode->BootResources) +// if (!DeviceNode->BootResourcesTranslated) // FIXFIX: Need this field { - return STATUS_BUFFER_TOO_SMALL; + /* No resources will still fake success, but with 0 bytes */ + *ResultLength = 0; + return STATUS_SUCCESS; } + + /* This is the format of the returned data */ + PIP_RETURN_DATA(PnpDetermineResourceListSize(DeviceNode->BootResources), // FIXFIX: Should use BootResourcesTranslated + DeviceNode->BootResources); // FIXFIX: Should use BootResourcesTranslated - /* Copy the GUID */ - RtlCopyMemory(PropertyBuffer, - &(PnpBusTypeGuidList->Guids[DeviceNode->ChildBusTypeIndex]), - sizeof(GUID)); - return STATUS_SUCCESS; - } - else - { - return STATUS_OBJECT_NAME_NOT_FOUND; - } - break; - - case DevicePropertyLegacyBusType: - Length = sizeof(INTERFACE_TYPE); - Data = &DeviceNode->ChildInterfaceType; - break; - - case DevicePropertyAddress: - /* Query the device caps */ - Status = IopQueryDeviceCapabilities(DeviceNode, &DeviceCaps); - if (NT_SUCCESS(Status) && (DeviceCaps.Address != MAXULONG)) - { - /* Return length */ - *ResultLength = sizeof(ULONG); - - /* Check if the buffer given was large enough */ - if (BufferLength < *ResultLength) - { - return STATUS_BUFFER_TOO_SMALL; - } - - /* Return address */ - *(PULONG)PropertyBuffer = DeviceCaps.Address; - return STATUS_SUCCESS; - } - else - { - return STATUS_OBJECT_NAME_NOT_FOUND; - } - break; - -// case DevicePropertyUINumber: -// if (DeviceNode->CapabilityFlags == NULL) -// return STATUS_INVALID_DEVICE_REQUEST; -// Length = sizeof(ULONG); -// Data = &DeviceNode->CapabilityFlags->UINumber; -// break; - - case DevicePropertyClassName: - case DevicePropertyClassGuid: - case DevicePropertyDriverKeyName: - case DevicePropertyManufacturer: - case DevicePropertyFriendlyName: - case DevicePropertyHardwareID: - case DevicePropertyCompatibleIDs: - case DevicePropertyDeviceDescription: - case DevicePropertyLocationInformation: - case DevicePropertyUINumber: - { - LPCWSTR RegistryPropertyName; - UNICODE_STRING EnumRoot = RTL_CONSTANT_STRING(ENUM_ROOT); - UNICODE_STRING ValueName; - KEY_VALUE_PARTIAL_INFORMATION *ValueInformation; - ULONG ValueInformationLength; - HANDLE KeyHandle, EnumRootHandle; - NTSTATUS Status; - - switch (DeviceProperty) - { - case DevicePropertyClassName: - RegistryPropertyName = L"Class"; break; - case DevicePropertyClassGuid: - RegistryPropertyName = L"ClassGuid"; break; - case DevicePropertyDriverKeyName: - RegistryPropertyName = L"Driver"; break; - case DevicePropertyManufacturer: - RegistryPropertyName = L"Mfg"; break; - case DevicePropertyFriendlyName: - RegistryPropertyName = L"FriendlyName"; break; - case DevicePropertyHardwareID: - RegistryPropertyName = L"HardwareID"; break; - case DevicePropertyCompatibleIDs: - RegistryPropertyName = L"CompatibleIDs"; break; - case DevicePropertyDeviceDescription: - RegistryPropertyName = L"DeviceDesc"; break; - case DevicePropertyLocationInformation: - RegistryPropertyName = L"LocationInformation"; break; - case DevicePropertyUINumber: - RegistryPropertyName = L"UINumber"; break; - default: - /* Should not happen */ - ASSERT(FALSE); - return STATUS_UNSUCCESSFUL; - } - - DPRINT("Registry property %S\n", RegistryPropertyName); - - /* Open Enum key */ - Status = IopOpenRegistryKeyEx(&EnumRootHandle, NULL, - &EnumRoot, KEY_READ); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Error opening ENUM_ROOT, Status=0x%08x\n", Status); - return Status; - } - - /* Open instance key */ - Status = IopOpenRegistryKeyEx(&KeyHandle, EnumRootHandle, - &DeviceNode->InstancePath, KEY_READ); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Error opening InstancePath, Status=0x%08x\n", Status); - ZwClose(EnumRootHandle); - return Status; - } - - /* Allocate buffer to read as much data as required by the caller */ - ValueInformationLength = FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, - Data[0]) + BufferLength; - ValueInformation = ExAllocatePool(PagedPool, ValueInformationLength); - if (!ValueInformation) - { - ZwClose(KeyHandle); - return STATUS_INSUFFICIENT_RESOURCES; - } - - /* Read the value */ - RtlInitUnicodeString(&ValueName, RegistryPropertyName); - Status = ZwQueryValueKey(KeyHandle, &ValueName, - KeyValuePartialInformation, ValueInformation, - ValueInformationLength, - &ValueInformationLength); - ZwClose(KeyHandle); - - /* Return data */ - *ResultLength = ValueInformation->DataLength; - - if (!NT_SUCCESS(Status)) - { - ExFreePool(ValueInformation); - if (Status == STATUS_BUFFER_OVERFLOW) - return STATUS_BUFFER_TOO_SMALL; - DPRINT1("Problem: Status=0x%08x, ResultLength = %d\n", Status, *ResultLength); - return Status; - } - - /* FIXME: Verify the value (NULL-terminated, correct format). */ - RtlCopyMemory(PropertyBuffer, ValueInformation->Data, - ValueInformation->DataLength); - ExFreePool(ValueInformation); - - return STATUS_SUCCESS; - } - - case DevicePropertyBootConfiguration: - Length = 0; - if (DeviceNode->BootResources->Count != 0) - { - Length = IopCalculateResourceListSize(DeviceNode->BootResources); - } - Data = DeviceNode->BootResources; - break; - - /* FIXME: use a translated boot configuration instead */ - case DevicePropertyBootConfigurationTranslated: - Length = 0; - if (DeviceNode->BootResources->Count != 0) - { - Length = IopCalculateResourceListSize(DeviceNode->BootResources); - } - Data = DeviceNode->BootResources; - break; - - case DevicePropertyEnumeratorName: - /* A buffer overflow can't happen here, since InstancePath - * always contains the enumerator name followed by \\ */ - Ptr = wcschr(DeviceNode->InstancePath.Buffer, L'\\'); - ASSERT(Ptr); - Length = (Ptr - DeviceNode->InstancePath.Buffer) * sizeof(WCHAR); - Data = DeviceNode->InstancePath.Buffer; - break; - - case DevicePropertyPhysicalDeviceObjectName: - Status = ObQueryNameString(DeviceNode->PhysicalDeviceObject, - NULL, - 0, - &RequiredLength); - if (Status == STATUS_SUCCESS) - { - Length = 0; - Data = L""; - } - else if (Status == STATUS_INFO_LENGTH_MISMATCH) - { - ObjectNameInfoLength = RequiredLength; - ObjectNameInfo = ExAllocatePool(PagedPool, ObjectNameInfoLength); - if (!ObjectNameInfo) - return STATUS_INSUFFICIENT_RESOURCES; - - Status = ObQueryNameString(DeviceNode->PhysicalDeviceObject, + case DevicePropertyPhysicalDeviceObjectName: + + /* Sanity check for Unicode-sized string */ + ASSERT((BufferLength & 1) == 0); + + /* Allocate name buffer */ + Length = BufferLength + sizeof(OBJECT_NAME_INFORMATION); + ObjectNameInfo = ExAllocatePool(PagedPool, Length); + if (!ObjectNameInfo) return STATUS_INSUFFICIENT_RESOURCES; + + /* Query the PDO name */ + Status = ObQueryNameString(DeviceObject, ObjectNameInfo, - ObjectNameInfoLength, - &RequiredLength); - if (NT_SUCCESS(Status)) + Length, + ResultLength); + if (Status == STATUS_INFO_LENGTH_MISMATCH) { - Length = ObjectNameInfo->Name.Length; - Data = ObjectNameInfo->Name.Buffer; + /* It's up to the caller to try again */ + Status = STATUS_BUFFER_TOO_SMALL; } - else - return Status; + + /* Return if successful */ + if (NT_SUCCESS(Status)) PIP_RETURN_DATA(ObjectNameInfo->Name.Length, + ObjectNameInfo->Name.Buffer); + + /* Let the caller know how big the name is */ + *ResultLength -= sizeof(OBJECT_NAME_INFORMATION); + break; + + /* Handle the registry-based properties */ + case DevicePropertyUINumber: + PIP_REGISTRY_DATA(REGSTR_VAL_UI_NUMBER, REG_DWORD); + case DevicePropertyLocationInformation: + PIP_REGISTRY_DATA(REGSTR_VAL_LOCATION_INFORMATION, REG_SZ); + case DevicePropertyDeviceDescription: + PIP_REGISTRY_DATA(REGSTR_VAL_DEVDESC, REG_SZ); + case DevicePropertyHardwareID: + PIP_REGISTRY_DATA(REGSTR_VAL_HARDWAREID, REG_MULTI_SZ); + case DevicePropertyCompatibleIDs: + PIP_REGISTRY_DATA(REGSTR_VAL_COMPATIBLEIDS, REG_MULTI_SZ); + case DevicePropertyBootConfiguration: + PIP_REGISTRY_DATA(REGSTR_VAL_BOOTCONFIG, REG_RESOURCE_LIST); + case DevicePropertyClassName: + PIP_REGISTRY_DATA(REGSTR_VAL_CLASS, REG_SZ); + case DevicePropertyClassGuid: + PIP_REGISTRY_DATA(REGSTR_VAL_CLASSGUID, REG_SZ); + case DevicePropertyDriverKeyName: + PIP_REGISTRY_DATA(REGSTR_VAL_DRIVER, REG_SZ); + case DevicePropertyManufacturer: + PIP_REGISTRY_DATA(REGSTR_VAL_MFG, REG_SZ); + case DevicePropertyFriendlyName: + PIP_REGISTRY_DATA(REGSTR_VAL_FRIENDLYNAME, REG_SZ); + case DevicePropertyContainerID: + //PIP_REGISTRY_DATA(REGSTR_VAL_CONTAINERID, REG_SZ); // Win7 + PIP_UNIMPLEMENTED(); + case DevicePropertyRemovalPolicy: + PIP_UNIMPLEMENTED(); + case DevicePropertyInstallState: + PIP_UNIMPLEMENTED(); + case DevicePropertyResourceRequirements: + PIP_UNIMPLEMENTED(); + case DevicePropertyAllocatedResources: + PIP_UNIMPLEMENTED(); + default: + return STATUS_INVALID_PARAMETER_2; + } + + /* Having a registry value name implies registry data */ + if (ValueName) + { + /* We know up-front how much data to expect */ + *ResultLength = BufferLength; + + /* Go get the data, use the LogConf subkey if necessary */ + Status = PiGetDeviceRegistryProperty(DeviceObject, + ValueType, + ValueName, + (DeviceProperty == + DevicePropertyBootConfiguration) ? + L"LogConf": NULL, + PropertyBuffer, + ResultLength); + } + else if (NT_SUCCESS(Status)) + { + /* We know up-front how much data to expect, check the caller's buffer */ + *ResultLength = ReturnLength; + if (ReturnLength <= BufferLength) + { + /* Buffer is all good, copy the data */ + RtlCopyMemory(PropertyBuffer, Data, ReturnLength); + + /* Check for properties that require a null-terminated string */ + if ((DeviceProperty == DevicePropertyEnumeratorName) || + (DeviceProperty == DevicePropertyPhysicalDeviceObjectName)) + { + /* Terminate the string */ + ((PWCHAR)PropertyBuffer)[ReturnLength / sizeof(WCHAR)] = UNICODE_NULL; + } + + /* This is the success path */ + Status = STATUS_SUCCESS; } else - return Status; - break; - - default: - return STATUS_INVALID_PARAMETER_2; + { + /* Failure path */ + Status = STATUS_BUFFER_TOO_SMALL; + } } - - /* Prepare returned values */ - *ResultLength = Length; - if (BufferLength < Length) - { - if (ObjectNameInfo != NULL) - ExFreePool(ObjectNameInfo); - - return STATUS_BUFFER_TOO_SMALL; - } - RtlCopyMemory(PropertyBuffer, Data, Length); - - /* NULL terminate the string (if required) */ - if (DeviceProperty == DevicePropertyEnumeratorName || - DeviceProperty == DevicePropertyPhysicalDeviceObjectName) - ((LPWSTR)PropertyBuffer)[Length / sizeof(WCHAR)] = UNICODE_NULL; - - if (ObjectNameInfo != NULL) - ExFreePool(ObjectNameInfo); - - return STATUS_SUCCESS; + + /* Free any allocation we may have made, and return the status code */ + if (ObjectNameInfo) ExFreePool(ObjectNameInfo); + return Status; } /* diff --git a/ntoskrnl/io/pnpmgr/pnpres.c b/ntoskrnl/io/pnpmgr/pnpres.c index 88148901112..2e93929f0b0 100644 --- a/ntoskrnl/io/pnpmgr/pnpres.c +++ b/ntoskrnl/io/pnpmgr/pnpres.c @@ -18,30 +18,6 @@ IopDetectResourceConflict( IN BOOLEAN Silent, OUT OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor); -ULONG -NTAPI -IopCalculateResourceListSize( - IN PCM_RESOURCE_LIST ResourceList) -{ - ULONG Size, i, j; - PCM_PARTIAL_RESOURCE_LIST pPartialResourceList; - - Size = FIELD_OFFSET(CM_RESOURCE_LIST, List); - for (i = 0; i < ResourceList->Count; i++) - { - pPartialResourceList = &ResourceList->List[i].PartialResourceList; - Size += FIELD_OFFSET(CM_FULL_RESOURCE_DESCRIPTOR, PartialResourceList.PartialDescriptors) + - pPartialResourceList->Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); - for (j = 0; j < pPartialResourceList->Count; j++) - { - if (pPartialResourceList->PartialDescriptors[j].Type == CmResourceTypeDeviceSpecific) - Size += pPartialResourceList->PartialDescriptors[j].u.DeviceSpecificData.DataSize; - } - } - - return Size; -} - static BOOLEAN IopCheckDescriptorForConflict(PCM_PARTIAL_RESOURCE_DESCRIPTOR CmDesc, OPTIONAL PCM_PARTIAL_RESOURCE_DESCRIPTOR ConflictingDescriptor) @@ -267,6 +243,7 @@ IopCreateResourceListFromRequirements( if (ReqDesc->Option == 0) { ExFreePool(*ResourceList); + *ResourceList = NULL; return STATUS_CONFLICTING_ADDRESSES; } } @@ -282,6 +259,7 @@ IopCreateResourceListFromRequirements( if (ReqDesc->Option == 0) { ExFreePool(*ResourceList); + *ResourceList = NULL; return STATUS_CONFLICTING_ADDRESSES; } } @@ -297,6 +275,7 @@ IopCreateResourceListFromRequirements( if (ReqDesc->Option == 0) { ExFreePool(*ResourceList); + *ResourceList = NULL; return STATUS_CONFLICTING_ADDRESSES; } } @@ -312,6 +291,7 @@ IopCreateResourceListFromRequirements( if (ReqDesc->Option == 0) { ExFreePool(*ResourceList); + *ResourceList = NULL; return STATUS_CONFLICTING_ADDRESSES; } } @@ -326,6 +306,7 @@ IopCreateResourceListFromRequirements( if (ReqDesc->Option == 0) { ExFreePool(*ResourceList); + *ResourceList = NULL; return STATUS_CONFLICTING_ADDRESSES; } } @@ -533,7 +514,7 @@ IopUpdateControlKeyWithResources(IN PDEVICE_NODE DeviceNode) 0, REG_RESOURCE_LIST, DeviceNode->ResourceList, - IopCalculateResourceListSize(DeviceNode->ResourceList)); + PnpDetermineResourceListSize(DeviceNode->ResourceList)); ZwClose(ControlKey); if (!NT_SUCCESS(Status)) @@ -634,25 +615,37 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2 if (DeviceNode->ResourceList) { - WCHAR NameBuff[256]; + PWCHAR DeviceName = NULL; UNICODE_STRING NameU; UNICODE_STRING Suffix; - ULONG OldLength; + ULONG OldLength = 0; ASSERT(DeviceNode->ResourceListTranslated); - NameU.Buffer = NameBuff; - NameU.Length = 0; - NameU.MaximumLength = 256 * sizeof(WCHAR); - Status = IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, DevicePropertyPhysicalDeviceObjectName, - NameU.MaximumLength, - NameU.Buffer, + 0, + NULL, &OldLength); - ASSERT(Status == STATUS_SUCCESS); + if ((OldLength != 0) && (Status == STATUS_BUFFER_TOO_SMALL)) + { + DeviceName = ExAllocatePool(NonPagedPool, OldLength); + ASSERT(DeviceName); - NameU.Length = (USHORT)OldLength; + IoGetDeviceProperty(DeviceNode->PhysicalDeviceObject, + DevicePropertyPhysicalDeviceObjectName, + OldLength, + DeviceName, + &OldLength); + + RtlInitUnicodeString(&NameU, DeviceName); + } + else + { + /* Some failure */ + ASSERT(!NT_SUCCESS(Status)); + return Status; + } RtlInitUnicodeString(&Suffix, L".Raw"); RtlAppendUnicodeStringToString(&NameU, &Suffix); @@ -662,7 +655,7 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2 0, REG_RESOURCE_LIST, DeviceNode->ResourceList, - IopCalculateResourceListSize(DeviceNode->ResourceList)); + PnpDetermineResourceListSize(DeviceNode->ResourceList)); if (!NT_SUCCESS(Status)) { ZwClose(PnpMgrLevel2); @@ -680,8 +673,10 @@ IopUpdateResourceMap(IN PDEVICE_NODE DeviceNode, PWCHAR Level1Key, PWCHAR Level2 0, REG_RESOURCE_LIST, DeviceNode->ResourceListTranslated, - IopCalculateResourceListSize(DeviceNode->ResourceListTranslated)); + PnpDetermineResourceListSize(DeviceNode->ResourceListTranslated)); ZwClose(PnpMgrLevel2); + ASSERT(DeviceName); + ExFreePool(DeviceName); if (!NT_SUCCESS(Status)) return Status; } @@ -718,7 +713,7 @@ IopTranslateDeviceResources( /* That's easy to translate a resource list. Just copy the * untranslated one and change few fields in the copy */ - ListSize = IopCalculateResourceListSize(DeviceNode->ResourceList); + ListSize = PnpDetermineResourceListSize(DeviceNode->ResourceList); DeviceNode->ResourceListTranslated = ExAllocatePool(PagedPool, ListSize); if (!DeviceNode->ResourceListTranslated) @@ -838,7 +833,7 @@ IopAssignDeviceResources( if (DeviceNode->BootResources) { - ListSize = IopCalculateResourceListSize(DeviceNode->BootResources); + ListSize = PnpDetermineResourceListSize(DeviceNode->BootResources); DeviceNode->ResourceList = ExAllocatePool(PagedPool, ListSize); if (!DeviceNode->ResourceList) @@ -862,6 +857,7 @@ IopAssignDeviceResources( { DPRINT1("Boot resources for %wZ cause a resource conflict!\n", &DeviceNode->InstancePath); ExFreePool(DeviceNode->ResourceList); + DeviceNode->ResourceList = NULL; } } diff --git a/ntoskrnl/io/pnpmgr/pnproot.c b/ntoskrnl/io/pnpmgr/pnproot.c index 6f1834e5298..42d9421cce8 100644 --- a/ntoskrnl/io/pnpmgr/pnproot.c +++ b/ntoskrnl/io/pnpmgr/pnproot.c @@ -1027,10 +1027,12 @@ PnpRootPdoPnpControl( IN PIRP Irp) { PPNPROOT_PDO_DEVICE_EXTENSION DeviceExtension; + PPNPROOT_FDO_DEVICE_EXTENSION FdoDeviceExtension; PIO_STACK_LOCATION IrpSp; NTSTATUS Status; DeviceExtension = (PPNPROOT_PDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension; + FdoDeviceExtension = (PPNPROOT_FDO_DEVICE_EXTENSION)PnpRootDeviceObject->DeviceExtension; Status = Irp->IoStatus.Status; IrpSp = IoGetCurrentIrpStackLocation(Irp); @@ -1070,7 +1072,32 @@ PnpRootPdoPnpControl( break; case IRP_MN_REMOVE_DEVICE: - DPRINT1("IRP_MN_REMOVE_DEVICE is UNIMPLEMENTED!\n"); + /* Remove the device from the device list and decrement the device count*/ + KeAcquireGuardedMutex(&FdoDeviceExtension->DeviceListLock); + RemoveEntryList(&DeviceExtension->DeviceInfo->ListEntry); + FdoDeviceExtension->DeviceListCount--; + KeReleaseGuardedMutex(&FdoDeviceExtension->DeviceListLock); + + /* Free some strings we created */ + RtlFreeUnicodeString(&DeviceExtension->DeviceInfo->DeviceDescription); + RtlFreeUnicodeString(&DeviceExtension->DeviceInfo->DeviceID); + RtlFreeUnicodeString(&DeviceExtension->DeviceInfo->InstanceID); + + /* Free the resource requirements list */ + if (DeviceExtension->DeviceInfo->ResourceRequirementsList != NULL) + ExFreePool(DeviceExtension->DeviceInfo->ResourceRequirementsList); + + /* Free the boot resources list */ + if (DeviceExtension->DeviceInfo->ResourceList != NULL) + ExFreePool(DeviceExtension->DeviceInfo->ResourceList); + + /* Free the device info */ + ExFreePool(DeviceExtension->DeviceInfo); + + /* Finally, delete the device object */ + IoDeleteDevice(DeviceObject); + + /* Return success */ Status = STATUS_SUCCESS; break; @@ -1085,7 +1112,6 @@ PnpRootPdoPnpControl( default: DPRINT1("IRP_MJ_PNP / Unknown minor function 0x%lx\n", IrpSp->MinorFunction); - Status = STATUS_NOT_IMPLEMENTED; break; } diff --git a/ntoskrnl/kdbg/kdb.c b/ntoskrnl/kdbg/kdb.c index 9fb099c8b10..30eb071c2d1 100644 --- a/ntoskrnl/kdbg/kdb.c +++ b/ntoskrnl/kdbg/kdb.c @@ -1710,6 +1710,11 @@ KdbpGetCommandLineSettings( p2 += 8; KdbDebugState |= KD_DEBUG_KDNOECHO; } + else if (!_strnicmp(p2, "FIRSTCHANCE", 11)) + { + p2 += 11; + KdbpSetEnterCondition(-1, TRUE, KdbEnterAlways); + } p1 = p2; } diff --git a/ntoskrnl/ke/i386/exp.c b/ntoskrnl/ke/i386/exp.c index 38dded77062..ebc327fb58c 100644 --- a/ntoskrnl/ke/i386/exp.c +++ b/ntoskrnl/ke/i386/exp.c @@ -1082,10 +1082,11 @@ DispatchToUser: } /* 3rd strike, kill the process */ - DPRINT1("Kill %.16s, ExceptionCode: %lx, ExceptionAddress: %lx\n", + DPRINT1("Kill %.16s, ExceptionCode: %lx, ExceptionAddress: %lx, BaseAddress: %lx\n", PsGetCurrentProcess()->ImageFileName, ExceptionRecord->ExceptionCode, - ExceptionRecord->ExceptionAddress); + ExceptionRecord->ExceptionAddress, + PsGetCurrentProcess()->SectionBaseAddress); ZwTerminateProcess(NtCurrentProcess(), ExceptionRecord->ExceptionCode); KeBugCheckEx(KMODE_EXCEPTION_NOT_HANDLED, diff --git a/ntoskrnl/ke/i386/traphdlr.c b/ntoskrnl/ke/i386/traphdlr.c index 8c535103123..7e960432bd2 100644 --- a/ntoskrnl/ke/i386/traphdlr.c +++ b/ntoskrnl/ke/i386/traphdlr.c @@ -547,7 +547,7 @@ KiTrap02(VOID) // // Handled, return from interrupt // - __asm__ __volatile__ ("iret\n"); + KiIret(); } // diff --git a/ntoskrnl/mm/ARM3/contmem.c b/ntoskrnl/mm/ARM3/contmem.c index 0d7628bf88f..94c8650f6ef 100644 --- a/ntoskrnl/mm/ARM3/contmem.c +++ b/ntoskrnl/mm/ARM3/contmem.c @@ -352,8 +352,8 @@ MiFindContiguousMemory(IN PFN_NUMBER LowestPfn, do { /* Write the PTE address */ - Pfn1->PteAddress = PointerPte++; - Pfn1->u4.PteFrame = PFN_FROM_PTE(MiAddressToPte(PointerPte)); + Pfn1->PteAddress = PointerPte; + Pfn1->u4.PteFrame = PFN_FROM_PTE(MiAddressToPte(PointerPte++)); } while (Pfn1++ < EndPfn); /* Return the address */ @@ -502,6 +502,9 @@ MiFreeContiguousMemory(IN PVOID BaseAddress) ASSERT(Pfn1->u4.VerifierAllocation == 0); ASSERT(Pfn1->u3.e1.PrototypePte == 0); + /* Set the special pending delete marker */ + MI_SET_PFN_DELETED(Pfn1); + /* Keep going for assertions */ PointerPte++; } while (Pfn1++->u3.e1.EndOfAllocation == 0); @@ -531,12 +534,11 @@ MiFreeContiguousMemory(IN PVOID BaseAddress) // Loop all the pages // LastPage = PageFrameIndex + PageCount; + Pfn1 = MiGetPfnEntry(PageFrameIndex); do { - // - // Free each one, and move on - // - MmReleasePageMemoryConsumer(MC_NPPOOL, PageFrameIndex++); + /* Decrement the share count and move on */ + MiDecrementShareCount(Pfn1++, PageFrameIndex++); } while (PageFrameIndex < LastPage); // diff --git a/ntoskrnl/mm/ARM3/expool.c b/ntoskrnl/mm/ARM3/expool.c index c10d8c87d56..83d62b785ac 100644 --- a/ntoskrnl/mm/ARM3/expool.c +++ b/ntoskrnl/mm/ARM3/expool.c @@ -19,6 +19,8 @@ #undef ExAllocatePoolWithQuota #undef ExAllocatePoolWithQuotaTag +BOOLEAN AllowPagedPool = TRUE; + /* GLOBALS ********************************************************************/ ULONG ExpNumberOfPagedPools; @@ -28,6 +30,262 @@ PPOOL_DESCRIPTOR PoolVector[2]; PVOID PoolTrackTable; PKGUARDED_MUTEX ExpPagedPoolMutex; +/* Pool block/header/list access macros */ +#define POOL_ENTRY(x) (PPOOL_HEADER)((ULONG_PTR)(x) - sizeof(POOL_HEADER)) +#define POOL_FREE_BLOCK(x) (PLIST_ENTRY)((ULONG_PTR)(x) + sizeof(POOL_HEADER)) +#define POOL_BLOCK(x, i) (PPOOL_HEADER)((ULONG_PTR)(x) + ((i) * POOL_BLOCK_SIZE)) +#define POOL_NEXT_BLOCK(x) POOL_BLOCK((x), (x)->BlockSize) +#define POOL_PREV_BLOCK(x) POOL_BLOCK((x), -((x)->PreviousSize)) + +/* + * Pool list access debug macros, similar to Arthur's pfnlist.c work. + * Microsoft actually implements similar checks in the Windows Server 2003 SP1 + * pool code, but only for checked builds. + * + * As of Vista, however, an MSDN Blog entry by a Security Team Manager indicates + * that these checks are done even on retail builds, due to the increasing + * number of kernel-mode attacks which depend on dangling list pointers and other + * kinds of list-based attacks. + * + * For now, I will leave these checks on all the time, but later they are likely + * to be DBG-only, at least until there are enough kernel-mode security attacks + * against ReactOS to warrant the performance hit. + * + * For now, these are not made inline, so we can get good stack traces. + */ +PLIST_ENTRY +NTAPI +ExpDecodePoolLink(IN PLIST_ENTRY Link) +{ + return (PLIST_ENTRY)((ULONG_PTR)Link & ~1); +} + +PLIST_ENTRY +NTAPI +ExpEncodePoolLink(IN PLIST_ENTRY Link) +{ + return (PLIST_ENTRY)((ULONG_PTR)Link | 1); +} + +VOID +NTAPI +ExpCheckPoolLinks(IN PLIST_ENTRY ListHead) +{ + if ((ExpDecodePoolLink(ExpDecodePoolLink(ListHead->Flink)->Blink) != ListHead) || + (ExpDecodePoolLink(ExpDecodePoolLink(ListHead->Blink)->Flink) != ListHead)) + { + KeBugCheckEx(BAD_POOL_HEADER, + 3, + (ULONG_PTR)ListHead, + (ULONG_PTR)ExpDecodePoolLink(ExpDecodePoolLink(ListHead->Flink)->Blink), + (ULONG_PTR)ExpDecodePoolLink(ExpDecodePoolLink(ListHead->Blink)->Flink)); + } +} + +VOID +NTAPI +ExpInitializePoolListHead(IN PLIST_ENTRY ListHead) +{ + ListHead->Flink = ListHead->Blink = ExpEncodePoolLink(ListHead); +} + +BOOLEAN +NTAPI +ExpIsPoolListEmpty(IN PLIST_ENTRY ListHead) +{ + return (ExpDecodePoolLink(ListHead->Flink) == ListHead); +} + +VOID +NTAPI +ExpRemovePoolEntryList(IN PLIST_ENTRY Entry) +{ + PLIST_ENTRY Blink, Flink; + Flink = ExpDecodePoolLink(Entry->Flink); + Blink = ExpDecodePoolLink(Entry->Blink); + Flink->Blink = ExpEncodePoolLink(Blink); + Blink->Flink = ExpEncodePoolLink(Flink); +} + +PLIST_ENTRY +NTAPI +ExpRemovePoolHeadList(IN PLIST_ENTRY ListHead) +{ + PLIST_ENTRY Entry, Flink; + Entry = ExpDecodePoolLink(ListHead->Flink); + Flink = ExpDecodePoolLink(Entry->Flink); + ListHead->Flink = ExpEncodePoolLink(Flink); + Flink->Blink = ExpEncodePoolLink(ListHead); + return Entry; +} + +PLIST_ENTRY +NTAPI +ExpRemovePoolTailList(IN PLIST_ENTRY ListHead) +{ + PLIST_ENTRY Entry, Blink; + Entry = ExpDecodePoolLink(ListHead->Blink); + Blink = ExpDecodePoolLink(Entry->Blink); + ListHead->Blink = ExpEncodePoolLink(Blink); + Blink->Flink = ExpEncodePoolLink(ListHead); + return Entry; +} + +VOID +NTAPI +ExpInsertPoolTailList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY Entry) +{ + PLIST_ENTRY Blink; + ExpCheckPoolLinks(ListHead); + Blink = ExpDecodePoolLink(ListHead->Blink); + Entry->Flink = ExpEncodePoolLink(ListHead); + Entry->Blink = ExpEncodePoolLink(Blink); + Blink->Flink = ExpEncodePoolLink(Entry); + ListHead->Blink = ExpEncodePoolLink(Entry); + ExpCheckPoolLinks(ListHead); +} + +VOID +NTAPI +ExpInsertPoolHeadList(IN PLIST_ENTRY ListHead, + IN PLIST_ENTRY Entry) +{ + PLIST_ENTRY Flink; + ExpCheckPoolLinks(ListHead); + Flink = ExpDecodePoolLink(ListHead->Flink); + Entry->Flink = ExpEncodePoolLink(Flink); + Entry->Blink = ExpEncodePoolLink(ListHead); + Flink->Blink = ExpEncodePoolLink(Entry); + ListHead->Flink = ExpEncodePoolLink(Entry); + ExpCheckPoolLinks(ListHead); +} + +VOID +NTAPI +ExpCheckPoolHeader(IN PPOOL_HEADER Entry) +{ + PPOOL_HEADER PreviousEntry, NextEntry; + + /* Is there a block before this one? */ + if (Entry->PreviousSize) + { + /* Get it */ + PreviousEntry = POOL_PREV_BLOCK(Entry); + + /* The two blocks must be on the same page! */ + if (PAGE_ALIGN(Entry) != PAGE_ALIGN(PreviousEntry)) + { + /* Something is awry */ + KeBugCheckEx(BAD_POOL_HEADER, + 6, + (ULONG_PTR)PreviousEntry, + __LINE__, + (ULONG_PTR)Entry); + } + + /* This block should also indicate that it's as large as we think it is */ + if (PreviousEntry->BlockSize != Entry->PreviousSize) + { + /* Otherwise, someone corrupted one of the sizes */ + KeBugCheckEx(BAD_POOL_HEADER, + 5, + (ULONG_PTR)PreviousEntry, + __LINE__, + (ULONG_PTR)Entry); + } + } + else if (PAGE_ALIGN(Entry) != Entry) + { + /* If there's no block before us, we are the first block, so we should be on a page boundary */ + KeBugCheckEx(BAD_POOL_HEADER, + 7, + 0, + __LINE__, + (ULONG_PTR)Entry); + } + + /* This block must have a size */ + if (!Entry->BlockSize) + { + /* Someone must've corrupted this field */ + KeBugCheckEx(BAD_POOL_HEADER, + 8, + 0, + __LINE__, + (ULONG_PTR)Entry); + } + + /* Okay, now get the next block */ + NextEntry = POOL_NEXT_BLOCK(Entry); + + /* If this is the last block, then we'll be page-aligned, otherwise, check this block */ + if (PAGE_ALIGN(NextEntry) != NextEntry) + { + /* The two blocks must be on the same page! */ + if (PAGE_ALIGN(Entry) != PAGE_ALIGN(NextEntry)) + { + /* Something is messed up */ + KeBugCheckEx(BAD_POOL_HEADER, + 9, + (ULONG_PTR)NextEntry, + __LINE__, + (ULONG_PTR)Entry); + } + + /* And this block should think we are as large as we truly are */ + if (NextEntry->PreviousSize != Entry->BlockSize) + { + /* Otherwise, someone corrupted the field */ + KeBugCheckEx(BAD_POOL_HEADER, + 5, + (ULONG_PTR)NextEntry, + __LINE__, + (ULONG_PTR)Entry); + } + } +} + +VOID +NTAPI +ExpCheckPoolBlocks(IN PVOID Block) +{ + BOOLEAN FoundBlock; + SIZE_T Size = 0; + PPOOL_HEADER Entry; + + /* Get the first entry for this page, make sure it really is the first */ + Entry = PAGE_ALIGN(Block); + ASSERT(Entry->PreviousSize == 0); + + /* Now scan each entry */ + while (TRUE) + { + /* When we actually found our block, remember this */ + if (Entry == Block) FoundBlock = TRUE; + + /* Now validate this block header */ + ExpCheckPoolHeader(Entry); + + /* And go to the next one, keeping track of our size */ + Size += Entry->BlockSize; + Entry = POOL_NEXT_BLOCK(Entry); + + /* If we hit the last block, stop */ + if (Size >= (PAGE_SIZE / POOL_BLOCK_SIZE)) break; + + /* If we hit the end of the page, stop */ + if (PAGE_ALIGN(Entry) == Entry) break; + } + + /* We must've found our block, and we must have hit the end of the page */ + if ((PAGE_ALIGN(Entry) != Entry) || !(FoundBlock)) + { + /* Otherwise, the blocks are messed up */ + KeBugCheckEx(BAD_POOL_HEADER, 10, (ULONG_PTR)Block, __LINE__, (ULONG_PTR)Entry); + } +} + /* PRIVATE FUNCTIONS **********************************************************/ VOID @@ -68,7 +326,11 @@ ExInitializePoolDescriptor(IN PPOOL_DESCRIPTOR PoolDescriptor, // NextEntry = PoolDescriptor->ListHeads; LastEntry = NextEntry + POOL_LISTS_PER_PAGE; - while (NextEntry < LastEntry) InitializeListHead(NextEntry++); + while (NextEntry < LastEntry) + { + ExpInitializePoolListHead(NextEntry); + NextEntry++; + } } VOID @@ -196,8 +458,8 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // // Check for paged pool // - if (PoolType == PagedPool) return ExAllocatePagedPoolWithTag(PagedPool, NumberOfBytes, Tag); - + if (!(AllowPagedPool) && (PoolType == PagedPool)) return ExAllocatePagedPoolWithTag(PagedPool, NumberOfBytes, Tag); + // // Some sanity checks // @@ -239,8 +501,7 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // request would've been treated as a POOL_MAX_ALLOC earlier and resulted in // the direct allocation of pages. // - i = (NumberOfBytes + sizeof(POOL_HEADER) + sizeof(LIST_ENTRY) - 1) / - sizeof(POOL_HEADER); + i = (NumberOfBytes + sizeof(POOL_HEADER) + (POOL_BLOCK_SIZE - 1)) / POOL_BLOCK_SIZE; // // Loop in the free lists looking for a block if this size. Start with the @@ -252,7 +513,7 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // // Are there any free entries available on this list? // - if (!IsListEmpty(ListHead)) + if (!ExpIsPoolListEmpty(ListHead)) { // // Acquire the pool lock now @@ -262,7 +523,7 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // // And make sure the list still has entries // - if (IsListEmpty(ListHead)) + if (ExpIsPoolListEmpty(ListHead)) { // // Someone raced us (and won) before we had a chance to acquire @@ -281,7 +542,10 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // there is a guarantee that any block on this list will either be // of the correct size, or perhaps larger. // - Entry = (PPOOL_HEADER)RemoveHeadList(ListHead) - 1; + ExpCheckPoolLinks(ListHead); + Entry = POOL_ENTRY(ExpRemovePoolHeadList(ListHead)); + ExpCheckPoolLinks(ListHead); + ExpCheckPoolBlocks(Entry); ASSERT(Entry->BlockSize >= i); ASSERT(Entry->PoolType == 0); @@ -302,7 +566,7 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // turn it into a fragment that contains the leftover data // that we don't need to satisfy the caller's request // - FragmentEntry = Entry + i; + FragmentEntry = POOL_BLOCK(Entry, i); FragmentEntry->BlockSize = Entry->BlockSize - i; // @@ -314,7 +578,7 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // Now get the block that follows the new fragment and check // if it's still on the same page as us (and not at the end) // - NextEntry = FragmentEntry + FragmentEntry->BlockSize; + NextEntry = POOL_NEXT_BLOCK(FragmentEntry); if (PAGE_ALIGN(NextEntry) != NextEntry) { // @@ -346,14 +610,14 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // This is the entry that will actually end up holding the // allocation! // - Entry += Entry->BlockSize; + Entry = POOL_NEXT_BLOCK(Entry); Entry->PreviousSize = FragmentEntry->BlockSize; // // And now let's go to the entry after that one and check if // it's still on the same page, and not at the end // - NextEntry = Entry + i; + NextEntry = POOL_BLOCK(Entry, i); if (PAGE_ALIGN(NextEntry) != NextEntry) { // @@ -381,13 +645,15 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // "full" entry, which contains enough bytes for a linked list // and thus can be used for allocations (up to 8 bytes...) // + ExpCheckPoolLinks(&PoolDesc->ListHeads[BlockSize - 1]); if (BlockSize != 1) { // // Insert the free entry into the free list for this size // - InsertTailList(&PoolDesc->ListHeads[BlockSize - 1], - (PLIST_ENTRY)FragmentEntry + 1); + ExpInsertPoolTailList(&PoolDesc->ListHeads[BlockSize - 1], + POOL_FREE_BLOCK(FragmentEntry)); + ExpCheckPoolLinks(POOL_FREE_BLOCK(FragmentEntry)); } } @@ -396,13 +662,16 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // and release the lock since we're done // Entry->PoolType = PoolType + 1; + ExpCheckPoolBlocks(Entry); ExUnlockPool(PoolDesc, OldIrql); // // Return the pool allocation // Entry->PoolTag = Tag; - return ++Entry; + (POOL_FREE_BLOCK(Entry))->Flink = NULL; + (POOL_FREE_BLOCK(Entry))->Blink = NULL; + return POOL_FREE_BLOCK(Entry); } } while (++ListHead != &PoolDesc->ListHeads[POOL_LISTS_PER_PAGE]); @@ -410,6 +679,7 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // There were no free entries left, so we have to allocate a new fresh page // Entry = MiAllocatePoolPages(PoolType, PAGE_SIZE); + ASSERT(Entry != NULL); Entry->Ulong1 = 0; Entry->BlockSize = i; Entry->PoolType = PoolType + 1; @@ -420,8 +690,8 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // to create now. The free bytes are the whole page minus what was allocated // and then converted into units of block headers. // - BlockSize = (PAGE_SIZE / sizeof(POOL_HEADER)) - i; - FragmentEntry = Entry + i; + BlockSize = (PAGE_SIZE / POOL_BLOCK_SIZE) - i; + FragmentEntry = POOL_BLOCK(Entry, i); FragmentEntry->Ulong1 = 0; FragmentEntry->BlockSize = BlockSize; FragmentEntry->PreviousSize = i; @@ -441,20 +711,24 @@ ExAllocatePoolWithTag(IN POOL_TYPE PoolType, // // And insert the free entry into the free list for this block size // - InsertTailList(&PoolDesc->ListHeads[BlockSize - 1], - (PLIST_ENTRY)FragmentEntry + 1); - + ExpCheckPoolLinks(&PoolDesc->ListHeads[BlockSize - 1]); + ExpInsertPoolTailList(&PoolDesc->ListHeads[BlockSize - 1], + POOL_FREE_BLOCK(FragmentEntry)); + ExpCheckPoolLinks(POOL_FREE_BLOCK(FragmentEntry)); + // // Release the pool lock // + ExpCheckPoolBlocks(Entry); ExUnlockPool(PoolDesc, OldIrql); } // // And return the pool allocation // + ExpCheckPoolBlocks(Entry); Entry->PoolTag = Tag; - return ++Entry; + return POOL_FREE_BLOCK(Entry); } /* @@ -485,7 +759,7 @@ ExFreePoolWithTag(IN PVOID P, POOL_TYPE PoolType; PPOOL_DESCRIPTOR PoolDesc; BOOLEAN Combined = FALSE; - + // // Check for paged pool // @@ -526,7 +800,7 @@ ExFreePoolWithTag(IN PVOID P, // // Get the pointer to the next entry // - NextEntry = Entry + BlockSize; + NextEntry = POOL_BLOCK(Entry, BlockSize); // // Acquire the pool lock @@ -536,6 +810,7 @@ ExFreePoolWithTag(IN PVOID P, // // Check if the next allocation is at the end of the page // + ExpCheckPoolBlocks(Entry); if (PAGE_ALIGN(NextEntry) != NextEntry) { // @@ -559,7 +834,10 @@ ExFreePoolWithTag(IN PVOID P, // The block is at least big enough to have a linked list, so go // ahead and remove it // - RemoveEntryList((PLIST_ENTRY)NextEntry + 1); + ExpCheckPoolLinks(POOL_FREE_BLOCK(NextEntry)); + ExpRemovePoolEntryList(POOL_FREE_BLOCK(NextEntry)); + ExpCheckPoolLinks(ExpDecodePoolLink((POOL_FREE_BLOCK(NextEntry))->Flink)); + ExpCheckPoolLinks(ExpDecodePoolLink((POOL_FREE_BLOCK(NextEntry))->Blink)); } // @@ -577,7 +855,7 @@ ExFreePoolWithTag(IN PVOID P, // // Great, grab that entry and check if it's free // - NextEntry = Entry - Entry->PreviousSize; + NextEntry = POOL_PREV_BLOCK(Entry); if (NextEntry->PoolType == 0) { // @@ -596,7 +874,10 @@ ExFreePoolWithTag(IN PVOID P, // The block is at least big enough to have a linked list, so go // ahead and remove it // - RemoveEntryList((PLIST_ENTRY)NextEntry + 1); + ExpCheckPoolLinks(POOL_FREE_BLOCK(NextEntry)); + ExpRemovePoolEntryList(POOL_FREE_BLOCK(NextEntry)); + ExpCheckPoolLinks(ExpDecodePoolLink((POOL_FREE_BLOCK(NextEntry))->Flink)); + ExpCheckPoolLinks(ExpDecodePoolLink((POOL_FREE_BLOCK(NextEntry))->Blink)); } // @@ -618,7 +899,7 @@ ExFreePoolWithTag(IN PVOID P, // page, they could've all been combined). // if ((PAGE_ALIGN(Entry) == Entry) && - (PAGE_ALIGN(Entry + Entry->BlockSize) == Entry + Entry->BlockSize)) + (PAGE_ALIGN(POOL_NEXT_BLOCK(Entry)) == POOL_NEXT_BLOCK(Entry))) { // // In this case, release the pool lock, and free the page @@ -644,7 +925,7 @@ ExFreePoolWithTag(IN PVOID P, // Get the first combined block (either our original to begin with, or // the one after the original, depending if we combined with the previous) // - NextEntry = Entry + BlockSize; + NextEntry = POOL_NEXT_BLOCK(Entry); // // As long as the next block isn't on a page boundary, have it point @@ -656,7 +937,8 @@ ExFreePoolWithTag(IN PVOID P, // // Insert this new free block, and release the pool lock // - InsertHeadList(&PoolDesc->ListHeads[BlockSize - 1], (PLIST_ENTRY)Entry + 1); + ExpInsertPoolHeadList(&PoolDesc->ListHeads[BlockSize - 1], POOL_FREE_BLOCK(Entry)); + ExpCheckPoolLinks(POOL_FREE_BLOCK(Entry)); ExUnlockPool(PoolDesc, OldIrql); } diff --git a/ntoskrnl/mm/ARM3/hypermap.c b/ntoskrnl/mm/ARM3/hypermap.c index 80f371620a0..fca9e03929b 100644 --- a/ntoskrnl/mm/ARM3/hypermap.c +++ b/ntoskrnl/mm/ARM3/hypermap.c @@ -82,9 +82,7 @@ MiMapPageInHyperSpace(IN PEPROCESS Process, // Write the current PTE // PointerPte += Offset; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; + MI_WRITE_VALID_PTE(PointerPte, TempPte); // // Return the address @@ -176,9 +174,7 @@ MiMapPagesToZeroInHyperSpace(IN PMMPFN *Pages, // Set the correct PTE to write to, and set its new value // PointerPte--; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; + MI_WRITE_VALID_PTE(PointerPte, TempPte); } while (--NumberOfPages); // diff --git a/ntoskrnl/mm/ARM3/i386/init.c b/ntoskrnl/mm/ARM3/i386/init.c index c0226ebc8ac..7b7f6c4e7db 100644 --- a/ntoskrnl/mm/ARM3/i386/init.c +++ b/ntoskrnl/mm/ARM3/i386/init.c @@ -306,7 +306,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // then add the color tables and convert to pages // MxPfnAllocation = (MmHighestPhysicalPage + 1) * sizeof(MMPFN); - MxPfnAllocation <<= 1; + //MxPfnAllocation <<= 1; MxPfnAllocation += (MmSecondaryColors * sizeof(MMCOLOR_TABLES) * 2); MxPfnAllocation >>= PAGE_SHIFT; @@ -380,19 +380,13 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // with the old memory manager, so we'll create a "Shadow PFN Database" // instead, and arbitrarly start it at 0xB0000000. // - // We actually create two PFN databases, one for ReactOS starting here, - // and the next one used for ARM3, which starts right after. The MmPfnAllocation - // variable actually holds the size of both (the colored tables come after - // the ARM3 PFN database). - // - MmPfnDatabase[0] = (PVOID)0xB0000000; - MmPfnDatabase[1] = &MmPfnDatabase[0][MmHighestPhysicalPage]; - ASSERT(((ULONG_PTR)MmPfnDatabase[0] & (PDE_MAPPED_VA - 1)) == 0); + MmPfnDatabase = (PVOID)0xB0000000; + ASSERT(((ULONG_PTR)MmPfnDatabase & (PDE_MAPPED_VA - 1)) == 0); // // Non paged pool comes after the PFN database // - MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase[0] + + MmNonPagedPoolStart = (PVOID)((ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT)); // @@ -416,17 +410,11 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); while (StartPde <= EndPde) { - // - // Sanity check - // - ASSERT(StartPde->u.Hard.Valid == 0); - // // Get a page // TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; + MI_WRITE_VALID_PTE(StartPde, TempPde); // // Zero out the page table @@ -443,23 +431,17 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // // Now we need pages for the page tables which will map initial NP // - StartPde = MiAddressToPde(MmPfnDatabase[0]); + StartPde = MiAddressToPde(MmPfnDatabase); EndPde = MiAddressToPde((PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); while (StartPde <= EndPde) { - // - // Sanity check - // - ASSERT(StartPde->u.Hard.Valid == 0); - // // Get a page // TempPde.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; - + MI_WRITE_VALID_PTE(StartPde, TempPde); + // // Zero out the page table // @@ -489,9 +471,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) // Use one of our contigous pages // TempPte.u.Hard.PageFrameNumber = PageFrameIndex++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte++ = TempPte; + MI_WRITE_VALID_PTE(PointerPte++, TempPte); } // @@ -510,12 +490,14 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Initialize the color tables */ MiInitializeColorTables(); + /* ReactOS Stuff */ + extern KEVENT ZeroPageThreadEvent; + KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE); + /* Build the PFN Database */ MiInitializePfnDatabase(LoaderBlock); + MmInitializeBalancer(MmAvailablePages, 0); - /* Call back into shitMM to setup the ReactOS PFN database */ - MmInitializePageList(); - // // Reset the descriptor back so we can create the correct memory blocks // @@ -552,9 +534,7 @@ MiInitMachineDependent(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PageFrameIndex = MiRemoveAnyPage(0); TempPde.u.Hard.PageFrameNumber = PageFrameIndex; TempPde.u.Hard.Global = FALSE; // Hyperspace is local! - ASSERT(StartPde->u.Hard.Valid == 0); - ASSERT(TempPde.u.Hard.Valid == 1); - *StartPde = TempPde; + MI_WRITE_VALID_PTE(StartPde, TempPde); /* Flush the TLB */ KeFlushCurrentTb(); diff --git a/ntoskrnl/mm/ARM3/iosup.c b/ntoskrnl/mm/ARM3/iosup.c index 1a174509382..d02d7d41847 100644 --- a/ntoskrnl/mm/ARM3/iosup.c +++ b/ntoskrnl/mm/ARM3/iosup.c @@ -90,8 +90,8 @@ MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, // Also translate the cache attribute // Pfn = (PFN_NUMBER)(PhysicalAddress.QuadPart >> PAGE_SHIFT); - IsIoMapping = (Pfn > MmHighestPhysicalPage) ? TRUE : FALSE; - if (!IsIoMapping) Pfn1 = MiGetPfnEntry(Pfn); + Pfn1 = MiGetPfnEntry(Pfn); + IsIoMapping = (Pfn1 == NULL) ? TRUE : FALSE; CacheAttribute = MiPlatformCacheAttributes[IsIoMapping][CacheType]; // @@ -171,16 +171,11 @@ MmMapIoSpace(IN PHYSICAL_ADDRESS PhysicalAddress, // do { - // - // Start out with nothing - // - ASSERT(PointerPte->u.Hard.Valid == 0); - // // Write the PFN // TempPte.u.Hard.PageFrameNumber = Pfn++; - *PointerPte++ = TempPte; + MI_WRITE_VALID_PTE(PointerPte++, TempPte); } while (--PageCount); // @@ -219,7 +214,7 @@ MmUnmapIoSpace(IN PVOID BaseAddress, // // Is this an I/O mapping? // - if (Pfn > MmHighestPhysicalPage) + if (!MiGetPfnEntry(Pfn)) { // // Destroy the PTE diff --git a/ntoskrnl/mm/ARM3/mdlsup.c b/ntoskrnl/mm/ARM3/mdlsup.c index 1b95448fc43..7488e52544c 100644 --- a/ntoskrnl/mm/ARM3/mdlsup.c +++ b/ntoskrnl/mm/ARM3/mdlsup.c @@ -129,7 +129,7 @@ MmBuildMdlForNonPagedPool(IN PMDL Mdl) // // Check if this is an I/O mapping // - if (Pfn > MmHighestPhysicalPage) Mdl->MdlFlags |= MDL_IO_SPACE; + if (!MiGetPfnEntry(Pfn)) Mdl->MdlFlags |= MDL_IO_SPACE; } /* @@ -416,9 +416,8 @@ MmMapLockedPagesSpecifyCache(IN PMDL Mdl, // // Write the PTE // - ASSERT(PointerPte->u.Hard.Valid == 0); TempPte.u.Hard.PageFrameNumber = *MdlPages; - *PointerPte++ = TempPte; + MI_WRITE_VALID_PTE(PointerPte++, TempPte); } while (++MdlPages < LastPage); // diff --git a/ntoskrnl/mm/ARM3/miarm.h b/ntoskrnl/mm/ARM3/miarm.h index 193eb04e698..88b25c46d39 100644 --- a/ntoskrnl/mm/ARM3/miarm.h +++ b/ntoskrnl/mm/ARM3/miarm.h @@ -43,10 +43,9 @@ #define _1MB (1024 * _1KB) /* Area mapped by a PDE */ -#define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) +#define PDE_MAPPED_VA (PTE_COUNT * PAGE_SIZE) -/* Size of a PDE directory, and size of a page table */ -#define PDE_SIZE (PDE_COUNT * sizeof(MMPDE)) +/* Size of a page table */ #define PT_SIZE (PTE_COUNT * sizeof(MMPTE)) /* Architecture specific count of PDEs in a directory, and count of PTEs in a PT */ @@ -89,6 +88,90 @@ #define MM_DECOMMIT 0x10 #define MM_NOACCESS (MM_DECOMMIT | MM_NOCACHE) +// +// Specific PTE Definitions that map to the Memory Manager's Protection Mask Bits +// The Memory Manager's definition define the attributes that must be preserved +// and these PTE definitions describe the attributes in the hardware sense. This +// helps deal with hardware differences between the actual boolean expression of +// the argument. +// +// For example, in the logical attributes, we want to express read-only as a flag +// but on x86, it is writability that must be set. On the other hand, on x86, just +// like in the kernel, it is disabling the caches that requires a special flag, +// while on certain architectures such as ARM, it is enabling the cache which +// requires a flag. +// +#if defined(_M_IX86) || defined(_M_AMD64) +// +// Access Flags +// +#define PTE_READONLY 0 +#define PTE_EXECUTE 0 // Not worrying about NX yet +#define PTE_EXECUTE_READ 0 // Not worrying about NX yet +#define PTE_READWRITE 0x2 +#define PTE_WRITECOPY 0x200 +#define PTE_EXECUTE_READWRITE 0x0 +#define PTE_EXECUTE_WRITECOPY 0x200 +// +// Cache flags +// +#define PTE_ENABLE_CACHE 0 +#define PTE_DISABLE_CACHE 0x10 +#define PTE_WRITECOMBINED_CACHE 0x10 +#elif defined(_M_ARM) +#else +#error Define these please! +#endif +static const +ULONG +MmProtectToPteMask[32] = +{ + // + // These are the base MM_ protection flags + // + 0, + PTE_READONLY | PTE_ENABLE_CACHE, + PTE_EXECUTE | PTE_ENABLE_CACHE, + PTE_EXECUTE_READ | PTE_ENABLE_CACHE, + PTE_READWRITE | PTE_ENABLE_CACHE, + PTE_WRITECOPY | PTE_ENABLE_CACHE, + PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE, + PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE, + // + // These OR in the MM_NOCACHE flag + // + 0, + PTE_READONLY | PTE_DISABLE_CACHE, + PTE_EXECUTE | PTE_DISABLE_CACHE, + PTE_EXECUTE_READ | PTE_DISABLE_CACHE, + PTE_READWRITE | PTE_DISABLE_CACHE, + PTE_WRITECOPY | PTE_DISABLE_CACHE, + PTE_EXECUTE_READWRITE | PTE_DISABLE_CACHE, + PTE_EXECUTE_WRITECOPY | PTE_DISABLE_CACHE, + // + // These OR in the MM_DECOMMIT flag, which doesn't seem supported on x86/64/ARM + // + 0, + PTE_READONLY | PTE_ENABLE_CACHE, + PTE_EXECUTE | PTE_ENABLE_CACHE, + PTE_EXECUTE_READ | PTE_ENABLE_CACHE, + PTE_READWRITE | PTE_ENABLE_CACHE, + PTE_WRITECOPY | PTE_ENABLE_CACHE, + PTE_EXECUTE_READWRITE | PTE_ENABLE_CACHE, + PTE_EXECUTE_WRITECOPY | PTE_ENABLE_CACHE, + // + // These OR in the MM_NOACCESS flag, which seems to enable WriteCombining? + // + 0, + PTE_READONLY | PTE_WRITECOMBINED_CACHE, + PTE_EXECUTE | PTE_WRITECOMBINED_CACHE, + PTE_EXECUTE_READ | PTE_WRITECOMBINED_CACHE, + PTE_READWRITE | PTE_WRITECOMBINED_CACHE, + PTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, + PTE_EXECUTE_READWRITE | PTE_WRITECOMBINED_CACHE, + PTE_EXECUTE_WRITECOPY | PTE_WRITECOMBINED_CACHE, +}; + // // Assertions for session images, addresses, and PTEs // @@ -119,6 +202,12 @@ // #define MI_MAKE_SOFTWARE_PTE(p, x) ((p)->u.Long = (x << MM_PTE_SOFTWARE_PROTECTION_BITS)) +// +// Marks a PTE as deleted +// +#define MI_SET_PFN_DELETED(x) ((x)->PteAddress = (PMMPTE)((ULONG_PTR)(x)->PteAddress | 1)) +#define MI_IS_PFN_DELETED(x) ((ULONG_PTR)((x)->PteAddress) & 1) + // // Special values for LoadedImports // @@ -135,13 +224,18 @@ // Special IRQL value (found in assertions) // #define MM_NOIRQL (KIRQL)0xFFFFFFFF - + // // FIXFIX: These should go in ex.h after the pool merge // -#define POOL_LISTS_PER_PAGE (PAGE_SIZE / sizeof(LIST_ENTRY)) +#ifdef _M_AMD64 +#define POOL_BLOCK_SIZE 16 +#else +#define POOL_BLOCK_SIZE 8 +#endif +#define POOL_LISTS_PER_PAGE (PAGE_SIZE / POOL_BLOCK_SIZE) #define BASE_POOL_TYPE_MASK 1 -#define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + sizeof(LIST_ENTRY))) +#define POOL_MAX_ALLOC (PAGE_SIZE - (sizeof(POOL_HEADER) + POOL_BLOCK_SIZE)) typedef struct _POOL_DESCRIPTOR { @@ -166,16 +260,30 @@ typedef struct _POOL_HEADER { struct { +#ifdef _M_AMD64 + ULONG PreviousSize:8; + ULONG PoolIndex:8; + ULONG BlockSize:8; + ULONG PoolType:8; +#else USHORT PreviousSize:9; USHORT PoolIndex:7; USHORT BlockSize:9; USHORT PoolType:7; +#endif }; ULONG Ulong1; }; +#ifdef _M_AMD64 + ULONG PoolTag; +#endif union { +#ifdef _M_AMD64 + PEPROCESS ProcessBilled; +#else ULONG PoolTag; +#endif struct { USHORT AllocatorBackTraceIndex; @@ -184,11 +292,8 @@ typedef struct _POOL_HEADER }; } POOL_HEADER, *PPOOL_HEADER; -// -// Everything depends on this -// -C_ASSERT(sizeof(POOL_HEADER) == 8); -C_ASSERT(sizeof(POOL_HEADER) == sizeof(LIST_ENTRY)); +C_ASSERT(sizeof(POOL_HEADER) == POOL_BLOCK_SIZE); +C_ASSERT(POOL_BLOCK_SIZE == sizeof(LIST_ENTRY)); extern ULONG ExpNumberOfPagedPools; extern POOL_DESCRIPTOR NonPagedPoolDescriptor; @@ -247,7 +352,7 @@ typedef struct _MI_LARGE_PAGE_RANGES } MI_LARGE_PAGE_RANGES, *PMI_LARGE_PAGE_RANGES; extern MMPTE HyperTemplatePte; -extern MMPTE ValidKernelPde; +extern MMPDE ValidKernelPde; extern MMPTE ValidKernelPte; extern BOOLEAN MmLargeSystemCache; extern BOOLEAN MmZeroPageFile; @@ -355,6 +460,29 @@ extern PFN_NUMBER MmSystemPageDirectory[PD_COUNT]; #define MI_PFN_TO_PFNENTRY(x) (&MmPfnDatabase[1][x]) #define MI_PFNENTRY_TO_PFN(x) (x - MmPfnDatabase[1]) +// +// Creates a valid kernel PTE with the given protection +// +FORCEINLINE +VOID +MI_MAKE_HARDWARE_PTE(IN PMMPTE NewPte, + IN PMMPTE MappingPte, + IN ULONG ProtectionMask, + IN PFN_NUMBER PageFrameNumber) +{ + /* Only valid for kernel, non-session PTEs */ + ASSERT(MappingPte > MiHighestUserPte); + ASSERT(!MI_IS_SESSION_PTE(MappingPte)); + ASSERT((MappingPte < (PMMPTE)PDE_BASE) || (MappingPte > (PMMPTE)PDE_TOP)); + + /* Start fresh */ + *NewPte = ValidKernelPte; + + /* Set the protection and page */ + NewPte->u.Hard.PageFrameNumber = PageFrameNumber; + NewPte->u.Long |= MmProtectToPteMask[ProtectionMask]; +} + // // Returns if the page is physically resident (ie: a large page) // FIXFIX: CISC/x86 only? @@ -370,6 +498,33 @@ MI_IS_PHYSICAL_ADDRESS(IN PVOID Address) return ((PointerPde->u.Hard.LargePage) && (PointerPde->u.Hard.Valid)); } +// +// Writes a valid PTE +// +VOID +FORCEINLINE +MI_WRITE_VALID_PTE(IN PMMPTE PointerPte, + IN MMPTE TempPte) +{ + /* Write the valid PTE */ + ASSERT(PointerPte->u.Hard.Valid == 0); + ASSERT(TempPte.u.Hard.Valid == 1); + *PointerPte = TempPte; +} + +// +// Writes an invalid PTE +// +VOID +FORCEINLINE +MI_WRITE_INVALID_PTE(IN PMMPTE PointerPte, + IN MMPTE InvalidPte) +{ + /* Write the invalid PTE */ + ASSERT(InvalidPte.u.Hard.Valid == 0); + *PointerPte = InvalidPte; +} + NTSTATUS NTAPI MmArmInitSystem( @@ -585,18 +740,56 @@ MiAllocatePfn( IN ULONG Protection ); +VOID +NTAPI +MiInitializePfn( + IN PFN_NUMBER PageFrameIndex, + IN PMMPTE PointerPte, + IN BOOLEAN Modified +); + +VOID +NTAPI +MiInitializePfnForOtherProcess( + IN PFN_NUMBER PageFrameIndex, + IN PMMPTE PointerPte, + IN PFN_NUMBER PteFrame +); + +VOID +NTAPI +MiDecrementShareCount( + IN PMMPFN Pfn1, + IN PFN_NUMBER PageFrameIndex +); + PFN_NUMBER NTAPI MiRemoveAnyPage( IN ULONG Color ); +PFN_NUMBER +NTAPI +MiRemoveZeroPage( + IN ULONG Color +); + VOID NTAPI MiInsertPageInFreeList( IN PFN_NUMBER PageFrameIndex ); +PFN_NUMBER +NTAPI +MiDeleteSystemPageableVm( + IN PMMPTE PointerPte, + IN PFN_NUMBER PageCount, + IN ULONG Flags, + OUT PPFN_NUMBER ValidPages +); + PLDR_DATA_TABLE_ENTRY NTAPI MiLookupDataTableEntry( diff --git a/ntoskrnl/mm/ARM3/mminit.c b/ntoskrnl/mm/ARM3/mminit.c index eba66b18311..1e79a23c6cf 100644 --- a/ntoskrnl/mm/ARM3/mminit.c +++ b/ntoskrnl/mm/ARM3/mminit.c @@ -439,7 +439,7 @@ MiInitializeColorTables(VOID) MMPTE TempPte = ValidKernelPte; /* The color table starts after the ARM3 PFN database */ - MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[1][MmHighestPhysicalPage + 1]; + MmFreePagesByColor[0] = (PMMCOLOR_TABLES)&MmPfnDatabase[MmHighestPhysicalPage + 1]; /* Loop the PTEs. We have two color tables for each secondary color */ PointerPte = MiAddressToPte(&MmFreePagesByColor[0][0]); @@ -453,9 +453,8 @@ MiInitializeColorTables(VOID) { /* Get a page and map it */ TempPte.u.Hard.PageFrameNumber = MxGetNextPage(1); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - + MI_WRITE_VALID_PTE(PointerPte, TempPte); + /* Zero out the page */ RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); } @@ -585,8 +584,8 @@ MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) } /* Get the PTEs for this range */ - PointerPte = MiAddressToPte(&MmPfnDatabase[0][BasePage]); - LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[0][BasePage + PageCount]) - 1); + PointerPte = MiAddressToPte(&MmPfnDatabase[BasePage]); + LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[BasePage + PageCount]) - 1); DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); /* Loop them */ @@ -614,9 +613,7 @@ MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Write out this PTE */ PagesLeft++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; + MI_WRITE_VALID_PTE(PointerPte, TempPte); /* Zero this page */ RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); @@ -625,49 +622,7 @@ MiMapPfnDatabase(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Next! */ PointerPte++; } - - /* Get the PTEs for this range */ - PointerPte = MiAddressToPte(&MmPfnDatabase[1][BasePage]); - LastPte = MiAddressToPte(((ULONG_PTR)&MmPfnDatabase[1][BasePage + PageCount]) - 1); - DPRINT("MD Type: %lx Base: %lx Count: %lx\n", MdBlock->MemoryType, BasePage, PageCount); - - /* Loop them */ - while (PointerPte <= LastPte) - { - /* We'll only touch PTEs that aren't already valid */ - if (PointerPte->u.Hard.Valid == 0) - { - /* Use the next free page */ - TempPte.u.Hard.PageFrameNumber = FreePage; - ASSERT(FreePageCount != 0); - - /* Consume free pages */ - FreePage++; - FreePageCount--; - if (!FreePageCount) - { - /* Out of memory */ - KeBugCheckEx(INSTALL_MORE_MEMORY, - MmNumberOfPhysicalPages, - FreePageCount, - MxOldFreeDescriptor.PageCount, - 1); - } - - /* Write out this PTE */ - PagesLeft++; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - /* Zero this page */ - RtlZeroMemory(MiPteToAddress(PointerPte), PAGE_SIZE); - } - - /* Next! */ - PointerPte++; - } - + /* Do the next address range */ NextEntry = MdBlock->ListEntry.Flink; } @@ -706,7 +661,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) if (MiIsRegularMemory(LoaderBlock, PageFrameIndex)) { /* Yes we do, set it up */ - Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + Pfn1 = MiGetPfnEntry(PageFrameIndex); Pfn1->u4.PteFrame = StartupPdIndex; Pfn1->PteAddress = PointerPde; Pfn1->u2.ShareCount++; @@ -745,7 +700,7 @@ MiBuildPfnDatabaseFromPages(IN PLOADER_PARAMETER_BLOCK LoaderBlock) MmSizeOfNonPagedPoolInBytes))) { /* Get the PFN entry and make sure it too is valid */ - Pfn2 = MI_PFN_TO_PFNENTRY(PtePageIndex); + Pfn2 = MiGetPfnEntry(PtePageIndex); if ((MmIsAddressValid(Pfn2)) && (MmIsAddressValid(Pfn2 + 1))) { @@ -785,7 +740,7 @@ MiBuildPfnDatabaseZeroPage(VOID) PMMPDE PointerPde; /* Grab the lowest page and check if it has no real references */ - Pfn1 = MI_PFN_TO_PFNENTRY(MmLowestPhysicalPage); + Pfn1 = MiGetPfnEntry(MmLowestPhysicalPage); if (!(MmLowestPhysicalPage) && !(Pfn1->u3.e2.ReferenceCount)) { /* Make it a bogus page to catch errors */ @@ -810,6 +765,7 @@ MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PMMPFN Pfn1; PMMPTE PointerPte; PMMPDE PointerPde; + KIRQL OldIrql; /* Now loop through the descriptors */ NextEntry = LoaderBlock->MemoryDescriptorListHead.Flink; @@ -860,14 +816,18 @@ MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Get the last page of this descriptor. Note we loop backwards */ PageFrameIndex += PageCount - 1; - Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + + /* Lock the PFN Database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); while (PageCount--) { /* If the page really has no references, mark it as free */ if (!Pfn1->u3.e2.ReferenceCount) { + /* Add it to the free list */ Pfn1->u3.e1.CacheAttribute = MiNonCached; - //MiInsertPageInFreeList(PageFrameIndex); + MiInsertPageInFreeList(PageFrameIndex); } /* Go to the next page */ @@ -875,6 +835,9 @@ MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) PageFrameIndex--; } + /* Release PFN database */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + /* Done with this block */ break; @@ -890,7 +853,7 @@ MiBuildPfnDatabaseFromLoaderBlock(IN PLOADER_PARAMETER_BLOCK LoaderBlock) /* Map these pages with the KSEG0 mapping that adds 0x80000000 */ PointerPte = MiAddressToPte(KSEG0_BASE + (PageFrameIndex << PAGE_SHIFT)); - Pfn1 = MI_PFN_TO_PFNENTRY(PageFrameIndex); + Pfn1 = MiGetPfnEntry(PageFrameIndex); while (PageCount--) { /* Check if the page is really unused */ @@ -940,15 +903,15 @@ MiBuildPfnDatabaseSelf(VOID) PMMPFN Pfn1; /* Loop the PFN database page */ - PointerPte = MiAddressToPte(MI_PFN_TO_PFNENTRY(MmLowestPhysicalPage)); - LastPte = MiAddressToPte(MI_PFN_TO_PFNENTRY(MmHighestPhysicalPage)); + PointerPte = MiAddressToPte(MiGetPfnEntry(MmLowestPhysicalPage)); + LastPte = MiAddressToPte(MiGetPfnEntry(MmHighestPhysicalPage)); while (PointerPte <= LastPte) { /* Make sure the page is valid */ if (PointerPte->u.Hard.Valid == 1) { /* Get the PFN entry and just mark it referenced */ - Pfn1 = MI_PFN_TO_PFNENTRY(PointerPte->u.Hard.PageFrameNumber); + Pfn1 = MiGetPfnEntry(PointerPte->u.Hard.PageFrameNumber); Pfn1->u2.ShareCount = 1; Pfn1->u3.e2.ReferenceCount = 1; } @@ -1258,7 +1221,7 @@ MmDumpArmPfnDatabase(VOID) // for (i = 0; i <= MmHighestPhysicalPage; i++) { - Pfn1 = MI_PFN_TO_PFNENTRY(i); + Pfn1 = MiGetPfnEntry(i); if (!Pfn1) continue; // @@ -1516,9 +1479,7 @@ MiBuildPagedPool(VOID) TempPte = ValidKernelPte; ASSERT(PD_COUNT == 1); TempPte.u.Hard.PageFrameNumber = MmSystemPageDirectory[0]; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; + MI_WRITE_VALID_PTE(PointerPte, TempPte); // // Let's get back to paged pool work: size it up. @@ -1586,14 +1547,15 @@ MiBuildPagedPool(VOID) // OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); - // - // Allocate a page and map the first paged pool PDE - // - PageFrameIndex = MmAllocPage(MC_NPPOOL); + /* Allocate a page and map the first paged pool PDE */ + PageFrameIndex = MiRemoveZeroPage(0); TempPte.u.Hard.PageFrameNumber = PageFrameIndex; - ASSERT(PointerPde->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPde = TempPte; + MI_WRITE_VALID_PTE(PointerPde, TempPte); + + /* Initialize the PFN entry for it */ + MiInitializePfnForOtherProcess(PageFrameIndex, + PointerPde, + MmSystemPageDirectory[(PointerPde - (PMMPTE)PDE_BASE) / PDE_COUNT]); // // Release the PFN database lock @@ -1845,7 +1807,7 @@ MmArmInitSystem(IN ULONG Phase, // Sync us up with ReactOS Mm // MiSyncARM3WithROS(MmNonPagedSystemStart, (PVOID)((ULONG_PTR)MmNonPagedPoolEnd - 1)); - MiSyncARM3WithROS(MmPfnDatabase[0], (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); + MiSyncARM3WithROS(MmPfnDatabase, (PVOID)((ULONG_PTR)MmNonPagedPoolStart + MmSizeOfNonPagedPoolInBytes - 1)); MiSyncARM3WithROS((PVOID)HYPER_SPACE, (PVOID)(HYPER_SPACE + PAGE_SIZE - 1)); // @@ -2026,6 +1988,12 @@ MmArmInitSystem(IN ULONG Phase, /* Size up paged pool and build the shadow system page directory */ MiBuildPagedPool(); + + /* Debugger physical memory support is now ready to be used */ + MiDbgReadyForPhysical = TRUE; + + /* Initialize the loaded module list */ + MiInitializeLoadedModuleList(LoaderBlock); } // diff --git a/ntoskrnl/mm/ARM3/ncache.c b/ntoskrnl/mm/ARM3/ncache.c index 659811dc57b..d49d72f3054 100644 --- a/ntoskrnl/mm/ARM3/ncache.c +++ b/ntoskrnl/mm/ARM3/ncache.c @@ -154,9 +154,7 @@ MmAllocateNonCachedMemory(IN ULONG NumberOfBytes) // Set the PFN in the page and write it // TempPte.u.Hard.PageFrameNumber = PageFrameIndex; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte++ = TempPte; + MI_WRITE_VALID_PTE(PointerPte++, TempPte); } while (--PageCount); // diff --git a/ntoskrnl/mm/ARM3/pagfault.c b/ntoskrnl/mm/ARM3/pagfault.c index 7455a100af1..05fdb2dcade 100644 --- a/ntoskrnl/mm/ARM3/pagfault.c +++ b/ntoskrnl/mm/ARM3/pagfault.c @@ -65,7 +65,7 @@ MiCheckPdeForPagedPool(IN PVOID Address) if (PointerPde->u.Hard.Valid == 0) { /* This seems to be making the assumption that one PDE is one page long */ - ASSERT(PAGE_SIZE == (PD_COUNT * (sizeof(MMPTE) * PDE_COUNT))); + C_ASSERT(PAGE_SIZE == (PD_COUNT * (sizeof(MMPTE) * PDE_COUNT))); // // Copy it from our double-mapped system page directory @@ -105,12 +105,13 @@ MiResolveDemandZeroFault(IN PVOID Address, OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); ASSERT(PointerPte->u.Hard.Valid == 0); - // - // Get a page - // - PageFrameNumber = MmAllocPage(MC_PPOOL); + /* Get a page */ + PageFrameNumber = MiRemoveAnyPage(0); DPRINT("New pool page: %lx\n", PageFrameNumber); + /* Initialize it */ + MiInitializePfn(PageFrameNumber, PointerPte, TRUE); + // // Release PFN lock // @@ -124,16 +125,10 @@ MiResolveDemandZeroFault(IN PVOID Address, /* Shouldn't see faults for user PTEs yet */ ASSERT(PointerPte > MiHighestUserPte); - // - // Build the PTE - // - TempPte = ValidKernelPte; - TempPte.u.Hard.PageFrameNumber = PageFrameNumber; - ASSERT(TempPte.u.Hard.Valid == 1); - ASSERT(PointerPte->u.Hard.Valid == 0); - *PointerPte = TempPte; - ASSERT(PointerPte->u.Hard.Valid == 1); - + /* Build the PTE */ + MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte, PointerPte->u.Soft.Protection, PageFrameNumber); + MI_WRITE_VALID_PTE(PointerPte, TempPte); + // // It's all good now // diff --git a/ntoskrnl/mm/ARM3/pfnlist.c b/ntoskrnl/mm/ARM3/pfnlist.c index ff17eb0b3c8..fb24d9fdbff 100644 --- a/ntoskrnl/mm/ARM3/pfnlist.c +++ b/ntoskrnl/mm/ARM3/pfnlist.c @@ -16,6 +16,20 @@ #define MODULE_INVOLVED_IN_ARM3 #include "../ARM3/miarm.h" +#if DBG +#define ASSERT_LIST_INVARIANT(x) \ +do { \ + ASSERT(((x)->Total == 0 && \ + (x)->Flink == LIST_HEAD && \ + (x)->Blink == LIST_HEAD) || \ + ((x)->Total != 0 && \ + (x)->Flink != LIST_HEAD && \ + (x)->Blink != LIST_HEAD)); \ +} while (0) +#else +#define ASSERT_LIST_INVARIANT(x) +#endif + /* GLOBALS ********************************************************************/ BOOLEAN MmDynamicPfn; @@ -42,12 +56,28 @@ PMMPFNLIST MmPageLocationList[] = }; /* FUNCTIONS ******************************************************************/ +VOID +NTAPI +MiZeroPhysicalPage(IN PFN_NUMBER PageFrameIndex) +{ + KIRQL OldIrql; + PVOID VirtualAddress; + PEPROCESS Process = PsGetCurrentProcess(); + + /* Map in hyperspace, then wipe it using XMMI or MEMSET */ + VirtualAddress = MiMapPageInHyperSpace(Process, PageFrameIndex, &OldIrql); + KeZeroPages(VirtualAddress, PAGE_SIZE); + MiUnmapPageInHyperSpace(Process, VirtualAddress, OldIrql); +} + VOID NTAPI MiInsertInListTail(IN PMMPFNLIST ListHead, IN PMMPFN Entry) { PFN_NUMBER OldBlink, EntryIndex = MiGetPfnEntryIndex(Entry); + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT_LIST_INVARIANT(ListHead); /* Get the back link */ OldBlink = ListHead->Blink; @@ -69,6 +99,7 @@ MiInsertInListTail(IN PMMPFNLIST ListHead, /* And now the head points back to us, since we are last */ ListHead->Blink = EntryIndex; ListHead->Total++; + ASSERT_LIST_INVARIANT(ListHead); } VOID @@ -97,6 +128,7 @@ MiInsertZeroListAtBack(IN PFN_NUMBER EntryIndex) /* Use the zero list */ ListHead = &MmZeroedPageListHead; + ASSERT_LIST_INVARIANT(ListHead); ListHead->Total++; /* Get the back link */ @@ -118,6 +150,7 @@ MiInsertZeroListAtBack(IN PFN_NUMBER EntryIndex) /* And now the head points back to us, since we are last */ ListHead->Blink = EntryIndex; + ASSERT_LIST_INVARIANT(ListHead); /* Update the page location */ Pfn1->u3.e1.PageLocation = ZeroedPageList; @@ -136,6 +169,7 @@ MiInsertZeroListAtBack(IN PFN_NUMBER EntryIndex) /* Otherwise check if we reached the high threshold and signal the event */ KeSetEvent(MiHighMemoryEvent, 0, FALSE); } + #if 0 /* Get the page color */ Color = EntryIndex & MmSecondaryColorMask; @@ -177,7 +211,7 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) /* Make sure the PFN lock is held */ ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); - + /* Make sure the PFN entry isn't in-use */ ASSERT(Entry->u3.e1.WriteInProgress == 0); ASSERT(Entry->u3.e1.ReadInProgress == 0); @@ -187,7 +221,8 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) ListName = ListHead->ListName; ASSERT(ListHead != NULL); ASSERT(ListName <= FreePageList); - + ASSERT_LIST_INVARIANT(ListHead); + /* Remove one count */ ASSERT(ListHead->Total != 0); ListHead->Total--; @@ -205,7 +240,7 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) else { /* Set the list head's backlink instead */ - ListHead->Blink = OldFlink; + ListHead->Blink = OldBlink; } /* Check if the back entry is the list head */ @@ -222,7 +257,8 @@ MiUnlinkFreeOrZeroedPage(IN PMMPFN Entry) /* We are not on a list anymore */ Entry->u1.Flink = Entry->u2.Blink = 0; - + ASSERT_LIST_INVARIANT(ListHead); + /* FIXME: Deal with color list */ /* See if we hit any thresholds */ @@ -272,6 +308,7 @@ MiRemovePageByColor(IN PFN_NUMBER PageIndex, /* Could be either on free or zero list */ ListHead = MmPageLocationList[Pfn1->u3.e1.PageLocation]; + ASSERT_LIST_INVARIANT(ListHead); ListName = ListHead->ListName; ASSERT(ListName <= FreePageList); @@ -307,12 +344,14 @@ MiRemovePageByColor(IN PFN_NUMBER PageIndex, } /* We are not on a list anymore */ + ASSERT_LIST_INVARIANT(ListHead); Pfn1->u1.Flink = Pfn1->u2.Blink = 0; /* Zero flags but restore color and cache */ Pfn1->u3.e2.ShortFlags = 0; Pfn1->u3.e1.PageColor = OldColor; Pfn1->u3.e1.CacheAttribute = OldCache; + #if 0 // When switching to ARM3 /* Get the first page on the color list */ ColorTable = &MmFreePagesByColor[ListName][Color]; @@ -379,12 +418,13 @@ MiRemoveAnyPage(IN ULONG Color) { #endif /* Check the free list */ + ASSERT_LIST_INVARIANT(&MmFreePageListHead); PageIndex = MmFreePageListHead.Flink; Color = PageIndex & MmSecondaryColorMask; if (PageIndex == LIST_HEAD) { /* Check the zero list */ - ASSERT(MmFreePageListHead.Total == 0); + ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); PageIndex = MmZeroedPageListHead.Flink; Color = PageIndex & MmSecondaryColorMask; ASSERT(PageIndex != LIST_HEAD); @@ -408,18 +448,95 @@ MiRemoveAnyPage(IN ULONG Color) (Pfn1->u3.e1.PageLocation == ZeroedPageList)); ASSERT(Pfn1->u3.e2.ReferenceCount == 0); ASSERT(Pfn1->u2.ShareCount == 0); + ASSERT_LIST_INVARIANT(&MmFreePageListHead); + ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); /* Return the page */ return PageIndex; } +PFN_NUMBER +NTAPI +MiRemoveZeroPage(IN ULONG Color) +{ + PFN_NUMBER PageIndex; + PMMPFN Pfn1; + BOOLEAN Zero; + + /* Make sure PFN lock is held and we have pages */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT(MmAvailablePages != 0); + ASSERT(Color < MmSecondaryColors); + + /* Check the colored zero list */ +#if 0 // Enable when using ARM3 database */ + PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink; + if (PageIndex == LIST_HEAD) + { +#endif + /* Check the zero list */ + ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); + PageIndex = MmZeroedPageListHead.Flink; + Color = PageIndex & MmSecondaryColorMask; + if (PageIndex == LIST_HEAD) + { + ASSERT(MmZeroedPageListHead.Total == 0); + Zero = TRUE; +#if 0 // Enable when using ARM3 database */ + /* Check the colored free list */ + PageIndex = MmFreePagesByColor[ZeroedPageList][Color].Flink; + if (PageIndex == LIST_HEAD) + { +#endif + /* Check the free list */ + ASSERT_LIST_INVARIANT(&MmFreePageListHead); + PageIndex = MmFreePageListHead.Flink; + Color = PageIndex & MmSecondaryColorMask; + ASSERT(PageIndex != LIST_HEAD); + if (PageIndex == LIST_HEAD) + { + /* FIXME: Should check the standby list */ + ASSERT(MmZeroedPageListHead.Total == 0); + } +#if 0 // Enable when using ARM3 database */ + } +#endif + } +#if 0 // Enable when using ARM3 database */ + } +#endif + /* Sanity checks */ + Pfn1 = MiGetPfnEntry(PageIndex); + ASSERT((Pfn1->u3.e1.PageLocation == FreePageList) || + (Pfn1->u3.e1.PageLocation == ZeroedPageList)); + + /* Remove the page from its list */ + PageIndex = MiRemovePageByColor(PageIndex, Color); + ASSERT(Pfn1 == MiGetPfnEntry(PageIndex)); + + /* Zero it, if needed */ + if (Zero) MiZeroPhysicalPage(PageIndex); + + /* Sanity checks */ + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); + ASSERT(Pfn1->u2.ShareCount == 0); + ASSERT_LIST_INVARIANT(&MmFreePageListHead); + ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); + + /* Return the page */ + return PageIndex; +} + + PMMPFN NTAPI MiRemoveHeadList(IN PMMPFNLIST ListHead) { PFN_NUMBER Entry, Flink; PMMPFN Pfn1; - + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + ASSERT_LIST_INVARIANT(ListHead); + /* Get the entry that's currently first on the list */ Entry = ListHead->Flink; Pfn1 = MiGetPfnEntry(Entry); @@ -443,7 +560,8 @@ MiRemoveHeadList(IN PMMPFNLIST ListHead) /* We are not on a list anymore */ Pfn1->u1.Flink = Pfn1->u2.Blink = 0; ListHead->Total--; - + ASSERT_LIST_INVARIANT(ListHead); + /* Return the head element */ return Pfn1; } @@ -461,6 +579,7 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) PMMCOLOR_TABLES ColorTable; #endif /* Make sure the page index is valid */ + ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL); ASSERT((PageFrameIndex != 0) && (PageFrameIndex <= MmHighestPhysicalPage) && (PageFrameIndex >= MmLowestPhysicalPage)); @@ -477,6 +596,7 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) /* Get the free page list and increment its count */ ListHead = &MmFreePageListHead; + ASSERT_LIST_INVARIANT(ListHead); ListHead->Total++; /* Get the last page on the list */ @@ -494,7 +614,8 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) /* Now make the list head point back to us (since we go at the end) */ ListHead->Blink = PageFrameIndex; - + ASSERT_LIST_INVARIANT(ListHead); + /* And initialize our own list pointers */ Pfn1->u1.Flink = LIST_HEAD; Pfn1->u2.Blink = LastPage; @@ -502,7 +623,7 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) /* Set the list name and default priority */ Pfn1->u3.e1.PageLocation = FreePageList; Pfn1->u4.Priority = 3; - + /* Clear some status fields */ Pfn1->u4.InPageError = 0; Pfn1->u4.AweAllocation = 0; @@ -561,4 +682,207 @@ MiInsertPageInFreeList(IN PFN_NUMBER PageFrameIndex) } } +VOID +NTAPI +MiInitializePfn(IN PFN_NUMBER PageFrameIndex, + IN PMMPTE PointerPte, + IN BOOLEAN Modified) +{ + PMMPFN Pfn1; + NTSTATUS Status; + PMMPTE PointerPtePte; + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Setup the PTE */ + Pfn1 = MiGetPfnEntry(PageFrameIndex); + Pfn1->PteAddress = PointerPte; + + /* Check if this PFN is part of a valid address space */ + if (PointerPte->u.Hard.Valid == 1) + { + /* FIXME: TODO */ + ASSERT(FALSE); + } + + /* Otherwise this is a fresh page -- set it up */ + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u2.ShareCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + ASSERT(Pfn1->u3.e1.Rom == 0); + Pfn1->u3.e1.Modified = Modified; + + /* Get the page table for the PTE */ + PointerPtePte = MiAddressToPte(PointerPte); + if (PointerPtePte->u.Hard.Valid == 0) + { + /* Make sure the PDE gets paged in properly */ + Status = MiCheckPdeForPagedPool(PointerPte); + if (!NT_SUCCESS(Status)) + { + /* Crash */ + KeBugCheckEx(MEMORY_MANAGEMENT, + 0x61940, + (ULONG_PTR)PointerPte, + (ULONG_PTR)PointerPtePte->u.Long, + (ULONG_PTR)MiPteToAddress(PointerPte)); + } + } + + /* Get the PFN for the page table */ + PageFrameIndex = PFN_FROM_PTE(PointerPtePte); + ASSERT(PageFrameIndex != 0); + Pfn1->u4.PteFrame = PageFrameIndex; + + /* Increase its share count so we don't get rid of it */ + Pfn1 = MiGetPfnEntry(PageFrameIndex); + Pfn1->u2.ShareCount++; +} + +PFN_NUMBER +NTAPI +MiAllocatePfn(IN PMMPTE PointerPte, + IN ULONG Protection) +{ + KIRQL OldIrql; + PFN_NUMBER PageFrameIndex; + MMPTE TempPte; + + /* Sanity check that we aren't passed a valid PTE */ + ASSERT(PointerPte->u.Hard.Valid == 0); + + /* Make an empty software PTE */ + MI_MAKE_SOFTWARE_PTE(&TempPte, MM_READWRITE); + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Check if we're running low on pages */ + if (MmAvailablePages < 128) + { + DPRINT1("Warning, running low on memory: %d pages left\n", MmAvailablePages); + //MiEnsureAvailablePageOrWait(NULL, OldIrql); + } + + /* Grab a page */ + ASSERT_LIST_INVARIANT(&MmFreePageListHead); + ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); + PageFrameIndex = MiRemoveAnyPage(0); + + /* Write the software PTE */ + MI_WRITE_INVALID_PTE(PointerPte, TempPte); + PointerPte->u.Soft.Protection |= Protection; + + /* Initialize its PFN entry */ + MiInitializePfn(PageFrameIndex, PointerPte, TRUE); + + /* Release the PFN lock and return the page */ + ASSERT_LIST_INVARIANT(&MmFreePageListHead); + ASSERT_LIST_INVARIANT(&MmZeroedPageListHead); + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + return PageFrameIndex; +} + +VOID +NTAPI +MiDecrementShareCount(IN PMMPFN Pfn1, + IN PFN_NUMBER PageFrameIndex) +{ + ASSERT(PageFrameIndex > 0); + ASSERT(MiGetPfnEntry(PageFrameIndex) != NULL); + ASSERT(Pfn1 == MiGetPfnEntry(PageFrameIndex)); + + /* Page must be in-use */ + if ((Pfn1->u3.e1.PageLocation != ActiveAndValid) && + (Pfn1->u3.e1.PageLocation != StandbyPageList)) + { + /* Otherwise we have PFN corruption */ + KeBugCheckEx(PFN_LIST_CORRUPT, + 0x99, + PageFrameIndex, + Pfn1->u3.e1.PageLocation, + 0); + } + + /* Check if the share count is now 0 */ + ASSERT(Pfn1->u2.ShareCount < 0xF000000); + if (!--Pfn1->u2.ShareCount) + { + /* ReactOS does not handle these */ + ASSERT(Pfn1->u3.e1.PrototypePte == 0); + + /* Put the page in transition */ + Pfn1->u3.e1.PageLocation = TransitionPage; + + /* PFN lock must be held */ + ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL); + + /* Page should at least have one reference */ + ASSERT(Pfn1->u3.e2.ReferenceCount != 0); + if (Pfn1->u3.e2.ReferenceCount == 1) + { + /* In ReactOS, this path should always be hit with a deleted PFN */ + ASSERT(MI_IS_PFN_DELETED(Pfn1) == TRUE); + + /* Clear the last reference */ + Pfn1->u3.e2.ReferenceCount = 0; + + /* + * OriginalPte is used by AweReferenceCount in ReactOS, but either + * ways we shouldn't be seeing RMAP entries at this point + */ + ASSERT(Pfn1->OriginalPte.u.Soft.Prototype == 0); + ASSERT(Pfn1->OriginalPte.u.Long == 0); + + /* Mark the page temporarily as valid, we're going to make it free soon */ + Pfn1->u3.e1.PageLocation = ActiveAndValid; + + /* Bring it back into the free list */ + MiInsertPageInFreeList(PageFrameIndex); + } + else + { + /* Otherwise, just drop the reference count */ + InterlockedDecrement16((PSHORT)&Pfn1->u3.e2.ReferenceCount); + } + } +} + +VOID +NTAPI +MiInitializePfnForOtherProcess(IN PFN_NUMBER PageFrameIndex, + IN PMMPTE PointerPte, + IN PFN_NUMBER PteFrame) +{ + PMMPFN Pfn1; + + /* Setup the PTE */ + Pfn1 = MiGetPfnEntry(PageFrameIndex); + Pfn1->PteAddress = PointerPte; + +#if 0 // When using ARM3 PFN + /* Make this a software PTE */ + MI_MAKE_SOFTWARE_PTE(&Pfn1->OriginalPte, MM_READWRITE); +#endif + + /* Setup the page */ + ASSERT(Pfn1->u3.e2.ReferenceCount == 0); + Pfn1->u3.e2.ReferenceCount = 1; + Pfn1->u2.ShareCount = 1; + Pfn1->u3.e1.PageLocation = ActiveAndValid; + Pfn1->u3.e1.Modified = TRUE; + Pfn1->u4.InPageError = FALSE; + + /* Did we get a PFN for the page table */ + if (PteFrame) + { + /* Store it */ + Pfn1->u4.PteFrame = PteFrame; + + /* Increase its share count so we don't get rid of it */ + Pfn1 = MiGetPfnEntry(PteFrame); + Pfn1->u2.ShareCount++; + } +} + /* EOF */ diff --git a/ntoskrnl/mm/ARM3/pool.c b/ntoskrnl/mm/ARM3/pool.c index 17c99223e00..849db1c9a91 100644 --- a/ntoskrnl/mm/ARM3/pool.c +++ b/ntoskrnl/mm/ARM3/pool.c @@ -264,6 +264,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // Get the page bit count // i = ((SizeInPages - 1) / 1024) + 1; + DPRINT1("Paged pool expansion: %d %x\n", i, SizeInPages); // // Check if there is enougn paged pool expansion space left @@ -325,23 +326,25 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // ASSERT(PointerPte->u.Hard.Valid == 0); - // - // Request a paged pool page and write the PFN for it - // - PageFrameNumber = MmAllocPage(MC_PPOOL); + /* Request a page */ + PageFrameNumber = MiRemoveAnyPage(0); TempPte.u.Hard.PageFrameNumber = PageFrameNumber; // // Save it into our double-buffered system page directory // /* This seems to be making the assumption that one PDE is one page long */ - ASSERT(PAGE_SIZE == (PD_COUNT * (sizeof(MMPTE) * PDE_COUNT))); + C_ASSERT(PAGE_SIZE == (PD_COUNT * (sizeof(MMPTE) * PDE_COUNT))); MmSystemPagePtes[(ULONG_PTR)PointerPte & (PAGE_SIZE - 1) / sizeof(MMPTE)] = TempPte; + /* Initialize the PFN */ + MiInitializePfnForOtherProcess(PageFrameNumber, + PointerPte, + MmSystemPageDirectory[(PointerPte - (PMMPTE)PDE_BASE) / PDE_COUNT]); + /* Write the actual PTE now */ - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte++ = TempPte; + MI_WRITE_VALID_PTE(PointerPte++, TempPte); // // Move on to the next expansion address @@ -417,11 +420,8 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, // KeFlushEntireTb(TRUE, TRUE); - // - // Setup a demand-zero writable PTE - // - TempPte.u.Long = 0; - MI_MAKE_WRITE_PAGE(&TempPte); + /* Setup a demand-zero writable PTE */ + MI_MAKE_SOFTWARE_PTE(&TempPte, MM_READWRITE); // // Find the first and last PTE, then loop them all @@ -590,10 +590,8 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, TempPte = ValidKernelPte; do { - // - // Allocate a page - // - PageFrameNumber = MmAllocPage(MC_NPPOOL); + /* Allocate a page */ + PageFrameNumber = MiRemoveAnyPage(0); /* Get the PFN entry for it and fill it out */ Pfn1 = MiGetPfnEntry(PageFrameNumber); @@ -605,9 +603,7 @@ MiAllocatePoolPages(IN POOL_TYPE PoolType, /* Write the PTE for it */ TempPte.u.Hard.PageFrameNumber = PageFrameNumber; - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte++ = TempPte; + MI_WRITE_VALID_PTE(PointerPte++, TempPte); } while (--SizeInPages > 0); // @@ -667,6 +663,11 @@ MiFreePoolPages(IN PVOID StartingVa) // NumberOfPages = End - i + 1; + /* Delete the actual pages */ + PointerPte = MmPagedPoolInfo.FirstPteForPagedPool + i; + FreePages = MiDeleteSystemPageableVm(PointerPte, NumberOfPages, 0, NULL); + ASSERT(FreePages == NumberOfPages); + // // Acquire the paged pool lock // diff --git a/ntoskrnl/mm/ARM3/procsup.c b/ntoskrnl/mm/ARM3/procsup.c index 8f1e6b732c1..eb577050a7d 100644 --- a/ntoskrnl/mm/ARM3/procsup.c +++ b/ntoskrnl/mm/ARM3/procsup.c @@ -31,8 +31,10 @@ MmDeleteKernelStack(IN PVOID StackBase, IN BOOLEAN GuiStack) { PMMPTE PointerPte; - PFN_NUMBER StackPages; + PFN_NUMBER StackPages, PageFrameNumber;//, PageTableFrameNumber; + PMMPFN Pfn1;//, Pfn2; ULONG i; + KIRQL OldIrql; // // This should be the guard page, so decrement by one @@ -46,6 +48,9 @@ MmDeleteKernelStack(IN PVOID StackBase, StackPages = BYTES_TO_PAGES(GuiStack ? KERNEL_LARGE_STACK_SIZE : KERNEL_STACK_SIZE); + /* Acquire the PFN lock */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + // // Loop them // @@ -56,10 +61,22 @@ MmDeleteKernelStack(IN PVOID StackBase, // if (PointerPte->u.Hard.Valid == 1) { - // - // Nuke it - // - MmReleasePageMemoryConsumer(MC_NPPOOL, PFN_FROM_PTE(PointerPte)); + /* Get the PTE's page */ + PageFrameNumber = PFN_FROM_PTE(PointerPte); + Pfn1 = MiGetPfnEntry(PageFrameNumber); +#if 0 // ARM3 might not own the page table, so don't take this risk. Leak it instead! + /* Now get the page of the page table mapping it */ + PageTableFrameNumber = Pfn1->u4.PteFrame; + Pfn2 = MiGetPfnEntry(PageTableFrameNumber); + + /* Remove a shared reference, since the page is going away */ + MiDecrementShareCount(Pfn2, PageTableFrameNumber); +#endif + /* Set the special pending delete marker */ + Pfn1->PteAddress = (PMMPTE)((ULONG_PTR)Pfn1->PteAddress | 1); + + /* And now delete the actual stack page */ + MiDecrementShareCount(Pfn1, PageFrameNumber); } // @@ -73,6 +90,9 @@ MmDeleteKernelStack(IN PVOID StackBase, // ASSERT(PointerPte->u.Hard.Valid == 0); + /* Release the PFN lock */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + // // Release the PTEs // @@ -87,7 +107,7 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, PFN_NUMBER StackPtes, StackPages; PMMPTE PointerPte, StackPte; PVOID BaseAddress; - MMPTE TempPte; + MMPTE TempPte, InvalidPte; KIRQL OldIrql; PFN_NUMBER PageFrameIndex; ULONG i; @@ -131,13 +151,12 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, if (GuiStack) PointerPte += BYTES_TO_PAGES(KERNEL_LARGE_STACK_SIZE - KERNEL_LARGE_STACK_COMMIT); - // - // Setup the template stack PTE - // - TempPte = ValidKernelPte; - MI_MAKE_LOCAL_PAGE(&TempPte); - MI_MAKE_DIRTY_PAGE(&TempPte); - TempPte.u.Hard.PageFrameNumber = 0; + + /* Setup the temporary invalid PTE */ + MI_MAKE_SOFTWARE_PTE(&InvalidPte, MM_NOACCESS); + + /* Setup the template stack PTE */ + MI_MAKE_HARDWARE_PTE(&TempPte, PointerPte + 1, MM_READWRITE, 0); // // Acquire the PFN DB lock @@ -154,18 +173,16 @@ MmCreateKernelStack(IN BOOLEAN GuiStack, // PointerPte++; - // - // Get a page - // - PageFrameIndex = MmAllocPage(MC_NPPOOL); - TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + /* Get a page and write the current invalid PTE */ + PageFrameIndex = MiRemoveAnyPage(0); + MI_WRITE_INVALID_PTE(PointerPte, InvalidPte); + + /* Initialize the PFN entry for this page */ + MiInitializePfn(PageFrameIndex, PointerPte, 1); - // - // Write it - // - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; + /* Write the valid PTE */ + TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + MI_WRITE_VALID_PTE(PointerPte, TempPte); } // Bug #4835 @@ -191,7 +208,7 @@ MmGrowKernelStackEx(IN PVOID StackPointer, PMMPTE LimitPte, NewLimitPte, LastPte; PFN_NUMBER StackPages; KIRQL OldIrql; - MMPTE TempPte; + MMPTE TempPte, InvalidPte; PFN_NUMBER PageFrameIndex; // @@ -232,13 +249,8 @@ MmGrowKernelStackEx(IN PVOID StackPointer, LimitPte--; StackPages = (LimitPte - NewLimitPte + 1); - // - // Setup the template stack PTE - // - TempPte = ValidKernelPte; - MI_MAKE_LOCAL_PAGE(&TempPte); - MI_MAKE_DIRTY_PAGE(&TempPte); - TempPte.u.Hard.PageFrameNumber = 0; + /* Setup the temporary invalid PTE */ + MI_MAKE_SOFTWARE_PTE(&InvalidPte, MM_NOACCESS); // // Acquire the PFN DB lock @@ -250,16 +262,18 @@ MmGrowKernelStackEx(IN PVOID StackPointer, // while (LimitPte >= NewLimitPte) { - // - // Get a page - // - PageFrameIndex = MmAllocPage(MC_NPPOOL); - TempPte.u.Hard.PageFrameNumber = PageFrameIndex; + /* Get a page and write the current invalid PTE */ + PageFrameIndex = MiRemoveAnyPage(0); + MI_WRITE_INVALID_PTE(LimitPte, InvalidPte); + + /* Initialize the PFN entry for this page */ + MiInitializePfn(PageFrameIndex, LimitPte, 1); + + /* Setup the template stack PTE */ + MI_MAKE_HARDWARE_PTE(&TempPte, LimitPte, MM_READWRITE, PageFrameIndex); /* Write the valid PTE */ - ASSERT(LimitPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *LimitPte-- = TempPte; + MI_WRITE_VALID_PTE(LimitPte--, TempPte); } // diff --git a/ntoskrnl/mm/ARM3/virtual.c b/ntoskrnl/mm/ARM3/virtual.c index 88ff54f5dcc..a4dcea797b0 100644 --- a/ntoskrnl/mm/ARM3/virtual.c +++ b/ntoskrnl/mm/ARM3/virtual.c @@ -29,6 +29,114 @@ MiProtectVirtualMemory(IN PEPROCESS Process, /* PRIVATE FUNCTIONS **********************************************************/ +PFN_NUMBER +NTAPI +MiDeleteSystemPageableVm(IN PMMPTE PointerPte, + IN PFN_NUMBER PageCount, + IN ULONG Flags, + OUT PPFN_NUMBER ValidPages) +{ + PFN_NUMBER ActualPages = 0; + PETHREAD CurrentThread; + PMMPFN Pfn1, Pfn2; + PFN_NUMBER PageFrameIndex, PageTableIndex; + KIRQL OldIrql, LockIrql; + ASSERT(KeGetCurrentIrql() <= APC_LEVEL); + + /* + * Now we must raise to APC_LEVEL and mark the thread as owner + * We don't actually implement a working set pushlock, so this is only + * for internal consistency (and blocking APCs) + */ + KeRaiseIrql(APC_LEVEL, &LockIrql); + CurrentThread = PsGetCurrentThread(); + KeEnterGuardedRegion(); + ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && + (CurrentThread->OwnsSystemWorkingSetShared == 0)); + CurrentThread->OwnsSystemWorkingSetExclusive = 1; + + /* Loop all pages */ + while (PageCount) + { + /* Make sure there's some data about the page */ + if (PointerPte->u.Long) + { + /* As always, only handle current ARM3 scenarios */ + ASSERT(PointerPte->u.Soft.Prototype == 0); + ASSERT(PointerPte->u.Soft.Transition == 0); + + /* Normally this is one possibility -- freeing a valid page */ + if (PointerPte->u.Hard.Valid) + { + /* Get the page PFN */ + PageFrameIndex = PFN_FROM_PTE(PointerPte); + Pfn1 = MiGetPfnEntry(PageFrameIndex); + + /* Should not have any working set data yet */ + ASSERT(Pfn1->u1.WsIndex == 0); + + /* Actual valid, legitimate, pages */ + if (ValidPages) *ValidPages++; + + /* Get the page table entry */ + PageTableIndex = Pfn1->u4.PteFrame; + Pfn2 = MiGetPfnEntry(PageTableIndex); + + /* Lock the PFN database */ + OldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); + + /* Delete it the page */ + MI_SET_PFN_DELETED(Pfn1); + MiDecrementShareCount(Pfn1, PageFrameIndex); + + /* Decrement the page table too */ + #if 0 // ARM3: Dont't trust this yet + MiDecrementShareCount(Pfn2, PageTableIndex); + #endif + + /* Release the PFN database */ + KeReleaseQueuedSpinLock(LockQueuePfnLock, OldIrql); + + /* Destroy the PTE */ + PointerPte->u.Long = 0; + } + + /* Actual legitimate pages */ + ActualPages++; + } + else + { + /* + * The only other ARM3 possibility is a demand zero page, which would + * mean freeing some of the paged pool pages that haven't even been + * touched yet, as part of a larger allocation. + * + * Right now, we shouldn't expect any page file information in the PTE + */ + ASSERT(PointerPte->u.Soft.PageFileHigh == 0); + + /* Destroy the PTE */ + PointerPte->u.Long = 0; + } + + /* Keep going */ + PointerPte++; + PageCount--; + } + + /* Re-enable APCs */ + ASSERT(KeAreAllApcsDisabled() == TRUE); + CurrentThread->OwnsSystemWorkingSetExclusive = 0; + KeLeaveGuardedRegion(); + KeLowerIrql(LockIrql); + + /* Flush the entire TLB */ + KeFlushEntireTb(TRUE, TRUE); + + /* Done */ + return ActualPages; +} + LONG MiGetExceptionInfo(IN PEXCEPTION_POINTERS ExceptionInfo, OUT PBOOLEAN HaveBadAddress, diff --git a/ntoskrnl/mm/elf.inc.h b/ntoskrnl/mm/elf.inc.h deleted file mode 100644 index 2360bffd1d2..00000000000 --- a/ntoskrnl/mm/elf.inc.h +++ /dev/null @@ -1,705 +0,0 @@ -#define NDEBUG -#include - -#include - -#ifndef __ELF_WORD_SIZE -#error __ELF_WORD_SIZE must be defined -#endif - -#include - -/* TODO: Intsafe should be made into a library, as it's generally useful */ -static __inline BOOLEAN Intsafe_CanAddULongPtr -( - IN ULONG_PTR Addend1, - IN ULONG_PTR Addend2 -) -{ - return Addend1 <= (MAXULONG_PTR - Addend2); -} - -#define Intsafe_CanAddSizeT Intsafe_CanAddULongPtr - -static __inline BOOLEAN Intsafe_CanAddULong32 -( - IN ULONG Addend1, - IN ULONG Addend2 -) -{ - return Addend1 <= (MAXULONG - Addend2); -} - -static __inline BOOLEAN Intsafe_AddULong32 -( - OUT PULONG32 Result, - IN ULONG Addend1, - IN ULONG Addend2 -) -{ - if(!Intsafe_CanAddULong32(Addend1, Addend2)) - return FALSE; - - *Result = Addend1 + Addend2; - return TRUE; -} - -static __inline BOOLEAN Intsafe_CanAddULong64 -( - IN ULONG64 Addend1, - IN ULONG64 Addend2 -) -{ - return Addend1 <= (((ULONG64)-1) - Addend2); -} - -static __inline BOOLEAN Intsafe_AddULong64 -( - OUT PULONG64 Result, - IN ULONG64 Addend1, - IN ULONG64 Addend2 -) -{ - if(!Intsafe_CanAddULong64(Addend1, Addend2)) - return FALSE; - - *Result = Addend1 + Addend2; - return TRUE; -} - -static __inline BOOLEAN Intsafe_CanMulULong32 -( - IN ULONG Factor1, - IN ULONG Factor2 -) -{ - return Factor1 <= (MAXULONG / Factor2); -} - -static __inline BOOLEAN Intsafe_MulULong32 -( - OUT PULONG32 Result, - IN ULONG Factor1, - IN ULONG Factor2 -) -{ - if(!Intsafe_CanMulULong32(Factor1, Factor2)) - return FALSE; - - *Result = Factor1 * Factor2; - return TRUE; -} - -static __inline BOOLEAN Intsafe_CanOffsetPointer -( - IN CONST VOID * Pointer, - IN SIZE_T Offset -) -{ - /* FIXME: (PVOID)MAXULONG_PTR isn't necessarily a valid address */ - return Intsafe_CanAddULongPtr((ULONG_PTR)Pointer, Offset); -} - -#if __ELF_WORD_SIZE == 32 -#define ElfFmtpAddSize Intsafe_AddULong32 -#define ElfFmtpReadAddr ElfFmtpReadULong -#define ElfFmtpReadOff ElfFmtpReadULong -#define ElfFmtpSafeReadAddr ElfFmtpSafeReadULong -#define ElfFmtpSafeReadOff ElfFmtpSafeReadULong -#define ElfFmtpSafeReadSize ElfFmtpSafeReadULong -#elif __ELF_WORD_SIZE == 64 -#define ElfFmtpAddSize Intsafe_AddULong64 -#define ElfFmtpReadAddr ElfFmtpReadULong64 -#define ElfFmtpReadOff ElfFmtpReadULong64 -#define ElfFmtpSafeReadAddr ElfFmtpSafeReadULong64 -#define ElfFmtpSafeReadOff ElfFmtpSafeReadULong64 -#define ElfFmtpSafeReadSize ElfFmtpSafeReadULong64 -#endif - -/* TODO: these are standard DDK/PSDK macros */ -#define RtlRetrieveUlonglong(DST_, SRC_) \ - (RtlCopyMemory((DST_), (SRC_), sizeof(ULONG64))) - -#ifndef RTL_FIELD_SIZE -#define RTL_FIELD_SIZE(TYPE_, FIELD_) (sizeof(((TYPE_ *)0)->FIELD_)) -#endif - -#ifndef RTL_SIZEOF_THROUGH_FIELD -#define RTL_SIZEOF_THROUGH_FIELD(TYPE_, FIELD_) \ - (FIELD_OFFSET(TYPE_, FIELD_) + RTL_FIELD_SIZE(TYPE_, FIELD_)) -#endif - -#ifndef RTL_CONTAINS_FIELD -#define RTL_CONTAINS_FIELD(P_, SIZE_, FIELD_) \ - ((ULONG_PTR)(P_) + (ULONG_PTR)(SIZE_) > (ULONG_PTR)&((P_)->FIELD_) + sizeof((P_)->FIELD_)) -#endif - -#define ELFFMT_FIELDS_EQUAL(TYPE1_, TYPE2_, FIELD_) \ - ( \ - (FIELD_OFFSET(TYPE1_, FIELD_) == FIELD_OFFSET(TYPE2_, FIELD_)) && \ - (RTL_FIELD_SIZE(TYPE1_, FIELD_) == RTL_FIELD_SIZE(TYPE2_, FIELD_)) \ - ) - -#define ELFFMT_MAKE_ULONG64(BYTE1_, BYTE2_, BYTE3_, BYTE4_, BYTE5_, BYTE6_, BYTE7_, BYTE8_) \ - ( \ - (((ULONG64)ELFFMT_MAKE_ULONG(BYTE1_, BYTE2_, BYTE3_, BYTE4_)) << 0) | \ - (((ULONG64)ELFFMT_MAKE_ULONG(BYTE5_, BYTE6_, BYTE7_, BYTE8_)) << 32) \ - ) - -#define ELFFMT_MAKE_ULONG(BYTE1_, BYTE2_, BYTE3_, BYTE4_) \ - ( \ - (((ULONG)ELFFMT_MAKE_USHORT(BYTE1_, BYTE2_)) << 0) | \ - (((ULONG)ELFFMT_MAKE_USHORT(BYTE3_, BYTE4_)) << 16) \ - ) - -#define ELFFMT_MAKE_USHORT(BYTE1_, BYTE2_) \ - ( \ - (((USHORT)(BYTE1_)) << 0) | \ - (((USHORT)(BYTE2_)) << 8) \ - ) - -static __inline ULONG64 ElfFmtpReadULong64 -( - IN ULONG64 Input, - IN ULONG DataType -) -{ - PUCHAR p; - - if(DataType == ELF_TARG_DATA) - return Input; - - p = (PUCHAR)&Input; - - switch(DataType) - { - case ELFDATA2LSB: return ELFFMT_MAKE_ULONG64(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); - case ELFDATA2MSB: return ELFFMT_MAKE_ULONG64(p[7], p[6], p[5], p[4], p[3], p[2], p[1], p[0]); - } - - ASSERT(FALSE); - return (ULONG64)-1; -} - -static __inline ULONG ElfFmtpReadULong -( - IN ULONG Input, - IN ULONG DataType -) -{ - PUCHAR p; - - if(DataType == ELF_TARG_DATA) - return Input; - - p = (PUCHAR)&Input; - - switch(DataType) - { - case ELFDATA2LSB: return ELFFMT_MAKE_ULONG(p[0], p[1], p[2], p[3]); - case ELFDATA2MSB: return ELFFMT_MAKE_ULONG(p[3], p[2], p[1], p[0]); - } - - ASSERT(FALSE); - return MAXULONG; -} - -static __inline USHORT ElfFmtpReadUShort -( - IN USHORT Input, - IN ULONG DataType -) -{ - PUCHAR p; - - if(DataType == ELF_TARG_DATA) - return Input; - - p = (PUCHAR)&Input; - - switch(DataType) - { - case ELFDATA2LSB: return ELFFMT_MAKE_USHORT(p[0], p[1]); - case ELFDATA2MSB: return ELFFMT_MAKE_USHORT(p[1], p[0]); - } - - ASSERT(FALSE); - return (USHORT)-1; -} - -static __inline ULONG64 ElfFmtpSafeReadULong64 -( - IN CONST ULONG64 * Input, - IN ULONG DataType -) -{ - PUCHAR p; - ULONG64 nSafeInput; - - RtlRetrieveUlonglong(&nSafeInput, Input); - - p = (PUCHAR)&nSafeInput; - - switch(DataType) - { - case ELFDATA2LSB: return ELFFMT_MAKE_ULONG64(p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7]); - case ELFDATA2MSB: return ELFFMT_MAKE_ULONG64(p[7], p[6], p[5], p[4], p[3], p[2], p[1], p[0]); - } - - ASSERT(FALSE); - return (ULONG64)-1; -} - -static __inline ULONG ElfFmtpSafeReadULong -( - IN CONST ULONG32 * Input, - IN ULONG DataType -) -{ - PUCHAR p; - ULONG nSafeInput; - union - { - CONST ULONG32 *ConstInput; - ULONG32 *Input; - }pInput = {Input}; - - RtlRetrieveUlong(&nSafeInput, pInput.Input); - - if(DataType == ELF_TARG_DATA) - return nSafeInput; - - p = (PUCHAR)&nSafeInput; - - switch(DataType) - { - case ELFDATA2LSB: return ELFFMT_MAKE_ULONG(p[0], p[1], p[2], p[3]); - case ELFDATA2MSB: return ELFFMT_MAKE_ULONG(p[3], p[2], p[1], p[0]); - } - - ASSERT(FALSE); - return MAXULONG; -} - -static __inline BOOLEAN ElfFmtpIsPowerOf2(IN Elf_Addr Number) -{ - if(Number == 0) - return FALSE; - - return (Number & (Number - 1)) == 0; -} - -static __inline Elf_Addr ElfFmtpModPow2 -( - IN Elf_Addr Address, - IN Elf_Addr Alignment -) -{ - ASSERT(sizeof(Elf_Addr) == sizeof(Elf_Size)); - ASSERT(sizeof(Elf_Addr) == sizeof(Elf_Off)); - ASSERT(ElfFmtpIsPowerOf2(Alignment)); - return Address & (Alignment - 1); -} - -static __inline Elf_Addr ElfFmtpAlignDown -( - IN Elf_Addr Address, - IN Elf_Addr Alignment -) -{ - ASSERT(sizeof(Elf_Addr) == sizeof(Elf_Size)); - ASSERT(sizeof(Elf_Addr) == sizeof(Elf_Off)); - ASSERT(ElfFmtpIsPowerOf2(Alignment)); - return Address & ~(Alignment - 1); -} - -static __inline BOOLEAN ElfFmtpAlignUp -( - OUT Elf_Addr * AlignedAddress, - IN Elf_Addr Address, - IN Elf_Addr Alignment -) -{ - Elf_Addr nExcess = ElfFmtpModPow2(Address, Alignment); - - if(nExcess == 0) - { - *AlignedAddress = Address; - return nExcess == 0; - } - else - return ElfFmtpAddSize(AlignedAddress, Address, Alignment - nExcess); -} - -/* - References: - [1] Tool Interface Standards (TIS) Committee, "Executable and Linking Format - (ELF) Specification", Version 1.2 -*/ -NTSTATUS NTAPI -#if __ELF_WORD_SIZE == 32 -Elf32FmtCreateSection -#elif __ELF_WORD_SIZE == 64 -Elf64FmtCreateSection -#endif -( - IN CONST VOID * FileHeader, - IN SIZE_T FileHeaderSize, - IN PVOID File, - OUT PMM_IMAGE_SECTION_OBJECT ImageSectionObject, - OUT PULONG Flags, - IN PEXEFMT_CB_READ_FILE ReadFileCb, - IN PEXEFMT_CB_ALLOCATE_SEGMENTS AllocateSegmentsCb -) -{ - NTSTATUS nStatus; - const Elf_Ehdr * pehHeader; - const Elf_Phdr * pphPHdrs; - BOOLEAN fPageAligned; - ULONG nData; - ULONG nPHdrCount; - ULONG cbPHdrSize; - Elf_Off cbPHdrOffset; - PVOID pBuffer; - PMM_SECTION_SEGMENT pssSegments; - Elf_Addr nImageBase = 0; - Elf_Addr nEntryPoint; - ULONG32 nPrevVirtualEndOfSegment = 0; - ULONG i; - ULONG j; - - (void)Intsafe_AddULong64; - (void)Intsafe_MulULong32; - (void)ElfFmtpReadULong64; - (void)ElfFmtpSafeReadULong64; - (void)ElfFmtpReadULong; - -#define DIE(ARGS_) { DPRINT ARGS_; goto l_Return; } - - pBuffer = NULL; - - nStatus = STATUS_INVALID_IMAGE_FORMAT; - - /* Ensure the file contains the full header */ - /* - EXEFMT_LOAD_HEADER_SIZE is 8KB: enough to contain an ELF header (at least in - all the classes defined as of December 2004). If FileHeaderSize is less than - sizeof(Elf_Ehdr), it means the file itself is small enough not to contain a - full ELF header - */ - ASSERT(sizeof(Elf_Ehdr) <= EXEFMT_LOAD_HEADER_SIZE); - - if(FileHeaderSize < sizeof(Elf_Ehdr)) - DIE(("The file is truncated, doesn't contain the full header\n")); - - pehHeader = FileHeader; - ASSERT(((ULONG_PTR)pehHeader % TYPE_ALIGNMENT(Elf_Ehdr)) == 0); - - nData = pehHeader->e_ident[EI_DATA]; - - /* Validate the header */ - if(ElfFmtpReadUShort(pehHeader->e_ehsize, nData) < sizeof(Elf_Ehdr)) - DIE(("Inconsistent value for e_ehsize\n")); - - /* Calculate size and offset of the program headers */ - cbPHdrSize = ElfFmtpReadUShort(pehHeader->e_phentsize, nData); - - if(cbPHdrSize != sizeof(Elf_Phdr)) - DIE(("Inconsistent value for e_phentsize\n")); - - /* MAXUSHORT * MAXUSHORT < MAXULONG */ - nPHdrCount = ElfFmtpReadUShort(pehHeader->e_phnum, nData); - ASSERT(Intsafe_CanMulULong32(cbPHdrSize, nPHdrCount)); - cbPHdrSize *= nPHdrCount; - - cbPHdrOffset = ElfFmtpReadOff(pehHeader->e_phoff, nData); - - /* The initial header doesn't contain the program headers */ - if(cbPHdrOffset > FileHeaderSize || cbPHdrSize > (FileHeaderSize - cbPHdrOffset)) - { - NTSTATUS nReadStatus; - LARGE_INTEGER lnOffset; - PVOID pData; - ULONG cbReadSize; - - /* Will worry about this when ELF128 comes */ - ASSERT(sizeof(cbPHdrOffset) <= sizeof(lnOffset.QuadPart)); - - lnOffset.QuadPart = (LONG64)cbPHdrOffset; - - /* - We can't support executable files larger than 8 Exabytes - it's a limitation - of the I/O system (only 63-bit offsets are supported). Quote: - - [...] the total amount of printed material in the world is estimated to be - around a fifth of an exabyte. [...] [Source: Wikipedia] - */ - if(lnOffset.u.HighPart < 0) - DIE(("The program header is too far into the file\n")); - - nReadStatus = ReadFileCb - ( - File, - &lnOffset, - cbPHdrSize, - &pData, - &pBuffer, - &cbReadSize - ); - - if(!NT_SUCCESS(nReadStatus)) - { - nStatus = nReadStatus; - DIE(("ReadFile failed, status %08X\n", nStatus)); - } - - ASSERT(pData); - ASSERT(pBuffer); - ASSERT(Intsafe_CanOffsetPointer(pData, cbReadSize)); - - if(cbReadSize < cbPHdrSize) - DIE(("The file didn't contain the program headers\n")); - - /* Force the buffer to be aligned */ - if((ULONG_PTR)pData % TYPE_ALIGNMENT(Elf_Phdr)) - { - ASSERT(((ULONG_PTR)pBuffer % TYPE_ALIGNMENT(Elf_Phdr)) == 0); - RtlMoveMemory(pBuffer, pData, cbPHdrSize); - pphPHdrs = pBuffer; - } - else - pphPHdrs = pData; - } - else - { - ASSERT(Intsafe_CanAddSizeT(cbPHdrOffset, 0)); - ASSERT(Intsafe_CanOffsetPointer(FileHeader, cbPHdrOffset)); - pphPHdrs = (PVOID)((ULONG_PTR)FileHeader + (ULONG_PTR)cbPHdrOffset); - } - - /* Allocate the segments */ - pssSegments = AllocateSegmentsCb(nPHdrCount); - - if(pssSegments == NULL) - { - nStatus = STATUS_INSUFFICIENT_RESOURCES; - DIE(("Out of memory\n")); - } - - ImageSectionObject->Segments = pssSegments; - - fPageAligned = TRUE; - - /* Fill in the segments */ - for(i = 0, j = 0; i < nPHdrCount; ++ i) - { - switch(ElfFmtpSafeReadULong(&pphPHdrs[i].p_type, nData)) - { - case PT_LOAD: - { - static const ULONG ProgramHeaderFlagsToProtect[8] = - { - PAGE_NOACCESS, /* 0 */ - PAGE_EXECUTE_READ, /* PF_X */ - PAGE_READWRITE, /* PF_W */ - PAGE_EXECUTE_READWRITE, /* PF_X | PF_W */ - PAGE_READONLY, /* PF_R */ - PAGE_EXECUTE_READ, /* PF_X | PF_R */ - PAGE_READWRITE, /* PF_W | PF_R */ - PAGE_EXECUTE_READWRITE /* PF_X | PF_W | PF_R */ - }; - - Elf_Size nAlignment; - Elf_Off nFileOffset; - Elf_Addr nVirtualAddr; - Elf_Size nAdj; - Elf_Size nVirtualSize = 0; - Elf_Size nFileSize = 0; - - ASSERT(j <= nPHdrCount); - - /* Retrieve and validate the segment alignment */ - nAlignment = ElfFmtpSafeReadSize(&pphPHdrs[i].p_align, nData); - - if(nAlignment == 0) - nAlignment = 1; - else if(!ElfFmtpIsPowerOf2(nAlignment)) - DIE(("Alignment of loadable segment isn't a power of 2\n")); - - if(nAlignment < PAGE_SIZE) - fPageAligned = FALSE; - - /* Retrieve the addresses and calculate the adjustment */ - nFileOffset = ElfFmtpSafeReadOff(&pphPHdrs[i].p_offset, nData); - nVirtualAddr = ElfFmtpSafeReadAddr(&pphPHdrs[i].p_vaddr, nData); - - nAdj = ElfFmtpModPow2(nFileOffset, nAlignment); - - if(nAdj != ElfFmtpModPow2(nVirtualAddr, nAlignment)) - DIE(("File and memory address of loadable segment not congruent modulo alignment\n")); - - /* Retrieve, adjust and align the file size and memory size */ - if(!ElfFmtpAddSize(&nFileSize, ElfFmtpSafeReadSize(&pphPHdrs[i].p_filesz, nData), nAdj)) - DIE(("Can't adjust the file size of loadable segment\n")); - - if(!ElfFmtpAddSize(&nVirtualSize, ElfFmtpSafeReadSize(&pphPHdrs[i].p_memsz, nData), nAdj)) - DIE(("Can't adjust the memory size of lodable segment\n")); - - if(!ElfFmtpAlignUp(&nVirtualSize, nVirtualSize, nAlignment)) - DIE(("Can't align the memory size of lodable segment\n")); - - if(nFileSize > nVirtualSize) - nFileSize = nVirtualSize; - - if(nVirtualSize > MAXULONG) - DIE(("Virtual image larger than 4GB\n")); - - ASSERT(nFileSize <= MAXULONG); - - pssSegments[j].Length = (ULONG)(nVirtualSize & 0xFFFFFFFF); - pssSegments[j].RawLength = (ULONG)(nFileSize & 0xFFFFFFFF); - - /* File offset */ - nFileOffset = ElfFmtpAlignDown(nFileOffset, nAlignment); - -#if __ELF_WORD_SIZE >= 64 - ASSERT(sizeof(nFileOffset) == sizeof(LONG64)); - - if(((LONG64)nFileOffset) < 0) - DIE(("File offset of loadable segment is too large\n")); -#endif - - pssSegments[j].FileOffset = (LONG64)nFileOffset; - - /* Virtual address */ - nVirtualAddr = ElfFmtpAlignDown(nVirtualAddr, nAlignment); - - if(j == 0) - { - /* First segment: its address is the base address of the image */ - nImageBase = nVirtualAddr; - pssSegments[j].VirtualAddress = 0; - - /* Several places make this assumption */ - if(pssSegments[j].FileOffset != 0) - DIE(("First loadable segment doesn't contain the ELF header\n")); - } - else - { - Elf_Size nVirtualOffset; - - /* Other segment: store the offset from the base address */ - if(nVirtualAddr <= nImageBase) - DIE(("Loadable segments are not sorted\n")); - - nVirtualOffset = nVirtualAddr - nImageBase; - - if(nVirtualOffset > MAXULONG) - DIE(("Virtual image larger than 4GB\n")); - - pssSegments[j].VirtualAddress = (ULONG)(nVirtualOffset & 0xFFFFFFFF); - - if(pssSegments[j].VirtualAddress != nPrevVirtualEndOfSegment) - DIE(("Loadable segments are not sorted and contiguous\n")); - } - - /* Memory protection */ - pssSegments[j].Protection = ProgramHeaderFlagsToProtect - [ - ElfFmtpSafeReadULong(&pphPHdrs[i].p_flags, nData) & (PF_R | PF_W | PF_X) - ]; - - /* Characteristics */ - /* - TODO: need to add support for the shared, non-pageable, non-cacheable and - discardable attributes. This involves extensions to the ELF format, so it's - nothing to be taken lightly - */ - if(pssSegments[j].Protection & PAGE_IS_EXECUTABLE) - { - ImageSectionObject->Executable = TRUE; - pssSegments[j].Characteristics = IMAGE_SCN_CNT_CODE; - } - else if(pssSegments[j].RawLength == 0) - pssSegments[j].Characteristics = IMAGE_SCN_CNT_UNINITIALIZED_DATA; - else - pssSegments[j].Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA; - - /* - FIXME: see the TODO above. This is the safest way to load ELF drivers, for - now, if a bit wasteful of memory - */ - pssSegments[j].Characteristics |= IMAGE_SCN_MEM_NOT_PAGED; - - /* Copy-on-write */ - pssSegments[j].WriteCopy = TRUE; - - if(!Intsafe_AddULong32(&nPrevVirtualEndOfSegment, pssSegments[j].VirtualAddress, pssSegments[j].Length)) - DIE(("Virtual image larger than 4GB\n")); - - ++ j; - break; - } - } - } - - if(j == 0) - DIE(("No loadable segments\n")); - - ImageSectionObject->NrSegments = j; - - *Flags = - EXEFMT_LOAD_ASSUME_SEGMENTS_SORTED | - EXEFMT_LOAD_ASSUME_SEGMENTS_NO_OVERLAP; - - if(fPageAligned) - *Flags |= EXEFMT_LOAD_ASSUME_SEGMENTS_PAGE_ALIGNED; - - nEntryPoint = ElfFmtpReadAddr(pehHeader->e_entry, nData); - - if(nEntryPoint < nImageBase || nEntryPoint - nImageBase > nPrevVirtualEndOfSegment) - DIE(("Entry point not within the virtual image\n")); - - ASSERT(nEntryPoint >= nImageBase); - ASSERT((nEntryPoint - nImageBase) <= MAXULONG); - ImageSectionObject->EntryPoint = nEntryPoint - nImageBase; - - /* TODO: support Wine executables and read these values from nt_headers */ - ImageSectionObject->ImageCharacteristics |= - IMAGE_FILE_EXECUTABLE_IMAGE | - IMAGE_FILE_LINE_NUMS_STRIPPED | - IMAGE_FILE_LOCAL_SYMS_STRIPPED | - (nImageBase > MAXULONG ? IMAGE_FILE_LARGE_ADDRESS_AWARE : 0) | - IMAGE_FILE_DEBUG_STRIPPED; - - if(nData == ELFDATA2LSB) - ImageSectionObject->ImageCharacteristics |= IMAGE_FILE_BYTES_REVERSED_LO; - else if(nData == ELFDATA2MSB) - ImageSectionObject->ImageCharacteristics |= IMAGE_FILE_BYTES_REVERSED_HI; - - /* Base address outside the possible address space */ - if(nImageBase > MAXULONG_PTR) - ImageSectionObject->ImageBase = EXEFMT_LOAD_BASE_NONE; - /* Position-independent image, base address doesn't matter */ - else if(nImageBase == 0) - ImageSectionObject->ImageBase = EXEFMT_LOAD_BASE_ANY; - /* Use the specified base address */ - else - ImageSectionObject->ImageBase = (ULONG_PTR)nImageBase; - - /* safest bet */ - ImageSectionObject->Subsystem = IMAGE_SUBSYSTEM_WINDOWS_CUI; - ImageSectionObject->MinorSubsystemVersion = 0; - ImageSectionObject->MajorSubsystemVersion = 4; - - /* Success, at last */ - nStatus = STATUS_SUCCESS; - -l_Return: - if(pBuffer) - ExFreePool(pBuffer); - - return nStatus; -} - -/* EOF */ diff --git a/ntoskrnl/mm/elf32.c b/ntoskrnl/mm/elf32.c deleted file mode 100644 index 4e56e4408fc..00000000000 --- a/ntoskrnl/mm/elf32.c +++ /dev/null @@ -1,154 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/elf32.c - * PURPOSE: No purpose listed. - * - * PROGRAMMERS: No programmer listed. - */ -#include -#define __ELF_WORD_SIZE 32 -#include "elf.inc.h" - -extern NTSTATUS NTAPI Elf64FmtCreateSection -( - IN CONST VOID * FileHeader, - IN SIZE_T FileHeaderSize, - IN PVOID File, - OUT PMM_IMAGE_SECTION_OBJECT ImageSectionObject, - OUT PULONG Flags, - IN PEXEFMT_CB_READ_FILE ReadFileCb, - IN PEXEFMT_CB_ALLOCATE_SEGMENTS AllocateSegmentsCb -); - -NTSTATUS NTAPI ElfFmtCreateSection -( - IN CONST VOID * FileHeader, - IN SIZE_T FileHeaderSize, - IN PVOID File, - OUT PMM_IMAGE_SECTION_OBJECT ImageSectionObject, - OUT PULONG Flags, - IN PEXEFMT_CB_READ_FILE ReadFileCb, - IN PEXEFMT_CB_ALLOCATE_SEGMENTS AllocateSegmentsCb -) -{ - ULONG nDataType; - const Elf32_Ehdr * pehTempHeader; - - ASSERT(FileHeader); - ASSERT(FileHeaderSize > 0); - ASSERT(Intsafe_CanOffsetPointer(FileHeader, FileHeaderSize)); - ASSERT(File); - ASSERT(ImageSectionObject); - ASSERT(Flags); - ASSERT(ReadFileCb); - ASSERT(AllocateSegmentsCb); - - pehTempHeader = FileHeader; - ASSERT(((ULONG_PTR)pehTempHeader % TYPE_ALIGNMENT(Elf32_Ehdr)) == 0); - ASSERT(((ULONG_PTR)pehTempHeader % TYPE_ALIGNMENT(Elf64_Ehdr)) == 0); - - ASSERT(ELFFMT_FIELDS_EQUAL(Elf32_Ehdr, Elf64_Ehdr, e_ident)); - - /* File too small to be identified */ - if(!RTL_CONTAINS_FIELD(pehTempHeader, FileHeaderSize, e_ident[EI_MAG3])) - return STATUS_ROS_EXEFMT_UNKNOWN_FORMAT; - - /* Not an ELF file */ - if - ( - pehTempHeader->e_ident[EI_MAG0] != ELFMAG0 || - pehTempHeader->e_ident[EI_MAG1] != ELFMAG1 || - pehTempHeader->e_ident[EI_MAG2] != ELFMAG2 || - pehTempHeader->e_ident[EI_MAG3] != ELFMAG3 - ) - return STATUS_ROS_EXEFMT_UNKNOWN_FORMAT; - - /* Validate the data type */ - nDataType = pehTempHeader->e_ident[EI_DATA]; - - switch(nDataType) - { - case ELFDATA2LSB: - case ELFDATA2MSB: - break; - - default: - return STATUS_INVALID_IMAGE_FORMAT; - } - - /* Validate the version */ - ASSERT(ELFFMT_FIELDS_EQUAL(Elf32_Ehdr, Elf64_Ehdr, e_version)); - - if - ( - pehTempHeader->e_ident[EI_VERSION] != EV_CURRENT || - ElfFmtpReadULong(pehTempHeader->e_version, nDataType) != EV_CURRENT - ) - return STATUS_INVALID_IMAGE_FORMAT; - - /* Validate the file type */ - ASSERT(ELFFMT_FIELDS_EQUAL(Elf32_Ehdr, Elf64_Ehdr, e_type)); - - switch(ElfFmtpReadUShort(pehTempHeader->e_type, nDataType)) - { - case ET_DYN: ImageSectionObject->ImageCharacteristics |= IMAGE_FILE_DLL; - case ET_EXEC: break; - default: return STATUS_INVALID_IMAGE_FORMAT; - } - - /* Convert the target machine */ - ASSERT(ELFFMT_FIELDS_EQUAL(Elf32_Ehdr, Elf64_Ehdr, e_machine)); - ASSERT(ImageSectionObject->Machine == IMAGE_FILE_MACHINE_UNKNOWN); - - switch(ElfFmtpReadUShort(pehTempHeader->e_machine, nDataType)) - { - case EM_386: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_I386; break; - case EM_MIPS_RS3_LE: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_R3000; break; - -#if 0 - /* TODO: need to read e_flags for full identification */ - case EM_SH: break; -#endif - - case EM_ARM: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_ARM; break; - case EM_PPC: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_POWERPC; break; - case EM_IA_64: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_IA64; break; - case EM_ALPHA: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_AXP64; break; - case EM_X86_64: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_AMD64; break; - case EM_M32R: ImageSectionObject->Machine = IMAGE_FILE_MACHINE_M32R; break; - } - - /* Call the appropriate handler for the class-specific fields */ - switch(pehTempHeader->e_ident[EI_CLASS]) - { - case ELFCLASS32: - return Elf32FmtCreateSection - ( - FileHeader, - FileHeaderSize, - File, - ImageSectionObject, - Flags, - ReadFileCb, - AllocateSegmentsCb - ); - - case ELFCLASS64: - return Elf64FmtCreateSection - ( - FileHeader, - FileHeaderSize, - File, - ImageSectionObject, - Flags, - ReadFileCb, - AllocateSegmentsCb - ); - } - - /* Unknown class */ - return STATUS_INVALID_IMAGE_FORMAT; -} - -/* EOF */ diff --git a/ntoskrnl/mm/elf64.c b/ntoskrnl/mm/elf64.c deleted file mode 100644 index 783f5a00534..00000000000 --- a/ntoskrnl/mm/elf64.c +++ /dev/null @@ -1,11 +0,0 @@ -/* - * COPYRIGHT: See COPYING in the top level directory - * PROJECT: ReactOS kernel - * FILE: ntoskrnl/mm/elf64.c - * PURPOSE: No purpose listed. - * - * PROGRAMMERS: No programmer listed. - */ -#include -#define __ELF_WORD_SIZE 64 -#include "elf.inc.h" diff --git a/ntoskrnl/mm/freelist.c b/ntoskrnl/mm/freelist.c index b6b9806e4b0..c3156ec79e5 100644 --- a/ntoskrnl/mm/freelist.c +++ b/ntoskrnl/mm/freelist.c @@ -33,8 +33,7 @@ #define PHYSICAL_PAGE MMPFN #define PPHYSICAL_PAGE PMMPFN -/* The first array contains ReactOS PFNs, the second contains ARM3 PFNs */ -PPHYSICAL_PAGE MmPfnDatabase[2]; +PPHYSICAL_PAGE MmPfnDatabase; PFN_NUMBER MmAvailablePages; PFN_NUMBER MmResidentAvailablePages; @@ -448,82 +447,6 @@ MmDumpPfnDatabase(VOID) KeLowerIrql(OldIrql); } -VOID -NTAPI -MmInitializePageList(VOID) -{ - ULONG i; - PHYSICAL_PAGE UsedPage; - PMEMORY_ALLOCATION_DESCRIPTOR Md; - PLIST_ENTRY NextEntry; - ULONG NrSystemPages = 0; - - /* This is what a used page looks like */ - RtlZeroMemory(&UsedPage, sizeof(UsedPage)); - UsedPage.u3.e1.PageLocation = ActiveAndValid; - UsedPage.u3.e2.ReferenceCount = 1; - - /* Loop the memory descriptors */ - for (NextEntry = KeLoaderBlock->MemoryDescriptorListHead.Flink; - NextEntry != &KeLoaderBlock->MemoryDescriptorListHead; - NextEntry = NextEntry->Flink) - { - /* Get the descriptor */ - Md = CONTAINING_RECORD(NextEntry, - MEMORY_ALLOCATION_DESCRIPTOR, - ListEntry); - - /* Skip bad memory */ - if ((Md->MemoryType == LoaderFirmwarePermanent) || - (Md->MemoryType == LoaderBBTMemory) || - (Md->MemoryType == LoaderSpecialMemory) || - (Md->MemoryType == LoaderBad)) - { - // - // We do not build PFN entries for this - // - continue; - } - else if ((Md->MemoryType == LoaderFree) || - (Md->MemoryType == LoaderLoadedProgram) || - (Md->MemoryType == LoaderFirmwareTemporary) || - (Md->MemoryType == LoaderOsloaderStack)) - { - /* Loop every page part of the block */ - for (i = 0; i < Md->PageCount; i++) - { - /* Mark it as a free page */ - MmPfnDatabase[0][Md->BasePage + i].u3.e1.PageLocation = FreePageList; - MiInsertInListTail(&MmFreePageListHead, - &MmPfnDatabase[0][Md->BasePage + i]); - MmAvailablePages++; - } - } - else - { - /* Loop every page part of the block */ - for (i = 0; i < Md->PageCount; i++) - { - /* Everything else is used memory */ - MmPfnDatabase[0][Md->BasePage + i] = UsedPage; - NrSystemPages++; - } - } - } - - /* Finally handle the pages describing the PFN database themselves */ - for (i = MxOldFreeDescriptor.BasePage; i < MxFreeDescriptor->BasePage; i++) - { - /* Mark it as used kernel memory */ - MmPfnDatabase[0][i] = UsedPage; - NrSystemPages++; - } - - KeInitializeEvent(&ZeroPageThreadEvent, NotificationEvent, TRUE); - DPRINT("Pages: %x %x\n", MmAvailablePages, NrSystemPages); - MmInitializeBalancer(MmAvailablePages, NrSystemPages); -} - VOID NTAPI MmSetRmapListHeadPage(PFN_TYPE Pfn, struct _MM_RMAP_ENTRY* ListHead) @@ -688,7 +611,7 @@ MmAllocPage(ULONG Type) MmAvailablePages--; - PfnOffset = PageDescriptor - MmPfnDatabase[0]; + PfnOffset = MiGetPfnEntryIndex(PageDescriptor); if ((NeedClear) && (Type != MC_SYSTEM)) { MiZeroPage(PfnOffset); @@ -754,7 +677,7 @@ MmZeroPageThreadMain(PVOID Ignored) PageDescriptor = MiRemoveHeadList(&MmFreePageListHead); /* We set the page to used, because MmCreateVirtualMapping failed with unused pages */ KeReleaseQueuedSpinLock(LockQueuePfnLock, oldIrql); - Pfn = PageDescriptor - MmPfnDatabase[0]; + Pfn = MiGetPfnEntryIndex(PageDescriptor); Status = MiZeroPage(Pfn); oldIrql = KeAcquireQueuedSpinLock(LockQueuePfnLock); diff --git a/ntoskrnl/mm/mmdbg.c b/ntoskrnl/mm/mmdbg.c deleted file mode 100644 index fd11099e1fd..00000000000 --- a/ntoskrnl/mm/mmdbg.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - * PROJECT: ReactOS Kernel - * LICENSE: GPL - See COPYING in the top level directory - * FILE: ntoskrnl/mm/mmdbg.c - * PURPOSE: Memory Manager support routines for the Kernel Debugger - * PROGRAMMERS: Stefan Ginsberg (stefan.ginsberg@reactos.org) - */ - -/* INCLUDES *******************************************************************/ - -#include -#include "ARM3/miarm.h" -#define NDEBUG -#include - -/* GLOBALS ********************************************************************/ - -PMMPTE MmDebugPte = MiAddressToPte(MI_DEBUG_MAPPING); -BOOLEAN MiDbgReadyForPhysical = FALSE; - -/* FUNCTIONS ******************************************************************/ - -BOOLEAN -NTAPI -MmIsSessionAddress(IN PVOID Address) -{ - // - // No session space support yet - // - return FALSE; -} - -PVOID -NTAPI -MiDbgTranslatePhysicalAddress(IN ULONG64 PhysicalAddress, - IN ULONG Flags) -{ - extern MMPTE ValidKernelPte; - PFN_NUMBER Pfn; - MMPTE TempPte; - PVOID MappingBaseAddress; - - // - // Check if we are called too early - // - if (MiDbgReadyForPhysical == FALSE) - { - // - // The structures we require aren't initialized yet, fail - // - KdpDprintf("MiDbgTranslatePhysicalAddress called too early! " - "Address: 0x%I64x\n", PhysicalAddress); - return NULL; - } - - // - // FIXME: No support for cache flags yet - // - if ((Flags & (MMDBG_COPY_CACHED | - MMDBG_COPY_UNCACHED | - MMDBG_COPY_WRITE_COMBINED)) != 0) - { - // - // Fail - // - KdpDprintf("MiDbgTranslatePhysicalAddress: Cache Flags not yet supported. " - "Flags: 0x%lx\n", Flags & (MMDBG_COPY_CACHED | - MMDBG_COPY_UNCACHED | - MMDBG_COPY_WRITE_COMBINED)); - return NULL; - } - - // - // Save the base address of our mapping page - // - MappingBaseAddress = MiPteToAddress(MmDebugPte); - - // - // - // - TempPte = ValidKernelPte; - - // - // Convert physical address to PFN - // - Pfn = (PFN_NUMBER)(PhysicalAddress >> PAGE_SHIFT); - - // - // Check if this could be an I/O mapping - // - if (Pfn > MmHighestPhysicalPage) - { - // - // FIXME: We don't support this yet - // - KdpDprintf("MiDbgTranslatePhysicalAddress: I/O Space not yet supported. " - "PFN: 0x%I64x\n", (ULONG64)Pfn); - return NULL; - } - else - { - // - // Set the PFN in the PTE - // - TempPte.u.Hard.PageFrameNumber = Pfn; - } - - // - // Map the PTE and invalidate its TLB entry - // - *MmDebugPte = TempPte; - KeInvalidateTlbEntry(MappingBaseAddress); - - // - // Calculate and return the virtual offset into our mapping page - // - return (PVOID)((ULONG_PTR)MappingBaseAddress + - BYTE_OFFSET(PhysicalAddress)); -} - -VOID -NTAPI -MiDbgUnTranslatePhysicalAddress(VOID) -{ - PVOID MappingBaseAddress = MiPteToAddress(MmDebugPte); - - // - // The address must still be valid at this point - // - ASSERT(MmIsAddressValid(MappingBaseAddress)); - - // - // Clear the mapping PTE and invalidate its TLB entry - // - MmDebugPte->u.Long = 0; - KeInvalidateTlbEntry(MappingBaseAddress); -} - -NTSTATUS -NTAPI -MmDbgCopyMemory(IN ULONG64 Address, - IN PVOID Buffer, - IN ULONG Size, - IN ULONG Flags) -{ - NTSTATUS Status; - PVOID TargetAddress; - - // - // No local kernel debugging support yet, so don't worry about locking - // - ASSERT(Flags & MMDBG_COPY_UNSAFE); - - // - // We only handle 1, 2, 4 and 8 byte requests - // - if ((Size != 1) && - (Size != 2) && - (Size != 4) && - (Size != MMDBG_COPY_MAX_SIZE)) - { - // - // Invalid size, fail - // - KdpDprintf("MmDbgCopyMemory: Received Illegal Size 0x%lx\n", Size); - return STATUS_INVALID_PARAMETER_3; - } - - // - // The copy must be aligned - // - if ((Address & (Size - 1)) != 0) - { - // - // Fail - // - KdpDprintf("MmDbgCopyMemory: Received Unaligned Address 0x%I64x Size %lx\n", - Address, Size); - return STATUS_INVALID_PARAMETER_3; - } - - // - // Check if this is physical or virtual copy - // - if (Flags & MMDBG_COPY_PHYSICAL) - { - // - // Physical: translate and map it to our mapping space - // - TargetAddress = MiDbgTranslatePhysicalAddress(Address, Flags); - - // - // Check if translation failed - // - if (!TargetAddress) - { - // - // Fail - // - KdpDprintf("MmDbgCopyMemory: Failed to Translate Physical Address " - "%I64x\n", Address); - return STATUS_UNSUCCESSFUL; - } - - // - // The address we received must be valid! - // - ASSERT(MmIsAddressValid(TargetAddress)); - } - else - { - // - // Virtual; truncate it to avoid casts later down - // - TargetAddress = (PVOID)(ULONG_PTR)Address; - - // - // Check if the address is invalid - // - if (!MmIsAddressValid(TargetAddress)) - { - // - // Fail - // - KdpDprintf("MmDbgCopyMemory: Failing %s for invalid " - "Virtual Address 0x%p\n", - Flags & MMDBG_COPY_WRITE ? "write" : "read", - TargetAddress); - return STATUS_UNSUCCESSFUL; - } - - // - // No session space support yet - // - ASSERT(MmIsSessionAddress(TargetAddress) == FALSE); - } - - // - // If we are going to write to the address then make sure it is writeable too - // - if ((Flags & MMDBG_COPY_WRITE) && - (!MI_IS_PAGE_WRITEABLE(MiAddressToPte(TargetAddress)))) - { - // - // Check if we mapped anything - // - if (Flags & MMDBG_COPY_PHYSICAL) - { - // - // Get rid of the mapping - // - MiDbgUnTranslatePhysicalAddress(); - } - - // - // Fail - // - // FIXME: We should attempt to override the write protection instead of - // failing here - // - KdpDprintf("MmDbgCopyMemory: Failing Write for Protected Address 0x%p\n", - TargetAddress); - return STATUS_UNSUCCESSFUL; - } - - // - // Use SEH to try to catch anything else somewhat cleanly - // - _SEH2_TRY - { - // - // Check if this is read or write - // - if (Flags & MMDBG_COPY_WRITE) - { - // - // Do the write - // - RtlCopyMemory(TargetAddress, - Buffer, - Size); - } - else - { - // - // Do the read - // - RtlCopyMemory(Buffer, - TargetAddress, - Size); - } - - // - // Copy succeeded - // - Status = STATUS_SUCCESS; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - // - // Get the exception code - // - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - - // - // Get rid of the mapping if this was a physical copy - // - if (Flags & MMDBG_COPY_PHYSICAL) - { - // - // Unmap and flush it - // - MiDbgUnTranslatePhysicalAddress(); - } - - // - // Return status to caller - // - return Status; -} diff --git a/ntoskrnl/mm/mmfault.c b/ntoskrnl/mm/mmfault.c index f908e608bed..c4a81739c38 100644 --- a/ntoskrnl/mm/mmfault.c +++ b/ntoskrnl/mm/mmfault.c @@ -284,13 +284,13 @@ MmAccessFault(IN BOOLEAN StoreInstruction, * can go away. */ MemoryArea = MmLocateMemoryAreaByAddress(MmGetKernelAddressSpace(), Address); - if ((!(MemoryArea) && ((ULONG_PTR)Address >= (ULONG_PTR)MmSystemRangeStart)) || + if ((!(MemoryArea) && ((ULONG_PTR)Address >= (ULONG_PTR)MmPagedPoolStart)) || ((MemoryArea) && (MemoryArea->Type == MEMORY_AREA_OWNED_BY_ARM3))) { // // Hand it off to more competent hands... // - DPRINT1("ARM3 fault\n"); + DPRINT("ARM3 fault %p\n", MemoryArea); return MmArmAccessFault(StoreInstruction, Address, Mode, TrapInformation); } diff --git a/ntoskrnl/mm/mminit.c b/ntoskrnl/mm/mminit.c index cb10634fdc2..83c45f145b9 100644 --- a/ntoskrnl/mm/mminit.c +++ b/ntoskrnl/mm/mminit.c @@ -109,7 +109,7 @@ MiInitSystemMemoryAreas() // // Protect the PFN database // - BaseAddress = MmPfnDatabase[0]; + BaseAddress = MmPfnDatabase; Status = MmCreateMemoryArea(MmGetKernelAddressSpace(), MEMORY_AREA_OWNED_BY_ARM3 | MEMORY_AREA_STATIC, &BaseAddress, @@ -292,8 +292,8 @@ MiDbgDumpAddressSpace(VOID) (ULONG_PTR)MmPagedPoolBase + MmPagedPoolSize, "Paged Pool"); DPRINT1(" 0x%p - 0x%p\t%s\n", - MmPfnDatabase[0], - (ULONG_PTR)MmPfnDatabase[0] + (MxPfnAllocation << PAGE_SHIFT), + MmPfnDatabase, + (ULONG_PTR)MmPfnDatabase + (MxPfnAllocation << PAGE_SHIFT), "PFN Database"); DPRINT1(" 0x%p - 0x%p\t%s\n", MmNonPagedPoolStart, @@ -371,18 +371,8 @@ MmInitSystem(IN ULONG Phase, /* Dump memory descriptors */ if (MiDbgEnableMdDump) MiDbgDumpMemoryDescriptors(); - // - // Initialize ARMÂł in phase 0 - // + /* Initialize ARMÂł in phase 0 */ MmArmInitSystem(0, KeLoaderBlock); - -#if defined(_WINKD_) - // - // Everything required for the debugger to read and write - // physical memory is now set up - // - MiDbgReadyForPhysical = TRUE; -#endif /* Put the paged pool after the loaded modules */ MmPagedPoolBase = (PVOID)PAGE_ROUND_UP((ULONG_PTR)MmSystemRangeStart + @@ -394,15 +384,10 @@ MmInitSystem(IN ULONG Phase, /* Dump the address space */ MiDbgDumpAddressSpace(); - - /* Initialize paged pool */ - MmInitializePagedPool(); - - /* Initialize the loaded module list */ - MiInitializeLoadedModuleList(LoaderBlock); } else if (Phase == 1) { + MmInitializePagedPool(); MiInitializeUserPfnBitmap(); MmInitializeMemoryConsumer(MC_USER, MmTrimUserMemory); MmInitializeRmapList(); @@ -453,7 +438,9 @@ MmInitSystem(IN ULONG Phase, } else if (Phase == 2) { - + /* Enough fun for now */ + extern BOOLEAN AllowPagedPool; + AllowPagedPool = FALSE; } return TRUE; diff --git a/ntoskrnl/mm/sysldr.c b/ntoskrnl/mm/sysldr.c deleted file mode 100644 index fcecf3c8da5..00000000000 --- a/ntoskrnl/mm/sysldr.c +++ /dev/null @@ -1,3133 +0,0 @@ -/* -* PROJECT: ReactOS Kernel -* LICENSE: GPL - See COPYING in the top level directory -* FILE: ntoskrnl/mm/sysldr.c -* PURPOSE: Contains the Kernel Loader (SYSLDR) for loading PE files. -* PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) -* ReactOS Portable Systems Group -*/ - -/* INCLUDES *******************************************************************/ - -#include -#define NDEBUG -#include - -#line 16 "ARMÂł::LOADER" -#define MODULE_INVOLVED_IN_ARM3 -#include "./ARM3/miarm.h" - -/* GCC's incompetence strikes again */ -__inline -VOID -sprintf_nt(IN PCHAR Buffer, - IN PCHAR Format, - IN ...) -{ - va_list ap; - va_start(ap, Format); - vsprintf(Buffer, Format, ap); - va_end(ap); -} - -/* GLOBALS ********************************************************************/ - -LIST_ENTRY PsLoadedModuleList; -LIST_ENTRY MmLoadedUserImageList; -KSPIN_LOCK PsLoadedModuleSpinLock; -ERESOURCE PsLoadedModuleResource; -ULONG_PTR PsNtosImageBase; -KMUTANT MmSystemLoadLock; - -PFN_NUMBER MmTotalSystemDriverPages; - -PVOID MmUnloadedDrivers; -PVOID MmLastUnloadedDrivers; - -BOOLEAN MmMakeLowMemory; -BOOLEAN MmEnforceWriteProtection = TRUE; - -PMMPTE MiKernelResourceStartPte, MiKernelResourceEndPte; -ULONG_PTR ExPoolCodeStart, ExPoolCodeEnd, MmPoolCodeStart, MmPoolCodeEnd; -ULONG_PTR MmPteCodeStart, MmPteCodeEnd; - -/* FUNCTIONS ******************************************************************/ - -PVOID -NTAPI -MiCacheImageSymbols(IN PVOID BaseAddress) -{ - ULONG DebugSize; - PVOID DebugDirectory = NULL; - PAGED_CODE(); - - /* Make sure it's safe to access the image */ - _SEH2_TRY - { - /* Get the debug directory */ - DebugDirectory = RtlImageDirectoryEntryToData(BaseAddress, - TRUE, - IMAGE_DIRECTORY_ENTRY_DEBUG, - &DebugSize); - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - /* Nothing */ - } - _SEH2_END; - - /* Return the directory */ - return DebugDirectory; -} - -NTSTATUS -NTAPI -MiLoadImageSection(IN OUT PVOID *SectionPtr, - OUT PVOID *ImageBase, - IN PUNICODE_STRING FileName, - IN BOOLEAN SessionLoad, - IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - PROS_SECTION_OBJECT Section = *SectionPtr; - NTSTATUS Status; - PEPROCESS Process; - PVOID Base = NULL; - SIZE_T ViewSize = 0; - KAPC_STATE ApcState; - LARGE_INTEGER SectionOffset = {{0, 0}}; - BOOLEAN LoadSymbols = FALSE; - PFN_NUMBER PteCount; - PMMPTE PointerPte, LastPte; - PVOID DriverBase; - MMPTE TempPte; - PAGED_CODE(); - - /* Detect session load */ - if (SessionLoad) - { - /* Fail */ - DPRINT1("Session loading not yet supported!\n"); - while (TRUE); - } - - /* Not session load, shouldn't have an entry */ - ASSERT(LdrEntry == NULL); - - /* Attach to the system process */ - KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState); - - /* Check if we need to load symbols */ - if (NtGlobalFlag & FLG_ENABLE_KDEBUG_SYMBOL_LOAD) - { - /* Yes we do */ - LoadSymbols = TRUE; - NtGlobalFlag &= ~FLG_ENABLE_KDEBUG_SYMBOL_LOAD; - } - - /* Map the driver */ - Process = PsGetCurrentProcess(); - Status = MmMapViewOfSection(Section, - Process, - &Base, - 0, - 0, - &SectionOffset, - &ViewSize, - ViewUnmap, - 0, - PAGE_EXECUTE); - - /* Re-enable the flag */ - if (LoadSymbols) NtGlobalFlag |= FLG_ENABLE_KDEBUG_SYMBOL_LOAD; - - /* Check if we failed with distinguished status code */ - if (Status == STATUS_IMAGE_MACHINE_TYPE_MISMATCH) - { - /* Change it to something more generic */ - Status = STATUS_INVALID_IMAGE_FORMAT; - } - - /* Now check if we failed */ - if (!NT_SUCCESS(Status)) - { - /* Detach and return */ - KeUnstackDetachProcess(&ApcState); - return Status; - } - - /* Reserve system PTEs needed */ - PteCount = ROUND_TO_PAGES(Section->ImageSection->ImageSize) >> PAGE_SHIFT; - PointerPte = MiReserveSystemPtes(PteCount, SystemPteSpace); - if (!PointerPte) return STATUS_INSUFFICIENT_RESOURCES; - - /* New driver base */ - LastPte = PointerPte + PteCount; - DriverBase = MiPteToAddress(PointerPte); - - /* The driver is here */ - *ImageBase = DriverBase; - - /* Loop the new driver PTEs */ - TempPte = ValidKernelPte; - while (PointerPte < LastPte) - { - /* Allocate a page */ - TempPte.u.Hard.PageFrameNumber = MmAllocPage(MC_NPPOOL); - - /* Write it */ - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - /* Move on */ - PointerPte++; - } - - /* Copy the image */ - RtlCopyMemory(DriverBase, Base, PteCount << PAGE_SHIFT); - - /* Now unmap the view */ - Status = MmUnmapViewOfSection(Process, Base); - ASSERT(NT_SUCCESS(Status)); - - /* Detach and return status */ - KeUnstackDetachProcess(&ApcState); - return Status; -} - -PVOID -NTAPI -MiLocateExportName(IN PVOID DllBase, - IN PCHAR ExportName) -{ - PULONG NameTable; - PUSHORT OrdinalTable; - PIMAGE_EXPORT_DIRECTORY ExportDirectory; - LONG Low = 0, Mid = 0, High, Ret; - USHORT Ordinal; - PVOID Function; - ULONG ExportSize; - PULONG ExportTable; - PAGED_CODE(); - - /* Get the export directory */ - ExportDirectory = RtlImageDirectoryEntryToData(DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ExportSize); - if (!ExportDirectory) return NULL; - - /* Setup name tables */ - NameTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNames); - OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNameOrdinals); - - /* Do a binary search */ - High = ExportDirectory->NumberOfNames - 1; - while (High >= Low) - { - /* Get new middle value */ - Mid = (Low + High) >> 1; - - /* Compare name */ - Ret = strcmp(ExportName, (PCHAR)DllBase + NameTable[Mid]); - if (Ret < 0) - { - /* Update high */ - High = Mid - 1; - } - else if (Ret > 0) - { - /* Update low */ - Low = Mid + 1; - } - else - { - /* We got it */ - break; - } - } - - /* Check if we couldn't find it */ - if (High < Low) return NULL; - - /* Otherwise, this is the ordinal */ - Ordinal = OrdinalTable[Mid]; - - /* Resolve the address and write it */ - ExportTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfFunctions); - Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); - - /* Check if the function is actually a forwarder */ - if (((ULONG_PTR)Function > (ULONG_PTR)ExportDirectory) && - ((ULONG_PTR)Function < ((ULONG_PTR)ExportDirectory + ExportSize))) - { - /* It is, fail */ - return NULL; - } - - /* We found it */ - return Function; -} - -NTSTATUS -NTAPI -MmCallDllInitialize(IN PLDR_DATA_TABLE_ENTRY LdrEntry, - IN PLIST_ENTRY ListHead) -{ - UNICODE_STRING ServicesKeyName = RTL_CONSTANT_STRING( - L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\"); - PMM_DLL_INITIALIZE DllInit; - UNICODE_STRING RegPath, ImportName; - NTSTATUS Status; - - /* Try to see if the image exports a DllInitialize routine */ - DllInit = (PMM_DLL_INITIALIZE)MiLocateExportName(LdrEntry->DllBase, - "DllInitialize"); - if (!DllInit) return STATUS_SUCCESS; - - /* Do a temporary copy of BaseDllName called ImportName - * because we'll alter the length of the string - */ - ImportName.Length = LdrEntry->BaseDllName.Length; - ImportName.MaximumLength = LdrEntry->BaseDllName.MaximumLength; - ImportName.Buffer = LdrEntry->BaseDllName.Buffer; - - /* Obtain the path to this dll's service in the registry */ - RegPath.MaximumLength = ServicesKeyName.Length + - ImportName.Length + sizeof(UNICODE_NULL); - RegPath.Buffer = ExAllocatePoolWithTag(NonPagedPool, - RegPath.MaximumLength, - TAG_LDR_WSTR); - - /* Check if this allocation was unsuccessful */ - if (!RegPath.Buffer) return STATUS_INSUFFICIENT_RESOURCES; - - /* Build and append the service name itself */ - RegPath.Length = ServicesKeyName.Length; - RtlCopyMemory(RegPath.Buffer, - ServicesKeyName.Buffer, - ServicesKeyName.Length); - - /* Check if there is a dot in the filename */ - if (wcschr(ImportName.Buffer, L'.')) - { - /* Remove the extension */ - ImportName.Length = (wcschr(ImportName.Buffer, L'.') - - ImportName.Buffer) * sizeof(WCHAR); - } - - /* Append service name (the basename without extension) */ - RtlAppendUnicodeStringToString(&RegPath, &ImportName); - - /* Now call the DllInit func */ - DPRINT("Calling DllInit(%wZ)\n", &RegPath); - Status = DllInit(&RegPath); - - /* Clean up */ - ExFreePool(RegPath.Buffer); - - /* Return status value which DllInitialize returned */ - return Status; -} - -BOOLEAN -NTAPI -MiCallDllUnloadAndUnloadDll(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - NTSTATUS Status; - PMM_DLL_UNLOAD Func; - PAGED_CODE(); - - /* Get the unload routine */ - Func = (PMM_DLL_UNLOAD)MiLocateExportName(LdrEntry->DllBase, "DllUnload"); - if (!Func) return FALSE; - - /* Call it and check for success */ - Status = Func(); - if (!NT_SUCCESS(Status)) return FALSE; - - /* Lie about the load count so we can unload the image */ - ASSERT(LdrEntry->LoadCount == 0); - LdrEntry->LoadCount = 1; - - /* Unload it and return true */ - MmUnloadSystemImage(LdrEntry); - return TRUE; -} - -NTSTATUS -NTAPI -MiDereferenceImports(IN PLOAD_IMPORTS ImportList) -{ - SIZE_T i; - LOAD_IMPORTS SingleEntry; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PVOID CurrentImports; - PAGED_CODE(); - - /* Check if there's no imports or if we're a boot driver */ - if ((ImportList == MM_SYSLDR_NO_IMPORTS) || - (ImportList == MM_SYSLDR_BOOT_LOADED) || - (ImportList->Count == 0)) - { - /* Then there's nothing to do */ - return STATUS_SUCCESS; - } - - /* Check for single-entry */ - if ((ULONG_PTR)ImportList & MM_SYSLDR_SINGLE_ENTRY) - { - /* Set it up */ - SingleEntry.Count = 1; - SingleEntry.Entry[0] = (PVOID)((ULONG_PTR)ImportList &~ MM_SYSLDR_SINGLE_ENTRY); - - /* Use this as the import list */ - ImportList = &SingleEntry; - } - - /* Loop the import list */ - for (i = 0; (i < ImportList->Count) && (ImportList->Entry[i]); i++) - { - /* Get the entry */ - LdrEntry = ImportList->Entry[i]; - DPRINT1("%wZ <%wZ>\n", &LdrEntry->FullDllName, &LdrEntry->BaseDllName); - - /* Skip boot loaded images */ - if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) continue; - - /* Dereference the entry */ - ASSERT(LdrEntry->LoadCount >= 1); - if (!--LdrEntry->LoadCount) - { - /* Save the import data in case unload fails */ - CurrentImports = LdrEntry->LoadedImports; - - /* This is the last entry */ - LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; - if (MiCallDllUnloadAndUnloadDll(LdrEntry)) - { - /* Unloading worked, parse this DLL's imports too */ - MiDereferenceImports(CurrentImports); - - /* Check if we had valid imports */ - if ((CurrentImports != MM_SYSLDR_BOOT_LOADED) || - (CurrentImports != MM_SYSLDR_NO_IMPORTS) || - !((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) - { - /* Free them */ - ExFreePool(CurrentImports); - } - } - else - { - /* Unload failed, restore imports */ - LdrEntry->LoadedImports = CurrentImports; - } - } - } - - /* Done */ - return STATUS_SUCCESS; -} - -VOID -NTAPI -MiClearImports(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - PAGED_CODE(); - - /* Check if there's no imports or we're a boot driver or only one entry */ - if ((LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) || - (LdrEntry->LoadedImports == MM_SYSLDR_NO_IMPORTS) || - ((ULONG_PTR)LdrEntry->LoadedImports & MM_SYSLDR_SINGLE_ENTRY)) - { - /* Nothing to do */ - return; - } - - /* Otherwise, free the import list */ - ExFreePool(LdrEntry->LoadedImports); - LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; -} - -PVOID -NTAPI -MiFindExportedRoutineByName(IN PVOID DllBase, - IN PANSI_STRING ExportName) -{ - PULONG NameTable; - PUSHORT OrdinalTable; - PIMAGE_EXPORT_DIRECTORY ExportDirectory; - LONG Low = 0, Mid = 0, High, Ret; - USHORT Ordinal; - PVOID Function; - ULONG ExportSize; - PULONG ExportTable; - PAGED_CODE(); - - /* Get the export directory */ - ExportDirectory = RtlImageDirectoryEntryToData(DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ExportSize); - if (!ExportDirectory) return NULL; - - /* Setup name tables */ - NameTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNames); - OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNameOrdinals); - - /* Do a binary search */ - High = ExportDirectory->NumberOfNames - 1; - while (High >= Low) - { - /* Get new middle value */ - Mid = (Low + High) >> 1; - - /* Compare name */ - Ret = strcmp(ExportName->Buffer, (PCHAR)DllBase + NameTable[Mid]); - if (Ret < 0) - { - /* Update high */ - High = Mid - 1; - } - else if (Ret > 0) - { - /* Update low */ - Low = Mid + 1; - } - else - { - /* We got it */ - break; - } - } - - /* Check if we couldn't find it */ - if (High < Low) return NULL; - - /* Otherwise, this is the ordinal */ - Ordinal = OrdinalTable[Mid]; - - /* Validate the ordinal */ - if (Ordinal >= ExportDirectory->NumberOfFunctions) return NULL; - - /* Resolve the address and write it */ - ExportTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfFunctions); - Function = (PVOID)((ULONG_PTR)DllBase + ExportTable[Ordinal]); - - /* We found it! */ - ASSERT(!(Function > (PVOID)ExportDirectory) && - (Function < (PVOID)((ULONG_PTR)ExportDirectory + ExportSize))); - return Function; -} - -VOID -NTAPI -MiProcessLoaderEntry(IN PLDR_DATA_TABLE_ENTRY LdrEntry, - IN BOOLEAN Insert) -{ - KIRQL OldIrql; - - /* Acquire module list lock */ - KeEnterCriticalRegion(); - ExAcquireResourceExclusiveLite(&PsLoadedModuleResource, TRUE); - - /* Acquire the spinlock too as we will insert or remove the entry */ - OldIrql = KeAcquireSpinLockRaiseToSynch(&PsLoadedModuleSpinLock); - - /* Insert or remove from the list */ - Insert ? InsertTailList(&PsLoadedModuleList, &LdrEntry->InLoadOrderLinks) : - RemoveEntryList(&LdrEntry->InLoadOrderLinks); - - /* Release locks */ - KeReleaseSpinLock(&PsLoadedModuleSpinLock, OldIrql); - ExReleaseResourceLite(&PsLoadedModuleResource); - KeLeaveCriticalRegion(); -} - -VOID -NTAPI -MiUpdateThunks(IN PLOADER_PARAMETER_BLOCK LoaderBlock, - IN PVOID OldBase, - IN PVOID NewBase, - IN ULONG Size) -{ - ULONG_PTR OldBaseTop, Delta; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PLIST_ENTRY NextEntry; - ULONG ImportSize, i; - PULONG_PTR ImageThunk; - PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; - - /* Calculate the top and delta */ - OldBaseTop = (ULONG_PTR)OldBase + Size - 1; - Delta = (ULONG_PTR)NewBase - (ULONG_PTR)OldBase; - - /* Loop the loader block */ - for (NextEntry = LoaderBlock->LoadOrderListHead.Flink; - NextEntry != &LoaderBlock->LoadOrderListHead; - NextEntry = NextEntry->Flink) - { - /* Get the loader entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); -#ifdef _WORKING_LINKER_ - /* Get the IAT */ - ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IAT, - &ImportSize); - if (!ImageThunk) continue; - - /* Make sure we have an IAT */ - DPRINT("[Mm0]: Updating thunks in: %wZ\n", &LdrEntry->BaseDllName); - for (i = 0; i < ImportSize; i++, ImageThunk++) - { - /* Check if it's within this module */ - if ((*ImageThunk >= (ULONG_PTR)OldBase) && (*ImageThunk <= OldBaseTop)) - { - /* Relocate it */ - DPRINT("[Mm0]: Updating IAT at: %p. Old Entry: %p. New Entry: %p.\n", - ImageThunk, *ImageThunk, *ImageThunk + Delta); - *ImageThunk += Delta; - } - } -#else - /* Get the import table */ - i = ImportSize; - ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - &ImportSize); - if (!ImportDescriptor) continue; - - /* Make sure we have an IAT */ - DPRINT("[Mm0]: Updating thunks in: %wZ\n", &LdrEntry->BaseDllName); - while ((ImportDescriptor->Name) && - (ImportDescriptor->OriginalFirstThunk)) - { - /* Get the image thunk */ - ImageThunk = (PVOID)((ULONG_PTR)LdrEntry->DllBase + - ImportDescriptor->FirstThunk); - while (*ImageThunk) - { - /* Check if it's within this module */ - if ((*ImageThunk >= (ULONG_PTR)OldBase) && (*ImageThunk <= OldBaseTop)) - { - /* Relocate it */ - DPRINT("[Mm0]: Updating IAT at: %p. Old Entry: %p. New Entry: %p.\n", - ImageThunk, *ImageThunk, *ImageThunk + Delta); - *ImageThunk += Delta; - } - - /* Go to the next thunk */ - ImageThunk++; - } - - /* Go to the next import */ - ImportDescriptor++; - } -#endif - } -} - -NTSTATUS -NTAPI -MiSnapThunk(IN PVOID DllBase, - IN PVOID ImageBase, - IN PIMAGE_THUNK_DATA Name, - IN PIMAGE_THUNK_DATA Address, - IN PIMAGE_EXPORT_DIRECTORY ExportDirectory, - IN ULONG ExportSize, - IN BOOLEAN SnapForwarder, - OUT PCHAR *MissingApi) -{ - BOOLEAN IsOrdinal; - USHORT Ordinal; - PULONG NameTable; - PUSHORT OrdinalTable; - PIMAGE_IMPORT_BY_NAME NameImport; - USHORT Hint; - ULONG Low = 0, Mid = 0, High; - LONG Ret; - NTSTATUS Status; - PCHAR MissingForwarder; - CHAR NameBuffer[MAXIMUM_FILENAME_LENGTH]; - PULONG ExportTable; - ANSI_STRING DllName; - UNICODE_STRING ForwarderName; - PLIST_ENTRY NextEntry; - PLDR_DATA_TABLE_ENTRY LdrEntry; - ULONG ForwardExportSize; - PIMAGE_EXPORT_DIRECTORY ForwardExportDirectory; - PIMAGE_IMPORT_BY_NAME ForwardName; - ULONG ForwardLength; - IMAGE_THUNK_DATA ForwardThunk; - PAGED_CODE(); - - /* Check if this is an ordinal */ - IsOrdinal = IMAGE_SNAP_BY_ORDINAL(Name->u1.Ordinal); - if ((IsOrdinal) && !(SnapForwarder)) - { - /* Get the ordinal number and set it as missing */ - Ordinal = (USHORT)(IMAGE_ORDINAL(Name->u1.Ordinal) - - ExportDirectory->Base); - *MissingApi = (PCHAR)(ULONG_PTR)Ordinal; - } - else - { - /* Get the VA if we don't have to snap */ - if (!SnapForwarder) Name->u1.AddressOfData += (ULONG_PTR)ImageBase; - NameImport = (PIMAGE_IMPORT_BY_NAME)Name->u1.AddressOfData; - - /* Copy the procedure name */ - strncpy(*MissingApi, - (PCHAR)&NameImport->Name[0], - MAXIMUM_FILENAME_LENGTH - 1); - - /* Setup name tables */ - DPRINT("Import name: %s\n", NameImport->Name); - NameTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNames); - OrdinalTable = (PUSHORT)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfNameOrdinals); - - /* Get the hint and check if it's valid */ - Hint = NameImport->Hint; - if ((Hint < ExportDirectory->NumberOfNames) && - !(strcmp((PCHAR)NameImport->Name, (PCHAR)DllBase + NameTable[Hint]))) - { - /* We have a match, get the ordinal number from here */ - Ordinal = OrdinalTable[Hint]; - } - else - { - /* Do a binary search */ - High = ExportDirectory->NumberOfNames - 1; - while (High >= Low) - { - /* Get new middle value */ - Mid = (Low + High) >> 1; - - /* Compare name */ - Ret = strcmp((PCHAR)NameImport->Name, (PCHAR)DllBase + NameTable[Mid]); - if (Ret < 0) - { - /* Update high */ - High = Mid - 1; - } - else if (Ret > 0) - { - /* Update low */ - Low = Mid + 1; - } - else - { - /* We got it */ - break; - } - } - - /* Check if we couldn't find it */ - if (High < Low) return STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; - - /* Otherwise, this is the ordinal */ - Ordinal = OrdinalTable[Mid]; - } - } - - /* Check if the ordinal is invalid */ - if (Ordinal >= ExportDirectory->NumberOfFunctions) - { - /* Fail */ - Status = STATUS_DRIVER_ORDINAL_NOT_FOUND; - } - else - { - /* In case the forwarder is missing */ - MissingForwarder = NameBuffer; - - /* Resolve the address and write it */ - ExportTable = (PULONG)((ULONG_PTR)DllBase + - ExportDirectory->AddressOfFunctions); - Address->u1.Function = (ULONG_PTR)DllBase + ExportTable[Ordinal]; - - /* Assume success from now on */ - Status = STATUS_SUCCESS; - - /* Check if the function is actually a forwarder */ - if ((Address->u1.Function > (ULONG_PTR)ExportDirectory) && - (Address->u1.Function < ((ULONG_PTR)ExportDirectory + ExportSize))) - { - /* Now assume failure in case the forwarder doesn't exist */ - Status = STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; - - /* Build the forwarder name */ - DllName.Buffer = (PCHAR)Address->u1.Function; - DllName.Length = strchr(DllName.Buffer, '.') - - DllName.Buffer + - sizeof(ANSI_NULL); - DllName.MaximumLength = DllName.Length; - - /* Convert it */ - if (!NT_SUCCESS(RtlAnsiStringToUnicodeString(&ForwarderName, - &DllName, - TRUE))) - { - /* We failed, just return an error */ - return Status; - } - - /* Loop the module list */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the loader entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Check if it matches */ - if (RtlPrefixString((PSTRING)&ForwarderName, - (PSTRING)&LdrEntry->BaseDllName, - TRUE)) - { - /* Get the forwarder export directory */ - ForwardExportDirectory = - RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ForwardExportSize); - if (!ForwardExportDirectory) break; - - /* Allocate a name entry */ - ForwardLength = strlen(DllName.Buffer + DllName.Length) + - sizeof(ANSI_NULL); - ForwardName = ExAllocatePoolWithTag(PagedPool, - sizeof(*ForwardName) + - ForwardLength, - TAG_LDR_WSTR); - if (!ForwardName) break; - - /* Copy the data */ - RtlCopyMemory(&ForwardName->Name[0], - DllName.Buffer + DllName.Length, - ForwardLength); - ForwardName->Hint = 0; - - /* Set the new address */ - ForwardThunk.u1.AddressOfData = (ULONG_PTR)ForwardName; - - /* Snap the forwarder */ - Status = MiSnapThunk(LdrEntry->DllBase, - ImageBase, - &ForwardThunk, - &ForwardThunk, - ForwardExportDirectory, - ForwardExportSize, - TRUE, - &MissingForwarder); - - /* Free the forwarder name and set the thunk */ - ExFreePoolWithTag(ForwardName, TAG_LDR_WSTR); - Address->u1 = ForwardThunk.u1; - break; - } - - /* Go to the next entry */ - NextEntry = NextEntry->Flink; - } - - /* Free the name */ - RtlFreeUnicodeString(&ForwarderName); - } - } - - /* Return status */ - return Status; -} - -NTSTATUS -NTAPI -MmUnloadSystemImage(IN PVOID ImageHandle) -{ - PLDR_DATA_TABLE_ENTRY LdrEntry = ImageHandle; - PVOID BaseAddress = LdrEntry->DllBase; - NTSTATUS Status; - STRING TempName; - BOOLEAN HadEntry = FALSE; - - /* Acquire the loader lock */ - KeEnterCriticalRegion(); - KeWaitForSingleObject(&MmSystemLoadLock, - WrVirtualMemory, - KernelMode, - FALSE, - NULL); - - /* Check if this driver was loaded at boot and didn't get imports parsed */ - if (LdrEntry->LoadedImports == MM_SYSLDR_BOOT_LOADED) goto Done; - - /* We should still be alive */ - ASSERT(LdrEntry->LoadCount != 0); - LdrEntry->LoadCount--; - - /* Check if we're still loaded */ - if (LdrEntry->LoadCount) goto Done; - - /* We should cleanup... are symbols loaded */ - if (LdrEntry->Flags & LDRP_DEBUG_SYMBOLS_LOADED) - { - /* Create the ANSI name */ - Status = RtlUnicodeStringToAnsiString(&TempName, - &LdrEntry->BaseDllName, - TRUE); - if (NT_SUCCESS(Status)) - { - /* Unload the symbols */ - DbgUnLoadImageSymbols(&TempName, - BaseAddress, - (ULONG_PTR)ZwCurrentProcess()); - RtlFreeAnsiString(&TempName); - } - } - - /* FIXME: Free the driver */ - DPRINT1("Leaking driver: %wZ\n", &LdrEntry->BaseDllName); - //MmFreeSection(LdrEntry->DllBase); - - /* Check if we're linked in */ - if (LdrEntry->InLoadOrderLinks.Flink) - { - /* Remove us */ - MiProcessLoaderEntry(LdrEntry, FALSE); - HadEntry = TRUE; - } - - /* Dereference and clear the imports */ - MiDereferenceImports(LdrEntry->LoadedImports); - MiClearImports(LdrEntry); - - /* Check if the entry needs to go away */ - if (HadEntry) - { - /* Check if it had a name */ - if (LdrEntry->FullDllName.Buffer) - { - /* Free it */ - ExFreePool(LdrEntry->FullDllName.Buffer); - } - - /* Check if we had a section */ - if (LdrEntry->SectionPointer) - { - /* Dereference it */ - ObDereferenceObject(LdrEntry->SectionPointer); - } - - /* Free the entry */ - ExFreePool(LdrEntry); - } - - /* Release the system lock and return */ -Done: - KeReleaseMutant(&MmSystemLoadLock, 1, FALSE, FALSE); - KeLeaveCriticalRegion(); - return STATUS_SUCCESS; -} - -NTSTATUS -NTAPI -MiResolveImageReferences(IN PVOID ImageBase, - IN PUNICODE_STRING ImageFileDirectory, - IN PUNICODE_STRING NamePrefix OPTIONAL, - OUT PCHAR *MissingApi, - OUT PWCHAR *MissingDriver, - OUT PLOAD_IMPORTS *LoadImports) -{ - PCHAR MissingApiBuffer = *MissingApi, ImportName; - PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor, CurrentImport; - ULONG ImportSize, ImportCount = 0, LoadedImportsSize, ExportSize; - PLOAD_IMPORTS LoadedImports, NewImports; - ULONG GdiLink, NormalLink, i; - BOOLEAN ReferenceNeeded, Loaded; - ANSI_STRING TempString; - UNICODE_STRING NameString, DllName; - PLDR_DATA_TABLE_ENTRY LdrEntry = NULL, DllEntry, ImportEntry = NULL; - PVOID ImportBase, DllBase; - PLIST_ENTRY NextEntry; - PIMAGE_EXPORT_DIRECTORY ExportDirectory; - NTSTATUS Status; - PIMAGE_THUNK_DATA OrigThunk, FirstThunk; - PAGED_CODE(); - DPRINT("%s - ImageBase: %p. ImageFileDirectory: %wZ\n", - __FUNCTION__, ImageBase, ImageFileDirectory); - - /* Assume no imports */ - *LoadImports = MM_SYSLDR_NO_IMPORTS; - - /* Get the import descriptor */ - ImportDescriptor = RtlImageDirectoryEntryToData(ImageBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - &ImportSize); - if (!ImportDescriptor) return STATUS_SUCCESS; - - /* Loop all imports to count them */ - for (CurrentImport = ImportDescriptor; - (CurrentImport->Name) && (CurrentImport->OriginalFirstThunk); - CurrentImport++) - { - /* One more */ - ImportCount++; - } - - /* Make sure we have non-zero imports */ - if (ImportCount) - { - /* Calculate and allocate the list we'll need */ - LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); - LoadedImports = ExAllocatePoolWithTag(PagedPool, - LoadedImportsSize, - 'TDmM'); - if (LoadedImports) - { - /* Zero it */ - RtlZeroMemory(LoadedImports, LoadedImportsSize); - LoadedImports->Count = ImportCount; - } - } - else - { - /* No table */ - LoadedImports = NULL; - } - - /* Reset the import count and loop descriptors again */ - ImportCount = GdiLink = NormalLink = 0; - while ((ImportDescriptor->Name) && (ImportDescriptor->OriginalFirstThunk)) - { - /* Get the name */ - ImportName = (PCHAR)((ULONG_PTR)ImageBase + ImportDescriptor->Name); - - /* Check if this is a GDI driver */ - GdiLink = GdiLink | - !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)); - - /* We can also allow dxapi (for Windows compat, allow IRT and coverage )*/ - NormalLink = NormalLink | - ((_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) && - (_strnicmp(ImportName, "dxapi", sizeof("dxapi") - 1)) && - (_strnicmp(ImportName, "coverage", sizeof("coverage") - 1)) && - (_strnicmp(ImportName, "irt", sizeof("irt") - 1))); - - /* Check if this is a valid GDI driver */ - if ((GdiLink) && (NormalLink)) - { - /* It's not, it's importing stuff it shouldn't be! */ - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePool(LoadedImports); - return STATUS_PROCEDURE_NOT_FOUND; - } - - /* Check for user-mode printer or video card drivers, which don't belong */ - if (!(_strnicmp(ImportName, "ntdll", sizeof("ntdll") - 1)) || - !(_strnicmp(ImportName, "winsrv", sizeof("winsrv") - 1)) || - !(_strnicmp(ImportName, "advapi32", sizeof("advapi32") - 1)) || - !(_strnicmp(ImportName, "kernel32", sizeof("kernel32") - 1)) || - !(_strnicmp(ImportName, "user32", sizeof("user32") - 1)) || - !(_strnicmp(ImportName, "gdi32", sizeof("gdi32") - 1))) - { - /* This is not kernel code */ - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePool(LoadedImports); - return STATUS_PROCEDURE_NOT_FOUND; - } - - /* Check if this is a "core" import, which doesn't get referenced */ - if (!(_strnicmp(ImportName, "ntoskrnl", sizeof("ntoskrnl") - 1)) || - !(_strnicmp(ImportName, "win32k", sizeof("win32k") - 1)) || - !(_strnicmp(ImportName, "hal", sizeof("hal") - 1))) - { - /* Don't reference this */ - ReferenceNeeded = FALSE; - } - else - { - /* Reference these modules */ - ReferenceNeeded = TRUE; - } - - /* Now setup a unicode string for the import */ - RtlInitAnsiString(&TempString, ImportName); - Status = RtlAnsiStringToUnicodeString(&NameString, &TempString, TRUE); - if (!NT_SUCCESS(Status)) - { - /* Failed */ - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - return Status; - } - - /* We don't support name prefixes yet */ - if (NamePrefix) DPRINT1("Name Prefix not yet supported!\n"); - - /* Remember that we haven't loaded the import at this point */ -CheckDllState: - Loaded = FALSE; - ImportBase = NULL; - - /* Loop the driver list */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the loader entry and compare the name */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - if (RtlEqualUnicodeString(&NameString, - &LdrEntry->BaseDllName, - TRUE)) - { - /* Get the base address */ - ImportBase = LdrEntry->DllBase; - - /* Check if we haven't loaded yet, and we need references */ - if (!(Loaded) && (ReferenceNeeded)) - { - /* Make sure we're not already loading */ - if (!(LdrEntry->Flags & LDRP_LOAD_IN_PROGRESS)) - { - /* Increase the load count */ - LdrEntry->LoadCount++; - } - } - - /* Done, break out */ - break; - } - - /* Go to the next entry */ - NextEntry = NextEntry->Flink; - } - - /* Check if we haven't loaded the import yet */ - if (!ImportBase) - { - /* Setup the import DLL name */ - DllName.MaximumLength = NameString.Length + - ImageFileDirectory->Length + - sizeof(UNICODE_NULL); - DllName.Buffer = ExAllocatePoolWithTag(NonPagedPool, - DllName.MaximumLength, - 'TDmM'); - if (DllName.Buffer) - { - /* Setup the base length and copy it */ - DllName.Length = ImageFileDirectory->Length; - RtlCopyMemory(DllName.Buffer, - ImageFileDirectory->Buffer, - ImageFileDirectory->Length); - - /* Now add the import name and null-terminate it */ - RtlAppendStringToString((PSTRING)&DllName, - (PSTRING)&NameString); - DllName.Buffer[(DllName.MaximumLength - 1) / sizeof(WCHAR)] = UNICODE_NULL; - - /* Load the image */ - Status = MmLoadSystemImage(&DllName, - NamePrefix, - NULL, - FALSE, - (PVOID)&DllEntry, - &DllBase); - if (NT_SUCCESS(Status)) - { - /* We can free the DLL Name */ - ExFreePool(DllName.Buffer); - } - else - { - /* Fill out the information for the error */ - *MissingDriver = DllName.Buffer; - *(PULONG)MissingDriver |= 1; - *MissingApi = NULL; - } - } - else - { - /* We're out of resources */ - Status = STATUS_INSUFFICIENT_RESOURCES; - } - - /* Check if we're OK until now */ - if (NT_SUCCESS(Status)) - { - /* We're now loaded */ - Loaded = TRUE; - - /* Sanity check */ - ASSERT(DllBase = DllEntry->DllBase); - - /* Call the initialization routines */ - Status = MmCallDllInitialize(DllEntry, &PsLoadedModuleList); - if (!NT_SUCCESS(Status)) - { - /* We failed, unload the image */ - MmUnloadSystemImage(DllEntry); - while (TRUE); - Loaded = FALSE; - } - } - - /* Check if we failed by here */ - if (!NT_SUCCESS(Status)) - { - /* Cleanup and return */ - RtlFreeUnicodeString(&NameString); - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - return Status; - } - - /* Loop again to make sure that everything is OK */ - goto CheckDllState; - } - - /* Check if we're support to reference this import */ - if ((ReferenceNeeded) && (LoadedImports)) - { - /* Make sure we're not already loading */ - if (!(LdrEntry->Flags & LDRP_LOAD_IN_PROGRESS)) - { - /* Add the entry */ - LoadedImports->Entry[ImportCount] = LdrEntry; - ImportCount++; - } - } - - /* Free the import name */ - RtlFreeUnicodeString(&NameString); - - /* Set the missing driver name and get the export directory */ - *MissingDriver = LdrEntry->BaseDllName.Buffer; - ExportDirectory = RtlImageDirectoryEntryToData(ImportBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_EXPORT, - &ExportSize); - if (!ExportDirectory) - { - /* Cleanup and return */ - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - return STATUS_DRIVER_ENTRYPOINT_NOT_FOUND; - } - - /* Make sure we have an IAT */ - if (ImportDescriptor->OriginalFirstThunk) - { - /* Get the first thunks */ - OrigThunk = (PVOID)((ULONG_PTR)ImageBase + - ImportDescriptor->OriginalFirstThunk); - FirstThunk = (PVOID)((ULONG_PTR)ImageBase + - ImportDescriptor->FirstThunk); - - /* Loop the IAT */ - while (OrigThunk->u1.AddressOfData) - { - /* Snap thunk */ - Status = MiSnapThunk(ImportBase, - ImageBase, - OrigThunk++, - FirstThunk++, - ExportDirectory, - ExportSize, - FALSE, - MissingApi); - if (!NT_SUCCESS(Status)) - { - /* Cleanup and return */ - MiDereferenceImports(LoadedImports); - if (LoadedImports) ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - return Status; - } - - /* Reset the buffer */ - *MissingApi = MissingApiBuffer; - } - } - - /* Go to the next import */ - ImportDescriptor++; - } - - /* Check if we have an import list */ - if (LoadedImports) - { - /* Reset the count again, and loop entries*/ - ImportCount = 0; - for (i = 0; i < LoadedImports->Count; i++) - { - if (LoadedImports->Entry[i]) - { - /* Got an entry, OR it with 1 in case it's the single entry */ - ImportEntry = (PVOID)((ULONG_PTR)LoadedImports->Entry[i] | - MM_SYSLDR_SINGLE_ENTRY); - ImportCount++; - } - } - - /* Check if we had no imports */ - if (!ImportCount) - { - /* Free the list and set it to no imports */ - ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - LoadedImports = MM_SYSLDR_NO_IMPORTS; - } - else if (ImportCount == 1) - { - /* Just one entry, we can free the table and only use our entry */ - ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - LoadedImports = (PLOAD_IMPORTS)ImportEntry; - } - else if (ImportCount != LoadedImports->Count) - { - /* Allocate a new list */ - LoadedImportsSize = ImportCount * sizeof(PVOID) + sizeof(SIZE_T); - NewImports = ExAllocatePoolWithTag(PagedPool, - LoadedImportsSize, - 'TDmM'); - if (NewImports) - { - /* Set count */ - NewImports->Count = 0; - - /* Loop all the imports */ - for (i = 0; i < LoadedImports->Count; i++) - { - /* Make sure it's valid */ - if (LoadedImports->Entry[i]) - { - /* Copy it */ - NewImports->Entry[NewImports->Count] = LoadedImports->Entry[i]; - NewImports->Count++; - } - } - - /* Free the old copy */ - ExFreePoolWithTag(LoadedImports, TAG_LDR_WSTR); - LoadedImports = NewImports; - } - } - - /* Return the list */ - *LoadImports = LoadedImports; - } - - /* Return success */ - return STATUS_SUCCESS; -} - -VOID -NTAPI -MiReloadBootLoadedDrivers(IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PLIST_ENTRY NextEntry; - ULONG i = 0; - PIMAGE_NT_HEADERS NtHeader; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PIMAGE_FILE_HEADER FileHeader; - BOOLEAN ValidRelocs; - PIMAGE_DATA_DIRECTORY DataDirectory; - PVOID DllBase, NewImageAddress; - NTSTATUS Status; - PMMPTE PointerPte, StartPte, LastPte; - PFN_NUMBER PteCount; - PMMPFN Pfn1; - MMPTE TempPte, OldPte; - - /* Loop driver list */ - for (NextEntry = LoaderBlock->LoadOrderListHead.Flink; - NextEntry != &LoaderBlock->LoadOrderListHead; - NextEntry = NextEntry->Flink) - { - /* Get the loader entry and NT header */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - NtHeader = RtlImageNtHeader(LdrEntry->DllBase); - - /* Debug info */ - DPRINT("[Mm0]: Driver at: %p ending at: %p for module: %wZ\n", - LdrEntry->DllBase, - (ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage, - &LdrEntry->FullDllName); - - /* Skip kernel and HAL */ - /* ROS HACK: Skip BOOTVID/KDCOM too */ - i++; - if (i <= 4) continue; - - /* Skip non-drivers */ - if (!NtHeader) continue; - - /* Get the file header and make sure we can relocate */ - FileHeader = &NtHeader->FileHeader; - if (FileHeader->Characteristics & IMAGE_FILE_RELOCS_STRIPPED) continue; - if (NtHeader->OptionalHeader.NumberOfRvaAndSizes < - IMAGE_DIRECTORY_ENTRY_BASERELOC) continue; - - /* Everything made sense until now, check the relocation section too */ - DataDirectory = &NtHeader->OptionalHeader. - DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; - if (!DataDirectory->VirtualAddress) - { - /* We don't really have relocations */ - ValidRelocs = FALSE; - } - else - { - /* Make sure the size is valid */ - if ((DataDirectory->VirtualAddress + DataDirectory->Size) > - LdrEntry->SizeOfImage) - { - /* They're not, skip */ - continue; - } - - /* We have relocations */ - ValidRelocs = TRUE; - } - - /* Remember the original address */ - DllBase = LdrEntry->DllBase; - - /* Get the first PTE and the number of PTEs we'll need */ - PointerPte = StartPte = MiAddressToPte(LdrEntry->DllBase); - PteCount = ROUND_TO_PAGES(LdrEntry->SizeOfImage) >> PAGE_SHIFT; - LastPte = StartPte + PteCount; - - /* Loop the PTEs */ - while (PointerPte < LastPte) - { - /* Mark the page modified in the PFN database */ - ASSERT(PointerPte->u.Hard.Valid == 1); - Pfn1 = MiGetPfnEntry(PFN_FROM_PTE(PointerPte)); - ASSERT(Pfn1->u3.e1.Rom == 0); - Pfn1->u3.e1.Modified = TRUE; - - /* Next */ - PointerPte++; - } - - /* Now reserve system PTEs for the image */ - PointerPte = MiReserveSystemPtes(PteCount, SystemPteSpace); - if (!PointerPte) - { - /* Shouldn't happen */ - DPRINT1("[Mm0]: Couldn't allocate driver section!\n"); - while (TRUE); - } - - /* This is the new virtual address for the module */ - LastPte = PointerPte + PteCount; - NewImageAddress = MiPteToAddress(PointerPte); - - /* Sanity check */ - DPRINT("[Mm0]: Copying from: %p to: %p\n", DllBase, NewImageAddress); - ASSERT(ExpInitializationPhase == 0); - - /* Loop the new driver PTEs */ - TempPte = ValidKernelPte; - while (PointerPte < LastPte) - { - /* Copy the old data */ - OldPte = *StartPte; - ASSERT(OldPte.u.Hard.Valid == 1); - - /* Set page number from the loader's memory */ - TempPte.u.Hard.PageFrameNumber = OldPte.u.Hard.PageFrameNumber; - - /* Write it */ - ASSERT(PointerPte->u.Hard.Valid == 0); - ASSERT(TempPte.u.Hard.Valid == 1); - *PointerPte = TempPte; - - /* Move on */ - PointerPte++; - StartPte++; - } - - /* Update position */ - PointerPte -= PteCount; - - /* Sanity check */ - ASSERT(*(PULONG)NewImageAddress == *(PULONG)DllBase); - - /* Set the image base to the address where the loader put it */ - NtHeader->OptionalHeader.ImageBase = (ULONG_PTR)DllBase; - - /* Check if we had relocations */ - if (ValidRelocs) - { - /* Relocate the image */ - Status = LdrRelocateImageWithBias(NewImageAddress, - 0, - "SYSLDR", - STATUS_SUCCESS, - STATUS_CONFLICTING_ADDRESSES, - STATUS_INVALID_IMAGE_FORMAT); - if (!NT_SUCCESS(Status)) - { - /* This shouldn't happen */ - DPRINT1("Relocations failed!\n"); - while (TRUE); - } - } - - /* Update the loader entry */ - LdrEntry->DllBase = NewImageAddress; - - /* Update the thunks */ - DPRINT("[Mm0]: Updating thunks to: %wZ\n", &LdrEntry->BaseDllName); - MiUpdateThunks(LoaderBlock, - DllBase, - NewImageAddress, - LdrEntry->SizeOfImage); - - /* Update the loader entry */ - LdrEntry->Flags |= LDRP_SYSTEM_MAPPED; - LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)NewImageAddress + - NtHeader->OptionalHeader.AddressOfEntryPoint); - LdrEntry->SizeOfImage = PteCount << PAGE_SHIFT; - - /* FIXME: We'll need to fixup the PFN linkage when switching to ARM3 */ - } -} - -NTSTATUS -NTAPI -MiBuildImportsForBootDrivers(VOID) -{ - PLIST_ENTRY NextEntry, NextEntry2; - PLDR_DATA_TABLE_ENTRY LdrEntry, KernelEntry, HalEntry, LdrEntry2, LastEntry; - PLDR_DATA_TABLE_ENTRY* EntryArray; - UNICODE_STRING KernelName = RTL_CONSTANT_STRING(L"ntoskrnl.exe"); - UNICODE_STRING HalName = RTL_CONSTANT_STRING(L"hal.dll"); - PLOAD_IMPORTS LoadedImports; - ULONG LoadedImportsSize, ImportSize; - PULONG_PTR ImageThunk; - ULONG_PTR DllBase, DllEnd; - ULONG Modules = 0, i, j = 0; - PIMAGE_IMPORT_DESCRIPTOR ImportDescriptor; - - /* Initialize variables */ - KernelEntry = HalEntry = LastEntry = NULL; - - /* Loop the loaded module list... we are early enough that no lock is needed */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Check if it's the kernel or HAL */ - if (RtlEqualUnicodeString(&KernelName, &LdrEntry->BaseDllName, TRUE)) - { - /* Found it */ - KernelEntry = LdrEntry; - } - else if (RtlEqualUnicodeString(&HalName, &LdrEntry->BaseDllName, TRUE)) - { - /* Found it */ - HalEntry = LdrEntry; - } - - /* Check if this is a driver DLL */ - if (LdrEntry->Flags & LDRP_DRIVER_DEPENDENT_DLL) - { - /* Check if this is the HAL or kernel */ - if ((LdrEntry == HalEntry) || (LdrEntry == KernelEntry)) - { - /* Add a reference */ - LdrEntry->LoadCount = 1; - } - else - { - /* No referencing needed */ - LdrEntry->LoadCount = 0; - } - } - else - { - /* No referencing needed */ - LdrEntry->LoadCount = 0; - } - - /* Remember this came from the loader */ - LdrEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; - - /* Keep looping */ - NextEntry = NextEntry->Flink; - Modules++; - } - - /* We must have at least found the kernel and HAL */ - if (!(HalEntry) || (!KernelEntry)) return STATUS_NOT_FOUND; - - /* Allocate the list */ - EntryArray = ExAllocatePoolWithTag(PagedPool, Modules * sizeof(PVOID), 'TDmM'); - if (!EntryArray) return STATUS_INSUFFICIENT_RESOURCES; - - /* Loop the loaded module list again */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); -#ifdef _WORKING_LOADER_ - /* Get its imports */ - ImageThunk = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IAT, - &ImportSize); - if (!ImageThunk) -#else - /* Get its imports */ - ImportDescriptor = RtlImageDirectoryEntryToData(LdrEntry->DllBase, - TRUE, - IMAGE_DIRECTORY_ENTRY_IMPORT, - &ImportSize); - if (!ImportDescriptor) -#endif - { - /* None present */ - LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; - NextEntry = NextEntry->Flink; - continue; - } - - /* Clear the list and count the number of IAT thunks */ - RtlZeroMemory(EntryArray, Modules * sizeof(PVOID)); -#ifdef _WORKING_LOADER_ - ImportSize /= sizeof(ULONG_PTR); - - /* Scan the thunks */ - for (i = 0, DllBase = 0, DllEnd = 0; i < ImportSize; i++, ImageThunk++) -#else - i = DllBase = DllEnd = 0; - while ((ImportDescriptor->Name) && - (ImportDescriptor->OriginalFirstThunk)) - { - /* Get the image thunk */ - ImageThunk = (PVOID)((ULONG_PTR)LdrEntry->DllBase + - ImportDescriptor->FirstThunk); - while (*ImageThunk) -#endif - { - /* Do we already have an address? */ - if (DllBase) - { - /* Is the thunk in the same address? */ - if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) - { - /* Skip it, we already have a reference for it */ - ASSERT(EntryArray[j]); - ImageThunk++; - continue; - } - } - - /* Loop the loaded module list to locate this address owner */ - j = 0; - NextEntry2 = PsLoadedModuleList.Flink; - while (NextEntry2 != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry2 = CONTAINING_RECORD(NextEntry2, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Get the address range for this module */ - DllBase = (ULONG_PTR)LdrEntry2->DllBase; - DllEnd = DllBase + LdrEntry2->SizeOfImage; - - /* Check if this IAT entry matches it */ - if ((*ImageThunk >= DllBase) && (*ImageThunk < DllEnd)) - { - /* Save it */ - //DPRINT1("Found imported dll: %wZ\n", &LdrEntry2->BaseDllName); - EntryArray[j] = LdrEntry2; - break; - } - - /* Keep searching */ - NextEntry2 = NextEntry2->Flink; - j++; - } - - /* Do we have a thunk outside the range? */ - if ((*ImageThunk < DllBase) || (*ImageThunk >= DllEnd)) - { - /* Could be 0... */ - if (*ImageThunk) - { - /* Should not be happening */ - DPRINT1("Broken IAT entry for %p at %p (%lx)\n", - LdrEntry, ImageThunk, *ImageThunk); - ASSERT(FALSE); - } - - /* Reset if we hit this */ - DllBase = 0; - } -#ifndef _WORKING_LOADER_ - ImageThunk++; - } - - i++; - ImportDescriptor++; -#endif - } - - /* Now scan how many imports we really have */ - for (i = 0, ImportSize = 0; i < Modules; i++) - { - /* Skip HAL and kernel */ - if ((EntryArray[i]) && - (EntryArray[i] != HalEntry) && - (EntryArray[i] != KernelEntry)) - { - /* A valid reference */ - LastEntry = EntryArray[i]; - ImportSize++; - } - } - - /* Do we have any imports after all? */ - if (!ImportSize) - { - /* No */ - LdrEntry->LoadedImports = MM_SYSLDR_NO_IMPORTS; - } - else if (ImportSize == 1) - { - /* A single entry import */ - LdrEntry->LoadedImports = (PVOID)((ULONG_PTR)LastEntry | MM_SYSLDR_SINGLE_ENTRY); - LastEntry->LoadCount++; - } - else - { - /* We need an import table */ - LoadedImportsSize = ImportSize * sizeof(PVOID) + sizeof(SIZE_T); - LoadedImports = ExAllocatePoolWithTag(PagedPool, - LoadedImportsSize, - 'TDmM'); - ASSERT(LoadedImports); - - /* Save the count */ - LoadedImports->Count = ImportSize; - - /* Now copy all imports */ - for (i = 0, j = 0; i < Modules; i++) - { - /* Skip HAL and kernel */ - if ((EntryArray[i]) && - (EntryArray[i] != HalEntry) && - (EntryArray[i] != KernelEntry)) - { - /* A valid reference */ - //DPRINT1("Found valid entry: %p\n", EntryArray[i]); - LoadedImports->Entry[j] = EntryArray[i]; - EntryArray[i]->LoadCount++; - j++; - } - } - - /* Should had as many entries as we expected */ - ASSERT(j == ImportSize); - LdrEntry->LoadedImports = LoadedImports; - } - - /* Next */ - NextEntry = NextEntry->Flink; - } - - /* Free the initial array */ - ExFreePool(EntryArray); - - /* FIXME: Might not need to keep the HAL/Kernel imports around */ - - /* Kernel and HAL are loaded at boot */ - KernelEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; - HalEntry->LoadedImports = MM_SYSLDR_BOOT_LOADED; - - /* All worked well */ - return STATUS_SUCCESS; -} - -VOID -NTAPI -MiLocateKernelSections(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - ULONG_PTR DllBase; - PIMAGE_NT_HEADERS NtHeaders; - PIMAGE_SECTION_HEADER SectionHeader; - ULONG Sections, Size; - - /* Get the kernel section header */ - DllBase = (ULONG_PTR)LdrEntry->DllBase; - NtHeaders = RtlImageNtHeader((PVOID)DllBase); - SectionHeader = IMAGE_FIRST_SECTION(NtHeaders); - - /* Loop all the sections */ - Sections = NtHeaders->FileHeader.NumberOfSections; - while (Sections) - { - /* Grab the size of the section */ - Size = max(SectionHeader->SizeOfRawData, SectionHeader->Misc.VirtualSize); - - /* Check for .RSRC section */ - if (*(PULONG)SectionHeader->Name == 'rsr.') - { - /* Remember the PTEs so we can modify them later */ - MiKernelResourceStartPte = MiAddressToPte(DllBase + - SectionHeader->VirtualAddress); - MiKernelResourceEndPte = MiKernelResourceStartPte + - BYTES_TO_PAGES(SectionHeader->VirtualAddress + Size); - } - else if (*(PULONG)SectionHeader->Name == 'LOOP') - { - /* POOLCODE vs. POOLMI */ - if (*(PULONG)&SectionHeader->Name[4] == 'EDOC') - { - /* Found Ex* Pool code */ - ExPoolCodeStart = DllBase + SectionHeader->VirtualAddress; - ExPoolCodeEnd = ExPoolCodeStart + Size; - } - else if (*(PUSHORT)&SectionHeader->Name[4] == 'MI') - { - /* Found Mm* Pool code */ - MmPoolCodeStart = DllBase + SectionHeader->VirtualAddress; - MmPoolCodeEnd = ExPoolCodeStart + Size; - } - } - else if ((*(PULONG)SectionHeader->Name == 'YSIM') && - (*(PULONG)&SectionHeader->Name[4] == 'ETPS')) - { - /* Found MISYSPTE (Mm System PTE code)*/ - MmPteCodeStart = DllBase + SectionHeader->VirtualAddress; - MmPteCodeEnd = ExPoolCodeStart + Size; - } - - /* Keep going */ - Sections--; - SectionHeader++; - } -} - -BOOLEAN -NTAPI -MiInitializeLoadedModuleList(IN PLOADER_PARAMETER_BLOCK LoaderBlock) -{ - PLDR_DATA_TABLE_ENTRY LdrEntry, NewEntry; - PLIST_ENTRY ListHead, NextEntry; - ULONG EntrySize; - - /* Setup the loaded module list and locks */ - ExInitializeResourceLite(&PsLoadedModuleResource); - KeInitializeSpinLock(&PsLoadedModuleSpinLock); - InitializeListHead(&PsLoadedModuleList); - - /* Get loop variables and the kernel entry */ - ListHead = &LoaderBlock->LoadOrderListHead; - NextEntry = ListHead->Flink; - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase; - - /* Locate resource section, pool code, and system pte code */ - MiLocateKernelSections(LdrEntry); - - /* Loop the loader block */ - while (NextEntry != ListHead) - { - /* Get the loader entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* FIXME: ROS HACK. Make sure this is a driver */ - if (!RtlImageNtHeader(LdrEntry->DllBase)) - { - /* Skip this entry */ - NextEntry = NextEntry->Flink; - continue; - } - - /* Calculate the size we'll need and allocate a copy */ - EntrySize = sizeof(LDR_DATA_TABLE_ENTRY) + - LdrEntry->BaseDllName.MaximumLength + - sizeof(UNICODE_NULL); - NewEntry = ExAllocatePoolWithTag(NonPagedPool, EntrySize, TAG_LDR_WSTR); - if (!NewEntry) return FALSE; - - /* Copy the entry over */ - *NewEntry = *LdrEntry; - - /* Allocate the name */ - NewEntry->FullDllName.Buffer = - ExAllocatePoolWithTag(PagedPool, - LdrEntry->FullDllName.MaximumLength + - sizeof(UNICODE_NULL), - TAG_LDR_WSTR); - if (!NewEntry->FullDllName.Buffer) return FALSE; - - /* Set the base name */ - NewEntry->BaseDllName.Buffer = (PVOID)(NewEntry + 1); - - /* Copy the full and base name */ - RtlCopyMemory(NewEntry->FullDllName.Buffer, - LdrEntry->FullDllName.Buffer, - LdrEntry->FullDllName.MaximumLength); - RtlCopyMemory(NewEntry->BaseDllName.Buffer, - LdrEntry->BaseDllName.Buffer, - LdrEntry->BaseDllName.MaximumLength); - - /* Null-terminate the base name */ - NewEntry->BaseDllName.Buffer[NewEntry->BaseDllName.Length / - sizeof(WCHAR)] = UNICODE_NULL; - - /* Insert the entry into the list */ - InsertTailList(&PsLoadedModuleList, &NewEntry->InLoadOrderLinks); - NextEntry = NextEntry->Flink; - } - - /* Build the import lists for the boot drivers */ - MiBuildImportsForBootDrivers(); - - /* We're done */ - return TRUE; -} - -LOGICAL -NTAPI -MiUseLargeDriverPage(IN ULONG NumberOfPtes, - IN OUT PVOID *ImageBaseAddress, - IN PUNICODE_STRING BaseImageName, - IN BOOLEAN BootDriver) -{ - PLIST_ENTRY NextEntry; - BOOLEAN DriverFound = FALSE; - PMI_LARGE_PAGE_DRIVER_ENTRY LargePageDriverEntry; - ASSERT(KeGetCurrentIrql () <= APC_LEVEL); - ASSERT(*ImageBaseAddress >= MmSystemRangeStart); - -#ifdef _X86_ - if (!(KeFeatureBits & KF_LARGE_PAGE)) return FALSE; - if (!(__readcr4() & CR4_PSE)) return FALSE; -#endif - - /* Make sure there's enough system PTEs for a large page driver */ - if (MmTotalFreeSystemPtes[SystemPteSpace] < (16 * (PDE_MAPPED_VA >> PAGE_SHIFT))) - { - return FALSE; - } - - /* This happens if the registry key had a "*" (wildcard) in it */ - if (MiLargePageAllDrivers == 0) - { - /* It didn't, so scan the list */ - NextEntry = MiLargePageDriverList.Flink; - while (NextEntry != &MiLargePageDriverList) - { - /* Check if the driver name matches */ - LargePageDriverEntry = CONTAINING_RECORD(NextEntry, - MI_LARGE_PAGE_DRIVER_ENTRY, - Links); - if (RtlEqualUnicodeString(BaseImageName, - &LargePageDriverEntry->BaseName, - TRUE)) - { - /* Enable large pages for this driver */ - DriverFound = TRUE; - break; - } - - /* Keep trying */ - NextEntry = NextEntry->Flink; - } - - /* If we didn't find the driver, it doesn't need large pages */ - if (DriverFound == FALSE) return FALSE; - } - - /* Nothing to do yet */ - DPRINT1("Large pages not supported!\n"); - return FALSE; -} - -ULONG -NTAPI -MiComputeDriverProtection(IN BOOLEAN SessionSpace, - IN ULONG SectionProtection) -{ - ULONG Protection = MM_ZERO_ACCESS; - - /* Check if the caller gave anything */ - if (SectionProtection) - { - /* Always turn on execute access */ - SectionProtection |= IMAGE_SCN_MEM_EXECUTE; - - /* Check if the registry setting is on or not */ - if (!MmEnforceWriteProtection) - { - /* Turn on write access too */ - SectionProtection |= (IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_EXECUTE); - } - } - - /* Convert to internal PTE flags */ - if (SectionProtection & IMAGE_SCN_MEM_EXECUTE) Protection |= MM_EXECUTE; - if (SectionProtection & IMAGE_SCN_MEM_READ) Protection |= MM_READONLY; - - /* Check for write access */ - if (SectionProtection & IMAGE_SCN_MEM_WRITE) - { - /* Session space is not supported */ - if (SessionSpace) - { - DPRINT1("Session drivers not supported\n"); - ASSERT(SessionSpace == FALSE); - } - else - { - /* Convert to internal PTE flag */ - Protection = (Protection & MM_EXECUTE) ? MM_EXECUTE_READWRITE : MM_READWRITE; - } - } - - /* If there's no access at all by now, convert to internal no access flag */ - if (Protection == MM_ZERO_ACCESS) Protection = MM_NOACCESS; - - /* Return the computed PTE protection */ - return Protection; -} - -VOID -NTAPI -MiSetSystemCodeProtection(IN PMMPTE FirstPte, - IN PMMPTE LastPte, - IN ULONG ProtectionMask) -{ - /* I'm afraid to introduce regressions at the moment... */ - return; -} - -VOID -NTAPI -MiWriteProtectSystemImage(IN PVOID ImageBase) -{ - PIMAGE_NT_HEADERS NtHeaders; - PIMAGE_SECTION_HEADER Section; - PFN_NUMBER DriverPages; - ULONG CurrentProtection, SectionProtection, CombinedProtection, ProtectionMask; - ULONG Sections, Size; - ULONG_PTR BaseAddress, CurrentAddress; - PMMPTE PointerPte, StartPte, LastPte, CurrentPte, ComboPte = NULL; - ULONG CurrentMask, CombinedMask = 0; - PAGED_CODE(); - - /* No need to write protect physical memory-backed drivers (large pages) */ - if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; - - /* Get the image headers */ - NtHeaders = RtlImageNtHeader(ImageBase); - if (!NtHeaders) return; - - /* Check if this is a session driver or not */ - if (!MI_IS_SESSION_ADDRESS(ImageBase)) - { - /* Don't touch NT4 drivers */ - if (NtHeaders->OptionalHeader.MajorOperatingSystemVersion < 5) return; - if (NtHeaders->OptionalHeader.MajorImageVersion < 5) return; - } - else - { - /* Not supported */ - DPRINT1("Session drivers not supported\n"); - ASSERT(FALSE); - } - - /* These are the only protection masks we care about */ - ProtectionMask = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE; - - /* Calculate the number of pages this driver is occupying */ - DriverPages = BYTES_TO_PAGES(NtHeaders->OptionalHeader.SizeOfImage); - - /* Get the number of sections and the first section header */ - Sections = NtHeaders->FileHeader.NumberOfSections; - ASSERT(Sections != 0); - Section = IMAGE_FIRST_SECTION(NtHeaders); - - /* Loop all the sections */ - CurrentAddress = (ULONG_PTR)ImageBase; - while (Sections) - { - /* Get the section size */ - Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); - - /* Get its virtual address */ - BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; - if (BaseAddress < CurrentAddress) - { - /* Windows doesn't like these */ - DPRINT1("Badly linked image!\n"); - return; - } - - /* Remember the current address */ - CurrentAddress = BaseAddress + Size - 1; - - /* Next */ - Sections--; - Section++; - } - - /* Get the number of sections and the first section header */ - Sections = NtHeaders->FileHeader.NumberOfSections; - ASSERT(Sections != 0); - Section = IMAGE_FIRST_SECTION(NtHeaders); - - /* Set the address at the end to initialize the loop */ - CurrentAddress = (ULONG_PTR)Section + Sections - 1; - CurrentProtection = IMAGE_SCN_MEM_WRITE | IMAGE_SCN_MEM_READ; - - /* Set the PTE points for the image, and loop its sections */ - StartPte = MiAddressToPte(ImageBase); - LastPte = StartPte + DriverPages; - while (Sections) - { - /* Get the section size */ - Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); - - /* Get its virtual address and PTE */ - BaseAddress = (ULONG_PTR)ImageBase + Section->VirtualAddress; - PointerPte = MiAddressToPte(BaseAddress); - - /* Check if we were already protecting a run, and found a new run */ - if ((ComboPte) && (PointerPte > ComboPte)) - { - /* Compute protection */ - CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); - - /* Set it */ - MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); - - /* Check for overlap */ - if (ComboPte == StartPte) StartPte++; - - /* One done, reset variables */ - ComboPte = NULL; - CombinedProtection = 0; - } - - /* Break out when needed */ - if (PointerPte >= LastPte) break; - - /* Get the requested protection from the image header */ - SectionProtection = Section->Characteristics & ProtectionMask; - if (SectionProtection == CurrentProtection) - { - /* Same protection, so merge the request */ - CurrentAddress = BaseAddress + Size - 1; - - /* Next */ - Sections--; - Section++; - continue; - } - - /* This is now a new section, so close up the old one */ - CurrentPte = MiAddressToPte(CurrentAddress); - - /* Check for overlap */ - if (CurrentPte == PointerPte) - { - /* Skip the last PTE, since it overlaps with us */ - CurrentPte--; - - /* And set the PTE we will merge with */ - ASSERT((ComboPte == NULL) || (ComboPte == PointerPte)); - ComboPte = PointerPte; - - /* Get the most flexible protection by merging both */ - CombinedMask |= (SectionProtection | CurrentProtection); - } - - /* Loop any PTEs left */ - if (CurrentPte >= StartPte) - { - /* Sanity check */ - ASSERT(StartPte < LastPte); - - /* Make sure we don't overflow past the last PTE in the driver */ - if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; - ASSERT(CurrentPte >= StartPte); - - /* Compute the protection and set it */ - CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); - MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); - } - - /* Set new state */ - StartPte = PointerPte; - CurrentAddress = BaseAddress + Size - 1; - CurrentProtection = SectionProtection; - - /* Next */ - Sections--; - Section++; - } - - /* Is there a leftover section to merge? */ - if (ComboPte) - { - /* Compute and set the protection */ - CombinedMask = MiComputeDriverProtection(FALSE, CombinedProtection); - MiSetSystemCodeProtection(ComboPte, ComboPte, CombinedMask); - - /* Handle overlap */ - if (ComboPte == StartPte) StartPte++; - } - - /* Finally, handle the last section */ - CurrentPte = MiPteToAddress(CurrentAddress); - if ((StartPte < LastPte) && (CurrentPte >= StartPte)) - { - /* Handle overlap */ - if (CurrentPte >= LastPte) CurrentPte = LastPte - 1; - ASSERT(CurrentPte >= StartPte); - - /* Compute and set the protection */ - CurrentMask = MiComputeDriverProtection(FALSE, CurrentProtection); - MiSetSystemCodeProtection(StartPte, CurrentPte, CurrentMask); - } -} - -VOID -NTAPI -MiSetPagingOfDriver(IN PMMPTE PointerPte, - IN PMMPTE LastPte) -{ - PVOID ImageBase; - PETHREAD CurrentThread; - PFN_NUMBER PageCount = 0, PageFrameIndex; - PMMPFN Pfn1; - PAGED_CODE(); - - /* Get the driver's base address */ - ImageBase = MiPteToAddress(PointerPte); - ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(ImageBase) == FALSE); - - /* If this is a large page, it's stuck in physical memory */ - if (MI_IS_PHYSICAL_ADDRESS(ImageBase)) return; - - /* We should lock the system working set -- we don't have one yet, so just be consistent */ - CurrentThread = PsGetCurrentThread(); - KeEnterGuardedRegion(); - ASSERT((CurrentThread->OwnsSystemWorkingSetExclusive == 0) && - (CurrentThread->OwnsSystemWorkingSetShared == 0)); - CurrentThread->OwnsSystemWorkingSetExclusive = 1; - - /* Loop the PTEs */ - while (PointerPte <= LastPte) - { - /* Check for valid PTE */ - if (PointerPte->u.Hard.Valid == 1) - { - PageFrameIndex = PFN_FROM_PTE(PointerPte); - Pfn1 = MiGetPfnEntry(PageFrameIndex); - ASSERT(Pfn1->u2.ShareCount == 1); - - /* No working sets in ReactOS yet */ - PageCount++; - } - - ImageBase = (PVOID)((ULONG_PTR)ImageBase + PAGE_SIZE); - PointerPte++; - } - - /* Release the working set "lock" */ - ASSERT(KeAreAllApcsDisabled() == TRUE); - CurrentThread->OwnsSystemWorkingSetExclusive = 0; - KeLeaveGuardedRegion(); - - /* Do we have any driver pages? */ - if (PageCount) - { - /* Update counters */ - InterlockedExchangeAdd((PLONG)&MmTotalSystemDriverPages, PageCount); - } -} - -VOID -NTAPI -MiEnablePagingOfDriver(IN PLDR_DATA_TABLE_ENTRY LdrEntry) -{ - ULONG_PTR ImageBase; - PIMAGE_NT_HEADERS NtHeaders; - ULONG Sections, Alignment, Size; - PIMAGE_SECTION_HEADER Section; - PMMPTE PointerPte = NULL, LastPte = NULL; - if (MmDisablePagingExecutive) return; - - /* Get the driver base address and its NT header */ - ImageBase = (ULONG_PTR)LdrEntry->DllBase; - NtHeaders = RtlImageNtHeader((PVOID)ImageBase); - if (!NtHeaders) return; - - /* Get the sections and their alignment */ - Sections = NtHeaders->FileHeader.NumberOfSections; - Alignment = NtHeaders->OptionalHeader.SectionAlignment - 1; - - /* Loop each section */ - Section = IMAGE_FIRST_SECTION(NtHeaders); - while (Sections) - { - /* Find PAGE or .edata */ - if ((*(PULONG)Section->Name == 'EGAP') || - (*(PULONG)Section->Name == 'ade.')) - { - /* Had we already done some work? */ - if (!PointerPte) - { - /* Nope, setup the first PTE address */ - PointerPte = MiAddressToPte(ROUND_TO_PAGES(ImageBase + - Section-> - VirtualAddress)); - } - - /* Compute the size */ - Size = max(Section->SizeOfRawData, Section->Misc.VirtualSize); - - /* Find the last PTE that maps this section */ - LastPte = MiAddressToPte(ImageBase + - Section->VirtualAddress + - Alignment + - Size - - PAGE_SIZE); - } - else - { - /* Had we found a section before? */ - if (PointerPte) - { - /* Mark it as pageable */ - MiSetPagingOfDriver(PointerPte, LastPte); - PointerPte = NULL; - } - } - - /* Keep searching */ - Sections--; - Section++; - } - - /* Handle the straggler */ - if (PointerPte) MiSetPagingOfDriver(PointerPte, LastPte); -} - -BOOLEAN -NTAPI -MmVerifyImageIsOkForMpUse(IN PVOID BaseAddress) -{ - PIMAGE_NT_HEADERS NtHeader; - PAGED_CODE(); - - /* Get NT Headers */ - NtHeader = RtlImageNtHeader(BaseAddress); - if (NtHeader) - { - /* Check if this image is only safe for UP while we have 2+ CPUs */ - if ((KeNumberProcessors > 1) && - (NtHeader->FileHeader.Characteristics & IMAGE_FILE_UP_SYSTEM_ONLY)) - { - /* Fail */ - return FALSE; - } - } - - /* Otherwise, it's safe */ - return TRUE; -} - -NTSTATUS -NTAPI -MmCheckSystemImage(IN HANDLE ImageHandle, - IN BOOLEAN PurgeSection) -{ - NTSTATUS Status; - HANDLE SectionHandle; - PVOID ViewBase = NULL; - SIZE_T ViewSize = 0; - IO_STATUS_BLOCK IoStatusBlock; - FILE_STANDARD_INFORMATION FileStandardInfo; - KAPC_STATE ApcState; - PIMAGE_NT_HEADERS NtHeaders; - OBJECT_ATTRIBUTES ObjectAttributes; - PAGED_CODE(); - - /* Setup the object attributes */ - InitializeObjectAttributes(&ObjectAttributes, - NULL, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - NULL, - NULL); - - /* Create a section for the DLL */ - Status = ZwCreateSection(&SectionHandle, - SECTION_MAP_EXECUTE, - &ObjectAttributes, - NULL, - PAGE_EXECUTE, - SEC_IMAGE, - ImageHandle); - if (!NT_SUCCESS(Status)) return Status; - - /* Make sure we're in the system process */ - KeStackAttachProcess(&PsInitialSystemProcess->Pcb, &ApcState); - - /* Map it */ - Status = ZwMapViewOfSection(SectionHandle, - NtCurrentProcess(), - &ViewBase, - 0, - 0, - NULL, - &ViewSize, - ViewShare, - 0, - PAGE_EXECUTE); - if (!NT_SUCCESS(Status)) - { - /* We failed, close the handle and return */ - KeUnstackDetachProcess(&ApcState); - ZwClose(SectionHandle); - return Status; - } - - /* Now query image information */ - Status = ZwQueryInformationFile(ImageHandle, - &IoStatusBlock, - &FileStandardInfo, - sizeof(FileStandardInfo), - FileStandardInformation); - if (NT_SUCCESS(Status)) - { - /* First, verify the checksum */ - if (!LdrVerifyMappedImageMatchesChecksum(ViewBase, - ViewSize, - FileStandardInfo. - EndOfFile.LowPart)) - { - /* Set checksum failure */ - Status = STATUS_IMAGE_CHECKSUM_MISMATCH; - goto Fail; - } - - /* Make sure it's a real image */ - NtHeaders = RtlImageNtHeader(ViewBase); - if (!NtHeaders) - { - /* Set checksum failure */ - Status = STATUS_IMAGE_CHECKSUM_MISMATCH; - goto Fail; - } - - /* Make sure it's for the correct architecture */ - if ((NtHeaders->FileHeader.Machine != IMAGE_FILE_MACHINE_NATIVE) || - (NtHeaders->OptionalHeader.Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)) - { - /* Set protection failure */ - Status = STATUS_INVALID_IMAGE_PROTECT; - goto Fail; - } - - /* Check that it's a valid SMP image if we have more then one CPU */ - if (!MmVerifyImageIsOkForMpUse(ViewBase)) - { - /* Otherwise it's not the right image */ - Status = STATUS_IMAGE_MP_UP_MISMATCH; - } - } - - /* Unmap the section, close the handle, and return status */ -Fail: - ZwUnmapViewOfSection(NtCurrentProcess(), ViewBase); - KeUnstackDetachProcess(&ApcState); - ZwClose(SectionHandle); - return Status; -} - -NTSTATUS -NTAPI -MmLoadSystemImage(IN PUNICODE_STRING FileName, - IN PUNICODE_STRING NamePrefix OPTIONAL, - IN PUNICODE_STRING LoadedName OPTIONAL, - IN ULONG Flags, - OUT PVOID *ModuleObject, - OUT PVOID *ImageBaseAddress) -{ - PVOID ModuleLoadBase = NULL; - NTSTATUS Status; - HANDLE FileHandle = NULL; - OBJECT_ATTRIBUTES ObjectAttributes; - IO_STATUS_BLOCK IoStatusBlock; - PIMAGE_NT_HEADERS NtHeader; - UNICODE_STRING BaseName, BaseDirectory, PrefixName, UnicodeTemp; - PLDR_DATA_TABLE_ENTRY LdrEntry = NULL; - ULONG EntrySize, DriverSize; - PLOAD_IMPORTS LoadedImports = MM_SYSLDR_NO_IMPORTS; - PCHAR MissingApiName, Buffer; - PWCHAR MissingDriverName; - HANDLE SectionHandle; - ACCESS_MASK DesiredAccess; - PVOID Section = NULL; - BOOLEAN LockOwned = FALSE; - PLIST_ENTRY NextEntry; - IMAGE_INFO ImageInfo; - STRING AnsiTemp; - PAGED_CODE(); - - /* Detect session-load */ - if (Flags) - { - /* Sanity checks */ - ASSERT(NamePrefix == NULL); - ASSERT(LoadedName == NULL); - - /* Make sure the process is in session too */ - if (!PsGetCurrentProcess()->ProcessInSession) return STATUS_NO_MEMORY; - } - - /* Allocate a buffer we'll use for names */ - Buffer = ExAllocatePoolWithTag(NonPagedPool, MAX_PATH, 'nLmM'); - if (!Buffer) return STATUS_INSUFFICIENT_RESOURCES; - - /* Check for a separator */ - if (FileName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR) - { - PWCHAR p; - ULONG BaseLength; - - /* Loop the path until we get to the base name */ - p = &FileName->Buffer[FileName->Length / sizeof(WCHAR)]; - while (*(p - 1) != OBJ_NAME_PATH_SEPARATOR) p--; - - /* Get the length */ - BaseLength = (ULONG)(&FileName->Buffer[FileName->Length / sizeof(WCHAR)] - p); - BaseLength *= sizeof(WCHAR); - - /* Setup the string */ - BaseName.Length = (USHORT)BaseLength; - BaseName.Buffer = p; - } - else - { - /* Otherwise, we already have a base name */ - BaseName.Length = FileName->Length; - BaseName.Buffer = FileName->Buffer; - } - - /* Setup the maximum length */ - BaseName.MaximumLength = BaseName.Length; - - /* Now compute the base directory */ - BaseDirectory = *FileName; - BaseDirectory.Length -= BaseName.Length; - BaseDirectory.MaximumLength = BaseDirectory.Length; - - /* And the prefix, which for now is just the name itself */ - PrefixName = *FileName; - - /* Check if we have a prefix */ - if (NamePrefix) DPRINT1("Prefixed images are not yet supported!\n"); - - /* Check if we already have a name, use it instead */ - if (LoadedName) BaseName = *LoadedName; - - /* Check for loader snap debugging */ - if (NtGlobalFlag & FLG_SHOW_LDR_SNAPS) - { - /* Print out standard string */ - DPRINT1("MM:SYSLDR Loading %wZ (%wZ) %s\n", - &PrefixName, &BaseName, Flags ? "in session space" : ""); - } - - /* Acquire the load lock */ -LoaderScan: - ASSERT(LockOwned == FALSE); - LockOwned = TRUE; - KeEnterCriticalRegion(); - KeWaitForSingleObject(&MmSystemLoadLock, - WrVirtualMemory, - KernelMode, - FALSE, - NULL); - - /* Scan the module list */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the entry and compare the names */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - if (RtlEqualUnicodeString(&PrefixName, &LdrEntry->FullDllName, TRUE)) - { - /* Found it, break out */ - break; - } - - /* Keep scanning */ - NextEntry = NextEntry->Flink; - } - - /* Check if we found the image */ - if (NextEntry != &PsLoadedModuleList) - { - /* Check if we had already mapped a section */ - if (Section) - { - /* Dereference and clear */ - ObDereferenceObject(Section); - Section = NULL; - } - - /* Check if this was supposed to be a session load */ - if (!Flags) - { - /* It wasn't, so just return the data */ - *ModuleObject = LdrEntry; - *ImageBaseAddress = LdrEntry->DllBase; - Status = STATUS_IMAGE_ALREADY_LOADED; - } - else - { - /* We don't support session loading yet */ - DPRINT1("Unsupported Session-Load!\n"); - while (TRUE); - } - - /* Do cleanup */ - goto Quickie; - } - else if (!Section) - { - /* It wasn't loaded, and we didn't have a previous attempt */ - KeReleaseMutant(&MmSystemLoadLock, 1, FALSE, FALSE); - KeLeaveCriticalRegion(); - LockOwned = FALSE; - - /* Check if KD is enabled */ - if ((KdDebuggerEnabled) && !(KdDebuggerNotPresent)) - { - /* FIXME: Attempt to get image from KD */ - } - - /* We don't have a valid entry */ - LdrEntry = NULL; - - /* Setup image attributes */ - InitializeObjectAttributes(&ObjectAttributes, - FileName, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - NULL, - NULL); - - /* Open the image */ - Status = ZwOpenFile(&FileHandle, - FILE_EXECUTE, - &ObjectAttributes, - &IoStatusBlock, - FILE_SHARE_READ | FILE_SHARE_DELETE, - 0); - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Validate it */ - Status = MmCheckSystemImage(FileHandle, FALSE); - if ((Status == STATUS_IMAGE_CHECKSUM_MISMATCH) || - (Status == STATUS_IMAGE_MP_UP_MISMATCH) || - (Status == STATUS_INVALID_IMAGE_PROTECT)) - { - /* Fail loading */ - goto Quickie; - } - - /* Check if this is a session-load */ - if (Flags) - { - /* Then we only need read and execute */ - DesiredAccess = SECTION_MAP_READ | SECTION_MAP_EXECUTE; - } - else - { - /* Otherwise, we can allow write access */ - DesiredAccess = SECTION_ALL_ACCESS; - } - - /* Initialize the attributes for the section */ - InitializeObjectAttributes(&ObjectAttributes, - NULL, - OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, - NULL, - NULL); - - /* Create the section */ - Status = ZwCreateSection(&SectionHandle, - DesiredAccess, - &ObjectAttributes, - NULL, - PAGE_EXECUTE, - SEC_IMAGE, - FileHandle); - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Now get the section pointer */ - Status = ObReferenceObjectByHandle(SectionHandle, - SECTION_MAP_EXECUTE, - MmSectionObjectType, - KernelMode, - &Section, - NULL); - ZwClose(SectionHandle); - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Check if this was supposed to be a session-load */ - if (Flags) - { - /* We don't support session loading yet */ - DPRINT1("Unsupported Session-Load!\n"); - while (TRUE); - } - - /* Check the loader list again, we should end up in the path below */ - goto LoaderScan; - } - else - { - /* We don't have a valid entry */ - LdrEntry = NULL; - } - - /* Load the image */ - Status = MiLoadImageSection(&Section, - &ModuleLoadBase, - FileName, - FALSE, - NULL); - ASSERT(Status != STATUS_ALREADY_COMMITTED); - - /* Get the size of the driver */ - DriverSize = ((PROS_SECTION_OBJECT)Section)->ImageSection->ImageSize; - - /* Make sure we're not being loaded into session space */ - if (!Flags) - { - /* Check for success */ - if (NT_SUCCESS(Status)) - { - /* Support large pages for drivers */ - MiUseLargeDriverPage(DriverSize / PAGE_SIZE, - &ModuleLoadBase, - &BaseName, - TRUE); - } - - /* Dereference the section */ - ObDereferenceObject(Section); - Section = NULL; - } - - /* Check for failure of the load earlier */ - if (!NT_SUCCESS(Status)) goto Quickie; - - /* Relocate the driver */ - Status = LdrRelocateImageWithBias(ModuleLoadBase, - 0, - "SYSLDR", - STATUS_SUCCESS, - STATUS_CONFLICTING_ADDRESSES, - STATUS_INVALID_IMAGE_FORMAT); - if (!NT_SUCCESS(Status)) goto Quickie; - - - /* Get the NT Header */ - NtHeader = RtlImageNtHeader(ModuleLoadBase); - - /* Calculate the size we'll need for the entry and allocate it */ - EntrySize = sizeof(LDR_DATA_TABLE_ENTRY) + - BaseName.Length + - sizeof(UNICODE_NULL); - - /* Allocate the entry */ - LdrEntry = ExAllocatePoolWithTag(NonPagedPool, EntrySize, TAG_MODULE_OBJECT); - if (!LdrEntry) - { - /* Fail */ - Status = STATUS_INSUFFICIENT_RESOURCES; - goto Quickie; - } - - /* Setup the entry */ - LdrEntry->Flags = LDRP_LOAD_IN_PROGRESS; - LdrEntry->LoadCount = 1; - LdrEntry->LoadedImports = LoadedImports; - LdrEntry->PatchInformation = NULL; - - /* Check the version */ - if ((NtHeader->OptionalHeader.MajorOperatingSystemVersion >= 5) && - (NtHeader->OptionalHeader.MajorImageVersion >= 5)) - { - /* Mark this image as a native image */ - LdrEntry->Flags |= LDRP_ENTRY_NATIVE; - } - - /* Setup the rest of the entry */ - LdrEntry->DllBase = ModuleLoadBase; - LdrEntry->EntryPoint = (PVOID)((ULONG_PTR)ModuleLoadBase + - NtHeader->OptionalHeader.AddressOfEntryPoint); - LdrEntry->SizeOfImage = DriverSize; - LdrEntry->CheckSum = NtHeader->OptionalHeader.CheckSum; - LdrEntry->SectionPointer = Section; - - /* Now write the DLL name */ - LdrEntry->BaseDllName.Buffer = (PVOID)(LdrEntry + 1); - LdrEntry->BaseDllName.Length = BaseName.Length; - LdrEntry->BaseDllName.MaximumLength = BaseName.Length; - - /* Copy and null-terminate it */ - RtlCopyMemory(LdrEntry->BaseDllName.Buffer, - BaseName.Buffer, - BaseName.Length); - LdrEntry->BaseDllName.Buffer[BaseName.Length / sizeof(WCHAR)] = UNICODE_NULL; - - /* Now allocate the full name */ - LdrEntry->FullDllName.Buffer = ExAllocatePoolWithTag(PagedPool, - PrefixName.Length + - sizeof(UNICODE_NULL), - TAG_LDR_WSTR); - if (!LdrEntry->FullDllName.Buffer) - { - /* Don't fail, just set it to zero */ - LdrEntry->FullDllName.Length = 0; - LdrEntry->FullDllName.MaximumLength = 0; - } - else - { - /* Set it up */ - LdrEntry->FullDllName.Length = PrefixName.Length; - LdrEntry->FullDllName.MaximumLength = PrefixName.Length; - - /* Copy and null-terminate */ - RtlCopyMemory(LdrEntry->FullDllName.Buffer, - PrefixName.Buffer, - PrefixName.Length); - LdrEntry->FullDllName.Buffer[PrefixName.Length / sizeof(WCHAR)] = UNICODE_NULL; - } - - /* Add the entry */ - MiProcessLoaderEntry(LdrEntry, TRUE); - - /* Resolve imports */ - MissingApiName = Buffer; - Status = MiResolveImageReferences(ModuleLoadBase, - &BaseDirectory, - NULL, - &MissingApiName, - &MissingDriverName, - &LoadedImports); - if (!NT_SUCCESS(Status)) - { - /* Fail */ - MiProcessLoaderEntry(LdrEntry, FALSE); - - /* Check if we need to free the name */ - if (LdrEntry->FullDllName.Buffer) - { - /* Free it */ - ExFreePool(LdrEntry->FullDllName.Buffer); - } - - /* Free the entry itself */ - ExFreePoolWithTag(LdrEntry, TAG_MODULE_OBJECT); - LdrEntry = NULL; - goto Quickie; - } - - /* Update the loader entry */ - LdrEntry->Flags |= (LDRP_SYSTEM_MAPPED | - LDRP_ENTRY_PROCESSED | - LDRP_MM_LOADED); - LdrEntry->Flags &= ~LDRP_LOAD_IN_PROGRESS; - LdrEntry->LoadedImports = LoadedImports; - - /* FIXME: Call driver verifier's loader function */ - - /* Write-protect the system image */ - MiWriteProtectSystemImage(LdrEntry->DllBase); - - /* Check if notifications are enabled */ - if (PsImageNotifyEnabled) - { - /* Fill out the notification data */ - ImageInfo.Properties = 0; - ImageInfo.ImageAddressingMode = IMAGE_ADDRESSING_MODE_32BIT; - ImageInfo.SystemModeImage = TRUE; - ImageInfo.ImageSize = LdrEntry->SizeOfImage; - ImageInfo.ImageBase = LdrEntry->DllBase; - ImageInfo.ImageSectionNumber = ImageInfo.ImageSelector = 0; - - /* Send the notification */ - PspRunLoadImageNotifyRoutines(FileName, NULL, &ImageInfo); - } - -#if defined(KDBG) || defined(_WINKD_) - /* MiCacheImageSymbols doesn't detect rossym */ - if (TRUE) -#else - /* Check if there's symbols */ - if (MiCacheImageSymbols(LdrEntry->DllBase)) -#endif - { - /* Check if the system root is present */ - if ((PrefixName.Length > (11 * sizeof(WCHAR))) && - !(_wcsnicmp(PrefixName.Buffer, L"\\SystemRoot", 11))) - { - /* Add the system root */ - UnicodeTemp = PrefixName; - UnicodeTemp.Buffer += 11; - UnicodeTemp.Length -= (11 * sizeof(WCHAR)); - sprintf_nt(Buffer, - "%ws%wZ", - &SharedUserData->NtSystemRoot[2], - &UnicodeTemp); - } - else - { - /* Build the name */ - sprintf_nt(Buffer, "%wZ", &BaseName); - } - - /* Setup the ansi string */ - RtlInitString(&AnsiTemp, Buffer); - - /* Notify the debugger */ - DbgLoadImageSymbols(&AnsiTemp, - LdrEntry->DllBase, - (ULONG_PTR)ZwCurrentProcess()); - LdrEntry->Flags |= LDRP_DEBUG_SYMBOLS_LOADED; - } - - /* Page the driver */ - ASSERT(Section == NULL); - MiEnablePagingOfDriver(LdrEntry); - - /* Return pointers */ - *ModuleObject = LdrEntry; - *ImageBaseAddress = LdrEntry->DllBase; - -Quickie: - /* Check if we have the lock acquired */ - if (LockOwned) - { - /* Release the lock */ - KeReleaseMutant(&MmSystemLoadLock, 1, FALSE, FALSE); - KeLeaveCriticalRegion(); - LockOwned = FALSE; - } - - /* If we have a file handle, close it */ - if (FileHandle) ZwClose(FileHandle); - - /* Check if we had a prefix */ - if (NamePrefix) ExFreePool(PrefixName.Buffer); - - /* Free the name buffer and return status */ - ExFreePoolWithTag(Buffer, TAG_LDR_WSTR); - return Status; -} - -PLDR_DATA_TABLE_ENTRY -NTAPI -MiLookupDataTableEntry(IN PVOID Address) -{ - PLDR_DATA_TABLE_ENTRY LdrEntry, FoundEntry = NULL; - PLIST_ENTRY NextEntry; - PAGED_CODE(); - - /* Loop entries */ - NextEntry = PsLoadedModuleList.Flink; - do - { - /* Get the loader entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Check if the address matches */ - if ((Address >= LdrEntry->DllBase) && - (Address < (PVOID)((ULONG_PTR)LdrEntry->DllBase + - LdrEntry->SizeOfImage))) - { - /* Found a match */ - FoundEntry = LdrEntry; - break; - } - - /* Move on */ - NextEntry = NextEntry->Flink; - } while(NextEntry != &PsLoadedModuleList); - - /* Return the entry */ - return FoundEntry; -} - -/* PUBLIC FUNCTIONS ***********************************************************/ - -/* - * @implemented - */ -PVOID -NTAPI -MmPageEntireDriver(IN PVOID AddressWithinSection) -{ - PMMPTE StartPte, EndPte; - PLDR_DATA_TABLE_ENTRY LdrEntry; - PAGED_CODE(); - - /* Get the loader entry */ - LdrEntry = MiLookupDataTableEntry(AddressWithinSection); - if (!LdrEntry) return NULL; - - /* Check if paging of kernel mode is disabled or if the driver is mapped as an image */ - if ((MmDisablePagingExecutive) || (LdrEntry->SectionPointer)) - { - /* Don't do anything, just return the base address */ - return LdrEntry->DllBase; - } - - /* Wait for active DPCs to finish before we page out the driver */ - KeFlushQueuedDpcs(); - - /* Get the PTE range for the whole driver image */ - StartPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase); - EndPte = MiAddressToPte((ULONG_PTR)LdrEntry->DllBase + LdrEntry->SizeOfImage); - - /* Enable paging for the PTE range */ - ASSERT(MI_IS_SESSION_IMAGE_ADDRESS(AddressWithinSection) == FALSE); - MiSetPagingOfDriver(StartPte, EndPte); - - /* Return the base address */ - return LdrEntry->DllBase; -} - -/* - * @unimplemented - */ -VOID -NTAPI -MmResetDriverPaging(IN PVOID AddressWithinSection) -{ - UNIMPLEMENTED; -} - -/* - * @implemented - */ -PVOID -NTAPI -MmGetSystemRoutineAddress(IN PUNICODE_STRING SystemRoutineName) -{ - PVOID ProcAddress = NULL; - ANSI_STRING AnsiRoutineName; - NTSTATUS Status; - PLIST_ENTRY NextEntry; - PLDR_DATA_TABLE_ENTRY LdrEntry; - BOOLEAN Found = FALSE; - UNICODE_STRING KernelName = RTL_CONSTANT_STRING(L"ntoskrnl.exe"); - UNICODE_STRING HalName = RTL_CONSTANT_STRING(L"hal.dll"); - ULONG Modules = 0; - - /* Convert routine to ansi name */ - Status = RtlUnicodeStringToAnsiString(&AnsiRoutineName, - SystemRoutineName, - TRUE); - if (!NT_SUCCESS(Status)) return NULL; - - /* Lock the list */ - KeEnterCriticalRegion(); - ExAcquireResourceSharedLite(&PsLoadedModuleResource, TRUE); - - /* Loop the loaded module list */ - NextEntry = PsLoadedModuleList.Flink; - while (NextEntry != &PsLoadedModuleList) - { - /* Get the entry */ - LdrEntry = CONTAINING_RECORD(NextEntry, - LDR_DATA_TABLE_ENTRY, - InLoadOrderLinks); - - /* Check if it's the kernel or HAL */ - if (RtlEqualUnicodeString(&KernelName, &LdrEntry->BaseDllName, TRUE)) - { - /* Found it */ - Found = TRUE; - Modules++; - } - else if (RtlEqualUnicodeString(&HalName, &LdrEntry->BaseDllName, TRUE)) - { - /* Found it */ - Found = TRUE; - Modules++; - } - - /* Check if we found a valid binary */ - if (Found) - { - /* Find the procedure name */ - ProcAddress = MiFindExportedRoutineByName(LdrEntry->DllBase, - &AnsiRoutineName); - - /* Break out if we found it or if we already tried both modules */ - if (ProcAddress) break; - if (Modules == 2) break; - } - - /* Keep looping */ - NextEntry = NextEntry->Flink; - } - - /* Release the lock */ - ExReleaseResourceLite(&PsLoadedModuleResource); - KeLeaveCriticalRegion(); - - /* Free the string and return */ - RtlFreeAnsiString(&AnsiRoutineName); - return ProcAddress; -} - diff --git a/ntoskrnl/ntoskrnl-generic.rbuild b/ntoskrnl/ntoskrnl-generic.rbuild index 5dc63c62e56..c89b9c97683 100644 --- a/ntoskrnl/ntoskrnl-generic.rbuild +++ b/ntoskrnl/ntoskrnl-generic.rbuild @@ -397,6 +397,7 @@ iosup.c largepag.c mdlsup.c + mmdbg.c mminit.c mmsup.c ncache.c @@ -404,6 +405,7 @@ pfnlist.c pool.c procsup.c + sysldr.c syspte.c virtual.c @@ -411,9 +413,6 @@ balance.c freelist.c marea.c - - mmdbg.c - mmfault.c mminit.c mpw.c @@ -425,7 +424,6 @@ region.c rmap.c section.c - sysldr.c virtual.c elf32.c diff --git a/ntoskrnl/ps/query.c b/ntoskrnl/ps/query.c index b4c2abaefea..342c818945e 100644 --- a/ntoskrnl/ps/query.c +++ b/ntoskrnl/ps/query.c @@ -5,6 +5,7 @@ * PURPOSE: Process Manager: Thread/Process Query/Set Information * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) * Thomas Weidenmueller (w3seek@reactos.org) + * Eric Kohl */ /* INCLUDES ******************************************************************/ @@ -735,6 +736,42 @@ NtQueryInformationProcess(IN HANDLE ProcessHandle, ObDereferenceObject(Process); break; + case ProcessBreakOnTermination: + + /* Set the return length*/ + Length = sizeof(ULONG); + if (ProcessInformationLength != Length) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + /* Reference the process */ + Status = ObReferenceObjectByHandle(ProcessHandle, + PROCESS_QUERY_INFORMATION, + PsProcessType, + PreviousMode, + (PVOID*)&Process, + NULL); + if (!NT_SUCCESS(Status)) break; + + /* Enter SEH for writing back data */ + _SEH2_TRY + { + /* Return the BreakOnTermination state */ + *(PULONG)ProcessInformation = Process->BreakOnTermination; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + + /* Dereference the process */ + ObDereferenceObject(Process); + break; + /* Per-process security cookie */ case ProcessCookie: @@ -831,6 +868,7 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, PROCESS_SESSION_INFORMATION SessionInfo = {0}; PROCESS_PRIORITY_CLASS PriorityClass = {0}; PVOID ExceptionPort; + ULONG Break; PAGED_CODE(); /* Verify Information Class validity */ @@ -887,8 +925,9 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -931,8 +970,9 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -983,8 +1023,9 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1051,7 +1092,8 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1146,6 +1188,48 @@ NtSetInformationProcess(IN HANDLE ProcessHandle, Status = STATUS_NOT_IMPLEMENTED; break; + case ProcessBreakOnTermination: + + /* Check buffer length */ + if (ProcessInformationLength != sizeof(ULONG)) + { + Status = STATUS_INFO_LENGTH_MISMATCH; + break; + } + + /* Enter SEH for direct buffer read */ + _SEH2_TRY + { + Break = *(PULONG)ProcessInformation; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + /* Get exception code */ + Break = 0; + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); + } + _SEH2_END; + + /* Setting 'break on termination' requires the SeDebugPrivilege */ + if (!SeSinglePrivilegeCheck(SeDebugPrivilege, PreviousMode)) + { + Status = STATUS_PRIVILEGE_NOT_HELD; + break; + } + + /* Set or clear the flag */ + if (Break) + { + PspSetProcessFlag(Process, PSF_BREAK_ON_TERMINATION_BIT); + } + else + { + PspClearProcessFlag(Process, PSF_BREAK_ON_TERMINATION_BIT); + } + + break; + /* We currently don't implement any of these */ case ProcessLdtInformation: case ProcessLdtSize: @@ -1221,7 +1305,7 @@ NtSetInformationThread(IN HANDLE ThreadHandle, Access = THREAD_SET_THREAD_TOKEN; } - /* Reference the process */ + /* Reference the thread */ Status = ObReferenceObjectByHandle(ThreadHandle, Access, PsThreadType, @@ -1251,8 +1335,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1286,8 +1371,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1331,8 +1417,8 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); } _SEH2_END; @@ -1398,8 +1484,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1424,8 +1511,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1450,8 +1538,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1497,8 +1586,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; @@ -1523,8 +1613,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle, } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* Return the exception code */ - _SEH2_YIELD(return _SEH2_GetExceptionCode()); + /* Get the exception code */ + Status = _SEH2_GetExceptionCode(); + _SEH2_YIELD(break); } _SEH2_END; diff --git a/ntoskrnl/se/access.c b/ntoskrnl/se/access.c index 953166f98b3..fdf4f1376b3 100644 --- a/ntoskrnl/se/access.c +++ b/ntoskrnl/se/access.c @@ -30,11 +30,12 @@ SeCaptureSubjectContextEx(IN PETHREAD Thread, OUT PSECURITY_SUBJECT_CONTEXT SubjectContext) { BOOLEAN CopyOnOpen, EffectiveOnly; + PAGED_CODE(); - + /* Save the unique ID */ SubjectContext->ProcessAuditId = Process->UniqueProcessId; - + /* Check if we have a thread */ if (!Thread) { @@ -49,7 +50,7 @@ SeCaptureSubjectContextEx(IN PETHREAD Thread, &EffectiveOnly, &SubjectContext->ImpersonationLevel); } - + /* Get the primary token */ SubjectContext->PrimaryToken = PsReferencePrimaryToken(Process); } @@ -75,7 +76,7 @@ NTAPI SeLockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) { PAGED_CODE(); - + KeEnterCriticalRegion(); ExAcquireResourceExclusiveLite(&SepSubjectContextLock, TRUE); } @@ -88,7 +89,7 @@ NTAPI SeUnlockSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) { PAGED_CODE(); - + ExReleaseResourceLite(&SepSubjectContextLock); KeLeaveCriticalRegion(); } @@ -101,12 +102,12 @@ NTAPI SeReleaseSubjectContext(IN PSECURITY_SUBJECT_CONTEXT SubjectContext) { PAGED_CODE(); - + if (SubjectContext->PrimaryToken != NULL) { ObFastDereferenceObject(&PsGetCurrentProcess()->Token, SubjectContext->PrimaryToken); } - + if (SubjectContext->ClientToken != NULL) { ObDereferenceObject(SubjectContext->ClientToken); @@ -127,6 +128,7 @@ SeCreateAccessStateEx(IN PETHREAD Thread, { ACCESS_MASK AccessMask = Access; PTOKEN Token; + PAGED_CODE(); /* Map the Generic Acess to Specific Access if we have a Mapping */ @@ -150,9 +152,9 @@ SeCreateAccessStateEx(IN PETHREAD Thread, ExpAllocateLocallyUniqueId(&AccessState->OperationID); /* Get the Token to use */ - Token = AccessState->SubjectSecurityContext.ClientToken ? - (PTOKEN)&AccessState->SubjectSecurityContext.ClientToken : - (PTOKEN)&AccessState->SubjectSecurityContext.PrimaryToken; + Token = AccessState->SubjectSecurityContext.ClientToken ? + (PTOKEN)&AccessState->SubjectSecurityContext.ClientToken : + (PTOKEN)&AccessState->SubjectSecurityContext.PrimaryToken; /* Check for Travers Privilege */ if (Token->TokenFlags & TOKEN_HAS_TRAVERSE_PRIVILEGE) @@ -200,6 +202,7 @@ NTAPI SeDeleteAccessState(IN PACCESS_STATE AccessState) { PAUX_ACCESS_DATA AuxData; + PAGED_CODE(); /* Get the Auxiliary Data */ @@ -213,7 +216,8 @@ SeDeleteAccessState(IN PACCESS_STATE AccessState) { ExFreePool(AccessState->ObjectName.Buffer); } - if (AccessState->ObjectTypeName.Buffer) + + if (AccessState->ObjectTypeName.Buffer) { ExFreePool(AccessState->ObjectTypeName.Buffer); } @@ -252,8 +256,9 @@ SeCreateClientSecurity(IN PETHREAD Thread, PACCESS_TOKEN Token; NTSTATUS Status; PACCESS_TOKEN NewToken; + PAGED_CODE(); - + Token = PsReferenceEffectiveToken(Thread, &TokenType, &ThreadEffectiveOnly, @@ -269,7 +274,7 @@ SeCreateClientSecurity(IN PETHREAD Thread, if (Token) ObDereferenceObject(Token); return STATUS_BAD_IMPERSONATION_LEVEL; } - + if ((ImpersonationLevel == SecurityAnonymous) || (ImpersonationLevel == SecurityIdentification) || ((RemoteClient) && (ImpersonationLevel != SecurityDelegation))) @@ -277,12 +282,11 @@ SeCreateClientSecurity(IN PETHREAD Thread, if (Token) ObDereferenceObject(Token); return STATUS_BAD_IMPERSONATION_LEVEL; } - + ClientContext->DirectAccessEffectiveOnly = ((ThreadEffectiveOnly) || - (Qos->EffectiveOnly)) ? - TRUE : FALSE; + (Qos->EffectiveOnly)) ? TRUE : FALSE; } - + if (Qos->ContextTrackingMode == SECURITY_STATIC_TRACKING) { ClientContext->DirectlyAccessClientToken = FALSE; @@ -299,10 +303,10 @@ SeCreateClientSecurity(IN PETHREAD Thread, &ClientContext->ClientTokenControl); #endif } - + NewToken = Token; } - + ClientContext->SecurityQos.Length = sizeof(SECURITY_QUALITY_OF_SERVICE); ClientContext->SecurityQos.ImpersonationLevel = Qos->ImpersonationLevel; ClientContext->SecurityQos.ContextTrackingMode = Qos->ContextTrackingMode; @@ -347,9 +351,9 @@ SeImpersonateClient(IN PSECURITY_CLIENT_CONTEXT ClientContext, IN PETHREAD ServerThread OPTIONAL) { UCHAR b; - + PAGED_CODE(); - + if (ClientContext->DirectlyAccessClientToken == FALSE) { b = ClientContext->SecurityQos.EffectiveOnly; @@ -358,10 +362,12 @@ SeImpersonateClient(IN PSECURITY_CLIENT_CONTEXT ClientContext, { b = ClientContext->DirectAccessEffectiveOnly; } + if (ServerThread == NULL) { ServerThread = PsGetCurrentThread(); } + PsImpersonateClient(ServerThread, ClientContext->ClientToken, 1, diff --git a/ntoskrnl/se/acl.c b/ntoskrnl/se/acl.c index 5280ef4a888..35e4a7520e9 100644 --- a/ntoskrnl/se/acl.c +++ b/ntoskrnl/se/acl.c @@ -34,189 +34,188 @@ NTAPI SepInitDACLs(VOID) { ULONG AclLength; - + /* create PublicDefaultDacl */ AclLength = sizeof(ACL) + - (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + - (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)); - + (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + + (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)); + SePublicDefaultDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (SePublicDefaultDacl == NULL) return FALSE; - + RtlCreateAcl(SePublicDefaultDacl, AclLength, ACL_REVISION); - + RtlAddAccessAllowedAce(SePublicDefaultDacl, ACL_REVISION, GENERIC_EXECUTE, SeWorldSid); - + RtlAddAccessAllowedAce(SePublicDefaultDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - - + /* create PublicDefaultUnrestrictedDacl */ AclLength = sizeof(ACL) + - (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + - (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + - (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)) + - (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)); - + (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + + (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + + (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)) + + (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)); + SePublicDefaultUnrestrictedDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (SePublicDefaultUnrestrictedDacl == NULL) return FALSE; - + RtlCreateAcl(SePublicDefaultUnrestrictedDacl, AclLength, ACL_REVISION); - + RtlAddAccessAllowedAce(SePublicDefaultUnrestrictedDacl, ACL_REVISION, GENERIC_EXECUTE, SeWorldSid); - + RtlAddAccessAllowedAce(SePublicDefaultUnrestrictedDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - + RtlAddAccessAllowedAce(SePublicDefaultUnrestrictedDacl, ACL_REVISION, GENERIC_ALL, SeAliasAdminsSid); - + RtlAddAccessAllowedAce(SePublicDefaultUnrestrictedDacl, ACL_REVISION, GENERIC_READ | GENERIC_EXECUTE | READ_CONTROL, SeRestrictedCodeSid); - + /* create PublicOpenDacl */ AclLength = sizeof(ACL) + - (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + - (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + - (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)); - + (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + + (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + + (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)); + SePublicOpenDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (SePublicOpenDacl == NULL) return FALSE; - + RtlCreateAcl(SePublicOpenDacl, AclLength, ACL_REVISION); - + RtlAddAccessAllowedAce(SePublicOpenDacl, ACL_REVISION, GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE, SeWorldSid); - + RtlAddAccessAllowedAce(SePublicOpenDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - + RtlAddAccessAllowedAce(SePublicOpenDacl, ACL_REVISION, GENERIC_ALL, SeAliasAdminsSid); - + /* create PublicOpenUnrestrictedDacl */ AclLength = sizeof(ACL) + - (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + - (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + - (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)) + - (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)); - + (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + + (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + + (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)) + + (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)); + SePublicOpenUnrestrictedDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (SePublicOpenUnrestrictedDacl == NULL) return FALSE; - + RtlCreateAcl(SePublicOpenUnrestrictedDacl, AclLength, ACL_REVISION); - + RtlAddAccessAllowedAce(SePublicOpenUnrestrictedDacl, ACL_REVISION, GENERIC_ALL, SeWorldSid); - + RtlAddAccessAllowedAce(SePublicOpenUnrestrictedDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - + RtlAddAccessAllowedAce(SePublicOpenUnrestrictedDacl, ACL_REVISION, GENERIC_ALL, SeAliasAdminsSid); - + RtlAddAccessAllowedAce(SePublicOpenUnrestrictedDacl, ACL_REVISION, GENERIC_READ | GENERIC_EXECUTE, SeRestrictedCodeSid); - + /* create SystemDefaultDacl */ AclLength = sizeof(ACL) + - (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + - (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)); - + (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + + (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)); + SeSystemDefaultDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (SeSystemDefaultDacl == NULL) return FALSE; - + RtlCreateAcl(SeSystemDefaultDacl, AclLength, ACL_REVISION); - + RtlAddAccessAllowedAce(SeSystemDefaultDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - + RtlAddAccessAllowedAce(SeSystemDefaultDacl, ACL_REVISION, GENERIC_READ | GENERIC_EXECUTE | READ_CONTROL, SeAliasAdminsSid); - + /* create UnrestrictedDacl */ AclLength = sizeof(ACL) + - (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + - (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)); - + (sizeof(ACE) + RtlLengthSid(SeWorldSid)) + + (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)); + SeUnrestrictedDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (SeUnrestrictedDacl == NULL) return FALSE; - + RtlCreateAcl(SeUnrestrictedDacl, AclLength, ACL_REVISION); - + RtlAddAccessAllowedAce(SeUnrestrictedDacl, ACL_REVISION, GENERIC_ALL, SeWorldSid); - + RtlAddAccessAllowedAce(SeUnrestrictedDacl, ACL_REVISION, GENERIC_READ | GENERIC_EXECUTE, SeRestrictedCodeSid); - - return(TRUE); + + return TRUE; } NTSTATUS NTAPI @@ -226,22 +225,22 @@ SepCreateImpersonationTokenDacl(PTOKEN Token, { ULONG AclLength; PVOID TokenDacl; - + PAGED_CODE(); - + AclLength = sizeof(ACL) + (sizeof(ACE) + RtlLengthSid(SeAliasAdminsSid)) + (sizeof(ACE) + RtlLengthSid(SeRestrictedCodeSid)) + (sizeof(ACE) + RtlLengthSid(SeLocalSystemSid)) + (sizeof(ACE) + RtlLengthSid(Token->UserAndGroups->Sid)) + (sizeof(ACE) + RtlLengthSid(PrimaryToken->UserAndGroups->Sid)); - + TokenDacl = ExAllocatePoolWithTag(PagedPool, AclLength, TAG_ACL); if (TokenDacl == NULL) { return STATUS_INSUFFICIENT_RESOURCES; } - + RtlCreateAcl(TokenDacl, AclLength, ACL_REVISION); RtlAddAccessAllowedAce(TokenDacl, ACL_REVISION, GENERIC_ALL, Token->UserAndGroups->Sid); @@ -251,7 +250,7 @@ SepCreateImpersonationTokenDacl(PTOKEN Token, SeAliasAdminsSid); RtlAddAccessAllowedAce(TokenDacl, ACL_REVISION, GENERIC_ALL, SeLocalSystemSid); - + /* FIXME */ #if 0 if (Token->RestrictedSids != NULL || PrimaryToken->RestrictedSids != NULL) @@ -260,7 +259,7 @@ SepCreateImpersonationTokenDacl(PTOKEN Token, SeRestrictedCodeSid); } #endif - + return STATUS_SUCCESS; } @@ -275,9 +274,9 @@ SepCaptureAcl(IN PACL InputAcl, PACL NewAcl; ULONG AclSize = 0; NTSTATUS Status = STATUS_SUCCESS; - + PAGED_CODE(); - + if (AccessMode != KernelMode) { _SEH2_TRY @@ -296,10 +295,10 @@ SepCaptureAcl(IN PACL InputAcl, _SEH2_YIELD(return _SEH2_GetExceptionCode()); } _SEH2_END; - + NewAcl = ExAllocatePool(PoolType, AclSize); - if(NewAcl != NULL) + if (NewAcl != NULL) { _SEH2_TRY { @@ -322,23 +321,23 @@ SepCaptureAcl(IN PACL InputAcl, Status = STATUS_INSUFFICIENT_RESOURCES; } } - else if(!CaptureIfKernel) + else if (!CaptureIfKernel) { *CapturedAcl = InputAcl; } else { AclSize = InputAcl->AclSize; - + NewAcl = ExAllocatePool(PoolType, AclSize); - - if(NewAcl != NULL) + + if (NewAcl != NULL) { RtlCopyMemory(NewAcl, InputAcl, AclSize); - + *CapturedAcl = NewAcl; } else @@ -346,7 +345,7 @@ SepCaptureAcl(IN PACL InputAcl, Status = STATUS_INSUFFICIENT_RESOURCES; } } - + return Status; } @@ -357,10 +356,10 @@ SepReleaseAcl(IN PACL CapturedAcl, IN BOOLEAN CaptureIfKernel) { PAGED_CODE(); - - if(CapturedAcl != NULL && - (AccessMode != KernelMode || - (AccessMode == KernelMode && CaptureIfKernel))) + + if (CapturedAcl != NULL && + (AccessMode != KernelMode || + (AccessMode == KernelMode && CaptureIfKernel))) { ExFreePool(CapturedAcl); } diff --git a/ntoskrnl/se/audit.c b/ntoskrnl/se/audit.c index bdd7f93d77a..92b87fa8377 100644 --- a/ntoskrnl/se/audit.c +++ b/ntoskrnl/se/audit.c @@ -4,7 +4,7 @@ * FILE: ntoskrnl/se/audit.c * PURPOSE: Audit functions * - * PROGRAMMERS: Eric Kohl + * PROGRAMMERS: Eric Kohl */ /* INCLUDES *******************************************************************/ @@ -47,6 +47,7 @@ SeInitializeProcessAuditName(IN PFILE_OBJECT FileObject, POBJECT_NAME_INFORMATION ObjectNameInfo = NULL; ULONG ReturnLength = 8; NTSTATUS Status; + PAGED_CODE(); ASSERT(AuditInfo); @@ -120,6 +121,7 @@ SeLocateProcessImageName(IN PEPROCESS Process, PUNICODE_STRING ImageName; PFILE_OBJECT FileObject; NTSTATUS Status = STATUS_SUCCESS; + PAGED_CODE(); /* Assume failure */ @@ -189,7 +191,7 @@ SeAuditHardLinkCreation(IN PUNICODE_STRING FileName, IN PUNICODE_STRING LinkName, IN BOOLEAN bSuccess) { - UNIMPLEMENTED; + UNIMPLEMENTED; } /* @@ -200,8 +202,8 @@ NTAPI SeAuditingFileEvents(IN BOOLEAN AccessGranted, IN PSECURITY_DESCRIPTOR SecurityDescriptor) { - UNIMPLEMENTED; - return FALSE; + UNIMPLEMENTED; + return FALSE; } /* @@ -213,8 +215,8 @@ SeAuditingFileEventsWithContext(IN BOOLEAN AccessGranted, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL) { - UNIMPLEMENTED; - return FALSE; + UNIMPLEMENTED; + return FALSE; } /* @@ -225,8 +227,8 @@ NTAPI SeAuditingHardLinkEvents(IN BOOLEAN AccessGranted, IN PSECURITY_DESCRIPTOR SecurityDescriptor) { - UNIMPLEMENTED; - return FALSE; + UNIMPLEMENTED; + return FALSE; } /* @@ -238,8 +240,8 @@ SeAuditingHardLinkEventsWithContext(IN BOOLEAN AccessGranted, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext OPTIONAL) { - UNIMPLEMENTED; - return FALSE; + UNIMPLEMENTED; + return FALSE; } /* @@ -251,8 +253,8 @@ SeAuditingFileOrGlobalEvents(IN BOOLEAN AccessGranted, IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext) { - UNIMPLEMENTED; - return FALSE; + UNIMPLEMENTED; + return FALSE; } /* @@ -260,13 +262,11 @@ SeAuditingFileOrGlobalEvents(IN BOOLEAN AccessGranted, */ VOID NTAPI -SeCloseObjectAuditAlarm( - IN PVOID Object, +SeCloseObjectAuditAlarm(IN PVOID Object, IN HANDLE Handle, - IN BOOLEAN PerformAction - ) + IN BOOLEAN PerformAction) { - UNIMPLEMENTED; + UNIMPLEMENTED; } /* @@ -295,10 +295,10 @@ SeOpenObjectAuditAlarm(IN PUNICODE_STRING ObjectTypeName, OUT PBOOLEAN GenerateOnClose) { PAGED_CODE(); - + /* Audits aren't done on kernel-mode access */ if (AccessMode == KernelMode) return; - + /* Otherwise, unimplemented! */ //UNIMPLEMENTED; return; @@ -333,7 +333,7 @@ SePrivilegeObjectAuditAlarm(IN HANDLE Handle, IN BOOLEAN AccessGranted, IN KPROCESSOR_MODE CurrentMode) { - UNIMPLEMENTED; + UNIMPLEMENTED; } /* SYSTEM CALLS ***************************************************************/ @@ -363,7 +363,7 @@ NtCloseObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, IN BOOLEAN GenerateOnClose) { UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + return STATUS_NOT_IMPLEMENTED; } @@ -373,7 +373,7 @@ NtDeleteObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, IN BOOLEAN GenerateOnClose) { UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + return STATUS_NOT_IMPLEMENTED; } @@ -392,7 +392,7 @@ NtOpenObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, OUT PBOOLEAN GenerateOnClose) { UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + return STATUS_NOT_IMPLEMENTED; } @@ -404,7 +404,7 @@ NtPrivilegedServiceAuditAlarm(IN PUNICODE_STRING SubsystemName, IN BOOLEAN AccessGranted) { UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + return STATUS_NOT_IMPLEMENTED; } @@ -417,7 +417,7 @@ NtPrivilegeObjectAuditAlarm(IN PUNICODE_STRING SubsystemName, IN BOOLEAN AccessGranted) { UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + return STATUS_NOT_IMPLEMENTED; } /* EOF */ diff --git a/ntoskrnl/se/lsa.c b/ntoskrnl/se/lsa.c index 15726ad1aa1..b6b36ad6647 100644 --- a/ntoskrnl/se/lsa.c +++ b/ntoskrnl/se/lsa.c @@ -110,8 +110,8 @@ NTSTATUS NTAPI SeMarkLogonSessionForTerminationNotification(IN PLUID LogonId) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* @@ -121,8 +121,8 @@ NTSTATUS NTAPI SeRegisterLogonSessionTerminatedRoutine(IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* @@ -132,8 +132,8 @@ NTSTATUS NTAPI SeUnregisterLogonSessionTerminatedRoutine(IN PSE_LOGON_SESSION_TERMINATED_ROUTINE CallbackRoutine) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } /* EOF */ diff --git a/ntoskrnl/se/priv.c b/ntoskrnl/se/priv.c index d7d3bf95134..603194259e0 100644 --- a/ntoskrnl/se/priv.c +++ b/ntoskrnl/se/priv.c @@ -51,7 +51,7 @@ LUID SeEnableDelegationPrivilege; VOID INIT_FUNCTION NTAPI -SepInitPrivileges (VOID) +SepInitPrivileges(VOID) { SeCreateTokenPrivilege.LowPart = SE_CREATE_TOKEN_PRIVILEGE; SeCreateTokenPrivilege.HighPart = 0; @@ -110,25 +110,25 @@ SepInitPrivileges (VOID) BOOLEAN NTAPI -SepPrivilegeCheck (PTOKEN Token, - PLUID_AND_ATTRIBUTES Privileges, - ULONG PrivilegeCount, - ULONG PrivilegeControl, - KPROCESSOR_MODE PreviousMode) +SepPrivilegeCheck(PTOKEN Token, + PLUID_AND_ATTRIBUTES Privileges, + ULONG PrivilegeCount, + ULONG PrivilegeControl, + KPROCESSOR_MODE PreviousMode) { ULONG i; ULONG j; ULONG k; - - DPRINT ("SepPrivilegeCheck() called\n"); - + + DPRINT("SepPrivilegeCheck() called\n"); + PAGED_CODE(); - + if (PreviousMode == KernelMode) { return TRUE; } - + k = 0; if (PrivilegeCount > 0) { @@ -139,10 +139,10 @@ SepPrivilegeCheck (PTOKEN Token, if (Token->Privileges[i].Luid.LowPart == Privileges[j].Luid.LowPart && Token->Privileges[i].Luid.HighPart == Privileges[j].Luid.HighPart) { - DPRINT ("Found privilege\n"); - DPRINT ("Privilege attributes %lx\n", - Token->Privileges[i].Attributes); - + DPRINT("Found privilege\n"); + DPRINT("Privilege attributes %lx\n", + Token->Privileges[i].Attributes); + if (Token->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) { Privileges[j].Attributes |= SE_PRIVILEGE_USED_FOR_ACCESS; @@ -152,58 +152,58 @@ SepPrivilegeCheck (PTOKEN Token, } } } - + if ((PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY) && PrivilegeCount == k) { return TRUE; } - + if (k > 0 && !(PrivilegeControl & PRIVILEGE_SET_ALL_NECESSARY)) { return TRUE; } - + return FALSE; } NTSTATUS NTAPI -SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src, - ULONG PrivilegeCount, - KPROCESSOR_MODE PreviousMode, - PLUID_AND_ATTRIBUTES AllocatedMem, - ULONG AllocatedLength, - POOL_TYPE PoolType, - BOOLEAN CaptureIfKernel, - PLUID_AND_ATTRIBUTES* Dest, - PULONG Length) +SeCaptureLuidAndAttributesArray(PLUID_AND_ATTRIBUTES Src, + ULONG PrivilegeCount, + KPROCESSOR_MODE PreviousMode, + PLUID_AND_ATTRIBUTES AllocatedMem, + ULONG AllocatedLength, + POOL_TYPE PoolType, + BOOLEAN CaptureIfKernel, + PLUID_AND_ATTRIBUTES *Dest, + PULONG Length) { ULONG BufferSize; NTSTATUS Status = STATUS_SUCCESS; - + PAGED_CODE(); - + if (PrivilegeCount == 0) { *Dest = 0; *Length = 0; return STATUS_SUCCESS; } - + if (PreviousMode == KernelMode && !CaptureIfKernel) { *Dest = Src; return STATUS_SUCCESS; } - + /* FIXME - check PrivilegeCount for a valid number so we don't cause an integer overflow or exhaust system resources! */ - + BufferSize = PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); *Length = ROUND_UP(BufferSize, 4); /* round up to a 4 byte alignment */ - + /* probe the buffer */ if (PreviousMode != KernelMode) { @@ -220,7 +220,7 @@ SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src, } _SEH2_END; } - + /* allocate enough memory or check if the provided buffer is large enough to hold the array */ if (AllocatedMem != NULL) @@ -229,14 +229,13 @@ SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src, { return STATUS_BUFFER_TOO_SMALL; } - + *Dest = AllocatedMem; } else { *Dest = ExAllocatePool(PoolType, BufferSize); - if (*Dest == NULL) { return STATUS_INSUFFICIENT_RESOURCES; @@ -255,23 +254,23 @@ SeCaptureLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Src, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + if (!NT_SUCCESS(Status) && AllocatedMem == NULL) { ExFreePool(*Dest); } - + return Status; } VOID NTAPI -SeReleaseLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Privilege, - KPROCESSOR_MODE PreviousMode, - BOOLEAN CaptureIfKernel) +SeReleaseLuidAndAttributesArray(PLUID_AND_ATTRIBUTES Privilege, + KPROCESSOR_MODE PreviousMode, + BOOLEAN CaptureIfKernel) { PAGED_CODE(); - + if (Privilege != NULL && (PreviousMode != KernelMode || CaptureIfKernel)) { @@ -282,39 +281,100 @@ SeReleaseLuidAndAttributesArray (PLUID_AND_ATTRIBUTES Privilege, /* PUBLIC FUNCTIONS ***********************************************************/ /* - * @unimplemented + * @implemented */ NTSTATUS NTAPI -SeAppendPrivileges(PACCESS_STATE AccessState, - PPRIVILEGE_SET Privileges) +SeAppendPrivileges(IN OUT PACCESS_STATE AccessState, + IN PPRIVILEGE_SET Privileges) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; -} + PAUX_ACCESS_DATA AuxData; + ULONG OldPrivilegeSetSize; + ULONG NewPrivilegeSetSize; + PPRIVILEGE_SET PrivilegeSet; -/* - * @unimplemented - */ -VOID -NTAPI -SeFreePrivileges(IN PPRIVILEGE_SET Privileges) -{ - UNIMPLEMENTED; + PAGED_CODE(); + + /* Get the Auxiliary Data */ + AuxData = AccessState->AuxData; + + /* Calculate the size of the old privilege set */ + OldPrivilegeSetSize = sizeof(PRIVILEGE_SET) + + (AuxData->PrivilegeSet->PrivilegeCount - 1) * sizeof(LUID_AND_ATTRIBUTES); + + if (AuxData->PrivilegeSet->PrivilegeCount + + Privileges->PrivilegeCount > INITIAL_PRIVILEGE_COUNT) + { + /* Calculate the size of the new privilege set */ + NewPrivilegeSetSize = OldPrivilegeSetSize + + Privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); + + /* Allocate a new privilege set */ + PrivilegeSet = ExAllocatePool(PagedPool, NewPrivilegeSetSize); + if (PrivilegeSet == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + + /* Copy original privileges from the acess state */ + RtlCopyMemory(PrivilegeSet, + AuxData->PrivilegeSet, + OldPrivilegeSetSize); + + /* Append privileges from the privilege set*/ + RtlCopyMemory((PVOID)((ULONG_PTR)PrivilegeSet + OldPrivilegeSetSize), + (PVOID)((ULONG_PTR)Privileges + sizeof(PRIVILEGE_SET) - sizeof(LUID_AND_ATTRIBUTES)), + Privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)); + + /* Adjust the number of privileges in the new privilege set */ + PrivilegeSet->PrivilegeCount += Privileges->PrivilegeCount; + + /* Free the old privilege set if it was allocated */ + if (AccessState->PrivilegesAllocated == TRUE) + ExFreePool(AuxData->PrivilegeSet); + + /* Now we are using an allocated privilege set */ + AccessState->PrivilegesAllocated = TRUE; + + /* Assign the new privileges to the access state */ + AuxData->PrivilegeSet = PrivilegeSet; + } + else + { + /* Append privileges */ + RtlCopyMemory((PVOID)((ULONG_PTR)AuxData->PrivilegeSet + OldPrivilegeSetSize), + (PVOID)((ULONG_PTR)Privileges + sizeof(PRIVILEGE_SET) - sizeof(LUID_AND_ATTRIBUTES)), + Privileges->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)); + + /* Adjust the number of privileges in the target privilege set */ + AuxData->PrivilegeSet->PrivilegeCount += Privileges->PrivilegeCount; + } + + return STATUS_SUCCESS; } /* * @implemented */ -BOOLEAN NTAPI -SePrivilegeCheck (PPRIVILEGE_SET Privileges, - PSECURITY_SUBJECT_CONTEXT SubjectContext, - KPROCESSOR_MODE PreviousMode) +VOID +NTAPI +SeFreePrivileges(IN PPRIVILEGE_SET Privileges) +{ + PAGED_CODE(); + ExFreePool(Privileges); +} + +/* + * @implemented + */ +BOOLEAN +NTAPI +SePrivilegeCheck(PPRIVILEGE_SET Privileges, + PSECURITY_SUBJECT_CONTEXT SubjectContext, + KPROCESSOR_MODE PreviousMode) { PACCESS_TOKEN Token = NULL; - + PAGED_CODE(); - + if (SubjectContext->ClientToken == NULL) { Token = SubjectContext->PrimaryToken; @@ -327,58 +387,60 @@ SePrivilegeCheck (PPRIVILEGE_SET Privileges, return FALSE; } } - - return SepPrivilegeCheck (Token, - Privileges->Privilege, - Privileges->PrivilegeCount, - Privileges->Control, - PreviousMode); + + return SepPrivilegeCheck(Token, + Privileges->Privilege, + Privileges->PrivilegeCount, + Privileges->Control, + PreviousMode); } /* * @implemented */ -BOOLEAN NTAPI -SeSinglePrivilegeCheck (IN LUID PrivilegeValue, - IN KPROCESSOR_MODE PreviousMode) +BOOLEAN +NTAPI +SeSinglePrivilegeCheck(IN LUID PrivilegeValue, + IN KPROCESSOR_MODE PreviousMode) { SECURITY_SUBJECT_CONTEXT SubjectContext; PRIVILEGE_SET Priv; BOOLEAN Result; - + PAGED_CODE(); - - SeCaptureSubjectContext (&SubjectContext); - + + SeCaptureSubjectContext(&SubjectContext); + Priv.PrivilegeCount = 1; Priv.Control = PRIVILEGE_SET_ALL_NECESSARY; Priv.Privilege[0].Luid = PrivilegeValue; Priv.Privilege[0].Attributes = SE_PRIVILEGE_ENABLED; - - Result = SePrivilegeCheck (&Priv, - &SubjectContext, - PreviousMode); - + + Result = SePrivilegeCheck(&Priv, + &SubjectContext, + PreviousMode); + if (PreviousMode != KernelMode) { #if 0 - SePrivilegedServiceAuditAlarm (0, - &SubjectContext, - &PrivilegeValue); + SePrivilegedServiceAuditAlarm(0, + &SubjectContext, + &PrivilegeValue); #endif } - - SeReleaseSubjectContext (&SubjectContext); - + + SeReleaseSubjectContext(&SubjectContext); + return Result; } /* SYSTEM CALLS ***************************************************************/ -NTSTATUS NTAPI -NtPrivilegeCheck (IN HANDLE ClientToken, - IN PPRIVILEGE_SET RequiredPrivileges, - OUT PBOOLEAN Result) +NTSTATUS +NTAPI +NtPrivilegeCheck(IN HANDLE ClientToken, + IN PPRIVILEGE_SET RequiredPrivileges, + OUT PBOOLEAN Result) { PLUID_AND_ATTRIBUTES Privileges; PTOKEN Token; @@ -388,11 +450,11 @@ NtPrivilegeCheck (IN HANDLE ClientToken, BOOLEAN CheckResult; KPROCESSOR_MODE PreviousMode; NTSTATUS Status; - + PAGED_CODE(); - + PreviousMode = KeGetPreviousMode(); - + /* probe the buffers */ if (PreviousMode != KernelMode) { @@ -402,10 +464,10 @@ NtPrivilegeCheck (IN HANDLE ClientToken, FIELD_OFFSET(PRIVILEGE_SET, Privilege), sizeof(ULONG)); - + PrivilegeCount = RequiredPrivileges->PrivilegeCount; PrivilegeControl = RequiredPrivileges->Control; - + /* Check PrivilegeCount to avoid an integer overflow! */ if (FIELD_OFFSET(PRIVILEGE_SET, Privilege[PrivilegeCount]) / @@ -413,13 +475,13 @@ NtPrivilegeCheck (IN HANDLE ClientToken, { _SEH2_YIELD(return STATUS_INVALID_PARAMETER); } - + /* probe all of the array */ ProbeForWrite(RequiredPrivileges, FIELD_OFFSET(PRIVILEGE_SET, Privilege[PrivilegeCount]), sizeof(ULONG)); - + ProbeForWriteBoolean(Result); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -434,51 +496,51 @@ NtPrivilegeCheck (IN HANDLE ClientToken, PrivilegeCount = RequiredPrivileges->PrivilegeCount; PrivilegeControl = RequiredPrivileges->Control; } - + /* reference the token and make sure we're not doing an anonymous impersonation */ - Status = ObReferenceObjectByHandle (ClientToken, - TOKEN_QUERY, - SepTokenObjectType, - PreviousMode, - (PVOID*)&Token, - NULL); + Status = ObReferenceObjectByHandle(ClientToken, + TOKEN_QUERY, + SepTokenObjectType, + PreviousMode, + (PVOID*)&Token, + NULL); if (!NT_SUCCESS(Status)) { return Status; } - + if (Token->TokenType == TokenImpersonation && Token->ImpersonationLevel < SecurityIdentification) { - ObDereferenceObject (Token); + ObDereferenceObject(Token); return STATUS_BAD_IMPERSONATION_LEVEL; } - + /* capture the privileges */ - Status = SeCaptureLuidAndAttributesArray (RequiredPrivileges->Privilege, - PrivilegeCount, - PreviousMode, - NULL, - 0, - PagedPool, - TRUE, - &Privileges, - &Length); + Status = SeCaptureLuidAndAttributesArray(RequiredPrivileges->Privilege, + PrivilegeCount, + PreviousMode, + NULL, + 0, + PagedPool, + TRUE, + &Privileges, + &Length); if (!NT_SUCCESS(Status)) { ObDereferenceObject (Token); return Status; } - - CheckResult = SepPrivilegeCheck (Token, - Privileges, - PrivilegeCount, - PrivilegeControl, - PreviousMode); - - ObDereferenceObject (Token); - + + CheckResult = SepPrivilegeCheck(Token, + Privileges, + PrivilegeCount, + PrivilegeControl, + PreviousMode); + + ObDereferenceObject(Token); + /* return the array */ _SEH2_TRY { @@ -493,13 +555,12 @@ NtPrivilegeCheck (IN HANDLE ClientToken, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - - SeReleaseLuidAndAttributesArray (Privileges, - PreviousMode, - TRUE); - + + SeReleaseLuidAndAttributesArray(Privileges, + PreviousMode, + TRUE); + return Status; } - /* EOF */ diff --git a/ntoskrnl/se/sd.c b/ntoskrnl/se/sd.c index fded835b6af..0e0eadcea36 100644 --- a/ntoskrnl/se/sd.c +++ b/ntoskrnl/se/sd.c @@ -38,79 +38,79 @@ SepInitSDs(VOID) sizeof(SECURITY_DESCRIPTOR), TAG_SD); if (SePublicDefaultSd == NULL) return FALSE; - + RtlCreateSecurityDescriptor(SePublicDefaultSd, SECURITY_DESCRIPTOR_REVISION); RtlSetDaclSecurityDescriptor(SePublicDefaultSd, TRUE, SePublicDefaultDacl, FALSE); - + /* Create PublicDefaultUnrestrictedSd */ SePublicDefaultUnrestrictedSd = ExAllocatePoolWithTag(PagedPool, sizeof(SECURITY_DESCRIPTOR), TAG_SD); if (SePublicDefaultUnrestrictedSd == NULL) return FALSE; - + RtlCreateSecurityDescriptor(SePublicDefaultUnrestrictedSd, SECURITY_DESCRIPTOR_REVISION); RtlSetDaclSecurityDescriptor(SePublicDefaultUnrestrictedSd, TRUE, SePublicDefaultUnrestrictedDacl, FALSE); - + /* Create PublicOpenSd */ SePublicOpenSd = ExAllocatePoolWithTag(PagedPool, sizeof(SECURITY_DESCRIPTOR), TAG_SD); if (SePublicOpenSd == NULL) return FALSE; - + RtlCreateSecurityDescriptor(SePublicOpenSd, SECURITY_DESCRIPTOR_REVISION); RtlSetDaclSecurityDescriptor(SePublicOpenSd, TRUE, SePublicOpenDacl, FALSE); - + /* Create PublicOpenUnrestrictedSd */ SePublicOpenUnrestrictedSd = ExAllocatePoolWithTag(PagedPool, sizeof(SECURITY_DESCRIPTOR), TAG_SD); if (SePublicOpenUnrestrictedSd == NULL) return FALSE; - + RtlCreateSecurityDescriptor(SePublicOpenUnrestrictedSd, SECURITY_DESCRIPTOR_REVISION); RtlSetDaclSecurityDescriptor(SePublicOpenUnrestrictedSd, TRUE, SePublicOpenUnrestrictedDacl, FALSE); - + /* Create SystemDefaultSd */ SeSystemDefaultSd = ExAllocatePoolWithTag(PagedPool, sizeof(SECURITY_DESCRIPTOR), TAG_SD); if (SeSystemDefaultSd == NULL) return FALSE; - + RtlCreateSecurityDescriptor(SeSystemDefaultSd, SECURITY_DESCRIPTOR_REVISION); RtlSetDaclSecurityDescriptor(SeSystemDefaultSd, TRUE, SeSystemDefaultDacl, FALSE); - + /* Create UnrestrictedSd */ SeUnrestrictedSd = ExAllocatePoolWithTag(PagedPool, sizeof(SECURITY_DESCRIPTOR), TAG_SD); if (SeUnrestrictedSd == NULL) return FALSE; - + RtlCreateSecurityDescriptor(SeUnrestrictedSd, SECURITY_DESCRIPTOR_REVISION); RtlSetDaclSecurityDescriptor(SeUnrestrictedSd, TRUE, SeUnrestrictedDacl, FALSE); - + return TRUE; } @@ -125,14 +125,14 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, ULONG SdSize; NTSTATUS Status; PISECURITY_DESCRIPTOR_RELATIVE SdRel = (PISECURITY_DESCRIPTOR_RELATIVE)SecurityDescriptor; - + DPRINT("SeSetWorldSecurityDescriptor() called\n"); - + if (SecurityInformation == 0) { return STATUS_ACCESS_DENIED; } - + /* calculate the minimum size of the buffer */ SidSize = RtlLengthSid(SeWorldSid); SdSize = sizeof(SECURITY_DESCRIPTOR_RELATIVE); @@ -144,24 +144,24 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, { SdSize += sizeof(ACL) + sizeof(ACE) + SidSize; } - + if (*BufferLength < SdSize) { *BufferLength = SdSize; return STATUS_BUFFER_TOO_SMALL; } - + *BufferLength = SdSize; - + Status = RtlCreateSecurityDescriptorRelative(SdRel, SECURITY_DESCRIPTOR_REVISION); if (!NT_SUCCESS(Status)) { return Status; } - + Current = (ULONG_PTR)(SdRel + 1); - + if (SecurityInformation & OWNER_SECURITY_INFORMATION) { RtlCopyMemory((PVOID)Current, @@ -170,7 +170,7 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, SdRel->Owner = (ULONG)((ULONG_PTR)Current - (ULONG_PTR)SdRel); Current += SidSize; } - + if (SecurityInformation & GROUP_SECURITY_INFORMATION) { RtlCopyMemory((PVOID)Current, @@ -179,33 +179,33 @@ SeSetWorldSecurityDescriptor(SECURITY_INFORMATION SecurityInformation, SdRel->Group = (ULONG)((ULONG_PTR)Current - (ULONG_PTR)SdRel); Current += SidSize; } - + if (SecurityInformation & DACL_SECURITY_INFORMATION) { PACL Dacl = (PACL)Current; SdRel->Control |= SE_DACL_PRESENT; - + Status = RtlCreateAcl(Dacl, sizeof(ACL) + sizeof(ACE) + SidSize, ACL_REVISION); if (!NT_SUCCESS(Status)) return Status; - + Status = RtlAddAccessAllowedAce(Dacl, ACL_REVISION, GENERIC_ALL, SeWorldSid); if (!NT_SUCCESS(Status)) return Status; - + SdRel->Dacl = (ULONG)((ULONG_PTR)Current - (ULONG_PTR)SdRel); } - + if (SecurityInformation & SACL_SECURITY_INFORMATION) { /* FIXME - SdRel->Control |= SE_SACL_PRESENT; */ } - + return STATUS_SUCCESS; } @@ -221,37 +221,39 @@ SepCaptureSecurityQualityOfService(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIO { PSECURITY_QUALITY_OF_SERVICE CapturedQos; NTSTATUS Status = STATUS_SUCCESS; - + PAGED_CODE(); - + ASSERT(CapturedSecurityQualityOfService); ASSERT(Present); - - if(ObjectAttributes != NULL) + + if (ObjectAttributes != NULL) { - if(AccessMode != KernelMode) + if (AccessMode != KernelMode) { SECURITY_QUALITY_OF_SERVICE SafeQos; - + _SEH2_TRY { ProbeForRead(ObjectAttributes, sizeof(OBJECT_ATTRIBUTES), sizeof(ULONG)); - if(ObjectAttributes->Length == sizeof(OBJECT_ATTRIBUTES)) + if (ObjectAttributes->Length == sizeof(OBJECT_ATTRIBUTES)) { - if(ObjectAttributes->SecurityQualityOfService != NULL) + if (ObjectAttributes->SecurityQualityOfService != NULL) { ProbeForRead(ObjectAttributes->SecurityQualityOfService, sizeof(SECURITY_QUALITY_OF_SERVICE), sizeof(ULONG)); - if(((PSECURITY_QUALITY_OF_SERVICE)ObjectAttributes->SecurityQualityOfService)->Length == - sizeof(SECURITY_QUALITY_OF_SERVICE)) + if (((PSECURITY_QUALITY_OF_SERVICE)ObjectAttributes->SecurityQualityOfService)->Length == + sizeof(SECURITY_QUALITY_OF_SERVICE)) { - /* don't allocate memory here because ExAllocate should bugcheck - the system if it's buggy, SEH would catch that! So make a local - copy of the qos structure.*/ + /* + * Don't allocate memory here because ExAllocate should bugcheck + * the system if it's buggy, SEH would catch that! So make a local + * copy of the qos structure. + */ RtlCopyMemory(&SafeQos, ObjectAttributes->SecurityQualityOfService, sizeof(SECURITY_QUALITY_OF_SERVICE)); @@ -278,14 +280,14 @@ SepCaptureSecurityQualityOfService(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIO Status = _SEH2_GetExceptionCode(); } _SEH2_END; - - if(NT_SUCCESS(Status)) + + if (NT_SUCCESS(Status)) { - if(*Present) + if (*Present) { CapturedQos = ExAllocatePool(PoolType, sizeof(SECURITY_QUALITY_OF_SERVICE)); - if(CapturedQos != NULL) + if (CapturedQos != NULL) { RtlCopyMemory(CapturedQos, &SafeQos, @@ -305,18 +307,18 @@ SepCaptureSecurityQualityOfService(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIO } else { - if(ObjectAttributes->Length == sizeof(OBJECT_ATTRIBUTES)) + if (ObjectAttributes->Length == sizeof(OBJECT_ATTRIBUTES)) { - if(CaptureIfKernel) + if (CaptureIfKernel) { - if(ObjectAttributes->SecurityQualityOfService != NULL) + if (ObjectAttributes->SecurityQualityOfService != NULL) { - if(((PSECURITY_QUALITY_OF_SERVICE)ObjectAttributes->SecurityQualityOfService)->Length == - sizeof(SECURITY_QUALITY_OF_SERVICE)) + if (((PSECURITY_QUALITY_OF_SERVICE)ObjectAttributes->SecurityQualityOfService)->Length == + sizeof(SECURITY_QUALITY_OF_SERVICE)) { CapturedQos = ExAllocatePool(PoolType, sizeof(SECURITY_QUALITY_OF_SERVICE)); - if(CapturedQos != NULL) + if (CapturedQos != NULL) { RtlCopyMemory(CapturedQos, ObjectAttributes->SecurityQualityOfService, @@ -357,7 +359,7 @@ SepCaptureSecurityQualityOfService(IN POBJECT_ATTRIBUTES ObjectAttributes OPTIO *CapturedSecurityQualityOfService = NULL; *Present = FALSE; } - + return Status; } @@ -369,9 +371,9 @@ SepReleaseSecurityQualityOfService(IN PSECURITY_QUALITY_OF_SERVICE CapturedSecur IN BOOLEAN CaptureIfKernel) { PAGED_CODE(); - - if(CapturedSecurityQualityOfService != NULL && - (AccessMode != KernelMode || CaptureIfKernel)) + + if (CapturedSecurityQualityOfService != NULL && + (AccessMode != KernelMode || CaptureIfKernel)) { ExFreePool(CapturedSecurityQualityOfService); } @@ -398,44 +400,48 @@ SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor, ULONG SaclSize = 0, DaclSize = 0; ULONG DescriptorSize = 0; NTSTATUS Status; - - if(OriginalSecurityDescriptor != NULL) + + if (OriginalSecurityDescriptor != NULL) { - if(CurrentMode != KernelMode) + if (CurrentMode != KernelMode) { RtlZeroMemory(&DescriptorCopy, sizeof(DescriptorCopy)); - + _SEH2_TRY { - /* first only probe and copy until the control field of the descriptor - to determine whether it's a self-relative descriptor */ + /* + * First only probe and copy until the control field of the descriptor + * to determine whether it's a self-relative descriptor + */ DescriptorSize = FIELD_OFFSET(SECURITY_DESCRIPTOR, Owner); ProbeForRead(OriginalSecurityDescriptor, DescriptorSize, sizeof(ULONG)); - - if(OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) + + if (OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { _SEH2_YIELD(return STATUS_UNKNOWN_REVISION); } - - /* make a copy on the stack */ + + /* Make a copy on the stack */ DescriptorCopy.Revision = OriginalSecurityDescriptor->Revision; DescriptorCopy.Sbz1 = OriginalSecurityDescriptor->Sbz1; DescriptorCopy.Control = OriginalSecurityDescriptor->Control; DescriptorSize = ((DescriptorCopy.Control & SE_SELF_RELATIVE) ? sizeof(SECURITY_DESCRIPTOR_RELATIVE) : sizeof(SECURITY_DESCRIPTOR)); - - /* probe and copy the entire security descriptor structure. The SIDs - and ACLs will be probed and copied later though */ + + /* + * Probe and copy the entire security descriptor structure. The SIDs + * and ACLs will be probed and copied later though + */ ProbeForRead(OriginalSecurityDescriptor, DescriptorSize, sizeof(ULONG)); - if(DescriptorCopy.Control & SE_SELF_RELATIVE) + if (DescriptorCopy.Control & SE_SELF_RELATIVE) { PISECURITY_DESCRIPTOR_RELATIVE RelSD = (PISECURITY_DESCRIPTOR_RELATIVE)OriginalSecurityDescriptor; - + DescriptorCopy.Owner = (PSID)RelSD->Owner; DescriptorCopy.Group = (PSID)RelSD->Group; DescriptorCopy.Sacl = (PACL)RelSD->Sacl; @@ -456,33 +462,33 @@ SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor, } _SEH2_END; } - else if(!CaptureIfKernel) + else if (!CaptureIfKernel) { - if(OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) + if (OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; } - + *CapturedSecurityDescriptor = OriginalSecurityDescriptor; return STATUS_SUCCESS; } else { - if(OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) + if (OriginalSecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { return STATUS_UNKNOWN_REVISION; } - - /* make a copy on the stack */ + + /* Make a copy on the stack */ DescriptorCopy.Revision = OriginalSecurityDescriptor->Revision; DescriptorCopy.Sbz1 = OriginalSecurityDescriptor->Sbz1; DescriptorCopy.Control = OriginalSecurityDescriptor->Control; DescriptorSize = ((DescriptorCopy.Control & SE_SELF_RELATIVE) ? sizeof(SECURITY_DESCRIPTOR_RELATIVE) : sizeof(SECURITY_DESCRIPTOR)); - if(DescriptorCopy.Control & SE_SELF_RELATIVE) + if (DescriptorCopy.Control & SE_SELF_RELATIVE) { PISECURITY_DESCRIPTOR_RELATIVE RelSD = (PISECURITY_DESCRIPTOR_RELATIVE)OriginalSecurityDescriptor; - + DescriptorCopy.Owner = (PSID)RelSD->Owner; DescriptorCopy.Group = (PSID)RelSD->Group; DescriptorCopy.Sacl = (PACL)RelSD->Sacl; @@ -496,32 +502,34 @@ SeCaptureSecurityDescriptor(IN PSECURITY_DESCRIPTOR _OriginalSecurityDescriptor, DescriptorCopy.Dacl = OriginalSecurityDescriptor->Dacl; } } - - if(DescriptorCopy.Control & SE_SELF_RELATIVE) + + if (DescriptorCopy.Control & SE_SELF_RELATIVE) { - /* in case we're dealing with a self-relative descriptor, do a basic convert - to an absolute descriptor. We do this so we can simply access the data - using the pointers without calculating them again. */ + /* + * In case we're dealing with a self-relative descriptor, do a basic convert + * to an absolute descriptor. We do this so we can simply access the data + * using the pointers without calculating them again. + */ DescriptorCopy.Control &= ~SE_SELF_RELATIVE; - if(DescriptorCopy.Owner != NULL) + if (DescriptorCopy.Owner != NULL) { DescriptorCopy.Owner = (PSID)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Owner); } - if(DescriptorCopy.Group != NULL) + if (DescriptorCopy.Group != NULL) { DescriptorCopy.Group = (PSID)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Group); } - if(DescriptorCopy.Dacl != NULL) + if (DescriptorCopy.Dacl != NULL) { DescriptorCopy.Dacl = (PACL)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Dacl); } - if(DescriptorCopy.Sacl != NULL) + if (DescriptorCopy.Sacl != NULL) { DescriptorCopy.Sacl = (PACL)((ULONG_PTR)OriginalSecurityDescriptor + (ULONG_PTR)DescriptorCopy.Sacl); } } - - /* determine the size of the SIDs */ + + /* Determine the size of the SIDs */ #define DetermineSIDSize(SidType) \ do { \ if(DescriptorCopy.SidType != NULL) \ @@ -530,7 +538,7 @@ SID *SidType = (SID*)DescriptorCopy.SidType; \ \ if(CurrentMode != KernelMode) \ { \ -/* securely access the buffers! */ \ +/* Securely access the buffers! */ \ _SEH2_TRY \ { \ SidType##SAC = ProbeForReadUchar(&SidType->SubAuthorityCount); \ @@ -555,13 +563,13 @@ DescriptorSize += ROUND_UP(SidType##Size, sizeof(ULONG)); \ } \ } \ } while(0) - + DetermineSIDSize(Owner); DetermineSIDSize(Group); - + #undef DetermineSIDSize - - /* determine the size of the ACLs */ + + /* Determine the size of the ACLs */ #define DetermineACLSize(AclType, AclFlag) \ do { \ if((DescriptorCopy.Control & SE_##AclFlag##_PRESENT) && \ @@ -571,7 +579,7 @@ PACL AclType = (PACL)DescriptorCopy.AclType; \ \ if(CurrentMode != KernelMode) \ { \ -/* securely access the buffers! */ \ +/* Securely access the buffers! */ \ _SEH2_TRY \ { \ AclType##Size = ProbeForReadUshort(&AclType->AclSize); \ @@ -598,33 +606,37 @@ else \ DescriptorCopy.AclType = NULL; \ } \ } while(0) - + DetermineACLSize(Sacl, SACL); DetermineACLSize(Dacl, DACL); - + #undef DetermineACLSize - - /* allocate enough memory to store a complete copy of a self-relative - security descriptor */ + + /* + * Allocate enough memory to store a complete copy of a self-relative + * security descriptor + */ NewDescriptor = ExAllocatePoolWithTag(PoolType, DescriptorSize, TAG_SD); - if(NewDescriptor != NULL) + if (NewDescriptor != NULL) { ULONG_PTR Offset = sizeof(SECURITY_DESCRIPTOR); - + RtlZeroMemory(NewDescriptor, DescriptorSize); NewDescriptor->Revision = DescriptorCopy.Revision; NewDescriptor->Sbz1 = DescriptorCopy.Sbz1; NewDescriptor->Control = DescriptorCopy.Control | SE_SELF_RELATIVE; - + _SEH2_TRY { - /* setup the offsets and copy the SIDs and ACLs to the new - self-relative security descriptor. Probing the pointers is not - neccessary anymore as we did that when collecting the sizes! - Make sure to validate the SIDs and ACLs *again* as they could have - been modified in the meanwhile! */ + /* + * Setup the offsets and copy the SIDs and ACLs to the new + * self-relative security descriptor. Probing the pointers is not + * neccessary anymore as we did that when collecting the sizes! + * Make sure to validate the SIDs and ACLs *again* as they could have + * been modified in the meanwhile! + */ #define CopySID(Type) \ do { \ if(DescriptorCopy.Type != NULL) \ @@ -642,12 +654,12 @@ RtlRaiseStatus(STATUS_INVALID_SID); \ Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \ } \ } while(0) - + CopySID(Owner); CopySID(Group); - + #undef CopySID - + #define CopyACL(Type) \ do { \ if(DescriptorCopy.Type != NULL) \ @@ -665,25 +677,26 @@ RtlRaiseStatus(STATUS_INVALID_ACL); \ Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \ } \ } while(0) - + CopyACL(Sacl); CopyACL(Dacl); - + #undef CopyACL } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - /* we failed to copy the data to the new descriptor */ + /* We failed to copy the data to the new descriptor */ ExFreePool(NewDescriptor); _SEH2_YIELD(return _SEH2_GetExceptionCode()); } _SEH2_END; - - /* we're finally done! copy the pointer to the captured descriptor to - to the caller */ + + /* + * We're finally done! + * Copy the pointer to the captured descriptor to to the caller. + */ *CapturedSecurityDescriptor = NewDescriptor; return STATUS_SUCCESS; - } else { @@ -692,10 +705,10 @@ Offset += ROUND_UP(Type##Size, sizeof(ULONG)); \ } else { - /* nothing to do... */ + /* Nothing to do... */ *CapturedSecurityDescriptor = NULL; } - + return Status; } @@ -721,9 +734,9 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, ULONG Control = 0; ULONG_PTR Current; ULONG SdLength; - + RelSD = (PISECURITY_DESCRIPTOR_RELATIVE)SecurityDescriptor; - + if (*ObjectsSecurityDescriptor == NULL) { if (*Length < sizeof(SECURITY_DESCRIPTOR_RELATIVE)) @@ -731,15 +744,15 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, *Length = sizeof(SECURITY_DESCRIPTOR_RELATIVE); return STATUS_BUFFER_TOO_SMALL; } - + *Length = sizeof(SECURITY_DESCRIPTOR_RELATIVE); RtlCreateSecurityDescriptorRelative(RelSD, SECURITY_DESCRIPTOR_REVISION); return STATUS_SUCCESS; } - + ObjectSd = *ObjectsSecurityDescriptor; - + /* Calculate the required security descriptor length */ Control = SE_SELF_RELATIVE; if ((*SecurityInformation & OWNER_SECURITY_INFORMATION) && @@ -749,7 +762,7 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4); Control |= (ObjectSd->Control & SE_OWNER_DEFAULTED); } - + if ((*SecurityInformation & GROUP_SECURITY_INFORMATION) && (ObjectSd->Group != NULL)) { @@ -757,7 +770,7 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, GroupLength = ROUND_UP(RtlLengthSid(Group), 4); Control |= (ObjectSd->Control & SE_GROUP_DEFAULTED); } - + if ((*SecurityInformation & DACL_SECURITY_INFORMATION) && (ObjectSd->Control & SE_DACL_PRESENT)) { @@ -766,9 +779,10 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, Dacl = (PACL)((ULONG_PTR)ObjectSd->Dacl + (ULONG_PTR)ObjectSd); DaclLength = ROUND_UP((ULONG)Dacl->AclSize, 4); } + Control |= (ObjectSd->Control & (SE_DACL_DEFAULTED | SE_DACL_PRESENT)); } - + if ((*SecurityInformation & SACL_SECURITY_INFORMATION) && (ObjectSd->Control & SE_SACL_PRESENT)) { @@ -777,9 +791,10 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, Sacl = (PACL)((ULONG_PTR)ObjectSd->Sacl + (ULONG_PTR)ObjectSd); SaclLength = ROUND_UP(Sacl->AclSize, 4); } + Control |= (ObjectSd->Control & (SE_SACL_DEFAULTED | SE_SACL_PRESENT)); } - + SdLength = OwnerLength + GroupLength + DaclLength + SaclLength + sizeof(SECURITY_DESCRIPTOR_RELATIVE); if (*Length < SdLength) @@ -787,14 +802,14 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, *Length = SdLength; return STATUS_BUFFER_TOO_SMALL; } - + /* Build the new security descrtiptor */ RtlCreateSecurityDescriptorRelative(RelSD, SECURITY_DESCRIPTOR_REVISION); RelSD->Control = (USHORT)Control; - + Current = (ULONG_PTR)(RelSD + 1); - + if (OwnerLength != 0) { RtlCopyMemory((PVOID)Current, @@ -803,7 +818,7 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, RelSD->Owner = (ULONG)(Current - (ULONG_PTR)SecurityDescriptor); Current += OwnerLength; } - + if (GroupLength != 0) { RtlCopyMemory((PVOID)Current, @@ -812,7 +827,7 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, RelSD->Group = (ULONG)(Current - (ULONG_PTR)SecurityDescriptor); Current += GroupLength; } - + if (DaclLength != 0) { RtlCopyMemory((PVOID)Current, @@ -821,7 +836,7 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, RelSD->Dacl = (ULONG)(Current - (ULONG_PTR)SecurityDescriptor); Current += DaclLength; } - + if (SaclLength != 0) { RtlCopyMemory((PVOID)Current, @@ -830,9 +845,9 @@ SeQuerySecurityDescriptorInfo(IN PSECURITY_INFORMATION SecurityInformation, RelSD->Sacl = (ULONG)(Current - (ULONG_PTR)SecurityDescriptor); Current += SaclLength; } - + *Length = SdLength; - + return STATUS_SUCCESS; } @@ -846,18 +861,20 @@ SeReleaseSecurityDescriptor(IN PSECURITY_DESCRIPTOR CapturedSecurityDescriptor, IN BOOLEAN CaptureIfKernelMode) { PAGED_CODE(); - - /* WARNING! You need to call this function with the same value for CurrentMode - and CaptureIfKernelMode that you previously passed to - SeCaptureSecurityDescriptor() in order to avoid memory leaks! */ - if(CapturedSecurityDescriptor != NULL && - (CurrentMode != KernelMode || - (CurrentMode == KernelMode && CaptureIfKernelMode))) + + /* + * WARNING! You need to call this function with the same value for CurrentMode + * and CaptureIfKernelMode that you previously passed to + * SeCaptureSecurityDescriptor() in order to avoid memory leaks! + */ + if (CapturedSecurityDescriptor != NULL && + (CurrentMode != KernelMode || + (CurrentMode == KernelMode && CaptureIfKernelMode))) { - /* only delete the descriptor when SeCaptureSecurityDescriptor() allocated one! */ + /* Only delete the descriptor when SeCaptureSecurityDescriptor() allocated one! */ ExFreePoolWithTag(CapturedSecurityDescriptor, TAG_SD); } - + return STATUS_SUCCESS; } @@ -886,26 +903,28 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, ULONG Control = 0; ULONG_PTR Current; SECURITY_INFORMATION SecurityInformation; - + ObjectSd = *ObjectsSecurityDescriptor; - + + /* The object does not have a security descriptor. */ if (!ObjectSd) - return STATUS_NO_SECURITY_ON_OBJECT; // The object does not have a security descriptor. - + return STATUS_NO_SECURITY_ON_OBJECT; + SecurityInformation = *_SecurityInformation; - + /* Get owner and owner size */ if (SecurityInformation & OWNER_SECURITY_INFORMATION) { if (SecurityDescriptor->Owner != NULL) { - if( SecurityDescriptor->Control & SE_SELF_RELATIVE ) + if (SecurityDescriptor->Control & SE_SELF_RELATIVE) Owner = (PSID)((ULONG_PTR)SecurityDescriptor->Owner + (ULONG_PTR)SecurityDescriptor); else Owner = (PSID)SecurityDescriptor->Owner; OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4); } + Control |= (SecurityDescriptor->Control & SE_OWNER_DEFAULTED); } else @@ -915,6 +934,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Owner = (PSID)((ULONG_PTR)ObjectSd->Owner + (ULONG_PTR)ObjectSd); OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4); } + Control |= (ObjectSd->Control & SE_OWNER_DEFAULTED); } @@ -930,6 +950,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Group = (PSID)SecurityDescriptor->Group; GroupLength = ROUND_UP(RtlLengthSid(Group), 4); } + Control |= (SecurityDescriptor->Control & SE_GROUP_DEFAULTED); } else @@ -939,9 +960,10 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Group = (PSID)((ULONG_PTR)ObjectSd->Group + (ULONG_PTR)ObjectSd); GroupLength = ROUND_UP(RtlLengthSid(Group), 4); } + Control |= (ObjectSd->Control & SE_GROUP_DEFAULTED); } - + /* Get DACL and DACL size */ if (SecurityInformation & DACL_SECURITY_INFORMATION) { @@ -953,9 +975,10 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, (ULONG_PTR)SecurityDescriptor); else Dacl = (PACL)SecurityDescriptor->Dacl; - + DaclLength = ROUND_UP((ULONG)Dacl->AclSize, 4); } + Control |= (SecurityDescriptor->Control & (SE_DACL_DEFAULTED | SE_DACL_PRESENT)); } else @@ -966,6 +989,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Dacl = (PACL)((ULONG_PTR)ObjectSd->Dacl + (ULONG_PTR)ObjectSd); DaclLength = ROUND_UP((ULONG)Dacl->AclSize, 4); } + Control |= (ObjectSd->Control & (SE_DACL_DEFAULTED | SE_DACL_PRESENT)); } @@ -982,6 +1006,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Sacl = (PACL)SecurityDescriptor->Sacl; SaclLength = ROUND_UP((ULONG)Sacl->AclSize, 4); } + Control |= (SecurityDescriptor->Control & (SE_SACL_DEFAULTED | SE_SACL_PRESENT)); } else @@ -992,9 +1017,10 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, Sacl = (PACL)((ULONG_PTR)ObjectSd->Sacl + (ULONG_PTR)ObjectSd); SaclLength = ROUND_UP((ULONG)Sacl->AclSize, 4); } + Control |= (ObjectSd->Control & (SE_SACL_DEFAULTED | SE_SACL_PRESENT)); } - + NewSd = ExAllocatePool(NonPagedPool, sizeof(SECURITY_DESCRIPTOR) + OwnerLength + GroupLength + DaclLength + SaclLength); @@ -1003,14 +1029,15 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, ObDereferenceObject(Object); return STATUS_INSUFFICIENT_RESOURCES; } - + RtlCreateSecurityDescriptor(NewSd, SECURITY_DESCRIPTOR_REVISION1); + /* We always build a self-relative descriptor */ NewSd->Control = (USHORT)Control | SE_SELF_RELATIVE; - + Current = (ULONG_PTR)NewSd + sizeof(SECURITY_DESCRIPTOR); - + if (OwnerLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1019,7 +1046,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, NewSd->Owner = (PSID)(Current - (ULONG_PTR)NewSd); Current += OwnerLength; } - + if (GroupLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1028,7 +1055,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, NewSd->Group = (PSID)(Current - (ULONG_PTR)NewSd); Current += GroupLength; } - + if (DaclLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1037,7 +1064,7 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, NewSd->Dacl = (PACL)(Current - (ULONG_PTR)NewSd); Current += DaclLength; } - + if (SaclLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1045,8 +1072,8 @@ SeSetSecurityDescriptorInfo(IN PVOID Object OPTIONAL, SaclLength); NewSd->Sacl = (PACL)(Current - (ULONG_PTR)NewSd); Current += SaclLength; - } - + } + *ObjectsSecurityDescriptor = NewSd; return STATUS_SUCCESS; } @@ -1065,12 +1092,13 @@ SeSetSecurityDescriptorInfoEx(IN PVOID Object OPTIONAL, IN PGENERIC_MAPPING GenericMapping) { PISECURITY_DESCRIPTOR ObjectSd = *ObjectsSecurityDescriptor; - + + /* The object does not have a security descriptor. */ if (!ObjectSd) - return STATUS_NO_SECURITY_ON_OBJECT; // The object does not have a security descriptor. - - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + return STATUS_NO_SECURITY_ON_OBJECT; + + UNIMPLEMENTED; + return STATUS_NOT_IMPLEMENTED; } @@ -1085,54 +1113,54 @@ SeValidSecurityDescriptor(IN ULONG Length, PISID Sid; PACL Acl; PISECURITY_DESCRIPTOR SecurityDescriptor = _SecurityDescriptor; - + if (Length < SECURITY_DESCRIPTOR_MIN_LENGTH) { DPRINT1("Invalid Security Descriptor revision\n"); return FALSE; } - + if (SecurityDescriptor->Revision != SECURITY_DESCRIPTOR_REVISION1) { DPRINT1("Invalid Security Descriptor revision\n"); return FALSE; } - + if (!(SecurityDescriptor->Control & SE_SELF_RELATIVE)) { DPRINT1("No self-relative Security Descriptor\n"); return FALSE; } - + SdLength = sizeof(SECURITY_DESCRIPTOR); - + /* Check Owner SID */ if (SecurityDescriptor->Owner == NULL) { DPRINT1("No Owner SID\n"); return FALSE; } - + if ((ULONG_PTR)SecurityDescriptor->Owner % sizeof(ULONG)) { DPRINT1("Invalid Owner SID alignment\n"); return FALSE; } - + Sid = (PISID)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Owner); if (Sid->Revision != SID_REVISION) { DPRINT1("Invalid Owner SID revision\n"); return FALSE; } - + SdLength += (sizeof(SID) + (Sid->SubAuthorityCount - 1) * sizeof(ULONG)); if (Length < SdLength) { DPRINT1("Invalid Owner SID size\n"); return FALSE; } - + /* Check Group SID */ if (SecurityDescriptor->Group != NULL) { @@ -1141,14 +1169,14 @@ SeValidSecurityDescriptor(IN ULONG Length, DPRINT1("Invalid Group SID alignment\n"); return FALSE; } - + Sid = (PSID)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Group); if (Sid->Revision != SID_REVISION) { DPRINT1("Invalid Group SID revision\n"); return FALSE; } - + SdLength += (sizeof(SID) + (Sid->SubAuthorityCount - 1) * sizeof(ULONG)); if (Length < SdLength) { @@ -1156,7 +1184,7 @@ SeValidSecurityDescriptor(IN ULONG Length, return FALSE; } } - + /* Check DACL */ if (SecurityDescriptor->Dacl != NULL) { @@ -1165,7 +1193,7 @@ SeValidSecurityDescriptor(IN ULONG Length, DPRINT1("Invalid DACL alignment\n"); return FALSE; } - + Acl = (PACL)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Dacl); if ((Acl->AclRevision < MIN_ACL_REVISION) && (Acl->AclRevision > MAX_ACL_REVISION)) @@ -1173,7 +1201,7 @@ SeValidSecurityDescriptor(IN ULONG Length, DPRINT1("Invalid DACL revision\n"); return FALSE; } - + SdLength += Acl->AclSize; if (Length < SdLength) { @@ -1181,7 +1209,7 @@ SeValidSecurityDescriptor(IN ULONG Length, return FALSE; } } - + /* Check SACL */ if (SecurityDescriptor->Sacl != NULL) { @@ -1190,7 +1218,7 @@ SeValidSecurityDescriptor(IN ULONG Length, DPRINT1("Invalid SACL alignment\n"); return FALSE; } - + Acl = (PACL)((ULONG_PTR)SecurityDescriptor + (ULONG_PTR)SecurityDescriptor->Sacl); if ((Acl->AclRevision < MIN_ACL_REVISION) || (Acl->AclRevision > MAX_ACL_REVISION)) @@ -1198,7 +1226,7 @@ SeValidSecurityDescriptor(IN ULONG Length, DPRINT1("Invalid SACL revision\n"); return FALSE; } - + SdLength += Acl->AclSize; if (Length < SdLength) { @@ -1206,7 +1234,7 @@ SeValidSecurityDescriptor(IN ULONG Length, return FALSE; } } - + return TRUE; } @@ -1217,13 +1245,13 @@ NTSTATUS NTAPI SeDeassignSecurity(PSECURITY_DESCRIPTOR *SecurityDescriptor) { PAGED_CODE(); - + if (*SecurityDescriptor != NULL) { ExFreePool(*SecurityDescriptor); *SecurityDescriptor = NULL; } - + return STATUS_SUCCESS; } @@ -1273,12 +1301,12 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, PSID Group = NULL; PACL Dacl = NULL; PACL Sacl = NULL; - + PAGED_CODE(); - + /* Lock subject context */ SeLockSubjectContext(SubjectContext); - + if (SubjectContext->ClientToken != NULL) { Token = SubjectContext->ClientToken; @@ -1287,18 +1315,16 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { Token = SubjectContext->PrimaryToken; } - - + /* Inherit the Owner SID */ if (ExplicitDescriptor != NULL && ExplicitDescriptor->Owner != NULL) { DPRINT("Use explicit owner sid!\n"); Owner = ExplicitDescriptor->Owner; - + if (ExplicitDescriptor->Control & SE_SELF_RELATIVE) { Owner = (PSID)(((ULONG_PTR)Owner) + (ULONG_PTR)ExplicitDescriptor); - } } else @@ -1313,13 +1339,12 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, DPRINT("Use default owner sid!\n"); Owner = SeLocalSystemSid; } - + Control |= SE_OWNER_DEFAULTED; } - + OwnerLength = ROUND_UP(RtlLengthSid(Owner), 4); - - + /* Inherit the Group SID */ if (ExplicitDescriptor != NULL && ExplicitDescriptor->Group != NULL) { @@ -1342,13 +1367,12 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, DPRINT("Use default group sid!\n"); Group = SeLocalSystemSid; } - + Control |= SE_OWNER_DEFAULTED; } - + GroupLength = ROUND_UP(RtlLengthSid(Group), 4); - - + /* Inherit the DACL */ if (ExplicitDescriptor != NULL && (ExplicitDescriptor->Control & SE_DACL_PRESENT) && @@ -1360,7 +1384,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { Dacl = (PACL)(((ULONG_PTR)Dacl) + (ULONG_PTR)ExplicitDescriptor); } - + Control |= SE_DACL_PRESENT; } else if (ParentDescriptor != NULL && @@ -1373,6 +1397,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { Dacl = (PACL)(((ULONG_PTR)Dacl) + (ULONG_PTR)ParentDescriptor); } + Control |= (SE_DACL_PRESENT | SE_DACL_DEFAULTED); } else if (Token != NULL && Token->DefaultDacl != NULL) @@ -1388,10 +1413,9 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, Dacl = NULL; Control |= (SE_DACL_PRESENT | SE_DACL_DEFAULTED); } - + DaclLength = (Dacl != NULL) ? ROUND_UP(Dacl->AclSize, 4) : 0; - - + /* Inherit the SACL */ if (ExplicitDescriptor != NULL && (ExplicitDescriptor->Control & SE_SACL_PRESENT) && @@ -1403,7 +1427,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { Sacl = (PACL)(((ULONG_PTR)Sacl) + (ULONG_PTR)ExplicitDescriptor); } - + Control |= SE_SACL_PRESENT; } else if (ParentDescriptor != NULL && @@ -1416,23 +1440,23 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, { Sacl = (PACL)(((ULONG_PTR)Sacl) + (ULONG_PTR)ParentDescriptor); } + Control |= (SE_SACL_PRESENT | SE_SACL_DEFAULTED); } - + SaclLength = (Sacl != NULL) ? ROUND_UP(Sacl->AclSize, 4) : 0; - - + /* Allocate and initialize the new security descriptor */ Length = sizeof(SECURITY_DESCRIPTOR) + OwnerLength + GroupLength + DaclLength + SaclLength; - + DPRINT("L: sizeof(SECURITY_DESCRIPTOR) %d OwnerLength %d GroupLength %d DaclLength %d SaclLength %d\n", sizeof(SECURITY_DESCRIPTOR), OwnerLength, GroupLength, DaclLength, SaclLength); - + Descriptor = ExAllocatePoolWithTag(PagedPool, Length, TAG_SD); @@ -1442,15 +1466,15 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, /* FIXME: Unlock subject context */ return STATUS_INSUFFICIENT_RESOURCES; } - + RtlZeroMemory( Descriptor, Length ); RtlCreateSecurityDescriptor(Descriptor, SECURITY_DESCRIPTOR_REVISION); - + Descriptor->Control = (USHORT)Control | SE_SELF_RELATIVE; - + Current = (ULONG_PTR)Descriptor + sizeof(SECURITY_DESCRIPTOR); - + if (SaclLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1459,7 +1483,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, Descriptor->Sacl = (PACL)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); Current += SaclLength; } - + if (DaclLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1468,7 +1492,7 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, Descriptor->Dacl = (PACL)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); Current += DaclLength; } - + if (OwnerLength != 0) { RtlCopyMemory((PVOID)Current, @@ -1479,8 +1503,10 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, DPRINT("Owner of %x at %x\n", Descriptor, Descriptor->Owner); } else + { DPRINT("Owner of %x is zero length\n", Descriptor); - + } + if (GroupLength != 0) { memmove((PVOID)Current, @@ -1488,15 +1514,15 @@ SeAssignSecurity(PSECURITY_DESCRIPTOR _ParentDescriptor OPTIONAL, GroupLength); Descriptor->Group = (PSID)((ULONG_PTR)Current - (ULONG_PTR)Descriptor); } - + /* Unlock subject context */ SeUnlockSubjectContext(SubjectContext); - + *NewDescriptor = Descriptor; - + DPRINT("Descrptor %x\n", Descriptor); ASSERT(RtlLengthSecurityDescriptor(Descriptor)); - + return STATUS_SUCCESS; } diff --git a/ntoskrnl/se/semgr.c b/ntoskrnl/se/semgr.c index de374473139..406003b0af9 100644 --- a/ntoskrnl/se/semgr.c +++ b/ntoskrnl/se/semgr.c @@ -17,13 +17,15 @@ PSE_EXPORTS SeExports = NULL; SE_EXPORTS SepExports; +ULONG SidInTokenCalls = 0; extern ULONG ExpInitializationPhase; extern ERESOURCE SepSubjectContextLock; /* PRIVATE FUNCTIONS **********************************************************/ -static BOOLEAN INIT_FUNCTION +static BOOLEAN +INIT_FUNCTION SepInitExports(VOID) { SepExports.SeCreateTokenPrivilege = SeCreateTokenPrivilege; @@ -118,6 +120,7 @@ NTAPI SepInitializationPhase1(VOID) { NTSTATUS Status; + PAGED_CODE(); /* Insert the system token into the tree */ @@ -279,8 +282,6 @@ SeDefaultObjectMethod(IN PVOID Object, return STATUS_SUCCESS; } -ULONG SidInTokenCalls = 0; - static BOOLEAN SepSidInToken(PACCESS_TOKEN _Token, PSID Sid) @@ -292,7 +293,7 @@ SepSidInToken(PACCESS_TOKEN _Token, SidInTokenCalls++; if (!(SidInTokenCalls % 10000)) DPRINT1("SidInToken Calls: %d\n", SidInTokenCalls); - + if (Token->UserAndGroupCount == 0) { return FALSE; @@ -340,7 +341,8 @@ SepTokenIsOwner(PACCESS_TOKEN Token, return SepSidInToken(Token, Sid); } -VOID NTAPI +VOID +NTAPI SeQuerySecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, OUT PACCESS_MASK DesiredAccess) { @@ -351,13 +353,15 @@ SeQuerySecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, { *DesiredAccess |= READ_CONTROL; } + if (SecurityInformation & SACL_SECURITY_INFORMATION) { *DesiredAccess |= ACCESS_SYSTEM_SECURITY; } } -VOID NTAPI +VOID +NTAPI SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, OUT PACCESS_MASK DesiredAccess) { @@ -367,10 +371,12 @@ SeSetSecurityAccessMask(IN SECURITY_INFORMATION SecurityInformation, { *DesiredAccess |= WRITE_OWNER; } + if (SecurityInformation & DACL_SECURITY_INFORMATION) { *DesiredAccess |= WRITE_DAC; } + if (SecurityInformation & SACL_SECURITY_INFORMATION) { *DesiredAccess |= ACCESS_SYSTEM_SECURITY; @@ -494,7 +500,7 @@ SepAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, { *GrantedAccess = DesiredAccess | PreviouslyGrantedAccess; } - + *AccessStatus = STATUS_SUCCESS; return TRUE; } @@ -763,7 +769,8 @@ SepGetSDGroup(IN PSECURITY_DESCRIPTOR _SecurityDescriptor) /* * @implemented */ -BOOLEAN NTAPI +BOOLEAN +NTAPI SeAccessCheck(IN PSECURITY_DESCRIPTOR SecurityDescriptor, IN PSECURITY_SUBJECT_CONTEXT SubjectSecurityContext, IN BOOLEAN SubjectContextLocked, diff --git a/ntoskrnl/se/sid.c b/ntoskrnl/se/sid.c index d70a743135a..93b8bde6d16 100644 --- a/ntoskrnl/se/sid.c +++ b/ntoskrnl/se/sid.c @@ -99,11 +99,11 @@ SepInitSecurityIDs(VOID) ULONG SidLength1; ULONG SidLength2; PULONG SubAuthority; - + SidLength0 = RtlLengthRequiredSid(0); SidLength1 = RtlLengthRequiredSid(1); SidLength2 = RtlLengthRequiredSid(2); - + /* create NullSid */ SeNullSid = ExAllocatePoolWithTag(PagedPool, SidLength1, TAG_SID); SeWorldSid = ExAllocatePoolWithTag(PagedPool, SidLength1, TAG_SID); @@ -150,9 +150,9 @@ SepInitSecurityIDs(VOID) SeAnonymousLogonSid == NULL) { FreeInitializedSids(); - return(FALSE); + return FALSE; } - + RtlInitializeSid(SeNullSid, &SeNullSidAuthority, 1); RtlInitializeSid(SeWorldSid, &SeWorldSidAuthority, 1); RtlInitializeSid(SeLocalSid, &SeLocalSidAuthority, 1); @@ -181,7 +181,7 @@ SepInitSecurityIDs(VOID) RtlInitializeSid(SeAuthenticatedUsersSid, &SeNtSidAuthority, 1); RtlInitializeSid(SeRestrictedSid, &SeNtSidAuthority, 1); RtlInitializeSid(SeAnonymousLogonSid, &SeNtSidAuthority, 1); - + SubAuthority = RtlSubAuthoritySid(SeNullSid, 0); *SubAuthority = SECURITY_NULL_RID; SubAuthority = RtlSubAuthoritySid(SeWorldSid, 0); @@ -252,8 +252,8 @@ SepInitSecurityIDs(VOID) *SubAuthority = SECURITY_RESTRICTED_CODE_RID; SubAuthority = RtlSubAuthoritySid(SeAnonymousLogonSid, 0); *SubAuthority = SECURITY_ANONYMOUS_LOGON_RID; - - return(TRUE); + + return TRUE; } NTSTATUS @@ -267,9 +267,9 @@ SepCaptureSid(IN PSID InputSid, ULONG SidSize = 0; PISID NewSid, Sid = (PISID)InputSid; NTSTATUS Status; - + PAGED_CODE(); - + if (AccessMode != KernelMode) { _SEH2_TRY @@ -289,11 +289,11 @@ SepCaptureSid(IN PSID InputSid, _SEH2_YIELD(return _SEH2_GetExceptionCode()); } _SEH2_END; - + /* allocate a SID and copy it */ NewSid = ExAllocatePool(PoolType, SidSize); - if(NewSid != NULL) + if (NewSid != NULL) { _SEH2_TRY { @@ -316,7 +316,7 @@ SepCaptureSid(IN PSID InputSid, Status = STATUS_INSUFFICIENT_RESOURCES; } } - else if(!CaptureIfKernel) + else if (!CaptureIfKernel) { *CapturedSid = InputSid; return STATUS_SUCCESS; @@ -324,16 +324,16 @@ SepCaptureSid(IN PSID InputSid, else { SidSize = RtlLengthRequiredSid(Sid->SubAuthorityCount); - + /* allocate a SID and copy it */ NewSid = ExAllocatePool(PoolType, SidSize); - if(NewSid != NULL) + if (NewSid != NULL) { RtlCopyMemory(NewSid, Sid, SidSize); - + *CapturedSid = NewSid; } else @@ -341,7 +341,7 @@ SepCaptureSid(IN PSID InputSid, Status = STATUS_INSUFFICIENT_RESOURCES; } } - + return Status; } @@ -352,10 +352,10 @@ SepReleaseSid(IN PSID CapturedSid, IN BOOLEAN CaptureIfKernel) { PAGED_CODE(); - - if(CapturedSid != NULL && - (AccessMode != KernelMode || - (AccessMode == KernelMode && CaptureIfKernel))) + + if (CapturedSid != NULL && + (AccessMode != KernelMode || + (AccessMode == KernelMode && CaptureIfKernel))) { ExFreePool(CapturedSid); } diff --git a/ntoskrnl/se/token.c b/ntoskrnl/se/token.c index 8f73312fde4..6ee52544ba4 100644 --- a/ntoskrnl/se/token.c +++ b/ntoskrnl/se/token.c @@ -25,16 +25,18 @@ ERESOURCE SepTokenLock; TOKEN_SOURCE SeSystemTokenSource = {"*SYSTEM*", {0}}; LUID SeSystemAuthenticationId = SYSTEM_LUID; -static GENERIC_MAPPING SepTokenMapping = {TOKEN_READ, +static GENERIC_MAPPING SepTokenMapping = { + TOKEN_READ, TOKEN_WRITE, TOKEN_EXECUTE, -TOKEN_ALL_ACCESS}; + TOKEN_ALL_ACCESS +}; static const INFORMATION_CLASS_INFO SeTokenInformationClass[] = { - + /* Class 0 not used, blame M$! */ ICI_SQ_SAME( 0, 0, 0), - + /* TokenUser */ ICI_SQ_SAME( sizeof(TOKEN_USER), sizeof(ULONG), ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE | ICIF_SET | ICIF_SET_SIZE_VARIABLE ), /* TokenGroups */ @@ -79,11 +81,11 @@ SepCompareTokens(IN PTOKEN FirstToken, OUT PBOOLEAN Equal) { BOOLEAN Restricted, IsEqual = FALSE; - + ASSERT(FirstToken != SecondToken); - + /* FIXME: Check if every SID that is present in either token is also present in the other one */ - + Restricted = SeTokenIsRestricted(FirstToken); if (Restricted == SeTokenIsRestricted(SecondToken)) { @@ -91,10 +93,10 @@ SepCompareTokens(IN PTOKEN FirstToken, { /* FIXME: Check if every SID that is restricted in either token is also restricted in the other one */ } - + /* FIXME: Check if every privilege that is present in either token is also present in the other one */ } - + *Equal = IsEqual; return STATUS_SUCCESS; } @@ -108,10 +110,11 @@ SepFreeProxyData(PVOID ProxyData) NTSTATUS NTAPI -SepCopyProxyData(PVOID* Dest, PVOID Src) +SepCopyProxyData(PVOID* Dest, + PVOID Src) { UNIMPLEMENTED; - return(STATUS_NOT_IMPLEMENTED); + return STATUS_NOT_IMPLEMENTED; } NTSTATUS @@ -122,24 +125,24 @@ SeExchangePrimaryToken(PEPROCESS Process, { PTOKEN OldToken; PTOKEN NewToken = (PTOKEN)NewTokenP; - + PAGED_CODE(); - + if (NewToken->TokenType != TokenPrimary) return(STATUS_BAD_TOKEN_TYPE); if (NewToken->TokenInUse) return(STATUS_TOKEN_ALREADY_IN_USE); - + /* Mark new token in use */ NewToken->TokenInUse = 1; - + /* Reference the New Token */ ObReferenceObject(NewToken); - + /* Replace the old with the new */ OldToken = ObFastReplaceObject(&Process->Token, NewToken); - + /* Mark the Old Token as free */ OldToken->TokenInUse = 0; - + *OldTokenP = (PACCESS_TOKEN)OldToken; return STATUS_SUCCESS; } @@ -149,10 +152,10 @@ NTAPI SeDeassignPrimaryToken(PEPROCESS Process) { PTOKEN OldToken; - + /* Remove the Token */ OldToken = ObFastReplaceObject(&Process->Token, NULL); - + /* Mark the Old Token as free */ OldToken->TokenInUse = 0; } @@ -163,14 +166,14 @@ RtlLengthSidAndAttributes(ULONG Count, { ULONG i; ULONG uLength; - + PAGED_CODE(); - + uLength = Count * sizeof(SID_AND_ATTRIBUTES); for (i = 0; i < Count; i++) uLength += RtlLengthSid(Src[i].Sid); - - return(uLength); + + return uLength; } @@ -181,14 +184,14 @@ SepFindPrimaryGroupAndDefaultOwner(PTOKEN Token, PSID DefaultOwner) { ULONG i; - + Token->PrimaryGroup = 0; - + if (DefaultOwner) { Token->DefaultOwnerIndex = Token->UserAndGroupCount; } - + /* Validate and set the primary group and user pointers */ for (i = 0; i < Token->UserAndGroupCount; i++) { @@ -197,24 +200,24 @@ SepFindPrimaryGroupAndDefaultOwner(PTOKEN Token, { Token->DefaultOwnerIndex = i; } - + if (RtlEqualSid(Token->UserAndGroups[i].Sid, PrimaryGroup)) { Token->PrimaryGroup = Token->UserAndGroups[i].Sid; } } - + if (Token->DefaultOwnerIndex == Token->UserAndGroupCount) { return(STATUS_INVALID_OWNER); } - + if (Token->PrimaryGroup == 0) { return(STATUS_INVALID_PRIMARY_GROUP); } - - return(STATUS_SUCCESS); + + return STATUS_SUCCESS; } @@ -233,9 +236,9 @@ SepDuplicateToken(PTOKEN Token, PVOID EndMem; PTOKEN AccessToken; NTSTATUS Status; - + PAGED_CODE(); - + Status = ObCreateObject(PreviousMode, SepTokenObjectType, ObjectAttributes, @@ -248,7 +251,7 @@ SepDuplicateToken(PTOKEN Token, if (!NT_SUCCESS(Status)) { DPRINT1("ObCreateObject() failed (Status %lx)\n", Status); - return(Status); + return Status; } /* Zero out the buffer */ @@ -258,22 +261,22 @@ SepDuplicateToken(PTOKEN Token, if (!NT_SUCCESS(Status)) { ObDereferenceObject(AccessToken); - return(Status); + return Status; } - + Status = ZwAllocateLocallyUniqueId(&AccessToken->ModifiedId); if (!NT_SUCCESS(Status)) { ObDereferenceObject(AccessToken); - return(Status); + return Status; } - + AccessToken->TokenLock = &SepTokenLock; - + AccessToken->TokenType = TokenType; AccessToken->ImpersonationLevel = Level; RtlCopyLuid(&AccessToken->AuthenticationId, &Token->AuthenticationId); - + AccessToken->TokenSource.SourceIdentifier.LowPart = Token->TokenSource.SourceIdentifier.LowPart; AccessToken->TokenSource.SourceIdentifier.HighPart = Token->TokenSource.SourceIdentifier.HighPart; memcpy(AccessToken->TokenSource.SourceName, @@ -282,18 +285,18 @@ SepDuplicateToken(PTOKEN Token, AccessToken->ExpirationTime.QuadPart = Token->ExpirationTime.QuadPart; AccessToken->UserAndGroupCount = Token->UserAndGroupCount; AccessToken->DefaultOwnerIndex = Token->DefaultOwnerIndex; - + uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount; for (i = 0; i < Token->UserAndGroupCount; i++) uLength += RtlLengthSid(Token->UserAndGroups[i].Sid); - + AccessToken->UserAndGroups = (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, uLength, 'uKOT'); - + EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount]; - + Status = RtlCopySidAndAttributesArray(AccessToken->UserAndGroupCount, Token->UserAndGroups, uLength, @@ -308,17 +311,17 @@ SepDuplicateToken(PTOKEN Token, Token->PrimaryGroup, 0); } - + if (NT_SUCCESS(Status)) { AccessToken->PrivilegeCount = Token->PrivilegeCount; - + uLength = AccessToken->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); AccessToken->Privileges = (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, uLength, 'pKOT'); - + for (i = 0; i < AccessToken->PrivilegeCount; i++) { RtlCopyLuid(&AccessToken->Privileges[i].Luid, @@ -326,8 +329,8 @@ SepDuplicateToken(PTOKEN Token, AccessToken->Privileges[i].Attributes = Token->Privileges[i].Attributes; } - - if ( Token->DefaultDacl ) + + if (Token->DefaultDacl) { AccessToken->DefaultDacl = (PACL) ExAllocatePoolWithTag(PagedPool, @@ -338,14 +341,14 @@ SepDuplicateToken(PTOKEN Token, Token->DefaultDacl->AclSize); } } - - if ( NT_SUCCESS(Status) ) + + if (NT_SUCCESS(Status)) { *NewAccessToken = AccessToken; return(STATUS_SUCCESS); } - - return(Status); + + return Status; } NTSTATUS @@ -358,7 +361,7 @@ SeSubProcessToken(IN PTOKEN ParentToken, PTOKEN NewToken; OBJECT_ATTRIBUTES ObjectAttributes; NTSTATUS Status; - + /* Initialize the attributes and duplicate it */ InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); Status = SepDuplicateToken(ParentToken, @@ -382,12 +385,12 @@ SeSubProcessToken(IN PTOKEN ParentToken, /* Set the session ID */ NewToken->SessionId = SessionId; NewToken->TokenInUse = InUse; - + /* Return the token */ *Token = NewToken; } } - + /* Return status */ return Status; } @@ -399,25 +402,25 @@ SeIsTokenChild(IN PTOKEN Token, { PTOKEN ProcessToken; LUID ProcessLuid, CallerLuid; - + /* Assume failure */ *IsChild = FALSE; - + /* Reference the process token */ ProcessToken = PsReferencePrimaryToken(PsGetCurrentProcess()); - + /* Get the ID */ ProcessLuid = ProcessToken->TokenId; - + /* Dereference the token */ ObFastDereferenceObject(&PsGetCurrentProcess()->Token, ProcessToken); - + /* Get our LUID */ CallerLuid = Token->TokenId; - + /* Compare the LUIDs */ if (RtlEqualLuid(&CallerLuid, &ProcessLuid)) *IsChild = TRUE; - + /* Return success */ return STATUS_SUCCESS; } @@ -431,9 +434,9 @@ SeCopyClientToken(IN PACCESS_TOKEN Token, { NTSTATUS Status; OBJECT_ATTRIBUTES ObjectAttributes; - + PAGED_CODE(); - + InitializeObjectAttributes(&ObjectAttributes, NULL, 0, @@ -446,21 +449,22 @@ SeCopyClientToken(IN PACCESS_TOKEN Token, Level, PreviousMode, (PTOKEN*)NewToken); - - return(Status); + + return Status; } -VOID NTAPI +VOID +NTAPI SepDeleteToken(PVOID ObjectBody) { PTOKEN AccessToken = (PTOKEN)ObjectBody; - + if (AccessToken->UserAndGroups) ExFreePool(AccessToken->UserAndGroups); - + if (AccessToken->Privileges) ExFreePool(AccessToken->Privileges); - + if (AccessToken->DefaultDacl) ExFreePool(AccessToken->DefaultDacl); } @@ -473,12 +477,12 @@ SepInitializeTokenImplementation(VOID) { UNICODE_STRING Name; OBJECT_TYPE_INITIALIZER ObjectTypeInitializer; - + ExInitializeResource(&SepTokenLock); - + DPRINT("Creating Token Object Type\n"); - - /* Initialize the Token type */ + + /* Initialize the Token type */ RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer)); RtlInitUnicodeString(&Name, L"Token"); ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer); @@ -499,14 +503,14 @@ SeAssignPrimaryToken(IN PEPROCESS Process, IN PTOKEN Token) { PAGED_CODE(); - + /* Sanity checks */ ASSERT(Token->TokenType == TokenPrimary); ASSERT(!Token->TokenInUse); - + /* Clean any previous token */ if (Process->Token.Object) SeDeassignPrimaryToken(Process); - + /* Set the new token */ ObReferenceObject(Token); Token->TokenInUse = TRUE; @@ -517,25 +521,25 @@ SeAssignPrimaryToken(IN PEPROCESS Process, NTSTATUS NTAPI SepCreateToken(OUT PHANDLE TokenHandle, - IN KPROCESSOR_MODE PreviousMode, - IN ACCESS_MASK DesiredAccess, - IN POBJECT_ATTRIBUTES ObjectAttributes, - IN TOKEN_TYPE TokenType, - IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, - IN PLUID AuthenticationId, - IN PLARGE_INTEGER ExpirationTime, - IN PSID_AND_ATTRIBUTES User, - IN ULONG GroupCount, - IN PSID_AND_ATTRIBUTES Groups, - IN ULONG GroupLength, - IN ULONG PrivilegeCount, - IN PLUID_AND_ATTRIBUTES Privileges, - IN PSID Owner, - IN PSID PrimaryGroup, - IN PACL DefaultDacl, - IN PTOKEN_SOURCE TokenSource, - IN BOOLEAN SystemToken) -{ + IN KPROCESSOR_MODE PreviousMode, + IN ACCESS_MASK DesiredAccess, + IN POBJECT_ATTRIBUTES ObjectAttributes, + IN TOKEN_TYPE TokenType, + IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel, + IN PLUID AuthenticationId, + IN PLARGE_INTEGER ExpirationTime, + IN PSID_AND_ATTRIBUTES User, + IN ULONG GroupCount, + IN PSID_AND_ATTRIBUTES Groups, + IN ULONG GroupLength, + IN ULONG PrivilegeCount, + IN PLUID_AND_ATTRIBUTES Privileges, + IN PSID Owner, + IN PSID PrimaryGroup, + IN PACL DefaultDacl, + IN PTOKEN_SOURCE TokenSource, + IN BOOLEAN SystemToken) +{ PTOKEN AccessToken; LUID TokenId; LUID ModifiedId; @@ -544,7 +548,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, ULONG i; NTSTATUS Status; ULONG TokenFlags = 0; - + /* Loop all groups */ for (i = 0; i < GroupCount; i++) { @@ -554,7 +558,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, /* Force them to be enabled */ Groups[i].Attributes |= (SE_GROUP_ENABLED | SE_GROUP_ENABLED_BY_DEFAULT); } - + /* Check of the group is an admin group */ if (RtlEqualSid(SeAliasAdminsSid, Groups[i].Sid)) { @@ -562,7 +566,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, TokenFlags |= TOKEN_HAS_ADMIN_GROUP; } } - + /* Loop all privileges */ for (i = 0; i < PrivilegeCount; i++) { @@ -577,12 +581,12 @@ SepCreateToken(OUT PHANDLE TokenHandle, Status = ZwAllocateLocallyUniqueId(&TokenId); if (!NT_SUCCESS(Status)) - return(Status); - + return Status; + Status = ZwAllocateLocallyUniqueId(&ModifiedId); if (!NT_SUCCESS(Status)) - return(Status); - + return Status; + Status = ObCreateObject(PreviousMode, SepTokenObjectType, ObjectAttributes, @@ -595,50 +599,50 @@ SepCreateToken(OUT PHANDLE TokenHandle, if (!NT_SUCCESS(Status)) { DPRINT1("ObCreateObject() failed (Status %lx)\n"); - return(Status); + return Status; } /* Zero out the buffer */ RtlZeroMemory(AccessToken, sizeof(TOKEN)); - + AccessToken->TokenLock = &SepTokenLock; - + RtlCopyLuid(&AccessToken->TokenSource.SourceIdentifier, &TokenSource->SourceIdentifier); memcpy(AccessToken->TokenSource.SourceName, TokenSource->SourceName, sizeof(TokenSource->SourceName)); - + RtlCopyLuid(&AccessToken->TokenId, &TokenId); RtlCopyLuid(&AccessToken->AuthenticationId, AuthenticationId); AccessToken->ExpirationTime = *ExpirationTime; RtlCopyLuid(&AccessToken->ModifiedId, &ModifiedId); - + AccessToken->UserAndGroupCount = GroupCount + 1; AccessToken->PrivilegeCount = PrivilegeCount; - + AccessToken->TokenFlags = TokenFlags; AccessToken->TokenType = TokenType; AccessToken->ImpersonationLevel = ImpersonationLevel; - + /* * Normally we would just point these members into the variable information * area; however, our ObCreateObject() call can't allocate a variable information * area, so we allocate them seperately and provide a destroy function. */ - + uLength = sizeof(SID_AND_ATTRIBUTES) * AccessToken->UserAndGroupCount; uLength += RtlLengthSid(User); for (i = 0; i < GroupCount; i++) uLength += RtlLengthSid(Groups[i].Sid); - + AccessToken->UserAndGroups = (PSID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, uLength, 'uKOT'); - + EndMem = &AccessToken->UserAndGroups[AccessToken->UserAndGroupCount]; - + Status = RtlCopySidAndAttributesArray(1, User, uLength, @@ -656,7 +660,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, &EndMem, &uLength); } - + if (NT_SUCCESS(Status)) { Status = SepFindPrimaryGroupAndDefaultOwner( @@ -664,7 +668,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, PrimaryGroup, Owner); } - + if (NT_SUCCESS(Status)) { uLength = PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES); @@ -672,7 +676,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, (PLUID_AND_ATTRIBUTES)ExAllocatePoolWithTag(PagedPool, uLength, 'pKOT'); - + if (PreviousMode != KernelMode) { _SEH2_TRY @@ -694,7 +698,7 @@ SepCreateToken(OUT PHANDLE TokenHandle, PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)); } } - + if (NT_SUCCESS(Status)) { AccessToken->DefaultDacl = @@ -705,16 +709,15 @@ SepCreateToken(OUT PHANDLE TokenHandle, DefaultDacl, DefaultDacl->AclSize); } - + if (!SystemToken) { - - Status = ObInsertObject ((PVOID)AccessToken, - NULL, - DesiredAccess, - 0, - NULL, - TokenHandle); + Status = ObInsertObject((PVOID)AccessToken, + NULL, + DesiredAccess, + 0, + NULL, + TokenHandle); if (!NT_SUCCESS(Status)) { DPRINT1("ObInsertObject() failed (Status %lx)\n", Status); @@ -745,24 +748,24 @@ SepCreateSystemProcessToken(VOID) ULONG i; PTOKEN Token; NTSTATUS Status; - + /* Don't ever expire */ Expiration.QuadPart = -1; - + /* All groups mandatory and enabled */ GroupAttributes = SE_GROUP_ENABLED | SE_GROUP_MANDATORY | SE_GROUP_ENABLED_BY_DEFAULT; OwnerAttributes = SE_GROUP_ENABLED | SE_GROUP_OWNER | SE_GROUP_ENABLED_BY_DEFAULT; - + /* User is system */ UserSid.Sid = SeLocalSystemSid; UserSid.Attributes = 0; - + /* Primary group is local system */ PrimaryGroup = SeLocalSystemSid; - + /* Owner is admins */ Owner = SeAliasAdminsSid; - + /* Groups are admins, world, and authenticated users */ Groups[0].Sid = SeAliasAdminsSid; Groups[0].Attributes = OwnerAttributes; @@ -780,69 +783,69 @@ SepCreateSystemProcessToken(VOID) i = 0; Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeTcbPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeCreateTokenPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeTakeOwnershipPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeCreatePagefilePrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeLockMemoryPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeAssignPrimaryTokenPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeIncreaseQuotaPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeIncreaseBasePriorityPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeCreatePermanentPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeDebugPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeAuditPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeSecurityPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeSystemEnvironmentPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeChangeNotifyPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeBackupPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeRestorePrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeShutdownPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeLoadDriverPrivilege; - - Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT|SE_PRIVILEGE_ENABLED; + + Privileges[i].Attributes = SE_PRIVILEGE_ENABLED_BY_DEFAULT | SE_PRIVILEGE_ENABLED; Privileges[i++].Luid = SeProfileSingleProcessPrivilege; - + Privileges[i].Attributes = 0; Privileges[i++].Luid = SeSystemtimePrivilege; ASSERT(i == 20); - + /* Setup the object attributes */ InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); ASSERT(SeSystemDefaultDacl != NULL); - + /* Create the token */ Status = SepCreateToken((PHANDLE)&Token, KernelMode, @@ -864,13 +867,13 @@ SepCreateSystemProcessToken(VOID) &SeSystemTokenSource, TRUE); ASSERT(Status == STATUS_SUCCESS); - + /* Return the token */ return Token; } /* PUBLIC FUNCTIONS ***********************************************************/ - + /* * @unimplemented */ @@ -915,14 +918,15 @@ SeQuerySessionIdToken(IN PACCESS_TOKEN Token, /* * @implemented */ -NTSTATUS NTAPI +NTSTATUS +NTAPI SeQueryAuthenticationIdToken(IN PACCESS_TOKEN Token, OUT PLUID LogonId) { PAGED_CODE(); - + *LogonId = ((PTOKEN)Token)->AuthenticationId; - + return STATUS_SUCCESS; } @@ -935,7 +939,7 @@ NTAPI SeTokenImpersonationLevel(IN PACCESS_TOKEN Token) { PAGED_CODE(); - + return ((PTOKEN)Token)->ImpersonationLevel; } @@ -947,7 +951,7 @@ TOKEN_TYPE NTAPI SeTokenType(IN PACCESS_TOKEN Token) { PAGED_CODE(); - + return ((PTOKEN)Token)->TokenType; } @@ -960,6 +964,7 @@ NTAPI SeTokenIsAdmin(IN PACCESS_TOKEN Token) { PAGED_CODE(); + return (((PTOKEN)Token)->TokenFlags & TOKEN_WRITE_RESTRICTED) != 0; } @@ -971,6 +976,7 @@ NTAPI SeTokenIsRestricted(IN PACCESS_TOKEN Token) { PAGED_CODE(); + return (((PTOKEN)Token)->TokenFlags & TOKEN_IS_RESTRICTED) != 0; } @@ -982,6 +988,7 @@ NTAPI SeTokenIsWriteRestricted(IN PACCESS_TOKEN Token) { PAGED_CODE(); + return (((PTOKEN)Token)->TokenFlags & TOKEN_HAS_RESTORE_PRIVILEGE) != 0; } @@ -1006,11 +1013,11 @@ NtQueryInformationToken(IN HANDLE TokenHandle, ULONG RequiredLength; KPROCESSOR_MODE PreviousMode; NTSTATUS Status = STATUS_SUCCESS; - + PAGED_CODE(); - + PreviousMode = ExGetPreviousMode(); - + /* Check buffers and class validity */ Status = DefaultQueryInfoBufferCheck(TokenInformationClass, SeTokenInformationClass, @@ -1020,13 +1027,12 @@ NtQueryInformationToken(IN HANDLE TokenHandle, ReturnLength, NULL, PreviousMode); - - if(!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { DPRINT("NtQueryInformationToken() failed, Status: 0x%x\n", Status); return Status; } - + Status = ObReferenceObjectByHandle(TokenHandle, (TokenInformationClass == TokenSource) ? TOKEN_QUERY_SOURCE : TOKEN_QUERY, SepTokenObjectType, @@ -1040,14 +1046,14 @@ NtQueryInformationToken(IN HANDLE TokenHandle, case TokenUser: { PTOKEN_USER tu = (PTOKEN_USER)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenUser)\n"); RequiredLength = sizeof(TOKEN_USER) + RtlLengthSid(Token->UserAndGroups[0].Sid); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { Status = RtlCopySidAndAttributesArray(1, &Token->UserAndGroups[0], @@ -1061,8 +1067,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1072,27 +1078,27 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenGroups: { PTOKEN_GROUPS tg = (PTOKEN_GROUPS)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenGroups)\n"); RequiredLength = sizeof(tg->GroupCount) + RtlLengthSidAndAttributes(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1]); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { ULONG SidLen = RequiredLength - sizeof(tg->GroupCount) - ((Token->UserAndGroupCount - 1) * sizeof(SID_AND_ATTRIBUTES)); PSID_AND_ATTRIBUTES Sid = (PSID_AND_ATTRIBUTES)((ULONG_PTR)TokenInformation + sizeof(tg->GroupCount) + ((Token->UserAndGroupCount - 1) * sizeof(SID_AND_ATTRIBUTES))); - + tg->GroupCount = Token->UserAndGroupCount - 1; Status = RtlCopySidAndAttributesArray(Token->UserAndGroupCount - 1, &Token->UserAndGroups[1], @@ -1106,8 +1112,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1117,21 +1123,21 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenPrivileges: { PTOKEN_PRIVILEGES tp = (PTOKEN_PRIVILEGES)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenPrivileges)\n"); RequiredLength = sizeof(tp->PrivilegeCount) + (Token->PrivilegeCount * sizeof(LUID_AND_ATTRIBUTES)); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { tp->PrivilegeCount = Token->PrivilegeCount; RtlCopyLuidAndAttributesArray(Token->PrivilegeCount, @@ -1142,8 +1148,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1153,22 +1159,22 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenOwner: { ULONG SidLen; PTOKEN_OWNER to = (PTOKEN_OWNER)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenOwner)\n"); SidLen = RtlLengthSid(Token->UserAndGroups[Token->DefaultOwnerIndex].Sid); RequiredLength = sizeof(TOKEN_OWNER) + SidLen; - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { to->Owner = (PSID)(to + 1); Status = RtlCopySid(SidLen, @@ -1179,8 +1185,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1190,22 +1196,22 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenPrimaryGroup: { ULONG SidLen; PTOKEN_PRIMARY_GROUP tpg = (PTOKEN_PRIMARY_GROUP)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenPrimaryGroup)\n"); SidLen = RtlLengthSid(Token->PrimaryGroup); RequiredLength = sizeof(TOKEN_PRIMARY_GROUP) + SidLen; - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { tpg->PrimaryGroup = (PSID)(tpg + 1); Status = RtlCopySid(SidLen, @@ -1216,8 +1222,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1227,27 +1233,27 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenDefaultDacl: { PTOKEN_DEFAULT_DACL tdd = (PTOKEN_DEFAULT_DACL)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenDefaultDacl)\n"); RequiredLength = sizeof(TOKEN_DEFAULT_DACL); - - if(Token->DefaultDacl != NULL) + + if (Token->DefaultDacl != NULL) { RequiredLength += Token->DefaultDacl->AclSize; } - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { - if(Token->DefaultDacl != NULL) + if (Token->DefaultDacl != NULL) { tdd->DefaultDacl = (PACL)(tdd + 1); RtlCopyMemory(tdd->DefaultDacl, @@ -1263,8 +1269,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1274,20 +1280,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenSource: { PTOKEN_SOURCE ts = (PTOKEN_SOURCE)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenSource)\n"); RequiredLength = sizeof(TOKEN_SOURCE); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { *ts = Token->TokenSource; } @@ -1295,8 +1301,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1306,20 +1312,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenType: { PTOKEN_TYPE tt = (PTOKEN_TYPE)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenType)\n"); RequiredLength = sizeof(TOKEN_TYPE); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { *tt = Token->TokenType; } @@ -1327,8 +1333,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1338,14 +1344,14 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenImpersonationLevel: { PSECURITY_IMPERSONATION_LEVEL sil = (PSECURITY_IMPERSONATION_LEVEL)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenImpersonationLevel)\n"); /* Fail if the token is not an impersonation token */ @@ -1356,10 +1362,10 @@ NtQueryInformationToken(IN HANDLE TokenHandle, } RequiredLength = sizeof(SECURITY_IMPERSONATION_LEVEL); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { *sil = Token->ImpersonationLevel; } @@ -1367,8 +1373,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1378,20 +1384,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenStatistics: { PTOKEN_STATISTICS ts = (PTOKEN_STATISTICS)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenStatistics)\n"); RequiredLength = sizeof(TOKEN_STATISTICS); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { ts->TokenId = Token->TokenId; ts->AuthenticationId = Token->AuthenticationId; @@ -1408,8 +1414,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1419,20 +1425,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenOrigin: { PTOKEN_ORIGIN to = (PTOKEN_ORIGIN)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenOrigin)\n"); RequiredLength = sizeof(TOKEN_ORIGIN); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { RtlCopyLuid(&to->OriginatingLogonSession, &Token->AuthenticationId); @@ -1441,8 +1447,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1452,32 +1458,32 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenGroupsAndPrivileges: DPRINT1("NtQueryInformationToken(TokenGroupsAndPrivileges) not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + case TokenRestrictedSids: { PTOKEN_GROUPS tg = (PTOKEN_GROUPS)TokenInformation; - + DPRINT("NtQueryInformationToken(TokenRestrictedSids)\n"); RequiredLength = sizeof(tg->GroupCount) + RtlLengthSidAndAttributes(Token->RestrictedSidCount, Token->RestrictedSids); - + _SEH2_TRY { - if(TokenInformationLength >= RequiredLength) + if (TokenInformationLength >= RequiredLength) { ULONG SidLen = RequiredLength - sizeof(tg->GroupCount) - (Token->RestrictedSidCount * sizeof(SID_AND_ATTRIBUTES)); PSID_AND_ATTRIBUTES Sid = (PSID_AND_ATTRIBUTES)((ULONG_PTR)TokenInformation + sizeof(tg->GroupCount) + (Token->RestrictedSidCount * sizeof(SID_AND_ATTRIBUTES))); - + tg->GroupCount = Token->RestrictedSidCount; Status = RtlCopySidAndAttributesArray(Token->RestrictedSidCount, Token->RestrictedSids, @@ -1491,8 +1497,8 @@ NtQueryInformationToken(IN HANDLE TokenHandle, { Status = STATUS_BUFFER_TOO_SMALL; } - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = RequiredLength; } @@ -1502,32 +1508,32 @@ NtQueryInformationToken(IN HANDLE TokenHandle, Status = _SEH2_GetExceptionCode(); } _SEH2_END; - + break; } - + case TokenSandBoxInert: DPRINT1("NtQueryInformationToken(TokenSandboxInert) not implemented\n"); Status = STATUS_NOT_IMPLEMENTED; break; - + case TokenSessionId: { ULONG SessionId = 0; - + DPRINT("NtQueryInformationToken(TokenSessionId)\n"); - + Status = SeQuerySessionIdToken(Token, &SessionId); - - if(NT_SUCCESS(Status)) + + if (NT_SUCCESS(Status)) { _SEH2_TRY { /* buffer size was already verified, no need to check here again */ *(PULONG)TokenInformation = SessionId; - - if(ReturnLength != NULL) + + if (ReturnLength != NULL) { *ReturnLength = sizeof(ULONG); } @@ -1538,20 +1544,20 @@ NtQueryInformationToken(IN HANDLE TokenHandle, } _SEH2_END; } - + break; } - + default: DPRINT1("NtQueryInformationToken(%d) invalid information class\n", TokenInformationClass); Status = STATUS_INVALID_INFO_CLASS; break; } - + ObDereferenceObject(Token); } - - return(Status); + + return Status; } @@ -1571,30 +1577,29 @@ NtSetInformationToken(IN HANDLE TokenHandle, KPROCESSOR_MODE PreviousMode; ULONG NeededAccess = TOKEN_ADJUST_DEFAULT; NTSTATUS Status; - + PAGED_CODE(); - + PreviousMode = ExGetPreviousMode(); - + Status = DefaultSetInfoBufferCheck(TokenInformationClass, SeTokenInformationClass, sizeof(SeTokenInformationClass) / sizeof(SeTokenInformationClass[0]), TokenInformation, TokenInformationLength, PreviousMode); - - if(!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { /* Invalid buffers */ DPRINT("NtSetInformationToken() failed, Status: 0x%x\n", Status); return Status; } - - if(TokenInformationClass == TokenSessionId) + + if (TokenInformationClass == TokenSessionId) { NeededAccess |= TOKEN_ADJUST_SESSIONID; } - + Status = ObReferenceObjectByHandle(TokenHandle, NeededAccess, SepTokenObjectType, @@ -1607,11 +1612,11 @@ NtSetInformationToken(IN HANDLE TokenHandle, { case TokenOwner: { - if(TokenInformationLength >= sizeof(TOKEN_OWNER)) + if (TokenInformationLength >= sizeof(TOKEN_OWNER)) { PTOKEN_OWNER to = (PTOKEN_OWNER)TokenInformation; PSID InputSid = NULL, CapturedSid; - + _SEH2_TRY { InputSid = to->Owner; @@ -1621,13 +1626,13 @@ NtSetInformationToken(IN HANDLE TokenHandle, _SEH2_YIELD(return _SEH2_GetExceptionCode()); } _SEH2_END; - + Status = SepCaptureSid(InputSid, PreviousMode, PagedPool, FALSE, &CapturedSid); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { RtlCopySid(RtlLengthSid(CapturedSid), Token->UserAndGroups[Token->DefaultOwnerIndex].Sid, @@ -1643,14 +1648,14 @@ NtSetInformationToken(IN HANDLE TokenHandle, } break; } - + case TokenPrimaryGroup: { - if(TokenInformationLength >= sizeof(TOKEN_PRIMARY_GROUP)) + if (TokenInformationLength >= sizeof(TOKEN_PRIMARY_GROUP)) { PTOKEN_PRIMARY_GROUP tpg = (PTOKEN_PRIMARY_GROUP)TokenInformation; PSID InputSid = NULL, CapturedSid; - + _SEH2_TRY { InputSid = tpg->PrimaryGroup; @@ -1660,13 +1665,13 @@ NtSetInformationToken(IN HANDLE TokenHandle, _SEH2_YIELD(return _SEH2_GetExceptionCode()); } _SEH2_END; - + Status = SepCaptureSid(InputSid, PreviousMode, PagedPool, FALSE, &CapturedSid); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { RtlCopySid(RtlLengthSid(CapturedSid), Token->PrimaryGroup, @@ -1682,14 +1687,14 @@ NtSetInformationToken(IN HANDLE TokenHandle, } break; } - + case TokenDefaultDacl: { - if(TokenInformationLength >= sizeof(TOKEN_DEFAULT_DACL)) + if (TokenInformationLength >= sizeof(TOKEN_DEFAULT_DACL)) { PTOKEN_DEFAULT_DACL tdd = (PTOKEN_DEFAULT_DACL)TokenInformation; PACL InputAcl = NULL; - + _SEH2_TRY { InputAcl = tdd->DefaultDacl; @@ -1700,32 +1705,32 @@ NtSetInformationToken(IN HANDLE TokenHandle, } _SEH2_END; - if(InputAcl != NULL) + if (InputAcl != NULL) { PACL CapturedAcl; - /* capture and copy the dacl */ + /* Capture and copy the dacl */ Status = SepCaptureAcl(InputAcl, PreviousMode, PagedPool, TRUE, &CapturedAcl); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { - /* free the previous dacl if present */ + /* Free the previous dacl if present */ if(Token->DefaultDacl != NULL) { ExFreePool(Token->DefaultDacl); } - /* set the new dacl */ + /* Set the new dacl */ Token->DefaultDacl = CapturedAcl; } } else { - /* clear and free the default dacl if present */ - if(Token->DefaultDacl != NULL) + /* Clear and free the default dacl if present */ + if (Token->DefaultDacl != NULL) { ExFreePool(Token->DefaultDacl); Token->DefaultDacl = NULL; @@ -1738,14 +1743,14 @@ NtSetInformationToken(IN HANDLE TokenHandle, } break; } - + case TokenSessionId: { ULONG SessionId = 0; - + _SEH2_TRY { - /* buffer size was already verified, no need to check here again */ + /* Buffer size was already verified, no need to check here again */ SessionId = *(PULONG)TokenInformation; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -1753,9 +1758,9 @@ NtSetInformationToken(IN HANDLE TokenHandle, _SEH2_YIELD(return _SEH2_GetExceptionCode()); } _SEH2_END; - - if(!SeSinglePrivilegeCheck(SeTcbPrivilege, - PreviousMode)) + + if (!SeSinglePrivilegeCheck(SeTcbPrivilege, + PreviousMode)) { Status = STATUS_PRIVILEGE_NOT_HELD; break; @@ -1764,18 +1769,18 @@ NtSetInformationToken(IN HANDLE TokenHandle, Token->SessionId = SessionId; break; } - + default: { Status = STATUS_NOT_IMPLEMENTED; break; } } - + ObDereferenceObject(Token); } - - return(Status); + + return Status; } @@ -1801,12 +1806,13 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle, PTOKEN NewToken; PSECURITY_QUALITY_OF_SERVICE CapturedSecurityQualityOfService; BOOLEAN QoSPresent; + OBJECT_HANDLE_INFORMATION HandleInformation; NTSTATUS Status; - + PAGED_CODE(); - + PreviousMode = KeGetPreviousMode(); - + if (PreviousMode != KernelMode) { _SEH2_TRY @@ -1820,66 +1826,103 @@ NtDuplicateToken(IN HANDLE ExistingTokenHandle, } _SEH2_END; } - + Status = SepCaptureSecurityQualityOfService(ObjectAttributes, PreviousMode, PagedPool, FALSE, &CapturedSecurityQualityOfService, &QoSPresent); - if(!NT_SUCCESS(Status)) + if (!NT_SUCCESS(Status)) { DPRINT1("NtDuplicateToken() failed to capture QoS! Status: 0x%x\n", Status); return Status; } - + Status = ObReferenceObjectByHandle(ExistingTokenHandle, TOKEN_DUPLICATE, SepTokenObjectType, PreviousMode, (PVOID*)&Token, - NULL); - if (NT_SUCCESS(Status)) + &HandleInformation); + if (!NT_SUCCESS(Status)) { - Status = SepDuplicateToken(Token, - ObjectAttributes, - EffectiveOnly, - TokenType, - (QoSPresent ? CapturedSecurityQualityOfService->ImpersonationLevel : SecurityAnonymous), - PreviousMode, - &NewToken); - - ObDereferenceObject(Token); - - if (NT_SUCCESS(Status)) + SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService, + PreviousMode, + FALSE); + return Status; + } + + /* + * Fail, if the original token is an impersonation token and the caller + * tries to raise the impersonation level of the new token above the + * impersonation level of the original token. + */ + if (Token->TokenType == TokenImpersonation) + { + if (QoSPresent && + CapturedSecurityQualityOfService->ImpersonationLevel >Token->ImpersonationLevel) { - Status = ObInsertObject((PVOID)NewToken, - NULL, - DesiredAccess, - 0, - NULL, - &hToken); - - if (NT_SUCCESS(Status)) - { - _SEH2_TRY - { - *NewTokenHandle = hToken; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - Status = _SEH2_GetExceptionCode(); - } - _SEH2_END; - } + ObDereferenceObject(Token); + SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService, + PreviousMode, + FALSE); + return STATUS_BAD_IMPERSONATION_LEVEL; } } - - /* free the captured structure */ + + /* + * Fail, if a primary token is to be created from an impersonation token + * and and the impersonation level of the impersonation token is below SecurityImpersonation. + */ + if (Token->TokenType == TokenImpersonation && + TokenType == TokenPrimary && + Token->ImpersonationLevel < SecurityImpersonation) + { + ObDereferenceObject(Token); + SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService, + PreviousMode, + FALSE); + return STATUS_BAD_IMPERSONATION_LEVEL; + } + + Status = SepDuplicateToken(Token, + ObjectAttributes, + EffectiveOnly, + TokenType, + (QoSPresent ? CapturedSecurityQualityOfService->ImpersonationLevel : SecurityAnonymous), + PreviousMode, + &NewToken); + + ObDereferenceObject(Token); + + if (NT_SUCCESS(Status)) + { + Status = ObInsertObject((PVOID)NewToken, + NULL, + (DesiredAccess ? DesiredAccess : HandleInformation.GrantedAccess), + 0, + NULL, + &hToken); + if (NT_SUCCESS(Status)) + { + _SEH2_TRY + { + *NewTokenHandle = hToken; + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + Status = _SEH2_GetExceptionCode(); + } + _SEH2_END; + } + } + + /* Free the captured structure */ SepReleaseSecurityQualityOfService(CapturedSecurityQualityOfService, PreviousMode, FALSE); - + return Status; } @@ -1899,12 +1942,12 @@ NtAdjustGroupsToken(IN HANDLE TokenHandle, * @implemented */ NTSTATUS NTAPI -NtAdjustPrivilegesToken (IN HANDLE TokenHandle, - IN BOOLEAN DisableAllPrivileges, - IN PTOKEN_PRIVILEGES NewState, - IN ULONG BufferLength, - OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, - OUT PULONG ReturnLength OPTIONAL) +NtAdjustPrivilegesToken(IN HANDLE TokenHandle, + IN BOOLEAN DisableAllPrivileges, + IN PTOKEN_PRIVILEGES NewState, + IN ULONG BufferLength, + OUT PTOKEN_PRIVILEGES PreviousState OPTIONAL, + OUT PULONG ReturnLength OPTIONAL) { // PLUID_AND_ATTRIBUTES Privileges; KPROCESSOR_MODE PreviousMode; @@ -1921,11 +1964,11 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, ULONG c; #endif NTSTATUS Status; - + PAGED_CODE(); - + DPRINT ("NtAdjustPrivilegesToken() called\n"); - + // PrivilegeCount = NewState->PrivilegeCount; PreviousMode = KeGetPreviousMode (); // SeCaptureLuidAndAttributesArray(NewState->Privileges, @@ -1937,7 +1980,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, // 1, // &Privileges, // &Length); - + Status = ObReferenceObjectByHandle (TokenHandle, TOKEN_ADJUST_PRIVILEGES | (PreviousState != NULL ? TOKEN_QUERY : 0), SepTokenObjectType, @@ -1952,8 +1995,8 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, // 0); return Status; } - - + + #if 0 SepAdjustPrivileges(Token, 0, @@ -1965,13 +2008,13 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, &b, &c); #endif - + PrivilegeCount = (BufferLength - FIELD_OFFSET(TOKEN_PRIVILEGES, Privileges)) / sizeof(LUID_AND_ATTRIBUTES); - + if (PreviousState != NULL) PreviousState->PrivilegeCount = 0; - + k = 0; if (DisableAllPrivileges == TRUE) { @@ -1980,7 +2023,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, if (Token->Privileges[i].Attributes != 0) { DPRINT ("Attributes differ\n"); - + /* Save current privilege */ if (PreviousState != NULL) { @@ -1992,18 +2035,21 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, } else { - /* FIXME: Should revert all the changes, calculate how + /* + * FIXME: Should revert all the changes, calculate how * much space would be needed, set ResultLength * accordingly and fail. */ } + k++; } - + /* Update current privlege */ Token->Privileges[i].Attributes &= ~SE_PRIVILEGE_ENABLED; } } + Status = STATUS_SUCCESS; } else @@ -2017,7 +2063,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, Token->Privileges[i].Luid.HighPart == NewState->Privileges[j].Luid.HighPart) { DPRINT ("Found privilege\n"); - + if ((Token->Privileges[i].Attributes & SE_PRIVILEGE_ENABLED) != (NewState->Privileges[j].Attributes & SE_PRIVILEGE_ENABLED)) { @@ -2025,7 +2071,7 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, DPRINT ("Current attributes %lx desired attributes %lx\n", Token->Privileges[i].Attributes, NewState->Privileges[j].Attributes); - + /* Save current privilege */ if (PreviousState != NULL) { @@ -2037,14 +2083,16 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, } else { - /* FIXME: Should revert all the changes, calculate how + /* + * FIXME: Should revert all the changes, calculate how * much space would be needed, set ResultLength * accordingly and fail. */ } + k++; } - + /* Update current privlege */ Token->Privileges[i].Attributes &= ~SE_PRIVILEGE_ENABLED; Token->Privileges[i].Attributes |= @@ -2052,27 +2100,29 @@ NtAdjustPrivilegesToken (IN HANDLE TokenHandle, DPRINT ("New attributes %lx\n", Token->Privileges[i].Attributes); } + Count++; } } } + Status = Count < NewState->PrivilegeCount ? STATUS_NOT_ALL_ASSIGNED : STATUS_SUCCESS; } - + if (ReturnLength != NULL) { *ReturnLength = sizeof(TOKEN_PRIVILEGES) + (sizeof(LUID_AND_ATTRIBUTES) * (k - 1)); } - + ObDereferenceObject (Token); - + // SeReleaseLuidAndAttributesArray(Privileges, // PreviousMode, // 0); - + DPRINT ("NtAdjustPrivilegesToken() done\n"); - + return Status; } @@ -2097,12 +2147,12 @@ NtCreateToken(OUT PHANDLE TokenHandle, ULONG nTokenPrivileges = 0; LARGE_INTEGER LocalExpirationTime = {{0, 0}}; NTSTATUS Status; - + PAGED_CODE(); - + PreviousMode = ExGetPreviousMode(); - - if(PreviousMode != KernelMode) + + if (PreviousMode != KernelMode) { _SEH2_TRY { @@ -2146,7 +2196,7 @@ NtCreateToken(OUT PHANDLE TokenHandle, nTokenPrivileges = TokenPrivileges->PrivilegeCount; LocalExpirationTime = *ExpirationTime; } - + Status = SepCreateToken(&hToken, PreviousMode, DesiredAccess, @@ -2178,7 +2228,7 @@ NtCreateToken(OUT PHANDLE TokenHandle, } _SEH2_END; } - + return Status; } @@ -2204,11 +2254,11 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, PACL Dacl = NULL; KPROCESSOR_MODE PreviousMode; NTSTATUS Status; - + PAGED_CODE(); - + PreviousMode = ExGetPreviousMode(); - + if (PreviousMode != KernelMode) { _SEH2_TRY @@ -2222,12 +2272,12 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, } _SEH2_END; } - + /* * At first open the thread token for information access and verify * that the token associated with thread is valid. */ - + Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_QUERY_INFORMATION, PsThreadType, PreviousMode, (PVOID*)&Thread, NULL); @@ -2235,7 +2285,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, { return Status; } - + Token = PsReferenceImpersonationToken(Thread, &CopyOnOpen, &EffectiveOnly, &ImpersonationLevel); if (Token == NULL) @@ -2243,23 +2293,23 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, ObDereferenceObject(Thread); return STATUS_NO_TOKEN; } - + if (ImpersonationLevel == SecurityAnonymous) { PsDereferenceImpersonationToken(Token); ObDereferenceObject(Thread); return STATUS_CANT_OPEN_ANONYMOUS; } - + /* * Revert to self if OpenAsSelf is specified. */ - + if (OpenAsSelf) { PsDisableImpersonation(PsGetCurrentThread(), &ImpersonationState); } - + if (CopyOnOpen) { Status = ObReferenceObjectByHandle(ThreadHandle, THREAD_ALL_ACCESS, @@ -2268,11 +2318,11 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, if (NT_SUCCESS(Status)) { PrimaryToken = PsReferencePrimaryToken(NewThread->ThreadsProcess); - + Status = SepCreateImpersonationTokenDacl(Token, PrimaryToken, &Dacl); ObFastDereferenceObject(&NewThread->ThreadsProcess->Token, PrimaryToken); - + if (NT_SUCCESS(Status)) { if (Dacl) @@ -2282,10 +2332,10 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, RtlSetDaclSecurityDescriptor(&SecurityDescriptor, TRUE, Dacl, FALSE); } - + InitializeObjectAttributes(&ObjectAttributes, NULL, HandleAttributes, NULL, Dacl ? &SecurityDescriptor : NULL); - + Status = SepDuplicateToken(Token, &ObjectAttributes, EffectiveOnly, TokenImpersonation, ImpersonationLevel, @@ -2305,26 +2355,26 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, NULL, DesiredAccess, SepTokenObjectType, PreviousMode, &hToken); } - + if (Dacl) ExFreePool(Dacl); - + if (OpenAsSelf) { PsRestoreImpersonation(PsGetCurrentThread(), &ImpersonationState); } - + ObDereferenceObject(Token); - + if (NT_SUCCESS(Status) && CopyOnOpen) { PsImpersonateClient(Thread, NewToken, FALSE, EffectiveOnly, ImpersonationLevel); } - + if (NewToken) ObDereferenceObject(NewToken); if (CopyOnOpen && NewThread) ObDereferenceObject(NewThread); - if(NT_SUCCESS(Status)) + if (NT_SUCCESS(Status)) { _SEH2_TRY { @@ -2336,7 +2386,7 @@ NtOpenThreadTokenEx(IN HANDLE ThreadHandle, } _SEH2_END; } - + return Status; } @@ -2368,11 +2418,11 @@ NtCompareTokens(IN HANDLE FirstTokenHandle, PTOKEN FirstToken, SecondToken; BOOLEAN IsEqual; NTSTATUS Status; - + PAGED_CODE(); - + PreviousMode = ExGetPreviousMode(); - + if (PreviousMode != KernelMode) { _SEH2_TRY @@ -2386,7 +2436,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle, } _SEH2_END; } - + Status = ObReferenceObjectByHandle(FirstTokenHandle, TOKEN_QUERY, SepTokenObjectType, @@ -2395,7 +2445,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle, NULL); if (!NT_SUCCESS(Status)) return Status; - + Status = ObReferenceObjectByHandle(SecondTokenHandle, TOKEN_QUERY, SepTokenObjectType, @@ -2407,7 +2457,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle, ObDereferenceObject(FirstToken); return Status; } - + if (FirstToken != SecondToken) { Status = SepCompareTokens(FirstToken, @@ -2416,10 +2466,10 @@ NtCompareTokens(IN HANDLE FirstTokenHandle, } else IsEqual = TRUE; - + ObDereferenceObject(FirstToken); ObDereferenceObject(SecondToken); - + if (NT_SUCCESS(Status)) { _SEH2_TRY @@ -2432,7 +2482,7 @@ NtCompareTokens(IN HANDLE FirstTokenHandle, } _SEH2_END; } - + return Status; } diff --git a/subsystems/win32/csrss/win32csr/alias.c b/subsystems/win32/csrss/win32csr/alias.c index 1432be1be53..74159544440 100644 --- a/subsystems/win32/csrss/win32csr/alias.c +++ b/subsystems/win32/csrss/win32csr/alias.c @@ -5,7 +5,7 @@ * PURPOSE: CSRSS alias support functions * COPYRIGHT: Christoph Wittich * Johannes Anderwald - * + * */ @@ -17,10 +17,10 @@ typedef struct tagALIAS_ENTRY { - LPCWSTR lpSource; - LPCWSTR lpTarget; - struct tagALIAS_ENTRY * Next; -}ALIAS_ENTRY, *PALIAS_ENTRY; + LPCWSTR lpSource; + LPCWSTR lpTarget; + struct tagALIAS_ENTRY * Next; +} ALIAS_ENTRY, *PALIAS_ENTRY; typedef struct tagALIAS_HEADER @@ -29,22 +29,7 @@ typedef struct tagALIAS_HEADER PALIAS_ENTRY Data; struct tagALIAS_HEADER * Next; -}ALIAS_HEADER, *PALIAS_HEADER; - -/* Ensure that a buffer is contained within the process's shared memory section. */ -static BOOL -ValidateBuffer(PCSRSS_PROCESS_DATA ProcessData, PVOID Buffer, ULONG Size) -{ - ULONG Offset = (BYTE *)Buffer - (BYTE *)ProcessData->CsrSectionViewBase; - if (Offset >= ProcessData->CsrSectionViewSize - || Size > (ProcessData->CsrSectionViewSize - Offset)) - { - DPRINT1("Invalid buffer %p %d; not within %p %d\n", - Buffer, Size, ProcessData->CsrSectionViewBase, ProcessData->CsrSectionViewSize); - return FALSE; - } - return TRUE; -} +} ALIAS_HEADER, *PALIAS_HEADER; static PALIAS_HEADER @@ -67,38 +52,38 @@ IntFindAliasHeader(PALIAS_HEADER RootHeader, LPCWSTR lpExeName) PALIAS_HEADER IntCreateAliasHeader(LPCWSTR lpExeName) { - PALIAS_HEADER Entry; - UINT dwLength = wcslen(lpExeName) + 1; + PALIAS_HEADER Entry; + UINT dwLength = wcslen(lpExeName) + 1; - Entry = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ALIAS_HEADER) + sizeof(WCHAR) * dwLength); - if (!Entry) - return Entry; - - Entry->lpExeName = (LPCWSTR)(Entry + 1); - wcscpy((WCHAR*)Entry->lpExeName, lpExeName); - Entry->Data = NULL; - Entry->Next = NULL; - return Entry; + Entry = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ALIAS_HEADER) + sizeof(WCHAR) * dwLength); + if (!Entry) + return Entry; + + Entry->lpExeName = (LPCWSTR)(Entry + 1); + wcscpy((WCHAR*)Entry->lpExeName, lpExeName); + Entry->Data = NULL; + Entry->Next = NULL; + return Entry; } VOID IntInsertAliasHeader(PALIAS_HEADER * RootHeader, PALIAS_HEADER NewHeader) { - PALIAS_HEADER CurrentHeader; - PALIAS_HEADER *LastLink = RootHeader; + PALIAS_HEADER CurrentHeader; + PALIAS_HEADER *LastLink = RootHeader; - while ((CurrentHeader = *LastLink) != NULL) - { - INT Diff = _wcsicmp(NewHeader->lpExeName, CurrentHeader->lpExeName); - if (Diff < 0) - { - break; - } - LastLink = &CurrentHeader->Next; - } + while ((CurrentHeader = *LastLink) != NULL) + { + INT Diff = _wcsicmp(NewHeader->lpExeName, CurrentHeader->lpExeName); + if (Diff < 0) + { + break; + } + LastLink = &CurrentHeader->Next; + } - *LastLink = NewHeader; - NewHeader->Next = CurrentHeader; + *LastLink = NewHeader; + NewHeader->Next = CurrentHeader; } PALIAS_ENTRY @@ -130,60 +115,60 @@ IntGetAliasEntry(PALIAS_HEADER Header, LPCWSTR lpSrcName) VOID IntInsertAliasEntry(PALIAS_HEADER Header, PALIAS_ENTRY NewEntry) { - PALIAS_ENTRY CurrentEntry; - PALIAS_ENTRY *LastLink = &Header->Data; + PALIAS_ENTRY CurrentEntry; + PALIAS_ENTRY *LastLink = &Header->Data; - while ((CurrentEntry = *LastLink) != NULL) - { - INT Diff = _wcsicmp(NewEntry->lpSource, CurrentEntry->lpSource); - if (Diff < 0) + while ((CurrentEntry = *LastLink) != NULL) { - break; + INT Diff = _wcsicmp(NewEntry->lpSource, CurrentEntry->lpSource); + if (Diff < 0) + { + break; + } + LastLink = &CurrentEntry->Next; } - LastLink = &CurrentEntry->Next; - } - *LastLink = NewEntry; - NewEntry->Next = CurrentEntry; + *LastLink = NewEntry; + NewEntry->Next = CurrentEntry; } PALIAS_ENTRY IntCreateAliasEntry(LPCWSTR lpSource, LPCWSTR lpTarget) { - UINT dwSource; - UINT dwTarget; - PALIAS_ENTRY Entry; + UINT dwSource; + UINT dwTarget; + PALIAS_ENTRY Entry; - dwSource = wcslen(lpSource) + 1; - dwTarget = wcslen(lpTarget) + 1; + dwSource = wcslen(lpSource) + 1; + dwTarget = wcslen(lpTarget) + 1; - Entry = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ALIAS_ENTRY) + sizeof(WCHAR) * (dwSource + dwTarget)); - if (!Entry) - return Entry; + Entry = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ALIAS_ENTRY) + sizeof(WCHAR) * (dwSource + dwTarget)); + if (!Entry) + return Entry; - Entry->lpSource = (LPCWSTR)(Entry + 1); - wcscpy((LPWSTR)Entry->lpSource, lpSource); - Entry->lpTarget = Entry->lpSource + dwSource; - wcscpy((LPWSTR)Entry->lpTarget, lpTarget); - Entry->Next = NULL; + Entry->lpSource = (LPCWSTR)(Entry + 1); + wcscpy((LPWSTR)Entry->lpSource, lpSource); + Entry->lpTarget = Entry->lpSource + dwSource; + wcscpy((LPWSTR)Entry->lpTarget, lpTarget); + Entry->Next = NULL; - return Entry; + return Entry; } UINT IntGetConsoleAliasesExesLength(PALIAS_HEADER RootHeader) { - UINT length = 0; + UINT length = 0; - while(RootHeader) - { - length += (wcslen(RootHeader->lpExeName) + 1) * sizeof(WCHAR); - RootHeader = RootHeader->Next; - } - if (length) - length += sizeof(WCHAR); // last entry entry is terminated with 2 zero bytes + while(RootHeader) + { + length += (wcslen(RootHeader->lpExeName) + 1) * sizeof(WCHAR); + RootHeader = RootHeader->Next; + } + if (length) + length += sizeof(WCHAR); // last entry entry is terminated with 2 zero bytes - return length; + return length; } UINT @@ -215,22 +200,22 @@ IntGetConsoleAliasesExes(PALIAS_HEADER RootHeader, LPWSTR TargetBuffer, UINT Tar UINT IntGetAllConsoleAliasesLength(PALIAS_HEADER Header) { - UINT Length = 0; - PALIAS_ENTRY CurEntry = Header->Data; + UINT Length = 0; + PALIAS_ENTRY CurEntry = Header->Data; - while(CurEntry) - { - Length += wcslen(CurEntry->lpSource); - Length += wcslen(CurEntry->lpTarget); - Length += 2; // zero byte and '=' - CurEntry = CurEntry->Next; - } + while(CurEntry) + { + Length += wcslen(CurEntry->lpSource); + Length += wcslen(CurEntry->lpTarget); + Length += 2; // zero byte and '=' + CurEntry = CurEntry->Next; + } - if (Length) - { - return (Length+1) * sizeof(WCHAR); - } - return 0; + if (Length) + { + return (Length+1) * sizeof(WCHAR); + } + return 0; } UINT IntGetAllConsoleAliases(PALIAS_HEADER Header, LPWSTR TargetBuffer, UINT TargetBufferLength) @@ -316,7 +301,7 @@ CSR_API(CsrAddConsoleAlias) { return STATUS_INVALID_PARAMETER; } - + Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); if (!NT_SUCCESS(Request->Status)) { @@ -379,11 +364,11 @@ CSR_API(CsrGetConsoleAlias) lpTarget = Request->Data.GetConsoleAlias.TargetBuffer; - DPRINT("CsrGetConsoleAlias entered lpExeName %p lpSource %p TargetBuffer %p TargetBufferLength %u\n", - lpExeName, lpSource, lpTarget, Request->Data.GetConsoleAlias.TargetBufferLength); - - if (Request->Data.GetConsoleAlias.ExeLength == 0 || lpTarget == NULL || - Request->Data.GetConsoleAlias.TargetBufferLength == 0 || Request->Data.GetConsoleAlias.SourceLength == 0) + DPRINT("CsrGetConsoleAlias entered lpExeName %p lpSource %p TargetBuffer %p TargetBufferLength %u\n", + lpExeName, lpSource, lpTarget, Request->Data.GetConsoleAlias.TargetBufferLength); + + if (Request->Data.GetConsoleAlias.ExeLength == 0 || lpTarget == NULL || + Request->Data.GetConsoleAlias.TargetBufferLength == 0 || Request->Data.GetConsoleAlias.SourceLength == 0) { return STATUS_INVALID_PARAMETER; } @@ -415,7 +400,8 @@ CSR_API(CsrGetConsoleAlias) return STATUS_BUFFER_TOO_SMALL; } - if (!ValidateBuffer(ProcessData, lpTarget, Request->Data.GetConsoleAlias.TargetBufferLength)) + if (!Win32CsrValidateBuffer(ProcessData, lpTarget, + Request->Data.GetConsoleAlias.TargetBufferLength, 1)) { ConioUnlockConsole(Console); return STATUS_ACCESS_VIOLATION; @@ -457,15 +443,16 @@ CSR_API(CsrGetAllConsoleAliases) return STATUS_BUFFER_OVERFLOW; } - if (!ValidateBuffer(ProcessData, - Request->Data.GetAllConsoleAlias.AliasBuffer, - Request->Data.GetAllConsoleAlias.AliasBufferLength)) + if (!Win32CsrValidateBuffer(ProcessData, + Request->Data.GetAllConsoleAlias.AliasBuffer, + Request->Data.GetAllConsoleAlias.AliasBufferLength, + 1)) { ConioUnlockConsole(Console); return STATUS_ACCESS_VIOLATION; } - BytesWritten = IntGetAllConsoleAliases(Header, + BytesWritten = IntGetAllConsoleAliases(Header, Request->Data.GetAllConsoleAlias.AliasBuffer, Request->Data.GetAllConsoleAlias.AliasBufferLength); @@ -509,7 +496,7 @@ CSR_API(CsrGetConsoleAliasesExes) PCSRSS_CONSOLE Console; UINT BytesWritten; UINT ExesLength; - + DPRINT("CsrGetConsoleAliasesExes entered\n"); Request->Status = ConioConsoleFromProcessData(ProcessData, &Console); @@ -519,7 +506,7 @@ CSR_API(CsrGetConsoleAliasesExes) } ExesLength = IntGetConsoleAliasesExesLength(Console->Aliases); - + if (ExesLength > Request->Data.GetConsoleAliasesExes.Length) { ConioUnlockConsole(Console); @@ -531,16 +518,17 @@ CSR_API(CsrGetConsoleAliasesExes) ConioUnlockConsole(Console); return STATUS_INVALID_PARAMETER; } - - if (!ValidateBuffer(ProcessData, - Request->Data.GetConsoleAliasesExes.ExeNames, - Request->Data.GetConsoleAliasesExes.Length)) + + if (!Win32CsrValidateBuffer(ProcessData, + Request->Data.GetConsoleAliasesExes.ExeNames, + Request->Data.GetConsoleAliasesExes.Length, + 1)) { ConioUnlockConsole(Console); return STATUS_ACCESS_VIOLATION; } - BytesWritten = IntGetConsoleAliasesExes(Console->Aliases, + BytesWritten = IntGetConsoleAliasesExes(Console->Aliases, Request->Data.GetConsoleAliasesExes.ExeNames, Request->Data.GetConsoleAliasesExes.Length); diff --git a/subsystems/win32/csrss/win32csr/appswitch.c b/subsystems/win32/csrss/win32csr/appswitch.c index 3d372a199f1..f816a8303ad 100644 --- a/subsystems/win32/csrss/win32csr/appswitch.c +++ b/subsystems/win32/csrss/win32csr/appswitch.c @@ -19,7 +19,7 @@ typedef struct APPSWITCH_ITEM BOOL bFocus; struct APPSWITCH_ITEM * Next; WCHAR szText[1]; -}APPSWITCH_ITEM, *PAPPSWITCH_ITEM; +} APPSWITCH_ITEM, *PAPPSWITCH_ITEM; static PAPPSWITCH_ITEM pRoot = NULL; static DWORD NumOfWindows = 0; @@ -30,7 +30,7 @@ UINT WINAPI PrivateExtractIconExW(LPCWSTR,int,HICON*,HICON*,UINT); BOOL -CALLBACK +CALLBACK EnumWindowEnumProc( HWND hwnd, LPARAM lParam @@ -51,21 +51,21 @@ EnumWindowEnumProc( hIcon = (HICON)SendMessage(hwnd, WM_GETICON, ICON_BIG, 0); if (!hIcon) { - GetWindowThreadProcessId(hwnd, &dwPid); - hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, dwPid); - if (hProcess) - { - if (GetModuleFileNameExW(hProcess, NULL, szFileName, MAX_PATH)) - { - szFileName[MAX_PATH-1] = L'\0'; - PrivateExtractIconExW(szFileName, 0, &hIcon, NULL, 1); - } - } + GetWindowThreadProcessId(hwnd, &dwPid); + hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, dwPid); + if (hProcess) + { + if (GetModuleFileNameExW(hProcess, NULL, szFileName, MAX_PATH)) + { + szFileName[MAX_PATH-1] = L'\0'; + PrivateExtractIconExW(szFileName, 0, &hIcon, NULL, 1); + } + } } else { - /* icons from WM_GETICON need to be copied */ - hIcon = CopyIcon(hIcon); + /* icons from WM_GETICON need to be copied */ + hIcon = CopyIcon(hIcon); } /* get the text length */ Length = SendMessageW(hwnd, WM_GETTEXTLENGTH, 0, 0); @@ -88,9 +88,9 @@ EnumWindowEnumProc( if (!pRoot) { - /* first item */ - pRoot = pItem; - return TRUE; + /* first item */ + pRoot = pItem; + return TRUE; } /* enumerate the last item */ @@ -107,16 +107,16 @@ EnumWindowEnumProc( VOID EnumerateAppWindows(HDESK hDesk, HWND hwndDlg) { - /* initialize defaults */ - pRoot = NULL; - NumOfWindows = 0; - hAppWindowDlg = hwndDlg; - /* enumerate all windows */ - EnumDesktopWindows(hDesk, EnumWindowEnumProc, (LPARAM)NULL); - if (NumOfWindows > 7) - { - /* FIXME resize window */ - } + /* initialize defaults */ + pRoot = NULL; + NumOfWindows = 0; + hAppWindowDlg = hwndDlg; + /* enumerate all windows */ + EnumDesktopWindows(hDesk, EnumWindowEnumProc, (LPARAM)NULL); + if (NumOfWindows > 7) + { + /* FIXME resize window */ + } } VOID @@ -126,7 +126,7 @@ MarkNextEntryAsActive() pItem = pRoot; if (!pRoot) - return; + return; while(pItem) { @@ -153,82 +153,82 @@ KeyboardHookProc( LPARAM lParam ) { - PKBDLLHOOKSTRUCT hk = (PKBDLLHOOKSTRUCT) lParam; + PKBDLLHOOKSTRUCT hk = (PKBDLLHOOKSTRUCT) lParam; - if (wParam == WM_SYSKEYUP) - { - /* is tab key pressed */ - if (hk->vkCode == VK_TAB) - { - if (hAppWindowDlg == NULL) - { - /* FIXME - * launch window - */ - DPRINT1("launch alt-tab window\n"); - } - else - { - MarkNextEntryAsActive(); - } - } - } - return CallNextHookEx(hhk, nCode, wParam, lParam); + if (wParam == WM_SYSKEYUP) + { + /* is tab key pressed */ + if (hk->vkCode == VK_TAB) + { + if (hAppWindowDlg == NULL) + { + /* FIXME + * launch window + */ + DPRINT1("launch alt-tab window\n"); + } + else + { + MarkNextEntryAsActive(); + } + } + } + return CallNextHookEx(hhk, nCode, wParam, lParam); } VOID PaintAppWindows(HWND hwndDlg, HDC hDc) { - DWORD dwIndex, X, Y; - PAPPSWITCH_ITEM pCurItem; - RECT Rect; - DWORD XSize, YSize, XMax; - HBRUSH hBrush; + DWORD dwIndex, X, Y; + PAPPSWITCH_ITEM pCurItem; + RECT Rect; + DWORD XSize, YSize, XMax; + HBRUSH hBrush; - X = 10; - Y = 10; - XSize = GetSystemMetrics(SM_CXICON); - YSize = GetSystemMetrics(SM_CYICON); - XMax = (XSize+(XSize/2)) * 7 + X; - pCurItem = pRoot; + X = 10; + Y = 10; + XSize = GetSystemMetrics(SM_CXICON); + YSize = GetSystemMetrics(SM_CYICON); + XMax = (XSize+(XSize/2)) * 7 + X; + pCurItem = pRoot; - for (dwIndex = 0; dwIndex < NumOfWindows; dwIndex++) - { - if (X >= XMax) - { - X = 10; - Y += YSize + (YSize/2); - } - if (pCurItem->bFocus) - { + for (dwIndex = 0; dwIndex < NumOfWindows; dwIndex++) + { + if (X >= XMax) + { + X = 10; + Y += YSize + (YSize/2); + } + if (pCurItem->bFocus) + { hBrush = CreateSolidBrush(RGB(30, 30, 255)); SetRect(&Rect, X-5, Y-5, X + XSize + 5, Y + YSize + 5); FillRect(hDc, &Rect, hBrush); DeleteObject((HGDIOBJ)hBrush); SendDlgItemMessageW(hwndDlg, IDC_STATIC_CUR_APP, WM_SETTEXT, 0, (LPARAM)pCurItem->szText); - } + } - DrawIcon(hDc, X, Y, pCurItem->hIcon); - pCurItem = pCurItem->Next; - X += XSize +(XSize/2); - } + DrawIcon(hDc, X, Y, pCurItem->hIcon); + pCurItem = pCurItem->Next; + X += XSize +(XSize/2); + } } VOID DestroyAppWindows() { - PAPPSWITCH_ITEM pCurItem, pNextItem; + PAPPSWITCH_ITEM pCurItem, pNextItem; - pCurItem = pRoot; - while(pCurItem) - { - pNextItem = pCurItem->Next; - DestroyIcon(pCurItem->hIcon); - HeapFree(Win32CsrApiHeap, 0, pCurItem); - pCurItem = pNextItem; - } - pRoot = NULL; - hAppWindowDlg = NULL; - NumOfWindows = 0; + pCurItem = pRoot; + while(pCurItem) + { + pNextItem = pCurItem->Next; + DestroyIcon(pCurItem->hIcon); + HeapFree(Win32CsrApiHeap, 0, pCurItem); + pCurItem = pNextItem; + } + pRoot = NULL; + hAppWindowDlg = NULL; + NumOfWindows = 0; } INT_PTR diff --git a/subsystems/win32/csrss/win32csr/coninput.c b/subsystems/win32/csrss/win32csr/coninput.c new file mode 100644 index 00000000000..83aa6e7c71d --- /dev/null +++ b/subsystems/win32/csrss/win32csr/coninput.c @@ -0,0 +1,655 @@ +/* + * reactos/subsys/csrss/win32csr/conio.c + * + * Console I/O functions + * + * ReactOS Operating System + */ + +/* INCLUDES ******************************************************************/ + +#define NDEBUG +#include "w32csr.h" +#include + +/* GLOBALS *******************************************************************/ + +#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \ + WideCharToMultiByte((Console)->CodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) + +#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \ + MultiByteToWideChar((Console)->CodePage, 0, (sChar), 1, (dWChar), 1) + +/* FUNCTIONS *****************************************************************/ + +CSR_API(CsrReadConsole) +{ + PLIST_ENTRY CurrentEntry; + ConsoleInput *Input; + PCHAR Buffer; + PWCHAR UnicodeBuffer; + ULONG i = 0; + ULONG nNumberOfCharsToRead, CharSize; + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrReadConsole\n"); + + CharSize = (Request->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); + + nNumberOfCharsToRead = Request->Data.ReadConsoleRequest.NrCharactersToRead; + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Buffer = (PCHAR)Request->Data.ReadConsoleRequest.Buffer; + UnicodeBuffer = (PWCHAR)Buffer; + if (!Win32CsrValidateBuffer(ProcessData, Buffer, nNumberOfCharsToRead, CharSize)) + return STATUS_ACCESS_VIOLATION; + + if (Request->Data.ReadConsoleRequest.NrCharactersRead * sizeof(WCHAR) > nNumberOfCharsToRead * CharSize) + return STATUS_INVALID_PARAMETER; + + Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle, + &Console, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent; + + Status = STATUS_PENDING; /* we haven't read anything (yet) */ + if (Console->Mode & ENABLE_LINE_INPUT) + { + if (Console->LineBuffer == NULL) + { + /* Starting a new line */ + Console->LineMaxSize = max(256, nNumberOfCharsToRead); + Console->LineBuffer = HeapAlloc(Win32CsrApiHeap, 0, Console->LineMaxSize * sizeof(WCHAR)); + if (Console->LineBuffer == NULL) + { + Status = STATUS_NO_MEMORY; + goto done; + } + Console->LineComplete = FALSE; + Console->LineUpPressed = FALSE; + Console->LineInsertToggle = 0; + Console->LineWakeupMask = Request->Data.ReadConsoleRequest.CtrlWakeupMask; + Console->LineSize = Request->Data.ReadConsoleRequest.NrCharactersRead; + Console->LinePos = Console->LineSize; + /* pre-filling the buffer is only allowed in the Unicode API, + * so we don't need to worry about conversion */ + memcpy(Console->LineBuffer, Buffer, Console->LineSize * sizeof(WCHAR)); + if (Console->LineSize == Console->LineMaxSize) + { + Console->LineComplete = TRUE; + Console->LinePos = 0; + } + } + + /* If we don't have a complete line yet, process the pending input */ + while (!Console->LineComplete && !IsListEmpty(&Console->InputEvents)) + { + /* remove input event from queue */ + CurrentEntry = RemoveHeadList(&Console->InputEvents); + if (IsListEmpty(&Console->InputEvents)) + { + ResetEvent(Console->ActiveEvent); + } + Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); + + /* only pay attention to key down */ + if (KEY_EVENT == Input->InputEvent.EventType + && Input->InputEvent.Event.KeyEvent.bKeyDown) + { + LineInputKeyDown(Console, &Input->InputEvent.Event.KeyEvent); + Request->Data.ReadConsoleRequest.ControlKeyState = Input->InputEvent.Event.KeyEvent.dwControlKeyState; + } + HeapFree(Win32CsrApiHeap, 0, Input); + } + + /* Check if we have a complete line to read from */ + if (Console->LineComplete) + { + while (i < nNumberOfCharsToRead && Console->LinePos != Console->LineSize) + { + WCHAR Char = Console->LineBuffer[Console->LinePos++]; + if (Request->Data.ReadConsoleRequest.Unicode) + UnicodeBuffer[i++] = Char; + else + ConsoleInputUnicodeCharToAnsiChar(Console, &Buffer[i++], &Char); + } + if (Console->LinePos == Console->LineSize) + { + /* Entire line has been read */ + HeapFree(Win32CsrApiHeap, 0, Console->LineBuffer); + Console->LineBuffer = NULL; + } + Status = STATUS_SUCCESS; + } + } + else + { + /* Character input */ + while (i < nNumberOfCharsToRead && !IsListEmpty(&Console->InputEvents)) + { + /* remove input event from queue */ + CurrentEntry = RemoveHeadList(&Console->InputEvents); + if (IsListEmpty(&Console->InputEvents)) + { + ResetEvent(Console->ActiveEvent); + } + Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); + + /* only pay attention to valid ascii chars, on key down */ + if (KEY_EVENT == Input->InputEvent.EventType + && Input->InputEvent.Event.KeyEvent.bKeyDown + && Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar != L'\0') + { + WCHAR Char = Input->InputEvent.Event.KeyEvent.uChar.UnicodeChar; + if (Request->Data.ReadConsoleRequest.Unicode) + UnicodeBuffer[i++] = Char; + else + ConsoleInputUnicodeCharToAnsiChar(Console, &Buffer[i++], &Char); + Status = STATUS_SUCCESS; /* did read something */ + } + HeapFree(Win32CsrApiHeap, 0, Input); + } + } +done: + Request->Data.ReadConsoleRequest.NrCharactersRead = i; + ConioUnlockConsole(Console); + + return Status; +} + +static VOID FASTCALL +ConioInputEventToAnsi(PCSRSS_CONSOLE Console, PINPUT_RECORD InputEvent) +{ + if (InputEvent->EventType == KEY_EVENT) + { + WCHAR UnicodeChar = InputEvent->Event.KeyEvent.uChar.UnicodeChar; + InputEvent->Event.KeyEvent.uChar.UnicodeChar = 0; + ConsoleInputUnicodeCharToAnsiChar(Console, + &InputEvent->Event.KeyEvent.uChar.AsciiChar, + &UnicodeChar); + } +} + +static NTSTATUS FASTCALL +ConioProcessChar(PCSRSS_CONSOLE Console, + PINPUT_RECORD InputEvent) +{ + /* Check for pause or unpause */ + if (InputEvent->EventType == KEY_EVENT && InputEvent->Event.KeyEvent.bKeyDown) + { + WORD vk = InputEvent->Event.KeyEvent.wVirtualKeyCode; + if (!(Console->PauseFlags & PAUSED_FROM_KEYBOARD)) + { + DWORD cks = InputEvent->Event.KeyEvent.dwControlKeyState; + if (Console->Mode & ENABLE_LINE_INPUT && + (vk == VK_PAUSE || (vk == 'S' && + (cks & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) && + !(cks & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))))) + { + ConioPause(Console, PAUSED_FROM_KEYBOARD); + return STATUS_SUCCESS; + } + } + else + { + if ((vk < VK_SHIFT || vk > VK_CAPITAL) && vk != VK_LWIN && + vk != VK_RWIN && vk != VK_NUMLOCK && vk != VK_SCROLL) + { + ConioUnpause(Console, PAUSED_FROM_KEYBOARD); + return STATUS_SUCCESS; + } + } + } + + /* add event to the queue */ + ConsoleInput *ConInRec = RtlAllocateHeap(Win32CsrApiHeap, 0, sizeof(ConsoleInput)); + if (ConInRec == NULL) + return STATUS_INSUFFICIENT_RESOURCES; + ConInRec->InputEvent = *InputEvent; + InsertTailList(&Console->InputEvents, &ConInRec->ListEntry); + SetEvent(Console->ActiveEvent); + return STATUS_SUCCESS; +} + +static DWORD FASTCALL +ConioGetShiftState(PBYTE KeyState) +{ + DWORD ssOut = 0; + + if (KeyState[VK_CAPITAL] & 1) + ssOut |= CAPSLOCK_ON; + + if (KeyState[VK_NUMLOCK] & 1) + ssOut |= NUMLOCK_ON; + + if (KeyState[VK_SCROLL] & 1) + ssOut |= SCROLLLOCK_ON; + + if (KeyState[VK_SHIFT] & 0x80) + ssOut |= SHIFT_PRESSED; + + if (KeyState[VK_LCONTROL] & 0x80) + ssOut |= LEFT_CTRL_PRESSED; + if (KeyState[VK_RCONTROL] & 0x80) + ssOut |= RIGHT_CTRL_PRESSED; + + if (KeyState[VK_LMENU] & 0x80) + ssOut |= LEFT_ALT_PRESSED; + if (KeyState[VK_RMENU] & 0x80) + ssOut |= RIGHT_ALT_PRESSED; + + return ssOut; +} + +VOID WINAPI +ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode) +{ + static BYTE KeyState[256] = { 0 }; + /* MSDN mentions that you should use the last virtual key code received + * when putting a virtual key identity to a WM_CHAR message since multiple + * or translated keys may be involved. */ + static UINT LastVirtualKey = 0; + DWORD ShiftState; + UINT RepeatCount; + WCHAR UnicodeChar; + UINT VirtualKeyCode; + UINT VirtualScanCode; + BOOL Down = FALSE; + INPUT_RECORD er; + BOOLEAN Fake; // synthesized, not a real event + BOOLEAN NotChar; // message should not be used to return a character + + RepeatCount = 1; + VirtualScanCode = (msg->lParam >> 16) & 0xff; + Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR || + msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR; + + GetKeyboardState(KeyState); + ShiftState = ConioGetShiftState(KeyState); + + if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) + { + VirtualKeyCode = LastVirtualKey; + UnicodeChar = msg->wParam; + } + else + { + WCHAR Chars[2]; + INT RetChars = 0; + + VirtualKeyCode = msg->wParam; + RetChars = ToUnicodeEx(VirtualKeyCode, + VirtualScanCode, + KeyState, + Chars, + 2, + 0, + 0); + UnicodeChar = (1 == RetChars ? Chars[0] : 0); + } + + er.EventType = KEY_EVENT; + er.Event.KeyEvent.bKeyDown = Down; + er.Event.KeyEvent.wRepeatCount = RepeatCount; + er.Event.KeyEvent.uChar.UnicodeChar = UnicodeChar; + er.Event.KeyEvent.dwControlKeyState = ShiftState; + er.Event.KeyEvent.wVirtualKeyCode = VirtualKeyCode; + er.Event.KeyEvent.wVirtualScanCode = VirtualScanCode; + + if (TextMode) + { + if (0 != (ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) + && VK_TAB == VirtualKeyCode) + { + if (Down) + { + TuiSwapConsole(ShiftState & SHIFT_PRESSED ? -1 : 1); + } + + return; + } + else if (VK_MENU == VirtualKeyCode && ! Down) + { + if (TuiSwapConsole(0)) + { + return; + } + } + } + + if (NULL == Console) + { + DPRINT1("No Active Console!\n"); + return; + } + + Fake = UnicodeChar && + (msg->message != WM_CHAR && msg->message != WM_SYSCHAR && + msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP); + NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR); + if (NotChar) + LastVirtualKey = msg->wParam; + + DPRINT ("csrss: %s %s %s %s %02x %02x '%lc' %04x\n", + Down ? "down" : "up ", + (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ? + "char" : "key ", + Fake ? "fake" : "real", + NotChar ? "notc" : "char", + VirtualScanCode, + VirtualKeyCode, + (UnicodeChar >= L' ') ? UnicodeChar : L'.', + ShiftState); + + if (Fake) + return; + + /* process Ctrl-C and Ctrl-Break */ + if (Console->Mode & ENABLE_PROCESSED_INPUT && + er.Event.KeyEvent.bKeyDown && + ((er.Event.KeyEvent.wVirtualKeyCode == VK_PAUSE) || + (er.Event.KeyEvent.wVirtualKeyCode == 'C')) && + (er.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))) + { + PCSRSS_PROCESS_DATA current; + PLIST_ENTRY current_entry; + DPRINT1("Console_Api Ctrl-C\n"); + current_entry = Console->ProcessList.Flink; + while (current_entry != &Console->ProcessList) + { + current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); + current_entry = current_entry->Flink; + ConioConsoleCtrlEvent((DWORD)CTRL_C_EVENT, current); + } + if (Console->LineBuffer && !Console->LineComplete) + { + /* Line input is in progress; end it */ + Console->LinePos = Console->LineSize = 0; + Console->LineComplete = TRUE; + } + return; + } + + if (0 != (er.Event.KeyEvent.dwControlKeyState + & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) + && (VK_UP == er.Event.KeyEvent.wVirtualKeyCode + || VK_DOWN == er.Event.KeyEvent.wVirtualKeyCode)) + { + if (er.Event.KeyEvent.bKeyDown) + { + /* scroll up or down */ + if (VK_UP == er.Event.KeyEvent.wVirtualKeyCode) + { + /* only scroll up if there is room to scroll up into */ + if (Console->ActiveBuffer->CurrentY != Console->ActiveBuffer->MaxY - 1) + { + Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + + Console->ActiveBuffer->MaxY - 1) % + Console->ActiveBuffer->MaxY; + Console->ActiveBuffer->CurrentY++; + } + } + else + { + /* only scroll down if there is room to scroll down into */ + if (Console->ActiveBuffer->CurrentY != 0) + { + Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + 1) % + Console->ActiveBuffer->MaxY; + Console->ActiveBuffer->CurrentY--; + } + } + ConioDrawConsole(Console); + } + return; + } + ConioProcessChar(Console, &er); +} + +CSR_API(CsrReadInputEvent) +{ + PLIST_ENTRY CurrentEntry; + PCSRSS_CONSOLE Console; + NTSTATUS Status; + BOOLEAN Done = FALSE; + ConsoleInput *Input; + + DPRINT("CsrReadInputEvent\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Request->Data.ReadInputRequest.Event = ProcessData->ConsoleEvent; + + Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + /* only get input if there is any */ + CurrentEntry = Console->InputEvents.Flink; + while (CurrentEntry != &Console->InputEvents) + { + Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); + CurrentEntry = CurrentEntry->Flink; + + if (Done) + { + Request->Data.ReadInputRequest.MoreEvents = TRUE; + break; + } + + RemoveEntryList(&Input->ListEntry); + + if (!Done) + { + Request->Data.ReadInputRequest.Input = Input->InputEvent; + if (Request->Data.ReadInputRequest.Unicode == FALSE) + { + ConioInputEventToAnsi(Console, &Request->Data.ReadInputRequest.Input); + } + Done = TRUE; + } + + HeapFree(Win32CsrApiHeap, 0, Input); + } + + if (Done) + Status = STATUS_SUCCESS; + else + Status = STATUS_PENDING; + + if (IsListEmpty(&Console->InputEvents)) + { + ResetEvent(Console->ActiveEvent); + } + + ConioUnlockConsole(Console); + + return Status; +} + +CSR_API(CsrFlushInputBuffer) +{ + PLIST_ENTRY CurrentEntry; + PCSRSS_CONSOLE Console; + ConsoleInput* Input; + NTSTATUS Status; + + DPRINT("CsrFlushInputBuffer\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Status = ConioLockConsole(ProcessData, + Request->Data.FlushInputBufferRequest.ConsoleInput, + &Console, + GENERIC_WRITE); + if(! NT_SUCCESS(Status)) + { + return Status; + } + + /* Discard all entries in the input event queue */ + while (!IsListEmpty(&Console->InputEvents)) + { + CurrentEntry = RemoveHeadList(&Console->InputEvents); + Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); + /* Destroy the event */ + HeapFree(Win32CsrApiHeap, 0, Input); + } + ResetEvent(Console->ActiveEvent); + + ConioUnlockConsole(Console); + + return STATUS_SUCCESS; +} + +CSR_API(CsrGetNumberOfConsoleInputEvents) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PLIST_ENTRY CurrentItem; + DWORD NumEvents; + + DPRINT("CsrGetNumberOfConsoleInputEvents\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); + + Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + CurrentItem = Console->InputEvents.Flink; + NumEvents = 0; + + /* If there are any events ... */ + while (CurrentItem != &Console->InputEvents) + { + CurrentItem = CurrentItem->Flink; + NumEvents++; + } + + ConioUnlockConsole(Console); + + Request->Data.GetNumInputEventsRequest.NumInputEvents = NumEvents; + + return STATUS_SUCCESS; +} + +CSR_API(CsrPeekConsoleInput) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + DWORD Length; + PLIST_ENTRY CurrentItem; + PINPUT_RECORD InputRecord; + ConsoleInput* Item; + UINT NumItems; + + DPRINT("CsrPeekConsoleInput\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ); + if(! NT_SUCCESS(Status)) + { + return Status; + } + + InputRecord = Request->Data.PeekConsoleInputRequest.InputRecord; + Length = Request->Data.PeekConsoleInputRequest.Length; + + if (!Win32CsrValidateBuffer(ProcessData, InputRecord, Length, sizeof(INPUT_RECORD))) + { + ConioUnlockConsole(Console); + return STATUS_ACCESS_VIOLATION; + } + + NumItems = 0; + + if (! IsListEmpty(&Console->InputEvents)) + { + CurrentItem = Console->InputEvents.Flink; + + while (CurrentItem != &Console->InputEvents && NumItems < Length) + { + Item = CONTAINING_RECORD(CurrentItem, ConsoleInput, ListEntry); + + ++NumItems; + *InputRecord = Item->InputEvent; + + if (Request->Data.PeekConsoleInputRequest.Unicode == FALSE) + { + ConioInputEventToAnsi(Console, InputRecord); + } + + InputRecord++; + CurrentItem = CurrentItem->Flink; + } + } + + ConioUnlockConsole(Console); + + Request->Data.PeekConsoleInputRequest.Length = NumItems; + + return STATUS_SUCCESS; +} + +CSR_API(CsrWriteConsoleInput) +{ + PINPUT_RECORD InputRecord; + PCSRSS_CONSOLE Console; + NTSTATUS Status; + DWORD Length; + DWORD i; + + DPRINT("CsrWriteConsoleInput\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockConsole(ProcessData, Request->Data.WriteConsoleInputRequest.ConsoleHandle, &Console, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + InputRecord = Request->Data.WriteConsoleInputRequest.InputRecord; + Length = Request->Data.WriteConsoleInputRequest.Length; + + if (!Win32CsrValidateBuffer(ProcessData, InputRecord, Length, sizeof(INPUT_RECORD))) + { + ConioUnlockConsole(Console); + return STATUS_ACCESS_VIOLATION; + } + + for (i = 0; i < Length && NT_SUCCESS(Status); i++) + { + if (!Request->Data.WriteConsoleInputRequest.Unicode && + InputRecord->EventType == KEY_EVENT) + { + CHAR AsciiChar = InputRecord->Event.KeyEvent.uChar.AsciiChar; + ConsoleInputAnsiCharToUnicodeChar(Console, + &InputRecord->Event.KeyEvent.uChar.UnicodeChar, + &AsciiChar); + } + Status = ConioProcessChar(Console, InputRecord++); + } + + ConioUnlockConsole(Console); + + Request->Data.WriteConsoleInputRequest.Length = i; + + return Status; +} + +/* EOF */ diff --git a/subsystems/win32/csrss/win32csr/conio.c b/subsystems/win32/csrss/win32csr/conio.c deleted file mode 100644 index 51e320fdcef..00000000000 --- a/subsystems/win32/csrss/win32csr/conio.c +++ /dev/null @@ -1,3132 +0,0 @@ -/* - * reactos/subsys/csrss/win32csr/conio.c - * - * Console I/O functions - * - * ReactOS Operating System - */ - -/* INCLUDES ******************************************************************/ - -#define NDEBUG -#include "w32csr.h" -#include - -/* GLOBALS *******************************************************************/ - -#define ConioInitRect(Rect, top, left, bottom, right) \ - ((Rect)->Top) = top; \ - ((Rect)->Left) = left; \ - ((Rect)->Bottom) = bottom; \ - ((Rect)->Right) = right - -#define ConioIsRectEmpty(Rect) \ - (((Rect)->Left > (Rect)->Right) || ((Rect)->Top > (Rect)->Bottom)) - -#define ConsoleInputUnicodeCharToAnsiChar(Console, dChar, sWChar) \ - WideCharToMultiByte((Console)->CodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) - -#define ConsoleInputAnsiCharToUnicodeChar(Console, dWChar, sChar) \ - MultiByteToWideChar((Console)->CodePage, 0, (sChar), 1, (dWChar), 1) - -#define ConsoleUnicodeCharToAnsiChar(Console, dChar, sWChar) \ - WideCharToMultiByte((Console)->OutputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) - -#define ConsoleAnsiCharToUnicodeChar(Console, dWChar, sChar) \ - MultiByteToWideChar((Console)->OutputCodePage, 0, (sChar), 1, (dWChar), 1) - - -/* FUNCTIONS *****************************************************************/ - -NTSTATUS FASTCALL -ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console) -{ - PCSRSS_CONSOLE ProcessConsole; - - RtlEnterCriticalSection(&ProcessData->HandleTableLock); - ProcessConsole = ProcessData->Console; - - if (!ProcessConsole) - { - *Console = NULL; - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return STATUS_INVALID_HANDLE; - } - - InterlockedIncrement(&ProcessConsole->ReferenceCount); - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - EnterCriticalSection(&(ProcessConsole->Lock)); - *Console = ProcessConsole; - - return STATUS_SUCCESS; -} - -VOID FASTCALL -ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, DWORD Timeout) -{ - HANDLE Thread; - - DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData->ProcessId); - - if (ProcessData->CtrlDispatcher) - { - - Thread = CreateRemoteThread(ProcessData->Process, NULL, 0, - (LPTHREAD_START_ROUTINE) ProcessData->CtrlDispatcher, - UlongToPtr(Event), 0, NULL); - if (NULL == Thread) - { - DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError()); - return; - } - WaitForSingleObject(Thread, Timeout); - CloseHandle(Thread); - } -} - -VOID FASTCALL -ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData) -{ - ConioConsoleCtrlEventTimeout(Event, ProcessData, 0); -} - -PBYTE FASTCALL -ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y) -{ - return &Buff->Buffer[2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X)]; -} - -static VOID FASTCALL -ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff) -{ - PBYTE Ptr = ConioCoordToPointer(Buff, 0, Buff->CurrentY); - UINT Pos; - - for (Pos = 0; Pos < Buff->MaxX; Pos++) - { - /* Fill the cell */ - *Ptr++ = ' '; - *Ptr++ = Buff->DefaultAttrib; - } -} - -static NTSTATUS FASTCALL -CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console, - PCSRSS_SCREEN_BUFFER Buffer) -{ - DPRINT("CsrInitConsoleScreenBuffer Size X %d Size Y %d\n", Buffer->MaxX, Buffer->MaxY); - - Buffer->Header.Type = CONIO_SCREEN_BUFFER_MAGIC; - Buffer->Header.Console = Console; - Buffer->Header.HandleCount = 0; - Buffer->ShowX = 0; - Buffer->ShowY = 0; - Buffer->VirtualY = 0; - Buffer->Buffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, Buffer->MaxX * Buffer->MaxY * 2); - if (NULL == Buffer->Buffer) - { - return STATUS_INSUFFICIENT_RESOURCES; - } - ConioInitScreenBuffer(Console, Buffer); - /* initialize buffer to be empty with default attributes */ - for (Buffer->CurrentY = 0 ; Buffer->CurrentY < Buffer->MaxY; Buffer->CurrentY++) - { - ClearLineBuffer(Buffer); - } - Buffer->Mode = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; - Buffer->CurrentX = 0; - Buffer->CurrentY = 0; - - InsertHeadList(&Console->BufferList, &Buffer->ListEntry); - return STATUS_SUCCESS; -} - -static NTSTATUS WINAPI -CsrInitConsole(PCSRSS_CONSOLE Console, BOOL Visible) -{ - NTSTATUS Status; - SECURITY_ATTRIBUTES SecurityAttributes; - PCSRSS_SCREEN_BUFFER NewBuffer; - BOOL GuiMode; - - Console->Title.MaximumLength = Console->Title.Length = 0; - Console->Title.Buffer = NULL; - - //FIXME - RtlCreateUnicodeString(&Console->Title, L"Command Prompt"); - - Console->ReferenceCount = 0; - Console->WaitingChars = 0; - Console->WaitingLines = 0; - Console->EchoCount = 0; - Console->Header.Type = CONIO_CONSOLE_MAGIC; - Console->Header.Console = Console; - Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT; - Console->EarlyReturn = FALSE; - InitializeListHead(&Console->BufferList); - Console->ActiveBuffer = NULL; - InitializeListHead(&Console->InputEvents); - Console->CodePage = GetOEMCP(); - Console->OutputCodePage = GetOEMCP(); - - SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); - SecurityAttributes.lpSecurityDescriptor = NULL; - SecurityAttributes.bInheritHandle = TRUE; - - Console->ActiveEvent = CreateEventW(&SecurityAttributes, TRUE, FALSE, NULL); - if (NULL == Console->ActiveEvent) - { - RtlFreeUnicodeString(&Console->Title); - return STATUS_UNSUCCESSFUL; - } - Console->PrivateData = NULL; - InitializeCriticalSection(&Console->Lock); - - GuiMode = DtbgIsDesktopVisible(); - - /* allocate console screen buffer */ - NewBuffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER)); - if (NULL == NewBuffer) - { - RtlFreeUnicodeString(&Console->Title); - DeleteCriticalSection(&Console->Lock); - CloseHandle(Console->ActiveEvent); - return STATUS_INSUFFICIENT_RESOURCES; - } - /* init screen buffer with defaults */ - NewBuffer->CursorInfo.bVisible = TRUE; - NewBuffer->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE; - /* make console active, and insert into console list */ - Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer; - - if (! GuiMode) - { - Status = TuiInitConsole(Console); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to open text-mode console, switching to gui-mode\n"); - GuiMode = TRUE; - } - } - if (GuiMode) - { - Status = GuiInitConsole(Console, Visible); - if (! NT_SUCCESS(Status)) - { - HeapFree(Win32CsrApiHeap,0, NewBuffer); - RtlFreeUnicodeString(&Console->Title); - DeleteCriticalSection(&Console->Lock); - CloseHandle(Console->ActiveEvent); - DPRINT1("GuiInitConsole: failed\n"); - return Status; - } - } - - Status = CsrInitConsoleScreenBuffer(Console, NewBuffer); - if (! NT_SUCCESS(Status)) - { - ConioCleanupConsole(Console); - RtlFreeUnicodeString(&Console->Title); - DeleteCriticalSection(&Console->Lock); - CloseHandle(Console->ActiveEvent); - HeapFree(Win32CsrApiHeap, 0, NewBuffer); - DPRINT1("CsrInitConsoleScreenBuffer: failed\n"); - return Status; - } - - /* copy buffer contents to screen */ - ConioDrawConsole(Console); - - return STATUS_SUCCESS; -} - - -CSR_API(CsrAllocConsole) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status = STATUS_SUCCESS; - BOOLEAN NewConsole = FALSE; - - DPRINT("CsrAllocConsole\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - RtlEnterCriticalSection(&ProcessData->HandleTableLock); - if (ProcessData->Console) - { - DPRINT1("Process already has a console\n"); - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return STATUS_INVALID_PARAMETER; - } - - /* If we don't need a console, then get out of here */ - if (!Request->Data.AllocConsoleRequest.ConsoleNeeded) - { - DPRINT("No console needed\n"); - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return STATUS_SUCCESS; - } - - /* If we already have one, then don't create a new one... */ - if (!Request->Data.AllocConsoleRequest.Console || - Request->Data.AllocConsoleRequest.Console != ProcessData->ParentConsole) - { - /* Allocate a console structure */ - NewConsole = TRUE; - Console = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_CONSOLE)); - if (NULL == Console) - { - DPRINT1("Not enough memory for console\n"); - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return STATUS_NO_MEMORY; - } - /* initialize list head */ - InitializeListHead(&Console->ProcessList); - /* insert process data required for GUI initialization */ - InsertHeadList(&Console->ProcessList, &ProcessData->ProcessEntry); - /* Initialize the Console */ - Status = CsrInitConsole(Console, Request->Data.AllocConsoleRequest.Visible); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Console init failed\n"); - HeapFree(Win32CsrApiHeap, 0, Console); - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return Status; - } - } - else - { - /* Reuse our current console */ - Console = Request->Data.AllocConsoleRequest.Console; - } - - /* Set the Process Console */ - ProcessData->Console = Console; - - /* Return it to the caller */ - Request->Data.AllocConsoleRequest.Console = Console; - - /* Add a reference count because the process is tied to the console */ - _InterlockedIncrement(&Console->ReferenceCount); - - if (NewConsole || !ProcessData->bInheritHandles) - { - /* Insert the Objects */ - Status = Win32CsrInsertObject(ProcessData, - &Request->Data.AllocConsoleRequest.InputHandle, - &Console->Header, - GENERIC_READ | GENERIC_WRITE, - TRUE, - FILE_SHARE_READ | FILE_SHARE_WRITE); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to insert object\n"); - ConioDeleteConsole((Object_t *) Console); - ProcessData->Console = 0; - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return Status; - } - - Status = Win32CsrInsertObject(ProcessData, - &Request->Data.AllocConsoleRequest.OutputHandle, - &Console->ActiveBuffer->Header, - GENERIC_READ | GENERIC_WRITE, - TRUE, - FILE_SHARE_READ | FILE_SHARE_WRITE); - if (!NT_SUCCESS(Status)) - { - DPRINT1("Failed to insert object\n"); - ConioDeleteConsole((Object_t *) Console); - Win32CsrReleaseObject(ProcessData, - Request->Data.AllocConsoleRequest.InputHandle); - ProcessData->Console = 0; - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return Status; - } - } - - /* Duplicate the Event */ - if (!DuplicateHandle(GetCurrentProcess(), - ProcessData->Console->ActiveEvent, - ProcessData->Process, - &ProcessData->ConsoleEvent, - EVENT_ALL_ACCESS, - FALSE, - 0)) - { - DPRINT1("DuplicateHandle() failed: %d\n", GetLastError); - ConioDeleteConsole((Object_t *) Console); - if (NewConsole || !ProcessData->bInheritHandles) - { - Win32CsrReleaseObject(ProcessData, - Request->Data.AllocConsoleRequest.OutputHandle); - Win32CsrReleaseObject(ProcessData, - Request->Data.AllocConsoleRequest.InputHandle); - } - ProcessData->Console = 0; - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return Status; - } - - /* Set the Ctrl Dispatcher */ - ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher; - DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher); - - if (!NewConsole) - { - /* Insert into the list if it has not been added */ - InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry); - } - - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return STATUS_SUCCESS; -} - -CSR_API(CsrFreeConsole) -{ - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - return Win32CsrReleaseConsole(ProcessData); -} - -static VOID FASTCALL -ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *UpdateRect, UINT *ScrolledLines) -{ - /* If we hit bottom, slide the viewable screen */ - if (++Buff->CurrentY == Buff->MaxY) - { - Buff->CurrentY--; - if (++Buff->VirtualY == Buff->MaxY) - { - Buff->VirtualY = 0; - } - (*ScrolledLines)++; - ClearLineBuffer(Buff); - if (UpdateRect->Top != 0) - { - UpdateRect->Top--; - } - } - UpdateRect->Left = 0; - UpdateRect->Right = Buff->MaxX - 1; - UpdateRect->Bottom = Buff->CurrentY; -} - -static NTSTATUS FASTCALL -ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, - CHAR *Buffer, DWORD Length, BOOL Attrib) -{ - UINT i; - PBYTE Ptr; - SMALL_RECT UpdateRect; - LONG CursorStartX, CursorStartY; - UINT ScrolledLines; - - CursorStartX = Buff->CurrentX; - CursorStartY = Buff->CurrentY; - UpdateRect.Left = Buff->MaxX; - UpdateRect.Top = Buff->CurrentY; - UpdateRect.Right = -1; - UpdateRect.Bottom = Buff->CurrentY; - ScrolledLines = 0; - - for (i = 0; i < Length; i++) - { - if (Buff->Mode & ENABLE_PROCESSED_OUTPUT) - { - /* --- LF --- */ - if (Buffer[i] == '\n') - { - Buff->CurrentX = 0; - ConioNextLine(Buff, &UpdateRect, &ScrolledLines); - continue; - } - /* --- BS --- */ - else if (Buffer[i] == '\b') - { - /* Only handle BS if we're not on the first pos of the first line */ - if (0 != Buff->CurrentX || 0 != Buff->CurrentY) - { - if (0 == Buff->CurrentX) - { - /* slide virtual position up */ - Buff->CurrentX = Buff->MaxX - 1; - Buff->CurrentY--; - UpdateRect.Top = min(UpdateRect.Top, (LONG)Buff->CurrentY); - } - else - { - Buff->CurrentX--; - } - Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); - Ptr[0] = ' '; - Ptr[1] = Buff->DefaultAttrib; - UpdateRect.Left = min(UpdateRect.Left, (LONG) Buff->CurrentX); - UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX); - } - continue; - } - /* --- CR --- */ - else if (Buffer[i] == '\r') - { - Buff->CurrentX = 0; - UpdateRect.Left = min(UpdateRect.Left, (LONG) Buff->CurrentX); - UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX); - continue; - } - /* --- TAB --- */ - else if (Buffer[i] == '\t') - { - UINT EndX; - - UpdateRect.Left = min(UpdateRect.Left, (LONG)Buff->CurrentX); - EndX = (Buff->CurrentX + 8) & ~7; - if (EndX > Buff->MaxX) - { - EndX = Buff->MaxX; - } - Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); - while (Buff->CurrentX < EndX) - { - *Ptr++ = ' '; - *Ptr++ = Buff->DefaultAttrib; - Buff->CurrentX++; - } - UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX - 1); - if (Buff->CurrentX == Buff->MaxX) - { - if (Buff->Mode & ENABLE_WRAP_AT_EOL_OUTPUT) - { - Buff->CurrentX = 0; - ConioNextLine(Buff, &UpdateRect, &ScrolledLines); - } - else - { - Buff->CurrentX--; - } - } - continue; - } - } - UpdateRect.Left = min(UpdateRect.Left, (LONG)Buff->CurrentX); - UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX); - Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); - Ptr[0] = Buffer[i]; - if (Attrib) - { - Ptr[1] = Buff->DefaultAttrib; - } - Buff->CurrentX++; - if (Buff->CurrentX == Buff->MaxX) - { - if (Buff->Mode & ENABLE_WRAP_AT_EOL_OUTPUT) - { - Buff->CurrentX = 0; - ConioNextLine(Buff, &UpdateRect, &ScrolledLines); - } - else - { - Buff->CurrentX = CursorStartX; - } - } - } - - if (! ConioIsRectEmpty(&UpdateRect) && Buff == Console->ActiveBuffer) - { - ConioWriteStream(Console, &UpdateRect, CursorStartX, CursorStartY, ScrolledLines, - Buffer, Length); - } - - return STATUS_SUCCESS; -} - -CSR_API(CsrReadConsole) -{ - PLIST_ENTRY CurrentEntry; - ConsoleInput *Input; - PUCHAR Buffer; - PWCHAR UnicodeBuffer; - ULONG i; - ULONG nNumberOfCharsToRead, CharSize; - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrReadConsole\n"); - - CharSize = (Request->Data.ReadConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); - - /* truncate length to CSRSS_MAX_READ_CONSOLE_REQUEST */ - nNumberOfCharsToRead = min(Request->Data.ReadConsoleRequest.NrCharactersToRead, CSRSS_MAX_READ_CONSOLE / CharSize); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Buffer = Request->Data.ReadConsoleRequest.Buffer; - UnicodeBuffer = (PWCHAR)Buffer; - Status = ConioLockConsole(ProcessData, Request->Data.ReadConsoleRequest.ConsoleHandle, - &Console, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Request->Data.ReadConsoleRequest.EventHandle = ProcessData->ConsoleEvent; - for (i = 0; i < nNumberOfCharsToRead && Console->InputEvents.Flink != &Console->InputEvents; i++) - { - /* remove input event from queue */ - CurrentEntry = RemoveHeadList(&Console->InputEvents); - if (IsListEmpty(&Console->InputEvents)) - { - ResetEvent(Console->ActiveEvent); - } - Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); - - /* only pay attention to valid ascii chars, on key down */ - if (KEY_EVENT == Input->InputEvent.EventType - && Input->InputEvent.Event.KeyEvent.bKeyDown - && Input->InputEvent.Event.KeyEvent.uChar.AsciiChar != '\0') - { - /* - * backspace handling - if we are in charge of echoing it then we handle it here - * otherwise we treat it like a normal char. - */ - if ('\b' == Input->InputEvent.Event.KeyEvent.uChar.AsciiChar && 0 - != (Console->Mode & ENABLE_ECHO_INPUT)) - { - /* echo if it has not already been done, and either we or the client has chars to be deleted */ - if (! Input->Echoed - && (0 != i || Request->Data.ReadConsoleRequest.nCharsCanBeDeleted)) - { - ConioWriteConsole(Console, Console->ActiveBuffer, - &Input->InputEvent.Event.KeyEvent.uChar.AsciiChar, 1, TRUE); - } - if (0 != i) - { - i -= 2; /* if we already have something to return, just back it up by 2 */ - } - else - { /* otherwise, return STATUS_NOTIFY_CLEANUP to tell client to back up its buffer */ - Console->WaitingChars--; - ConioUnlockConsole(Console); - HeapFree(Win32CsrApiHeap, 0, Input); - Request->Data.ReadConsoleRequest.NrCharactersRead = 0; - return STATUS_NOTIFY_CLEANUP; - - } - Request->Data.ReadConsoleRequest.nCharsCanBeDeleted--; - Input->Echoed = TRUE; /* mark as echoed so we don't echo it below */ - } - /* do not copy backspace to buffer */ - else - { - if(Request->Data.ReadConsoleRequest.Unicode) - ConsoleInputAnsiCharToUnicodeChar(Console, &UnicodeBuffer[i], &Input->InputEvent.Event.KeyEvent.uChar.AsciiChar); - else - Buffer[i] = Input->InputEvent.Event.KeyEvent.uChar.AsciiChar; - } - /* echo to screen if enabled and we did not already echo the char */ - if (0 != (Console->Mode & ENABLE_ECHO_INPUT) - && ! Input->Echoed - && '\r' != Input->InputEvent.Event.KeyEvent.uChar.AsciiChar) - { - ConioWriteConsole(Console, Console->ActiveBuffer, - &Input->InputEvent.Event.KeyEvent.uChar.AsciiChar, 1, TRUE); - } - } - else - { - i--; - } - Console->WaitingChars--; - HeapFree(Win32CsrApiHeap, 0, Input); - } - Request->Data.ReadConsoleRequest.NrCharactersRead = i; - if (0 == i) - { - Status = STATUS_PENDING; /* we didn't read anything */ - } - else if (0 != (Console->Mode & ENABLE_LINE_INPUT)) - { - if (0 == Console->WaitingLines || - (Request->Data.ReadConsoleRequest.Unicode ? (L'\n' != UnicodeBuffer[i - 1]) : ('\n' != Buffer[i - 1]))) - { - Status = STATUS_PENDING; /* line buffered, didn't get a complete line */ - } - else - { - Console->WaitingLines--; - Status = STATUS_SUCCESS; /* line buffered, did get a complete line */ - } - } - else - { - Status = STATUS_SUCCESS; /* not line buffered, did read something */ - } - - if (Status == STATUS_PENDING) - { - Console->EchoCount = nNumberOfCharsToRead - i; - } - else - { - Console->EchoCount = 0; /* if the client is no longer waiting on input, do not echo */ - } - - ConioUnlockConsole(Console); - - if (CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + i * CharSize > sizeof(CSR_API_MESSAGE)) - { - Request->Header.u1.s1.TotalLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE) + i * CharSize; - Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); - } - - return Status; -} - -__inline BOOLEAN ConioGetIntersection( - SMALL_RECT *Intersection, - SMALL_RECT *Rect1, - SMALL_RECT *Rect2) -{ - if (ConioIsRectEmpty(Rect1) || - (ConioIsRectEmpty(Rect2)) || - (Rect1->Top > Rect2->Bottom) || - (Rect1->Left > Rect2->Right) || - (Rect1->Bottom < Rect2->Top) || - (Rect1->Right < Rect2->Left)) - { - /* The rectangles do not intersect */ - ConioInitRect(Intersection, 0, -1, 0, -1); - return FALSE; - } - - ConioInitRect(Intersection, - max(Rect1->Top, Rect2->Top), - max(Rect1->Left, Rect2->Left), - min(Rect1->Bottom, Rect2->Bottom), - min(Rect1->Right, Rect2->Right)); - - return TRUE; -} - -__inline BOOLEAN ConioGetUnion( - SMALL_RECT *Union, - SMALL_RECT *Rect1, - SMALL_RECT *Rect2) -{ - if (ConioIsRectEmpty(Rect1)) - { - if (ConioIsRectEmpty(Rect2)) - { - ConioInitRect(Union, 0, -1, 0, -1); - return FALSE; - } - else - { - *Union = *Rect2; - } - } - else if (ConioIsRectEmpty(Rect2)) - { - *Union = *Rect1; - } - else - { - ConioInitRect(Union, - min(Rect1->Top, Rect2->Top), - min(Rect1->Left, Rect2->Left), - max(Rect1->Bottom, Rect2->Bottom), - max(Rect1->Right, Rect2->Right)); - } - - return TRUE; -} - -/* Move from one rectangle to another. We must be careful about the order that - * this is done, to avoid overwriting parts of the source before they are moved. */ -static VOID FASTCALL -ConioMoveRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer, - SMALL_RECT *SrcRegion, - SMALL_RECT *DstRegion, - SMALL_RECT *ClipRegion, - WORD Fill) -{ - int Width = ConioRectWidth(SrcRegion); - int Height = ConioRectHeight(SrcRegion); - int SX, SY; - int DX, DY; - int XDelta, YDelta; - int i, j; - - SY = SrcRegion->Top; - DY = DstRegion->Top; - YDelta = 1; - if (SY < DY) - { - /* Moving down: work from bottom up */ - SY = SrcRegion->Bottom; - DY = DstRegion->Bottom; - YDelta = -1; - } - for (i = 0; i < Height; i++) - { - PWORD SRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, SY); - PWORD DRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, DY); - - SX = SrcRegion->Left; - DX = DstRegion->Left; - XDelta = 1; - if (SX < DX) - { - /* Moving right: work from right to left */ - SX = SrcRegion->Right; - DX = DstRegion->Right; - XDelta = -1; - } - for (j = 0; j < Width; j++) - { - WORD Cell = SRow[SX]; - if (SX >= ClipRegion->Left && SX <= ClipRegion->Right - && SY >= ClipRegion->Top && SY <= ClipRegion->Bottom) - { - SRow[SX] = Fill; - } - if (DX >= ClipRegion->Left && DX <= ClipRegion->Right - && DY >= ClipRegion->Top && DY <= ClipRegion->Bottom) - { - DRow[DX] = Cell; - } - SX += XDelta; - DX += XDelta; - } - SY += YDelta; - DY += YDelta; - } -} - -static VOID FASTCALL -ConioInputEventToAnsi(PCSRSS_CONSOLE Console, PINPUT_RECORD InputEvent) -{ - if (InputEvent->EventType == KEY_EVENT) - { - WCHAR UnicodeChar = InputEvent->Event.KeyEvent.uChar.UnicodeChar; - InputEvent->Event.KeyEvent.uChar.UnicodeChar = 0; - ConsoleInputUnicodeCharToAnsiChar(Console, - &InputEvent->Event.KeyEvent.uChar.AsciiChar, - &UnicodeChar); - } -} - -CSR_API(CsrWriteConsole) -{ - NTSTATUS Status; - PCHAR Buffer; - PCSRSS_SCREEN_BUFFER Buff; - PCSRSS_CONSOLE Console; - DWORD Written = 0; - ULONG Length; - ULONG CharSize = (Request->Data.WriteConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); - - DPRINT("CsrWriteConsole\n"); - - if (Request->Header.u1.s1.TotalLength - < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) - + (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize)) - { - DPRINT1("Invalid request size\n"); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - return STATUS_INVALID_PARAMETER; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleRequest.ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - if (Console->UnpauseEvent) - { - Status = NtDuplicateObject(GetCurrentProcess(), Console->UnpauseEvent, - ProcessData->Process, &Request->Data.WriteConsoleRequest.UnpauseEvent, - SYNCHRONIZE, 0, 0); - ConioUnlockScreenBuffer(Buff); - return NT_SUCCESS(Status) ? STATUS_PENDING : Status; - } - - if(Request->Data.WriteConsoleRequest.Unicode) - { - Length = WideCharToMultiByte(Console->OutputCodePage, 0, - (PWCHAR)Request->Data.WriteConsoleRequest.Buffer, - Request->Data.WriteConsoleRequest.NrCharactersToWrite, - NULL, 0, NULL, NULL); - Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length); - if (Buffer) - { - WideCharToMultiByte(Console->OutputCodePage, 0, - (PWCHAR)Request->Data.WriteConsoleRequest.Buffer, - Request->Data.WriteConsoleRequest.NrCharactersToWrite, - Buffer, Length, NULL, NULL); - } - else - { - Status = STATUS_NO_MEMORY; - } - } - else - { - Buffer = (PCHAR)Request->Data.WriteConsoleRequest.Buffer; - } - - if (Buffer) - { - if (NT_SUCCESS(Status)) - { - Status = ConioWriteConsole(Console, Buff, Buffer, - Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE); - if (NT_SUCCESS(Status)) - { - Written = Request->Data.WriteConsoleRequest.NrCharactersToWrite; - } - } - if (Request->Data.WriteConsoleRequest.Unicode) - { - RtlFreeHeap(GetProcessHeap(), 0, Buffer); - } - } - ConioUnlockScreenBuffer(Buff); - - Request->Data.WriteConsoleRequest.NrCharactersWritten = Written; - - return Status; -} - -VOID WINAPI -ConioDeleteScreenBuffer(PCSRSS_SCREEN_BUFFER Buffer) -{ - PCSRSS_CONSOLE Console = Buffer->Header.Console; - - RemoveEntryList(&Buffer->ListEntry); - if (Buffer == Console->ActiveBuffer) - { - /* Deleted active buffer; switch to most recently created */ - Console->ActiveBuffer = NULL; - if (!IsListEmpty(&Console->BufferList)) - { - Console->ActiveBuffer = CONTAINING_RECORD(Console->BufferList.Flink, CSRSS_SCREEN_BUFFER, ListEntry); - ConioDrawConsole(Console); - } - } - - HeapFree(Win32CsrApiHeap, 0, Buffer->Buffer); - HeapFree(Win32CsrApiHeap, 0, Buffer); -} - -VOID FASTCALL -ConioDrawConsole(PCSRSS_CONSOLE Console) -{ - SMALL_RECT Region; - - ConioInitRect(&Region, 0, 0, Console->Size.Y - 1, Console->Size.X - 1); - - ConioDrawRegion(Console, &Region); -} - - -VOID WINAPI -ConioDeleteConsole(Object_t *Object) -{ - PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Object; - ConsoleInput *Event; - - DPRINT("ConioDeleteConsole\n"); - - /* Drain input event queue */ - while (Console->InputEvents.Flink != &Console->InputEvents) - { - Event = (ConsoleInput *) Console->InputEvents.Flink; - Console->InputEvents.Flink = Console->InputEvents.Flink->Flink; - Console->InputEvents.Flink->Flink->Blink = &Console->InputEvents; - HeapFree(Win32CsrApiHeap, 0, Event); - } - - ConioCleanupConsole(Console); - ConioDeleteScreenBuffer(Console->ActiveBuffer); - if (!IsListEmpty(&Console->BufferList)) - { - DPRINT1("BUG: screen buffer list not empty\n"); - } - - CloseHandle(Console->ActiveEvent); - if (Console->UnpauseEvent) CloseHandle(Console->UnpauseEvent); - DeleteCriticalSection(&Console->Lock); - RtlFreeUnicodeString(&Console->Title); - IntDeleteAllAliases(Console->Aliases); - HeapFree(Win32CsrApiHeap, 0, Console); -} - -VOID WINAPI -CsrInitConsoleSupport(VOID) -{ - DPRINT("CSR: CsrInitConsoleSupport()\n"); - - /* Should call LoadKeyboardLayout */ -} - -VOID FASTCALL -ConioPause(PCSRSS_CONSOLE Console, UINT Flags) -{ - Console->PauseFlags |= Flags; - if (!Console->UnpauseEvent) - Console->UnpauseEvent = CreateEvent(NULL, TRUE, FALSE, NULL); -} - -VOID FASTCALL -ConioUnpause(PCSRSS_CONSOLE Console, UINT Flags) -{ - Console->PauseFlags &= ~Flags; - if (Console->PauseFlags == 0 && Console->UnpauseEvent) - { - SetEvent(Console->UnpauseEvent); - CloseHandle(Console->UnpauseEvent); - Console->UnpauseEvent = NULL; - } -} - -static VOID FASTCALL -ConioProcessChar(PCSRSS_CONSOLE Console, - ConsoleInput *KeyEventRecord) -{ - BOOL updown; - ConsoleInput *TempInput; - - if (KeyEventRecord->InputEvent.EventType == KEY_EVENT && - KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown) - { - WORD vk = KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode; - if (!(Console->PauseFlags & PAUSED_FROM_KEYBOARD)) - { - DWORD cks = KeyEventRecord->InputEvent.Event.KeyEvent.dwControlKeyState; - if (Console->Mode & ENABLE_LINE_INPUT && - (vk == VK_PAUSE || (vk == 'S' && - (cks & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) && - !(cks & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED))))) - { - ConioPause(Console, PAUSED_FROM_KEYBOARD); - HeapFree(Win32CsrApiHeap, 0, KeyEventRecord); - return; - } - } - else - { - if ((vk < VK_SHIFT || vk > VK_CAPITAL) && vk != VK_LWIN && - vk != VK_RWIN && vk != VK_NUMLOCK && vk != VK_SCROLL) - { - ConioUnpause(Console, PAUSED_FROM_KEYBOARD); - HeapFree(Win32CsrApiHeap, 0, KeyEventRecord); - return; - } - } - } - - if (0 != (Console->Mode & (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT))) - { - switch(KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar) - { - case '\r': - /* first add the \r */ - KeyEventRecord->InputEvent.EventType = KEY_EVENT; - updown = KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown; - KeyEventRecord->Echoed = FALSE; - KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode = VK_RETURN; - KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar = '\r'; - InsertTailList(&Console->InputEvents, &KeyEventRecord->ListEntry); - Console->WaitingChars++; - KeyEventRecord = HeapAlloc(Win32CsrApiHeap, 0, sizeof(ConsoleInput)); - if (NULL == KeyEventRecord) - { - DPRINT1("Failed to allocate KeyEventRecord\n"); - return; - } - KeyEventRecord->InputEvent.EventType = KEY_EVENT; - KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown = updown; - KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualKeyCode = 0; - KeyEventRecord->InputEvent.Event.KeyEvent.wVirtualScanCode = 0; - KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar = '\n'; - KeyEventRecord->Fake = TRUE; - break; - } - } - /* add event to the queue */ - InsertTailList(&Console->InputEvents, &KeyEventRecord->ListEntry); - Console->WaitingChars++; - /* if line input mode is enabled, only wake the client on enter key down */ - if (0 == (Console->Mode & ENABLE_LINE_INPUT) - || Console->EarlyReturn - || ('\n' == KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar - && KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown)) - { - if ('\n' == KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar) - { - Console->WaitingLines++; - } - } - KeyEventRecord->Echoed = FALSE; - if (0 != (Console->Mode & (ENABLE_PROCESSED_INPUT | ENABLE_LINE_INPUT)) - && '\b' == KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar - && KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown) - { - /* walk the input queue looking for a char to backspace */ - for (TempInput = (ConsoleInput *) Console->InputEvents.Blink; - TempInput != (ConsoleInput *) &Console->InputEvents - && (KEY_EVENT == TempInput->InputEvent.EventType - || ! TempInput->InputEvent.Event.KeyEvent.bKeyDown - || '\b' == TempInput->InputEvent.Event.KeyEvent.uChar.AsciiChar); - TempInput = (ConsoleInput *) TempInput->ListEntry.Blink) - { - /* NOP */; - } - /* if we found one, delete it, otherwise, wake the client */ - if (TempInput != (ConsoleInput *) &Console->InputEvents) - { - /* delete previous key in queue, maybe echo backspace to screen, and do not place backspace on queue */ - RemoveEntryList(&TempInput->ListEntry); - if (TempInput->Echoed) - { - ConioWriteConsole(Console, Console->ActiveBuffer, - &KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar, - 1, TRUE); - } - HeapFree(Win32CsrApiHeap, 0, TempInput); - RemoveEntryList(&KeyEventRecord->ListEntry); - HeapFree(Win32CsrApiHeap, 0, KeyEventRecord); - Console->WaitingChars -= 2; - return; - } - } - else - { - /* echo chars if we are supposed to and client is waiting for some */ - if (0 != (Console->Mode & ENABLE_ECHO_INPUT) && Console->EchoCount - && KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar - && KeyEventRecord->InputEvent.Event.KeyEvent.bKeyDown - && '\r' != KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar) - { - /* mark the char as already echoed */ - ConioWriteConsole(Console, Console->ActiveBuffer, - &KeyEventRecord->InputEvent.Event.KeyEvent.uChar.AsciiChar, - 1, TRUE); - Console->EchoCount--; - KeyEventRecord->Echoed = TRUE; - } - } - - /* Console->WaitingChars++; */ - SetEvent(Console->ActiveEvent); -} - -static DWORD FASTCALL -ConioGetShiftState(PBYTE KeyState) -{ - DWORD ssOut = 0; - - if (KeyState[VK_CAPITAL] & 1) - ssOut |= CAPSLOCK_ON; - - if (KeyState[VK_NUMLOCK] & 1) - ssOut |= NUMLOCK_ON; - - if (KeyState[VK_SCROLL] & 1) - ssOut |= SCROLLLOCK_ON; - - if (KeyState[VK_SHIFT] & 0x80) - ssOut |= SHIFT_PRESSED; - - if (KeyState[VK_LCONTROL] & 0x80) - ssOut |= LEFT_CTRL_PRESSED; - if (KeyState[VK_RCONTROL] & 0x80) - ssOut |= RIGHT_CTRL_PRESSED; - - if (KeyState[VK_LMENU] & 0x80) - ssOut |= LEFT_ALT_PRESSED; - if (KeyState[VK_RMENU] & 0x80) - ssOut |= RIGHT_ALT_PRESSED; - - return ssOut; -} - -VOID WINAPI -ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode) -{ - static BYTE KeyState[256] = { 0 }; - /* MSDN mentions that you should use the last virtual key code received - * when putting a virtual key identity to a WM_CHAR message since multiple - * or translated keys may be involved. */ - static UINT LastVirtualKey = 0; - DWORD ShiftState; - ConsoleInput *ConInRec; - UINT RepeatCount; - CHAR AsciiChar; - WCHAR UnicodeChar; - UINT VirtualKeyCode; - UINT VirtualScanCode; - BOOL Down = FALSE; - INPUT_RECORD er; - ULONG ResultSize = 0; - - RepeatCount = 1; - VirtualScanCode = (msg->lParam >> 16) & 0xff; - Down = msg->message == WM_KEYDOWN || msg->message == WM_CHAR || - msg->message == WM_SYSKEYDOWN || msg->message == WM_SYSCHAR; - - GetKeyboardState(KeyState); - ShiftState = ConioGetShiftState(KeyState); - - if (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) - { - VirtualKeyCode = LastVirtualKey; - UnicodeChar = msg->wParam; - } - else - { - WCHAR Chars[2]; - INT RetChars = 0; - - VirtualKeyCode = msg->wParam; - RetChars = ToUnicodeEx(VirtualKeyCode, - VirtualScanCode, - KeyState, - Chars, - 2, - 0, - 0); - UnicodeChar = (1 == RetChars ? Chars[0] : 0); - } - - if (0 == ResultSize) - { - AsciiChar = 0; - } - - er.EventType = KEY_EVENT; - er.Event.KeyEvent.bKeyDown = Down; - er.Event.KeyEvent.wRepeatCount = RepeatCount; - er.Event.KeyEvent.uChar.UnicodeChar = UnicodeChar; - er.Event.KeyEvent.dwControlKeyState = ShiftState; - er.Event.KeyEvent.wVirtualKeyCode = VirtualKeyCode; - er.Event.KeyEvent.wVirtualScanCode = VirtualScanCode; - - if (TextMode) - { - if (0 != (ShiftState & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) - && VK_TAB == VirtualKeyCode) - { - if (Down) - { - TuiSwapConsole(ShiftState & SHIFT_PRESSED ? -1 : 1); - } - - return; - } - else if (VK_MENU == VirtualKeyCode && ! Down) - { - if (TuiSwapConsole(0)) - { - return; - } - } - } - - if (NULL == Console) - { - DPRINT1("No Active Console!\n"); - return; - } - - ConInRec = HeapAlloc(Win32CsrApiHeap, 0, sizeof(ConsoleInput)); - - if (NULL == ConInRec) - { - return; - } - - ConInRec->InputEvent = er; - ConInRec->Fake = UnicodeChar && - (msg->message != WM_CHAR && msg->message != WM_SYSCHAR && - msg->message != WM_KEYUP && msg->message != WM_SYSKEYUP); - ConInRec->NotChar = (msg->message != WM_CHAR && msg->message != WM_SYSCHAR); - ConInRec->Echoed = FALSE; - if (ConInRec->NotChar) - LastVirtualKey = msg->wParam; - - DPRINT ("csrss: %s %s %s %s %02x %02x '%c' %04x\n", - Down ? "down" : "up ", - (msg->message == WM_CHAR || msg->message == WM_SYSCHAR) ? - "char" : "key ", - ConInRec->Fake ? "fake" : "real", - ConInRec->NotChar ? "notc" : "char", - VirtualScanCode, - VirtualKeyCode, - (AsciiChar >= ' ') ? AsciiChar : '.', - ShiftState); - - if (ConInRec->Fake && ConInRec->NotChar) - { - HeapFree(Win32CsrApiHeap, 0, ConInRec); - return; - } - - /* process Ctrl-C and Ctrl-Break */ - if (Console->Mode & ENABLE_PROCESSED_INPUT && - er.Event.KeyEvent.bKeyDown && - ((er.Event.KeyEvent.wVirtualKeyCode == VK_PAUSE) || - (er.Event.KeyEvent.wVirtualKeyCode == 'C')) && - (er.Event.KeyEvent.dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED))) - { - PCSRSS_PROCESS_DATA current; - PLIST_ENTRY current_entry; - DPRINT1("Console_Api Ctrl-C\n"); - current_entry = Console->ProcessList.Flink; - while (current_entry != &Console->ProcessList) - { - current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); - current_entry = current_entry->Flink; - ConioConsoleCtrlEvent((DWORD)CTRL_C_EVENT, current); - } - HeapFree(Win32CsrApiHeap, 0, ConInRec); - return; - } - - if (0 != (er.Event.KeyEvent.dwControlKeyState - & (RIGHT_ALT_PRESSED | LEFT_ALT_PRESSED)) - && (VK_UP == er.Event.KeyEvent.wVirtualKeyCode - || VK_DOWN == er.Event.KeyEvent.wVirtualKeyCode)) - { - if (er.Event.KeyEvent.bKeyDown) - { - /* scroll up or down */ - if (VK_UP == er.Event.KeyEvent.wVirtualKeyCode) - { - /* only scroll up if there is room to scroll up into */ - if (Console->ActiveBuffer->CurrentY != Console->ActiveBuffer->MaxY - 1) - { - Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + - Console->ActiveBuffer->MaxY - 1) % - Console->ActiveBuffer->MaxY; - Console->ActiveBuffer->CurrentY++; - } - } - else - { - /* only scroll down if there is room to scroll down into */ - if (Console->ActiveBuffer->CurrentY != 0) - { - Console->ActiveBuffer->VirtualY = (Console->ActiveBuffer->VirtualY + 1) % - Console->ActiveBuffer->MaxY; - Console->ActiveBuffer->CurrentY--; - } - } - ConioDrawConsole(Console); - } - HeapFree(Win32CsrApiHeap, 0, ConInRec); - return; - } - /* FIXME - convert to ascii */ - ConioProcessChar(Console, ConInRec); -} - -CSR_API(CsrGetScreenBufferInfo) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - PCONSOLE_SCREEN_BUFFER_INFO pInfo; - - DPRINT("CsrGetScreenBufferInfo\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - pInfo = &Request->Data.ScreenBufferInfoRequest.Info; - pInfo->dwSize.X = Buff->MaxX; - pInfo->dwSize.Y = Buff->MaxY; - pInfo->dwCursorPosition.X = Buff->CurrentX; - pInfo->dwCursorPosition.Y = Buff->CurrentY; - pInfo->wAttributes = Buff->DefaultAttrib; - pInfo->srWindow.Left = Buff->ShowX; - pInfo->srWindow.Right = Buff->ShowX + Console->Size.X - 1; - pInfo->srWindow.Top = Buff->ShowY; - pInfo->srWindow.Bottom = Buff->ShowY + Console->Size.Y - 1; - pInfo->dwMaximumWindowSize.X = Buff->MaxX; - pInfo->dwMaximumWindowSize.Y = Buff->MaxY; - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrSetCursor) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - LONG OldCursorX, OldCursorY; - LONG NewCursorX, NewCursorY; - - DPRINT("CsrSetCursor\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - NewCursorX = Request->Data.SetCursorRequest.Position.X; - NewCursorY = Request->Data.SetCursorRequest.Position.Y; - if (NewCursorX < 0 || NewCursorX >= Buff->MaxX || - NewCursorY < 0 || NewCursorY >= Buff->MaxY) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_INVALID_PARAMETER; - } - OldCursorX = Buff->CurrentX; - OldCursorY = Buff->CurrentY; - Buff->CurrentX = NewCursorX; - Buff->CurrentY = NewCursorY; - if (Buff == Console->ActiveBuffer) - { - if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY)) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_UNSUCCESSFUL; - } - } - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -static VOID FASTCALL -ConioComputeUpdateRect(PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *UpdateRect, COORD *Start, UINT Length) -{ - if (Buff->MaxX <= Start->X + Length) - { - UpdateRect->Left = 0; - } - else - { - UpdateRect->Left = Start->X; - } - if (Buff->MaxX <= Start->X + Length) - { - UpdateRect->Right = Buff->MaxX - 1; - } - else - { - UpdateRect->Right = Start->X + Length - 1; - } - UpdateRect->Top = Start->Y; - UpdateRect->Bottom = Start->Y+ (Start->X + Length - 1) / Buff->MaxX; - if (Buff->MaxY <= UpdateRect->Bottom) - { - UpdateRect->Bottom = Buff->MaxY - 1; - } -} - -CSR_API(CsrWriteConsoleOutputChar) -{ - NTSTATUS Status; - PCHAR String, tmpString = NULL; - PBYTE Buffer; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - DWORD X, Y, Length, CharSize, Written = 0; - SMALL_RECT UpdateRect; - - DPRINT("CsrWriteConsoleOutputChar\n"); - - CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); - - if (Request->Header.u1.s1.TotalLength - < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR) - + (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize)) - { - DPRINT1("Invalid request size\n"); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - return STATUS_INVALID_PARAMETER; - } - - Status = ConioLockScreenBuffer(ProcessData, - Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle, - &Buff, - GENERIC_WRITE); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - if (NT_SUCCESS(Status)) - { - Console = Buff->Header.Console; - if(Request->Data.WriteConsoleOutputCharRequest.Unicode) - { - Length = WideCharToMultiByte(Console->OutputCodePage, 0, - (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, - Request->Data.WriteConsoleOutputCharRequest.Length, - NULL, 0, NULL, NULL); - tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length); - if (String) - { - WideCharToMultiByte(Console->OutputCodePage, 0, - (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, - Request->Data.WriteConsoleOutputCharRequest.Length, - String, Length, NULL, NULL); - } - else - { - Status = STATUS_NO_MEMORY; - } - } - else - { - String = (PCHAR)Request->Data.WriteConsoleOutputCharRequest.String; - } - - if (String) - { - if (NT_SUCCESS(Status)) - { - X = Request->Data.WriteConsoleOutputCharRequest.Coord.X; - Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; - Length = Request->Data.WriteConsoleOutputCharRequest.Length; - Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; - while (Length--) - { - *Buffer = *String++; - Written++; - Buffer += 2; - if (++X == Buff->MaxX) - { - if (++Y == Buff->MaxY) - { - Y = 0; - Buffer = Buff->Buffer; - } - X = 0; - } - } - if (Buff == Console->ActiveBuffer) - { - ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord, - Request->Data.WriteConsoleOutputCharRequest.Length); - ConioDrawRegion(Console, &UpdateRect); - } - - Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X; - Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY; - - } - if (Request->Data.WriteConsoleRequest.Unicode) - { - RtlFreeHeap(GetProcessHeap(), 0, tmpString); - } - } - ConioUnlockScreenBuffer(Buff); - } - Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written; - return Status; -} - -CSR_API(CsrFillOutputChar) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - DWORD X, Y, Length, Written = 0; - CHAR Char; - PBYTE Buffer; - SMALL_RECT UpdateRect; - - DPRINT("CsrFillOutputChar\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - X = Request->Data.FillOutputRequest.Position.X; - Y = (Request->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY; - Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; - if(Request->Data.FillOutputRequest.Unicode) - ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar); - else - Char = Request->Data.FillOutputRequest.Char.AsciiChar; - Length = Request->Data.FillOutputRequest.Length; - while (Length--) - { - *Buffer = Char; - Buffer += 2; - Written++; - if (++X == Buff->MaxX) - { - if (++Y == Buff->MaxY) - { - Y = 0; - Buffer = Buff->Buffer; - } - X = 0; - } - } - - if (Buff == Console->ActiveBuffer) - { - ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputRequest.Position, - Request->Data.FillOutputRequest.Length); - ConioDrawRegion(Console, &UpdateRect); - } - - ConioUnlockScreenBuffer(Buff); - Length = Request->Data.FillOutputRequest.Length; - Request->Data.FillOutputRequest.NrCharactersWritten = Length; - return STATUS_SUCCESS; -} - -CSR_API(CsrReadInputEvent) -{ - PLIST_ENTRY CurrentEntry; - PCSRSS_CONSOLE Console; - NTSTATUS Status; - BOOLEAN Done = FALSE; - ConsoleInput *Input; - - DPRINT("CsrReadInputEvent\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Request->Data.ReadInputRequest.Event = ProcessData->ConsoleEvent; - - Status = ConioLockConsole(ProcessData, Request->Data.ReadInputRequest.ConsoleHandle, &Console, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - /* only get input if there is any */ - CurrentEntry = Console->InputEvents.Flink; - while (CurrentEntry != &Console->InputEvents) - { - Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); - CurrentEntry = CurrentEntry->Flink; - - if (Done && !Input->Fake) - { - Request->Data.ReadInputRequest.MoreEvents = TRUE; - break; - } - - RemoveEntryList(&Input->ListEntry); - - if (!Done && !Input->Fake) - { - Request->Data.ReadInputRequest.Input = Input->InputEvent; - if (Request->Data.ReadInputRequest.Unicode == FALSE) - { - ConioInputEventToAnsi(Console, &Request->Data.ReadInputRequest.Input); - } - Done = TRUE; - } - - if (Input->InputEvent.EventType == KEY_EVENT) - { - if (0 != (Console->Mode & ENABLE_LINE_INPUT) - && Input->InputEvent.Event.KeyEvent.bKeyDown - && '\r' == Input->InputEvent.Event.KeyEvent.uChar.AsciiChar) - { - Console->WaitingLines--; - } - Console->WaitingChars--; - } - HeapFree(Win32CsrApiHeap, 0, Input); - } - - if (Done) - { - Status = STATUS_SUCCESS; - Console->EarlyReturn = FALSE; - } - else - { - Status = STATUS_PENDING; - Console->EarlyReturn = TRUE; /* mark for early return */ - } - - if (IsListEmpty(&Console->InputEvents)) - { - ResetEvent(Console->ActiveEvent); - } - - ConioUnlockConsole(Console); - - return Status; -} - -CSR_API(CsrWriteConsoleOutputAttrib) -{ - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - PUCHAR Buffer; - PWORD Attribute; - int X, Y, Length; - NTSTATUS Status; - SMALL_RECT UpdateRect; - - DPRINT("CsrWriteConsoleOutputAttrib\n"); - - if (Request->Header.u1.s1.TotalLength - < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB) - + Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD)) - { - DPRINT1("Invalid request size\n"); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - return STATUS_INVALID_PARAMETER; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, - Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle, - &Buff, - GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X; - Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; - Length = Request->Data.WriteConsoleOutputAttribRequest.Length; - Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1]; - Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute; - while (Length--) - { - *Buffer = (UCHAR)(*Attribute++); - Buffer += 2; - if (++X == Buff->MaxX) - { - if (++Y == Buff->MaxY) - { - Y = 0; - Buffer = Buff->Buffer + 1; - } - X = 0; - } - } - - if (Buff == Console->ActiveBuffer) - { - ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputAttribRequest.Coord, - Request->Data.WriteConsoleOutputAttribRequest.Length); - ConioDrawRegion(Console, &UpdateRect); - } - - Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = X; - Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY; - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrFillOutputAttrib) -{ - PCSRSS_SCREEN_BUFFER Buff; - PUCHAR Buffer; - NTSTATUS Status; - int X, Y, Length; - UCHAR Attr; - SMALL_RECT UpdateRect; - PCSRSS_CONSOLE Console; - - DPRINT("CsrFillOutputAttrib\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - X = Request->Data.FillOutputAttribRequest.Coord.X; - Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; - Length = Request->Data.FillOutputAttribRequest.Length; - Attr = Request->Data.FillOutputAttribRequest.Attribute; - Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1]; - while (Length--) - { - *Buffer = Attr; - Buffer += 2; - if (++X == Buff->MaxX) - { - if (++Y == Buff->MaxY) - { - Y = 0; - Buffer = Buff->Buffer + 1; - } - X = 0; - } - } - - if (Buff == Console->ActiveBuffer) - { - ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputAttribRequest.Coord, - Request->Data.FillOutputAttribRequest.Length); - ConioDrawRegion(Console, &UpdateRect); - } - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - - -CSR_API(CsrGetCursorInfo) -{ - PCSRSS_SCREEN_BUFFER Buff; - NTSTATUS Status; - - DPRINT("CsrGetCursorInfo\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Request->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible; - Request->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize; - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrSetCursorInfo) -{ - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - DWORD Size; - BOOL Visible; - NTSTATUS Status; - - DPRINT("CsrSetCursorInfo\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - Size = Request->Data.SetCursorInfoRequest.Info.dwSize; - Visible = Request->Data.SetCursorInfoRequest.Info.bVisible; - if (Size < 1) - { - Size = 1; - } - if (100 < Size) - { - Size = 100; - } - - if (Size != Buff->CursorInfo.dwSize - || (Visible && ! Buff->CursorInfo.bVisible) || (! Visible && Buff->CursorInfo.bVisible)) - { - Buff->CursorInfo.dwSize = Size; - Buff->CursorInfo.bVisible = Visible; - - if (! ConioSetCursorInfo(Console, Buff)) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_UNSUCCESSFUL; - } - } - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrSetTextAttrib) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - - DPRINT("CsrSetTextAttrib\n"); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib; - if (Buff == Console->ActiveBuffer) - { - if (! ConioUpdateScreenInfo(Console, Buff)) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_UNSUCCESSFUL; - } - } - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrSetConsoleMode) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - - DPRINT("CsrSetConsoleMode\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = Win32CsrLockObject(ProcessData, - Request->Data.SetConsoleModeRequest.ConsoleHandle, - (Object_t **) &Console, GENERIC_WRITE, 0); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Buff = (PCSRSS_SCREEN_BUFFER)Console; - if (CONIO_CONSOLE_MAGIC == Console->Header.Type) - { - Console->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_INPUT_MODE_VALID; - } - else if (CONIO_SCREEN_BUFFER_MAGIC == Console->Header.Type) - { - Buff->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_OUTPUT_MODE_VALID; - } - else - { - Status = STATUS_INVALID_HANDLE; - } - - Win32CsrUnlockObject((Object_t *)Console); - - return Status; -} - -CSR_API(CsrGetConsoleMode) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; /* gee, I really wish I could use an anonymous union here */ - - DPRINT("CsrGetConsoleMode\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = Win32CsrLockObject(ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle, - (Object_t **) &Console, GENERIC_READ, 0); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Status = STATUS_SUCCESS; - Buff = (PCSRSS_SCREEN_BUFFER) Console; - if (CONIO_CONSOLE_MAGIC == Console->Header.Type) - { - Request->Data.GetConsoleModeRequest.ConsoleMode = Console->Mode; - } - else if (CONIO_SCREEN_BUFFER_MAGIC == Buff->Header.Type) - { - Request->Data.GetConsoleModeRequest.ConsoleMode = Buff->Mode; - } - else - { - Status = STATUS_INVALID_HANDLE; - } - - Win32CsrUnlockObject((Object_t *)Console); - return Status; -} - -CSR_API(CsrCreateScreenBuffer) -{ - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - NTSTATUS Status; - - DPRINT("CsrCreateScreenBuffer\n"); - - RtlEnterCriticalSection(&ProcessData->HandleTableLock); - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Buff = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER)); - - if (Buff != NULL) - { - if (Console->ActiveBuffer) - { - Buff->MaxX = Console->ActiveBuffer->MaxX; - Buff->MaxY = Console->ActiveBuffer->MaxY; - Buff->CursorInfo.bVisible = Console->ActiveBuffer->CursorInfo.bVisible; - Buff->CursorInfo.dwSize = Console->ActiveBuffer->CursorInfo.dwSize; - } - else - { - Buff->CursorInfo.bVisible = TRUE; - Buff->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE; - } - - if (Buff->MaxX == 0) - { - Buff->MaxX = 80; - } - - if (Buff->MaxY == 0) - { - Buff->MaxY = 25; - } - - Status = CsrInitConsoleScreenBuffer(Console, Buff); - if(NT_SUCCESS(Status)) - { - Status = Win32CsrInsertObject(ProcessData, - &Request->Data.CreateScreenBufferRequest.OutputHandle, - &Buff->Header, - Request->Data.CreateScreenBufferRequest.Access, - Request->Data.CreateScreenBufferRequest.Inheritable, - Request->Data.CreateScreenBufferRequest.ShareMode); - } - } - else - { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - - ConioUnlockConsole(Console); - RtlLeaveCriticalSection(&ProcessData->HandleTableLock); - return Status; -} - -CSR_API(CsrSetScreenBuffer) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - - DPRINT("CsrSetScreenBuffer\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferRequest.OutputHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - if (Buff == Console->ActiveBuffer) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_SUCCESS; - } - - /* If old buffer has no handles, it's now unreferenced */ - if (Console->ActiveBuffer->Header.HandleCount == 0) - { - ConioDeleteScreenBuffer(Console->ActiveBuffer); - } - /* tie console to new buffer */ - Console->ActiveBuffer = Buff; - /* Redraw the console */ - ConioDrawConsole(Console); - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrSetTitle) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PWCHAR Buffer; - - DPRINT("CsrSetTitle\n"); - - if (Request->Header.u1.s1.TotalLength - < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) - + Request->Data.SetTitleRequest.Length) - { - DPRINT1("Invalid request size\n"); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - return STATUS_INVALID_PARAMETER; - } - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - if(NT_SUCCESS(Status)) - { - Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length); - if (Buffer) - { - /* copy title to console */ - RtlFreeUnicodeString(&Console->Title); - Console->Title.Buffer = Buffer; - Console->Title.Length = Console->Title.MaximumLength = Request->Data.SetTitleRequest.Length; - memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length); - if (! ConioChangeTitle(Console)) - { - Status = STATUS_UNSUCCESSFUL; - } - else - { - Status = STATUS_SUCCESS; - } - } - else - { - Status = STATUS_NO_MEMORY; - } - ConioUnlockConsole(Console); - } - - return Status; -} - -CSR_API(CsrGetTitle) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - DWORD Length; - - DPRINT("CsrGetTitle\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Can't get console\n"); - return Status; - } - - /* Copy title of the console to the user title buffer */ - RtlZeroMemory(&Request->Data.GetTitleRequest, sizeof(CSRSS_GET_TITLE)); - Request->Data.GetTitleRequest.Length = Console->Title.Length; - memcpy (Request->Data.GetTitleRequest.Title, Console->Title.Buffer, - Console->Title.Length); - Length = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_SET_TITLE) + Console->Title.Length; - - ConioUnlockConsole(Console); - - if (Length > sizeof(CSR_API_MESSAGE)) - { - Request->Header.u1.s1.TotalLength = Length; - Request->Header.u1.s1.DataLength = Length - sizeof(PORT_MESSAGE); - } - return STATUS_SUCCESS; -} - -CSR_API(CsrWriteConsoleOutput) -{ - SHORT i, X, Y, SizeX, SizeY; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - SMALL_RECT ScreenBuffer; - CHAR_INFO* CurCharInfo; - SMALL_RECT WriteRegion; - CHAR_INFO* CharInfo; - COORD BufferCoord; - COORD BufferSize; - NTSTATUS Status; - PBYTE Ptr; - DWORD PSize; - - DPRINT("CsrWriteConsoleOutput\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = ConioLockScreenBuffer(ProcessData, - Request->Data.WriteConsoleOutputRequest.ConsoleHandle, - &Buff, - GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize; - PSize = BufferSize.X * BufferSize.Y * sizeof(CHAR_INFO); - BufferCoord = Request->Data.WriteConsoleOutputRequest.BufferCoord; - CharInfo = Request->Data.WriteConsoleOutputRequest.CharInfo; - if (((PVOID)CharInfo < ProcessData->CsrSectionViewBase) || - (((ULONG_PTR)CharInfo + PSize) > - ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize))) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_ACCESS_VIOLATION; - } - WriteRegion = Request->Data.WriteConsoleOutputRequest.WriteRegion; - - SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion)); - SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&WriteRegion)); - WriteRegion.Bottom = WriteRegion.Top + SizeY - 1; - WriteRegion.Right = WriteRegion.Left + SizeX - 1; - - /* Make sure WriteRegion is inside the screen buffer */ - ConioInitRect(&ScreenBuffer, 0, 0, Buff->MaxY - 1, Buff->MaxX - 1); - if (! ConioGetIntersection(&WriteRegion, &ScreenBuffer, &WriteRegion)) - { - ConioUnlockScreenBuffer(Buff); - - /* It is okay to have a WriteRegion completely outside the screen buffer. - No data is written then. */ - return STATUS_SUCCESS; - } - - for (i = 0, Y = WriteRegion.Top; Y <= WriteRegion.Bottom; i++, Y++) - { - CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X; - Ptr = ConioCoordToPointer(Buff, WriteRegion.Left, Y); - for (X = WriteRegion.Left; X <= WriteRegion.Right; X++) - { - CHAR AsciiChar; - if (Request->Data.WriteConsoleOutputRequest.Unicode) - { - ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar); - } - else - { - AsciiChar = CurCharInfo->Char.AsciiChar; - } - *Ptr++ = AsciiChar; - *Ptr++ = CurCharInfo->Attributes; - CurCharInfo++; - } - } - - ConioDrawRegion(Console, &WriteRegion); - - ConioUnlockScreenBuffer(Buff); - - Request->Data.WriteConsoleOutputRequest.WriteRegion.Right = WriteRegion.Left + SizeX - 1; - Request->Data.WriteConsoleOutputRequest.WriteRegion.Bottom = WriteRegion.Top + SizeY - 1; - Request->Data.WriteConsoleOutputRequest.WriteRegion.Left = WriteRegion.Left; - Request->Data.WriteConsoleOutputRequest.WriteRegion.Top = WriteRegion.Top; - - return STATUS_SUCCESS; -} - -CSR_API(CsrFlushInputBuffer) -{ - PLIST_ENTRY CurrentEntry; - PCSRSS_CONSOLE Console; - ConsoleInput* Input; - NTSTATUS Status; - - DPRINT("CsrFlushInputBuffer\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = ConioLockConsole(ProcessData, - Request->Data.FlushInputBufferRequest.ConsoleInput, - &Console, - GENERIC_WRITE); - if(! NT_SUCCESS(Status)) - { - return Status; - } - - /* Discard all entries in the input event queue */ - while (!IsListEmpty(&Console->InputEvents)) - { - CurrentEntry = RemoveHeadList(&Console->InputEvents); - Input = CONTAINING_RECORD(CurrentEntry, ConsoleInput, ListEntry); - /* Destroy the event */ - HeapFree(Win32CsrApiHeap, 0, Input); - } - ResetEvent(Console->ActiveEvent); - Console->WaitingChars=0; - - ConioUnlockConsole(Console); - - return STATUS_SUCCESS; -} - -CSR_API(CsrScrollConsoleScreenBuffer) -{ - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - SMALL_RECT ScreenBuffer; - SMALL_RECT SrcRegion; - SMALL_RECT DstRegion; - SMALL_RECT UpdateRegion; - SMALL_RECT ScrollRectangle; - SMALL_RECT ClipRectangle; - NTSTATUS Status; - HANDLE ConsoleHandle; - BOOLEAN UseClipRectangle; - COORD DestinationOrigin; - CHAR_INFO Fill; - CHAR FillChar; - - DPRINT("CsrScrollConsoleScreenBuffer\n"); - - ConsoleHandle = Request->Data.ScrollConsoleScreenBufferRequest.ConsoleHandle; - UseClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.UseClipRectangle; - DestinationOrigin = Request->Data.ScrollConsoleScreenBufferRequest.DestinationOrigin; - Fill = Request->Data.ScrollConsoleScreenBufferRequest.Fill; - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - ScrollRectangle = Request->Data.ScrollConsoleScreenBufferRequest.ScrollRectangle; - - /* Make sure source rectangle is inside the screen buffer */ - ConioInitRect(&ScreenBuffer, 0, 0, Buff->MaxY - 1, Buff->MaxX - 1); - if (! ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle)) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_SUCCESS; - } - - /* If the source was clipped on the left or top, adjust the destination accordingly */ - if (ScrollRectangle.Left < 0) - { - DestinationOrigin.X -= ScrollRectangle.Left; - } - if (ScrollRectangle.Top < 0) - { - DestinationOrigin.Y -= ScrollRectangle.Top; - } - - if (UseClipRectangle) - { - ClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.ClipRectangle; - if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer)) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_SUCCESS; - } - } - else - { - ClipRectangle = ScreenBuffer; - } - - ConioInitRect(&DstRegion, - DestinationOrigin.Y, - DestinationOrigin.X, - DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1, - DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1); - - if (Request->Data.ScrollConsoleScreenBufferRequest.Unicode) - ConsoleUnicodeCharToAnsiChar(Console, &FillChar, &Fill.Char.UnicodeChar); - else - FillChar = Fill.Char.AsciiChar; - - ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, Fill.Attributes << 8 | (BYTE)FillChar); - - if (Buff == Console->ActiveBuffer) - { - ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion); - if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle)) - { - /* Draw update region */ - ConioDrawRegion(Console, &UpdateRegion); - } - } - - ConioUnlockScreenBuffer(Buff); - - return STATUS_SUCCESS; -} - -CSR_API(CsrReadConsoleOutputChar) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - DWORD Xpos, Ypos; - PCHAR ReadBuffer; - DWORD i; - ULONG CharSize; - CHAR Char; - - DPRINT("CsrReadConsoleOutputChar\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); - ReadBuffer = Request->Data.ReadConsoleOutputCharRequest.String; - - CharSize = (Request->Data.ReadConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X; - Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY; - - for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i) - { - Char = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX)]; - - if(Request->Data.ReadConsoleOutputCharRequest.Unicode) - { - ConsoleAnsiCharToUnicodeChar(Console, (WCHAR*)ReadBuffer, &Char); - ReadBuffer += sizeof(WCHAR); - } - else - *(ReadBuffer++) = Char; - - Xpos++; - - if (Xpos == Buff->MaxX) - { - Xpos = 0; - Ypos++; - - if (Ypos == Buff->MaxY) - { - Ypos = 0; - } - } - } - - *ReadBuffer = 0; - Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos; - Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY; - - ConioUnlockScreenBuffer(Buff); - - Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize; - if (Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE)) - { - Request->Header.u1.s1.TotalLength = Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR); - Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); - } - - return STATUS_SUCCESS; -} - - -CSR_API(CsrReadConsoleOutputAttrib) -{ - NTSTATUS Status; - PCSRSS_SCREEN_BUFFER Buff; - DWORD Xpos, Ypos; - PWORD ReadBuffer; - DWORD i; - DWORD CurrentLength; - - DPRINT("CsrReadConsoleOutputAttrib\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); - ReadBuffer = Request->Data.ReadConsoleOutputAttribRequest.Attribute; - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X; - Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY; - - for (i = 0; i < Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead; ++i) - { - *ReadBuffer = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX) + 1]; - - ReadBuffer++; - Xpos++; - - if (Xpos == Buff->MaxX) - { - Xpos = 0; - Ypos++; - - if (Ypos == Buff->MaxY) - { - Ypos = 0; - } - } - } - - *ReadBuffer = 0; - - Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos; - Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY; - - ConioUnlockScreenBuffer(Buff); - - CurrentLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB) - + Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead * sizeof(WORD); - if (CurrentLength > sizeof(CSR_API_MESSAGE)) - { - Request->Header.u1.s1.TotalLength = CurrentLength; - Request->Header.u1.s1.DataLength = CurrentLength - sizeof(PORT_MESSAGE); - } - - return STATUS_SUCCESS; -} - - -CSR_API(CsrGetNumberOfConsoleInputEvents) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PLIST_ENTRY CurrentItem; - DWORD NumEvents; - ConsoleInput *Input; - - DPRINT("CsrGetNumberOfConsoleInputEvents\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); - - Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - CurrentItem = Console->InputEvents.Flink; - NumEvents = 0; - - /* If there are any events ... */ - while (CurrentItem != &Console->InputEvents) - { - Input = CONTAINING_RECORD(CurrentItem, ConsoleInput, ListEntry); - CurrentItem = CurrentItem->Flink; - if (!Input->Fake) - { - NumEvents++; - } - } - - ConioUnlockConsole(Console); - - Request->Data.GetNumInputEventsRequest.NumInputEvents = NumEvents; - - return STATUS_SUCCESS; -} - - -CSR_API(CsrPeekConsoleInput) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - DWORD Size; - DWORD Length; - PLIST_ENTRY CurrentItem; - PINPUT_RECORD InputRecord; - ConsoleInput* Item; - UINT NumItems; - - DPRINT("CsrPeekConsoleInput\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockConsole(ProcessData, Request->Data.GetNumInputEventsRequest.ConsoleHandle, &Console, GENERIC_READ); - if(! NT_SUCCESS(Status)) - { - return Status; - } - - InputRecord = Request->Data.PeekConsoleInputRequest.InputRecord; - Length = Request->Data.PeekConsoleInputRequest.Length; - Size = Length * sizeof(INPUT_RECORD); - - if (((PVOID)InputRecord < ProcessData->CsrSectionViewBase) - || (((ULONG_PTR)InputRecord + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize))) - { - ConioUnlockConsole(Console); - return STATUS_ACCESS_VIOLATION; - } - - NumItems = 0; - - if (! IsListEmpty(&Console->InputEvents)) - { - CurrentItem = Console->InputEvents.Flink; - - while (CurrentItem != &Console->InputEvents && NumItems < Length) - { - Item = CONTAINING_RECORD(CurrentItem, ConsoleInput, ListEntry); - - if (Item->Fake) - { - CurrentItem = CurrentItem->Flink; - continue; - } - - ++NumItems; - *InputRecord = Item->InputEvent; - - if (Request->Data.ReadInputRequest.Unicode == FALSE) - { - ConioInputEventToAnsi(Console, InputRecord); - } - - InputRecord++; - CurrentItem = CurrentItem->Flink; - } - } - - ConioUnlockConsole(Console); - - Request->Data.PeekConsoleInputRequest.Length = NumItems; - - return STATUS_SUCCESS; -} - - -CSR_API(CsrReadConsoleOutput) -{ - PCHAR_INFO CharInfo; - PCHAR_INFO CurCharInfo; - PCSRSS_SCREEN_BUFFER Buff; - DWORD Size; - DWORD Length; - DWORD SizeX, SizeY; - NTSTATUS Status; - COORD BufferSize; - COORD BufferCoord; - SMALL_RECT ReadRegion; - SMALL_RECT ScreenRect; - DWORD i; - PBYTE Ptr; - LONG X, Y; - UINT CodePage; - - DPRINT("CsrReadConsoleOutput\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff, GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - CharInfo = Request->Data.ReadConsoleOutputRequest.CharInfo; - ReadRegion = Request->Data.ReadConsoleOutputRequest.ReadRegion; - BufferSize = Request->Data.ReadConsoleOutputRequest.BufferSize; - BufferCoord = Request->Data.ReadConsoleOutputRequest.BufferCoord; - Length = BufferSize.X * BufferSize.Y; - Size = Length * sizeof(CHAR_INFO); - - /* FIXME: Is this correct? */ - CodePage = ProcessData->Console->OutputCodePage; - - if (((PVOID)CharInfo < ProcessData->CsrSectionViewBase) - || (((ULONG_PTR)CharInfo + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize))) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_ACCESS_VIOLATION; - } - - SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&ReadRegion)); - SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&ReadRegion)); - ReadRegion.Bottom = ReadRegion.Top + SizeY; - ReadRegion.Right = ReadRegion.Left + SizeX; - - ConioInitRect(&ScreenRect, 0, 0, Buff->MaxY, Buff->MaxX); - if (! ConioGetIntersection(&ReadRegion, &ScreenRect, &ReadRegion)) - { - ConioUnlockScreenBuffer(Buff); - return STATUS_SUCCESS; - } - - for (i = 0, Y = ReadRegion.Top; Y < ReadRegion.Bottom; ++i, ++Y) - { - CurCharInfo = CharInfo + (i * BufferSize.X); - - Ptr = ConioCoordToPointer(Buff, ReadRegion.Left, Y); - for (X = ReadRegion.Left; X < ReadRegion.Right; ++X) - { - if (Request->Data.ReadConsoleOutputRequest.Unicode) - { - MultiByteToWideChar(CodePage, 0, - (PCHAR)Ptr++, 1, - &CurCharInfo->Char.UnicodeChar, 1); - } - else - { - CurCharInfo->Char.AsciiChar = *Ptr++; - } - CurCharInfo->Attributes = *Ptr++; - ++CurCharInfo; - } - } - - ConioUnlockScreenBuffer(Buff); - - Request->Data.ReadConsoleOutputRequest.ReadRegion.Right = ReadRegion.Left + SizeX - 1; - Request->Data.ReadConsoleOutputRequest.ReadRegion.Bottom = ReadRegion.Top + SizeY - 1; - Request->Data.ReadConsoleOutputRequest.ReadRegion.Left = ReadRegion.Left; - Request->Data.ReadConsoleOutputRequest.ReadRegion.Top = ReadRegion.Top; - - return STATUS_SUCCESS; -} - - -CSR_API(CsrWriteConsoleInput) -{ - PINPUT_RECORD InputRecord; - PCSRSS_CONSOLE Console; - NTSTATUS Status; - DWORD Length; - DWORD Size; - DWORD i; - ConsoleInput* Record; - - DPRINT("CsrWriteConsoleInput\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockConsole(ProcessData, Request->Data.WriteConsoleInputRequest.ConsoleHandle, &Console, GENERIC_WRITE); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - InputRecord = Request->Data.WriteConsoleInputRequest.InputRecord; - Length = Request->Data.WriteConsoleInputRequest.Length; - Size = Length * sizeof(INPUT_RECORD); - - if (((PVOID)InputRecord < ProcessData->CsrSectionViewBase) - || (((ULONG_PTR)InputRecord + Size) > ((ULONG_PTR)ProcessData->CsrSectionViewBase + ProcessData->CsrSectionViewSize))) - { - ConioUnlockConsole(Console); - return STATUS_ACCESS_VIOLATION; - } - - for (i = 0; i < Length; i++) - { - Record = HeapAlloc(Win32CsrApiHeap, 0, sizeof(ConsoleInput)); - if (NULL == Record) - { - ConioUnlockConsole(Console); - return STATUS_INSUFFICIENT_RESOURCES; - } - - Record->Echoed = FALSE; - Record->Fake = FALSE; - //Record->InputEvent = *InputRecord++; - memcpy(&Record->InputEvent, &InputRecord[i], sizeof(INPUT_RECORD)); - if (KEY_EVENT == Record->InputEvent.EventType) - { - /* FIXME - convert from unicode to ascii!! */ - ConioProcessChar(Console, Record); - } - } - - ConioUnlockConsole(Console); - - Request->Data.WriteConsoleInputRequest.Length = i; - - return STATUS_SUCCESS; -} - -/********************************************************************** - * HardwareStateProperty - * - * DESCRIPTION - * Set/Get the value of the HardwareState and switch - * between direct video buffer ouput and GDI windowed - * output. - * ARGUMENTS - * Client hands us a CSRSS_CONSOLE_HARDWARE_STATE - * object. We use the same object to Request. - * NOTE - * ConsoleHwState has the correct size to be compatible - * with NT's, but values are not. - */ -static NTSTATUS FASTCALL -SetConsoleHardwareState (PCSRSS_CONSOLE Console, DWORD ConsoleHwState) -{ - DPRINT1("Console Hardware State: %d\n", ConsoleHwState); - - if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState) - ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState)) - { - if (Console->HardwareState != ConsoleHwState) - { - /* TODO: implement switching from full screen to windowed mode */ - /* TODO: or back; now simply store the hardware state */ - Console->HardwareState = ConsoleHwState; - } - - return STATUS_SUCCESS; - } - - return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */ -} - -CSR_API(CsrHardwareStateProperty) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrHardwareStateProperty\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockConsole(ProcessData, - Request->Data.ConsoleHardwareStateRequest.ConsoleHandle, - &Console, - GENERIC_READ); - if (! NT_SUCCESS(Status)) - { - DPRINT1("Failed to get console handle in SetConsoleHardwareState\n"); - return Status; - } - - switch (Request->Data.ConsoleHardwareStateRequest.SetGet) - { - case CONSOLE_HARDWARE_STATE_GET: - Request->Data.ConsoleHardwareStateRequest.State = Console->HardwareState; - break; - - case CONSOLE_HARDWARE_STATE_SET: - DPRINT("Setting console hardware state.\n"); - Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State); - break; - - default: - Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */ - break; - } - - ConioUnlockConsole(Console); - - return Status; -} - -CSR_API(CsrGetConsoleWindow) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrGetConsoleWindow\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow; - ConioUnlockConsole(Console); - - return STATUS_SUCCESS; -} - -CSR_API(CsrSetConsoleIcon) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrSetConsoleIcon\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon) - ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); - ConioUnlockConsole(Console); - - return Status; -} - -CSR_API(CsrGetConsoleCodePage) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrGetConsoleCodePage\n"); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Request->Data.GetConsoleCodePage.CodePage = Console->CodePage; - ConioUnlockConsole(Console); - return STATUS_SUCCESS; -} - -CSR_API(CsrSetConsoleCodePage) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrSetConsoleCodePage\n"); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - if (IsValidCodePage(Request->Data.SetConsoleCodePage.CodePage)) - { - Console->CodePage = Request->Data.SetConsoleCodePage.CodePage; - ConioUnlockConsole(Console); - return STATUS_SUCCESS; - } - - ConioUnlockConsole(Console); - return STATUS_INVALID_PARAMETER; -} - -CSR_API(CsrGetConsoleOutputCodePage) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrGetConsoleOutputCodePage\n"); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - Request->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage; - ConioUnlockConsole(Console); - return STATUS_SUCCESS; -} - -CSR_API(CsrSetConsoleOutputCodePage) -{ - PCSRSS_CONSOLE Console; - NTSTATUS Status; - - DPRINT("CsrSetConsoleOutputCodePage\n"); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - if (IsValidCodePage(Request->Data.SetConsoleOutputCodePage.CodePage)) - { - Console->OutputCodePage = Request->Data.SetConsoleOutputCodePage.CodePage; - ConioUnlockConsole(Console); - return STATUS_SUCCESS; - } - - ConioUnlockConsole(Console); - return STATUS_INVALID_PARAMETER; -} - -CSR_API(CsrGetProcessList) -{ - PDWORD Buffer; - PCSRSS_CONSOLE Console; - PCSRSS_PROCESS_DATA current; - PLIST_ENTRY current_entry; - ULONG nItems = 0; - NTSTATUS Status; - ULONG_PTR Offset; - - DPRINT("CsrGetProcessList\n"); - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Buffer = Request->Data.GetProcessListRequest.ProcessId; - Offset = (PBYTE)Buffer - (PBYTE)ProcessData->CsrSectionViewBase; - if (Offset >= ProcessData->CsrSectionViewSize - || (Request->Data.GetProcessListRequest.nMaxIds * sizeof(DWORD)) > (ProcessData->CsrSectionViewSize - Offset) - || Offset & (sizeof(DWORD) - 1)) - { - return STATUS_ACCESS_VIOLATION; - } - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - for(current_entry = Console->ProcessList.Flink; - current_entry != &Console->ProcessList; - current_entry = current_entry->Flink) - { - current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); - if(++nItems <= Request->Data.GetProcessListRequest.nMaxIds) - { - *Buffer++ = (DWORD)current->ProcessId; - } - } - - ConioUnlockConsole(Console); - - Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems; - return STATUS_SUCCESS; -} - -CSR_API(CsrGenerateCtrlEvent) -{ - PCSRSS_CONSOLE Console; - PCSRSS_PROCESS_DATA current; - PLIST_ENTRY current_entry; - DWORD Group; - NTSTATUS Status; - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (! NT_SUCCESS(Status)) - { - return Status; - } - - Group = Request->Data.GenerateCtrlEvent.ProcessGroup; - Status = STATUS_INVALID_PARAMETER; - for (current_entry = Console->ProcessList.Flink; - current_entry != &Console->ProcessList; - current_entry = current_entry->Flink) - { - current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); - if (Group == 0 || current->ProcessGroup == Group) - { - ConioConsoleCtrlEvent(Request->Data.GenerateCtrlEvent.Event, current); - Status = STATUS_SUCCESS; - } - } - - ConioUnlockConsole(Console); - - return Status; -} - -CSR_API(CsrSetScreenBufferSize) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferSize.OutputHandle, &Buff, GENERIC_WRITE); - if (!NT_SUCCESS(Status)) - { - return Status; - } - Console = Buff->Header.Console; - - Status = ConioResizeBuffer(Console, Buff, Request->Data.SetScreenBufferSize.Size); - ConioUnlockScreenBuffer(Buff); - - return Status; -} - -CSR_API(CsrGetConsoleSelectionInfo) -{ - NTSTATUS Status; - PCSRSS_CONSOLE Console; - - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - - Status = ConioConsoleFromProcessData(ProcessData, &Console); - if (NT_SUCCESS(Status)) - { - memset(&Request->Data.GetConsoleSelectionInfo.Info, 0, sizeof(CONSOLE_SELECTION_INFO)); - if (Console->Selection.dwFlags != 0) - Request->Data.GetConsoleSelectionInfo.Info = Console->Selection; - ConioUnlockConsole(Console); - } - return Status; -} - -/* EOF */ diff --git a/subsystems/win32/csrss/win32csr/conio.h b/subsystems/win32/csrss/win32csr/conio.h index 9b0c6905ce8..40e3dd55ce7 100644 --- a/subsystems/win32/csrss/win32csr/conio.h +++ b/subsystems/win32/csrss/win32csr/conio.h @@ -75,14 +75,22 @@ typedef struct tagCSRSS_CONSOLE PCSRSS_CONSOLE Prev, Next; /* Next and Prev consoles in console wheel */ HANDLE ActiveEvent; LIST_ENTRY InputEvents; /* List head for input event queue */ - WORD WaitingChars; - WORD WaitingLines; /* number of chars and lines in input queue */ + PWCHAR LineBuffer; /* current line being input, in line buffered mode */ + WORD LineMaxSize; /* maximum size of line in characters (including CR+LF) */ + WORD LineSize; /* current size of line */ + WORD LinePos; /* current position within line */ + BOOLEAN LineComplete; /* user pressed enter, ready to send back to client */ + BOOLEAN LineUpPressed; + BOOLEAN LineInsertToggle; /* replace character over cursor instead of inserting */ + ULONG LineWakeupMask; /* bitmap of which control characters will end line input */ + LIST_ENTRY HistoryBuffers; + WORD HistoryBufferSize; /* size for newly created history buffers */ + WORD NumberOfHistoryBuffers; /* maximum number of history buffers allowed */ + BOOLEAN HistoryNoDup; /* remove old duplicate history entries */ LIST_ENTRY BufferList; /* List of all screen buffers for this console */ PCSRSS_SCREEN_BUFFER ActiveBuffer; /* Pointer to currently active screen buffer */ WORD Mode; /* Console mode flags */ - WORD EchoCount; /* count of chars to echo, in line buffered mode */ UNICODE_STRING Title; /* Title of console */ - BOOL EarlyReturn; /* wake client and return data, even if we are in line buffered mode, and we don't have a complete line */ DWORD HardwareState; /* _GDI_MANAGED, _DIRECT */ HWND hWindow; COORD Size; @@ -101,9 +109,6 @@ typedef struct ConsoleInput_t { LIST_ENTRY ListEntry; INPUT_RECORD InputEvent; - BOOLEAN Echoed; // already been echoed or not - BOOLEAN Fake; // synthesized, not a real event - BOOLEAN NotChar; // message should not be used to return a character } ConsoleInput; /* CONSOLE_SELECTION_INFO dwFlags values */ @@ -112,68 +117,14 @@ typedef struct ConsoleInput_t #define CONSOLE_SELECTION_NOT_EMPTY 0x2 #define CONSOLE_MOUSE_SELECTION 0x4 #define CONSOLE_MOUSE_DOWN 0x8 +/* HistoryFlags values */ +#define HISTORY_NO_DUP_FLAG 0x1 /* PauseFlags values (internal only) */ #define PAUSED_FROM_KEYBOARD 0x1 #define PAUSED_FROM_SCROLLBAR 0x2 #define PAUSED_FROM_SELECTION 0x4 -NTSTATUS FASTCALL ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console); -VOID WINAPI ConioDeleteConsole(Object_t *Object); -VOID WINAPI ConioDeleteScreenBuffer(PCSRSS_SCREEN_BUFFER Buffer); -VOID WINAPI CsrInitConsoleSupport(VOID); -VOID FASTCALL ConioPause(PCSRSS_CONSOLE Console, UINT Flags); -VOID FASTCALL ConioUnpause(PCSRSS_CONSOLE Console, UINT Flags); -void WINAPI ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode); -PBYTE FASTCALL ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buf, ULONG X, ULONG Y); -VOID FASTCALL ConioDrawConsole(PCSRSS_CONSOLE Console); -VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData); -VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, - DWORD Timeout); - -/* api/conio.c */ -CSR_API(CsrWriteConsole); -CSR_API(CsrAllocConsole); -CSR_API(CsrFreeConsole); -CSR_API(CsrReadConsole); -CSR_API(CsrConnectProcess); -CSR_API(CsrGetScreenBufferInfo); -CSR_API(CsrSetCursor); -CSR_API(CsrFillOutputChar); -CSR_API(CsrReadInputEvent); -CSR_API(CsrWriteConsoleOutputChar); -CSR_API(CsrWriteConsoleOutputAttrib); -CSR_API(CsrFillOutputAttrib); -CSR_API(CsrGetCursorInfo); -CSR_API(CsrSetCursorInfo); -CSR_API(CsrSetTextAttrib); -CSR_API(CsrSetConsoleMode); -CSR_API(CsrGetConsoleMode); -CSR_API(CsrCreateScreenBuffer); -CSR_API(CsrSetScreenBuffer); -CSR_API(CsrSetTitle); -CSR_API(CsrGetTitle); -CSR_API(CsrWriteConsoleOutput); -CSR_API(CsrFlushInputBuffer); -CSR_API(CsrScrollConsoleScreenBuffer); -CSR_API(CsrReadConsoleOutputChar); -CSR_API(CsrReadConsoleOutputAttrib); -CSR_API(CsrGetNumberOfConsoleInputEvents); -CSR_API(CsrPeekConsoleInput); -CSR_API(CsrReadConsoleOutput); -CSR_API(CsrWriteConsoleInput); -CSR_API(CsrHardwareStateProperty); -CSR_API(CsrGetConsoleWindow); -CSR_API(CsrSetConsoleIcon); -CSR_API(CsrGetConsoleCodePage); -CSR_API(CsrSetConsoleCodePage); -CSR_API(CsrGetConsoleOutputCodePage); -CSR_API(CsrSetConsoleOutputCodePage); -CSR_API(CsrGetProcessList); -CSR_API(CsrGenerateCtrlEvent); -CSR_API(CsrSetScreenBufferSize); -CSR_API(CsrGetConsoleSelectionInfo); - #define ConioInitScreenBuffer(Console, Buff) (Console)->Vtbl->InitScreenBuffer((Console), (Buff)) #define ConioDrawRegion(Console, Region) (Console)->Vtbl->DrawRegion((Console), (Region)) #define ConioWriteStream(Console, Block, CurStartX, CurStartY, ScrolledLines, Buffer, Length) \ @@ -189,19 +140,80 @@ CSR_API(CsrGetConsoleSelectionInfo); #define ConioChangeIcon(Console, hWindowIcon) (Console)->Vtbl->ChangeIcon(Console, hWindowIcon) #define ConioResizeBuffer(Console, Buff, Size) (Console)->Vtbl->ResizeBuffer(Console, Buff, Size) -#define ConioRectHeight(Rect) \ - (((Rect)->Top) > ((Rect)->Bottom) ? 0 : ((Rect)->Bottom) - ((Rect)->Top) + 1) -#define ConioRectWidth(Rect) \ - (((Rect)->Left) > ((Rect)->Right) ? 0 : ((Rect)->Right) - ((Rect)->Left) + 1) +/* console.c */ +NTSTATUS FASTCALL ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console); +VOID WINAPI ConioDeleteConsole(Object_t *Object); +VOID WINAPI CsrInitConsoleSupport(VOID); +VOID FASTCALL ConioPause(PCSRSS_CONSOLE Console, UINT Flags); +VOID FASTCALL ConioUnpause(PCSRSS_CONSOLE Console, UINT Flags); +VOID FASTCALL ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData); +VOID FASTCALL ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, + DWORD Timeout); +CSR_API(CsrAllocConsole); +CSR_API(CsrFreeConsole); +CSR_API(CsrSetConsoleMode); +CSR_API(CsrGetConsoleMode); +CSR_API(CsrSetTitle); +CSR_API(CsrGetTitle); +CSR_API(CsrHardwareStateProperty); +CSR_API(CsrGetConsoleWindow); +CSR_API(CsrSetConsoleIcon); +CSR_API(CsrGetConsoleCodePage); +CSR_API(CsrSetConsoleCodePage); +CSR_API(CsrGetConsoleOutputCodePage); +CSR_API(CsrSetConsoleOutputCodePage); +CSR_API(CsrGetProcessList); +CSR_API(CsrGenerateCtrlEvent); +CSR_API(CsrGetConsoleSelectionInfo); +/* coninput.c */ #define ConioLockConsole(ProcessData, Handle, Ptr, Access) \ Win32CsrLockObject((ProcessData), (Handle), (Object_t **)(Ptr), Access, CONIO_CONSOLE_MAGIC) #define ConioUnlockConsole(Console) \ Win32CsrUnlockObject((Object_t *) Console) +void WINAPI ConioProcessKey(MSG *msg, PCSRSS_CONSOLE Console, BOOL TextMode); +CSR_API(CsrReadConsole); +CSR_API(CsrReadInputEvent); +CSR_API(CsrFlushInputBuffer); +CSR_API(CsrGetNumberOfConsoleInputEvents); +CSR_API(CsrPeekConsoleInput); +CSR_API(CsrWriteConsoleInput); + +/* conoutput.c */ +#define ConioRectHeight(Rect) \ + (((Rect)->Top) > ((Rect)->Bottom) ? 0 : ((Rect)->Bottom) - ((Rect)->Top) + 1) +#define ConioRectWidth(Rect) \ + (((Rect)->Left) > ((Rect)->Right) ? 0 : ((Rect)->Right) - ((Rect)->Left) + 1) #define ConioLockScreenBuffer(ProcessData, Handle, Ptr, Access) \ Win32CsrLockObject((ProcessData), (Handle), (Object_t **)(Ptr), Access, CONIO_SCREEN_BUFFER_MAGIC) #define ConioUnlockScreenBuffer(Buff) \ Win32CsrUnlockObject((Object_t *) Buff) +PBYTE FASTCALL ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buf, ULONG X, ULONG Y); +VOID FASTCALL ConioDrawConsole(PCSRSS_CONSOLE Console); +NTSTATUS FASTCALL ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, + CHAR *Buffer, DWORD Length, BOOL Attrib); +NTSTATUS FASTCALL CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer); +VOID WINAPI ConioDeleteScreenBuffer(PCSRSS_SCREEN_BUFFER Buffer); +DWORD FASTCALL ConioEffectiveCursorSize(PCSRSS_CONSOLE Console, DWORD Scale); + +CSR_API(CsrWriteConsole); +CSR_API(CsrGetScreenBufferInfo); +CSR_API(CsrSetCursor); +CSR_API(CsrWriteConsoleOutputChar); +CSR_API(CsrFillOutputChar); +CSR_API(CsrWriteConsoleOutputAttrib); +CSR_API(CsrFillOutputAttrib); +CSR_API(CsrGetCursorInfo); +CSR_API(CsrSetCursorInfo); +CSR_API(CsrSetTextAttrib); +CSR_API(CsrCreateScreenBuffer); +CSR_API(CsrSetScreenBuffer); +CSR_API(CsrWriteConsoleOutput); +CSR_API(CsrScrollConsoleScreenBuffer); +CSR_API(CsrReadConsoleOutputChar); +CSR_API(CsrReadConsoleOutputAttrib); +CSR_API(CsrReadConsoleOutput); +CSR_API(CsrSetScreenBufferSize); /* alias.c */ VOID IntDeleteAllAliases(struct tagALIAS_HEADER *RootHeader); @@ -212,4 +224,15 @@ CSR_API(CsrGetAllConsoleAliasesLength); CSR_API(CsrGetConsoleAliasesExes); CSR_API(CsrGetConsoleAliasesExesLength); +/* lineinput.c */ +struct tagHISTORY_BUFFER; +VOID FASTCALL HistoryDeleteBuffer(struct tagHISTORY_BUFFER *Hist); +CSR_API(CsrGetCommandHistoryLength); +CSR_API(CsrGetCommandHistory); +CSR_API(CsrExpungeCommandHistory); +CSR_API(CsrSetHistoryNumberCommands); +CSR_API(CsrGetHistoryInfo); +CSR_API(CsrSetHistoryInfo); +VOID FASTCALL LineInputKeyDown(PCSRSS_CONSOLE Console, KEY_EVENT_RECORD *KeyEvent); + /* EOF */ diff --git a/subsystems/win32/csrss/win32csr/conoutput.c b/subsystems/win32/csrss/win32csr/conoutput.c new file mode 100644 index 00000000000..e1b6215f7b2 --- /dev/null +++ b/subsystems/win32/csrss/win32csr/conoutput.c @@ -0,0 +1,1508 @@ +/* + * reactos/subsys/csrss/win32csr/conio.c + * + * Console I/O functions + * + * ReactOS Operating System + */ + +/* INCLUDES ******************************************************************/ + +#define NDEBUG +#include "w32csr.h" +#include + +/* GLOBALS *******************************************************************/ + +#define ConioInitRect(Rect, top, left, bottom, right) \ + ((Rect)->Top) = top; \ + ((Rect)->Left) = left; \ + ((Rect)->Bottom) = bottom; \ + ((Rect)->Right) = right + +#define ConioIsRectEmpty(Rect) \ + (((Rect)->Left > (Rect)->Right) || ((Rect)->Top > (Rect)->Bottom)) + +#define ConsoleUnicodeCharToAnsiChar(Console, dChar, sWChar) \ + WideCharToMultiByte((Console)->OutputCodePage, 0, (sWChar), 1, (dChar), 1, NULL, NULL) + +#define ConsoleAnsiCharToUnicodeChar(Console, dWChar, sChar) \ + MultiByteToWideChar((Console)->OutputCodePage, 0, (sChar), 1, (dWChar), 1) + +/* FUNCTIONS *****************************************************************/ + +PBYTE FASTCALL +ConioCoordToPointer(PCSRSS_SCREEN_BUFFER Buff, ULONG X, ULONG Y) +{ + return &Buff->Buffer[2 * (((Y + Buff->VirtualY) % Buff->MaxY) * Buff->MaxX + X)]; +} + +static VOID FASTCALL +ClearLineBuffer(PCSRSS_SCREEN_BUFFER Buff) +{ + PBYTE Ptr = ConioCoordToPointer(Buff, 0, Buff->CurrentY); + UINT Pos; + + for (Pos = 0; Pos < Buff->MaxX; Pos++) + { + /* Fill the cell */ + *Ptr++ = ' '; + *Ptr++ = Buff->DefaultAttrib; + } +} + +NTSTATUS FASTCALL +CsrInitConsoleScreenBuffer(PCSRSS_CONSOLE Console, + PCSRSS_SCREEN_BUFFER Buffer) +{ + DPRINT("CsrInitConsoleScreenBuffer Size X %d Size Y %d\n", Buffer->MaxX, Buffer->MaxY); + + Buffer->Header.Type = CONIO_SCREEN_BUFFER_MAGIC; + Buffer->Header.Console = Console; + Buffer->Header.HandleCount = 0; + Buffer->ShowX = 0; + Buffer->ShowY = 0; + Buffer->VirtualY = 0; + Buffer->Buffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, Buffer->MaxX * Buffer->MaxY * 2); + if (NULL == Buffer->Buffer) + { + return STATUS_INSUFFICIENT_RESOURCES; + } + ConioInitScreenBuffer(Console, Buffer); + /* initialize buffer to be empty with default attributes */ + for (Buffer->CurrentY = 0 ; Buffer->CurrentY < Buffer->MaxY; Buffer->CurrentY++) + { + ClearLineBuffer(Buffer); + } + Buffer->Mode = ENABLE_PROCESSED_OUTPUT | ENABLE_WRAP_AT_EOL_OUTPUT; + Buffer->CurrentX = 0; + Buffer->CurrentY = 0; + + InsertHeadList(&Console->BufferList, &Buffer->ListEntry); + return STATUS_SUCCESS; +} + +static VOID FASTCALL +ConioNextLine(PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *UpdateRect, UINT *ScrolledLines) +{ + /* If we hit bottom, slide the viewable screen */ + if (++Buff->CurrentY == Buff->MaxY) + { + Buff->CurrentY--; + if (++Buff->VirtualY == Buff->MaxY) + { + Buff->VirtualY = 0; + } + (*ScrolledLines)++; + ClearLineBuffer(Buff); + if (UpdateRect->Top != 0) + { + UpdateRect->Top--; + } + } + UpdateRect->Left = 0; + UpdateRect->Right = Buff->MaxX - 1; + UpdateRect->Bottom = Buff->CurrentY; +} + +NTSTATUS FASTCALL +ConioWriteConsole(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, + CHAR *Buffer, DWORD Length, BOOL Attrib) +{ + UINT i; + PBYTE Ptr; + SMALL_RECT UpdateRect; + LONG CursorStartX, CursorStartY; + UINT ScrolledLines; + + CursorStartX = Buff->CurrentX; + CursorStartY = Buff->CurrentY; + UpdateRect.Left = Buff->MaxX; + UpdateRect.Top = Buff->CurrentY; + UpdateRect.Right = -1; + UpdateRect.Bottom = Buff->CurrentY; + ScrolledLines = 0; + + for (i = 0; i < Length; i++) + { + if (Buff->Mode & ENABLE_PROCESSED_OUTPUT) + { + /* --- LF --- */ + if (Buffer[i] == '\n') + { + Buff->CurrentX = 0; + ConioNextLine(Buff, &UpdateRect, &ScrolledLines); + continue; + } + /* --- BS --- */ + else if (Buffer[i] == '\b') + { + /* Only handle BS if we're not on the first pos of the first line */ + if (0 != Buff->CurrentX || 0 != Buff->CurrentY) + { + if (0 == Buff->CurrentX) + { + /* slide virtual position up */ + Buff->CurrentX = Buff->MaxX - 1; + Buff->CurrentY--; + UpdateRect.Top = min(UpdateRect.Top, (LONG)Buff->CurrentY); + } + else + { + Buff->CurrentX--; + } + Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); + Ptr[0] = ' '; + Ptr[1] = Buff->DefaultAttrib; + UpdateRect.Left = min(UpdateRect.Left, (LONG) Buff->CurrentX); + UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX); + } + continue; + } + /* --- CR --- */ + else if (Buffer[i] == '\r') + { + Buff->CurrentX = 0; + UpdateRect.Left = min(UpdateRect.Left, (LONG) Buff->CurrentX); + UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX); + continue; + } + /* --- TAB --- */ + else if (Buffer[i] == '\t') + { + UINT EndX; + + UpdateRect.Left = min(UpdateRect.Left, (LONG)Buff->CurrentX); + EndX = (Buff->CurrentX + 8) & ~7; + if (EndX > Buff->MaxX) + { + EndX = Buff->MaxX; + } + Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); + while (Buff->CurrentX < EndX) + { + *Ptr++ = ' '; + *Ptr++ = Buff->DefaultAttrib; + Buff->CurrentX++; + } + UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX - 1); + if (Buff->CurrentX == Buff->MaxX) + { + if (Buff->Mode & ENABLE_WRAP_AT_EOL_OUTPUT) + { + Buff->CurrentX = 0; + ConioNextLine(Buff, &UpdateRect, &ScrolledLines); + } + else + { + Buff->CurrentX--; + } + } + continue; + } + } + UpdateRect.Left = min(UpdateRect.Left, (LONG)Buff->CurrentX); + UpdateRect.Right = max(UpdateRect.Right, (LONG) Buff->CurrentX); + Ptr = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY); + Ptr[0] = Buffer[i]; + if (Attrib) + { + Ptr[1] = Buff->DefaultAttrib; + } + Buff->CurrentX++; + if (Buff->CurrentX == Buff->MaxX) + { + if (Buff->Mode & ENABLE_WRAP_AT_EOL_OUTPUT) + { + Buff->CurrentX = 0; + ConioNextLine(Buff, &UpdateRect, &ScrolledLines); + } + else + { + Buff->CurrentX = CursorStartX; + } + } + } + + if (! ConioIsRectEmpty(&UpdateRect) && Buff == Console->ActiveBuffer) + { + ConioWriteStream(Console, &UpdateRect, CursorStartX, CursorStartY, ScrolledLines, + Buffer, Length); + } + + return STATUS_SUCCESS; +} + +__inline BOOLEAN ConioGetIntersection( + SMALL_RECT *Intersection, + SMALL_RECT *Rect1, + SMALL_RECT *Rect2) +{ + if (ConioIsRectEmpty(Rect1) || + (ConioIsRectEmpty(Rect2)) || + (Rect1->Top > Rect2->Bottom) || + (Rect1->Left > Rect2->Right) || + (Rect1->Bottom < Rect2->Top) || + (Rect1->Right < Rect2->Left)) + { + /* The rectangles do not intersect */ + ConioInitRect(Intersection, 0, -1, 0, -1); + return FALSE; + } + + ConioInitRect(Intersection, + max(Rect1->Top, Rect2->Top), + max(Rect1->Left, Rect2->Left), + min(Rect1->Bottom, Rect2->Bottom), + min(Rect1->Right, Rect2->Right)); + + return TRUE; +} + +__inline BOOLEAN ConioGetUnion( + SMALL_RECT *Union, + SMALL_RECT *Rect1, + SMALL_RECT *Rect2) +{ + if (ConioIsRectEmpty(Rect1)) + { + if (ConioIsRectEmpty(Rect2)) + { + ConioInitRect(Union, 0, -1, 0, -1); + return FALSE; + } + else + { + *Union = *Rect2; + } + } + else if (ConioIsRectEmpty(Rect2)) + { + *Union = *Rect1; + } + else + { + ConioInitRect(Union, + min(Rect1->Top, Rect2->Top), + min(Rect1->Left, Rect2->Left), + max(Rect1->Bottom, Rect2->Bottom), + max(Rect1->Right, Rect2->Right)); + } + + return TRUE; +} + +/* Move from one rectangle to another. We must be careful about the order that + * this is done, to avoid overwriting parts of the source before they are moved. */ +static VOID FASTCALL +ConioMoveRegion(PCSRSS_SCREEN_BUFFER ScreenBuffer, + SMALL_RECT *SrcRegion, + SMALL_RECT *DstRegion, + SMALL_RECT *ClipRegion, + WORD Fill) +{ + int Width = ConioRectWidth(SrcRegion); + int Height = ConioRectHeight(SrcRegion); + int SX, SY; + int DX, DY; + int XDelta, YDelta; + int i, j; + + SY = SrcRegion->Top; + DY = DstRegion->Top; + YDelta = 1; + if (SY < DY) + { + /* Moving down: work from bottom up */ + SY = SrcRegion->Bottom; + DY = DstRegion->Bottom; + YDelta = -1; + } + for (i = 0; i < Height; i++) + { + PWORD SRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, SY); + PWORD DRow = (PWORD)ConioCoordToPointer(ScreenBuffer, 0, DY); + + SX = SrcRegion->Left; + DX = DstRegion->Left; + XDelta = 1; + if (SX < DX) + { + /* Moving right: work from right to left */ + SX = SrcRegion->Right; + DX = DstRegion->Right; + XDelta = -1; + } + for (j = 0; j < Width; j++) + { + WORD Cell = SRow[SX]; + if (SX >= ClipRegion->Left && SX <= ClipRegion->Right + && SY >= ClipRegion->Top && SY <= ClipRegion->Bottom) + { + SRow[SX] = Fill; + } + if (DX >= ClipRegion->Left && DX <= ClipRegion->Right + && DY >= ClipRegion->Top && DY <= ClipRegion->Bottom) + { + DRow[DX] = Cell; + } + SX += XDelta; + DX += XDelta; + } + SY += YDelta; + DY += YDelta; + } +} + +CSR_API(CsrWriteConsole) +{ + NTSTATUS Status; + PCHAR Buffer; + PCSRSS_SCREEN_BUFFER Buff; + PCSRSS_CONSOLE Console; + DWORD Written = 0; + ULONG Length; + ULONG CharSize = (Request->Data.WriteConsoleRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); + + DPRINT("CsrWriteConsole\n"); + + if (Request->Header.u1.s1.TotalLength + < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE) + + (Request->Data.WriteConsoleRequest.NrCharactersToWrite * CharSize)) + { + DPRINT1("Invalid request size\n"); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + return STATUS_INVALID_PARAMETER; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.WriteConsoleRequest.ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + if (Console->UnpauseEvent) + { + Status = NtDuplicateObject(GetCurrentProcess(), Console->UnpauseEvent, + ProcessData->Process, &Request->Data.WriteConsoleRequest.UnpauseEvent, + SYNCHRONIZE, 0, 0); + ConioUnlockScreenBuffer(Buff); + return NT_SUCCESS(Status) ? STATUS_PENDING : Status; + } + + if(Request->Data.WriteConsoleRequest.Unicode) + { + Length = WideCharToMultiByte(Console->OutputCodePage, 0, + (PWCHAR)Request->Data.WriteConsoleRequest.Buffer, + Request->Data.WriteConsoleRequest.NrCharactersToWrite, + NULL, 0, NULL, NULL); + Buffer = RtlAllocateHeap(GetProcessHeap(), 0, Length); + if (Buffer) + { + WideCharToMultiByte(Console->OutputCodePage, 0, + (PWCHAR)Request->Data.WriteConsoleRequest.Buffer, + Request->Data.WriteConsoleRequest.NrCharactersToWrite, + Buffer, Length, NULL, NULL); + } + else + { + Status = STATUS_NO_MEMORY; + } + } + else + { + Buffer = (PCHAR)Request->Data.WriteConsoleRequest.Buffer; + } + + if (Buffer) + { + if (NT_SUCCESS(Status)) + { + Status = ConioWriteConsole(Console, Buff, Buffer, + Request->Data.WriteConsoleRequest.NrCharactersToWrite, TRUE); + if (NT_SUCCESS(Status)) + { + Written = Request->Data.WriteConsoleRequest.NrCharactersToWrite; + } + } + if (Request->Data.WriteConsoleRequest.Unicode) + { + RtlFreeHeap(GetProcessHeap(), 0, Buffer); + } + } + ConioUnlockScreenBuffer(Buff); + + Request->Data.WriteConsoleRequest.NrCharactersWritten = Written; + + return Status; +} + +VOID WINAPI +ConioDeleteScreenBuffer(PCSRSS_SCREEN_BUFFER Buffer) +{ + PCSRSS_CONSOLE Console = Buffer->Header.Console; + + RemoveEntryList(&Buffer->ListEntry); + if (Buffer == Console->ActiveBuffer) + { + /* Deleted active buffer; switch to most recently created */ + Console->ActiveBuffer = NULL; + if (!IsListEmpty(&Console->BufferList)) + { + Console->ActiveBuffer = CONTAINING_RECORD(Console->BufferList.Flink, CSRSS_SCREEN_BUFFER, ListEntry); + ConioDrawConsole(Console); + } + } + + HeapFree(Win32CsrApiHeap, 0, Buffer->Buffer); + HeapFree(Win32CsrApiHeap, 0, Buffer); +} + +VOID FASTCALL +ConioDrawConsole(PCSRSS_CONSOLE Console) +{ + SMALL_RECT Region; + + ConioInitRect(&Region, 0, 0, Console->Size.Y - 1, Console->Size.X - 1); + + ConioDrawRegion(Console, &Region); +} + +CSR_API(CsrGetScreenBufferInfo) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + PCONSOLE_SCREEN_BUFFER_INFO pInfo; + + DPRINT("CsrGetScreenBufferInfo\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.ScreenBufferInfoRequest.ConsoleHandle, &Buff, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + pInfo = &Request->Data.ScreenBufferInfoRequest.Info; + pInfo->dwSize.X = Buff->MaxX; + pInfo->dwSize.Y = Buff->MaxY; + pInfo->dwCursorPosition.X = Buff->CurrentX; + pInfo->dwCursorPosition.Y = Buff->CurrentY; + pInfo->wAttributes = Buff->DefaultAttrib; + pInfo->srWindow.Left = Buff->ShowX; + pInfo->srWindow.Right = Buff->ShowX + Console->Size.X - 1; + pInfo->srWindow.Top = Buff->ShowY; + pInfo->srWindow.Bottom = Buff->ShowY + Console->Size.Y - 1; + pInfo->dwMaximumWindowSize.X = Buff->MaxX; + pInfo->dwMaximumWindowSize.Y = Buff->MaxY; + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrSetCursor) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + LONG OldCursorX, OldCursorY; + LONG NewCursorX, NewCursorY; + + DPRINT("CsrSetCursor\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + NewCursorX = Request->Data.SetCursorRequest.Position.X; + NewCursorY = Request->Data.SetCursorRequest.Position.Y; + if (NewCursorX < 0 || NewCursorX >= Buff->MaxX || + NewCursorY < 0 || NewCursorY >= Buff->MaxY) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_INVALID_PARAMETER; + } + OldCursorX = Buff->CurrentX; + OldCursorY = Buff->CurrentY; + Buff->CurrentX = NewCursorX; + Buff->CurrentY = NewCursorY; + if (Buff == Console->ActiveBuffer) + { + if (! ConioSetScreenInfo(Console, Buff, OldCursorX, OldCursorY)) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_UNSUCCESSFUL; + } + } + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +static VOID FASTCALL +ConioComputeUpdateRect(PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *UpdateRect, COORD *Start, UINT Length) +{ + if (Buff->MaxX <= Start->X + Length) + { + UpdateRect->Left = 0; + } + else + { + UpdateRect->Left = Start->X; + } + if (Buff->MaxX <= Start->X + Length) + { + UpdateRect->Right = Buff->MaxX - 1; + } + else + { + UpdateRect->Right = Start->X + Length - 1; + } + UpdateRect->Top = Start->Y; + UpdateRect->Bottom = Start->Y+ (Start->X + Length - 1) / Buff->MaxX; + if (Buff->MaxY <= UpdateRect->Bottom) + { + UpdateRect->Bottom = Buff->MaxY - 1; + } +} + +CSR_API(CsrWriteConsoleOutputChar) +{ + NTSTATUS Status; + PCHAR String, tmpString = NULL; + PBYTE Buffer; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + DWORD X, Y, Length, CharSize, Written = 0; + SMALL_RECT UpdateRect; + + DPRINT("CsrWriteConsoleOutputChar\n"); + + CharSize = (Request->Data.WriteConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); + + if (Request->Header.u1.s1.TotalLength + < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR) + + (Request->Data.WriteConsoleOutputCharRequest.Length * CharSize)) + { + DPRINT1("Invalid request size\n"); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + return STATUS_INVALID_PARAMETER; + } + + Status = ConioLockScreenBuffer(ProcessData, + Request->Data.WriteConsoleOutputCharRequest.ConsoleHandle, + &Buff, + GENERIC_WRITE); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + if (NT_SUCCESS(Status)) + { + Console = Buff->Header.Console; + if(Request->Data.WriteConsoleOutputCharRequest.Unicode) + { + Length = WideCharToMultiByte(Console->OutputCodePage, 0, + (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, + Request->Data.WriteConsoleOutputCharRequest.Length, + NULL, 0, NULL, NULL); + tmpString = String = RtlAllocateHeap(GetProcessHeap(), 0, Length); + if (String) + { + WideCharToMultiByte(Console->OutputCodePage, 0, + (PWCHAR)Request->Data.WriteConsoleOutputCharRequest.String, + Request->Data.WriteConsoleOutputCharRequest.Length, + String, Length, NULL, NULL); + } + else + { + Status = STATUS_NO_MEMORY; + } + } + else + { + String = (PCHAR)Request->Data.WriteConsoleOutputCharRequest.String; + } + + if (String) + { + if (NT_SUCCESS(Status)) + { + X = Request->Data.WriteConsoleOutputCharRequest.Coord.X; + Y = (Request->Data.WriteConsoleOutputCharRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; + Length = Request->Data.WriteConsoleOutputCharRequest.Length; + Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; + while (Length--) + { + *Buffer = *String++; + Written++; + Buffer += 2; + if (++X == Buff->MaxX) + { + if (++Y == Buff->MaxY) + { + Y = 0; + Buffer = Buff->Buffer; + } + X = 0; + } + } + if (Buff == Console->ActiveBuffer) + { + ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputCharRequest.Coord, + Request->Data.WriteConsoleOutputCharRequest.Length); + ConioDrawRegion(Console, &UpdateRect); + } + + Request->Data.WriteConsoleOutputCharRequest.EndCoord.X = X; + Request->Data.WriteConsoleOutputCharRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY; + + } + if (Request->Data.WriteConsoleRequest.Unicode) + { + RtlFreeHeap(GetProcessHeap(), 0, tmpString); + } + } + ConioUnlockScreenBuffer(Buff); + } + Request->Data.WriteConsoleOutputCharRequest.NrCharactersWritten = Written; + return Status; +} + +CSR_API(CsrFillOutputChar) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + DWORD X, Y, Length, Written = 0; + CHAR Char; + PBYTE Buffer; + SMALL_RECT UpdateRect; + + DPRINT("CsrFillOutputChar\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputRequest.ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + X = Request->Data.FillOutputRequest.Position.X; + Y = (Request->Data.FillOutputRequest.Position.Y + Buff->VirtualY) % Buff->MaxY; + Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X)]; + if(Request->Data.FillOutputRequest.Unicode) + ConsoleUnicodeCharToAnsiChar(Console, &Char, &Request->Data.FillOutputRequest.Char.UnicodeChar); + else + Char = Request->Data.FillOutputRequest.Char.AsciiChar; + Length = Request->Data.FillOutputRequest.Length; + while (Length--) + { + *Buffer = Char; + Buffer += 2; + Written++; + if (++X == Buff->MaxX) + { + if (++Y == Buff->MaxY) + { + Y = 0; + Buffer = Buff->Buffer; + } + X = 0; + } + } + + if (Buff == Console->ActiveBuffer) + { + ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputRequest.Position, + Request->Data.FillOutputRequest.Length); + ConioDrawRegion(Console, &UpdateRect); + } + + ConioUnlockScreenBuffer(Buff); + Length = Request->Data.FillOutputRequest.Length; + Request->Data.FillOutputRequest.NrCharactersWritten = Length; + return STATUS_SUCCESS; +} + +CSR_API(CsrWriteConsoleOutputAttrib) +{ + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + PUCHAR Buffer; + PWORD Attribute; + int X, Y, Length; + NTSTATUS Status; + SMALL_RECT UpdateRect; + + DPRINT("CsrWriteConsoleOutputAttrib\n"); + + if (Request->Header.u1.s1.TotalLength + < CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_ATTRIB) + + Request->Data.WriteConsoleOutputAttribRequest.Length * sizeof(WORD)) + { + DPRINT1("Invalid request size\n"); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + return STATUS_INVALID_PARAMETER; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, + Request->Data.WriteConsoleOutputAttribRequest.ConsoleHandle, + &Buff, + GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + X = Request->Data.WriteConsoleOutputAttribRequest.Coord.X; + Y = (Request->Data.WriteConsoleOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; + Length = Request->Data.WriteConsoleOutputAttribRequest.Length; + Buffer = &Buff->Buffer[2 * (Y * Buff->MaxX + X) + 1]; + Attribute = Request->Data.WriteConsoleOutputAttribRequest.Attribute; + while (Length--) + { + *Buffer = (UCHAR)(*Attribute++); + Buffer += 2; + if (++X == Buff->MaxX) + { + if (++Y == Buff->MaxY) + { + Y = 0; + Buffer = Buff->Buffer + 1; + } + X = 0; + } + } + + if (Buff == Console->ActiveBuffer) + { + ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.WriteConsoleOutputAttribRequest.Coord, + Request->Data.WriteConsoleOutputAttribRequest.Length); + ConioDrawRegion(Console, &UpdateRect); + } + + Request->Data.WriteConsoleOutputAttribRequest.EndCoord.X = X; + Request->Data.WriteConsoleOutputAttribRequest.EndCoord.Y = (Y + Buff->MaxY - Buff->VirtualY) % Buff->MaxY; + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrFillOutputAttrib) +{ + PCSRSS_SCREEN_BUFFER Buff; + PUCHAR Buffer; + NTSTATUS Status; + int X, Y, Length; + UCHAR Attr; + SMALL_RECT UpdateRect; + PCSRSS_CONSOLE Console; + + DPRINT("CsrFillOutputAttrib\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Status = ConioLockScreenBuffer(ProcessData, Request->Data.FillOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + X = Request->Data.FillOutputAttribRequest.Coord.X; + Y = (Request->Data.FillOutputAttribRequest.Coord.Y + Buff->VirtualY) % Buff->MaxY; + Length = Request->Data.FillOutputAttribRequest.Length; + Attr = Request->Data.FillOutputAttribRequest.Attribute; + Buffer = &Buff->Buffer[(Y * Buff->MaxX * 2) + (X * 2) + 1]; + while (Length--) + { + *Buffer = Attr; + Buffer += 2; + if (++X == Buff->MaxX) + { + if (++Y == Buff->MaxY) + { + Y = 0; + Buffer = Buff->Buffer + 1; + } + X = 0; + } + } + + if (Buff == Console->ActiveBuffer) + { + ConioComputeUpdateRect(Buff, &UpdateRect, &Request->Data.FillOutputAttribRequest.Coord, + Request->Data.FillOutputAttribRequest.Length); + ConioDrawRegion(Console, &UpdateRect); + } + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +DWORD FASTCALL +ConioEffectiveCursorSize(PCSRSS_CONSOLE Console, DWORD Scale) +{ + DWORD Size = (Console->ActiveBuffer->CursorInfo.dwSize * Scale + 99) / 100; + /* If line input in progress, perhaps adjust for insert toggle */ + if (Console->LineBuffer && !Console->LineComplete && Console->LineInsertToggle) + return (Size * 2 <= Scale) ? (Size * 2) : (Size / 2); + return Size; +} + +CSR_API(CsrGetCursorInfo) +{ + PCSRSS_SCREEN_BUFFER Buff; + NTSTATUS Status; + + DPRINT("CsrGetCursorInfo\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.GetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Request->Data.GetCursorInfoRequest.Info.bVisible = Buff->CursorInfo.bVisible; + Request->Data.GetCursorInfoRequest.Info.dwSize = Buff->CursorInfo.dwSize; + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrSetCursorInfo) +{ + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + DWORD Size; + BOOL Visible; + NTSTATUS Status; + + DPRINT("CsrSetCursorInfo\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorInfoRequest.ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + Size = Request->Data.SetCursorInfoRequest.Info.dwSize; + Visible = Request->Data.SetCursorInfoRequest.Info.bVisible; + if (Size < 1) + { + Size = 1; + } + if (100 < Size) + { + Size = 100; + } + + if (Size != Buff->CursorInfo.dwSize + || (Visible && ! Buff->CursorInfo.bVisible) || (! Visible && Buff->CursorInfo.bVisible)) + { + Buff->CursorInfo.dwSize = Size; + Buff->CursorInfo.bVisible = Visible; + + if (! ConioSetCursorInfo(Console, Buff)) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_UNSUCCESSFUL; + } + } + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrSetTextAttrib) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + + DPRINT("CsrSetTextAttrib\n"); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetCursorRequest.ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + Buff->DefaultAttrib = Request->Data.SetAttribRequest.Attrib; + if (Buff == Console->ActiveBuffer) + { + if (! ConioUpdateScreenInfo(Console, Buff)) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_UNSUCCESSFUL; + } + } + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrCreateScreenBuffer) +{ + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + NTSTATUS Status; + + DPRINT("CsrCreateScreenBuffer\n"); + + RtlEnterCriticalSection(&ProcessData->HandleTableLock); + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Buff = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER)); + + if (Buff != NULL) + { + if (Console->ActiveBuffer) + { + Buff->MaxX = Console->ActiveBuffer->MaxX; + Buff->MaxY = Console->ActiveBuffer->MaxY; + Buff->CursorInfo.bVisible = Console->ActiveBuffer->CursorInfo.bVisible; + Buff->CursorInfo.dwSize = Console->ActiveBuffer->CursorInfo.dwSize; + } + else + { + Buff->CursorInfo.bVisible = TRUE; + Buff->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE; + } + + if (Buff->MaxX == 0) + { + Buff->MaxX = 80; + } + + if (Buff->MaxY == 0) + { + Buff->MaxY = 25; + } + + Status = CsrInitConsoleScreenBuffer(Console, Buff); + if (NT_SUCCESS(Status)) + { + Status = Win32CsrInsertObject(ProcessData, + &Request->Data.CreateScreenBufferRequest.OutputHandle, + &Buff->Header, + Request->Data.CreateScreenBufferRequest.Access, + Request->Data.CreateScreenBufferRequest.Inheritable, + Request->Data.CreateScreenBufferRequest.ShareMode); + } + } + else + { + Status = STATUS_INSUFFICIENT_RESOURCES; + } + + ConioUnlockConsole(Console); + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return Status; +} + +CSR_API(CsrSetScreenBuffer) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + + DPRINT("CsrSetScreenBuffer\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferRequest.OutputHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + if (Buff == Console->ActiveBuffer) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_SUCCESS; + } + + /* If old buffer has no handles, it's now unreferenced */ + if (Console->ActiveBuffer->Header.HandleCount == 0) + { + ConioDeleteScreenBuffer(Console->ActiveBuffer); + } + /* tie console to new buffer */ + Console->ActiveBuffer = Buff; + /* Redraw the console */ + ConioDrawConsole(Console); + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrWriteConsoleOutput) +{ + SHORT i, X, Y, SizeX, SizeY; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + SMALL_RECT ScreenBuffer; + CHAR_INFO* CurCharInfo; + SMALL_RECT WriteRegion; + CHAR_INFO* CharInfo; + COORD BufferCoord; + COORD BufferSize; + NTSTATUS Status; + PBYTE Ptr; + + DPRINT("CsrWriteConsoleOutput\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Status = ConioLockScreenBuffer(ProcessData, + Request->Data.WriteConsoleOutputRequest.ConsoleHandle, + &Buff, + GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + BufferSize = Request->Data.WriteConsoleOutputRequest.BufferSize; + BufferCoord = Request->Data.WriteConsoleOutputRequest.BufferCoord; + CharInfo = Request->Data.WriteConsoleOutputRequest.CharInfo; + if (!Win32CsrValidateBuffer(ProcessData, CharInfo, + BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO))) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_ACCESS_VIOLATION; + } + WriteRegion = Request->Data.WriteConsoleOutputRequest.WriteRegion; + + SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&WriteRegion)); + SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&WriteRegion)); + WriteRegion.Bottom = WriteRegion.Top + SizeY - 1; + WriteRegion.Right = WriteRegion.Left + SizeX - 1; + + /* Make sure WriteRegion is inside the screen buffer */ + ConioInitRect(&ScreenBuffer, 0, 0, Buff->MaxY - 1, Buff->MaxX - 1); + if (! ConioGetIntersection(&WriteRegion, &ScreenBuffer, &WriteRegion)) + { + ConioUnlockScreenBuffer(Buff); + + /* It is okay to have a WriteRegion completely outside the screen buffer. + No data is written then. */ + return STATUS_SUCCESS; + } + + for (i = 0, Y = WriteRegion.Top; Y <= WriteRegion.Bottom; i++, Y++) + { + CurCharInfo = CharInfo + (i + BufferCoord.Y) * BufferSize.X + BufferCoord.X; + Ptr = ConioCoordToPointer(Buff, WriteRegion.Left, Y); + for (X = WriteRegion.Left; X <= WriteRegion.Right; X++) + { + CHAR AsciiChar; + if (Request->Data.WriteConsoleOutputRequest.Unicode) + { + ConsoleUnicodeCharToAnsiChar(Console, &AsciiChar, &CurCharInfo->Char.UnicodeChar); + } + else + { + AsciiChar = CurCharInfo->Char.AsciiChar; + } + *Ptr++ = AsciiChar; + *Ptr++ = CurCharInfo->Attributes; + CurCharInfo++; + } + } + + ConioDrawRegion(Console, &WriteRegion); + + ConioUnlockScreenBuffer(Buff); + + Request->Data.WriteConsoleOutputRequest.WriteRegion.Right = WriteRegion.Left + SizeX - 1; + Request->Data.WriteConsoleOutputRequest.WriteRegion.Bottom = WriteRegion.Top + SizeY - 1; + Request->Data.WriteConsoleOutputRequest.WriteRegion.Left = WriteRegion.Left; + Request->Data.WriteConsoleOutputRequest.WriteRegion.Top = WriteRegion.Top; + + return STATUS_SUCCESS; +} + +CSR_API(CsrScrollConsoleScreenBuffer) +{ + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + SMALL_RECT ScreenBuffer; + SMALL_RECT SrcRegion; + SMALL_RECT DstRegion; + SMALL_RECT UpdateRegion; + SMALL_RECT ScrollRectangle; + SMALL_RECT ClipRectangle; + NTSTATUS Status; + HANDLE ConsoleHandle; + BOOLEAN UseClipRectangle; + COORD DestinationOrigin; + CHAR_INFO Fill; + CHAR FillChar; + + DPRINT("CsrScrollConsoleScreenBuffer\n"); + + ConsoleHandle = Request->Data.ScrollConsoleScreenBufferRequest.ConsoleHandle; + UseClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.UseClipRectangle; + DestinationOrigin = Request->Data.ScrollConsoleScreenBufferRequest.DestinationOrigin; + Fill = Request->Data.ScrollConsoleScreenBufferRequest.Fill; + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Status = ConioLockScreenBuffer(ProcessData, ConsoleHandle, &Buff, GENERIC_WRITE); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + ScrollRectangle = Request->Data.ScrollConsoleScreenBufferRequest.ScrollRectangle; + + /* Make sure source rectangle is inside the screen buffer */ + ConioInitRect(&ScreenBuffer, 0, 0, Buff->MaxY - 1, Buff->MaxX - 1); + if (! ConioGetIntersection(&SrcRegion, &ScreenBuffer, &ScrollRectangle)) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_SUCCESS; + } + + /* If the source was clipped on the left or top, adjust the destination accordingly */ + if (ScrollRectangle.Left < 0) + { + DestinationOrigin.X -= ScrollRectangle.Left; + } + if (ScrollRectangle.Top < 0) + { + DestinationOrigin.Y -= ScrollRectangle.Top; + } + + if (UseClipRectangle) + { + ClipRectangle = Request->Data.ScrollConsoleScreenBufferRequest.ClipRectangle; + if (!ConioGetIntersection(&ClipRectangle, &ClipRectangle, &ScreenBuffer)) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_SUCCESS; + } + } + else + { + ClipRectangle = ScreenBuffer; + } + + ConioInitRect(&DstRegion, + DestinationOrigin.Y, + DestinationOrigin.X, + DestinationOrigin.Y + ConioRectHeight(&SrcRegion) - 1, + DestinationOrigin.X + ConioRectWidth(&SrcRegion) - 1); + + if (Request->Data.ScrollConsoleScreenBufferRequest.Unicode) + ConsoleUnicodeCharToAnsiChar(Console, &FillChar, &Fill.Char.UnicodeChar); + else + FillChar = Fill.Char.AsciiChar; + + ConioMoveRegion(Buff, &SrcRegion, &DstRegion, &ClipRectangle, Fill.Attributes << 8 | (BYTE)FillChar); + + if (Buff == Console->ActiveBuffer) + { + ConioGetUnion(&UpdateRegion, &SrcRegion, &DstRegion); + if (ConioGetIntersection(&UpdateRegion, &UpdateRegion, &ClipRectangle)) + { + /* Draw update region */ + ConioDrawRegion(Console, &UpdateRegion); + } + } + + ConioUnlockScreenBuffer(Buff); + + return STATUS_SUCCESS; +} + +CSR_API(CsrReadConsoleOutputChar) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + DWORD Xpos, Ypos; + PCHAR ReadBuffer; + DWORD i; + ULONG CharSize; + CHAR Char; + + DPRINT("CsrReadConsoleOutputChar\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); + ReadBuffer = Request->Data.ReadConsoleOutputCharRequest.String; + + CharSize = (Request->Data.ReadConsoleOutputCharRequest.Unicode ? sizeof(WCHAR) : sizeof(CHAR)); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputCharRequest.ConsoleHandle, &Buff, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + Xpos = Request->Data.ReadConsoleOutputCharRequest.ReadCoord.X; + Ypos = (Request->Data.ReadConsoleOutputCharRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY; + + for (i = 0; i < Request->Data.ReadConsoleOutputCharRequest.NumCharsToRead; ++i) + { + Char = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX)]; + + if(Request->Data.ReadConsoleOutputCharRequest.Unicode) + { + ConsoleAnsiCharToUnicodeChar(Console, (WCHAR*)ReadBuffer, &Char); + ReadBuffer += sizeof(WCHAR); + } + else + *(ReadBuffer++) = Char; + + Xpos++; + + if (Xpos == Buff->MaxX) + { + Xpos = 0; + Ypos++; + + if (Ypos == Buff->MaxY) + { + Ypos = 0; + } + } + } + + *ReadBuffer = 0; + Request->Data.ReadConsoleOutputCharRequest.EndCoord.X = Xpos; + Request->Data.ReadConsoleOutputCharRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY; + + ConioUnlockScreenBuffer(Buff); + + Request->Data.ReadConsoleOutputCharRequest.CharsRead = (DWORD)((ULONG_PTR)ReadBuffer - (ULONG_PTR)Request->Data.ReadConsoleOutputCharRequest.String) / CharSize; + if (Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR) > sizeof(CSR_API_MESSAGE)) + { + Request->Header.u1.s1.TotalLength = Request->Data.ReadConsoleOutputCharRequest.CharsRead * CharSize + CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_CHAR); + Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); + } + + return STATUS_SUCCESS; +} + + +CSR_API(CsrReadConsoleOutputAttrib) +{ + NTSTATUS Status; + PCSRSS_SCREEN_BUFFER Buff; + DWORD Xpos, Ypos; + PWORD ReadBuffer; + DWORD i; + DWORD CurrentLength; + + DPRINT("CsrReadConsoleOutputAttrib\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = Request->Header.u1.s1.TotalLength - sizeof(PORT_MESSAGE); + ReadBuffer = Request->Data.ReadConsoleOutputAttribRequest.Attribute; + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputAttribRequest.ConsoleHandle, &Buff, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Xpos = Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.X; + Ypos = (Request->Data.ReadConsoleOutputAttribRequest.ReadCoord.Y + Buff->VirtualY) % Buff->MaxY; + + for (i = 0; i < Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead; ++i) + { + *ReadBuffer = Buff->Buffer[(Xpos * 2) + (Ypos * 2 * Buff->MaxX) + 1]; + + ReadBuffer++; + Xpos++; + + if (Xpos == Buff->MaxX) + { + Xpos = 0; + Ypos++; + + if (Ypos == Buff->MaxY) + { + Ypos = 0; + } + } + } + + *ReadBuffer = 0; + + Request->Data.ReadConsoleOutputAttribRequest.EndCoord.X = Xpos; + Request->Data.ReadConsoleOutputAttribRequest.EndCoord.Y = (Ypos - Buff->VirtualY + Buff->MaxY) % Buff->MaxY; + + ConioUnlockScreenBuffer(Buff); + + CurrentLength = CSR_API_MESSAGE_HEADER_SIZE(CSRSS_READ_CONSOLE_OUTPUT_ATTRIB) + + Request->Data.ReadConsoleOutputAttribRequest.NumAttrsToRead * sizeof(WORD); + if (CurrentLength > sizeof(CSR_API_MESSAGE)) + { + Request->Header.u1.s1.TotalLength = CurrentLength; + Request->Header.u1.s1.DataLength = CurrentLength - sizeof(PORT_MESSAGE); + } + + return STATUS_SUCCESS; +} + +CSR_API(CsrReadConsoleOutput) +{ + PCHAR_INFO CharInfo; + PCHAR_INFO CurCharInfo; + PCSRSS_SCREEN_BUFFER Buff; + DWORD SizeX, SizeY; + NTSTATUS Status; + COORD BufferSize; + COORD BufferCoord; + SMALL_RECT ReadRegion; + SMALL_RECT ScreenRect; + DWORD i; + PBYTE Ptr; + LONG X, Y; + UINT CodePage; + + DPRINT("CsrReadConsoleOutput\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.ReadConsoleOutputRequest.ConsoleHandle, &Buff, GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + CharInfo = Request->Data.ReadConsoleOutputRequest.CharInfo; + ReadRegion = Request->Data.ReadConsoleOutputRequest.ReadRegion; + BufferSize = Request->Data.ReadConsoleOutputRequest.BufferSize; + BufferCoord = Request->Data.ReadConsoleOutputRequest.BufferCoord; + + /* FIXME: Is this correct? */ + CodePage = ProcessData->Console->OutputCodePage; + + if (!Win32CsrValidateBuffer(ProcessData, CharInfo, + BufferSize.X * BufferSize.Y, sizeof(CHAR_INFO))) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_ACCESS_VIOLATION; + } + + SizeY = min(BufferSize.Y - BufferCoord.Y, ConioRectHeight(&ReadRegion)); + SizeX = min(BufferSize.X - BufferCoord.X, ConioRectWidth(&ReadRegion)); + ReadRegion.Bottom = ReadRegion.Top + SizeY; + ReadRegion.Right = ReadRegion.Left + SizeX; + + ConioInitRect(&ScreenRect, 0, 0, Buff->MaxY, Buff->MaxX); + if (! ConioGetIntersection(&ReadRegion, &ScreenRect, &ReadRegion)) + { + ConioUnlockScreenBuffer(Buff); + return STATUS_SUCCESS; + } + + for (i = 0, Y = ReadRegion.Top; Y < ReadRegion.Bottom; ++i, ++Y) + { + CurCharInfo = CharInfo + (i * BufferSize.X); + + Ptr = ConioCoordToPointer(Buff, ReadRegion.Left, Y); + for (X = ReadRegion.Left; X < ReadRegion.Right; ++X) + { + if (Request->Data.ReadConsoleOutputRequest.Unicode) + { + MultiByteToWideChar(CodePage, 0, + (PCHAR)Ptr++, 1, + &CurCharInfo->Char.UnicodeChar, 1); + } + else + { + CurCharInfo->Char.AsciiChar = *Ptr++; + } + CurCharInfo->Attributes = *Ptr++; + ++CurCharInfo; + } + } + + ConioUnlockScreenBuffer(Buff); + + Request->Data.ReadConsoleOutputRequest.ReadRegion.Right = ReadRegion.Left + SizeX - 1; + Request->Data.ReadConsoleOutputRequest.ReadRegion.Bottom = ReadRegion.Top + SizeY - 1; + Request->Data.ReadConsoleOutputRequest.ReadRegion.Left = ReadRegion.Left; + Request->Data.ReadConsoleOutputRequest.ReadRegion.Top = ReadRegion.Top; + + return STATUS_SUCCESS; +} + +CSR_API(CsrSetScreenBufferSize) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockScreenBuffer(ProcessData, Request->Data.SetScreenBufferSize.OutputHandle, &Buff, GENERIC_WRITE); + if (!NT_SUCCESS(Status)) + { + return Status; + } + Console = Buff->Header.Console; + + Status = ConioResizeBuffer(Console, Buff, Request->Data.SetScreenBufferSize.Size); + ConioUnlockScreenBuffer(Buff); + + return Status; +} + +/* EOF */ diff --git a/subsystems/win32/csrss/win32csr/console.c b/subsystems/win32/csrss/win32csr/console.c new file mode 100644 index 00000000000..6db2a2ec34a --- /dev/null +++ b/subsystems/win32/csrss/win32csr/console.c @@ -0,0 +1,848 @@ +/* + * reactos/subsys/csrss/win32csr/conio.c + * + * Console I/O functions + * + * ReactOS Operating System + */ + +/* INCLUDES ******************************************************************/ + +#define NDEBUG +#include "w32csr.h" +#include + +/* FUNCTIONS *****************************************************************/ + +NTSTATUS FASTCALL +ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console) +{ + PCSRSS_CONSOLE ProcessConsole; + + RtlEnterCriticalSection(&ProcessData->HandleTableLock); + ProcessConsole = ProcessData->Console; + + if (!ProcessConsole) + { + *Console = NULL; + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return STATUS_INVALID_HANDLE; + } + + InterlockedIncrement(&ProcessConsole->ReferenceCount); + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + EnterCriticalSection(&(ProcessConsole->Lock)); + *Console = ProcessConsole; + + return STATUS_SUCCESS; +} + +VOID FASTCALL +ConioConsoleCtrlEventTimeout(DWORD Event, PCSRSS_PROCESS_DATA ProcessData, DWORD Timeout) +{ + HANDLE Thread; + + DPRINT("ConioConsoleCtrlEvent Parent ProcessId = %x\n", ProcessData->ProcessId); + + if (ProcessData->CtrlDispatcher) + { + + Thread = CreateRemoteThread(ProcessData->Process, NULL, 0, + (LPTHREAD_START_ROUTINE) ProcessData->CtrlDispatcher, + UlongToPtr(Event), 0, NULL); + if (NULL == Thread) + { + DPRINT1("Failed thread creation (Error: 0x%x)\n", GetLastError()); + return; + } + WaitForSingleObject(Thread, Timeout); + CloseHandle(Thread); + } +} + +VOID FASTCALL +ConioConsoleCtrlEvent(DWORD Event, PCSRSS_PROCESS_DATA ProcessData) +{ + ConioConsoleCtrlEventTimeout(Event, ProcessData, 0); +} + +static NTSTATUS WINAPI +CsrInitConsole(PCSRSS_CONSOLE Console, BOOL Visible) +{ + NTSTATUS Status; + SECURITY_ATTRIBUTES SecurityAttributes; + PCSRSS_SCREEN_BUFFER NewBuffer; + BOOL GuiMode; + + Console->Title.MaximumLength = Console->Title.Length = 0; + Console->Title.Buffer = NULL; + + //FIXME + RtlCreateUnicodeString(&Console->Title, L"Command Prompt"); + + Console->ReferenceCount = 0; + Console->LineBuffer = NULL; + Console->Header.Type = CONIO_CONSOLE_MAGIC; + Console->Header.Console = Console; + Console->Mode = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_MOUSE_INPUT; + InitializeListHead(&Console->BufferList); + Console->ActiveBuffer = NULL; + InitializeListHead(&Console->InputEvents); + InitializeListHead(&Console->HistoryBuffers); + Console->CodePage = GetOEMCP(); + Console->OutputCodePage = GetOEMCP(); + + SecurityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES); + SecurityAttributes.lpSecurityDescriptor = NULL; + SecurityAttributes.bInheritHandle = TRUE; + + Console->ActiveEvent = CreateEventW(&SecurityAttributes, TRUE, FALSE, NULL); + if (NULL == Console->ActiveEvent) + { + RtlFreeUnicodeString(&Console->Title); + return STATUS_UNSUCCESSFUL; + } + Console->PrivateData = NULL; + InitializeCriticalSection(&Console->Lock); + + GuiMode = DtbgIsDesktopVisible(); + + /* allocate console screen buffer */ + NewBuffer = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_SCREEN_BUFFER)); + if (NULL == NewBuffer) + { + RtlFreeUnicodeString(&Console->Title); + DeleteCriticalSection(&Console->Lock); + CloseHandle(Console->ActiveEvent); + return STATUS_INSUFFICIENT_RESOURCES; + } + /* init screen buffer with defaults */ + NewBuffer->CursorInfo.bVisible = TRUE; + NewBuffer->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE; + /* make console active, and insert into console list */ + Console->ActiveBuffer = (PCSRSS_SCREEN_BUFFER) NewBuffer; + + if (! GuiMode) + { + Status = TuiInitConsole(Console); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to open text-mode console, switching to gui-mode\n"); + GuiMode = TRUE; + } + } + if (GuiMode) + { + Status = GuiInitConsole(Console, Visible); + if (! NT_SUCCESS(Status)) + { + HeapFree(Win32CsrApiHeap,0, NewBuffer); + RtlFreeUnicodeString(&Console->Title); + DeleteCriticalSection(&Console->Lock); + CloseHandle(Console->ActiveEvent); + DPRINT1("GuiInitConsole: failed\n"); + return Status; + } + } + + Status = CsrInitConsoleScreenBuffer(Console, NewBuffer); + if (! NT_SUCCESS(Status)) + { + ConioCleanupConsole(Console); + RtlFreeUnicodeString(&Console->Title); + DeleteCriticalSection(&Console->Lock); + CloseHandle(Console->ActiveEvent); + HeapFree(Win32CsrApiHeap, 0, NewBuffer); + DPRINT1("CsrInitConsoleScreenBuffer: failed\n"); + return Status; + } + + /* copy buffer contents to screen */ + ConioDrawConsole(Console); + + return STATUS_SUCCESS; +} + +CSR_API(CsrAllocConsole) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status = STATUS_SUCCESS; + BOOLEAN NewConsole = FALSE; + + DPRINT("CsrAllocConsole\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + RtlEnterCriticalSection(&ProcessData->HandleTableLock); + if (ProcessData->Console) + { + DPRINT1("Process already has a console\n"); + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return STATUS_INVALID_PARAMETER; + } + + /* If we don't need a console, then get out of here */ + if (!Request->Data.AllocConsoleRequest.ConsoleNeeded) + { + DPRINT("No console needed\n"); + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return STATUS_SUCCESS; + } + + /* If we already have one, then don't create a new one... */ + if (!Request->Data.AllocConsoleRequest.Console || + Request->Data.AllocConsoleRequest.Console != ProcessData->ParentConsole) + { + /* Allocate a console structure */ + NewConsole = TRUE; + Console = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(CSRSS_CONSOLE)); + if (NULL == Console) + { + DPRINT1("Not enough memory for console\n"); + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return STATUS_NO_MEMORY; + } + /* initialize list head */ + InitializeListHead(&Console->ProcessList); + /* insert process data required for GUI initialization */ + InsertHeadList(&Console->ProcessList, &ProcessData->ProcessEntry); + /* Initialize the Console */ + Status = CsrInitConsole(Console, Request->Data.AllocConsoleRequest.Visible); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Console init failed\n"); + HeapFree(Win32CsrApiHeap, 0, Console); + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return Status; + } + } + else + { + /* Reuse our current console */ + Console = Request->Data.AllocConsoleRequest.Console; + } + + /* Set the Process Console */ + ProcessData->Console = Console; + + /* Return it to the caller */ + Request->Data.AllocConsoleRequest.Console = Console; + + /* Add a reference count because the process is tied to the console */ + _InterlockedIncrement(&Console->ReferenceCount); + + if (NewConsole || !ProcessData->bInheritHandles) + { + /* Insert the Objects */ + Status = Win32CsrInsertObject(ProcessData, + &Request->Data.AllocConsoleRequest.InputHandle, + &Console->Header, + GENERIC_READ | GENERIC_WRITE, + TRUE, + FILE_SHARE_READ | FILE_SHARE_WRITE); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to insert object\n"); + ConioDeleteConsole((Object_t *) Console); + ProcessData->Console = 0; + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return Status; + } + + Status = Win32CsrInsertObject(ProcessData, + &Request->Data.AllocConsoleRequest.OutputHandle, + &Console->ActiveBuffer->Header, + GENERIC_READ | GENERIC_WRITE, + TRUE, + FILE_SHARE_READ | FILE_SHARE_WRITE); + if (!NT_SUCCESS(Status)) + { + DPRINT1("Failed to insert object\n"); + ConioDeleteConsole((Object_t *) Console); + Win32CsrReleaseObject(ProcessData, + Request->Data.AllocConsoleRequest.InputHandle); + ProcessData->Console = 0; + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return Status; + } + } + + /* Duplicate the Event */ + if (!DuplicateHandle(GetCurrentProcess(), + ProcessData->Console->ActiveEvent, + ProcessData->Process, + &ProcessData->ConsoleEvent, + EVENT_ALL_ACCESS, + FALSE, + 0)) + { + DPRINT1("DuplicateHandle() failed: %d\n", GetLastError); + ConioDeleteConsole((Object_t *) Console); + if (NewConsole || !ProcessData->bInheritHandles) + { + Win32CsrReleaseObject(ProcessData, + Request->Data.AllocConsoleRequest.OutputHandle); + Win32CsrReleaseObject(ProcessData, + Request->Data.AllocConsoleRequest.InputHandle); + } + ProcessData->Console = 0; + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return Status; + } + + /* Set the Ctrl Dispatcher */ + ProcessData->CtrlDispatcher = Request->Data.AllocConsoleRequest.CtrlDispatcher; + DPRINT("CSRSS:CtrlDispatcher address: %x\n", ProcessData->CtrlDispatcher); + + if (!NewConsole) + { + /* Insert into the list if it has not been added */ + InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry); + } + + RtlLeaveCriticalSection(&ProcessData->HandleTableLock); + return STATUS_SUCCESS; +} + +CSR_API(CsrFreeConsole) +{ + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + return Win32CsrReleaseConsole(ProcessData); +} + +VOID WINAPI +ConioDeleteConsole(Object_t *Object) +{ + PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Object; + ConsoleInput *Event; + + DPRINT("ConioDeleteConsole\n"); + + /* Drain input event queue */ + while (Console->InputEvents.Flink != &Console->InputEvents) + { + Event = (ConsoleInput *) Console->InputEvents.Flink; + Console->InputEvents.Flink = Console->InputEvents.Flink->Flink; + Console->InputEvents.Flink->Flink->Blink = &Console->InputEvents; + HeapFree(Win32CsrApiHeap, 0, Event); + } + + ConioCleanupConsole(Console); + if (Console->LineBuffer) + RtlFreeHeap(Win32CsrApiHeap, 0, Console->LineBuffer); + while (!IsListEmpty(&Console->HistoryBuffers)) + HistoryDeleteBuffer((struct tagHISTORY_BUFFER *)Console->HistoryBuffers.Flink); + + ConioDeleteScreenBuffer(Console->ActiveBuffer); + if (!IsListEmpty(&Console->BufferList)) + { + DPRINT1("BUG: screen buffer list not empty\n"); + } + + CloseHandle(Console->ActiveEvent); + if (Console->UnpauseEvent) CloseHandle(Console->UnpauseEvent); + DeleteCriticalSection(&Console->Lock); + RtlFreeUnicodeString(&Console->Title); + IntDeleteAllAliases(Console->Aliases); + HeapFree(Win32CsrApiHeap, 0, Console); +} + +VOID WINAPI +CsrInitConsoleSupport(VOID) +{ + DPRINT("CSR: CsrInitConsoleSupport()\n"); + + /* Should call LoadKeyboardLayout */ +} + +VOID FASTCALL +ConioPause(PCSRSS_CONSOLE Console, UINT Flags) +{ + Console->PauseFlags |= Flags; + if (!Console->UnpauseEvent) + Console->UnpauseEvent = CreateEvent(NULL, TRUE, FALSE, NULL); +} + +VOID FASTCALL +ConioUnpause(PCSRSS_CONSOLE Console, UINT Flags) +{ + Console->PauseFlags &= ~Flags; + if (Console->PauseFlags == 0 && Console->UnpauseEvent) + { + SetEvent(Console->UnpauseEvent); + CloseHandle(Console->UnpauseEvent); + Console->UnpauseEvent = NULL; + } +} + +CSR_API(CsrSetConsoleMode) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + + DPRINT("CsrSetConsoleMode\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Status = Win32CsrLockObject(ProcessData, + Request->Data.SetConsoleModeRequest.ConsoleHandle, + (Object_t **) &Console, GENERIC_WRITE, 0); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Buff = (PCSRSS_SCREEN_BUFFER)Console; + if (CONIO_CONSOLE_MAGIC == Console->Header.Type) + { + Console->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_INPUT_MODE_VALID; + } + else if (CONIO_SCREEN_BUFFER_MAGIC == Console->Header.Type) + { + Buff->Mode = Request->Data.SetConsoleModeRequest.Mode & CONSOLE_OUTPUT_MODE_VALID; + } + else + { + Status = STATUS_INVALID_HANDLE; + } + + Win32CsrUnlockObject((Object_t *)Console); + + return Status; +} + +CSR_API(CsrGetConsoleMode) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; /* gee, I really wish I could use an anonymous union here */ + + DPRINT("CsrGetConsoleMode\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Status = Win32CsrLockObject(ProcessData, Request->Data.GetConsoleModeRequest.ConsoleHandle, + (Object_t **) &Console, GENERIC_READ, 0); + if (! NT_SUCCESS(Status)) + { + return Status; + } + Status = STATUS_SUCCESS; + Buff = (PCSRSS_SCREEN_BUFFER) Console; + if (CONIO_CONSOLE_MAGIC == Console->Header.Type) + { + Request->Data.GetConsoleModeRequest.ConsoleMode = Console->Mode; + } + else if (CONIO_SCREEN_BUFFER_MAGIC == Buff->Header.Type) + { + Request->Data.GetConsoleModeRequest.ConsoleMode = Buff->Mode; + } + else + { + Status = STATUS_INVALID_HANDLE; + } + + Win32CsrUnlockObject((Object_t *)Console); + return Status; +} + +CSR_API(CsrSetTitle) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + PWCHAR Buffer; + + DPRINT("CsrSetTitle\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + if (!Win32CsrValidateBuffer(ProcessData, Request->Data.SetTitleRequest.Title, + Request->Data.SetTitleRequest.Length, 1)) + { + return STATUS_ACCESS_VIOLATION; + } + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if(NT_SUCCESS(Status)) + { + Buffer = RtlAllocateHeap(RtlGetProcessHeap(), 0, Request->Data.SetTitleRequest.Length); + if (Buffer) + { + /* copy title to console */ + RtlFreeUnicodeString(&Console->Title); + Console->Title.Buffer = Buffer; + Console->Title.Length = Console->Title.MaximumLength = Request->Data.SetTitleRequest.Length; + memcpy(Console->Title.Buffer, Request->Data.SetTitleRequest.Title, Console->Title.Length); + if (! ConioChangeTitle(Console)) + { + Status = STATUS_UNSUCCESSFUL; + } + else + { + Status = STATUS_SUCCESS; + } + } + else + { + Status = STATUS_NO_MEMORY; + } + ConioUnlockConsole(Console); + } + + return Status; +} + +CSR_API(CsrGetTitle) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + DWORD Length; + + DPRINT("CsrGetTitle\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + if (!Win32CsrValidateBuffer(ProcessData, Request->Data.GetTitleRequest.Title, + Request->Data.GetTitleRequest.Length, 1)) + { + return STATUS_ACCESS_VIOLATION; + } + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Can't get console\n"); + return Status; + } + + /* Copy title of the console to the user title buffer */ + if (Request->Data.GetTitleRequest.Length >= sizeof(WCHAR)) + { + Length = min(Request->Data.GetTitleRequest.Length - sizeof(WCHAR), Console->Title.Length); + memcpy(Request->Data.GetTitleRequest.Title, Console->Title.Buffer, Length); + Request->Data.GetTitleRequest.Title[Length / sizeof(WCHAR)] = L'\0'; + } + + Request->Data.GetTitleRequest.Length = Console->Title.Length; + + ConioUnlockConsole(Console); + return STATUS_SUCCESS; +} + +/********************************************************************** + * HardwareStateProperty + * + * DESCRIPTION + * Set/Get the value of the HardwareState and switch + * between direct video buffer ouput and GDI windowed + * output. + * ARGUMENTS + * Client hands us a CSRSS_CONSOLE_HARDWARE_STATE + * object. We use the same object to Request. + * NOTE + * ConsoleHwState has the correct size to be compatible + * with NT's, but values are not. + */ +static NTSTATUS FASTCALL +SetConsoleHardwareState (PCSRSS_CONSOLE Console, DWORD ConsoleHwState) +{ + DPRINT1("Console Hardware State: %d\n", ConsoleHwState); + + if ((CONSOLE_HARDWARE_STATE_GDI_MANAGED == ConsoleHwState) + ||(CONSOLE_HARDWARE_STATE_DIRECT == ConsoleHwState)) + { + if (Console->HardwareState != ConsoleHwState) + { + /* TODO: implement switching from full screen to windowed mode */ + /* TODO: or back; now simply store the hardware state */ + Console->HardwareState = ConsoleHwState; + } + + return STATUS_SUCCESS; + } + + return STATUS_INVALID_PARAMETER_3; /* Client: (handle, set_get, [mode]) */ +} + +CSR_API(CsrHardwareStateProperty) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrHardwareStateProperty\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioLockConsole(ProcessData, + Request->Data.ConsoleHardwareStateRequest.ConsoleHandle, + &Console, + GENERIC_READ); + if (! NT_SUCCESS(Status)) + { + DPRINT1("Failed to get console handle in SetConsoleHardwareState\n"); + return Status; + } + + switch (Request->Data.ConsoleHardwareStateRequest.SetGet) + { + case CONSOLE_HARDWARE_STATE_GET: + Request->Data.ConsoleHardwareStateRequest.State = Console->HardwareState; + break; + + case CONSOLE_HARDWARE_STATE_SET: + DPRINT("Setting console hardware state.\n"); + Status = SetConsoleHardwareState(Console, Request->Data.ConsoleHardwareStateRequest.State); + break; + + default: + Status = STATUS_INVALID_PARAMETER_2; /* Client: (handle, [set_get], mode) */ + break; + } + + ConioUnlockConsole(Console); + + return Status; +} + +CSR_API(CsrGetConsoleWindow) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrGetConsoleWindow\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Request->Data.GetConsoleWindowRequest.WindowHandle = Console->hWindow; + ConioUnlockConsole(Console); + + return STATUS_SUCCESS; +} + +CSR_API(CsrSetConsoleIcon) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrSetConsoleIcon\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Status = (ConioChangeIcon(Console, Request->Data.SetConsoleIconRequest.WindowIcon) + ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL); + ConioUnlockConsole(Console); + + return Status; +} + +CSR_API(CsrGetConsoleCodePage) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrGetConsoleCodePage\n"); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Request->Data.GetConsoleCodePage.CodePage = Console->CodePage; + ConioUnlockConsole(Console); + return STATUS_SUCCESS; +} + +CSR_API(CsrSetConsoleCodePage) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrSetConsoleCodePage\n"); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + if (IsValidCodePage(Request->Data.SetConsoleCodePage.CodePage)) + { + Console->CodePage = Request->Data.SetConsoleCodePage.CodePage; + ConioUnlockConsole(Console); + return STATUS_SUCCESS; + } + + ConioUnlockConsole(Console); + return STATUS_INVALID_PARAMETER; +} + +CSR_API(CsrGetConsoleOutputCodePage) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrGetConsoleOutputCodePage\n"); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Request->Data.GetConsoleOutputCodePage.CodePage = Console->OutputCodePage; + ConioUnlockConsole(Console); + return STATUS_SUCCESS; +} + +CSR_API(CsrSetConsoleOutputCodePage) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + + DPRINT("CsrSetConsoleOutputCodePage\n"); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + if (IsValidCodePage(Request->Data.SetConsoleOutputCodePage.CodePage)) + { + Console->OutputCodePage = Request->Data.SetConsoleOutputCodePage.CodePage; + ConioUnlockConsole(Console); + return STATUS_SUCCESS; + } + + ConioUnlockConsole(Console); + return STATUS_INVALID_PARAMETER; +} + +CSR_API(CsrGetProcessList) +{ + PDWORD Buffer; + PCSRSS_CONSOLE Console; + PCSRSS_PROCESS_DATA current; + PLIST_ENTRY current_entry; + ULONG nItems = 0; + NTSTATUS Status; + + DPRINT("CsrGetProcessList\n"); + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Buffer = Request->Data.GetProcessListRequest.ProcessId; + if (!Win32CsrValidateBuffer(ProcessData, Buffer, Request->Data.GetProcessListRequest.nMaxIds, sizeof(DWORD))) + return STATUS_ACCESS_VIOLATION; + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + for (current_entry = Console->ProcessList.Flink; + current_entry != &Console->ProcessList; + current_entry = current_entry->Flink) + { + current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); + if (++nItems <= Request->Data.GetProcessListRequest.nMaxIds) + { + *Buffer++ = (DWORD)current->ProcessId; + } + } + + ConioUnlockConsole(Console); + + Request->Data.GetProcessListRequest.nProcessIdsTotal = nItems; + return STATUS_SUCCESS; +} + +CSR_API(CsrGenerateCtrlEvent) +{ + PCSRSS_CONSOLE Console; + PCSRSS_PROCESS_DATA current; + PLIST_ENTRY current_entry; + DWORD Group; + NTSTATUS Status; + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (! NT_SUCCESS(Status)) + { + return Status; + } + + Group = Request->Data.GenerateCtrlEvent.ProcessGroup; + Status = STATUS_INVALID_PARAMETER; + for (current_entry = Console->ProcessList.Flink; + current_entry != &Console->ProcessList; + current_entry = current_entry->Flink) + { + current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); + if (Group == 0 || current->ProcessGroup == Group) + { + ConioConsoleCtrlEvent(Request->Data.GenerateCtrlEvent.Event, current); + Status = STATUS_SUCCESS; + } + } + + ConioUnlockConsole(Console); + + return Status; +} + +CSR_API(CsrGetConsoleSelectionInfo) +{ + NTSTATUS Status; + PCSRSS_CONSOLE Console; + + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + memset(&Request->Data.GetConsoleSelectionInfo.Info, 0, sizeof(CONSOLE_SELECTION_INFO)); + if (Console->Selection.dwFlags != 0) + Request->Data.GetConsoleSelectionInfo.Info = Console->Selection; + ConioUnlockConsole(Console); + } + return Status; +} + +/* EOF */ diff --git a/subsystems/win32/csrss/win32csr/desktopbg.c b/subsystems/win32/csrss/win32csr/desktopbg.c index 23cfcdd0b99..14a6155fb00 100644 --- a/subsystems/win32/csrss/win32csr/desktopbg.c +++ b/subsystems/win32/csrss/win32csr/desktopbg.c @@ -49,75 +49,75 @@ DtbgWindowProc(HWND Wnd, switch (Msg) { - case WM_ERASEBKGND: - PaintDesktop((HDC)wParam); - return 1; + case WM_ERASEBKGND: + PaintDesktop((HDC)wParam); + return 1; - case WM_PAINT: - if (BeginPaint(Wnd, &PS)) - EndPaint(Wnd, &PS); - return 0; + case WM_PAINT: + if (BeginPaint(Wnd, &PS)) + EndPaint(Wnd, &PS); + return 0; - case WM_SETCURSOR: - return (LRESULT)SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); + case WM_SETCURSOR: + return (LRESULT)SetCursor(LoadCursorW(0, (LPCWSTR)IDC_ARROW)); - case WM_NCCREATE: - return (LRESULT)TRUE; + case WM_NCCREATE: + return (LRESULT)TRUE; - case WM_CREATE: - case WM_CLOSE: - return 0; + case WM_CREATE: + case WM_CLOSE: + return 0; - case WM_DISPLAYCHANGE: - MoveWindow(Wnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); - break; + case WM_DISPLAYCHANGE: + MoveWindow(Wnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE); + break; - case WM_NOTIFY: + case WM_NOTIFY: + { + PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam; + + /* Use WM_NOTIFY for private messages since + * it can't be sent between processes! + */ + switch (nmh->hdr.code) { - PPRIVATE_NOTIFY_DESKTOP nmh = (PPRIVATE_NOTIFY_DESKTOP)lParam; + case PM_SHOW_DESKTOP: + { + LRESULT Result; - /* Use WM_NOTIFY for private messages since - * it can't be sent between processes! - */ - switch (nmh->hdr.code) - { - case PM_SHOW_DESKTOP: - { - LRESULT Result; + Result = !SetWindowPos(Wnd, NULL, 0, 0, + nmh->ShowDesktop.Width, + nmh->ShowDesktop.Height, + SWP_NOACTIVATE | SWP_NOZORDER | + SWP_SHOWWINDOW); - Result = !SetWindowPos(Wnd, NULL, 0, 0, - nmh->ShowDesktop.Width, - nmh->ShowDesktop.Height, - SWP_NOACTIVATE | SWP_NOZORDER | - SWP_SHOWWINDOW); + UpdateWindow(Wnd); + VisibleDesktopWindow = Wnd; + return Result; + } - UpdateWindow(Wnd); - VisibleDesktopWindow = Wnd; - return Result; - } + case PM_HIDE_DESKTOP: + { + LRESULT Result; - case PM_HIDE_DESKTOP: - { - LRESULT Result; + Result = !SetWindowPos(Wnd, NULL, 0, 0, 0, 0, + SWP_NOACTIVATE | SWP_NOZORDER | + SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); - Result = !SetWindowPos(Wnd, NULL, 0, 0, 0, 0, - SWP_NOACTIVATE | SWP_NOZORDER | - SWP_NOMOVE | SWP_NOSIZE | SWP_HIDEWINDOW); - - UpdateWindow(Wnd); - VisibleDesktopWindow = NULL; - return Result; - } - - default: - DPRINT("Unknown notification code 0x%x sent to the desktop window!\n", - nmh->hdr.code); - return 0; - } + UpdateWindow(Wnd); + VisibleDesktopWindow = NULL; + return Result; } default: - return DefWindowProcW(Wnd, Msg, wParam, lParam); + DPRINT("Unknown notification code 0x%x sent to the desktop window!\n", + nmh->hdr.code); + return 0; + } + } + + default: + return DefWindowProcW(Wnd, Msg, wParam, lParam); } return 0; @@ -313,7 +313,7 @@ FASTCALL DtbgIsDesktopVisible(VOID) { if (VisibleDesktopWindow != NULL && - !IsWindowVisible(VisibleDesktopWindow)) + !IsWindowVisible(VisibleDesktopWindow)) { VisibleDesktopWindow = NULL; } diff --git a/subsystems/win32/csrss/win32csr/dllmain.c b/subsystems/win32/csrss/win32csr/dllmain.c index 2e8947f014a..081788394bb 100644 --- a/subsystems/win32/csrss/win32csr/dllmain.c +++ b/subsystems/win32/csrss/win32csr/dllmain.c @@ -13,7 +13,6 @@ /* Not defined in any header file */ extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check); -extern VOID WINAPI PrivateCsrssInitialized(); extern VOID WINAPI InitializeAppSwitchHook(); /* GLOBALS *******************************************************************/ @@ -23,7 +22,7 @@ HINSTANCE Win32CsrDllHandle = NULL; static CSRSS_EXPORTED_FUNCS CsrExports; static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = - { +{ CSRSS_DEFINE_API(GET_INPUT_HANDLE, CsrGetHandle), CSRSS_DEFINE_API(GET_OUTPUT_HANDLE, CsrGetHandle), CSRSS_DEFINE_API(CLOSE_HANDLE, CsrCloseHandle), @@ -82,38 +81,68 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(GENERATE_CTRL_EVENT, CsrGenerateCtrlEvent), CSRSS_DEFINE_API(SET_SCREEN_BUFFER_SIZE, CsrSetScreenBufferSize), CSRSS_DEFINE_API(GET_CONSOLE_SELECTION_INFO, CsrGetConsoleSelectionInfo), + CSRSS_DEFINE_API(GET_COMMAND_HISTORY_LENGTH, CsrGetCommandHistoryLength), + CSRSS_DEFINE_API(GET_COMMAND_HISTORY, CsrGetCommandHistory), + CSRSS_DEFINE_API(EXPUNGE_COMMAND_HISTORY, CsrExpungeCommandHistory), + CSRSS_DEFINE_API(SET_HISTORY_NUMBER_COMMANDS, CsrSetHistoryNumberCommands), + CSRSS_DEFINE_API(GET_HISTORY_INFO, CsrGetHistoryInfo), + CSRSS_DEFINE_API(SET_HISTORY_INFO, CsrSetHistoryInfo), { 0, 0, NULL } - }; +}; /* FUNCTIONS *****************************************************************/ BOOL WINAPI DllMain(HANDLE hDll, - DWORD dwReason, - LPVOID lpReserved) + DWORD dwReason, + LPVOID lpReserved) { - if (DLL_PROCESS_ATTACH == dwReason) + if (DLL_PROCESS_ATTACH == dwReason) { - Win32CsrDllHandle = hDll; - InitializeAppSwitchHook(); + Win32CsrDllHandle = hDll; + InitializeAppSwitchHook(); } - return TRUE; + return TRUE; +} + +/* Ensure that a captured buffer is safe to access */ +BOOL FASTCALL +Win32CsrValidateBuffer(PCSRSS_PROCESS_DATA ProcessData, PVOID Buffer, + SIZE_T NumElements, SIZE_T ElementSize) +{ + /* Check that the following conditions are true: + * 1. The start of the buffer is somewhere within the process's + * shared memory section view. + * 2. The remaining space in the view is at least as large as the buffer. + * (NB: Please don't try to "optimize" this by using multiplication + * instead of division; remember that 2147483648 * 2 = 0.) + * 3. The buffer is DWORD-aligned. + */ + ULONG_PTR Offset = (BYTE *)Buffer - (BYTE *)ProcessData->CsrSectionViewBase; + if (Offset >= ProcessData->CsrSectionViewSize + || NumElements > (ProcessData->CsrSectionViewSize - Offset) / ElementSize + || (Offset & (sizeof(DWORD) - 1)) != 0) + { + DPRINT1("Invalid buffer %p(%u*%u); section view is %p(%u)\n", + Buffer, NumElements, ElementSize, + ProcessData->CsrSectionViewBase, ProcessData->CsrSectionViewSize); + return FALSE; + } + return TRUE; } NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context) { - return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context); + return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context); } static BOOL WINAPI Win32CsrInitComplete(void) { - PrivateCsrssInitialized(); - - return TRUE; + return TRUE; } BOOL WINAPI @@ -122,22 +151,22 @@ Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions, PCSRSS_EXPORTED_FUNCS Exports, HANDLE CsrssApiHeap) { - NTSTATUS Status; - CsrExports = *Exports; - Win32CsrApiHeap = CsrssApiHeap; + NTSTATUS Status; + CsrExports = *Exports; + Win32CsrApiHeap = CsrssApiHeap; - Status = NtUserInitialize(0 ,NULL, NULL); + Status = NtUserInitialize(0, NULL, NULL); - PrivateCsrssManualGuiCheck(0); - CsrInitConsoleSupport(); + PrivateCsrssManualGuiCheck(0); + CsrInitConsoleSupport(); - *ApiDefinitions = Win32CsrApiDefinitions; - ServerProcs->InitCompleteProc = Win32CsrInitComplete; - ServerProcs->HardErrorProc = Win32CsrHardError; - ServerProcs->ProcessInheritProc = Win32CsrDuplicateHandleTable; - ServerProcs->ProcessDeletedProc = Win32CsrReleaseConsole; + *ApiDefinitions = Win32CsrApiDefinitions; + ServerProcs->InitCompleteProc = Win32CsrInitComplete; + ServerProcs->HardErrorProc = Win32CsrHardError; + ServerProcs->ProcessInheritProc = Win32CsrDuplicateHandleTable; + ServerProcs->ProcessDeletedProc = Win32CsrReleaseConsole; - return TRUE; + return TRUE; } /* EOF */ diff --git a/subsystems/win32/csrss/win32csr/exitros.c b/subsystems/win32/csrss/win32csr/exitros.c index ca9fecbc188..984b44a86a3 100644 --- a/subsystems/win32/csrss/win32csr/exitros.c +++ b/subsystems/win32/csrss/win32csr/exitros.c @@ -18,61 +18,61 @@ static HANDLE LogonProcess = NULL; CSR_API(CsrRegisterLogonProcess) { - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); - if (Request->Data.RegisterLogonProcessRequest.Register) + if (Request->Data.RegisterLogonProcessRequest.Register) { - if (0 != LogonProcess) + if (0 != LogonProcess) { - return STATUS_LOGON_SESSION_EXISTS; + return STATUS_LOGON_SESSION_EXISTS; } - LogonProcess = Request->Data.RegisterLogonProcessRequest.ProcessId; + LogonProcess = Request->Data.RegisterLogonProcessRequest.ProcessId; } - else + else { - if (Request->Header.ClientId.UniqueProcess != LogonProcess) + if (Request->Header.ClientId.UniqueProcess != LogonProcess) { - DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n", - LogonProcess, Request->Header.ClientId.UniqueProcess); - return STATUS_NOT_LOGON_PROCESS; + DPRINT1("Current logon process 0x%x, can't deregister from process 0x%x\n", + LogonProcess, Request->Header.ClientId.UniqueProcess); + return STATUS_NOT_LOGON_PROCESS; } - LogonProcess = 0; + LogonProcess = 0; } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } CSR_API(CsrSetLogonNotifyWindow) { - DWORD WindowCreator; + DWORD WindowCreator; - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - - sizeof(PORT_MESSAGE); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - + sizeof(PORT_MESSAGE); - if (0 == GetWindowThreadProcessId(Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow, - &WindowCreator)) + if (0 == GetWindowThreadProcessId(Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow, + &WindowCreator)) { - DPRINT1("Can't get window creator\n"); - return STATUS_INVALID_HANDLE; + DPRINT1("Can't get window creator\n"); + return STATUS_INVALID_HANDLE; } - if (WindowCreator != (DWORD_PTR)LogonProcess) + if (WindowCreator != (DWORD_PTR)LogonProcess) { - DPRINT1("Trying to register window not created by winlogon as notify window\n"); - return STATUS_ACCESS_DENIED; + DPRINT1("Trying to register window not created by winlogon as notify window\n"); + return STATUS_ACCESS_DENIED; } - LogonNotifyWindow = Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow; + LogonNotifyWindow = Request->Data.SetLogonNotifyWindowRequest.LogonNotifyWindow; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } typedef struct tagSHUTDOWN_SETTINGS { - BOOL AutoEndTasks; - DWORD HungAppTimeout; - DWORD WaitToKillAppTimeout; + BOOL AutoEndTasks; + DWORD HungAppTimeout; + DWORD WaitToKillAppTimeout; } SHUTDOWN_SETTINGS, *PSHUTDOWN_SETTINGS; #define DEFAULT_AUTO_END_TASKS FALSE @@ -81,20 +81,20 @@ typedef struct tagSHUTDOWN_SETTINGS typedef struct tagNOTIFY_CONTEXT { - DWORD ProcessId; - UINT Msg; - WPARAM wParam; - LPARAM lParam; - HDESK Desktop; - DWORD StartTime; - DWORD QueryResult; - HWND Dlg; - DWORD EndNowResult; - BOOL ShowUI; - HANDLE UIThread; - HWND WndClient; - PSHUTDOWN_SETTINGS ShutdownSettings; - LPTHREAD_START_ROUTINE SendMessageProc; + DWORD ProcessId; + UINT Msg; + WPARAM wParam; + LPARAM lParam; + HDESK Desktop; + DWORD StartTime; + DWORD QueryResult; + HWND Dlg; + DWORD EndNowResult; + BOOL ShowUI; + HANDLE UIThread; + HWND WndClient; + PSHUTDOWN_SETTINGS ShutdownSettings; + LPTHREAD_START_ROUTINE SendMessageProc; } NOTIFY_CONTEXT, *PNOTIFY_CONTEXT; #define QUERY_RESULT_ABORT 0 @@ -106,30 +106,30 @@ typedef struct tagNOTIFY_CONTEXT static void FASTCALL UpdateProgressBar(HWND ProgressBar, PNOTIFY_CONTEXT NotifyContext) { - DWORD Passed; + DWORD Passed; - Passed = GetTickCount() - NotifyContext->StartTime; - Passed -= NotifyContext->ShutdownSettings->HungAppTimeout; - if (NotifyContext->ShutdownSettings->WaitToKillAppTimeout < Passed) + Passed = GetTickCount() - NotifyContext->StartTime; + Passed -= NotifyContext->ShutdownSettings->HungAppTimeout; + if (NotifyContext->ShutdownSettings->WaitToKillAppTimeout < Passed) { - Passed = NotifyContext->ShutdownSettings->WaitToKillAppTimeout; + Passed = NotifyContext->ShutdownSettings->WaitToKillAppTimeout; } - SendMessageW(ProgressBar, PBM_SETPOS, Passed / 2, 0); + SendMessageW(ProgressBar, PBM_SETPOS, Passed / 2, 0); } static INT_PTR CALLBACK EndNowDlgProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam) { - INT_PTR Result; - PNOTIFY_CONTEXT NotifyContext; - HWND ProgressBar; - DWORD TitleLength; - int Len; - LPWSTR Title; + INT_PTR Result; + PNOTIFY_CONTEXT NotifyContext; + HWND ProgressBar; + DWORD TitleLength; + int Len; + LPWSTR Title; - switch(Msg) + switch(Msg) { - case WM_INITDIALOG: + case WM_INITDIALOG: NotifyContext = (PNOTIFY_CONTEXT) lParam; NotifyContext->EndNowResult = QUERY_RESULT_ABORT; SetWindowLongPtrW(Dlg, DWLP_USER, (LONG_PTR) lParam); @@ -138,13 +138,13 @@ EndNowDlgProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam) GetWindowTextLengthW(Dlg); Title = HeapAlloc(Win32CsrApiHeap, 0, (TitleLength + 1) * sizeof(WCHAR)); if (NULL != Title) - { + { Len = GetWindowTextW(Dlg, Title, TitleLength + 1); SendMessageW(NotifyContext->WndClient, WM_GETTEXT, TitleLength + 1 - Len, (LPARAM) (Title + Len)); SetWindowTextW(Dlg, Title); HeapFree(Win32CsrApiHeap, 0, Title); - } + } ProgressBar = GetDlgItem(Dlg, IDC_PROGRESS); SendMessageW(ProgressBar, PBM_SETRANGE32, 0, NotifyContext->ShutdownSettings->WaitToKillAppTimeout / 2); @@ -153,33 +153,33 @@ EndNowDlgProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam) Result = FALSE; break; - case WM_TIMER: + case WM_TIMER: NotifyContext = (PNOTIFY_CONTEXT) GetWindowLongPtrW(Dlg, DWLP_USER); ProgressBar = GetDlgItem(Dlg, IDC_PROGRESS); UpdateProgressBar(ProgressBar, NotifyContext); Result = TRUE; break; - case WM_COMMAND: + case WM_COMMAND: if (BN_CLICKED == HIWORD(wParam) && IDC_END_NOW == LOWORD(wParam)) - { + { NotifyContext = (PNOTIFY_CONTEXT) GetWindowLongPtrW(Dlg, DWLP_USER); NotifyContext->EndNowResult = QUERY_RESULT_FORCE; SendMessageW(Dlg, WM_CLOSE, 0, 0); Result = TRUE; - } + } else - { + { Result = FALSE; - } + } break; - case WM_CLOSE: + case WM_CLOSE: DestroyWindow(Dlg); Result = TRUE; break; - case WM_DESTROY: + case WM_DESTROY: NotifyContext = (PNOTIFY_CONTEXT) GetWindowLongPtrW(Dlg, DWLP_USER); NotifyContext->Dlg = NULL; KillTimer(Dlg, 0); @@ -187,12 +187,12 @@ EndNowDlgProc(HWND Dlg, UINT Msg, WPARAM wParam, LPARAM lParam) Result = TRUE; break; - default: + default: Result = FALSE; break; } - return Result; + return Result; } typedef void (WINAPI *INITCOMMONCONTROLS_PROC)(void); @@ -200,265 +200,265 @@ typedef void (WINAPI *INITCOMMONCONTROLS_PROC)(void); static void CallInitCommonControls() { - static BOOL Initialized = FALSE; - HMODULE Lib; - INITCOMMONCONTROLS_PROC InitProc; + static BOOL Initialized = FALSE; + HMODULE Lib; + INITCOMMONCONTROLS_PROC InitProc; - if (Initialized) + if (Initialized) { - return; + return; } - Lib = LoadLibraryW(L"COMCTL32.DLL"); - if (NULL == Lib) + Lib = LoadLibraryW(L"COMCTL32.DLL"); + if (NULL == Lib) { - return; + return; } - InitProc = (INITCOMMONCONTROLS_PROC) GetProcAddress(Lib, "InitCommonControls"); - if (NULL == InitProc) + InitProc = (INITCOMMONCONTROLS_PROC) GetProcAddress(Lib, "InitCommonControls"); + if (NULL == InitProc) { - return; + return; } - (*InitProc)(); + (*InitProc)(); - Initialized = TRUE; + Initialized = TRUE; } static DWORD WINAPI EndNowThreadProc(LPVOID Parameter) { - PNOTIFY_CONTEXT NotifyContext = (PNOTIFY_CONTEXT) Parameter; - MSG Msg; + PNOTIFY_CONTEXT NotifyContext = (PNOTIFY_CONTEXT) Parameter; + MSG Msg; - SetThreadDesktop(NotifyContext->Desktop); - SwitchDesktop(NotifyContext->Desktop); - CallInitCommonControls(); - NotifyContext->Dlg = CreateDialogParam(GetModuleHandleW(L"win32csr"), - MAKEINTRESOURCE(IDD_END_NOW), NULL, - EndNowDlgProc, (LPARAM) NotifyContext); - if (NULL == NotifyContext->Dlg) + SetThreadDesktop(NotifyContext->Desktop); + SwitchDesktop(NotifyContext->Desktop); + CallInitCommonControls(); + NotifyContext->Dlg = CreateDialogParam(GetModuleHandleW(L"win32csr"), + MAKEINTRESOURCE(IDD_END_NOW), NULL, + EndNowDlgProc, (LPARAM) NotifyContext); + if (NULL == NotifyContext->Dlg) { - return 0; + return 0; } - ShowWindow(NotifyContext->Dlg, SW_SHOWNORMAL); + ShowWindow(NotifyContext->Dlg, SW_SHOWNORMAL); - while (GetMessageW(&Msg, NULL, 0, 0)) + while (GetMessageW(&Msg, NULL, 0, 0)) { - if (! IsDialogMessage(NotifyContext->Dlg, &Msg)) + if (! IsDialogMessage(NotifyContext->Dlg, &Msg)) { - TranslateMessage(&Msg); - DispatchMessageW(&Msg); + TranslateMessage(&Msg); + DispatchMessageW(&Msg); } } - return Msg.wParam; + return Msg.wParam; } typedef struct tagMESSAGE_CONTEXT { - HWND Wnd; - UINT Msg; - WPARAM wParam; - LPARAM lParam; - DWORD Timeout; + HWND Wnd; + UINT Msg; + WPARAM wParam; + LPARAM lParam; + DWORD Timeout; } MESSAGE_CONTEXT, *PMESSAGE_CONTEXT; static DWORD WINAPI SendQueryEndSession(LPVOID Parameter) { - PMESSAGE_CONTEXT Context = (PMESSAGE_CONTEXT) Parameter; - DWORD_PTR Result; + PMESSAGE_CONTEXT Context = (PMESSAGE_CONTEXT) Parameter; + DWORD_PTR Result; - if (SendMessageTimeoutW(Context->Wnd, WM_QUERYENDSESSION, Context->wParam, - Context->lParam, SMTO_NORMAL, Context->Timeout, - &Result)) + if (SendMessageTimeoutW(Context->Wnd, WM_QUERYENDSESSION, Context->wParam, + Context->lParam, SMTO_NORMAL, Context->Timeout, + &Result)) { - return Result ? QUERY_RESULT_CONTINUE : QUERY_RESULT_ABORT; + return Result ? QUERY_RESULT_CONTINUE : QUERY_RESULT_ABORT; } - return 0 == GetLastError() ? QUERY_RESULT_TIMEOUT : QUERY_RESULT_ERROR; + return 0 == GetLastError() ? QUERY_RESULT_TIMEOUT : QUERY_RESULT_ERROR; } static DWORD WINAPI SendEndSession(LPVOID Parameter) { - PMESSAGE_CONTEXT Context = (PMESSAGE_CONTEXT) Parameter; - DWORD_PTR Result; + PMESSAGE_CONTEXT Context = (PMESSAGE_CONTEXT) Parameter; + DWORD_PTR Result; - if (Context->wParam) + if (Context->wParam) { - if (SendMessageTimeoutW(Context->Wnd, WM_ENDSESSION, Context->wParam, - Context->lParam, SMTO_NORMAL, Context->Timeout, - &Result)) + if (SendMessageTimeoutW(Context->Wnd, WM_ENDSESSION, Context->wParam, + Context->lParam, SMTO_NORMAL, Context->Timeout, + &Result)) { - return QUERY_RESULT_CONTINUE; + return QUERY_RESULT_CONTINUE; } - return 0 == GetLastError() ? QUERY_RESULT_TIMEOUT : QUERY_RESULT_ERROR; + return 0 == GetLastError() ? QUERY_RESULT_TIMEOUT : QUERY_RESULT_ERROR; } - else + else { - SendMessage(Context->Wnd, WM_ENDSESSION, Context->wParam, - Context->lParam); - return QUERY_RESULT_CONTINUE; + SendMessage(Context->Wnd, WM_ENDSESSION, Context->wParam, + Context->lParam); + return QUERY_RESULT_CONTINUE; } } static BOOL CALLBACK NotifyTopLevelEnum(HWND Wnd, LPARAM lParam) { - PNOTIFY_CONTEXT NotifyContext = (PNOTIFY_CONTEXT) lParam; - MESSAGE_CONTEXT MessageContext; - DWORD Now, Passed; - DWORD Timeout, WaitStatus; - DWORD ProcessId; - HANDLE MessageThread; - HANDLE Threads[2]; + PNOTIFY_CONTEXT NotifyContext = (PNOTIFY_CONTEXT) lParam; + MESSAGE_CONTEXT MessageContext; + DWORD Now, Passed; + DWORD Timeout, WaitStatus; + DWORD ProcessId; + HANDLE MessageThread; + HANDLE Threads[2]; - if (0 == GetWindowThreadProcessId(Wnd, &ProcessId)) + if (0 == GetWindowThreadProcessId(Wnd, &ProcessId)) { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; - return FALSE; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; + return FALSE; } - if (ProcessId == NotifyContext->ProcessId) + if (ProcessId == NotifyContext->ProcessId) { - Now = GetTickCount(); - if (0 == NotifyContext->StartTime) + Now = GetTickCount(); + if (0 == NotifyContext->StartTime) { - NotifyContext->StartTime = Now; + NotifyContext->StartTime = Now; } - /* Note: Passed is computed correctly even when GetTickCount() wraps due - to unsigned arithmetic */ - Passed = Now - NotifyContext->StartTime; - MessageContext.Wnd = Wnd; - MessageContext.Msg = NotifyContext->Msg; - MessageContext.wParam = NotifyContext->wParam; - MessageContext.lParam = NotifyContext->lParam; - MessageContext.Timeout = NotifyContext->ShutdownSettings->HungAppTimeout; - if (! NotifyContext->ShutdownSettings->AutoEndTasks) + /* Note: Passed is computed correctly even when GetTickCount() wraps due + to unsigned arithmetic */ + Passed = Now - NotifyContext->StartTime; + MessageContext.Wnd = Wnd; + MessageContext.Msg = NotifyContext->Msg; + MessageContext.wParam = NotifyContext->wParam; + MessageContext.lParam = NotifyContext->lParam; + MessageContext.Timeout = NotifyContext->ShutdownSettings->HungAppTimeout; + if (! NotifyContext->ShutdownSettings->AutoEndTasks) { - MessageContext.Timeout += NotifyContext->ShutdownSettings->WaitToKillAppTimeout; + MessageContext.Timeout += NotifyContext->ShutdownSettings->WaitToKillAppTimeout; } - if (Passed < MessageContext.Timeout) + if (Passed < MessageContext.Timeout) { - MessageContext.Timeout -= Passed; - MessageThread = CreateThread(NULL, 0, NotifyContext->SendMessageProc, - (LPVOID) &MessageContext, 0, NULL); - if (NULL == MessageThread) + MessageContext.Timeout -= Passed; + MessageThread = CreateThread(NULL, 0, NotifyContext->SendMessageProc, + (LPVOID) &MessageContext, 0, NULL); + if (NULL == MessageThread) { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; - return FALSE; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; + return FALSE; } - Timeout = NotifyContext->ShutdownSettings->HungAppTimeout; - if (Passed < Timeout) + Timeout = NotifyContext->ShutdownSettings->HungAppTimeout; + if (Passed < Timeout) { - Timeout -= Passed; - WaitStatus = WaitForSingleObjectEx(MessageThread, Timeout, FALSE); + Timeout -= Passed; + WaitStatus = WaitForSingleObjectEx(MessageThread, Timeout, FALSE); } - else + else { - WaitStatus = WAIT_TIMEOUT; + WaitStatus = WAIT_TIMEOUT; } - if (WAIT_TIMEOUT == WaitStatus) + if (WAIT_TIMEOUT == WaitStatus) { - NotifyContext->WndClient = Wnd; - if (NULL == NotifyContext->UIThread && NotifyContext->ShowUI) + NotifyContext->WndClient = Wnd; + if (NULL == NotifyContext->UIThread && NotifyContext->ShowUI) { - NotifyContext->UIThread = CreateThread(NULL, 0, - EndNowThreadProc, - (LPVOID) NotifyContext, - 0, NULL); + NotifyContext->UIThread = CreateThread(NULL, 0, + EndNowThreadProc, + (LPVOID) NotifyContext, + 0, NULL); } - Threads[0] = MessageThread; - Threads[1] = NotifyContext->UIThread; - WaitStatus = WaitForMultipleObjectsEx(NULL == NotifyContext->UIThread ? - 1 : 2, - Threads, FALSE, INFINITE, - FALSE); - if (WAIT_OBJECT_0 == WaitStatus) + Threads[0] = MessageThread; + Threads[1] = NotifyContext->UIThread; + WaitStatus = WaitForMultipleObjectsEx(NULL == NotifyContext->UIThread ? + 1 : 2, + Threads, FALSE, INFINITE, + FALSE); + if (WAIT_OBJECT_0 == WaitStatus) { - if (! GetExitCodeThread(MessageThread, &NotifyContext->QueryResult)) + if (! GetExitCodeThread(MessageThread, &NotifyContext->QueryResult)) { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; } } - else if (WAIT_OBJECT_0 + 1 == WaitStatus) + else if (WAIT_OBJECT_0 + 1 == WaitStatus) { - if (! GetExitCodeThread(NotifyContext->UIThread, - &NotifyContext->QueryResult)) + if (! GetExitCodeThread(NotifyContext->UIThread, + &NotifyContext->QueryResult)) { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; } } - else + else { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; } - if (WAIT_OBJECT_0 != WaitStatus) + if (WAIT_OBJECT_0 != WaitStatus) { - TerminateThread(MessageThread, QUERY_RESULT_TIMEOUT); + TerminateThread(MessageThread, QUERY_RESULT_TIMEOUT); } } - else if (WAIT_OBJECT_0 == WaitStatus) + else if (WAIT_OBJECT_0 == WaitStatus) { - if (! GetExitCodeThread(MessageThread, - &NotifyContext->QueryResult)) + if (! GetExitCodeThread(MessageThread, + &NotifyContext->QueryResult)) { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; } } - else + else { - NotifyContext->QueryResult = QUERY_RESULT_ERROR; + NotifyContext->QueryResult = QUERY_RESULT_ERROR; } - CloseHandle(MessageThread); + CloseHandle(MessageThread); } - else + else { - NotifyContext->QueryResult = QUERY_RESULT_TIMEOUT; + NotifyContext->QueryResult = QUERY_RESULT_TIMEOUT; } } - return QUERY_RESULT_CONTINUE == NotifyContext->QueryResult; + return QUERY_RESULT_CONTINUE == NotifyContext->QueryResult; } static BOOL CALLBACK NotifyDesktopEnum(LPWSTR DesktopName, LPARAM lParam) { - PNOTIFY_CONTEXT Context = (PNOTIFY_CONTEXT) lParam; + PNOTIFY_CONTEXT Context = (PNOTIFY_CONTEXT) lParam; - Context->Desktop = OpenDesktopW(DesktopName, 0, FALSE, - DESKTOP_ENUMERATE | DESKTOP_SWITCHDESKTOP); - if (NULL == Context->Desktop) + Context->Desktop = OpenDesktopW(DesktopName, 0, FALSE, + DESKTOP_ENUMERATE | DESKTOP_SWITCHDESKTOP); + if (NULL == Context->Desktop) { - DPRINT1("OpenDesktop failed with error %d\n", GetLastError()); - Context->QueryResult = QUERY_RESULT_ERROR; - return FALSE; + DPRINT1("OpenDesktop failed with error %d\n", GetLastError()); + Context->QueryResult = QUERY_RESULT_ERROR; + return FALSE; } - EnumDesktopWindows(Context->Desktop, NotifyTopLevelEnum, lParam); + EnumDesktopWindows(Context->Desktop, NotifyTopLevelEnum, lParam); - CloseDesktop(Context->Desktop); + CloseDesktop(Context->Desktop); - return QUERY_RESULT_CONTINUE == Context->QueryResult; + return QUERY_RESULT_CONTINUE == Context->QueryResult; } static BOOL FASTCALL NotifyTopLevelWindows(PNOTIFY_CONTEXT Context) { - HWINSTA WindowStation; + HWINSTA WindowStation; - WindowStation = GetProcessWindowStation(); - if (NULL == WindowStation) + WindowStation = GetProcessWindowStation(); + if (NULL == WindowStation) { - DPRINT1("GetProcessWindowStation failed with error %d\n", GetLastError()); - return TRUE; + DPRINT1("GetProcessWindowStation failed with error %d\n", GetLastError()); + return TRUE; } - EnumDesktopsW(WindowStation, NotifyDesktopEnum, (LPARAM) Context); + EnumDesktopsW(WindowStation, NotifyDesktopEnum, (LPARAM) Context); - return TRUE; + return TRUE; } static BOOL FASTCALL @@ -466,476 +466,476 @@ NotifyAndTerminateProcess(PCSRSS_PROCESS_DATA ProcessData, PSHUTDOWN_SETTINGS ShutdownSettings, UINT Flags) { - NOTIFY_CONTEXT Context; - HANDLE Process; - DWORD QueryResult = QUERY_RESULT_CONTINUE; + NOTIFY_CONTEXT Context; + HANDLE Process; + DWORD QueryResult = QUERY_RESULT_CONTINUE; - Context.QueryResult = QUERY_RESULT_CONTINUE; + Context.QueryResult = QUERY_RESULT_CONTINUE; - if (0 == (Flags & EWX_FORCE)) + if (0 == (Flags & EWX_FORCE)) { - if (NULL != ProcessData->Console) + if (NULL != ProcessData->Console) { - ConioConsoleCtrlEventTimeout(CTRL_LOGOFF_EVENT, ProcessData, - ShutdownSettings->WaitToKillAppTimeout); + ConioConsoleCtrlEventTimeout(CTRL_LOGOFF_EVENT, ProcessData, + ShutdownSettings->WaitToKillAppTimeout); } - else + else { - Context.ProcessId = (DWORD_PTR) ProcessData->ProcessId; - Context.wParam = 0; - Context.lParam = (0 != (Flags & EWX_INTERNAL_FLAG_LOGOFF) ? - ENDSESSION_LOGOFF : 0); - Context.StartTime = 0; - Context.UIThread = NULL; - Context.ShowUI = DtbgIsDesktopVisible(); - Context.Dlg = NULL; - Context.ShutdownSettings = ShutdownSettings; - Context.SendMessageProc = SendQueryEndSession; + Context.ProcessId = (DWORD_PTR) ProcessData->ProcessId; + Context.wParam = 0; + Context.lParam = (0 != (Flags & EWX_INTERNAL_FLAG_LOGOFF) ? + ENDSESSION_LOGOFF : 0); + Context.StartTime = 0; + Context.UIThread = NULL; + Context.ShowUI = DtbgIsDesktopVisible(); + Context.Dlg = NULL; + Context.ShutdownSettings = ShutdownSettings; + Context.SendMessageProc = SendQueryEndSession; - NotifyTopLevelWindows(&Context); + NotifyTopLevelWindows(&Context); - Context.wParam = (QUERY_RESULT_ABORT != Context.QueryResult); - Context.lParam = (0 != (Flags & EWX_INTERNAL_FLAG_LOGOFF) ? - ENDSESSION_LOGOFF : 0); - Context.SendMessageProc = SendEndSession; - Context.ShowUI = DtbgIsDesktopVisible() && - (QUERY_RESULT_ABORT != Context.QueryResult); - QueryResult = Context.QueryResult; - Context.QueryResult = QUERY_RESULT_CONTINUE; + Context.wParam = (QUERY_RESULT_ABORT != Context.QueryResult); + Context.lParam = (0 != (Flags & EWX_INTERNAL_FLAG_LOGOFF) ? + ENDSESSION_LOGOFF : 0); + Context.SendMessageProc = SendEndSession; + Context.ShowUI = DtbgIsDesktopVisible() && + (QUERY_RESULT_ABORT != Context.QueryResult); + QueryResult = Context.QueryResult; + Context.QueryResult = QUERY_RESULT_CONTINUE; - NotifyTopLevelWindows(&Context); + NotifyTopLevelWindows(&Context); - if (NULL != Context.UIThread) + if (NULL != Context.UIThread) { - if (NULL != Context.Dlg) + if (NULL != Context.Dlg) { - SendMessageW(Context.Dlg, WM_CLOSE, 0, 0); + SendMessageW(Context.Dlg, WM_CLOSE, 0, 0); } - else + else { - TerminateThread(Context.UIThread, QUERY_RESULT_ERROR); + TerminateThread(Context.UIThread, QUERY_RESULT_ERROR); } - CloseHandle(Context.UIThread); + CloseHandle(Context.UIThread); } } - if (QUERY_RESULT_ABORT == QueryResult) + if (QUERY_RESULT_ABORT == QueryResult) { - return FALSE; + return FALSE; } } - /* Terminate this process */ - Process = OpenProcess(PROCESS_TERMINATE, FALSE, - (DWORD_PTR) ProcessData->ProcessId); - if (NULL == Process) + /* Terminate this process */ + Process = OpenProcess(PROCESS_TERMINATE, FALSE, + (DWORD_PTR) ProcessData->ProcessId); + if (NULL == Process) { - DPRINT1("Unable to open process %d, error %d\n", ProcessData->ProcessId, - GetLastError()); - return TRUE; + DPRINT1("Unable to open process %d, error %d\n", ProcessData->ProcessId, + GetLastError()); + return TRUE; } - TerminateProcess(Process, 0); - CloseHandle(Process); + TerminateProcess(Process, 0); + CloseHandle(Process); - return TRUE; + return TRUE; } typedef struct tagPROCESS_ENUM_CONTEXT { - UINT ProcessCount; - PCSRSS_PROCESS_DATA *ProcessData; - TOKEN_ORIGIN TokenOrigin; - DWORD ShellProcess; - DWORD CsrssProcess; + UINT ProcessCount; + PCSRSS_PROCESS_DATA *ProcessData; + TOKEN_ORIGIN TokenOrigin; + DWORD ShellProcess; + DWORD CsrssProcess; } PROCESS_ENUM_CONTEXT, *PPROCESS_ENUM_CONTEXT; static NTSTATUS WINAPI ExitReactosProcessEnum(PCSRSS_PROCESS_DATA ProcessData, PVOID Data) { - HANDLE Process; - HANDLE Token; - TOKEN_ORIGIN Origin; - DWORD ReturnLength; - PPROCESS_ENUM_CONTEXT Context = (PPROCESS_ENUM_CONTEXT) Data; - PCSRSS_PROCESS_DATA *NewData; + HANDLE Process; + HANDLE Token; + TOKEN_ORIGIN Origin; + DWORD ReturnLength; + PPROCESS_ENUM_CONTEXT Context = (PPROCESS_ENUM_CONTEXT) Data; + PCSRSS_PROCESS_DATA *NewData; - /* Do not kill winlogon or csrss */ - if ((DWORD_PTR) ProcessData->ProcessId == Context->CsrssProcess || - ProcessData->ProcessId == LogonProcess) + /* Do not kill winlogon or csrss */ + if ((DWORD_PTR) ProcessData->ProcessId == Context->CsrssProcess || + ProcessData->ProcessId == LogonProcess) { - return STATUS_SUCCESS; + return STATUS_SUCCESS; } - /* Get the login session of this process */ - Process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, - (DWORD_PTR) ProcessData->ProcessId); - if (NULL == Process) + /* Get the login session of this process */ + Process = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, + (DWORD_PTR) ProcessData->ProcessId); + if (NULL == Process) { - DPRINT1("Unable to open process %d, error %d\n", ProcessData->ProcessId, - GetLastError()); - return STATUS_UNSUCCESSFUL; + DPRINT1("Unable to open process %d, error %d\n", ProcessData->ProcessId, + GetLastError()); + return STATUS_UNSUCCESSFUL; } - if (! OpenProcessToken(Process, TOKEN_QUERY, &Token)) + if (! OpenProcessToken(Process, TOKEN_QUERY, &Token)) { - DPRINT1("Unable to open token for process %d, error %d\n", - ProcessData->ProcessId, GetLastError()); - CloseHandle(Process); - return STATUS_UNSUCCESSFUL; + DPRINT1("Unable to open token for process %d, error %d\n", + ProcessData->ProcessId, GetLastError()); + CloseHandle(Process); + return STATUS_UNSUCCESSFUL; } - CloseHandle(Process); + CloseHandle(Process); - if (! GetTokenInformation(Token, TokenOrigin, &Origin, - sizeof(TOKEN_ORIGIN), &ReturnLength)) + if (! GetTokenInformation(Token, TokenOrigin, &Origin, + sizeof(TOKEN_ORIGIN), &ReturnLength)) { - DPRINT1("GetTokenInformation failed for process %d with error %d\n", - ProcessData->ProcessId, GetLastError()); - CloseHandle(Token); - return STATUS_UNSUCCESSFUL; + DPRINT1("GetTokenInformation failed for process %d with error %d\n", + ProcessData->ProcessId, GetLastError()); + CloseHandle(Token); + return STATUS_UNSUCCESSFUL; } - CloseHandle(Token); + CloseHandle(Token); - /* This process will be killed if it's in the correct logon session */ - if (RtlEqualLuid(&(Context->TokenOrigin.OriginatingLogonSession), - &(Origin.OriginatingLogonSession))) + /* This process will be killed if it's in the correct logon session */ + if (RtlEqualLuid(&(Context->TokenOrigin.OriginatingLogonSession), + &(Origin.OriginatingLogonSession))) { - /* Kill the shell process last */ - if ((DWORD_PTR) ProcessData->ProcessId == Context->ShellProcess) + /* Kill the shell process last */ + if ((DWORD_PTR) ProcessData->ProcessId == Context->ShellProcess) { - ProcessData->ShutdownLevel = 0; + ProcessData->ShutdownLevel = 0; } - NewData = HeapAlloc(Win32CsrApiHeap, 0, (Context->ProcessCount + 1) - * sizeof(PCSRSS_PROCESS_DATA)); - if (NULL == NewData) + NewData = HeapAlloc(Win32CsrApiHeap, 0, (Context->ProcessCount + 1) + * sizeof(PCSRSS_PROCESS_DATA)); + if (NULL == NewData) { - return STATUS_NO_MEMORY; + return STATUS_NO_MEMORY; } - if (0 != Context->ProcessCount) + if (0 != Context->ProcessCount) { - memcpy(NewData, Context->ProcessData, - Context->ProcessCount * sizeof(PCSRSS_PROCESS_DATA)); - HeapFree(Win32CsrApiHeap, 0, Context->ProcessData); + memcpy(NewData, Context->ProcessData, + Context->ProcessCount * sizeof(PCSRSS_PROCESS_DATA)); + HeapFree(Win32CsrApiHeap, 0, Context->ProcessData); } - Context->ProcessData = NewData; - Context->ProcessData[Context->ProcessCount] = ProcessData; - Context->ProcessCount++; + Context->ProcessData = NewData; + Context->ProcessData[Context->ProcessCount] = ProcessData; + Context->ProcessCount++; } - return STATUS_SUCCESS; + return STATUS_SUCCESS; } static int ProcessDataCompare(const void *Elem1, const void *Elem2) { - const PCSRSS_PROCESS_DATA *ProcessData1 = (PCSRSS_PROCESS_DATA *) Elem1; - const PCSRSS_PROCESS_DATA *ProcessData2 = (PCSRSS_PROCESS_DATA *) Elem2; + const PCSRSS_PROCESS_DATA *ProcessData1 = (PCSRSS_PROCESS_DATA *) Elem1; + const PCSRSS_PROCESS_DATA *ProcessData2 = (PCSRSS_PROCESS_DATA *) Elem2; - if ((*ProcessData1)->ShutdownLevel < (*ProcessData2)->ShutdownLevel) + if ((*ProcessData1)->ShutdownLevel < (*ProcessData2)->ShutdownLevel) { - return +1; + return +1; } - else if ((*ProcessData2)->ShutdownLevel < (*ProcessData1)->ShutdownLevel) + else if ((*ProcessData2)->ShutdownLevel < (*ProcessData1)->ShutdownLevel) { - return -1; + return -1; } - else if ((*ProcessData1)->ProcessId < (*ProcessData2)->ProcessId) + else if ((*ProcessData1)->ProcessId < (*ProcessData2)->ProcessId) { - return +1; + return +1; } - else if ((*ProcessData2)->ProcessId < (*ProcessData1)->ProcessId) + else if ((*ProcessData2)->ProcessId < (*ProcessData1)->ProcessId) { - return -1; + return -1; } - return 0; + return 0; } static DWORD FASTCALL GetShutdownSetting(HKEY DesktopKey, LPCWSTR ValueName, DWORD DefaultValue) { - BYTE ValueBuffer[16]; - LONG ErrCode; - DWORD Type; - DWORD ValueSize; - UNICODE_STRING StringValue; - ULONG Value; + BYTE ValueBuffer[16]; + LONG ErrCode; + DWORD Type; + DWORD ValueSize; + UNICODE_STRING StringValue; + ULONG Value; - ValueSize = sizeof(ValueBuffer); - ErrCode = RegQueryValueExW(DesktopKey, ValueName, NULL, &Type, ValueBuffer, - &ValueSize); - if (ERROR_SUCCESS != ErrCode) + ValueSize = sizeof(ValueBuffer); + ErrCode = RegQueryValueExW(DesktopKey, ValueName, NULL, &Type, ValueBuffer, + &ValueSize); + if (ERROR_SUCCESS != ErrCode) { - DPRINT("GetShutdownSetting for %S failed with error code %ld\n", - ValueName, ErrCode); - return DefaultValue; + DPRINT("GetShutdownSetting for %S failed with error code %ld\n", + ValueName, ErrCode); + return DefaultValue; } - if (REG_SZ == Type) + if (REG_SZ == Type) { - RtlInitUnicodeString(&StringValue, (LPCWSTR) ValueBuffer); - if (! NT_SUCCESS(RtlUnicodeStringToInteger(&StringValue, 10, &Value))) + RtlInitUnicodeString(&StringValue, (LPCWSTR) ValueBuffer); + if (! NT_SUCCESS(RtlUnicodeStringToInteger(&StringValue, 10, &Value))) { - DPRINT1("Unable to convert value %S for setting %S\n", - StringValue.Buffer, ValueName); - return DefaultValue; + DPRINT1("Unable to convert value %S for setting %S\n", + StringValue.Buffer, ValueName); + return DefaultValue; } - return (DWORD) Value; + return (DWORD) Value; } - else if (REG_DWORD == Type) + else if (REG_DWORD == Type) { - return *((DWORD *) ValueBuffer); + return *((DWORD *) ValueBuffer); } - DPRINT1("Unexpected registry type %d for setting %S\n", Type, ValueName); - return DefaultValue; + DPRINT1("Unexpected registry type %d for setting %S\n", Type, ValueName); + return DefaultValue; } static void FASTCALL LoadShutdownSettings(PSID Sid, PSHUTDOWN_SETTINGS ShutdownSettings) { - static WCHAR Subkey[] = L"\\Control Panel\\Desktop"; - LPWSTR StringSid; - WCHAR InitialKeyName[128]; - LPWSTR KeyName; - HKEY DesktopKey; - LONG ErrCode; + static WCHAR Subkey[] = L"\\Control Panel\\Desktop"; + LPWSTR StringSid; + WCHAR InitialKeyName[128]; + LPWSTR KeyName; + HKEY DesktopKey; + LONG ErrCode; - ShutdownSettings->AutoEndTasks = DEFAULT_AUTO_END_TASKS; - ShutdownSettings->HungAppTimeout = DEFAULT_HUNG_APP_TIMEOUT; - ShutdownSettings->WaitToKillAppTimeout = DEFAULT_WAIT_TO_KILL_APP_TIMEOUT; + ShutdownSettings->AutoEndTasks = DEFAULT_AUTO_END_TASKS; + ShutdownSettings->HungAppTimeout = DEFAULT_HUNG_APP_TIMEOUT; + ShutdownSettings->WaitToKillAppTimeout = DEFAULT_WAIT_TO_KILL_APP_TIMEOUT; - if (! ConvertSidToStringSidW(Sid, &StringSid)) + if (! ConvertSidToStringSidW(Sid, &StringSid)) { - DPRINT1("ConvertSidToStringSid failed with error %d, using default shutdown settings\n", - GetLastError()); - return; + DPRINT1("ConvertSidToStringSid failed with error %d, using default shutdown settings\n", + GetLastError()); + return; } - if (wcslen(StringSid) + wcslen(Subkey) + 1 <= - sizeof(InitialKeyName) / sizeof(WCHAR)) + if (wcslen(StringSid) + wcslen(Subkey) + 1 <= + sizeof(InitialKeyName) / sizeof(WCHAR)) { - KeyName = InitialKeyName; + KeyName = InitialKeyName; } - else + else { - KeyName = HeapAlloc(Win32CsrApiHeap, 0, - (wcslen(StringSid) + wcslen(Subkey) + 1) * - sizeof(WCHAR)); - if (NULL == KeyName) + KeyName = HeapAlloc(Win32CsrApiHeap, 0, + (wcslen(StringSid) + wcslen(Subkey) + 1) * + sizeof(WCHAR)); + if (NULL == KeyName) { - DPRINT1("Failed to allocate memory, using default shutdown settings\n"); - LocalFree(StringSid); - return; + DPRINT1("Failed to allocate memory, using default shutdown settings\n"); + LocalFree(StringSid); + return; } } - wcscat(wcscpy(KeyName, StringSid), Subkey); - LocalFree(StringSid); + wcscat(wcscpy(KeyName, StringSid), Subkey); + LocalFree(StringSid); - ErrCode = RegOpenKeyExW(HKEY_USERS, KeyName, 0, KEY_QUERY_VALUE, &DesktopKey); - if (KeyName != InitialKeyName) + ErrCode = RegOpenKeyExW(HKEY_USERS, KeyName, 0, KEY_QUERY_VALUE, &DesktopKey); + if (KeyName != InitialKeyName) { - HeapFree(Win32CsrApiHeap, 0, KeyName); + HeapFree(Win32CsrApiHeap, 0, KeyName); } - if (ERROR_SUCCESS != ErrCode) + if (ERROR_SUCCESS != ErrCode) { - DPRINT1("RegOpenKeyEx failed with error %ld, using default shutdown settings\n", ErrCode); - return; + DPRINT1("RegOpenKeyEx failed with error %ld, using default shutdown settings\n", ErrCode); + return; } - ShutdownSettings->AutoEndTasks = (BOOL) GetShutdownSetting(DesktopKey, L"AutoEndTasks", - (DWORD) DEFAULT_AUTO_END_TASKS); - ShutdownSettings->HungAppTimeout = GetShutdownSetting(DesktopKey, - L"HungAppTimeout", - DEFAULT_HUNG_APP_TIMEOUT); - ShutdownSettings->WaitToKillAppTimeout = GetShutdownSetting(DesktopKey, - L"WaitToKillAppTimeout", - DEFAULT_WAIT_TO_KILL_APP_TIMEOUT); + ShutdownSettings->AutoEndTasks = (BOOL) GetShutdownSetting(DesktopKey, L"AutoEndTasks", + (DWORD) DEFAULT_AUTO_END_TASKS); + ShutdownSettings->HungAppTimeout = GetShutdownSetting(DesktopKey, + L"HungAppTimeout", + DEFAULT_HUNG_APP_TIMEOUT); + ShutdownSettings->WaitToKillAppTimeout = GetShutdownSetting(DesktopKey, + L"WaitToKillAppTimeout", + DEFAULT_WAIT_TO_KILL_APP_TIMEOUT); - RegCloseKey(DesktopKey); + RegCloseKey(DesktopKey); } static NTSTATUS FASTCALL InternalExitReactos(DWORD ProcessId, DWORD ThreadId, UINT Flags) { - HANDLE CallerThread; - HANDLE CallerToken; - NTSTATUS Status; - PROCESS_ENUM_CONTEXT Context; - DWORD ReturnLength; - HWND ShellWnd; - UINT ProcessIndex; - char FixedUserInfo[64]; - TOKEN_USER *UserInfo; - SHUTDOWN_SETTINGS ShutdownSettings; + HANDLE CallerThread; + HANDLE CallerToken; + NTSTATUS Status; + PROCESS_ENUM_CONTEXT Context; + DWORD ReturnLength; + HWND ShellWnd; + UINT ProcessIndex; + char FixedUserInfo[64]; + TOKEN_USER *UserInfo; + SHUTDOWN_SETTINGS ShutdownSettings; - if (ProcessId != (DWORD_PTR) LogonProcess) + if (ProcessId != (DWORD_PTR) LogonProcess) { - DPRINT1("Internal ExitWindowsEx call not from winlogon\n"); - return STATUS_ACCESS_DENIED; + DPRINT1("Internal ExitWindowsEx call not from winlogon\n"); + return STATUS_ACCESS_DENIED; } - DPRINT1("FIXME: Need to close all user processes!\n"); - return STATUS_SUCCESS; + DPRINT1("FIXME: Need to close all user processes!\n"); + return STATUS_SUCCESS; - CallerThread = OpenThread(THREAD_QUERY_INFORMATION, FALSE, ThreadId); - if (NULL == CallerThread) + CallerThread = OpenThread(THREAD_QUERY_INFORMATION, FALSE, ThreadId); + if (NULL == CallerThread) { - DPRINT1("OpenThread failed with error %d\n", GetLastError()); - return STATUS_UNSUCCESSFUL; + DPRINT1("OpenThread failed with error %d\n", GetLastError()); + return STATUS_UNSUCCESSFUL; } - if (! OpenThreadToken(CallerThread, TOKEN_QUERY, FALSE, &CallerToken)) + if (! OpenThreadToken(CallerThread, TOKEN_QUERY, FALSE, &CallerToken)) { - DPRINT1("OpenThreadToken failed with error %d\n", GetLastError()); - CloseHandle(CallerThread); - return STATUS_UNSUCCESSFUL; + DPRINT1("OpenThreadToken failed with error %d\n", GetLastError()); + CloseHandle(CallerThread); + return STATUS_UNSUCCESSFUL; } - CloseHandle(CallerThread); + CloseHandle(CallerThread); - Context.ProcessCount = 0; - Context.ProcessData = NULL; - if (! GetTokenInformation(CallerToken, TokenOrigin, &Context.TokenOrigin, - sizeof(TOKEN_ORIGIN), &ReturnLength)) + Context.ProcessCount = 0; + Context.ProcessData = NULL; + if (! GetTokenInformation(CallerToken, TokenOrigin, &Context.TokenOrigin, + sizeof(TOKEN_ORIGIN), &ReturnLength)) { - DPRINT1("GetTokenInformation failed with error %d\n", GetLastError()); - CloseHandle(CallerToken); - return STATUS_UNSUCCESSFUL; + DPRINT1("GetTokenInformation failed with error %d\n", GetLastError()); + CloseHandle(CallerToken); + return STATUS_UNSUCCESSFUL; } - if (! GetTokenInformation(CallerToken, TokenUser, FixedUserInfo, - sizeof(FixedUserInfo), &ReturnLength)) + if (! GetTokenInformation(CallerToken, TokenUser, FixedUserInfo, + sizeof(FixedUserInfo), &ReturnLength)) { - if (sizeof(FixedUserInfo) < ReturnLength) + if (sizeof(FixedUserInfo) < ReturnLength) { - UserInfo = HeapAlloc(Win32CsrApiHeap, 0, ReturnLength); - if (NULL == UserInfo) + UserInfo = HeapAlloc(Win32CsrApiHeap, 0, ReturnLength); + if (NULL == UserInfo) { - DPRINT1("Unable to allocate %u bytes for user info\n", - (unsigned) ReturnLength); - CloseHandle(CallerToken); - return STATUS_NO_MEMORY; + DPRINT1("Unable to allocate %u bytes for user info\n", + (unsigned) ReturnLength); + CloseHandle(CallerToken); + return STATUS_NO_MEMORY; } - if (! GetTokenInformation(CallerToken, TokenUser, UserInfo, - ReturnLength, &ReturnLength)) + if (! GetTokenInformation(CallerToken, TokenUser, UserInfo, + ReturnLength, &ReturnLength)) { - DPRINT1("GetTokenInformation failed with error %d\n", - GetLastError()); - HeapFree(Win32CsrApiHeap, 0, UserInfo); - CloseHandle(CallerToken); - return STATUS_UNSUCCESSFUL; + DPRINT1("GetTokenInformation failed with error %d\n", + GetLastError()); + HeapFree(Win32CsrApiHeap, 0, UserInfo); + CloseHandle(CallerToken); + return STATUS_UNSUCCESSFUL; } } - else + else { - DPRINT1("GetTokenInformation failed with error %d\n", GetLastError()); - CloseHandle(CallerToken); - return STATUS_UNSUCCESSFUL; + DPRINT1("GetTokenInformation failed with error %d\n", GetLastError()); + CloseHandle(CallerToken); + return STATUS_UNSUCCESSFUL; } } - else + else { - UserInfo = (TOKEN_USER *) FixedUserInfo; + UserInfo = (TOKEN_USER *) FixedUserInfo; } - CloseHandle(CallerToken); - LoadShutdownSettings(UserInfo->User.Sid, &ShutdownSettings); - if (UserInfo != (TOKEN_USER *) FixedUserInfo) + CloseHandle(CallerToken); + LoadShutdownSettings(UserInfo->User.Sid, &ShutdownSettings); + if (UserInfo != (TOKEN_USER *) FixedUserInfo) { - HeapFree(Win32CsrApiHeap, 0, UserInfo); + HeapFree(Win32CsrApiHeap, 0, UserInfo); } - Context.CsrssProcess = GetCurrentProcessId(); - ShellWnd = GetShellWindow(); - if (NULL == ShellWnd) + Context.CsrssProcess = GetCurrentProcessId(); + ShellWnd = GetShellWindow(); + if (NULL == ShellWnd) { - DPRINT("No shell present\n"); - Context.ShellProcess = 0; + DPRINT("No shell present\n"); + Context.ShellProcess = 0; } - else if (0 == GetWindowThreadProcessId(ShellWnd, &Context.ShellProcess)) + else if (0 == GetWindowThreadProcessId(ShellWnd, &Context.ShellProcess)) { - DPRINT1("Can't get process id of shell window\n"); - Context.ShellProcess = 0; + DPRINT1("Can't get process id of shell window\n"); + Context.ShellProcess = 0; } - Status = Win32CsrEnumProcesses(ExitReactosProcessEnum, &Context); - if (! NT_SUCCESS(Status)) + Status = Win32CsrEnumProcesses(ExitReactosProcessEnum, &Context); + if (! NT_SUCCESS(Status)) { - DPRINT1("Failed to enumerate registered processes, status 0x%x\n", - Status); - if (NULL != Context.ProcessData) + DPRINT1("Failed to enumerate registered processes, status 0x%x\n", + Status); + if (NULL != Context.ProcessData) { - HeapFree(Win32CsrApiHeap, 0, Context.ProcessData); + HeapFree(Win32CsrApiHeap, 0, Context.ProcessData); } - return Status; + return Status; } - qsort(Context.ProcessData, Context.ProcessCount, sizeof(PCSRSS_PROCESS_DATA), - ProcessDataCompare); + qsort(Context.ProcessData, Context.ProcessCount, sizeof(PCSRSS_PROCESS_DATA), + ProcessDataCompare); - /* Terminate processes, stop if we find one kicking and screaming it doesn't - want to die */ - Status = STATUS_SUCCESS; - for (ProcessIndex = 0; - ProcessIndex < Context.ProcessCount && NT_SUCCESS(Status); - ProcessIndex++) + /* Terminate processes, stop if we find one kicking and screaming it doesn't + want to die */ + Status = STATUS_SUCCESS; + for (ProcessIndex = 0; + ProcessIndex < Context.ProcessCount && NT_SUCCESS(Status); + ProcessIndex++) { - if (! NotifyAndTerminateProcess(Context.ProcessData[ProcessIndex], - &ShutdownSettings, Flags)) + if (! NotifyAndTerminateProcess(Context.ProcessData[ProcessIndex], + &ShutdownSettings, Flags)) { - Status = STATUS_REQUEST_ABORTED; + Status = STATUS_REQUEST_ABORTED; } } - /* Cleanup */ - if (NULL != Context.ProcessData) + /* Cleanup */ + if (NULL != Context.ProcessData) { - HeapFree(Win32CsrApiHeap, 0, Context.ProcessData); + HeapFree(Win32CsrApiHeap, 0, Context.ProcessData); } - return Status; + return Status; } static NTSTATUS FASTCALL UserExitReactos(DWORD UserProcessId, UINT Flags) { - NTSTATUS Status; + NTSTATUS Status; - if (NULL == LogonNotifyWindow) + if (NULL == LogonNotifyWindow) { - DPRINT1("No LogonNotifyWindow registered\n"); - return STATUS_NOT_FOUND; + DPRINT1("No LogonNotifyWindow registered\n"); + return STATUS_NOT_FOUND; } - /* FIXME Inside 2000 says we should impersonate the caller here */ - Status = SendMessageW(LogonNotifyWindow, PM_WINLOGON_EXITWINDOWS, - (WPARAM) UserProcessId, - (LPARAM) Flags); - /* If the message isn't handled, the return value is 0, so 0 doesn't indicate - success. Success is indicated by a 1 return value, if anything besides 0 - or 1 it's a NTSTATUS value */ - if (1 == Status) + /* FIXME Inside 2000 says we should impersonate the caller here */ + Status = SendMessageW(LogonNotifyWindow, PM_WINLOGON_EXITWINDOWS, + (WPARAM) UserProcessId, + (LPARAM) Flags); + /* If the message isn't handled, the return value is 0, so 0 doesn't indicate + success. Success is indicated by a 1 return value, if anything besides 0 + or 1 it's a NTSTATUS value */ + if (1 == Status) { - Status = STATUS_SUCCESS; + Status = STATUS_SUCCESS; } - else if (0 == Status) + else if (0 == Status) { - Status = STATUS_NOT_IMPLEMENTED; + Status = STATUS_NOT_IMPLEMENTED; } - return Status; + return Status; } CSR_API(CsrExitReactos) { - Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); - Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - - sizeof(PORT_MESSAGE); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - + sizeof(PORT_MESSAGE); - if (0 == (Request->Data.ExitReactosRequest.Flags & EWX_INTERNAL_FLAG)) + if (0 == (Request->Data.ExitReactosRequest.Flags & EWX_INTERNAL_FLAG)) { - return UserExitReactos((DWORD_PTR) Request->Header.ClientId.UniqueProcess, - Request->Data.ExitReactosRequest.Flags); + return UserExitReactos((DWORD_PTR) Request->Header.ClientId.UniqueProcess, + Request->Data.ExitReactosRequest.Flags); } - else + else { - return InternalExitReactos((DWORD_PTR) Request->Header.ClientId.UniqueProcess, - (DWORD_PTR) Request->Header.ClientId.UniqueThread, - Request->Data.ExitReactosRequest.Flags); + return InternalExitReactos((DWORD_PTR) Request->Header.ClientId.UniqueProcess, + (DWORD_PTR) Request->Header.ClientId.UniqueThread, + Request->Data.ExitReactosRequest.Flags); } } diff --git a/subsystems/win32/csrss/win32csr/guiconsole.c b/subsystems/win32/csrss/win32csr/guiconsole.c index 5398fd40a4e..ca7388d6f8d 100644 --- a/subsystems/win32/csrss/win32csr/guiconsole.c +++ b/subsystems/win32/csrss/win32csr/guiconsole.c @@ -19,33 +19,30 @@ extern VOID WINAPI PrivateCsrssManualGuiCheck(LONG Check); typedef struct GUI_CONSOLE_DATA_TAG { - HFONT Font; - unsigned CharWidth; - unsigned CharHeight; - BOOL CursorBlinkOn; - BOOL ForceCursorOff; - CRITICAL_SECTION Lock; - HMODULE ConsoleLibrary; - HANDLE hGuiInitEvent; - WCHAR FontName[LF_FACESIZE]; - DWORD FontSize; - DWORD FontWeight; - DWORD HistoryNoDup; - DWORD FullScreen; - DWORD QuickEdit; - DWORD InsertMode; - DWORD NumberOfHistoryBuffers; - DWORD HistoryBufferSize; - DWORD WindowPosition; - DWORD UseRasterFonts; - COLORREF ScreenText; - COLORREF ScreenBackground; - COLORREF PopupBackground; - COLORREF PopupText; - COLORREF Colors[16]; - WCHAR szProcessName[MAX_PATH]; - BOOL WindowSizeLock; - POINT OldCursor; + HFONT Font; + unsigned CharWidth; + unsigned CharHeight; + BOOL CursorBlinkOn; + BOOL ForceCursorOff; + CRITICAL_SECTION Lock; + HMODULE ConsoleLibrary; + HANDLE hGuiInitEvent; + WCHAR FontName[LF_FACESIZE]; + DWORD FontSize; + DWORD FontWeight; + DWORD FullScreen; + DWORD QuickEdit; + DWORD InsertMode; + DWORD WindowPosition; + DWORD UseRasterFonts; + COLORREF ScreenText; + COLORREF ScreenBackground; + COLORREF PopupBackground; + COLORREF PopupText; + COLORREF Colors[16]; + WCHAR szProcessName[MAX_PATH]; + BOOL WindowSizeLock; + POINT OldCursor; } GUI_CONSOLE_DATA, *PGUI_CONSOLE_DATA; #ifndef WM_APP @@ -164,8 +161,8 @@ GuiConsoleAppendMenuItems(HMENU hMenu, 0, NULL); } - i++; - }while(!(Items[i].uID == 0 && Items[i].SubMenu == NULL && Items[i].wCmdID == 0)); + i++; + } while(!(Items[i].uID == 0 && Items[i].SubMenu == NULL && Items[i].wCmdID == 0)); } static VOID @@ -185,206 +182,206 @@ GuiConsoleCreateSysMenu(PCSRSS_CONSOLE Console) static VOID GuiConsoleGetDataPointers(HWND hWnd, PCSRSS_CONSOLE *Console, PGUI_CONSOLE_DATA *GuiData) { - *Console = (PCSRSS_CONSOLE) GetWindowLongPtrW(hWnd, GWL_USERDATA); - *GuiData = (NULL == *Console ? NULL : (*Console)->PrivateData); + *Console = (PCSRSS_CONSOLE) GetWindowLongPtrW(hWnd, GWL_USERDATA); + *GuiData = (NULL == *Console ? NULL : (*Console)->PrivateData); } static BOOL GuiConsoleOpenUserRegistryPathPerProcessId(DWORD ProcessId, PHANDLE hProcHandle, PHKEY hResult, REGSAM samDesired) { - HANDLE hProcessToken = NULL; - HANDLE hProcess; + HANDLE hProcessToken = NULL; + HANDLE hProcess; - BYTE Buffer[256]; - DWORD Length = 0; - UNICODE_STRING SidName; - LONG res; - PTOKEN_USER TokUser; + BYTE Buffer[256]; + DWORD Length = 0; + UNICODE_STRING SidName; + LONG res; + PTOKEN_USER TokUser; - hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | READ_CONTROL, FALSE, ProcessId); - if (!hProcess) + hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ | READ_CONTROL, FALSE, ProcessId); + if (!hProcess) { - DPRINT("Error: OpenProcess failed(0x%x)\n", GetLastError()); - return FALSE; + DPRINT("Error: OpenProcess failed(0x%x)\n", GetLastError()); + return FALSE; } - if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken)) + if (!OpenProcessToken(hProcess, TOKEN_QUERY, &hProcessToken)) { - DPRINT("Error: OpenProcessToken failed(0x%x)\n", GetLastError()); - CloseHandle(hProcess); - return FALSE; + DPRINT("Error: OpenProcessToken failed(0x%x)\n", GetLastError()); + CloseHandle(hProcess); + return FALSE; } - if (!GetTokenInformation(hProcessToken, TokenUser, (PVOID)Buffer, sizeof(Buffer), &Length)) + if (!GetTokenInformation(hProcessToken, TokenUser, (PVOID)Buffer, sizeof(Buffer), &Length)) { - DPRINT("Error: GetTokenInformation failed(0x%x)\n",GetLastError()); - CloseHandle(hProcess); - CloseHandle(hProcessToken); - return FALSE; + DPRINT("Error: GetTokenInformation failed(0x%x)\n",GetLastError()); + CloseHandle(hProcess); + CloseHandle(hProcessToken); + return FALSE; } - TokUser = ((PTOKEN_USER)Buffer)->User.Sid; - if (!NT_SUCCESS(RtlConvertSidToUnicodeString(&SidName, TokUser, TRUE))) + TokUser = ((PTOKEN_USER)Buffer)->User.Sid; + if (!NT_SUCCESS(RtlConvertSidToUnicodeString(&SidName, TokUser, TRUE))) { - DPRINT("Error: RtlConvertSidToUnicodeString failed(0x%x)\n", GetLastError()); - return FALSE; + DPRINT("Error: RtlConvertSidToUnicodeString failed(0x%x)\n", GetLastError()); + return FALSE; } - res = RegOpenKeyExW(HKEY_USERS, SidName.Buffer, 0, samDesired, hResult); - RtlFreeUnicodeString(&SidName); + res = RegOpenKeyExW(HKEY_USERS, SidName.Buffer, 0, samDesired, hResult); + RtlFreeUnicodeString(&SidName); - CloseHandle(hProcessToken); - if (hProcHandle) - *hProcHandle = hProcess; - else - CloseHandle(hProcess); + CloseHandle(hProcessToken); + if (hProcHandle) + *hProcHandle = hProcess; + else + CloseHandle(hProcess); - if (res != ERROR_SUCCESS) - return FALSE; - else - return TRUE; + if (res != ERROR_SUCCESS) + return FALSE; + else + return TRUE; } static BOOL GuiConsoleOpenUserSettings(PGUI_CONSOLE_DATA GuiData, DWORD ProcessId, PHKEY hSubKey, REGSAM samDesired, BOOL bCreate) { - WCHAR szProcessName[MAX_PATH]; - WCHAR szBuffer[MAX_PATH]; - UINT fLength, wLength; - DWORD dwBitmask, dwLength; - WCHAR CurDrive[] = { 'A',':', 0 }; - HANDLE hProcess; - HKEY hKey; - WCHAR * ptr; + WCHAR szProcessName[MAX_PATH]; + WCHAR szBuffer[MAX_PATH]; + UINT fLength, wLength; + DWORD dwBitmask, dwLength; + WCHAR CurDrive[] = { 'A',':', 0 }; + HANDLE hProcess; + HKEY hKey; + WCHAR * ptr; - /* - * console properties are stored under - * HKCU\Console\* - * - * There are 3 ways to store console properties - * - * 1. use console title as subkey name - * i.e. cmd.exe - * - * 2. use application name as subkey name - * - * 3. use unexpanded path to console application. - * i.e. %SystemRoot%_system32_cmd.exe - */ + /* + * console properties are stored under + * HKCU\Console\* + * + * There are 3 ways to store console properties + * + * 1. use console title as subkey name + * i.e. cmd.exe + * + * 2. use application name as subkey name + * + * 3. use unexpanded path to console application. + * i.e. %SystemRoot%_system32_cmd.exe + */ - DPRINT("GuiConsoleOpenUserSettings entered\n"); + DPRINT("GuiConsoleOpenUserSettings entered\n"); - if (!GuiConsoleOpenUserRegistryPathPerProcessId(ProcessId, &hProcess, &hKey, samDesired)) + if (!GuiConsoleOpenUserRegistryPathPerProcessId(ProcessId, &hProcess, &hKey, samDesired)) { - DPRINT("GuiConsoleOpenUserRegistryPathPerProcessId failed\n"); - return FALSE; + DPRINT("GuiConsoleOpenUserRegistryPathPerProcessId failed\n"); + return FALSE; } - /* FIXME we do not getting the process name so no menu will be loading, why ?*/ - fLength = GetProcessImageFileNameW(hProcess, szProcessName, sizeof(GuiData->szProcessName) / sizeof(WCHAR)); - CloseHandle(hProcess); + /* FIXME we do not getting the process name so no menu will be loading, why ?*/ + fLength = GetProcessImageFileNameW(hProcess, szProcessName, sizeof(GuiData->szProcessName) / sizeof(WCHAR)); + CloseHandle(hProcess); - //DPRINT1("szProcessName3 : %S\n",szProcessName); + //DPRINT1("szProcessName3 : %S\n",szProcessName); - if (!fLength) + if (!fLength) { - DPRINT("GetProcessImageFileNameW failed(0x%x)ProcessId %d\n", GetLastError(),hProcess); - return FALSE; + DPRINT("GetProcessImageFileNameW failed(0x%x)ProcessId %d\n", GetLastError(),hProcess); + return FALSE; } - /* - * try the process name as path - */ + /* + * try the process name as path + */ - ptr = wcsrchr(szProcessName, L'\\'); - wcscpy(GuiData->szProcessName, ptr); + ptr = wcsrchr(szProcessName, L'\\'); + wcscpy(GuiData->szProcessName, ptr); - swprintf(szBuffer, L"Console%s",ptr); - DPRINT("#1 Path : %S\n", szBuffer); + swprintf(szBuffer, L"Console%s",ptr); + DPRINT("#1 Path : %S\n", szBuffer); - if (bCreate) + if (bCreate) { - if (RegCreateKeyW(hKey, szBuffer, hSubKey) == ERROR_SUCCESS) + if (RegCreateKeyW(hKey, szBuffer, hSubKey) == ERROR_SUCCESS) { - RegCloseKey(hKey); - return TRUE; + RegCloseKey(hKey); + return TRUE; } - RegCloseKey(hKey); - return FALSE; - } - - if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) - { - RegCloseKey(hKey); - return TRUE; + RegCloseKey(hKey); + return FALSE; } - /* - * try the "Shortcut to processname" as path - * FIXME: detect wheter the process was started as a shortcut - */ - - swprintf(szBuffer, L"Console\\Shortcut to %S", ptr); - DPRINT("#2 Path : %S\n", szBuffer); - if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) + if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) { - swprintf(GuiData->szProcessName, L"Shortcut to %S", ptr); - RegCloseKey(hKey); - return TRUE; + RegCloseKey(hKey); + return TRUE; } - /* - * if the path contains \\Device\\HarddiskVolume1\... remove it - */ + /* + * try the "Shortcut to processname" as path + * FIXME: detect wheter the process was started as a shortcut + */ - if (szProcessName[0] == L'\\') + swprintf(szBuffer, L"Console\\Shortcut to %S", ptr); + DPRINT("#2 Path : %S\n", szBuffer); + if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) { - dwBitmask = GetLogicalDrives(); - while(dwBitmask) + swprintf(GuiData->szProcessName, L"Shortcut to %S", ptr); + RegCloseKey(hKey); + return TRUE; + } + + /* + * if the path contains \\Device\\HarddiskVolume1\... remove it + */ + + if (szProcessName[0] == L'\\') + { + dwBitmask = GetLogicalDrives(); + while(dwBitmask) { - if (dwBitmask & 0x1) + if (dwBitmask & 0x1) { - dwLength = QueryDosDeviceW(CurDrive, szBuffer, MAX_PATH); - if (dwLength) + dwLength = QueryDosDeviceW(CurDrive, szBuffer, MAX_PATH); + if (dwLength) { - if (!memcmp(szBuffer, szProcessName, (dwLength-2)*sizeof(WCHAR))) + if (!memcmp(szBuffer, szProcessName, (dwLength-2)*sizeof(WCHAR))) { - wcscpy(szProcessName, CurDrive); - RtlMoveMemory(&szProcessName[2], &szProcessName[dwLength-1], fLength - dwLength -1); - break; + wcscpy(szProcessName, CurDrive); + RtlMoveMemory(&szProcessName[2], &szProcessName[dwLength-1], fLength - dwLength -1); + break; } } } - dwBitmask = (dwBitmask >> 1); - CurDrive[0]++; + dwBitmask = (dwBitmask >> 1); + CurDrive[0]++; } } - /* - * last attempt: check whether the file is under %SystemRoot% - * and use path like Console\%SystemRoot%_dir_dir2_file.exe - */ + /* + * last attempt: check whether the file is under %SystemRoot% + * and use path like Console\%SystemRoot%_dir_dir2_file.exe + */ - wLength = GetWindowsDirectoryW(szBuffer, MAX_PATH); - if (wLength) + wLength = GetWindowsDirectoryW(szBuffer, MAX_PATH); + if (wLength) { - if (!wcsncmp(szProcessName, szBuffer, wLength)) + if (!wcsncmp(szProcessName, szBuffer, wLength)) { - /* replace slashes by underscores */ - while((ptr = wcschr(szProcessName, L'\\'))) - ptr[0] = L'_'; + /* replace slashes by underscores */ + while((ptr = wcschr(szProcessName, L'\\'))) + ptr[0] = L'_'; - swprintf(szBuffer, L"Console\\%%SystemRoot%%%S", &szProcessName[wLength]); - DPRINT("#3 Path : %S\n", szBuffer); - if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) + swprintf(szBuffer, L"Console\\%%SystemRoot%%%S", &szProcessName[wLength]); + DPRINT("#3 Path : %S\n", szBuffer); + if (RegOpenKeyExW(hKey, szBuffer, 0, samDesired, hSubKey) == ERROR_SUCCESS) { - swprintf(GuiData->szProcessName, L"%%SystemRoot%%%S", &szProcessName[wLength]); - RegCloseKey(hKey); - return TRUE; + swprintf(GuiData->szProcessName, L"%%SystemRoot%%%S", &szProcessName[wLength]); + RegCloseKey(hKey); + return TRUE; } } } - RegCloseKey(hKey); - return FALSE; + RegCloseKey(hKey); + return FALSE; } static VOID @@ -394,238 +391,241 @@ GuiConsoleWriteUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData) PCSRSS_PROCESS_DATA ProcessData; if (Console->ProcessList.Flink == &Console->ProcessList) - { + { DPRINT("GuiConsoleWriteUserSettings: No Process!!!\n"); return; - } + } ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry); if (!GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ | KEY_WRITE, TRUE)) - { + { return; - } - - if (Console->ActiveBuffer->CursorInfo.dwSize <= 1) - { - RegDeleteKeyW(hKey, L"CursorSize"); - } - else - { - RegSetValueExW(hKey, L"CursorSize", 0, REG_DWORD, (const BYTE *)&Console->ActiveBuffer->CursorInfo.dwSize, sizeof(DWORD)); } - if (GuiData->NumberOfHistoryBuffers == 5) + if (Console->ActiveBuffer->CursorInfo.dwSize <= 1) { - RegDeleteKeyW(hKey, L"NumberOfHistoryBuffers"); - } - else - { - RegSetValueExW(hKey, L"NumberOfHistoryBuffers", 0, REG_DWORD, (const BYTE *)&GuiData->NumberOfHistoryBuffers, sizeof(DWORD)); - } - - if (GuiData->HistoryBufferSize == 50) - { - RegDeleteKeyW(hKey, L"HistoryBufferSize"); - } - else - { - RegSetValueExW(hKey, L"HistoryBufferSize", 0, REG_DWORD, (const BYTE *)&GuiData->HistoryBufferSize, sizeof(DWORD)); - } - - if (GuiData->FullScreen == FALSE) - { - RegDeleteKeyW(hKey, L"FullScreen"); - } - else - { - RegSetValueExW(hKey, L"FullScreen", 0, REG_DWORD, (const BYTE *)&GuiData->FullScreen, sizeof(DWORD)); - } - - if ( GuiData->QuickEdit == FALSE) - { - RegDeleteKeyW(hKey, L"QuickEdit"); + RegDeleteKeyW(hKey, L"CursorSize"); } else { - RegSetValueExW(hKey, L"QuickEdit", 0, REG_DWORD, (const BYTE *)&GuiData->QuickEdit, sizeof(DWORD)); + RegSetValueExW(hKey, L"CursorSize", 0, REG_DWORD, (const BYTE *)&Console->ActiveBuffer->CursorInfo.dwSize, sizeof(DWORD)); } - if (GuiData->InsertMode == TRUE) + if (Console->NumberOfHistoryBuffers == 5) { - RegDeleteKeyW(hKey, L"InsertMode"); + RegDeleteKeyW(hKey, L"NumberOfHistoryBuffers"); } - else + else { - RegSetValueExW(hKey, L"InsertMode", 0, REG_DWORD, (const BYTE *)&GuiData->InsertMode, sizeof(DWORD)); + DWORD Temp = Console->NumberOfHistoryBuffers; + RegSetValueExW(hKey, L"NumberOfHistoryBuffers", 0, REG_DWORD, (const BYTE *)&Temp, sizeof(DWORD)); } - if (GuiData->HistoryNoDup == FALSE) + if (Console->HistoryBufferSize == 50) { - RegDeleteKeyW(hKey, L"HistoryNoDup"); + RegDeleteKeyW(hKey, L"HistoryBufferSize"); } - else + else { - RegSetValueExW(hKey, L"HistoryNoDup", 0, REG_DWORD, (const BYTE *)&GuiData->HistoryNoDup, sizeof(DWORD)); + DWORD Temp = Console->HistoryBufferSize; + RegSetValueExW(hKey, L"HistoryBufferSize", 0, REG_DWORD, (const BYTE *)&Temp, sizeof(DWORD)); } - if (GuiData->ScreenText == RGB(192, 192, 192)) + if (GuiData->FullScreen == FALSE) { - /* - * MS uses console attributes instead of real color - */ - RegDeleteKeyW(hKey, L"ScreenText"); + RegDeleteKeyW(hKey, L"FullScreen"); } - else + else { - RegSetValueExW(hKey, L"ScreenText", 0, REG_DWORD, (const BYTE *)&GuiData->ScreenText, sizeof(COLORREF)); + RegSetValueExW(hKey, L"FullScreen", 0, REG_DWORD, (const BYTE *)&GuiData->FullScreen, sizeof(DWORD)); } - if (GuiData->ScreenBackground == RGB(0, 0, 0)) + if ( GuiData->QuickEdit == FALSE) { - RegDeleteKeyW(hKey, L"ScreenBackground"); + RegDeleteKeyW(hKey, L"QuickEdit"); } - else + else { - RegSetValueExW(hKey, L"ScreenBackground", 0, REG_DWORD, (const BYTE *)&GuiData->ScreenBackground, sizeof(COLORREF)); + RegSetValueExW(hKey, L"QuickEdit", 0, REG_DWORD, (const BYTE *)&GuiData->QuickEdit, sizeof(DWORD)); } - RegCloseKey(hKey); + if (GuiData->InsertMode == TRUE) + { + RegDeleteKeyW(hKey, L"InsertMode"); + } + else + { + RegSetValueExW(hKey, L"InsertMode", 0, REG_DWORD, (const BYTE *)&GuiData->InsertMode, sizeof(DWORD)); + } + + if (Console->HistoryNoDup == FALSE) + { + RegDeleteKeyW(hKey, L"HistoryNoDup"); + } + else + { + DWORD Temp = Console->HistoryNoDup; + RegSetValueExW(hKey, L"HistoryNoDup", 0, REG_DWORD, (const BYTE *)&Temp, sizeof(DWORD)); + } + + if (GuiData->ScreenText == RGB(192, 192, 192)) + { + /* + * MS uses console attributes instead of real color + */ + RegDeleteKeyW(hKey, L"ScreenText"); + } + else + { + RegSetValueExW(hKey, L"ScreenText", 0, REG_DWORD, (const BYTE *)&GuiData->ScreenText, sizeof(COLORREF)); + } + + if (GuiData->ScreenBackground == RGB(0, 0, 0)) + { + RegDeleteKeyW(hKey, L"ScreenBackground"); + } + else + { + RegSetValueExW(hKey, L"ScreenBackground", 0, REG_DWORD, (const BYTE *)&GuiData->ScreenBackground, sizeof(COLORREF)); + } + + RegCloseKey(hKey); } static void GuiConsoleReadUserSettings(HKEY hKey, PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer) { - DWORD dwNumSubKeys = 0; - DWORD dwIndex; - DWORD dwValueName; - DWORD dwValue; - DWORD dwType; - WCHAR szValueName[MAX_PATH]; - WCHAR szValue[LF_FACESIZE] = L"\0"; - DWORD Value; + DWORD dwNumSubKeys = 0; + DWORD dwIndex; + DWORD dwValueName; + DWORD dwValue; + DWORD dwType; + WCHAR szValueName[MAX_PATH]; + WCHAR szValue[LF_FACESIZE] = L"\0"; + DWORD Value; - if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwNumSubKeys, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) + if (RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwNumSubKeys, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) { - DPRINT("GuiConsoleReadUserSettings: RegQueryInfoKey failed\n"); - return; + DPRINT("GuiConsoleReadUserSettings: RegQueryInfoKey failed\n"); + return; } - DPRINT("GuiConsoleReadUserSettings entered dwNumSubKeys %d\n", dwNumSubKeys); + DPRINT("GuiConsoleReadUserSettings entered dwNumSubKeys %d\n", dwNumSubKeys); - for (dwIndex = 0; dwIndex < dwNumSubKeys; dwIndex++) + for (dwIndex = 0; dwIndex < dwNumSubKeys; dwIndex++) { - dwValue = sizeof(Value); - dwValueName = MAX_PATH; + dwValue = sizeof(Value); + dwValueName = MAX_PATH; - if (RegEnumValueW(hKey, dwIndex, szValueName, &dwValueName, NULL, &dwType, (BYTE*)&Value, &dwValue) != ERROR_SUCCESS) + if (RegEnumValueW(hKey, dwIndex, szValueName, &dwValueName, NULL, &dwType, (BYTE*)&Value, &dwValue) != ERROR_SUCCESS) { - if (dwType == REG_SZ) + if (dwType == REG_SZ) { - /* - * retry in case of string value - */ - dwValue = sizeof(szValue); - dwValueName = LF_FACESIZE; - if (RegEnumValueW(hKey, dwIndex, szValueName, &dwValueName, NULL, NULL, (BYTE*)szValue, &dwValue) != ERROR_SUCCESS) + /* + * retry in case of string value + */ + dwValue = sizeof(szValue); + dwValueName = LF_FACESIZE; + if (RegEnumValueW(hKey, dwIndex, szValueName, &dwValueName, NULL, NULL, (BYTE*)szValue, &dwValue) != ERROR_SUCCESS) + break; + } + else break; - } - else - break; } - if (!wcscmp(szValueName, L"CursorSize")) + if (!wcscmp(szValueName, L"CursorSize")) { - if (Value == 0x32) + if (Value == 0x32) { - Buffer->CursorInfo.dwSize = Value; + Buffer->CursorInfo.dwSize = Value; } - else if (Value == 0x64) + else if (Value == 0x64) { - Buffer->CursorInfo.dwSize = Value; + Buffer->CursorInfo.dwSize = Value; } } - else if (!wcscmp(szValueName, L"ScreenText")) + else if (!wcscmp(szValueName, L"ScreenText")) { - GuiData->ScreenText = Value; + GuiData->ScreenText = Value; } - else if (!wcscmp(szValueName, L"ScreenBackground")) + else if (!wcscmp(szValueName, L"ScreenBackground")) { - GuiData->ScreenBackground = Value; + GuiData->ScreenBackground = Value; } - else if (!wcscmp(szValueName, L"FaceName")) + else if (!wcscmp(szValueName, L"FaceName")) { - wcscpy(GuiData->FontName, szValue); + wcscpy(GuiData->FontName, szValue); } - else if (!wcscmp(szValueName, L"FontSize")) + else if (!wcscmp(szValueName, L"FontSize")) { - GuiData->FontSize = Value; + GuiData->FontSize = Value; } - else if (!wcscmp(szValueName, L"FontWeight")) + else if (!wcscmp(szValueName, L"FontWeight")) { - GuiData->FontWeight = Value; + GuiData->FontWeight = Value; } - else if (!wcscmp(szValueName, L"HistoryNoDup")) + else if (!wcscmp(szValueName, L"HistoryNoDup")) { - GuiData->HistoryNoDup = Value; + Console->HistoryNoDup = Value; } - else if (!wcscmp(szValueName, L"WindowSize")) + else if (!wcscmp(szValueName, L"WindowSize")) { - Console->Size.X = LOWORD(Value); - Console->Size.Y = HIWORD(Value); + Console->Size.X = LOWORD(Value); + Console->Size.Y = HIWORD(Value); } - else if (!wcscmp(szValueName, L"ScreenBufferSize")) + else if (!wcscmp(szValueName, L"ScreenBufferSize")) { if(Buffer) - { + { Buffer->MaxX = LOWORD(Value); Buffer->MaxY = HIWORD(Value); - } + } } - else if (!wcscmp(szValueName, L"FullScreen")) + else if (!wcscmp(szValueName, L"FullScreen")) { - GuiData->FullScreen = Value; + GuiData->FullScreen = Value; } - else if (!wcscmp(szValueName, L"QuickEdit")) + else if (!wcscmp(szValueName, L"QuickEdit")) { - GuiData->QuickEdit = Value; + GuiData->QuickEdit = Value; } - else if (!wcscmp(szValueName, L"InsertMode")) + else if (!wcscmp(szValueName, L"InsertMode")) { - GuiData->InsertMode = Value; + GuiData->InsertMode = Value; } - } + } } static VOID GuiConsoleUseDefaults(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PCSRSS_SCREEN_BUFFER Buffer) { - /* - * init guidata with default properties - */ + /* + * init guidata with default properties + */ - wcscpy(GuiData->FontName, L"DejaVu Sans Mono"); - GuiData->FontSize = 0x0008000C; // font is 8x12 - GuiData->FontWeight = FW_NORMAL; - GuiData->HistoryNoDup = FALSE; - GuiData->FullScreen = FALSE; - GuiData->QuickEdit = FALSE; - GuiData->InsertMode = TRUE; - GuiData->HistoryBufferSize = 50; - GuiData->NumberOfHistoryBuffers = 5; - GuiData->ScreenText = RGB(192, 192, 192); - GuiData->ScreenBackground = RGB(0, 0, 0); - GuiData->PopupText = RGB(128, 0, 128); - GuiData->PopupBackground = RGB(255, 255, 255); - GuiData->WindowPosition = UINT_MAX; - GuiData->UseRasterFonts = TRUE; - memcpy(GuiData->Colors, s_Colors, sizeof(s_Colors)); + wcscpy(GuiData->FontName, L"DejaVu Sans Mono"); + GuiData->FontSize = 0x0008000C; // font is 8x12 + GuiData->FontWeight = FW_NORMAL; + GuiData->FullScreen = FALSE; + GuiData->QuickEdit = FALSE; + GuiData->InsertMode = TRUE; + GuiData->ScreenText = RGB(192, 192, 192); + GuiData->ScreenBackground = RGB(0, 0, 0); + GuiData->PopupText = RGB(128, 0, 128); + GuiData->PopupBackground = RGB(255, 255, 255); + GuiData->WindowPosition = UINT_MAX; + GuiData->UseRasterFonts = TRUE; + memcpy(GuiData->Colors, s_Colors, sizeof(s_Colors)); - Console->Size.X = 80; - Console->Size.Y = 25; + Console->HistoryBufferSize = 50; + Console->NumberOfHistoryBuffers = 5; + Console->HistoryNoDup = FALSE; + Console->Size.X = 80; + Console->Size.Y = 25; - if (Buffer) + if (Buffer) { - Buffer->MaxX = 80; - Buffer->MaxY = 300; - Buffer->CursorInfo.bVisible = TRUE; - Buffer->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE; + Buffer->MaxX = 80; + Buffer->MaxY = 300; + Buffer->CursorInfo.bVisible = TRUE; + Buffer->CursorInfo.dwSize = CSR_DEFAULT_CURSOR_SIZE; } } @@ -633,157 +633,157 @@ VOID FASTCALL GuiConsoleInitScrollbar(PCSRSS_CONSOLE Console, HWND hwnd) { - SCROLLINFO sInfo; - PGUI_CONSOLE_DATA GuiData = Console->PrivateData; + SCROLLINFO sInfo; + PGUI_CONSOLE_DATA GuiData = Console->PrivateData; - DWORD Width = Console->Size.X * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); - DWORD Height = Console->Size.Y * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); + DWORD Width = Console->Size.X * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); + DWORD Height = Console->Size.Y * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); - /* set scrollbar sizes */ - sInfo.cbSize = sizeof(SCROLLINFO); - sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; - sInfo.nMin = 0; - if (Console->ActiveBuffer->MaxY > Console->Size.Y) - { - sInfo.nMax = Console->ActiveBuffer->MaxY - 1; - sInfo.nPage = Console->Size.Y; - sInfo.nPos = Console->ActiveBuffer->ShowY; - SetScrollInfo(hwnd, SB_VERT, &sInfo, TRUE); - Width += GetSystemMetrics(SM_CXVSCROLL); - ShowScrollBar(hwnd, SB_VERT, TRUE); - } - else - { - ShowScrollBar(hwnd, SB_VERT, FALSE); - } + /* set scrollbar sizes */ + sInfo.cbSize = sizeof(SCROLLINFO); + sInfo.fMask = SIF_RANGE | SIF_PAGE | SIF_POS; + sInfo.nMin = 0; + if (Console->ActiveBuffer->MaxY > Console->Size.Y) + { + sInfo.nMax = Console->ActiveBuffer->MaxY - 1; + sInfo.nPage = Console->Size.Y; + sInfo.nPos = Console->ActiveBuffer->ShowY; + SetScrollInfo(hwnd, SB_VERT, &sInfo, TRUE); + Width += GetSystemMetrics(SM_CXVSCROLL); + ShowScrollBar(hwnd, SB_VERT, TRUE); + } + else + { + ShowScrollBar(hwnd, SB_VERT, FALSE); + } - if (Console->ActiveBuffer->MaxX > Console->Size.X) - { - sInfo.nMax = Console->ActiveBuffer->MaxX - 1; - sInfo.nPage = Console->Size.X; - sInfo.nPos = Console->ActiveBuffer->ShowX; - SetScrollInfo(hwnd, SB_HORZ, &sInfo, TRUE); - Height += GetSystemMetrics(SM_CYHSCROLL); - ShowScrollBar(hwnd, SB_HORZ, TRUE); + if (Console->ActiveBuffer->MaxX > Console->Size.X) + { + sInfo.nMax = Console->ActiveBuffer->MaxX - 1; + sInfo.nPage = Console->Size.X; + sInfo.nPos = Console->ActiveBuffer->ShowX; + SetScrollInfo(hwnd, SB_HORZ, &sInfo, TRUE); + Height += GetSystemMetrics(SM_CYHSCROLL); + ShowScrollBar(hwnd, SB_HORZ, TRUE); - } - else - { - ShowScrollBar(hwnd, SB_HORZ, FALSE); - } + } + else + { + ShowScrollBar(hwnd, SB_HORZ, FALSE); + } - SetWindowPos(hwnd, NULL, 0, 0, Width, Height, - SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); + SetWindowPos(hwnd, NULL, 0, 0, Width, Height, + SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); } static BOOL GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create) { - PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Create->lpCreateParams; - PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Console->PrivateData; - HDC Dc; - HFONT OldFont; - TEXTMETRICW Metrics; - SIZE CharSize; - PCSRSS_PROCESS_DATA ProcessData; - HKEY hKey; + PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Create->lpCreateParams; + PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA)Console->PrivateData; + HDC Dc; + HFONT OldFont; + TEXTMETRICW Metrics; + SIZE CharSize; + PCSRSS_PROCESS_DATA ProcessData; + HKEY hKey; - Console->hWindow = hWnd; + Console->hWindow = hWnd; - if (NULL == GuiData) + if (NULL == GuiData) { - DPRINT1("GuiConsoleNcCreate: HeapAlloc failed\n"); - return FALSE; + DPRINT1("GuiConsoleNcCreate: HeapAlloc failed\n"); + return FALSE; } - GuiConsoleUseDefaults(Console, GuiData, Console->ActiveBuffer); - if (Console->ProcessList.Flink != &Console->ProcessList) + GuiConsoleUseDefaults(Console, GuiData, Console->ActiveBuffer); + if (Console->ProcessList.Flink != &Console->ProcessList) { - ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry); - if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ, FALSE)) + ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSRSS_PROCESS_DATA, ProcessEntry); + if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ProcessId), &hKey, KEY_READ, FALSE)) { - GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer); - RegCloseKey(hKey); + GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer); + RegCloseKey(hKey); } } - InitializeCriticalSection(&GuiData->Lock); + InitializeCriticalSection(&GuiData->Lock); - GuiData->Font = CreateFontW(LOWORD(GuiData->FontSize), - 0, //HIWORD(GuiData->FontSize), - 0, - TA_BASELINE, - GuiData->FontWeight, - FALSE, - FALSE, - FALSE, - OEM_CHARSET, - OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - NONANTIALIASED_QUALITY, FIXED_PITCH | FF_DONTCARE, - GuiData->FontName); - if (NULL == GuiData->Font) + GuiData->Font = CreateFontW(LOWORD(GuiData->FontSize), + 0, //HIWORD(GuiData->FontSize), + 0, + TA_BASELINE, + GuiData->FontWeight, + FALSE, + FALSE, + FALSE, + OEM_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + NONANTIALIASED_QUALITY, FIXED_PITCH | FF_DONTCARE, + GuiData->FontName); + if (NULL == GuiData->Font) { - DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); - DeleteCriticalSection(&GuiData->Lock); - HeapFree(Win32CsrApiHeap, 0, GuiData); - return FALSE; + DPRINT1("GuiConsoleNcCreate: CreateFont failed\n"); + DeleteCriticalSection(&GuiData->Lock); + HeapFree(Win32CsrApiHeap, 0, GuiData); + return FALSE; } - Dc = GetDC(hWnd); - if (NULL == Dc) + Dc = GetDC(hWnd); + if (NULL == Dc) { - DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); - DeleteObject(GuiData->Font); - DeleteCriticalSection(&GuiData->Lock); - HeapFree(Win32CsrApiHeap, 0, GuiData); - return FALSE; + DPRINT1("GuiConsoleNcCreate: GetDC failed\n"); + DeleteObject(GuiData->Font); + DeleteCriticalSection(&GuiData->Lock); + HeapFree(Win32CsrApiHeap, 0, GuiData); + return FALSE; } - OldFont = SelectObject(Dc, GuiData->Font); - if (NULL == OldFont) + OldFont = SelectObject(Dc, GuiData->Font); + if (NULL == OldFont) { - DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); - ReleaseDC(hWnd, Dc); - DeleteObject(GuiData->Font); - DeleteCriticalSection(&GuiData->Lock); - HeapFree(Win32CsrApiHeap, 0, GuiData); - return FALSE; + DPRINT1("GuiConsoleNcCreate: SelectObject failed\n"); + ReleaseDC(hWnd, Dc); + DeleteObject(GuiData->Font); + DeleteCriticalSection(&GuiData->Lock); + HeapFree(Win32CsrApiHeap, 0, GuiData); + return FALSE; } - if (! GetTextMetricsW(Dc, &Metrics)) + if (! GetTextMetricsW(Dc, &Metrics)) { - DPRINT1("GuiConsoleNcCreate: GetTextMetrics failed\n"); - SelectObject(Dc, OldFont); - ReleaseDC(hWnd, Dc); - DeleteObject(GuiData->Font); - DeleteCriticalSection(&GuiData->Lock); - HeapFree(Win32CsrApiHeap, 0, GuiData); - return FALSE; + DPRINT1("GuiConsoleNcCreate: GetTextMetrics failed\n"); + SelectObject(Dc, OldFont); + ReleaseDC(hWnd, Dc); + DeleteObject(GuiData->Font); + DeleteCriticalSection(&GuiData->Lock); + HeapFree(Win32CsrApiHeap, 0, GuiData); + return FALSE; } - GuiData->CharWidth = Metrics.tmMaxCharWidth; - GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; + GuiData->CharWidth = Metrics.tmMaxCharWidth; + GuiData->CharHeight = Metrics.tmHeight + Metrics.tmExternalLeading; - /* Measure real char width more precisely if possible. */ - if (GetTextExtentPoint32W(Dc, L"R", 1, &CharSize)) - GuiData->CharWidth = CharSize.cx; + /* Measure real char width more precisely if possible. */ + if (GetTextExtentPoint32W(Dc, L"R", 1, &CharSize)) + GuiData->CharWidth = CharSize.cx; - SelectObject(Dc, OldFont); + SelectObject(Dc, OldFont); - ReleaseDC(hWnd, Dc); - GuiData->CursorBlinkOn = TRUE; - GuiData->ForceCursorOff = FALSE; + ReleaseDC(hWnd, Dc); + GuiData->CursorBlinkOn = TRUE; + GuiData->ForceCursorOff = FALSE; - DPRINT("Console %p GuiData %p\n", Console, GuiData); - Console->PrivateData = GuiData; - SetWindowLongPtrW(hWnd, GWL_USERDATA, (DWORD_PTR) Console); + DPRINT("Console %p GuiData %p\n", Console, GuiData); + Console->PrivateData = GuiData; + SetWindowLongPtrW(hWnd, GWL_USERDATA, (DWORD_PTR) Console); - SetTimer(hWnd, CONGUI_UPDATE_TIMER, CONGUI_UPDATE_TIME, NULL); - GuiConsoleCreateSysMenu(Console); + SetTimer(hWnd, CONGUI_UPDATE_TIMER, CONGUI_UPDATE_TIME, NULL); + GuiConsoleCreateSysMenu(Console); - GuiData->WindowSizeLock = TRUE; - GuiConsoleInitScrollbar(Console, hWnd); - GuiData->WindowSizeLock = FALSE; + GuiData->WindowSizeLock = TRUE; + GuiConsoleInitScrollbar(Console, hWnd); + GuiData->WindowSizeLock = FALSE; - SetEvent(GuiData->hGuiInitEvent); + SetEvent(GuiData->hGuiInitEvent); - return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create); + return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create); } static VOID @@ -800,62 +800,62 @@ SmallRectToRect(PCSRSS_CONSOLE Console, PRECT Rect, PSMALL_RECT SmallRect) static VOID GuiConsoleUpdateSelection(PCSRSS_CONSOLE Console, PCOORD coord) { - RECT oldRect, newRect; - HWND hWnd = Console->hWindow; + RECT oldRect, newRect; + HWND hWnd = Console->hWindow; - SmallRectToRect(Console, &oldRect, &Console->Selection.srSelection); + SmallRectToRect(Console, &oldRect, &Console->Selection.srSelection); - if(coord != NULL) - { - SMALL_RECT rc; - /* exchange left/top with right/bottom if required */ - rc.Left = min(Console->Selection.dwSelectionAnchor.X, coord->X); - rc.Top = min(Console->Selection.dwSelectionAnchor.Y, coord->Y); - rc.Right = max(Console->Selection.dwSelectionAnchor.X, coord->X); - rc.Bottom = max(Console->Selection.dwSelectionAnchor.Y, coord->Y); - - SmallRectToRect(Console, &newRect, &rc); - - if (Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY) + if(coord != NULL) { - if (memcmp(&rc, &Console->Selection.srSelection, sizeof(SMALL_RECT)) != 0) - { - HRGN rgn1, rgn2; + SMALL_RECT rc; + /* exchange left/top with right/bottom if required */ + rc.Left = min(Console->Selection.dwSelectionAnchor.X, coord->X); + rc.Top = min(Console->Selection.dwSelectionAnchor.Y, coord->Y); + rc.Right = max(Console->Selection.dwSelectionAnchor.X, coord->X); + rc.Bottom = max(Console->Selection.dwSelectionAnchor.Y, coord->Y); - /* calculate the region that needs to be updated */ - if((rgn1 = CreateRectRgnIndirect(&oldRect))) + SmallRectToRect(Console, &newRect, &rc); + + if (Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY) { - if((rgn2 = CreateRectRgnIndirect(&newRect))) - { - if(CombineRgn(rgn1, rgn2, rgn1, RGN_XOR) != ERROR) + if (memcmp(&rc, &Console->Selection.srSelection, sizeof(SMALL_RECT)) != 0) { - InvalidateRgn(hWnd, rgn1, FALSE); - } + HRGN rgn1, rgn2; - DeleteObject(rgn2); - } - DeleteObject(rgn1); + /* calculate the region that needs to be updated */ + if((rgn1 = CreateRectRgnIndirect(&oldRect))) + { + if((rgn2 = CreateRectRgnIndirect(&newRect))) + { + if(CombineRgn(rgn1, rgn2, rgn1, RGN_XOR) != ERROR) + { + InvalidateRgn(hWnd, rgn1, FALSE); + } + + DeleteObject(rgn2); + } + DeleteObject(rgn1); + } + } } - } + else + { + InvalidateRect(hWnd, &newRect, FALSE); + } + Console->Selection.dwFlags |= CONSOLE_SELECTION_NOT_EMPTY; + Console->Selection.srSelection = rc; + ConioPause(Console, PAUSED_FROM_SELECTION); } else { - InvalidateRect(hWnd, &newRect, FALSE); + /* clear the selection */ + if (Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY) + { + InvalidateRect(hWnd, &oldRect, FALSE); + } + Console->Selection.dwFlags = CONSOLE_NO_SELECTION; + ConioUnpause(Console, PAUSED_FROM_SELECTION); } - Console->Selection.dwFlags |= CONSOLE_SELECTION_NOT_EMPTY; - Console->Selection.srSelection = rc; - ConioPause(Console, PAUSED_FROM_SELECTION); - } - else - { - /* clear the selection */ - if (Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY) - { - InvalidateRect(hWnd, &oldRect, FALSE); - } - Console->Selection.dwFlags = CONSOLE_NO_SELECTION; - ConioUnpause(Console, PAUSED_FROM_SELECTION); - } } @@ -939,18 +939,14 @@ GuiConsolePaint(PCSRSS_CONSOLE Console, } if (Buff->CursorInfo.bVisible && GuiData->CursorBlinkOn && - !GuiData->ForceCursorOff) + !GuiData->ForceCursorOff) { CursorX = Buff->CurrentX; CursorY = Buff->CurrentY; if (LeftChar <= CursorX && CursorX <= RightChar && - TopLine <= CursorY && CursorY <= BottomLine) + TopLine <= CursorY && CursorY <= BottomLine) { - CursorHeight = (GuiData->CharHeight * Buff->CursorInfo.dwSize) / 100; - if (CursorHeight < 1) - { - CursorHeight = 1; - } + CursorHeight = ConioEffectiveCursorSize(Console, GuiData->CharHeight); From = ConioCoordToPointer(Buff, Buff->CurrentX, Buff->CurrentY) + 1; if (*From != DEFAULT_ATTRIB) @@ -992,14 +988,14 @@ GuiConsoleHandlePaint(HWND hWnd, HDC hDCPaint) hDC = BeginPaint(hWnd, &ps); if (hDC != NULL && - ps.rcPaint.left < ps.rcPaint.right && - ps.rcPaint.top < ps.rcPaint.bottom) + ps.rcPaint.left < ps.rcPaint.right && + ps.rcPaint.top < ps.rcPaint.bottom) { GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); if (Console != NULL && GuiData != NULL && - Console->ActiveBuffer != NULL) + Console->ActiveBuffer != NULL) { if (Console->ActiveBuffer->Buffer != NULL) { @@ -1040,23 +1036,23 @@ GuiConsoleHandlePaint(HWND hWnd, HDC hDCPaint) static VOID GuiConsoleHandleKey(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - MSG Message; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + MSG Message; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - Message.hwnd = hWnd; - Message.message = msg; - Message.wParam = wParam; - Message.lParam = lParam; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + Message.hwnd = hWnd; + Message.message = msg; + Message.wParam = wParam; + Message.lParam = lParam; - if(msg == WM_CHAR || msg == WM_SYSKEYDOWN) - { - /* clear the selection */ - GuiConsoleUpdateSelection(Console, NULL); - } + if(msg == WM_CHAR || msg == WM_SYSKEYDOWN) + { + /* clear the selection */ + GuiConsoleUpdateSelection(Console, NULL); + } - ConioProcessKey(&Message, Console, FALSE); + ConioProcessKey(&Message, Console, FALSE); } static VOID WINAPI @@ -1078,48 +1074,48 @@ static VOID WINAPI GuiWriteStream(PCSRSS_CONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY, UINT ScrolledLines, CHAR *Buffer, UINT Length) { - PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA) Console->PrivateData; - PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; - LONG CursorEndX, CursorEndY; - RECT ScrollRect; + PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA) Console->PrivateData; + PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; + LONG CursorEndX, CursorEndY; + RECT ScrollRect; - if (NULL == Console->hWindow || NULL == GuiData) + if (NULL == Console->hWindow || NULL == GuiData) { - return; + return; } - if (0 != ScrolledLines) + if (0 != ScrolledLines) { - ScrollRect.left = 0; - ScrollRect.top = 0; - ScrollRect.right = Console->Size.X * GuiData->CharWidth; - ScrollRect.bottom = Region->Top * GuiData->CharHeight; + ScrollRect.left = 0; + ScrollRect.top = 0; + ScrollRect.right = Console->Size.X * GuiData->CharWidth; + ScrollRect.bottom = Region->Top * GuiData->CharHeight; - ScrollWindowEx(Console->hWindow, - 0, - -(ScrolledLines * GuiData->CharHeight), - &ScrollRect, - NULL, - NULL, - NULL, - SW_INVALIDATE); + ScrollWindowEx(Console->hWindow, + 0, + -(ScrolledLines * GuiData->CharHeight), + &ScrollRect, + NULL, + NULL, + NULL, + SW_INVALIDATE); } - GuiDrawRegion(Console, Region); + GuiDrawRegion(Console, Region); - if (CursorStartX < Region->Left || Region->Right < CursorStartX - || CursorStartY < Region->Top || Region->Bottom < CursorStartY) + if (CursorStartX < Region->Left || Region->Right < CursorStartX + || CursorStartY < Region->Top || Region->Bottom < CursorStartY) { - GuiInvalidateCell(Console, CursorStartX, CursorStartY); + GuiInvalidateCell(Console, CursorStartX, CursorStartY); } - CursorEndX = Buff->CurrentX; - CursorEndY = Buff->CurrentY; - if ((CursorEndX < Region->Left || Region->Right < CursorEndX - || CursorEndY < Region->Top || Region->Bottom < CursorEndY) - && (CursorEndX != CursorStartX || CursorEndY != CursorStartY)) + CursorEndX = Buff->CurrentX; + CursorEndY = Buff->CurrentY; + if ((CursorEndX < Region->Left || Region->Right < CursorEndX + || CursorEndY < Region->Top || Region->Bottom < CursorEndY) + && (CursorEndX != CursorStartX || CursorEndY != CursorStartY)) { - GuiInvalidateCell(Console, CursorEndX, CursorEndY); + GuiInvalidateCell(Console, CursorEndX, CursorEndY); } // Set up the update timer (very short interval) - this is a "hack" for getting the OS to @@ -1131,26 +1127,26 @@ GuiWriteStream(PCSRSS_CONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LO static BOOL WINAPI GuiSetCursorInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff) { - if (Console->ActiveBuffer == Buff) + if (Console->ActiveBuffer == Buff) { - GuiInvalidateCell(Console, Buff->CurrentX, Buff->CurrentY); + GuiInvalidateCell(Console, Buff->CurrentX, Buff->CurrentY); } - return TRUE; + return TRUE; } static BOOL WINAPI GuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY) { - if (Console->ActiveBuffer == Buff) + if (Console->ActiveBuffer == Buff) { - /* Redraw char at old position (removes cursor) */ - GuiInvalidateCell(Console, OldCursorX, OldCursorY); - /* Redraw char at new position (shows cursor) */ - GuiInvalidateCell(Console, Buff->CurrentX, Buff->CurrentY); + /* Redraw char at old position (removes cursor) */ + GuiInvalidateCell(Console, OldCursorX, OldCursorY); + /* Redraw char at new position (shows cursor) */ + GuiInvalidateCell(Console, Buff->CurrentX, Buff->CurrentY); } - return TRUE; + return TRUE; } static BOOL WINAPI @@ -1170,135 +1166,135 @@ GuiUpdateScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff) static VOID GuiConsoleHandleTimer(HWND hWnd) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - PCSRSS_SCREEN_BUFFER Buff; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + PCSRSS_SCREEN_BUFFER Buff; - SetTimer(hWnd, CONGUI_UPDATE_TIMER, CURSOR_BLINK_TIME, NULL); + SetTimer(hWnd, CONGUI_UPDATE_TIMER, CURSOR_BLINK_TIME, NULL); - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - Buff = Console->ActiveBuffer; - GuiInvalidateCell(Console, Buff->CurrentX, Buff->CurrentY); - GuiData->CursorBlinkOn = ! GuiData->CursorBlinkOn; + Buff = Console->ActiveBuffer; + GuiInvalidateCell(Console, Buff->CurrentX, Buff->CurrentY); + GuiData->CursorBlinkOn = ! GuiData->CursorBlinkOn; - if((GuiData->OldCursor.x != Buff->CurrentX) || (GuiData->OldCursor.y != Buff->CurrentY)) - { - SCROLLINFO xScroll; - int OldScrollX = -1, OldScrollY = -1; - int NewScrollX = -1, NewScrollY = -1; + if((GuiData->OldCursor.x != Buff->CurrentX) || (GuiData->OldCursor.y != Buff->CurrentY)) + { + SCROLLINFO xScroll; + int OldScrollX = -1, OldScrollY = -1; + int NewScrollX = -1, NewScrollY = -1; - xScroll.cbSize = sizeof(SCROLLINFO); - xScroll.fMask = SIF_POS; - // Capture the original position of the scroll bars and save them. - if(GetScrollInfo(hWnd, SB_HORZ, &xScroll))OldScrollX = xScroll.nPos; - if(GetScrollInfo(hWnd, SB_VERT, &xScroll))OldScrollY = xScroll.nPos; + xScroll.cbSize = sizeof(SCROLLINFO); + xScroll.fMask = SIF_POS; + // Capture the original position of the scroll bars and save them. + if(GetScrollInfo(hWnd, SB_HORZ, &xScroll))OldScrollX = xScroll.nPos; + if(GetScrollInfo(hWnd, SB_VERT, &xScroll))OldScrollY = xScroll.nPos; - // If we successfully got the info for the horizontal scrollbar - if(OldScrollX >= 0) - { - if((Buff->CurrentX < Buff->ShowX)||(Buff->CurrentX >= (Buff->ShowX + Console->Size.X))) - { - // Handle the horizontal scroll bar - if(Buff->CurrentX >= Console->Size.X) NewScrollX = Buff->CurrentX - Console->Size.X + 1; - else NewScrollX = 0; - } - else - { - NewScrollX = OldScrollX; - } - } - // If we successfully got the info for the vertical scrollbar - if(OldScrollY >= 0) - { - if((Buff->CurrentY < Buff->ShowY) || (Buff->CurrentY >= (Buff->ShowY + Console->Size.Y))) + // If we successfully got the info for the horizontal scrollbar + if(OldScrollX >= 0) { - // Handle the vertical scroll bar - if(Buff->CurrentY >= Console->Size.Y) NewScrollY = Buff->CurrentY - Console->Size.Y + 1; - else NewScrollY = 0; + if((Buff->CurrentX < Buff->ShowX)||(Buff->CurrentX >= (Buff->ShowX + Console->Size.X))) + { + // Handle the horizontal scroll bar + if(Buff->CurrentX >= Console->Size.X) NewScrollX = Buff->CurrentX - Console->Size.X + 1; + else NewScrollX = 0; + } + else + { + NewScrollX = OldScrollX; + } } - else + // If we successfully got the info for the vertical scrollbar + if(OldScrollY >= 0) { - NewScrollY = OldScrollY; + if((Buff->CurrentY < Buff->ShowY) || (Buff->CurrentY >= (Buff->ShowY + Console->Size.Y))) + { + // Handle the vertical scroll bar + if(Buff->CurrentY >= Console->Size.Y) NewScrollY = Buff->CurrentY - Console->Size.Y + 1; + else NewScrollY = 0; + } + else + { + NewScrollY = OldScrollY; + } } - } - // Adjust scroll bars and refresh the window if the cursor has moved outside the visible area - // NOTE: OldScroll# and NewScroll# will both be -1 (initial value) if the info for the respective scrollbar - // was not obtained successfully in the previous steps. This means their difference is 0 (no scrolling) - // and their associated scrollbar is left alone. - if((OldScrollX != NewScrollX) || (OldScrollY != NewScrollY)) - { - Buff->ShowX = NewScrollX; - Buff->ShowY = NewScrollY; - ScrollWindowEx(hWnd, - (OldScrollX - NewScrollX) * GuiData->CharWidth, - (OldScrollY - NewScrollY) * GuiData->CharHeight, - NULL, - NULL, - NULL, - NULL, - SW_INVALIDATE); - if(NewScrollX >= 0) + // Adjust scroll bars and refresh the window if the cursor has moved outside the visible area + // NOTE: OldScroll# and NewScroll# will both be -1 (initial value) if the info for the respective scrollbar + // was not obtained successfully in the previous steps. This means their difference is 0 (no scrolling) + // and their associated scrollbar is left alone. + if((OldScrollX != NewScrollX) || (OldScrollY != NewScrollY)) { - xScroll.nPos = NewScrollX; - SetScrollInfo(hWnd, SB_HORZ, &xScroll, TRUE); + Buff->ShowX = NewScrollX; + Buff->ShowY = NewScrollY; + ScrollWindowEx(hWnd, + (OldScrollX - NewScrollX) * GuiData->CharWidth, + (OldScrollY - NewScrollY) * GuiData->CharHeight, + NULL, + NULL, + NULL, + NULL, + SW_INVALIDATE); + if(NewScrollX >= 0) + { + xScroll.nPos = NewScrollX; + SetScrollInfo(hWnd, SB_HORZ, &xScroll, TRUE); + } + if(NewScrollY >= 0) + { + xScroll.nPos = NewScrollY; + SetScrollInfo(hWnd, SB_VERT, &xScroll, TRUE); + } + UpdateWindow(hWnd); + GuiData->OldCursor.x = Buff->CurrentX; + GuiData->OldCursor.y = Buff->CurrentY; } - if(NewScrollY >= 0) - { - xScroll.nPos = NewScrollY; - SetScrollInfo(hWnd, SB_VERT, &xScroll, TRUE); - } - UpdateWindow(hWnd); - GuiData->OldCursor.x = Buff->CurrentX; - GuiData->OldCursor.y = Buff->CurrentY; - } - } + } } static VOID GuiConsoleHandleClose(HWND hWnd) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - PLIST_ENTRY current_entry; - PCSRSS_PROCESS_DATA current; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + PLIST_ENTRY current_entry; + PCSRSS_PROCESS_DATA current; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - EnterCriticalSection(&Console->Lock); + EnterCriticalSection(&Console->Lock); - current_entry = Console->ProcessList.Flink; - while (current_entry != &Console->ProcessList) + current_entry = Console->ProcessList.Flink; + while (current_entry != &Console->ProcessList) { - current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); - current_entry = current_entry->Flink; + current = CONTAINING_RECORD(current_entry, CSRSS_PROCESS_DATA, ProcessEntry); + current_entry = current_entry->Flink; - /* FIXME: Windows will wait up to 5 seconds for the thread to exit. - * We shouldn't wait here, though, since the console lock is entered. - * A copy of the thread list probably needs to be made. */ - ConioConsoleCtrlEvent(CTRL_CLOSE_EVENT, current); + /* FIXME: Windows will wait up to 5 seconds for the thread to exit. + * We shouldn't wait here, though, since the console lock is entered. + * A copy of the thread list probably needs to be made. */ + ConioConsoleCtrlEvent(CTRL_CLOSE_EVENT, current); } - LeaveCriticalSection(&Console->Lock); + LeaveCriticalSection(&Console->Lock); } static VOID GuiConsoleHandleNcDestroy(HWND hWnd) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - KillTimer(hWnd, 1); - Console->PrivateData = NULL; - DeleteCriticalSection(&GuiData->Lock); - GetSystemMenu(hWnd, TRUE); - if (GuiData->ConsoleLibrary) - FreeLibrary(GuiData->ConsoleLibrary); + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + KillTimer(hWnd, 1); + Console->PrivateData = NULL; + DeleteCriticalSection(&GuiData->Lock); + GetSystemMenu(hWnd, TRUE); + if (GuiData->ConsoleLibrary) + FreeLibrary(GuiData->ConsoleLibrary); - HeapFree(Win32CsrApiHeap, 0, GuiData); + HeapFree(Win32CsrApiHeap, 0, GuiData); } static COORD @@ -1321,78 +1317,78 @@ PointToCoord(PCSRSS_CONSOLE Console, LPARAM lParam) static VOID GuiConsoleLeftMouseDown(HWND hWnd, LPARAM lParam) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if (Console == NULL || GuiData == NULL) return; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if (Console == NULL || GuiData == NULL) return; - Console->Selection.dwSelectionAnchor = PointToCoord(Console, lParam); + Console->Selection.dwSelectionAnchor = PointToCoord(Console, lParam); - SetCapture(hWnd); + SetCapture(hWnd); - Console->Selection.dwFlags |= CONSOLE_SELECTION_IN_PROGRESS | CONSOLE_MOUSE_SELECTION | CONSOLE_MOUSE_DOWN; + Console->Selection.dwFlags |= CONSOLE_SELECTION_IN_PROGRESS | CONSOLE_MOUSE_SELECTION | CONSOLE_MOUSE_DOWN; - GuiConsoleUpdateSelection(Console, &Console->Selection.dwSelectionAnchor); + GuiConsoleUpdateSelection(Console, &Console->Selection.dwSelectionAnchor); } static VOID GuiConsoleLeftMouseUp(HWND hWnd, LPARAM lParam) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - COORD c; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + COORD c; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if (Console == NULL || GuiData == NULL) return; - if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) return; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if (Console == NULL || GuiData == NULL) return; + if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) return; - c = PointToCoord(Console, lParam); + c = PointToCoord(Console, lParam); - Console->Selection.dwFlags &= ~CONSOLE_MOUSE_DOWN; + Console->Selection.dwFlags &= ~CONSOLE_MOUSE_DOWN; - GuiConsoleUpdateSelection(Console, &c); + GuiConsoleUpdateSelection(Console, &c); - ReleaseCapture(); + ReleaseCapture(); } static VOID GuiConsoleMouseMove(HWND hWnd, WPARAM wParam, LPARAM lParam) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - COORD c; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + COORD c; - if (!(wParam & MK_LBUTTON)) return; + if (!(wParam & MK_LBUTTON)) return; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if (Console == NULL || GuiData == NULL) return; - if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) return; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if (Console == NULL || GuiData == NULL) return; + if (!(Console->Selection.dwFlags & CONSOLE_MOUSE_DOWN)) return; - c = PointToCoord(Console, lParam); /* TODO: Scroll buffer to bring c into view */ + c = PointToCoord(Console, lParam); /* TODO: Scroll buffer to bring c into view */ - GuiConsoleUpdateSelection(Console, &c); + GuiConsoleUpdateSelection(Console, &c); } static VOID GuiConsoleRightMouseDown(HWND hWnd) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if (Console == NULL || GuiData == NULL) return; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if (Console == NULL || GuiData == NULL) return; - if (!(Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY)) - { - /* FIXME - paste text from clipboard */ - } - else - { - /* FIXME - copy selection to clipboard */ + if (!(Console->Selection.dwFlags & CONSOLE_SELECTION_NOT_EMPTY)) + { + /* FIXME - paste text from clipboard */ + } + else + { + /* FIXME - copy selection to clipboard */ - GuiConsoleUpdateSelection(Console, NULL); - } + GuiConsoleUpdateSelection(Console, NULL); + } } @@ -1400,74 +1396,74 @@ GuiConsoleRightMouseDown(HWND hWnd) static VOID GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiData) { - PCSRSS_CONSOLE Console; - APPLET_PROC CPLFunc; - TCHAR szBuffer[MAX_PATH]; - ConsoleInfo SharedInfo; + PCSRSS_CONSOLE Console; + APPLET_PROC CPLFunc; + TCHAR szBuffer[MAX_PATH]; + ConsoleInfo SharedInfo; - DPRINT("GuiConsoleShowConsoleProperties entered\n"); + DPRINT("GuiConsoleShowConsoleProperties entered\n"); - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if (GuiData == NULL) + if (GuiData == NULL) { - DPRINT("GuiConsoleGetDataPointers failed\n"); - return; + DPRINT("GuiConsoleGetDataPointers failed\n"); + return; } - if (GuiData->ConsoleLibrary == NULL) + if (GuiData->ConsoleLibrary == NULL) { - GetWindowsDirectory(szBuffer,MAX_PATH); - _tcscat(szBuffer, _T("\\system32\\console.dll")); - GuiData->ConsoleLibrary = LoadLibrary(szBuffer); + GetWindowsDirectory(szBuffer,MAX_PATH); + _tcscat(szBuffer, _T("\\system32\\console.dll")); + GuiData->ConsoleLibrary = LoadLibrary(szBuffer); - if (GuiData->ConsoleLibrary == NULL) + if (GuiData->ConsoleLibrary == NULL) { - DPRINT1("failed to load console.dll"); - return; + DPRINT1("failed to load console.dll"); + return; } } - CPLFunc = (APPLET_PROC) GetProcAddress(GuiData->ConsoleLibrary, _T("CPlApplet")); - if (!CPLFunc) + CPLFunc = (APPLET_PROC) GetProcAddress(GuiData->ConsoleLibrary, _T("CPlApplet")); + if (!CPLFunc) { - DPRINT("Error: Console.dll misses CPlApplet export\n"); - return; + DPRINT("Error: Console.dll misses CPlApplet export\n"); + return; } - /* setup struct */ - SharedInfo.InsertMode = GuiData->InsertMode; - SharedInfo.HistoryBufferSize = GuiData->HistoryBufferSize; - SharedInfo.NumberOfHistoryBuffers = GuiData->NumberOfHistoryBuffers; - SharedInfo.ScreenText = GuiData->ScreenText; - SharedInfo.ScreenBackground = GuiData->ScreenBackground; - SharedInfo.PopupText = GuiData->PopupText; - SharedInfo.PopupBackground = GuiData->PopupBackground; - SharedInfo.WindowSize = (DWORD)MAKELONG(Console->Size.X, Console->Size.Y); - SharedInfo.WindowPosition = GuiData->WindowPosition; - SharedInfo.ScreenBuffer = (DWORD)MAKELONG(Console->ActiveBuffer->MaxX, Console->ActiveBuffer->MaxY); - SharedInfo.UseRasterFonts = GuiData->UseRasterFonts; - SharedInfo.FontSize = (DWORD)GuiData->FontSize; - SharedInfo.FontWeight = GuiData->FontWeight; - SharedInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize; - SharedInfo.HistoryNoDup = GuiData->HistoryNoDup; - SharedInfo.FullScreen = GuiData->FullScreen; - SharedInfo.QuickEdit = GuiData->QuickEdit; - memcpy(&SharedInfo.Colors[0], GuiData->Colors, sizeof(s_Colors)); + /* setup struct */ + SharedInfo.InsertMode = GuiData->InsertMode; + SharedInfo.HistoryBufferSize = Console->HistoryBufferSize; + SharedInfo.NumberOfHistoryBuffers = Console->NumberOfHistoryBuffers; + SharedInfo.ScreenText = GuiData->ScreenText; + SharedInfo.ScreenBackground = GuiData->ScreenBackground; + SharedInfo.PopupText = GuiData->PopupText; + SharedInfo.PopupBackground = GuiData->PopupBackground; + SharedInfo.WindowSize = (DWORD)MAKELONG(Console->Size.X, Console->Size.Y); + SharedInfo.WindowPosition = GuiData->WindowPosition; + SharedInfo.ScreenBuffer = (DWORD)MAKELONG(Console->ActiveBuffer->MaxX, Console->ActiveBuffer->MaxY); + SharedInfo.UseRasterFonts = GuiData->UseRasterFonts; + SharedInfo.FontSize = (DWORD)GuiData->FontSize; + SharedInfo.FontWeight = GuiData->FontWeight; + SharedInfo.CursorSize = Console->ActiveBuffer->CursorInfo.dwSize; + SharedInfo.HistoryNoDup = Console->HistoryNoDup; + SharedInfo.FullScreen = GuiData->FullScreen; + SharedInfo.QuickEdit = GuiData->QuickEdit; + memcpy(&SharedInfo.Colors[0], GuiData->Colors, sizeof(s_Colors)); - if (!CPLFunc(hWnd, CPL_INIT, 0, 0)) + if (!CPLFunc(hWnd, CPL_INIT, 0, 0)) { - DPRINT("Error: failed to initialize console.dll\n"); - return; + DPRINT("Error: failed to initialize console.dll\n"); + return; } - if (CPLFunc(hWnd, CPL_GETCOUNT, 0, 0) != 1) + if (CPLFunc(hWnd, CPL_GETCOUNT, 0, 0) != 1) { - DPRINT("Error: console.dll returned unexpected CPL count\n"); - return; + DPRINT("Error: console.dll returned unexpected CPL count\n"); + return; } - CPLFunc(hWnd, CPL_DBLCLK, (LPARAM)&SharedInfo, Defaults); + CPLFunc(hWnd, CPL_DBLCLK, (LPARAM)&SharedInfo, Defaults); } static LRESULT GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam, PGUI_CONSOLE_DATA GuiData) @@ -1476,25 +1472,25 @@ GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam, PGUI_CON switch(wParam) { - case ID_SYSTEM_EDIT_MARK: - case ID_SYSTEM_EDIT_COPY: - case ID_SYSTEM_EDIT_PASTE: - case ID_SYSTEM_EDIT_SELECTALL: - case ID_SYSTEM_EDIT_SCROLL: - case ID_SYSTEM_EDIT_FIND: - break; + case ID_SYSTEM_EDIT_MARK: + case ID_SYSTEM_EDIT_COPY: + case ID_SYSTEM_EDIT_PASTE: + case ID_SYSTEM_EDIT_SELECTALL: + case ID_SYSTEM_EDIT_SCROLL: + case ID_SYSTEM_EDIT_FIND: + break; - case ID_SYSTEM_DEFAULTS: - GuiConsoleShowConsoleProperties(hWnd, TRUE, GuiData); - break; + case ID_SYSTEM_DEFAULTS: + GuiConsoleShowConsoleProperties(hWnd, TRUE, GuiData); + break; - case ID_SYSTEM_PROPERTIES: - GuiConsoleShowConsoleProperties(hWnd, FALSE, GuiData); - break; + case ID_SYSTEM_PROPERTIES: + GuiConsoleShowConsoleProperties(hWnd, FALSE, GuiData); + break; - default: - Ret = DefWindowProcW(hWnd, WM_SYSCOMMAND, wParam, lParam); - break; + default: + Ret = DefWindowProcW(hWnd, WM_SYSCOMMAND, wParam, lParam); + break; } return Ret; } @@ -1502,105 +1498,105 @@ GuiConsoleHandleSysMenuCommand(HWND hWnd, WPARAM wParam, LPARAM lParam, PGUI_CON static VOID GuiConsoleGetMinMaxInfo(HWND hWnd, PMINMAXINFO minMaxInfo) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if((Console == NULL)|| (GuiData == NULL)) return; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if((Console == NULL)|| (GuiData == NULL)) return; - DWORD windx = CONGUI_MIN_WIDTH * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); - DWORD windy = CONGUI_MIN_HEIGHT * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); + DWORD windx = CONGUI_MIN_WIDTH * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); + DWORD windy = CONGUI_MIN_HEIGHT * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); - minMaxInfo->ptMinTrackSize.x = windx; - minMaxInfo->ptMinTrackSize.y = windy; + minMaxInfo->ptMinTrackSize.x = windx; + minMaxInfo->ptMinTrackSize.y = windy; - windx = (Console->ActiveBuffer->MaxX) * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); - windy = (Console->ActiveBuffer->MaxY) * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); + windx = (Console->ActiveBuffer->MaxX) * GuiData->CharWidth + 2 * (GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXEDGE)); + windy = (Console->ActiveBuffer->MaxY) * GuiData->CharHeight + 2 * (GetSystemMetrics(SM_CYFRAME) + GetSystemMetrics(SM_CYEDGE)) + GetSystemMetrics(SM_CYCAPTION); - if(Console->Size.X < Console->ActiveBuffer->MaxX) windy += GetSystemMetrics(SM_CYHSCROLL); // window currently has a horizontal scrollbar - if(Console->Size.Y < Console->ActiveBuffer->MaxY) windx += GetSystemMetrics(SM_CXVSCROLL); // window currently has a vertical scrollbar + if(Console->Size.X < Console->ActiveBuffer->MaxX) windy += GetSystemMetrics(SM_CYHSCROLL); // window currently has a horizontal scrollbar + if(Console->Size.Y < Console->ActiveBuffer->MaxY) windx += GetSystemMetrics(SM_CXVSCROLL); // window currently has a vertical scrollbar - minMaxInfo->ptMaxTrackSize.x = windx; - minMaxInfo->ptMaxTrackSize.y = windy; + minMaxInfo->ptMaxTrackSize.x = windx; + minMaxInfo->ptMaxTrackSize.y = windy; } static VOID GuiConsoleResize(HWND hWnd, WPARAM wParam, LPARAM lParam) { - PCSRSS_CONSOLE Console; - PGUI_CONSOLE_DATA GuiData; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - if((Console == NULL) || (GuiData == NULL)) return; + PCSRSS_CONSOLE Console; + PGUI_CONSOLE_DATA GuiData; + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + if((Console == NULL) || (GuiData == NULL)) return; - if ((GuiData->WindowSizeLock == FALSE) && (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED)) - { - PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; + if ((GuiData->WindowSizeLock == FALSE) && (wParam == SIZE_RESTORED || wParam == SIZE_MAXIMIZED || wParam == SIZE_MINIMIZED)) + { + PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; - GuiData->WindowSizeLock = TRUE; + GuiData->WindowSizeLock = TRUE; - DWORD windx = LOWORD(lParam); - DWORD windy = HIWORD(lParam); + DWORD windx = LOWORD(lParam); + DWORD windy = HIWORD(lParam); - // Compensate for existing scroll bars (because lParam values do not accommodate scroll bar) - if(Console->Size.X < Buff->MaxX) windy += GetSystemMetrics(SM_CYHSCROLL); // window currently has a horizontal scrollbar - if(Console->Size.Y < Buff->MaxY) windx += GetSystemMetrics(SM_CXVSCROLL); // window currently has a vertical scrollbar + // Compensate for existing scroll bars (because lParam values do not accommodate scroll bar) + if(Console->Size.X < Buff->MaxX) windy += GetSystemMetrics(SM_CYHSCROLL); // window currently has a horizontal scrollbar + if(Console->Size.Y < Buff->MaxY) windx += GetSystemMetrics(SM_CXVSCROLL); // window currently has a vertical scrollbar - DWORD charx = windx / GuiData->CharWidth; - DWORD chary = windy / GuiData->CharHeight; + DWORD charx = windx / GuiData->CharWidth; + DWORD chary = windy / GuiData->CharHeight; - // Character alignment (round size up or down) - if((windx % GuiData->CharWidth) >= (GuiData->CharWidth / 2)) ++charx; - if((windy % GuiData->CharHeight) >= (GuiData->CharHeight / 2)) ++chary; + // Character alignment (round size up or down) + if((windx % GuiData->CharWidth) >= (GuiData->CharWidth / 2)) ++charx; + if((windy % GuiData->CharHeight) >= (GuiData->CharHeight / 2)) ++chary; - // Compensate for added scroll bars in new window - if(charx < Buff->MaxX)windy -= GetSystemMetrics(SM_CYHSCROLL); // new window will have a horizontal scroll bar - if(chary < Buff->MaxY)windx -= GetSystemMetrics(SM_CXVSCROLL); // new window will have a vertical scroll bar + // Compensate for added scroll bars in new window + if(charx < Buff->MaxX)windy -= GetSystemMetrics(SM_CYHSCROLL); // new window will have a horizontal scroll bar + if(chary < Buff->MaxY)windx -= GetSystemMetrics(SM_CXVSCROLL); // new window will have a vertical scroll bar - charx = windx / GuiData->CharWidth; - chary = windy / GuiData->CharHeight; + charx = windx / GuiData->CharWidth; + chary = windy / GuiData->CharHeight; - // Character alignment (round size up or down) - if((windx % GuiData->CharWidth) >= (GuiData->CharWidth / 2)) ++charx; - if((windy % GuiData->CharHeight) >= (GuiData->CharHeight / 2)) ++chary; + // Character alignment (round size up or down) + if((windx % GuiData->CharWidth) >= (GuiData->CharWidth / 2)) ++charx; + if((windy % GuiData->CharHeight) >= (GuiData->CharHeight / 2)) ++chary; - // Resize window - if((charx != Console->Size.X) || (chary != Console->Size.Y)) - { - Console->Size.X = (charx <= Buff->MaxX) ? charx : Buff->MaxX; - Console->Size.Y = (chary <= Buff->MaxY) ? chary : Buff->MaxY; - } + // Resize window + if((charx != Console->Size.X) || (chary != Console->Size.Y)) + { + Console->Size.X = (charx <= Buff->MaxX) ? charx : Buff->MaxX; + Console->Size.Y = (chary <= Buff->MaxY) ? chary : Buff->MaxY; + } - GuiConsoleInitScrollbar(Console, hWnd); + GuiConsoleInitScrollbar(Console, hWnd); - // Adjust the start of the visible area if we are attempting to show nonexistent areas - if((Buff->MaxX - Buff->ShowX) < Console->Size.X) Buff->ShowX = Buff->MaxX - Console->Size.X; - if((Buff->MaxY - Buff->ShowY) < Console->Size.Y) Buff->ShowY = Buff->MaxY - Console->Size.Y; - InvalidateRect(hWnd, NULL, TRUE); + // Adjust the start of the visible area if we are attempting to show nonexistent areas + if((Buff->MaxX - Buff->ShowX) < Console->Size.X) Buff->ShowX = Buff->MaxX - Console->Size.X; + if((Buff->MaxY - Buff->ShowY) < Console->Size.Y) Buff->ShowY = Buff->MaxY - Console->Size.Y; + InvalidateRect(hWnd, NULL, TRUE); - GuiData->WindowSizeLock = FALSE; - } + GuiData->WindowSizeLock = FALSE; + } } VOID FASTCALL GuiConsoleHandleScrollbarMenu() { - HMENU hMenu; + HMENU hMenu; - hMenu = CreatePopupMenu(); - if (hMenu == NULL) + hMenu = CreatePopupMenu(); + if (hMenu == NULL) { - DPRINT("CreatePopupMenu failed\n"); - return; + DPRINT("CreatePopupMenu failed\n"); + return; } - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLHERE); - //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLTOP); - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLBOTTOM); - //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_UP); - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_DOWN); - //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLUP); - //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLDOWN); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLHERE); + //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLTOP); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLBOTTOM); + //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_UP); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLPAGE_DOWN); + //InsertItem(hMenu, MFT_SEPARATOR, MIIM_FTYPE, 0, NULL, -1); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLUP); + //InsertItem(hMenu, MIIM_STRING, MIIM_ID | MIIM_FTYPE | MIIM_STRING, 0, NULL, IDS_SCROLLDOWN); } @@ -1700,258 +1696,258 @@ GuiResizeBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer, COORD static VOID GuiApplyUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData, PConsoleInfo pConInfo) { - DWORD windx, windy; - PCSRSS_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer; - COORD BufSize; - BOOL SizeChanged = FALSE; + DWORD windx, windy; + PCSRSS_SCREEN_BUFFER ActiveBuffer = Console->ActiveBuffer; + COORD BufSize; + BOOL SizeChanged = FALSE; - EnterCriticalSection(&Console->Lock); + EnterCriticalSection(&Console->Lock); - /* apply text / background color */ - GuiData->ScreenText = pConInfo->ScreenText; - GuiData->ScreenBackground = pConInfo->ScreenBackground; + /* apply text / background color */ + GuiData->ScreenText = pConInfo->ScreenText; + GuiData->ScreenBackground = pConInfo->ScreenBackground; - /* apply cursor size */ - ActiveBuffer->CursorInfo.dwSize = min(max(pConInfo->CursorSize, 1), 100); + /* apply cursor size */ + ActiveBuffer->CursorInfo.dwSize = min(max(pConInfo->CursorSize, 1), 100); - windx = LOWORD(pConInfo->WindowSize); - windy = HIWORD(pConInfo->WindowSize); + windx = LOWORD(pConInfo->WindowSize); + windy = HIWORD(pConInfo->WindowSize); - if (windx != Console->Size.X || windy != Console->Size.Y) - { - /* resize window */ - Console->Size.X = windx; - Console->Size.Y = windy; - SizeChanged = TRUE; - } + if (windx != Console->Size.X || windy != Console->Size.Y) + { + /* resize window */ + Console->Size.X = windx; + Console->Size.Y = windy; + SizeChanged = TRUE; + } - BufSize.X = LOWORD(pConInfo->ScreenBuffer); - BufSize.Y = HIWORD(pConInfo->ScreenBuffer); - if (BufSize.X != ActiveBuffer->MaxX || BufSize.Y != ActiveBuffer->MaxY) - { - if (NT_SUCCESS(GuiResizeBuffer(Console, ActiveBuffer, BufSize))) - SizeChanged = TRUE; - } + BufSize.X = LOWORD(pConInfo->ScreenBuffer); + BufSize.Y = HIWORD(pConInfo->ScreenBuffer); + if (BufSize.X != ActiveBuffer->MaxX || BufSize.Y != ActiveBuffer->MaxY) + { + if (NT_SUCCESS(GuiResizeBuffer(Console, ActiveBuffer, BufSize))) + SizeChanged = TRUE; + } - if (SizeChanged) - { - GuiData->WindowSizeLock = TRUE; - GuiConsoleInitScrollbar(Console, pConInfo->hConsoleWindow); - GuiData->WindowSizeLock = FALSE; - } + if (SizeChanged) + { + GuiData->WindowSizeLock = TRUE; + GuiConsoleInitScrollbar(Console, pConInfo->hConsoleWindow); + GuiData->WindowSizeLock = FALSE; + } - LeaveCriticalSection(&Console->Lock); - InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE); + LeaveCriticalSection(&Console->Lock); + InvalidateRect(pConInfo->hConsoleWindow, NULL, TRUE); } static LRESULT GuiConsoleHandleScroll(HWND hwnd, UINT uMsg, WPARAM wParam) { - PCSRSS_CONSOLE Console; - PCSRSS_SCREEN_BUFFER Buff; - PGUI_CONSOLE_DATA GuiData; - SCROLLINFO sInfo; - int fnBar; - int old_pos, Maximum; - PUSHORT pShowXY; + PCSRSS_CONSOLE Console; + PCSRSS_SCREEN_BUFFER Buff; + PGUI_CONSOLE_DATA GuiData; + SCROLLINFO sInfo; + int fnBar; + int old_pos, Maximum; + PUSHORT pShowXY; - GuiConsoleGetDataPointers(hwnd, &Console, &GuiData); - if (Console == NULL || GuiData == NULL) - return FALSE; - Buff = Console->ActiveBuffer; + GuiConsoleGetDataPointers(hwnd, &Console, &GuiData); + if (Console == NULL || GuiData == NULL) + return FALSE; + Buff = Console->ActiveBuffer; - if (uMsg == WM_HSCROLL) - { - fnBar = SB_HORZ; - Maximum = Buff->MaxX - Console->Size.X; - pShowXY = &Buff->ShowX; - } - else - { - fnBar = SB_VERT; - Maximum = Buff->MaxY - Console->Size.Y; - pShowXY = &Buff->ShowY; - } + if (uMsg == WM_HSCROLL) + { + fnBar = SB_HORZ; + Maximum = Buff->MaxX - Console->Size.X; + pShowXY = &Buff->ShowX; + } + else + { + fnBar = SB_VERT; + Maximum = Buff->MaxY - Console->Size.Y; + pShowXY = &Buff->ShowY; + } - /* set scrollbar sizes */ - sInfo.cbSize = sizeof(SCROLLINFO); - sInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE | SIF_TRACKPOS; + /* set scrollbar sizes */ + sInfo.cbSize = sizeof(SCROLLINFO); + sInfo.fMask = SIF_RANGE | SIF_POS | SIF_PAGE | SIF_TRACKPOS; - if (!GetScrollInfo(hwnd, fnBar, &sInfo)) - { - return FALSE; - } + if (!GetScrollInfo(hwnd, fnBar, &sInfo)) + { + return FALSE; + } - old_pos = sInfo.nPos; + old_pos = sInfo.nPos; - switch(LOWORD(wParam)) - { - case SB_LINELEFT: - sInfo.nPos -= 1; - break; + switch(LOWORD(wParam)) + { + case SB_LINELEFT: + sInfo.nPos -= 1; + break; - case SB_LINERIGHT: - sInfo.nPos += 1; - break; + case SB_LINERIGHT: + sInfo.nPos += 1; + break; - case SB_PAGELEFT: - sInfo.nPos -= sInfo.nPage; - break; + case SB_PAGELEFT: + sInfo.nPos -= sInfo.nPage; + break; - case SB_PAGERIGHT: - sInfo.nPos += sInfo.nPage; - break; + case SB_PAGERIGHT: + sInfo.nPos += sInfo.nPage; + break; - case SB_THUMBTRACK: - sInfo.nPos = sInfo.nTrackPos; - ConioPause(Console, PAUSED_FROM_SCROLLBAR); - break; + case SB_THUMBTRACK: + sInfo.nPos = sInfo.nTrackPos; + ConioPause(Console, PAUSED_FROM_SCROLLBAR); + break; - case SB_THUMBPOSITION: - ConioUnpause(Console, PAUSED_FROM_SCROLLBAR); - break; + case SB_THUMBPOSITION: + ConioUnpause(Console, PAUSED_FROM_SCROLLBAR); + break; - case SB_TOP: - sInfo.nPos = sInfo.nMin; - break; + case SB_TOP: + sInfo.nPos = sInfo.nMin; + break; - case SB_BOTTOM: - sInfo.nPos = sInfo.nMax; - break; + case SB_BOTTOM: + sInfo.nPos = sInfo.nMax; + break; - default: - break; - } + default: + break; + } - sInfo.nPos = max(sInfo.nPos, 0); - sInfo.nPos = min(sInfo.nPos, Maximum); + sInfo.nPos = max(sInfo.nPos, 0); + sInfo.nPos = min(sInfo.nPos, Maximum); - if (old_pos != sInfo.nPos) - { - USHORT OldX = Buff->ShowX; - USHORT OldY = Buff->ShowY; - *pShowXY = sInfo.nPos; + if (old_pos != sInfo.nPos) + { + USHORT OldX = Buff->ShowX; + USHORT OldY = Buff->ShowY; + *pShowXY = sInfo.nPos; - ScrollWindowEx(hwnd, - (OldX - Buff->ShowX) * GuiData->CharWidth, - (OldY - Buff->ShowY) * GuiData->CharHeight, - NULL, - NULL, - NULL, - NULL, - SW_INVALIDATE); + ScrollWindowEx(hwnd, + (OldX - Buff->ShowX) * GuiData->CharWidth, + (OldY - Buff->ShowY) * GuiData->CharHeight, + NULL, + NULL, + NULL, + NULL, + SW_INVALIDATE); - sInfo.fMask = SIF_POS; - SetScrollInfo(hwnd, fnBar, &sInfo, TRUE); + sInfo.fMask = SIF_POS; + SetScrollInfo(hwnd, fnBar, &sInfo, TRUE); - UpdateWindow(hwnd); - } - return 0; + UpdateWindow(hwnd); + } + return 0; } static LRESULT CALLBACK GuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - LRESULT Result = 0; - PGUI_CONSOLE_DATA GuiData = NULL; - PCSRSS_CONSOLE Console = NULL; + LRESULT Result = 0; + PGUI_CONSOLE_DATA GuiData = NULL; + PCSRSS_CONSOLE Console = NULL; - GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); + GuiConsoleGetDataPointers(hWnd, &Console, &GuiData); - switch(msg) + switch(msg) { - case WM_NCCREATE: + case WM_NCCREATE: Result = (LRESULT) GuiConsoleHandleNcCreate(hWnd, (CREATESTRUCTW *) lParam); break; - case WM_PAINT: + case WM_PAINT: GuiConsoleHandlePaint(hWnd, (HDC)wParam); break; - case WM_KEYDOWN: - case WM_KEYUP: - case WM_SYSKEYDOWN: - case WM_SYSKEYUP: - case WM_CHAR: + case WM_KEYDOWN: + case WM_KEYUP: + case WM_SYSKEYDOWN: + case WM_SYSKEYUP: + case WM_CHAR: GuiConsoleHandleKey(hWnd, msg, wParam, lParam); break; - case WM_TIMER: + case WM_TIMER: GuiConsoleHandleTimer(hWnd); break; - case WM_CLOSE: + case WM_CLOSE: GuiConsoleHandleClose(hWnd); break; - case WM_NCDESTROY: + case WM_NCDESTROY: GuiConsoleHandleNcDestroy(hWnd); break; - case WM_LBUTTONDOWN: - GuiConsoleLeftMouseDown(hWnd, lParam); + case WM_LBUTTONDOWN: + GuiConsoleLeftMouseDown(hWnd, lParam); break; - case WM_LBUTTONUP: - GuiConsoleLeftMouseUp(hWnd, lParam); + case WM_LBUTTONUP: + GuiConsoleLeftMouseUp(hWnd, lParam); break; - case WM_RBUTTONDOWN: - GuiConsoleRightMouseDown(hWnd); + case WM_RBUTTONDOWN: + GuiConsoleRightMouseDown(hWnd); break; - case WM_MOUSEMOVE: - GuiConsoleMouseMove(hWnd, wParam, lParam); + case WM_MOUSEMOVE: + GuiConsoleMouseMove(hWnd, wParam, lParam); break; - case WM_SYSCOMMAND: - Result = GuiConsoleHandleSysMenuCommand(hWnd, wParam, lParam, GuiData); - break; - case WM_HSCROLL: - case WM_VSCROLL: - Result = GuiConsoleHandleScroll(hWnd, msg, wParam); - break; - case WM_GETMINMAXINFO: - GuiConsoleGetMinMaxInfo(hWnd, (PMINMAXINFO)lParam); - break; - case WM_SIZE: - GuiConsoleResize(hWnd, wParam, lParam); - break; - case PM_APPLY_CONSOLE_INFO: - GuiApplyUserSettings(Console, GuiData, (PConsoleInfo)wParam); - if (lParam) - { - GuiConsoleWriteUserSettings(Console, GuiData); - } - break; - default: + case WM_SYSCOMMAND: + Result = GuiConsoleHandleSysMenuCommand(hWnd, wParam, lParam, GuiData); + break; + case WM_HSCROLL: + case WM_VSCROLL: + Result = GuiConsoleHandleScroll(hWnd, msg, wParam); + break; + case WM_GETMINMAXINFO: + GuiConsoleGetMinMaxInfo(hWnd, (PMINMAXINFO)lParam); + break; + case WM_SIZE: + GuiConsoleResize(hWnd, wParam, lParam); + break; + case PM_APPLY_CONSOLE_INFO: + GuiApplyUserSettings(Console, GuiData, (PConsoleInfo)wParam); + if (lParam) + { + GuiConsoleWriteUserSettings(Console, GuiData); + } + break; + default: Result = DefWindowProcW(hWnd, msg, wParam, lParam); break; } - return Result; + return Result; } static LRESULT CALLBACK GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - HWND NewWindow; - LONG WindowCount; - MSG Msg; - PWCHAR Buffer, Title; - PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) lParam; + HWND NewWindow; + LONG WindowCount; + MSG Msg; + PWCHAR Buffer, Title; + PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) lParam; - switch(msg) + switch(msg) { - case WM_CREATE: + case WM_CREATE: SetWindowLongW(hWnd, GWL_USERDATA, 0); return 0; - case PM_CREATE_CONSOLE: + case PM_CREATE_CONSOLE: Buffer = HeapAlloc(Win32CsrApiHeap, 0, Console->Title.Length + sizeof(WCHAR)); if (NULL != Buffer) - { + { memcpy(Buffer, Console->Title.Buffer, Console->Title.Length); Buffer[Console->Title.Length / sizeof(WCHAR)] = L'\0'; Title = Buffer; - } + } else - { + { Title = L""; - } + } NewWindow = CreateWindowExW(WS_EX_CLIENTEDGE, L"ConsoleWindowClass", Title, @@ -1965,41 +1961,41 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) (HINSTANCE) GetModuleHandleW(NULL), (PVOID) Console); if (NULL != Buffer) - { + { HeapFree(Win32CsrApiHeap, 0, Buffer); - } + } if (NULL != NewWindow) - { + { SetWindowLongW(hWnd, GWL_USERDATA, GetWindowLongW(hWnd, GWL_USERDATA) + 1); if (wParam) { ShowWindow(NewWindow, SW_SHOW); } - } + } return (LRESULT) NewWindow; - case PM_DESTROY_CONSOLE: + case PM_DESTROY_CONSOLE: /* Window creation is done using a PostMessage(), so it's possible that the * window that we want to destroy doesn't exist yet. So first empty the message * queue */ while(PeekMessageW(&Msg, NULL, 0, 0, PM_REMOVE)) - { + { TranslateMessage(&Msg); DispatchMessageW(&Msg); - } + } DestroyWindow(Console->hWindow); Console->hWindow = NULL; WindowCount = GetWindowLongW(hWnd, GWL_USERDATA); WindowCount--; SetWindowLongW(hWnd, GWL_USERDATA, WindowCount); if (0 == WindowCount) - { + { NotifyWnd = NULL; DestroyWindow(hWnd); PrivateCsrssManualGuiCheck(-1); PostQuitMessage(0); - } + } return 0; - default: + default: return DefWindowProcW(hWnd, msg, wParam, lParam); } } @@ -2007,209 +2003,209 @@ GuiConsoleNotifyWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) static DWORD WINAPI GuiConsoleGuiThread(PVOID Data) { - MSG msg; - PHANDLE GraphicsStartupEvent = (PHANDLE) Data; + MSG msg; + PHANDLE GraphicsStartupEvent = (PHANDLE) Data; - NotifyWnd = CreateWindowW(L"Win32CsrCreateNotify", - L"", - WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - CW_USEDEFAULT, - NULL, - NULL, - (HINSTANCE) GetModuleHandleW(NULL), - NULL); - if (NULL == NotifyWnd) + NotifyWnd = CreateWindowW(L"Win32CsrCreateNotify", + L"", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + CW_USEDEFAULT, + NULL, + NULL, + (HINSTANCE) GetModuleHandleW(NULL), + NULL); + if (NULL == NotifyWnd) { - PrivateCsrssManualGuiCheck(-1); - SetEvent(*GraphicsStartupEvent); - return 1; + PrivateCsrssManualGuiCheck(-1); + SetEvent(*GraphicsStartupEvent); + return 1; } - SetEvent(*GraphicsStartupEvent); + SetEvent(*GraphicsStartupEvent); - while(GetMessageW(&msg, NULL, 0, 0)) + while(GetMessageW(&msg, NULL, 0, 0)) { - TranslateMessage(&msg); - DispatchMessageW(&msg); + TranslateMessage(&msg); + DispatchMessageW(&msg); } - return 1; + return 1; } static BOOL GuiInit(VOID) { - WNDCLASSEXW wc; + WNDCLASSEXW wc; - if (NULL == NotifyWnd) + if (NULL == NotifyWnd) { - PrivateCsrssManualGuiCheck(+1); + PrivateCsrssManualGuiCheck(+1); } - wc.cbSize = sizeof(WNDCLASSEXW); - wc.lpszClassName = L"Win32CsrCreateNotify"; - wc.lpfnWndProc = GuiConsoleNotifyWndProc; - wc.style = 0; - wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); - wc.hIcon = NULL; - wc.hCursor = NULL; - wc.hbrBackground = NULL; - wc.lpszMenuName = NULL; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hIconSm = NULL; - if (RegisterClassExW(&wc) == 0) + wc.cbSize = sizeof(WNDCLASSEXW); + wc.lpszClassName = L"Win32CsrCreateNotify"; + wc.lpfnWndProc = GuiConsoleNotifyWndProc; + wc.style = 0; + wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); + wc.hIcon = NULL; + wc.hCursor = NULL; + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hIconSm = NULL; + if (RegisterClassExW(&wc) == 0) { - DPRINT1("Failed to register notify wndproc\n"); - return FALSE; + DPRINT1("Failed to register notify wndproc\n"); + return FALSE; } - wc.cbSize = sizeof(WNDCLASSEXW); - wc.lpszClassName = L"ConsoleWindowClass"; - wc.lpfnWndProc = GuiConsoleWndProc; - wc.style = 0; - wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); - wc.hIcon = LoadIconW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1)); - wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW); - wc.hbrBackground = CreateSolidBrush(RGB(0,0,0)); - wc.lpszMenuName = NULL; - wc.cbClsExtra = 0; - wc.cbWndExtra = 0; - wc.hIconSm = LoadImageW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1), IMAGE_ICON, - GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), - LR_SHARED); - if (RegisterClassExW(&wc) == 0) + wc.cbSize = sizeof(WNDCLASSEXW); + wc.lpszClassName = L"ConsoleWindowClass"; + wc.lpfnWndProc = GuiConsoleWndProc; + wc.style = 0; + wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); + wc.hIcon = LoadIconW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1)); + wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW); + wc.hbrBackground = CreateSolidBrush(RGB(0,0,0)); + wc.lpszMenuName = NULL; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hIconSm = LoadImageW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1), IMAGE_ICON, + GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), + LR_SHARED); + if (RegisterClassExW(&wc) == 0) { - DPRINT1("Failed to register console wndproc\n"); - return FALSE; + DPRINT1("Failed to register console wndproc\n"); + return FALSE; } - return TRUE; + return TRUE; } static VOID WINAPI GuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer) { - Buffer->DefaultAttrib = DEFAULT_ATTRIB; + Buffer->DefaultAttrib = DEFAULT_ATTRIB; } static BOOL WINAPI GuiChangeTitle(PCSRSS_CONSOLE Console) { - PWCHAR Buffer, Title; + PWCHAR Buffer, Title; - Buffer = HeapAlloc(Win32CsrApiHeap, 0, - Console->Title.Length + sizeof(WCHAR)); - if (NULL != Buffer) + Buffer = HeapAlloc(Win32CsrApiHeap, 0, + Console->Title.Length + sizeof(WCHAR)); + if (NULL != Buffer) { - memcpy(Buffer, Console->Title.Buffer, Console->Title.Length); - Buffer[Console->Title.Length / sizeof(WCHAR)] = L'\0'; - Title = Buffer; + memcpy(Buffer, Console->Title.Buffer, Console->Title.Length); + Buffer[Console->Title.Length / sizeof(WCHAR)] = L'\0'; + Title = Buffer; } - else + else { - Title = L""; + Title = L""; } - SendMessageW(Console->hWindow, WM_SETTEXT, 0, (LPARAM) Title); + SendMessageW(Console->hWindow, WM_SETTEXT, 0, (LPARAM) Title); - if (NULL != Buffer) + if (NULL != Buffer) { - HeapFree(Win32CsrApiHeap, 0, Buffer); + HeapFree(Win32CsrApiHeap, 0, Buffer); } - return TRUE; + return TRUE; } static BOOL WINAPI GuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon) { - SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)hWindowIcon); - SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon); + SendMessageW(Console->hWindow, WM_SETICON, ICON_BIG, (LPARAM)hWindowIcon); + SendMessageW(Console->hWindow, WM_SETICON, ICON_SMALL, (LPARAM)hWindowIcon); - return TRUE; + return TRUE; } static VOID WINAPI GuiCleanupConsole(PCSRSS_CONSOLE Console) { - SendMessageW(NotifyWnd, PM_DESTROY_CONSOLE, 0, (LPARAM) Console); + SendMessageW(NotifyWnd, PM_DESTROY_CONSOLE, 0, (LPARAM) Console); } static CSRSS_CONSOLE_VTBL GuiVtbl = { - GuiInitScreenBuffer, - GuiWriteStream, - GuiDrawRegion, - GuiSetCursorInfo, - GuiSetScreenInfo, - GuiUpdateScreenInfo, - GuiChangeTitle, - GuiCleanupConsole, - GuiChangeIcon, - GuiResizeBuffer, + GuiInitScreenBuffer, + GuiWriteStream, + GuiDrawRegion, + GuiSetCursorInfo, + GuiSetScreenInfo, + GuiUpdateScreenInfo, + GuiChangeTitle, + GuiCleanupConsole, + GuiChangeIcon, + GuiResizeBuffer, }; NTSTATUS FASTCALL GuiInitConsole(PCSRSS_CONSOLE Console, BOOL Visible) { - HANDLE GraphicsStartupEvent; - HANDLE ThreadHandle; - PGUI_CONSOLE_DATA GuiData; + HANDLE GraphicsStartupEvent; + HANDLE ThreadHandle; + PGUI_CONSOLE_DATA GuiData; - if (! ConsInitialized) + if (! ConsInitialized) { - ConsInitialized = TRUE; - if (! GuiInit()) + ConsInitialized = TRUE; + if (! GuiInit()) { - ConsInitialized = FALSE; - return STATUS_UNSUCCESSFUL; + ConsInitialized = FALSE; + return STATUS_UNSUCCESSFUL; } } - Console->Vtbl = &GuiVtbl; - if (NULL == NotifyWnd) + Console->Vtbl = &GuiVtbl; + if (NULL == NotifyWnd) { - GraphicsStartupEvent = CreateEventW(NULL, FALSE, FALSE, NULL); - if (NULL == GraphicsStartupEvent) + GraphicsStartupEvent = CreateEventW(NULL, FALSE, FALSE, NULL); + if (NULL == GraphicsStartupEvent) { - return STATUS_UNSUCCESSFUL; + return STATUS_UNSUCCESSFUL; } - ThreadHandle = CreateThread(NULL, - 0, - GuiConsoleGuiThread, - (PVOID) &GraphicsStartupEvent, - 0, - NULL); - if (NULL == ThreadHandle) + ThreadHandle = CreateThread(NULL, + 0, + GuiConsoleGuiThread, + (PVOID) &GraphicsStartupEvent, + 0, + NULL); + if (NULL == ThreadHandle) { - NtClose(GraphicsStartupEvent); - DPRINT1("Win32Csr: Failed to create graphics console thread. Expect problems\n"); - return STATUS_UNSUCCESSFUL; + NtClose(GraphicsStartupEvent); + DPRINT1("Win32Csr: Failed to create graphics console thread. Expect problems\n"); + return STATUS_UNSUCCESSFUL; } - SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST); - CloseHandle(ThreadHandle); + SetThreadPriority(ThreadHandle, THREAD_PRIORITY_HIGHEST); + CloseHandle(ThreadHandle); - WaitForSingleObject(GraphicsStartupEvent, INFINITE); - CloseHandle(GraphicsStartupEvent); + WaitForSingleObject(GraphicsStartupEvent, INFINITE); + CloseHandle(GraphicsStartupEvent); - if (NULL == NotifyWnd) + if (NULL == NotifyWnd) { - DPRINT1("Win32Csr: Failed to create notification window.\n"); - return STATUS_UNSUCCESSFUL; + DPRINT1("Win32Csr: Failed to create notification window.\n"); + return STATUS_UNSUCCESSFUL; } } GuiData = HeapAlloc(Win32CsrApiHeap, HEAP_ZERO_MEMORY, sizeof(GUI_CONSOLE_DATA)); if (!GuiData) - { + { DPRINT1("Win32Csr: Failed to create GUI_CONSOLE_DATA\n"); return STATUS_UNSUCCESSFUL; - } + } Console->PrivateData = (PVOID) GuiData; /* @@ -2229,7 +2225,7 @@ GuiInitConsole(PCSRSS_CONSOLE Console, BOOL Visible) CloseHandle(GuiData->hGuiInitEvent); GuiData->hGuiInitEvent = NULL; - return STATUS_SUCCESS; + return STATUS_SUCCESS; } /* EOF */ diff --git a/subsystems/win32/csrss/win32csr/handle.c b/subsystems/win32/csrss/win32csr/handle.c index 87f5c6348a4..ce8db451681 100644 --- a/subsystems/win32/csrss/win32csr/handle.c +++ b/subsystems/win32/csrss/win32csr/handle.c @@ -101,7 +101,7 @@ Win32CsrLockObject(PCSRSS_PROCESS_DATA ProcessData, { ULONG_PTR h = (ULONG_PTR)Handle >> 2; - DPRINT("CsrGetObject, Object: %x, %x, %x\n", + DPRINT("CsrGetObject, Object: %x, %x, %x\n", Object, Handle, ProcessData ? ProcessData->HandleTableSize : 0); RtlEnterCriticalSection(&ProcessData->HandleTableLock); @@ -271,7 +271,7 @@ CSR_API(CsrGetHandle) PCSRSS_CONSOLE Console = ProcessData->Console; Object_t *Object; - + EnterCriticalSection(&Console->Lock); if (Request->Type == GET_OUTPUT_HANDLE) Object = &Console->ActiveBuffer->Header; @@ -366,7 +366,7 @@ CSR_API(CsrDuplicateHandle) return STATUS_INVALID_PARAMETER; } } - + Request->Status = Win32CsrInsertObject(ProcessData, &Request->Data.DuplicateHandleRequest.Handle, Entry->Object, diff --git a/subsystems/win32/csrss/win32csr/harderror.c b/subsystems/win32/csrss/win32csr/harderror.c index 4b46e340842..0e10aad8a9d 100644 --- a/subsystems/win32/csrss/win32csr/harderror.c +++ b/subsystems/win32/csrss/win32csr/harderror.c @@ -84,8 +84,8 @@ CsrpGetClientFileName( ClientFileNameU->MaximumLength = ModuleData.BaseDllName.MaximumLength; ClientFileNameU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - ClientFileNameU->MaximumLength); + HEAP_ZERO_MEMORY, + ClientFileNameU->MaximumLength); Status = NtReadVirtualMemory(hProcess, ModuleData.BaseDllName.Buffer, @@ -123,9 +123,9 @@ CsrpCaptureStringParameters( UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; /* Read all strings from client space */ - for (nParam = 0; - nParam < HardErrorMessage->NumberOfParameters; - nParam++, UnicodeStringParameterMask >>= 1) + for (nParam = 0; + nParam < HardErrorMessage->NumberOfParameters; + nParam++, UnicodeStringParameterMask >>= 1) { Parameters[nParam] = 0; @@ -194,9 +194,9 @@ CsrpFreeStringParameters( UnicodeStringParameterMask = HardErrorMessage->UnicodeStringParameterMask; /* Loop all parameters */ - for (nParam = 0; - nParam < HardErrorMessage->NumberOfParameters; - nParam++, UnicodeStringParameterMask >>= 1) + for (nParam = 0; + nParam < HardErrorMessage->NumberOfParameters; + nParam++, UnicodeStringParameterMask >>= 1) { /* Check if the current parameter is a string */ if (UnicodeStringParameterMask & 0x01) @@ -292,8 +292,8 @@ CsrpFormatMessages( /* Allocate a buffer for the caption */ CaptionStringU->Buffer = RtlAllocateHeap(RtlGetProcessHeap(), - HEAP_ZERO_MEMORY, - CaptionStringU->MaximumLength); + HEAP_ZERO_MEMORY, + CaptionStringU->MaximumLength); /* Append the file name, seperator and the caption text */ CaptionStringU->Length = 0; @@ -383,13 +383,13 @@ CsrpFormatMessages( { /* Print the string into the buffer */ StringCbPrintfW(TextStringU->Buffer, - TextStringU->MaximumLength, - FormatString, - Parameters[0], - Parameters[1], - Parameters[2], - Parameters[3], - Parameters[4]); + TextStringU->MaximumLength, + FormatString, + Parameters[0], + Parameters[1], + Parameters[2], + Parameters[3], + Parameters[4]); Status = STATUS_SUCCESS; } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) @@ -424,30 +424,30 @@ CsrpMessageBox( /* Set the message box type */ switch (ValidResponseOptions) { - case OptionAbortRetryIgnore: - Type = MB_ABORTRETRYIGNORE; - break; - case OptionOk: - Type = MB_OK; - break; - case OptionOkCancel: - Type = MB_OKCANCEL; - break; - case OptionRetryCancel: - Type = MB_RETRYCANCEL; - break; - case OptionYesNo: - Type = MB_YESNO; - break; - case OptionYesNoCancel: - Type = MB_YESNOCANCEL; - break; - case OptionShutdownSystem: - Type = MB_RETRYCANCEL; // FIXME??? - break; + case OptionAbortRetryIgnore: + Type = MB_ABORTRETRYIGNORE; + break; + case OptionOk: + Type = MB_OK; + break; + case OptionOkCancel: + Type = MB_OKCANCEL; + break; + case OptionRetryCancel: + Type = MB_RETRYCANCEL; + break; + case OptionYesNo: + Type = MB_YESNO; + break; + case OptionYesNoCancel: + Type = MB_YESNOCANCEL; + break; + case OptionShutdownSystem: + Type = MB_RETRYCANCEL; // FIXME??? + break; /* Anything else is invalid */ - default: - return ResponseNotHandled; + default: + return ResponseNotHandled; } /* Set severity */ @@ -457,7 +457,7 @@ CsrpMessageBox( Type |= MB_SYSTEMMODAL | MB_SETFOREGROUND; - DPRINT("Text = '%S', Caption = '%S', Severity = %d, Type = 0x%lx\n", + DPRINT("Text = '%S', Caption = '%S', Severity = %d, Type = 0x%lx\n", Text, Caption, Severity, Type); /* Display a message box */ @@ -466,15 +466,15 @@ CsrpMessageBox( /* Return response value */ switch (MessageBoxResponse) { - case IDOK: return ResponseOk; - case IDCANCEL: return ResponseCancel; - case IDYES: return ResponseYes; - case IDNO: return ResponseNo; - case IDABORT: return ResponseAbort; - case IDIGNORE: return ResponseIgnore; - case IDRETRY: return ResponseRetry; - case IDTRYAGAIN: return ResponseTryAgain; - case IDCONTINUE: return ResponseContinue; + case IDOK: return ResponseOk; + case IDCANCEL: return ResponseCancel; + case IDYES: return ResponseYes; + case IDNO: return ResponseNo; + case IDABORT: return ResponseAbort; + case IDIGNORE: return ResponseIgnore; + case IDRETRY: return ResponseRetry; + case IDTRYAGAIN: return ResponseTryAgain; + case IDCONTINUE: return ResponseContinue; } return ResponseNotHandled; @@ -537,7 +537,7 @@ Win32CsrHardError( if (!NT_SUCCESS(Status)) { - return FALSE; + return FALSE; } /* Display the message box */ diff --git a/subsystems/win32/csrss/win32csr/lang/it-IT.rc b/subsystems/win32/csrss/win32csr/lang/it-IT.rc index 4aecce782f1..21d87610dc5 100644 --- a/subsystems/win32/csrss/win32csr/lang/it-IT.rc +++ b/subsystems/win32/csrss/win32csr/lang/it-IT.rc @@ -11,10 +11,10 @@ LANGUAGE LANG_ITALIAN, SUBLANG_NEUTRAL IDD_END_NOW DIALOGEX DISCARDABLE 0, 0, 200, 95 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Fine del programma - " +CAPTION "Arresto del programma - " FONT 8, "MS Shell Dlg" BEGIN - LTEXT "Fine del programma... Attendere",IDC_STATIC,7,7,186,11 + LTEXT "Arresto del programma... Attendere",IDC_STATIC,7,7,186,11 CONTROL "Progresso",IDC_PROGRESS,"msctls_progress32",WS_BORDER, 7,20,186,13 LTEXT "Se si sceglie di terminare il programma immediatamente, si perderanno tutti i dati non salvati. Per terminare il programma ora, selezionare Termina ora.", @@ -24,7 +24,7 @@ END IDD_NOT_RESPONDING DIALOGEX DISCARDABLE 0, 0, 192, 122 STYLE DS_SHELLFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "End Program - " +CAPTION "Arresto del programma - " FONT 8, "MS Shell Dlg" BEGIN DEFPUSHBUTTON "Annulla",IDCANCEL,142,98,43,17 diff --git a/subsystems/win32/csrss/win32csr/lineinput.c b/subsystems/win32/csrss/win32csr/lineinput.c new file mode 100644 index 00000000000..78cbe27cfb1 --- /dev/null +++ b/subsystems/win32/csrss/win32csr/lineinput.c @@ -0,0 +1,597 @@ +/* + * PROJECT: ReactOS CSRSS + * LICENSE: GPL - See COPYING in the top level directory + * FILE: subsystems/win32/csrss/win32csr/lineinput.c + * PURPOSE: Console line input functions + * PROGRAMMERS: Jeffrey Morlan + */ + +/* INCLUDES ******************************************************************/ + +#define NDEBUG +#include "w32csr.h" +#include + +typedef struct tagHISTORY_BUFFER +{ + LIST_ENTRY ListEntry; + WORD Position; + WORD MaxEntries; + WORD NumEntries; + PUNICODE_STRING Entries; + UNICODE_STRING ExeName; +} HISTORY_BUFFER, *PHISTORY_BUFFER; + +/* FUNCTIONS *****************************************************************/ + +static PHISTORY_BUFFER +HistoryCurrentBuffer(PCSRSS_CONSOLE Console) +{ + /* TODO: use actual EXE name sent from process that called ReadConsole */ + UNICODE_STRING ExeName = { 14, 14, L"cmd.exe" }; + PLIST_ENTRY Entry = Console->HistoryBuffers.Flink; + PHISTORY_BUFFER Hist; + + for (; Entry != &Console->HistoryBuffers; Entry = Entry->Flink) + { + Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry); + if (RtlEqualUnicodeString(&ExeName, &Hist->ExeName, FALSE)) + return Hist; + } + + /* Couldn't find the buffer, create a new one */ + Hist = HeapAlloc(Win32CsrApiHeap, 0, sizeof(HISTORY_BUFFER) + ExeName.Length); + if (!Hist) + return NULL; + Hist->MaxEntries = Console->HistoryBufferSize; + Hist->NumEntries = 0; + Hist->Entries = HeapAlloc(Win32CsrApiHeap, 0, Hist->MaxEntries * sizeof(UNICODE_STRING)); + if (!Hist->Entries) + { + HeapFree(Win32CsrApiHeap, 0, Hist); + return NULL; + } + Hist->ExeName.Length = Hist->ExeName.MaximumLength = ExeName.Length; + Hist->ExeName.Buffer = (PWCHAR)(Hist + 1); + memcpy(Hist->ExeName.Buffer, ExeName.Buffer, ExeName.Length); + InsertHeadList(&Console->HistoryBuffers, &Hist->ListEntry); + return Hist; +} + +static VOID +HistoryAddEntry(PCSRSS_CONSOLE Console) +{ + UNICODE_STRING NewEntry; + PHISTORY_BUFFER Hist; + INT i; + + NewEntry.Length = NewEntry.MaximumLength = Console->LineSize * sizeof(WCHAR); + NewEntry.Buffer = Console->LineBuffer; + + if (!(Hist = HistoryCurrentBuffer(Console))) + return; + + /* Don't add blank or duplicate entries */ + if (NewEntry.Length == 0 || Hist->MaxEntries == 0 || + (Hist->NumEntries > 0 && + RtlEqualUnicodeString(&Hist->Entries[Hist->NumEntries - 1], &NewEntry, FALSE))) + { + return; + } + + if (Console->HistoryNoDup) + { + /* Check if this line has been entered before */ + for (i = Hist->NumEntries - 1; i >= 0; i--) + { + if (RtlEqualUnicodeString(&Hist->Entries[i], &NewEntry, FALSE)) + { + /* Just rotate the list to bring this entry to the end */ + NewEntry = Hist->Entries[i]; + memmove(&Hist->Entries[i], &Hist->Entries[i + 1], + (Hist->NumEntries - (i + 1)) * sizeof(UNICODE_STRING)); + Hist->Entries[Hist->NumEntries - 1] = NewEntry; + Hist->Position = Hist->NumEntries - 1; + return; + } + } + } + + if (Hist->NumEntries == Hist->MaxEntries) + { + /* List is full, remove oldest entry */ + RtlFreeUnicodeString(&Hist->Entries[0]); + memmove(&Hist->Entries[0], &Hist->Entries[1], + --Hist->NumEntries * sizeof(UNICODE_STRING)); + } + + if (NT_SUCCESS(RtlDuplicateUnicodeString(0, &NewEntry, &Hist->Entries[Hist->NumEntries]))) + Hist->NumEntries++; + Hist->Position = Hist->NumEntries - 1; +} + +static VOID +HistoryGetCurrentEntry(PCSRSS_CONSOLE Console, PUNICODE_STRING Entry) +{ + PHISTORY_BUFFER Hist; + if (!(Hist = HistoryCurrentBuffer(Console)) || Hist->NumEntries == 0) + Entry->Length = 0; + else + *Entry = Hist->Entries[Hist->Position]; +} + +static PHISTORY_BUFFER +HistoryFindBuffer(PCSRSS_CONSOLE Console, PUNICODE_STRING ExeName) +{ + PLIST_ENTRY Entry = Console->HistoryBuffers.Flink; + while (Entry != &Console->HistoryBuffers) + { + /* For the history APIs, the caller is allowed to give only part of the name */ + PHISTORY_BUFFER Hist = CONTAINING_RECORD(Entry, HISTORY_BUFFER, ListEntry); + if (RtlPrefixUnicodeString(ExeName, &Hist->ExeName, TRUE)) + return Hist; + Entry = Entry->Flink; + } + return NULL; +} + +VOID FASTCALL +HistoryDeleteBuffer(PHISTORY_BUFFER Hist) +{ + if (!Hist) + return; + while (Hist->NumEntries != 0) + RtlFreeUnicodeString(&Hist->Entries[--Hist->NumEntries]); + HeapFree(Win32CsrApiHeap, 0, Hist->Entries); + RemoveEntryList(&Hist->ListEntry); + HeapFree(Win32CsrApiHeap, 0, Hist); +} + +CSR_API(CsrGetCommandHistoryLength) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + PHISTORY_BUFFER Hist; + ULONG Length = 0; + INT i; + + if (!Win32CsrValidateBuffer(ProcessData, + Request->Data.GetCommandHistoryLength.ExeName.Buffer, + Request->Data.GetCommandHistoryLength.ExeName.Length, 1)) + { + return STATUS_ACCESS_VIOLATION; + } + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + Hist = HistoryFindBuffer(Console, &Request->Data.GetCommandHistory.ExeName); + if (Hist) + { + for (i = 0; i < Hist->NumEntries; i++) + Length += Hist->Entries[i].Length + sizeof(WCHAR); + } + Request->Data.GetCommandHistoryLength.Length = Length; + ConioUnlockConsole(Console); + } + return Status; +} + +CSR_API(CsrGetCommandHistory) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status; + PHISTORY_BUFFER Hist; + PBYTE Buffer = (PBYTE)Request->Data.GetCommandHistory.History; + ULONG BufferSize = Request->Data.GetCommandHistory.Length; + INT i; + + if (!Win32CsrValidateBuffer(ProcessData, Buffer, BufferSize, 1) || + !Win32CsrValidateBuffer(ProcessData, + Request->Data.GetCommandHistory.ExeName.Buffer, + Request->Data.GetCommandHistory.ExeName.Length, 1)) + { + return STATUS_ACCESS_VIOLATION; + } + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + Hist = HistoryFindBuffer(Console, &Request->Data.GetCommandHistory.ExeName); + if (Hist) + { + for (i = 0; i < Hist->NumEntries; i++) + { + if (BufferSize < (Hist->Entries[i].Length + sizeof(WCHAR))) + { + Status = STATUS_BUFFER_OVERFLOW; + break; + } + memcpy(Buffer, Hist->Entries[i].Buffer, Hist->Entries[i].Length); + Buffer += Hist->Entries[i].Length; + *(PWCHAR)Buffer = L'\0'; + Buffer += sizeof(WCHAR); + } + } + Request->Data.GetCommandHistory.Length = Buffer - (PBYTE)Request->Data.GetCommandHistory.History; + ConioUnlockConsole(Console); + } + return Status; +} + +CSR_API(CsrExpungeCommandHistory) +{ + PCSRSS_CONSOLE Console; + PHISTORY_BUFFER Hist; + NTSTATUS Status; + + if (!Win32CsrValidateBuffer(ProcessData, + Request->Data.ExpungeCommandHistory.ExeName.Buffer, + Request->Data.ExpungeCommandHistory.ExeName.Length, 1)) + { + return STATUS_ACCESS_VIOLATION; + } + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + Hist = HistoryFindBuffer(Console, &Request->Data.ExpungeCommandHistory.ExeName); + HistoryDeleteBuffer(Hist); + ConioUnlockConsole(Console); + } + return Status; +} + +CSR_API(CsrSetHistoryNumberCommands) +{ + PCSRSS_CONSOLE Console; + PHISTORY_BUFFER Hist; + NTSTATUS Status; + WORD MaxEntries = Request->Data.SetHistoryNumberCommands.NumCommands; + PUNICODE_STRING OldEntryList, NewEntryList; + + if (!Win32CsrValidateBuffer(ProcessData, + Request->Data.SetHistoryNumberCommands.ExeName.Buffer, + Request->Data.SetHistoryNumberCommands.ExeName.Length, 1)) + { + return STATUS_ACCESS_VIOLATION; + } + + Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + Hist = HistoryFindBuffer(Console, &Request->Data.SetHistoryNumberCommands.ExeName); + if (Hist) + { + OldEntryList = Hist->Entries; + NewEntryList = HeapAlloc(Win32CsrApiHeap, 0, + MaxEntries * sizeof(UNICODE_STRING)); + if (!NewEntryList) + { + Status = STATUS_NO_MEMORY; + } + else + { + /* If necessary, shrink by removing oldest entries */ + for (; Hist->NumEntries > MaxEntries; Hist->NumEntries--) + { + RtlFreeUnicodeString(Hist->Entries++); + Hist->Position += (Hist->Position == 0); + } + + Hist->MaxEntries = MaxEntries; + Hist->Entries = memcpy(NewEntryList, Hist->Entries, + Hist->NumEntries * sizeof(UNICODE_STRING)); + HeapFree(Win32CsrApiHeap, 0, OldEntryList); + } + } + ConioUnlockConsole(Console); + } + return Status; +} + +CSR_API(CsrGetHistoryInfo) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + Request->Data.SetHistoryInfo.HistoryBufferSize = Console->HistoryBufferSize; + Request->Data.SetHistoryInfo.NumberOfHistoryBuffers = Console->NumberOfHistoryBuffers; + Request->Data.SetHistoryInfo.dwFlags = Console->HistoryNoDup; + ConioUnlockConsole(Console); + } + return Status; +} + +CSR_API(CsrSetHistoryInfo) +{ + PCSRSS_CONSOLE Console; + NTSTATUS Status = ConioConsoleFromProcessData(ProcessData, &Console); + if (NT_SUCCESS(Status)) + { + Console->HistoryBufferSize = (WORD)Request->Data.SetHistoryInfo.HistoryBufferSize; + Console->NumberOfHistoryBuffers = (WORD)Request->Data.SetHistoryInfo.NumberOfHistoryBuffers; + Console->HistoryNoDup = Request->Data.SetHistoryInfo.dwFlags & HISTORY_NO_DUP_FLAG; + ConioUnlockConsole(Console); + } + return Status; +} + +static VOID +LineInputSetPos(PCSRSS_CONSOLE Console, UINT Pos) +{ + if (Pos != Console->LinePos && Console->Mode & ENABLE_ECHO_INPUT) + { + PCSRSS_SCREEN_BUFFER Buffer = Console->ActiveBuffer; + UINT OldCursorX = Buffer->CurrentX; + UINT OldCursorY = Buffer->CurrentY; + INT XY = OldCursorY * Buffer->MaxX + OldCursorX; + + XY += (Pos - Console->LinePos); + if (XY < 0) + XY = 0; + else if (XY >= Buffer->MaxY * Buffer->MaxX) + XY = Buffer->MaxY * Buffer->MaxX - 1; + + Buffer->CurrentX = XY % Buffer->MaxX; + Buffer->CurrentY = XY / Buffer->MaxX; + ConioSetScreenInfo(Console, Buffer, OldCursorX, OldCursorY); + } + + Console->LinePos = Pos; +} + +static VOID +LineInputEdit(PCSRSS_CONSOLE Console, UINT NumToDelete, UINT NumToInsert, WCHAR *Insertion) +{ + UINT Pos = Console->LinePos; + UINT NewSize = Console->LineSize - NumToDelete + NumToInsert; + INT i; + + /* Make sure there's always enough room for ending \r\n */ + if (NewSize + 2 > Console->LineMaxSize) + return; + + memmove(&Console->LineBuffer[Pos + NumToInsert], + &Console->LineBuffer[Pos + NumToDelete], + (Console->LineSize - (Pos + NumToDelete)) * sizeof(WCHAR)); + memcpy(&Console->LineBuffer[Pos], Insertion, NumToInsert * sizeof(WCHAR)); + + if (Console->Mode & ENABLE_ECHO_INPUT) + { + for (i = Pos; i < NewSize; i++) + { + CHAR AsciiChar; + WideCharToMultiByte(Console->OutputCodePage, 0, + &Console->LineBuffer[i], 1, + &AsciiChar, 1, NULL, NULL); + ConioWriteConsole(Console, Console->ActiveBuffer, &AsciiChar, 1, TRUE); + } + for (; i < Console->LineSize; i++) + { + ConioWriteConsole(Console, Console->ActiveBuffer, " ", 1, TRUE); + } + Console->LinePos = i; + } + + Console->LineSize = NewSize; + LineInputSetPos(Console, Pos + NumToInsert); +} + +static VOID +LineInputRecallHistory(PCSRSS_CONSOLE Console, INT Offset) +{ + PHISTORY_BUFFER Hist; + + if (!(Hist = HistoryCurrentBuffer(Console)) || Hist->NumEntries == 0) + return; + + Offset += Hist->Position; + Offset = max(Offset, 0); + Offset = min(Offset, Hist->NumEntries - 1); + Hist->Position = Offset; + + LineInputSetPos(Console, 0); + LineInputEdit(Console, Console->LineSize, + Hist->Entries[Offset].Length / sizeof(WCHAR), + Hist->Entries[Offset].Buffer); +} + +VOID FASTCALL +LineInputKeyDown(PCSRSS_CONSOLE Console, KEY_EVENT_RECORD *KeyEvent) +{ + UINT Pos = Console->LinePos; + PHISTORY_BUFFER Hist; + UNICODE_STRING Entry; + INT HistPos; + + switch (KeyEvent->wVirtualKeyCode) + { + case VK_ESCAPE: + /* Clear entire line */ + LineInputSetPos(Console, 0); + LineInputEdit(Console, Console->LineSize, 0, NULL); + return; + case VK_HOME: + /* Move to start of line. With ctrl, erase everything left of cursor */ + LineInputSetPos(Console, 0); + if (KeyEvent->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + LineInputEdit(Console, Pos, 0, NULL); + return; + case VK_END: + /* Move to end of line. With ctrl, erase everything right of cursor */ + if (KeyEvent->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + LineInputEdit(Console, Console->LineSize - Pos, 0, NULL); + else + LineInputSetPos(Console, Console->LineSize); + return; + case VK_LEFT: + /* Move left. With ctrl, move to beginning of previous word */ + if (KeyEvent->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + { + while (Pos > 0 && Console->LineBuffer[Pos - 1] == L' ') Pos--; + while (Pos > 0 && Console->LineBuffer[Pos - 1] != L' ') Pos--; + } + else + { + Pos -= (Pos > 0); + } + LineInputSetPos(Console, Pos); + return; + case VK_RIGHT: + case VK_F1: + /* Move right. With ctrl, move to beginning of next word */ + if (KeyEvent->dwControlKeyState & (LEFT_CTRL_PRESSED | RIGHT_CTRL_PRESSED)) + { + while (Pos < Console->LineSize && Console->LineBuffer[Pos] != L' ') Pos++; + while (Pos < Console->LineSize && Console->LineBuffer[Pos] == L' ') Pos++; + LineInputSetPos(Console, Pos); + return; + } + else + { + /* Recall one character (but don't overwrite current line) */ + HistoryGetCurrentEntry(Console, &Entry); + if (Pos < Console->LineSize) + LineInputSetPos(Console, Pos + 1); + else if (Pos * sizeof(WCHAR) < Entry.Length) + LineInputEdit(Console, 0, 1, &Entry.Buffer[Pos]); + } + return; + case VK_INSERT: + /* Toggle between insert and overstrike */ + Console->LineInsertToggle = !Console->LineInsertToggle; + ConioSetCursorInfo(Console, Console->ActiveBuffer); + return; + case VK_DELETE: + /* Remove character to right of cursor */ + if (Pos != Console->LineSize) + LineInputEdit(Console, 1, 0, NULL); + return; + case VK_PRIOR: + /* Recall first history entry */ + LineInputRecallHistory(Console, -((WORD)-1)); + return; + case VK_NEXT: + /* Recall last history entry */ + LineInputRecallHistory(Console, +((WORD)-1)); + return; + case VK_UP: + case VK_F5: + /* Recall previous history entry. On first time, actually recall the + * current (usually last) entry; on subsequent times go back. */ + LineInputRecallHistory(Console, Console->LineUpPressed ? -1 : 0); + Console->LineUpPressed = TRUE; + return; + case VK_DOWN: + /* Recall next history entry */ + LineInputRecallHistory(Console, +1); + return; + case VK_F3: + /* Recall remainder of current history entry */ + HistoryGetCurrentEntry(Console, &Entry); + if (Pos * sizeof(WCHAR) < Entry.Length) + { + UINT InsertSize = (Entry.Length / sizeof(WCHAR) - Pos); + UINT DeleteSize = min(Console->LineSize - Pos, InsertSize); + LineInputEdit(Console, DeleteSize, InsertSize, &Entry.Buffer[Pos]); + } + return; + case VK_F6: + /* Insert a ^Z character */ + KeyEvent->uChar.UnicodeChar = 26; + break; + case VK_F7: + if (KeyEvent->dwControlKeyState & (LEFT_ALT_PRESSED | RIGHT_ALT_PRESSED)) + HistoryDeleteBuffer(HistoryCurrentBuffer(Console)); + return; + case VK_F8: + /* Search for history entries starting with input. */ + if (!(Hist = HistoryCurrentBuffer(Console)) || Hist->NumEntries == 0) + return; + + /* Like Up/F5, on first time start from current (usually last) entry, + * but on subsequent times start at previous entry. */ + if (Console->LineUpPressed) + Hist->Position = (Hist->Position ? Hist->Position : Hist->NumEntries) - 1; + Console->LineUpPressed = TRUE; + + Entry.Length = Console->LinePos * sizeof(WCHAR); + Entry.Buffer = Console->LineBuffer; + + /* Keep going backwards, even wrapping around to the end, + * until we get back to starting point */ + HistPos = Hist->Position; + do + { + if (RtlPrefixUnicodeString(&Entry, &Hist->Entries[HistPos], FALSE)) + { + Hist->Position = HistPos; + LineInputEdit(Console, Console->LineSize - Pos, + Hist->Entries[HistPos].Length / sizeof(WCHAR) - Pos, + &Hist->Entries[HistPos].Buffer[Pos]); + /* Cursor stays where it was */ + LineInputSetPos(Console, Pos); + return; + } + if (--HistPos < 0) HistPos += Hist->NumEntries; + } while (HistPos != Hist->Position); + return; + } + + if (KeyEvent->uChar.UnicodeChar == L'\b' && Console->Mode & ENABLE_PROCESSED_INPUT) + { + /* backspace handling - if processed input enabled then we handle it here + * otherwise we treat it like a normal char. */ + if (Pos > 0) + { + LineInputSetPos(Console, Pos - 1); + LineInputEdit(Console, 1, 0, NULL); + } + } + else if (KeyEvent->uChar.UnicodeChar == L'\r') + { + HistoryAddEntry(Console); + + /* TODO: Expand aliases */ + + LineInputSetPos(Console, Console->LineSize); + Console->LineBuffer[Console->LineSize++] = L'\r'; + if (Console->Mode & ENABLE_ECHO_INPUT) + ConioWriteConsole(Console, Console->ActiveBuffer, "\r", 1, TRUE); + + /* Add \n if processed input. There should usually be room for it, + * but an exception to the rule exists: the buffer could have been + * pre-filled with LineMaxSize - 1 characters. */ + if (Console->Mode & ENABLE_PROCESSED_INPUT && + Console->LineSize < Console->LineMaxSize) + { + Console->LineBuffer[Console->LineSize++] = L'\n'; + if (Console->Mode & ENABLE_ECHO_INPUT) + ConioWriteConsole(Console, Console->ActiveBuffer, "\n", 1, TRUE); + } + Console->LineComplete = TRUE; + Console->LinePos = 0; + } + else if (KeyEvent->uChar.UnicodeChar != L'\0') + { + if (KeyEvent->uChar.UnicodeChar < 0x20 && + Console->LineWakeupMask & (1 << KeyEvent->uChar.UnicodeChar)) + { + /* Control key client wants to handle itself (e.g. for tab completion) */ + Console->LineBuffer[Console->LineSize++] = L' '; + Console->LineBuffer[Console->LinePos] = KeyEvent->uChar.UnicodeChar; + Console->LineComplete = TRUE; + Console->LinePos = 0; + } + else + { + /* Normal character */ + BOOL Overstrike = Console->LineInsertToggle && Console->LinePos != Console->LineSize; + LineInputEdit(Console, Overstrike, 1, &KeyEvent->uChar.UnicodeChar); + } + } +} + +/* EOF */ diff --git a/subsystems/win32/csrss/win32csr/tuiconsole.c b/subsystems/win32/csrss/win32csr/tuiconsole.c index c9071686e13..e767d48c202 100644 --- a/subsystems/win32/csrss/win32csr/tuiconsole.c +++ b/subsystems/win32/csrss/win32csr/tuiconsole.c @@ -20,15 +20,15 @@ static BOOL ConsInitialized = FALSE; static LRESULT CALLBACK TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { - if (msg == WM_ACTIVATE) + if (msg == WM_ACTIVATE) { - if (LOWORD(wParam) != WA_INACTIVE) + if (LOWORD(wParam) != WA_INACTIVE) { - SetFocus(hWnd); - ConioDrawConsole(ActiveConsole); + SetFocus(hWnd); + ConioDrawConsole(ActiveConsole); } } - return DefWindowProcW(hWnd, msg, wParam, lParam); + return DefWindowProcW(hWnd, msg, wParam, lParam); } static BOOL FASTCALL @@ -63,19 +63,19 @@ cleanup: static BOOL FASTCALL TuiInit(DWORD OemCP) { - CONSOLE_SCREEN_BUFFER_INFO ScrInfo; - DWORD BytesReturned; - WNDCLASSEXW wc; - USHORT TextAttribute = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; + CONSOLE_SCREEN_BUFFER_INFO ScrInfo; + DWORD BytesReturned; + WNDCLASSEXW wc; + USHORT TextAttribute = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; - TuiStartService(L"Blue"); + TuiStartService(L"Blue"); - ConsoleDeviceHandle = CreateFileW(L"\\\\.\\BlueScreen", FILE_ALL_ACCESS, 0, NULL, - OPEN_EXISTING, 0, NULL); - if (INVALID_HANDLE_VALUE == ConsoleDeviceHandle) + ConsoleDeviceHandle = CreateFileW(L"\\\\.\\BlueScreen", FILE_ALL_ACCESS, 0, NULL, + OPEN_EXISTING, 0, NULL); + if (INVALID_HANDLE_VALUE == ConsoleDeviceHandle) { - DPRINT1("Failed to open BlueScreen.\n"); - return FALSE; + DPRINT1("Failed to open BlueScreen.\n"); + return FALSE; } if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_LOADFONT, @@ -93,163 +93,166 @@ TuiInit(DWORD OemCP) DPRINT1("Failed to set text attribute\n"); } - ActiveConsole = NULL; - InitializeCriticalSection(&ActiveConsoleLock); - if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO, - NULL, 0, &ScrInfo, sizeof(ScrInfo), &BytesReturned, NULL)) + ActiveConsole = NULL; + InitializeCriticalSection(&ActiveConsoleLock); + if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO, + NULL, 0, &ScrInfo, sizeof(ScrInfo), &BytesReturned, NULL)) { - DPRINT1("Failed to get console info\n"); - return FALSE; + DPRINT1("Failed to get console info\n"); + return FALSE; } - PhysicalConsoleSize = ScrInfo.dwSize; + PhysicalConsoleSize = ScrInfo.dwSize; - RtlZeroMemory(&wc, sizeof(WNDCLASSEXW)); - wc.cbSize = sizeof(WNDCLASSEXW); - wc.lpszClassName = L"TuiConsoleWindowClass"; - wc.lpfnWndProc = TuiConsoleWndProc; - wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); - if (RegisterClassExW(&wc) == 0) + RtlZeroMemory(&wc, sizeof(WNDCLASSEXW)); + wc.cbSize = sizeof(WNDCLASSEXW); + wc.lpszClassName = L"TuiConsoleWindowClass"; + wc.lpfnWndProc = TuiConsoleWndProc; + wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL); + if (RegisterClassExW(&wc) == 0) { - DPRINT1("Failed to register console wndproc\n"); - return FALSE; + DPRINT1("Failed to register console wndproc\n"); + return FALSE; } - return TRUE; + return TRUE; } static VOID WINAPI TuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer) { - Buffer->DefaultAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; + Buffer->DefaultAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; } static void FASTCALL TuiCopyRect(char *Dest, PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *Region) { - UINT SrcDelta, DestDelta; - LONG i; - PBYTE Src, SrcEnd; + UINT SrcDelta, DestDelta; + LONG i; + PBYTE Src, SrcEnd; - Src = ConioCoordToPointer(Buff, Region->Left, Region->Top); - SrcDelta = Buff->MaxX * 2; - SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2; - DestDelta = ConioRectWidth(Region) * 2; - for (i = Region->Top; i <= Region->Bottom; i++) + Src = ConioCoordToPointer(Buff, Region->Left, Region->Top); + SrcDelta = Buff->MaxX * 2; + SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2; + DestDelta = ConioRectWidth(Region) * 2; + for (i = Region->Top; i <= Region->Bottom; i++) { - memcpy(Dest, Src, DestDelta); - Src += SrcDelta; - if (SrcEnd <= Src) + memcpy(Dest, Src, DestDelta); + Src += SrcDelta; + if (SrcEnd <= Src) { - Src -= Buff->MaxY * Buff->MaxX * 2; + Src -= Buff->MaxY * Buff->MaxX * 2; } - Dest += DestDelta; + Dest += DestDelta; } } static VOID WINAPI TuiDrawRegion(PCSRSS_CONSOLE Console, SMALL_RECT *Region) { - DWORD BytesReturned; - PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; - PCONSOLE_DRAW ConsoleDraw; - UINT ConsoleDrawSize; + DWORD BytesReturned; + PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; + PCONSOLE_DRAW ConsoleDraw; + UINT ConsoleDrawSize; - if (ActiveConsole != Console) + if (ActiveConsole != Console) { - return; + return; } - ConsoleDrawSize = sizeof(CONSOLE_DRAW) + - (ConioRectWidth(Region) * ConioRectHeight(Region)) * 2; - ConsoleDraw = HeapAlloc(Win32CsrApiHeap, 0, ConsoleDrawSize); - if (NULL == ConsoleDraw) + ConsoleDrawSize = sizeof(CONSOLE_DRAW) + + (ConioRectWidth(Region) * ConioRectHeight(Region)) * 2; + ConsoleDraw = HeapAlloc(Win32CsrApiHeap, 0, ConsoleDrawSize); + if (NULL == ConsoleDraw) { - DPRINT1("HeapAlloc failed\n"); - return; + DPRINT1("HeapAlloc failed\n"); + return; } - ConsoleDraw->X = Region->Left; - ConsoleDraw->Y = Region->Top; - ConsoleDraw->SizeX = ConioRectWidth(Region); - ConsoleDraw->SizeY = ConioRectHeight(Region); - ConsoleDraw->CursorX = Buff->CurrentX; - ConsoleDraw->CursorY = Buff->CurrentY; + ConsoleDraw->X = Region->Left; + ConsoleDraw->Y = Region->Top; + ConsoleDraw->SizeX = ConioRectWidth(Region); + ConsoleDraw->SizeY = ConioRectHeight(Region); + ConsoleDraw->CursorX = Buff->CurrentX; + ConsoleDraw->CursorY = Buff->CurrentY; - TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region); + TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region); - if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_DRAW, - NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL)) + if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_DRAW, + NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL)) { - DPRINT1("Failed to draw console\n"); - HeapFree(Win32CsrApiHeap, 0, ConsoleDraw); - return; + DPRINT1("Failed to draw console\n"); + HeapFree(Win32CsrApiHeap, 0, ConsoleDraw); + return; } - HeapFree(Win32CsrApiHeap, 0, ConsoleDraw); + HeapFree(Win32CsrApiHeap, 0, ConsoleDraw); } static VOID WINAPI TuiWriteStream(PCSRSS_CONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY, UINT ScrolledLines, CHAR *Buffer, UINT Length) { - DWORD BytesWritten; - PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; + DWORD BytesWritten; + PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer; - if (ActiveConsole->ActiveBuffer != Buff) + if (ActiveConsole->ActiveBuffer != Buff) { - return; + return; } - if (! WriteFile(ConsoleDeviceHandle, Buffer, Length, &BytesWritten, NULL)) + if (! WriteFile(ConsoleDeviceHandle, Buffer, Length, &BytesWritten, NULL)) { - DPRINT1("Error writing to BlueScreen\n"); + DPRINT1("Error writing to BlueScreen\n"); } } static BOOL WINAPI TuiSetCursorInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff) { - DWORD BytesReturned; + CONSOLE_CURSOR_INFO Info; + DWORD BytesReturned; - if (ActiveConsole->ActiveBuffer != Buff) + if (ActiveConsole->ActiveBuffer != Buff) { - return TRUE; + return TRUE; } - if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_CURSOR_INFO, - &Buff->CursorInfo, sizeof(Buff->CursorInfo), NULL, 0, - &BytesReturned, NULL)) + Info.dwSize = ConioEffectiveCursorSize(Console, 100); + Info.bVisible = Buff->CursorInfo.bVisible; + + if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_CURSOR_INFO, + &Info, sizeof(Info), NULL, 0, &BytesReturned, NULL)) { - DPRINT1( "Failed to set cursor info\n" ); - return FALSE; + DPRINT1( "Failed to set cursor info\n" ); + return FALSE; } - return TRUE; + return TRUE; } static BOOL WINAPI TuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY) { - CONSOLE_SCREEN_BUFFER_INFO Info; - DWORD BytesReturned; + CONSOLE_SCREEN_BUFFER_INFO Info; + DWORD BytesReturned; - if (ActiveConsole->ActiveBuffer != Buff) + if (ActiveConsole->ActiveBuffer != Buff) { - return TRUE; + return TRUE; } - Info.dwCursorPosition.X = Buff->CurrentX; - Info.dwCursorPosition.Y = Buff->CurrentY; - Info.wAttributes = Buff->DefaultAttrib; + Info.dwCursorPosition.X = Buff->CurrentX; + Info.dwCursorPosition.Y = Buff->CurrentY; + Info.wAttributes = Buff->DefaultAttrib; - if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO, - &Info, sizeof(CONSOLE_SCREEN_BUFFER_INFO), NULL, 0, - &BytesReturned, NULL)) + if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO, + &Info, sizeof(CONSOLE_SCREEN_BUFFER_INFO), NULL, 0, + &BytesReturned, NULL)) { - DPRINT1( "Failed to set cursor position\n" ); - return FALSE; + DPRINT1( "Failed to set cursor position\n" ); + return FALSE; } - return TRUE; + return TRUE; } static BOOL WINAPI @@ -261,32 +264,32 @@ TuiUpdateScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff) static BOOL WINAPI TuiChangeTitle(PCSRSS_CONSOLE Console) { - return TRUE; + return TRUE; } static VOID WINAPI TuiCleanupConsole(PCSRSS_CONSOLE Console) { - DestroyWindow(Console->hWindow); + DestroyWindow(Console->hWindow); - EnterCriticalSection(&ActiveConsoleLock); + EnterCriticalSection(&ActiveConsoleLock); - /* Switch to next console */ - if (ActiveConsole == Console) + /* Switch to next console */ + if (ActiveConsole == Console) { - ActiveConsole = Console->Next != Console ? Console->Next : NULL; + ActiveConsole = Console->Next != Console ? Console->Next : NULL; } - if (Console->Next != Console) + if (Console->Next != Console) { - Console->Prev->Next = Console->Next; - Console->Next->Prev = Console->Prev; + Console->Prev->Next = Console->Next; + Console->Next->Prev = Console->Prev; } - LeaveCriticalSection(&ActiveConsoleLock); + LeaveCriticalSection(&ActiveConsoleLock); - if (NULL != ActiveConsole) + if (NULL != ActiveConsole) { - ConioDrawConsole(ActiveConsole); + ConioDrawConsole(ActiveConsole); } } @@ -306,179 +309,179 @@ TuiResizeBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer, COORD DWORD WINAPI TuiConsoleThread (PVOID Data) { - PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Data; - HWND NewWindow; - MSG msg; + PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Data; + HWND NewWindow; + MSG msg; - NewWindow = CreateWindowW(L"TuiConsoleWindowClass", - Console->Title.Buffer, - 0, - -32000, -32000, 0, 0, - NULL, NULL, - (HINSTANCE) GetModuleHandleW(NULL), - (PVOID) Console); - Console->hWindow = NewWindow; - if (NULL == NewWindow) + NewWindow = CreateWindowW(L"TuiConsoleWindowClass", + Console->Title.Buffer, + 0, + -32000, -32000, 0, 0, + NULL, NULL, + (HINSTANCE) GetModuleHandleW(NULL), + (PVOID) Console); + Console->hWindow = NewWindow; + if (NULL == NewWindow) { - DPRINT1("CSR: Unable to create console window\n"); - return 1; + DPRINT1("CSR: Unable to create console window\n"); + return 1; } - SetForegroundWindow(Console->hWindow); + SetForegroundWindow(Console->hWindow); - while (TRUE) + while (TRUE) { - GetMessageW(&msg, 0, 0, 0); - DispatchMessage(&msg); - TranslateMessage(&msg); + GetMessageW(&msg, 0, 0, 0); + DispatchMessage(&msg); + TranslateMessage(&msg); - if (msg.message == WM_CHAR || msg.message == WM_SYSCHAR || - msg.message == WM_KEYDOWN || msg.message == WM_KEYUP || - msg.message == WM_SYSKEYDOWN || msg.message == WM_SYSKEYUP) + if (msg.message == WM_CHAR || msg.message == WM_SYSCHAR || + msg.message == WM_KEYDOWN || msg.message == WM_KEYUP || + msg.message == WM_SYSKEYDOWN || msg.message == WM_SYSKEYUP) { - ConioProcessKey(&msg, Console, TRUE); + ConioProcessKey(&msg, Console, TRUE); } } - return 0; + return 0; } static CSRSS_CONSOLE_VTBL TuiVtbl = { - TuiInitScreenBuffer, - TuiWriteStream, - TuiDrawRegion, - TuiSetCursorInfo, - TuiSetScreenInfo, - TuiUpdateScreenInfo, - TuiChangeTitle, - TuiCleanupConsole, - TuiChangeIcon, - TuiResizeBuffer, + TuiInitScreenBuffer, + TuiWriteStream, + TuiDrawRegion, + TuiSetCursorInfo, + TuiSetScreenInfo, + TuiUpdateScreenInfo, + TuiChangeTitle, + TuiCleanupConsole, + TuiChangeIcon, + TuiResizeBuffer, }; NTSTATUS FASTCALL TuiInitConsole(PCSRSS_CONSOLE Console) { - HANDLE ThreadHandle; + HANDLE ThreadHandle; - if (! ConsInitialized) + if (! ConsInitialized) { - ConsInitialized = TRUE; - if (! TuiInit(Console->CodePage)) + ConsInitialized = TRUE; + if (! TuiInit(Console->CodePage)) { - ConsInitialized = FALSE; - return STATUS_UNSUCCESSFUL; + ConsInitialized = FALSE; + return STATUS_UNSUCCESSFUL; } } - Console->Vtbl = &TuiVtbl; - Console->hWindow = NULL; - Console->Size = PhysicalConsoleSize; - Console->ActiveBuffer->MaxX = PhysicalConsoleSize.X; - Console->ActiveBuffer->MaxY = PhysicalConsoleSize.Y; + Console->Vtbl = &TuiVtbl; + Console->hWindow = NULL; + Console->Size = PhysicalConsoleSize; + Console->ActiveBuffer->MaxX = PhysicalConsoleSize.X; + Console->ActiveBuffer->MaxY = PhysicalConsoleSize.Y; - ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TuiConsoleThread, - Console, 0, NULL); - if (NULL == ThreadHandle) + ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TuiConsoleThread, + Console, 0, NULL); + if (NULL == ThreadHandle) { - DPRINT1("CSR: Unable to create console thread\n"); - return STATUS_UNSUCCESSFUL; + DPRINT1("CSR: Unable to create console thread\n"); + return STATUS_UNSUCCESSFUL; } - CloseHandle(ThreadHandle); + CloseHandle(ThreadHandle); - EnterCriticalSection(&ActiveConsoleLock); - if (NULL != ActiveConsole) + EnterCriticalSection(&ActiveConsoleLock); + if (NULL != ActiveConsole) { - Console->Prev = ActiveConsole; - Console->Next = ActiveConsole->Next; - ActiveConsole->Next->Prev = Console; - ActiveConsole->Next = Console; + Console->Prev = ActiveConsole; + Console->Next = ActiveConsole->Next; + ActiveConsole->Next->Prev = Console; + ActiveConsole->Next = Console; } - else + else { - Console->Prev = Console; - Console->Next = Console; + Console->Prev = Console; + Console->Next = Console; } - ActiveConsole = Console; - LeaveCriticalSection(&ActiveConsoleLock); + ActiveConsole = Console; + LeaveCriticalSection(&ActiveConsoleLock); - return STATUS_SUCCESS; + return STATUS_SUCCESS; } PCSRSS_CONSOLE FASTCALL TuiGetFocusConsole(VOID) { - return ActiveConsole; + return ActiveConsole; } BOOL FASTCALL TuiSwapConsole(int Next) { - static PCSRSS_CONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */ - DWORD BytesReturned; - ANSI_STRING Title; - void * Buffer; - COORD *pos; + static PCSRSS_CONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */ + DWORD BytesReturned; + ANSI_STRING Title; + void * Buffer; + COORD *pos; - if (0 != Next) + if (0 != Next) { - /* alt-tab, swap consoles */ - /* move SwapConsole to next console, and print its title */ - EnterCriticalSection(&ActiveConsoleLock); - if (! SwapConsole) + /* alt-tab, swap consoles */ + /* move SwapConsole to next console, and print its title */ + EnterCriticalSection(&ActiveConsoleLock); + if (! SwapConsole) { - SwapConsole = ActiveConsole; + SwapConsole = ActiveConsole; } - SwapConsole = (0 < Next ? SwapConsole->Next : SwapConsole->Prev); - Title.MaximumLength = RtlUnicodeStringToAnsiSize(&SwapConsole->Title); - Title.Length = 0; - Buffer = HeapAlloc(Win32CsrApiHeap, - 0, - sizeof(COORD) + Title.MaximumLength); - pos = (COORD *)Buffer; - Title.Buffer = (PVOID)((ULONG_PTR)Buffer + sizeof( COORD )); + SwapConsole = (0 < Next ? SwapConsole->Next : SwapConsole->Prev); + Title.MaximumLength = RtlUnicodeStringToAnsiSize(&SwapConsole->Title); + Title.Length = 0; + Buffer = HeapAlloc(Win32CsrApiHeap, + 0, + sizeof(COORD) + Title.MaximumLength); + pos = (COORD *)Buffer; + Title.Buffer = (PVOID)((ULONG_PTR)Buffer + sizeof( COORD )); - RtlUnicodeStringToAnsiString(&Title, &SwapConsole->Title, FALSE); - pos->Y = PhysicalConsoleSize.Y / 2; - pos->X = (PhysicalConsoleSize.X - Title.Length) / 2; - /* redraw the console to clear off old title */ - ConioDrawConsole(ActiveConsole); - if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER, - NULL, 0, Buffer, sizeof(COORD) + Title.Length, - &BytesReturned, NULL)) + RtlUnicodeStringToAnsiString(&Title, &SwapConsole->Title, FALSE); + pos->Y = PhysicalConsoleSize.Y / 2; + pos->X = (PhysicalConsoleSize.X - Title.Length) / 2; + /* redraw the console to clear off old title */ + ConioDrawConsole(ActiveConsole); + if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER, + NULL, 0, Buffer, sizeof(COORD) + Title.Length, + &BytesReturned, NULL)) { - DPRINT1( "Error writing to console\n" ); + DPRINT1( "Error writing to console\n" ); } - HeapFree(Win32CsrApiHeap, 0, Buffer); - LeaveCriticalSection(&ActiveConsoleLock); + HeapFree(Win32CsrApiHeap, 0, Buffer); + LeaveCriticalSection(&ActiveConsoleLock); - return TRUE; + return TRUE; } - else if (NULL != SwapConsole) + else if (NULL != SwapConsole) { - EnterCriticalSection(&ActiveConsoleLock); - if (SwapConsole != ActiveConsole) + EnterCriticalSection(&ActiveConsoleLock); + if (SwapConsole != ActiveConsole) { - /* first remove swapconsole from the list */ - SwapConsole->Prev->Next = SwapConsole->Next; - SwapConsole->Next->Prev = SwapConsole->Prev; - /* now insert before activeconsole */ - SwapConsole->Next = ActiveConsole; - SwapConsole->Prev = ActiveConsole->Prev; - ActiveConsole->Prev->Next = SwapConsole; - ActiveConsole->Prev = SwapConsole; + /* first remove swapconsole from the list */ + SwapConsole->Prev->Next = SwapConsole->Next; + SwapConsole->Next->Prev = SwapConsole->Prev; + /* now insert before activeconsole */ + SwapConsole->Next = ActiveConsole; + SwapConsole->Prev = ActiveConsole->Prev; + ActiveConsole->Prev->Next = SwapConsole; + ActiveConsole->Prev = SwapConsole; } - ActiveConsole = SwapConsole; - SwapConsole = NULL; - ConioDrawConsole(ActiveConsole); - LeaveCriticalSection(&ActiveConsoleLock); - return TRUE; + ActiveConsole = SwapConsole; + SwapConsole = NULL; + ConioDrawConsole(ActiveConsole); + LeaveCriticalSection(&ActiveConsoleLock); + return TRUE; } - else + else { - return FALSE; + return FALSE; } } diff --git a/subsystems/win32/csrss/win32csr/win32csr.h b/subsystems/win32/csrss/win32csr/win32csr.h index 111c27db80a..0417740984e 100644 --- a/subsystems/win32/csrss/win32csr/win32csr.h +++ b/subsystems/win32/csrss/win32csr/win32csr.h @@ -63,6 +63,10 @@ CSR_API(CsrVerifyHandle); CSR_API(CsrDuplicateHandle); CSR_API(CsrGetInputWaitHandle); +BOOL FASTCALL Win32CsrValidateBuffer(PCSRSS_PROCESS_DATA ProcessData, + PVOID Buffer, + SIZE_T NumElements, + SIZE_T ElementSize); NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc, PVOID Context); diff --git a/subsystems/win32/csrss/win32csr/win32csr.rbuild b/subsystems/win32/csrss/win32csr/win32csr.rbuild index 9b29166cf94..0764763980c 100644 --- a/subsystems/win32/csrss/win32csr/win32csr.rbuild +++ b/subsystems/win32/csrss/win32csr/win32csr.rbuild @@ -18,13 +18,16 @@ pseh w32csr.h alias.c - conio.c + coninput.c + conoutput.c + console.c desktopbg.c dllmain.c exitros.c guiconsole.c handle.c harderror.c + lineinput.c tuiconsole.c appswitch.c win32csr.rc diff --git a/subsystems/win32/win32k/include/class.h b/subsystems/win32/win32k/include/class.h index ac36f6b32ce..27b3baf1f83 100644 --- a/subsystems/win32/win32k/include/class.h +++ b/subsystems/win32/win32k/include/class.h @@ -65,11 +65,6 @@ UserUnregisterClass(IN PUNICODE_STRING ClassName, IN HINSTANCE hInstance, OUT PCLSMENUNAME pClassMenuName); -ULONG_PTR -UserGetClassLongPtr(IN PCLS Class, - IN INT Index, - IN BOOL Ansi); - RTL_ATOM IntGetClassAtom(IN PUNICODE_STRING ClassName, IN HINSTANCE hInstance OPTIONAL, @@ -77,6 +72,9 @@ IntGetClassAtom(IN PUNICODE_STRING ClassName, OUT PCLS *BaseClass OPTIONAL, OUT PCLS **Link OPTIONAL); +PCLS +IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance); + PCLS FASTCALL IntCreateClass(IN CONST WNDCLASSEXW* lpwcx, diff --git a/subsystems/win32/win32k/include/palette.h b/subsystems/win32/win32k/include/palette.h index bdef3d9ea9f..705409716dc 100644 --- a/subsystems/win32/win32k/include/palette.h +++ b/subsystems/win32/win32k/include/palette.h @@ -2,8 +2,6 @@ #include -#define NO_MAPPING - #define PALETTE_FIXED 0x0001 /* read-only colormap - have to use XAllocColor (if not virtual) */ #define PALETTE_VIRTUAL 0x0002 /* no mapping needed - pixel == pixel color */ @@ -79,9 +77,6 @@ BOOL INTERNAL_CALL PALETTE_Cleanup(PVOID ObjectBody); HPALETTE FASTCALL PALETTE_Init (VOID); VOID FASTCALL PALETTE_ValidateFlags (PALETTEENTRY* lpPalE, INT size); -#ifndef NO_MAPPING -INT APIENTRY PALETTE_SetMapping(PALOBJ* palPtr, UINT uStart, UINT uNum, BOOL mapOnly); -#endif INT FASTCALL PALETTE_ToPhysical (PDC dc, COLORREF color); INT FASTCALL PALETTE_GetObject(PPALETTE pGdiObject, INT cbCount, LPLOGBRUSH lpBuffer); diff --git a/subsystems/win32/win32k/include/timer.h b/subsystems/win32/win32k/include/timer.h index 8e5bce67c15..9b2b07f8c9d 100644 --- a/subsystems/win32/win32k/include/timer.h +++ b/subsystems/win32/win32k/include/timer.h @@ -23,7 +23,6 @@ typedef struct _TIMER #define TMRF_ONESHOT 0x0010 #define TMRF_WAITING 0x0020 #define TMRF_TIFROMWND 0x0040 -#define TMRF_DELETEPENDING 0x8000 extern PKTIMER MasterTimer; diff --git a/subsystems/win32/win32k/include/userfuncs.h b/subsystems/win32/win32k/include/userfuncs.h index 7ad47e625bc..d31e66faea9 100644 --- a/subsystems/win32/win32k/include/userfuncs.h +++ b/subsystems/win32/win32k/include/userfuncs.h @@ -122,15 +122,11 @@ co_DestroyThreadWindows(struct _ETHREAD *Thread); HWND FASTCALL UserGetShellWindow(VOID); -HWND FASTCALL UserGetWindow(HWND hWnd, UINT Relationship); - HDC FASTCALL UserGetDCEx(PWINDOW_OBJECT Window OPTIONAL, HANDLE ClipRegion, ULONG Flags); BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Wnd); -LONG FASTCALL UserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi); - PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type); /*************** MENU.C ***************/ diff --git a/subsystems/win32/win32k/include/window.h b/subsystems/win32/win32k/include/window.h index 90143244458..79a8df2d003 100644 --- a/subsystems/win32/win32k/include/window.h +++ b/subsystems/win32/win32k/include/window.h @@ -37,11 +37,8 @@ typedef struct _WINDOW_OBJECT struct _WINDOW_OBJECT* spwndChild; struct _WINDOW_OBJECT* spwndNext; struct _WINDOW_OBJECT* spwndPrev; - /* Handle to the parent window. */ struct _WINDOW_OBJECT* spwndParent; - /* Handle to the owner window. */ - HWND hOwner; // Use spwndOwner - + struct _WINDOW_OBJECT* spwndOwner; /* Scrollbar info */ PSBINFOEX pSBInfo; // convert to PSBINFO @@ -125,10 +122,6 @@ IntGetAncestor(PWINDOW_OBJECT Wnd, UINT Type); PWINDOW_OBJECT FASTCALL IntGetParent(PWINDOW_OBJECT Wnd); -PWINDOW_OBJECT FASTCALL -IntGetOwner(PWINDOW_OBJECT Wnd); - - INT FASTCALL IntGetWindowRgn(PWINDOW_OBJECT Window, HRGN hRgn); @@ -141,9 +134,6 @@ IntGetWindowInfo(PWINDOW_OBJECT WindowObject, PWINDOWINFO pwi); VOID FASTCALL IntGetWindowBorderMeasures(PWINDOW_OBJECT WindowObject, UINT *cx, UINT *cy); -BOOL FASTCALL -IntAnyPopup(VOID); - BOOL FASTCALL IntIsWindowInDestroy(PWINDOW_OBJECT Window); @@ -155,7 +145,7 @@ IntDefWindowProc( PWINDOW_OBJECT Window, UINT Msg, WPARAM wParam, LPARAM lParam, VOID FASTCALL IntNotifyWinEvent(DWORD, PWND, LONG, LONG); -PWND APIENTRY co_IntCreateWindowEx(DWORD,PUNICODE_STRING,PLARGE_STRING,DWORD,LONG,LONG,LONG,LONG,HWND,HMENU,HINSTANCE,LPVOID,DWORD,BOOL); +PWND FASTCALL co_UserCreateWindowEx(CREATESTRUCTW*, PUNICODE_STRING, PLARGE_STRING); WNDPROC FASTCALL IntGetWindowProc(PWND,BOOL); /* EOF */ diff --git a/subsystems/win32/win32k/include/winpos.h b/subsystems/win32/win32k/include/winpos.h index 9bb6cfffaba..7d14676e630 100644 --- a/subsystems/win32/win32k/include/winpos.h +++ b/subsystems/win32/win32k/include/winpos.h @@ -25,6 +25,8 @@ co_WinPosSetWindowPos(PWINDOW_OBJECT Wnd, HWND WndInsertAfter, INT x, INT y, INT INT cy, UINT flags); BOOLEAN FASTCALL co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd); +void FASTCALL +co_WinPosSendSizeMove(PWINDOW_OBJECT Window); USHORT FASTCALL co_WinPosWindowFromPoint(PWINDOW_OBJECT ScopeWin, PUSER_MESSAGE_QUEUE OnlyHitTests, POINT *WinPoint, PWINDOW_OBJECT* Window); diff --git a/subsystems/win32/win32k/ntuser/accelerator.c b/subsystems/win32/win32k/ntuser/accelerator.c index b59f1d1b7de..d963344af32 100644 --- a/subsystems/win32/win32k/ntuser/accelerator.c +++ b/subsystems/win32/win32k/ntuser/accelerator.c @@ -436,7 +436,7 @@ NtUserDestroyAcceleratorTable( if (Accel->Table != NULL) { - ExFreePool(Accel->Table); + ExFreePoolWithTag(Accel->Table, TAG_ACCEL); Accel->Table = NULL; } diff --git a/subsystems/win32/win32k/ntuser/callproc.c b/subsystems/win32/win32k/ntuser/callproc.c index dc8496dd431..f2298256d08 100644 --- a/subsystems/win32/win32k/ntuser/callproc.c +++ b/subsystems/win32/win32k/ntuser/callproc.c @@ -185,9 +185,7 @@ UserGetCPD( Example: If pWnd is created from Ansi and lpfnXxyz is assumed to be Ansi, caller will ask for Unicode Proc return Proc or CallProcData handle. - - This function should replaced NtUserGetClassLong and NtUserGetWindowLong. - */ +*/ ULONG_PTR APIENTRY NtUserGetCPD( diff --git a/subsystems/win32/win32k/ntuser/class.c b/subsystems/win32/win32k/ntuser/class.c index b24b26f4199..814aadb67dc 100644 --- a/subsystems/win32/win32k/ntuser/class.c +++ b/subsystems/win32/win32k/ntuser/class.c @@ -1207,6 +1207,57 @@ FoundClass: return Atom; } +PCLS +IntGetAndReferenceClass(PUNICODE_STRING ClassName, HINSTANCE hInstance) +{ + PCLS *ClassLink, Class = NULL; + RTL_ATOM ClassAtom; + PTHREADINFO pti; + + pti = PsGetCurrentThreadWin32Thread(); + + if ( !(pti->ppi->W32PF_flags & W32PF_CLASSESREGISTERED )) + { + UserRegisterSystemClasses(); + } + + /* Check the class. */ + + DPRINT("Class %wZ\n", ClassName); + + ClassAtom = IntGetClassAtom(ClassName, + hInstance, + pti->ppi, + &Class, + &ClassLink); + + if (ClassAtom == (RTL_ATOM)0) + { + if (IS_ATOM(ClassName->Buffer)) + { + DPRINT1("Class 0x%p not found\n", (DWORD_PTR) ClassName->Buffer); + } + else + { + DPRINT1("Class \"%wZ\" not found\n", ClassName); + } + + SetLastWin32Error(ERROR_CANNOT_FIND_WND_CLASS); + return NULL; + } + DPRINT("ClassAtom %x\n", ClassAtom); + Class = IntReferenceClass(Class, + ClassLink, + pti->rpdesk); + if (Class == NULL) + { + DPRINT1("Failed to reference window class!\n"); + return NULL; + } + + return Class; +} + RTL_ATOM UserRegisterClass(IN CONST WNDCLASSEXW* lpwcx, IN PUNICODE_STRING ClassName, @@ -1464,96 +1515,6 @@ UserGetClassName(IN PCLS Class, return Ret; } -ULONG_PTR -UserGetClassLongPtr(IN PCLS Class, - IN INT Index, - IN BOOL Ansi) -{ - ULONG_PTR Ret = 0; - - if (Index >= 0) - { - PULONG_PTR Data; - - TRACE("GetClassLong(%d)\n", Index); - if (Index + sizeof(ULONG_PTR) < Index || - Index + sizeof(ULONG_PTR) > Class->cbclsExtra) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } - - Data = (PULONG_PTR)((ULONG_PTR)(Class + 1) + Index); - - /* FIXME - Data might be a unaligned pointer! Might be a problem on - certain architectures, maybe using RtlCopyMemory is a - better choice for those architectures! */ - - TRACE("Result: %x\n", Ret); - return *Data; - } - - switch (Index) - { - case GCL_CBWNDEXTRA: - Ret = (ULONG_PTR)Class->cbwndExtra; - break; - - case GCL_CBCLSEXTRA: - Ret = (ULONG_PTR)Class->cbclsExtra; - break; - - case GCLP_HBRBACKGROUND: - Ret = (ULONG_PTR)Class->hbrBackground; - break; - - case GCLP_HCURSOR: - /* FIXME - get handle from pointer to CURSOR object */ - Ret = (ULONG_PTR)Class->hCursor; - break; - - case GCLP_HICON: - /* FIXME - get handle from pointer to ICON object */ - Ret = (ULONG_PTR)Class->hIcon; - break; - - case GCLP_HICONSM: - /* FIXME - get handle from pointer to ICON object */ - Ret = (ULONG_PTR)Class->hIconSm; - break; - - case GCLP_HMODULE: - Ret = (ULONG_PTR)Class->hModule; - break; - - case GCLP_MENUNAME: - /* NOTE: Returns pointer in kernel heap! */ - if (Ansi) - Ret = (ULONG_PTR)Class->lpszClientAnsiMenuName; - else - Ret = (ULONG_PTR)Class->lpszClientUnicodeMenuName; - break; - - case GCL_STYLE: - Ret = (ULONG_PTR)Class->style; - break; - - case GCLP_WNDPROC: - Ret = (ULONG_PTR)IntGetClassWndProc(Class, Ansi); - break; - - case GCW_ATOM: - Ret = (ULONG_PTR)Class->atomClassName; - break; - - default: - SetLastWin32Error(ERROR_INVALID_INDEX); - break; - } - - return Ret; -} - static BOOL IntSetClassMenuName(IN PCLS Class, IN PUNICODE_STRING MenuName) @@ -2139,45 +2100,6 @@ InvalidParameter: return Ret; } -ULONG_PTR APIENTRY -NtUserGetClassLong(IN HWND hWnd, - IN INT Offset, - IN BOOL Ansi) -{ - PWINDOW_OBJECT Window; - ULONG_PTR Ret = 0; - - if (Offset != GCLP_WNDPROC) - { - UserEnterShared(); - } - else - { - UserEnterExclusive(); - } - - Window = UserGetWindowObject(hWnd); - if (Window != NULL) - { - Ret = UserGetClassLongPtr(Window->Wnd->pcls, - Offset, - Ansi); - - if ( Ret != 0 && - Offset == GCLP_MENUNAME && - Window->Wnd->pcls->MenuNameIsString) - { - Ret = (ULONG_PTR)UserHeapAddressToUser((PVOID)Ret); - } - } - - UserLeave(); - - return Ret; -} - - - ULONG_PTR APIENTRY NtUserSetClassLong(HWND hWnd, INT Offset, diff --git a/subsystems/win32/win32k/ntuser/defwnd.c b/subsystems/win32/win32k/ntuser/defwnd.c index 6cf4fd010c6..afc60e852ae 100644 --- a/subsystems/win32/win32k/ntuser/defwnd.c +++ b/subsystems/win32/win32k/ntuser/defwnd.c @@ -129,7 +129,7 @@ IntDefWindowProc( { if ((Wnd->style & WS_VISIBLE) && wParam) break; if (!(Wnd->style & WS_VISIBLE) && !wParam) break; - if (!Window->hOwner) break; + if (!Window->spwndOwner) break; if (LOWORD(lParam)) { if (wParam) diff --git a/subsystems/win32/win32k/ntuser/desktop.c b/subsystems/win32/win32k/ntuser/desktop.c index 075d24ed832..65472253d15 100644 --- a/subsystems/win32/win32k/ntuser/desktop.c +++ b/subsystems/win32/win32k/ntuser/desktop.c @@ -882,6 +882,7 @@ NtUserCreateDesktop( UNICODE_STRING ClassName, MenuName; LARGE_STRING WindowName; PWND pWnd = NULL; + CREATESTRUCTW Cs; DECLARE_RETURN(HDESK); DPRINT("Enter NtUserCreateDesktop: %wZ\n", lpszDesktopName); @@ -1076,20 +1077,14 @@ NtUserCreateDesktop( RtlZeroMemory(&MenuName, sizeof(MenuName)); RtlZeroMemory(&WindowName, sizeof(WindowName)); - pWnd = co_IntCreateWindowEx( 0, - &ClassName, - &WindowName, - (WS_POPUP|WS_CLIPCHILDREN), - 0, - 0, - 100, - 100, - NULL, - NULL, - hModClient, - NULL, - 0, - TRUE); + RtlZeroMemory(&Cs, sizeof(Cs)); + Cs.cx = Cs.cy = 100; + Cs.style = WS_POPUP|WS_CLIPCHILDREN; + Cs.hInstance = hModClient; + Cs.lpszName = (LPCWSTR) &WindowName; + Cs.lpszClass = (LPCWSTR) &ClassName; + + pWnd = co_UserCreateWindowEx(&Cs, &ClassName, &WindowName); if (!pWnd) { DPRINT1("Failed to create Message window handle\n"); @@ -1425,7 +1420,7 @@ NtUserPaintDesktop(HDC hDC) RETURN(FALSE); } - DesktopBrush = (HBRUSH)UserGetClassLongPtr(WndDesktop->Wnd->pcls, GCL_HBRBACKGROUND, FALSE); + DesktopBrush = (HBRUSH)WndDesktop->Wnd->pcls->hbrBackground; /* diff --git a/subsystems/win32/win32k/ntuser/focus.c b/subsystems/win32/win32k/ntuser/focus.c index ee9c2ff93ad..59f364ed548 100644 --- a/subsystems/win32/win32k/ntuser/focus.c +++ b/subsystems/win32/win32k/ntuser/focus.c @@ -51,12 +51,14 @@ IntGetThreadFocusWindow(VOID) VOID FASTCALL co_IntSendDeactivateMessages(HWND hWndPrev, HWND hWnd) { - if (hWndPrev) + PWINDOW_OBJECT WndPrev ; + + if (hWndPrev && (WndPrev = UserGetWindowObject(hWndPrev))) { co_IntSendMessageNoWait(hWndPrev, WM_NCACTIVATE, FALSE, 0); co_IntSendMessageNoWait(hWndPrev, WM_ACTIVATE, - MAKEWPARAM(WA_INACTIVE, UserGetWindowLong(hWndPrev, GWL_STYLE, FALSE) & WS_MINIMIZE), - (LPARAM)hWnd); + MAKEWPARAM(WA_INACTIVE, WndPrev->Wnd->style & WS_MINIMIZE), + (LPARAM)hWnd); } } @@ -83,11 +85,11 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) 0); } - if (UserGetWindow(hWnd, GW_HWNDPREV) != NULL) + if (Window->spwndPrev != NULL) co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOSENDCHANGING); - if (!IntGetOwner(Window) && !IntGetParent(Window)) + if (!Window->spwndOwner && !IntGetParent(Window)) { co_IntShellHookNotify(HSHELL_WINDOWACTIVATED, (LPARAM) hWnd); } @@ -153,7 +155,7 @@ co_IntSendActivateMessages(HWND hWndPrev, HWND hWnd, BOOL MouseActivate) /* FIXME: WA_CLICKACTIVE */ co_IntSendMessageNoWait(hWnd, WM_ACTIVATE, MAKEWPARAM(MouseActivate ? WA_CLICKACTIVE : WA_ACTIVE, - UserGetWindowLong(hWnd, GWL_STYLE, FALSE) & WS_MINIMIZE), + Window->Wnd->style & WS_MINIMIZE), (LPARAM)hWndPrev); } } @@ -184,7 +186,7 @@ IntFindChildWindowToOwner(PWINDOW_OBJECT Root, PWINDOW_OBJECT Owner) for(Child = Root->spwndChild; Child; Child = Child->spwndNext) { - OwnerWnd = UserGetWindowObject(Child->hOwner); + OwnerWnd = Child->spwndOwner; if(!OwnerWnd) continue; diff --git a/subsystems/win32/win32k/ntuser/kbdlayout.c b/subsystems/win32/win32k/ntuser/kbdlayout.c index fc45c63be25..a6ac6e68bfb 100644 --- a/subsystems/win32/win32k/ntuser/kbdlayout.c +++ b/subsystems/win32/win32k/ntuser/kbdlayout.c @@ -196,7 +196,7 @@ static PKBL UserLoadDllAndCreateKbl(DWORD LocaleId) ULONG hKl; LANGID langid; - NewKbl = ExAllocatePool(PagedPool, sizeof(KBL)); + NewKbl = ExAllocatePoolWithTag(PagedPool, sizeof(KBL), TAG_KEYBOARD); if(!NewKbl) { @@ -209,7 +209,7 @@ static PKBL UserLoadDllAndCreateKbl(DWORD LocaleId) if(!UserLoadKbdDll(NewKbl->Name, &NewKbl->hModule, &NewKbl->KBTables)) { DPRINT("%s: failed to load %x dll!\n", __FUNCTION__, LocaleId); - ExFreePool(NewKbl); + ExFreePoolWithTag(NewKbl, TAG_KEYBOARD); return NULL; } @@ -398,7 +398,7 @@ BOOL UserUnloadKbl(PKBL pKbl) //Unload the layout EngUnloadImage(pKbl->hModule); RemoveEntryList(&pKbl->List); - ExFreePool(pKbl); + ExFreePoolWithTag(pKbl, TAG_KEYBOARD); } return TRUE; diff --git a/subsystems/win32/win32k/ntuser/message.c b/subsystems/win32/win32k/ntuser/message.c index 4ccbc7ea401..0516dd7401f 100644 --- a/subsystems/win32/win32k/ntuser/message.c +++ b/subsystems/win32/win32k/ntuser/message.c @@ -145,7 +145,7 @@ MsgMemorySize(PMSGMEMORY MsgMemoryEntry, WPARAM wParam, LPARAM lParam) break; default: - assert(FALSE); + ASSERT(FALSE); Size = 0; break; } @@ -1629,12 +1629,11 @@ co_IntSendMessageWithCallBack( HWND hWnd, IntCallWndProcRet( Window, hWnd, Msg, wParam, lParam, (LRESULT *)uResult); - if (Window->pti->MessageQueue == Win32Thread->MessageQueue) + if ((Window->pti->MessageQueue == Win32Thread->MessageQueue) && (CompletionCallback == NULL)) { if (! NT_SUCCESS(UnpackParam(lParamPacked, Msg, wParam, lParam, FALSE))) { DPRINT1("Failed to unpack message parameters\n"); - RETURN(TRUE); } RETURN(TRUE); } @@ -2626,6 +2625,18 @@ NtUserMessageCall( } break; case FNID_SENDMESSAGECALLBACK: + { + PCALL_BACK_INFO CallBackInfo = (PCALL_BACK_INFO)ResultInfo; + + if (!CallBackInfo) + break; + + if (!co_IntSendMessageWithCallBack(hWnd, Msg, wParam, lParam, + CallBackInfo->CallBack, CallBackInfo->Context, NULL)) + { + DPRINT1("Callback failure!\n"); + } + } break; // CallNextHook bypass. case FNID_CALLWNDPROC: diff --git a/subsystems/win32/win32k/ntuser/msgqueue.c b/subsystems/win32/win32k/ntuser/msgqueue.c index fe1d9a80af7..33b8119a0d2 100644 --- a/subsystems/win32/win32k/ntuser/msgqueue.c +++ b/subsystems/win32/win32k/ntuser/msgqueue.c @@ -894,7 +894,6 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) PLIST_ENTRY Entry; LRESULT Result; BOOL SenderReturned; - PUSER_SENT_MESSAGE_NOTIFY NotifyMessage; if (IsListEmpty(&MessageQueue->SentMessagesListHead)) { @@ -965,26 +964,16 @@ co_MsqDispatchOneSentMessage(PUSER_MESSAGE_QUEUE MessageQueue) KeSetEvent(Message->CompletionEvent, IO_NO_INCREMENT, FALSE); } - /* Notify the sender if they specified a callback. */ + /* Call the callback if the message was sent with SendMessageCallback */ if (!SenderReturned && Message->CompletionCallback != NULL) { - if(!(NotifyMessage = ExAllocatePoolWithTag(NonPagedPool, - sizeof(USER_SENT_MESSAGE_NOTIFY), TAG_USRMSG))) - { - DPRINT1("MsqDispatchOneSentMessage(): Not enough memory to create a callback notify message\n"); - goto Notified; - } - NotifyMessage->CompletionCallback = - Message->CompletionCallback; - NotifyMessage->CompletionCallbackContext = - Message->CompletionCallbackContext; - NotifyMessage->Result = Result; - NotifyMessage->hWnd = Message->Msg.hwnd; - NotifyMessage->Msg = Message->Msg.message; - MsqSendNotifyMessage(Message->SenderQueue, NotifyMessage); + co_IntCallSentMessageCallback(Message->CompletionCallback, + Message->Msg.hwnd, + Message->Msg.message, + Message->CompletionCallbackContext, + Result); } -Notified: /* Only if it is not a no wait message */ if (!(Message->HookMessage & MSQ_SENTNOWAIT)) @@ -994,7 +983,7 @@ Notified: } /* free the message */ - ExFreePool(Message); + ExFreePoolWithTag(Message, TAG_USRMSG); return(TRUE); } @@ -1071,7 +1060,7 @@ MsqRemoveWindowMessagesFromQueue(PVOID pWindow) } /* free the message */ - ExFreePool(SentMessage); + ExFreePoolWithTag(SentMessage, TAG_USRMSG); CurrentEntry = MessageQueue->SentMessagesListHead.Flink; } diff --git a/subsystems/win32/win32k/ntuser/ntuser.c b/subsystems/win32/win32k/ntuser/ntuser.c index b7949e3be94..51889c3a7e6 100644 --- a/subsystems/win32/win32k/ntuser/ntuser.c +++ b/subsystems/win32/win32k/ntuser/ntuser.c @@ -117,6 +117,8 @@ UserInitialize( NtUserUpdatePerUserSystemParameters(0, TRUE); + CsrInit(); + return STATUS_SUCCESS; } diff --git a/subsystems/win32/win32k/ntuser/simplecall.c b/subsystems/win32/win32k/ntuser/simplecall.c index cdd4a22a6b1..f46a75da2aa 100644 --- a/subsystems/win32/win32k/ntuser/simplecall.c +++ b/subsystems/win32/win32k/ntuser/simplecall.c @@ -110,14 +110,6 @@ NtUserCallNoParam(DWORD Routine) Result = (DWORD_PTR)MsqGetMessageExtraInfo(); break; - case NOPARAM_ROUTINE_ANYPOPUP: - Result = (DWORD_PTR)IntAnyPopup(); - break; - - case NOPARAM_ROUTINE_CSRSS_INITIALIZED: - Result = (DWORD_PTR)CsrInit(); - break; - case NOPARAM_ROUTINE_MSQCLEARWAKEMASK: RETURN( (DWORD_PTR)IntMsqClearWakeMask()); @@ -525,7 +517,7 @@ NtUserCallHwndLock( SWP_NOZORDER| SWP_NOACTIVATE| SWP_FRAMECHANGED ); - if (!IntGetOwner(Window) && !IntGetParent(Window)) + if (!Window->spwndOwner && !IntGetParent(Window)) { co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd); } diff --git a/subsystems/win32/win32k/ntuser/timer.c b/subsystems/win32/win32k/ntuser/timer.c index e178241f1ea..de8caeaafed 100644 --- a/subsystems/win32/win32k/ntuser/timer.c +++ b/subsystems/win32/win32k/ntuser/timer.c @@ -24,13 +24,14 @@ static LONG TimeLast = 0; #define MAX_ELAPSE_TIME 0x7FFFFFFF /* Windows 2000 has room for 32768 window-less timers */ -#define NUM_WINDOW_LESS_TIMERS 1024 +#define NUM_WINDOW_LESS_TIMERS 32768 static FAST_MUTEX Mutex; static RTL_BITMAP WindowLessTimersBitMap; static PVOID WindowLessTimersBitMapBuffer; static ULONG HintIndex = 0; +ERESOURCE TimerLock; #define IntLockWindowlessTimerBitmap() \ ExEnterCriticalRegionAndAcquireFastMutexUnsafe(&Mutex) @@ -38,6 +39,19 @@ static ULONG HintIndex = 0; #define IntUnlockWindowlessTimerBitmap() \ ExReleaseFastMutexUnsafeAndLeaveCriticalRegion(&Mutex) +#define TimerEnterExclusive() \ +{ \ + KeEnterCriticalRegion(); \ + ExAcquireResourceExclusiveLite(&TimerLock, TRUE); \ +} + +#define TimerLeave() \ +{ \ + ExReleaseResourceLite(&TimerLock); \ + KeLeaveCriticalRegion(); \ +} + + /* FUNCTIONS *****************************************************************/ static PTIMER @@ -49,14 +63,23 @@ CreateTimer(VOID) if (!FirstpTmr) { + ExInitializeResourceLite(&TimerLock); FirstpTmr = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, sizeof(TIMER)); - if (FirstpTmr) InitializeListHead(&FirstpTmr->ptmrList); + if (FirstpTmr) + { + FirstpTmr->head.h = Handle; + InitializeListHead(&FirstpTmr->ptmrList); + } Ret = FirstpTmr; } else { Ret = UserCreateObject(gHandleTable, NULL, &Handle, otTimer, sizeof(TIMER)); - if (Ret) InsertTailList(&FirstpTmr->ptmrList, &Ret->ptmrList); + if (Ret) + { + Ret->head.h = Handle; + InsertTailList(&FirstpTmr->ptmrList, &Ret->ptmrList); + } } return Ret; } @@ -66,13 +89,24 @@ BOOL FASTCALL RemoveTimer(PTIMER pTmr) { + BOOL Ret = FALSE; if (pTmr) { /* Set the flag, it will be removed when ready */ - pTmr->flags |= TMRF_DELETEPENDING; - return TRUE; + RemoveEntryList(&pTmr->ptmrList); + if ((pTmr->pWnd == NULL) && (!(pTmr->flags & TMRF_SYSTEM))) + { + DPRINT("Clearing Bit %d)\n", pTmr->nID); + IntLockWindowlessTimerBitmap(); + RtlClearBit(&WindowLessTimersBitMap, pTmr->nID); + IntUnlockWindowlessTimerBitmap(); + } + UserDereferenceObject(pTmr); + Ret = UserDeleteObject( UserHMGetHandle(pTmr), otTimer); } - return FALSE; + if (!Ret) DPRINT1("Warning unable to delete timer\n"); + + return Ret; } PTIMER @@ -84,7 +118,7 @@ FindTimer(PWINDOW_OBJECT Window, { PLIST_ENTRY pLE; PTIMER pTmr = FirstpTmr, RetTmr = NULL; - KeEnterCriticalRegion(); + TimerEnterExclusive(); do { if (!pTmr) break; @@ -104,7 +138,7 @@ FindTimer(PWINDOW_OBJECT Window, pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); - KeLeaveCriticalRegion(); + TimerLeave(); return RetTmr; } @@ -115,7 +149,7 @@ FindSystemTimer(PMSG pMsg) { PLIST_ENTRY pLE; PTIMER pTmr = FirstpTmr; - KeEnterCriticalRegion(); + TimerEnterExclusive(); do { if (!pTmr) break; @@ -127,7 +161,7 @@ FindSystemTimer(PMSG pMsg) pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); - KeLeaveCriticalRegion(); + TimerLeave(); return pTmr; } @@ -144,7 +178,7 @@ ValidateTimerCallback(PTHREADINFO pti, if (!pTmr) return FALSE; - KeEnterCriticalRegion(); + TimerEnterExclusive(); do { if ( (lParam == (LPARAM)pTmr->pfn) && @@ -155,7 +189,7 @@ ValidateTimerCallback(PTHREADINFO pti, pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); - KeLeaveCriticalRegion(); + TimerLeave(); if (!pTmr) return FALSE; @@ -197,9 +231,15 @@ IntSetTimer( PWINDOW_OBJECT Window, Elapse = 10; } - if ((Window == NULL) && (!(Type & TMRF_SYSTEM))) + if ((Window) && (IDEvent == 0)) + IDEvent = 1; + + pTmr = FindTimer(Window, IDEvent, Type, FALSE); + + if ((!pTmr) && (Window == NULL) && (!(Type & TMRF_SYSTEM))) { IntLockWindowlessTimerBitmap(); + IDEvent = RtlFindClearBitsAndSet(&WindowLessTimersBitMap, 1, HintIndex); if (IDEvent == (UINT_PTR) -1) @@ -210,26 +250,26 @@ IntSetTimer( PWINDOW_OBJECT Window, return 0; } - HintIndex = ++IDEvent; - IntUnlockWindowlessTimerBitmap(); Ret = IDEvent; + //HintIndex = IDEvent + 1; + IntUnlockWindowlessTimerBitmap(); } - pTmr = FindTimer(Window, IDEvent, Type, FALSE); - if ((!pTmr) || (pTmr->flags & TMRF_DELETEPENDING)) + if (!pTmr) { pTmr = CreateTimer(); if (!pTmr) return 0; - if (Window && (Type & TMRF_TIFROMWND)) - pTmr->pti = Window->pti->pEThread->Tcb.Win32Thread; - else - { - if (Type & TMRF_RIT) - pTmr->pti = ptiRawInput; - else - pTmr->pti = PsGetCurrentThreadWin32Thread(); + if (Window && (Type & TMRF_TIFROMWND)) + pTmr->pti = Window->pti->pEThread->Tcb.Win32Thread; + else + { + if (Type & TMRF_RIT) + pTmr->pti = ptiRawInput; + else + pTmr->pti = PsGetCurrentThreadWin32Thread(); } + pTmr->pWnd = Window; pTmr->cmsCountdown = Elapse; pTmr->cmsRate = Elapse; @@ -237,9 +277,11 @@ IntSetTimer( PWINDOW_OBJECT Window, pTmr->nID = IDEvent; pTmr->flags = Type|TMRF_INIT; // Set timer to Init mode. } - - pTmr->cmsCountdown = Elapse; - pTmr->cmsRate = Elapse; + else + { + pTmr->cmsCountdown = Elapse; + pTmr->cmsRate = Elapse; + } ASSERT(MasterTimer != NULL); // Start the timer thread! @@ -302,7 +344,7 @@ PostTimerMessages(PWINDOW_OBJECT Window) pti = PsGetCurrentThreadWin32Thread(); ThreadQueue = pti->MessageQueue; - KeEnterCriticalRegion(); + TimerEnterExclusive(); do { @@ -325,7 +367,7 @@ PostTimerMessages(PWINDOW_OBJECT Window) pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); - KeLeaveCriticalRegion(); + TimerLeave(); return Hit; } @@ -342,7 +384,7 @@ ProcessTimers(VOID) if (!pTmr) return; - UserEnterExclusive(); + TimerEnterExclusive(); KeQueryTickCount(&TickCount); Time = MsqCalculateMessageTime(&TickCount); @@ -389,25 +431,7 @@ ProcessTimers(VOID) } } } - if (pTmr->flags & TMRF_DELETEPENDING) - { - DPRINT("Removing Timer %x from List\n", pTmr); - - /* FIXME: Fix this!!!! */ -/* - if (!pTmr->pWnd) - { - DPRINT1("Clearing Bits for WindowLess Timer\n"); - IntLockWindowlessTimerBitmap(); - RtlSetBits(&WindowLessTimersBitMap, pTmr->nID, 1); - IntUnlockWindowlessTimerBitmap(); - } -*/ - RemoveEntryList(&pTmr->ptmrList); - UserDeleteObject( UserHMGetHandle(pTmr), otTimer); - } - else - pTmr->cmsCountdown = pTmr->cmsRate; + pTmr->cmsCountdown = pTmr->cmsRate; } else pTmr->cmsCountdown -= Time - TimeLast; @@ -423,7 +447,7 @@ ProcessTimers(VOID) TimeLast = Time; - UserLeave(); + TimerLeave(); DPRINT("TimerCount = %d\n", TimerCount); } @@ -533,21 +557,19 @@ DestroyTimersForWindow(PTHREADINFO pti, PWINDOW_OBJECT Window) if ((FirstpTmr == NULL) || (Window == NULL)) return FALSE; - KeEnterCriticalRegion(); + TimerEnterExclusive(); do { if ((pTmr) && (pTmr->pti == pti) && (pTmr->pWnd == Window)) { - pTmr->flags &= ~TMRF_READY; - pTmr->flags |= TMRF_DELETEPENDING; - TimersRemoved = TRUE; + TimersRemoved = RemoveTimer(pTmr); } pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); - KeLeaveCriticalRegion(); + TimerLeave(); return TimersRemoved; } @@ -562,21 +584,19 @@ DestroyTimersForThread(PTHREADINFO pti) if (FirstpTmr == NULL) return FALSE; - KeEnterCriticalRegion(); + TimerEnterExclusive(); do { if ((pTmr) && (pTmr->pti == pti)) { - pTmr->flags &= ~TMRF_READY; - pTmr->flags |= TMRF_DELETEPENDING; - TimersRemoved = TRUE; + TimersRemoved = RemoveTimer(pTmr); } pLE = pTmr->ptmrList.Flink; pTmr = CONTAINING_RECORD(pLE, TIMER, ptmrList); } while (pTmr != FirstpTmr); - KeLeaveCriticalRegion(); + TimerLeave(); return TimersRemoved; } @@ -588,8 +608,8 @@ IntKillTimer(PWINDOW_OBJECT Window, UINT_PTR IDEvent, BOOL SystemTimer) DPRINT("IntKillTimer Window %x id %p systemtimer %s\n", Window, IDEvent, SystemTimer ? "TRUE" : "FALSE"); - if (IDEvent == 0) - return FALSE; + if ((Window) && (IDEvent == 0)) + IDEvent = 1; pTmr = FindTimer(Window, IDEvent, SystemTimer ? TMRF_SYSTEM : 0, TRUE); return pTmr ? TRUE : FALSE; @@ -687,16 +707,19 @@ NtUserSetTimer TIMERPROC lpTimerFunc ) { + PWINDOW_OBJECT Window; DECLARE_RETURN(UINT_PTR); DPRINT("Enter NtUserSetTimer\n"); UserEnterExclusive(); + Window = UserGetWindowObject(hWnd); + UserLeave(); - RETURN(IntSetTimer(UserGetWindowObject(hWnd), nIDEvent, uElapse, lpTimerFunc, 0)); + RETURN(IntSetTimer(Window, nIDEvent, uElapse, lpTimerFunc, TMRF_TIFROMWND)); CLEANUP: DPRINT("Leave NtUserSetTimer, ret=%i\n", _ret_); - UserLeave(); + END_CLEANUP; } @@ -714,14 +737,13 @@ NtUserKillTimer DPRINT("Enter NtUserKillTimer\n"); UserEnterExclusive(); - Window = UserGetWindowObject(hWnd); + UserLeave(); RETURN(IntKillTimer(Window, uIDEvent, FALSE)); CLEANUP: DPRINT("Leave NtUserKillTimer, ret=%i\n", _ret_); - UserLeave(); END_CLEANUP; } @@ -738,14 +760,12 @@ NtUserSetSystemTimer( DECLARE_RETURN(UINT_PTR); DPRINT("Enter NtUserSetSystemTimer\n"); - UserEnterExclusive(); // This is wrong, lpTimerFunc is NULL! RETURN(IntSetTimer(UserGetWindowObject(hWnd), nIDEvent, uElapse, lpTimerFunc, TMRF_SYSTEM)); CLEANUP: DPRINT("Leave NtUserSetSystemTimer, ret=%i\n", _ret_); - UserLeave(); END_CLEANUP; } diff --git a/subsystems/win32/win32k/ntuser/window.c b/subsystems/win32/win32k/ntuser/window.c index 6c17e8cb931..5379fcbc3ed 100644 --- a/subsystems/win32/win32k/ntuser/window.c +++ b/subsystems/win32/win32k/ntuser/window.c @@ -96,6 +96,8 @@ PWINDOW_OBJECT FASTCALL IntGetWindowObject(HWND hWnd) ASSERT(Window->head.cLockObj >= 0); Window->head.cLockObj++; + + ASSERT(Window->Wnd); } return Window; } @@ -130,6 +132,9 @@ PWINDOW_OBJECT FASTCALL UserGetWindowObject(HWND hWnd) } ASSERT(Window->head.cLockObj >= 0); + + ASSERT(Window->Wnd); + return Window; } @@ -163,20 +168,12 @@ IntIsWindow(HWND hWnd) -/* - Caller must NOT dereference retval! - But if caller want the returned value to persist spanning a co_ call, - it must reference the value (because the owner is not garanteed to - exist just because the owned window exist)! -*/ PWINDOW_OBJECT FASTCALL IntGetParent(PWINDOW_OBJECT Wnd) { - if (!Wnd->Wnd) return NULL; - if (Wnd->Wnd->style & WS_POPUP) { - return UserGetWindowObject(Wnd->hOwner); + return Wnd->spwndOwner; } else if (Wnd->Wnd->style & WS_CHILD) { @@ -187,20 +184,6 @@ IntGetParent(PWINDOW_OBJECT Wnd) } -/* - Caller must NOT dereference retval! - But if caller want the returned value to persist spanning a co_ call, - it must reference the value (because the owner is not garanteed to - exist just because the owned window exist)! -*/ -PWINDOW_OBJECT FASTCALL -IntGetOwner(PWINDOW_OBJECT Wnd) -{ - return UserGetWindowObject(Wnd->hOwner); -} - - - /* * IntWinListChildren * @@ -265,7 +248,7 @@ static void IntSendDestroyMsg(HWND hWnd) // USER_REFERENCE_ENTRY Ref; // UserRefObjectCo(Window, &Ref); - if (!IntGetOwner(Window) && !IntGetParent(Window)) + if (!Window->spwndOwner && !IntGetParent(Window)) { co_IntShellHookNotify(HSHELL_WINDOWDESTROYED, (LPARAM) hWnd); } @@ -1091,26 +1074,19 @@ IntSetOwner(HWND hWnd, HWND hWndNewOwner) if(!Wnd) return NULL; - WndOldOwner = IntGetWindowObject(Wnd->hOwner); - if (WndOldOwner) - { - ret = WndOldOwner->hSelf; - UserDereferenceObject(WndOldOwner); - } - else - { - ret = 0; - } + WndOldOwner = Wnd->spwndOwner; + + ret = WndOldOwner ? WndOldOwner->hSelf : 0; if((WndNewOwner = UserGetWindowObject(hWndNewOwner))) { - Wnd->hOwner = hWndNewOwner; - Wnd->Wnd->spwndOwner = WndNewOwner->Wnd; + Wnd->spwndOwner= WndNewOwner; + Wnd->Wnd->spwndOwner = WndNewOwner->Wnd; } else { - Wnd->hOwner = NULL; - Wnd->Wnd->spwndOwner = NULL; + Wnd->spwndOwner = NULL; + Wnd->Wnd->spwndOwner = NULL; } UserDereferenceObject(Wnd); @@ -1279,31 +1255,6 @@ IntUnlinkWindow(PWINDOW_OBJECT Wnd) Wnd->spwndPrev = Wnd->spwndNext = Wnd->spwndParent = NULL; } -BOOL FASTCALL -IntAnyPopup(VOID) -{ - PWINDOW_OBJECT Window, Child; - - if(!(Window = UserGetWindowObject(IntGetDesktopWindow()))) - { - return FALSE; - } - - for(Child = Window->spwndChild; Child; Child = Child->spwndNext) - { - if(Child->hOwner && Child->Wnd->style & WS_VISIBLE) - { - /* - * The desktop has a popup window if one of them has - * an owner window and is visible - */ - return TRUE; - } - } - - return FALSE; -} - BOOL FASTCALL IntIsWindowInDestroy(PWINDOW_OBJECT Window) { @@ -1511,7 +1462,7 @@ NtUserBuildHwndList( Window = CONTAINING_RECORD(Current, WINDOW_OBJECT, ThreadListEntry); ASSERT(Window); - if(bChildren || Window->hOwner != NULL) + if(bChildren || Window->spwndOwner != NULL) { if(dwCount < *pBufSize && pWnd) { @@ -1603,244 +1554,125 @@ NtUserChildWindowFromPointEx(HWND hwndParent, return Ret; } - -/* - * calculates the default position of a window - */ -BOOL FASTCALL -IntCalcDefPosSize(PWINDOW_OBJECT Parent, RECTL *rc, BOOL IncPos) +void FASTCALL +IntFixWindowCoordinates(CREATESTRUCTW* Cs, PWINDOW_OBJECT ParentWindow, DWORD* dwShowMode) { - SIZE Sz; - PMONITOR pMonitor; - POINT Pos = {0, 0}; - - pMonitor = IntGetPrimaryMonitor(); +#define IS_DEFAULT(x) ((x) == CW_USEDEFAULT || (x) == (SHORT)0x8000) - if(Parent != NULL) + /* default positioning for overlapped windows */ + if(!(Cs->style & (WS_POPUP | WS_CHILD))) { - RECTL_bIntersectRect(rc, rc, &pMonitor->rcMonitor); + RECTL rc, WorkArea; + PRTL_USER_PROCESS_PARAMETERS ProcessParams; - if(IncPos) + UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0); + + rc = WorkArea; + ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; + + if (IS_DEFAULT(Cs->x)) { - Pos.x = pMonitor->cWndStack * (UserGetSystemMetrics(SM_CXSIZE) + UserGetSystemMetrics(SM_CXFRAME)); - Pos.y = pMonitor->cWndStack * (UserGetSystemMetrics(SM_CYSIZE) + UserGetSystemMetrics(SM_CYFRAME)); - if (Pos.x > ((rc->right - rc->left) / 4) || - Pos.y > ((rc->bottom - rc->top) / 4)) - { - /* reset counter and position */ - Pos.x = 0; - Pos.y = 0; - pMonitor->cWndStack = 0; - } - pMonitor->cWndStack++; + if (!IS_DEFAULT(Cs->y)) *dwShowMode = Cs->y; + + if(ProcessParams->WindowFlags & STARTF_USEPOSITION) + { + Cs->x = ProcessParams->StartingX; + Cs->y = ProcessParams->StartingY; + } + else + { + Cs->x = WorkArea.left; + Cs->y = WorkArea.top; + } + } + + if (IS_DEFAULT(Cs->cx)) + { + if (ProcessParams->WindowFlags & STARTF_USEPOSITION) + { + Cs->cx = ProcessParams->CountX; + Cs->cy = ProcessParams->CountY; + } + else + { + Cs->cx = (WorkArea.right - WorkArea.left) * 3 / 4 - Cs->x; + Cs->cy = (WorkArea.bottom - WorkArea.top) * 3 / 4 - Cs->y; + } + } + /* neither x nor cx are default. Check the y values . + * In the trace we see Outlook and Outlook Express using + * cy set to CW_USEDEFAULT when opening the address book. + */ + else if (IS_DEFAULT(Cs->cy)) + { + DPRINT("Strange use of CW_USEDEFAULT in nHeight\n"); + Cs->cy = (WorkArea.bottom - WorkArea.top) * 3 / 4 - Cs->y; } - Pos.x += rc->left; - Pos.y += rc->top; } else { - Pos.x = rc->left; - Pos.y = rc->top; + /* if CW_USEDEFAULT is set for non-overlapped windows, both values are set to zero */ + if(IS_DEFAULT(Cs->x)) + { + Cs->x = 0; + Cs->y = 0; + } + if(IS_DEFAULT(Cs->cx)) + { + Cs->cx = 0; + Cs->cy = 0; + } } - Sz.cx = EngMulDiv(rc->right - rc->left, 3, 4); - Sz.cy = EngMulDiv(rc->bottom - rc->top, 3, 4); - - rc->left = Pos.x; - rc->top = Pos.y; - rc->right = rc->left + Sz.cx; - rc->bottom = rc->top + Sz.cy; - return TRUE; +#undef IS_DEFAULT } - -/* - * @implemented - */ -PWND APIENTRY -co_IntCreateWindowEx(DWORD dwExStyle, - PUNICODE_STRING ClassName, - PLARGE_STRING WindowName, - DWORD dwStyle, - LONG x, - LONG y, - LONG nWidth, - LONG nHeight, - HWND hWndParent, - HMENU hMenu, - HINSTANCE hInstance, - LPVOID lpParam, - DWORD dwShowMode, - BOOL bUnicodeWindow) +/* Allocates and initializes a window*/ +PWINDOW_OBJECT FASTCALL IntCreateWindow(CREATESTRUCTW* Cs, + PLARGE_STRING WindowName, + PCLS Class, + PWINDOW_OBJECT ParentWindow, + PWINDOW_OBJECT OwnerWindow) { - PWINSTATION_OBJECT WinSta; PWND Wnd = NULL; - PCLS *ClassLink, Class = NULL; - RTL_ATOM ClassAtom; - PWINDOW_OBJECT Window = NULL; - PWINDOW_OBJECT ParentWindow = NULL, OwnerWindow; - HWND ParentWindowHandle = NULL; - HWND OwnerWindowHandle; - PMENU_OBJECT SystemMenu; + PWINDOW_OBJECT Window; HWND hWnd; - POINT Pos; - SIZE Size; - PTHREADINFO ti = NULL; -#if 0 - - POINT MaxSize, MaxPos, MinTrack, MaxTrack; -#else - - POINT MaxPos; -#endif - CREATESTRUCTW Cs; - CBT_CREATEWNDW CbtCreate; - LRESULT Result; + PTHREADINFO pti = NULL; + PMENU_OBJECT SystemMenu; BOOL MenuChanged; - DECLARE_RETURN(PWND); - BOOL HasOwner; - USER_REFERENCE_ENTRY ParentRef, Ref; - PTHREADINFO pti; + BOOL bUnicodeWindow; pti = PsGetCurrentThreadWin32Thread(); - if (pti->rpdesk) - { - ParentWindowHandle = pti->rpdesk->DesktopWindow; - } - - - if ( !(pti->ppi->W32PF_flags & W32PF_CLASSESREGISTERED )) - { - UserRegisterSystemClasses(); - } - - OwnerWindowHandle = NULL; - - DPRINT("co_IntCreateWindowEx %wZ\n", ClassName); - - if (hWndParent == HWND_MESSAGE) - { - /* - * native ole32.OleInitialize uses HWND_MESSAGE to create the - * message window (style: WS_POPUP|WS_DISABLED) - */ - ParentWindowHandle = IntGetMessageWindow(); - DPRINT("Parent is HWND_MESSAGE 0x%x\n", ParentWindowHandle); - } - else if (hWndParent) - { - if ((dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD) - { //temp hack - PWINDOW_OBJECT Par = UserGetWindowObject(hWndParent), Root; - if (Par && (Root = UserGetAncestor(Par, GA_ROOT))) - OwnerWindowHandle = Root->hSelf; - } - else - ParentWindowHandle = hWndParent; - } - else if ((dwStyle & (WS_CHILD | WS_POPUP)) == WS_CHILD) - { - SetLastWin32Error(ERROR_TLW_WITH_WSCHILD); - RETURN( (PWND)0); /* WS_CHILD needs a parent, but WS_POPUP doesn't */ - } - - if (ParentWindowHandle) - { - ParentWindow = UserGetWindowObject(ParentWindowHandle); - - if (ParentWindow) UserRefObjectCo(ParentWindow, &ParentRef); - } + /* Automatically add WS_EX_WINDOWEDGE */ + if ((Cs->dwExStyle & WS_EX_DLGMODALFRAME) || + ((!(Cs->dwExStyle & WS_EX_STATICEDGE)) && + (Cs->style & (WS_DLGFRAME | WS_THICKFRAME)))) + Cs->dwExStyle |= WS_EX_WINDOWEDGE; else - { - ParentWindow = NULL; - } + Cs->dwExStyle &= ~WS_EX_WINDOWEDGE; - /* FIXME: parent must belong to the current process */ + /* Is it a unicode window? */ + bUnicodeWindow =!(Cs->dwExStyle & WS_EX_SETANSICREATOR); + Cs->dwExStyle &= ~WS_EX_SETANSICREATOR; - /* Check the window station. */ - ti = GetW32ThreadInfo(); - if (ti == NULL || pti->rpdesk == NULL) - { - DPRINT1("Thread is not attached to a desktop! Cannot create window!\n"); - RETURN( (PWND)0); - } - - /* Check the class. */ - - DPRINT("Class %wZ\n", ClassName); - - ClassAtom = IntGetClassAtom(ClassName, - hInstance, - ti->ppi, - &Class, - &ClassLink); - - if (ClassAtom == (RTL_ATOM)0) - { - if (IS_ATOM(ClassName->Buffer)) - { - DPRINT1("Class 0x%p not found\n", (DWORD_PTR) ClassName->Buffer); - } - else - { - DPRINT1("Class \"%wZ\" not found\n", ClassName); - } - - SetLastWin32Error(ERROR_CANNOT_FIND_WND_CLASS); - RETURN((PWND)0); - } - DPRINT("ClassAtom %x\n", ClassAtom); - Class = IntReferenceClass(Class, - ClassLink, - pti->rpdesk); - if (Class == NULL) - { - DPRINT1("Failed to reference window class!\n"); - RETURN(NULL); - } - - WinSta = pti->rpdesk->rpwinstaParent; - - //FIXME: Reference thread/desktop instead - ObReferenceObjectByPointer(WinSta, KernelMode, ExWindowStationObjectType, 0); - - /* Create the window object. */ + /* Allocate the new window */ Window = (PWINDOW_OBJECT) UserCreateObject( gHandleTable, pti->rpdesk, (PHANDLE)&hWnd, otWindow, sizeof(WINDOW_OBJECT)); - if (Window) - { - Window->Wnd = DesktopHeapAlloc(pti->rpdesk, - sizeof(WND) + Class->cbwndExtra); - if (!Window->Wnd) - goto AllocErr; - RtlZeroMemory(Window->Wnd, - sizeof(WND) + Class->cbwndExtra); - Window->Wnd->head.h = hWnd; - Wnd = Window->Wnd; - Wnd->fnid = 0; - Wnd->head.pti = ti; - Wnd->head.rpdesk = pti->rpdesk; - Wnd->hWndLastActive = hWnd; - Wnd->state2 |= WNDS2_WIN40COMPAT; + Wnd = DesktopHeapAlloc(pti->rpdesk, sizeof(WND) + Class->cbwndExtra); + + if(!Window || !Wnd) + { + goto AllocError; } + RtlZeroMemory(Wnd, sizeof(WND) + Class->cbwndExtra); + DPRINT("Created object with handle %X\n", hWnd); - if (!Window) - { -AllocErr: - ObDereferenceObject(WinSta); - SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); - RETURN( (PWND)0); - } - - UserRefObjectCo(Window, &Ref); - - ObDereferenceObject(WinSta); if (NULL == pti->rpdesk->DesktopWindow) { @@ -1852,39 +1684,33 @@ AllocErr: /* * Fill out the structure describing it. */ - Window->pti = ti; - Wnd->pcls = Class; - Class = NULL; - - Window->SystemMenu = (HMENU)0; - Wnd->IDMenu = 0; - Wnd->hModule = hInstance; + Window->Wnd = Wnd; + Window->pti = pti; Window->hSelf = hWnd; + Window->spwndParent = ParentWindow; + Window->spwndOwner = OwnerWindow; + + Wnd->head.h = hWnd; + Wnd->head.pti = pti; + Wnd->head.rpdesk = pti->rpdesk; + Wnd->fnid = 0; + Wnd->hWndLastActive = hWnd; + Wnd->state2 |= WNDS2_WIN40COMPAT; + Wnd->pcls = Class; + Wnd->hModule = Cs->hInstance; + Wnd->style = Cs->style & ~WS_VISIBLE; + Wnd->ExStyle = Cs->dwExStyle; + Wnd->cbwndExtra = Wnd->pcls->cbwndExtra; + Wnd->spwndOwner = OwnerWindow ? OwnerWindow->Wnd : NULL; + Wnd->spwndParent = ParentWindow ? ParentWindow->Wnd : NULL; IntReferenceMessageQueue(Window->pti->MessageQueue); - Window->spwndParent = ParentWindow; - Wnd->spwndParent = ParentWindow ? ParentWindow->Wnd : NULL; - if (Wnd->spwndParent != NULL && hWndParent != 0) + if (Wnd->spwndParent != NULL && Cs->hwndParent != 0) { Wnd->HideFocus = Wnd->spwndParent->HideFocus; Wnd->HideAccel = Wnd->spwndParent->HideAccel; } - if((OwnerWindow = UserGetWindowObject(OwnerWindowHandle))) - { - Window->hOwner = OwnerWindowHandle; - Wnd->spwndOwner = OwnerWindow->Wnd; - HasOwner = TRUE; - } - else - { - Window->hOwner = NULL; - Wnd->spwndOwner = NULL; - HasOwner = FALSE; - } - - Wnd->dwUserData = 0; - if (Wnd->pcls->CSF_flags & CSF_SERVERSIDEPROC) Wnd->state |= WNDS_SERVERSIDEWINDOWPROC; @@ -1929,15 +1755,15 @@ AllocErr: WndProc, unless the following overriding conditions occur: */ if ( !bUnicodeWindow && - ( ClassAtom == gpsi->atomSysClass[ICLS_BUTTON] || - ClassAtom == gpsi->atomSysClass[ICLS_COMBOBOX] || - ClassAtom == gpsi->atomSysClass[ICLS_COMBOLBOX] || - ClassAtom == gpsi->atomSysClass[ICLS_DIALOG] || - ClassAtom == gpsi->atomSysClass[ICLS_EDIT] || - ClassAtom == gpsi->atomSysClass[ICLS_IME] || - ClassAtom == gpsi->atomSysClass[ICLS_LISTBOX] || - ClassAtom == gpsi->atomSysClass[ICLS_MDICLIENT] || - ClassAtom == gpsi->atomSysClass[ICLS_STATIC] ) ) + ( Class->atomClassName == gpsi->atomSysClass[ICLS_BUTTON] || + Class->atomClassName == gpsi->atomSysClass[ICLS_COMBOBOX] || + Class->atomClassName == gpsi->atomSysClass[ICLS_COMBOLBOX] || + Class->atomClassName == gpsi->atomSysClass[ICLS_DIALOG] || + Class->atomClassName == gpsi->atomSysClass[ICLS_EDIT] || + Class->atomClassName == gpsi->atomSysClass[ICLS_IME] || + Class->atomClassName == gpsi->atomSysClass[ICLS_LISTBOX] || + Class->atomClassName == gpsi->atomSysClass[ICLS_MDICLIENT] || + Class->atomClassName == gpsi->atomSysClass[ICLS_STATIC] ) ) { // Override Class and set the window Ansi WndProc. Wnd->state |= WNDS_ANSIWINDOWPROC; Wnd->Unicode = FALSE; @@ -1949,74 +1775,61 @@ AllocErr: } } - Window->spwndChild = NULL; - Window->spwndPrev = NULL; - Window->spwndNext = NULL; + /* BugBoy Comments: if the window being created is a edit control, ATOM 0xCxxx, + then my testing shows that windows (2k and XP) creates a CallProc for it immediately + Dont understand why it does this. */ + if (Class->atomClassName == gpsi->atomSysClass[ICLS_EDIT]) + { + PCALLPROCDATA CallProc; + //CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow, Wnd->ti->ppi); + CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->head.pti->ppi); - Wnd->spwndNext = NULL; - Wnd->spwndPrev = NULL; - Wnd->spwndChild = NULL; - - Wnd->cbwndExtra = Wnd->pcls->cbwndExtra; + if (!CallProc) + { + SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); + DPRINT1("Warning: Unable to create CallProc for edit control. Control may not operate correctly! hwnd %x\n",hWnd); + } + else + { + UserAddCallProcToClass(Wnd->pcls, CallProc); + } + } InitializeListHead(&Wnd->PropListHead); - if ( NULL != WindowName->Buffer && WindowName->Length > 0 ) + if ( WindowName->Buffer != NULL && WindowName->Length > 0 ) { Wnd->strName.Buffer = DesktopHeapAlloc(Wnd->head.rpdesk, - WindowName->Length + sizeof(UNICODE_NULL)); + WindowName->Length + sizeof(UNICODE_NULL)); if (Wnd->strName.Buffer == NULL) { - SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); - RETURN( (PWND)0); + goto AllocError; } + RtlCopyMemory(Wnd->strName.Buffer, WindowName->Buffer, WindowName->Length); Wnd->strName.Buffer[WindowName->Length / sizeof(WCHAR)] = L'\0'; - _SEH2_TRY - { - RtlCopyMemory(Wnd->strName.Buffer, - WindowName->Buffer, - WindowName->Length); - Wnd->strName.Length = WindowName->Length; - } - _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - WindowName->Length = 0; - Wnd->strName.Buffer[0] = L'\0'; - } - _SEH2_END; + Wnd->strName.Length = WindowName->Length; } - /* - * This has been tested for WS_CHILD | WS_VISIBLE. It has not been - * tested for WS_POPUP - */ - if ((dwExStyle & WS_EX_DLGMODALFRAME) || - ((!(dwExStyle & WS_EX_STATICEDGE)) && - (dwStyle & (WS_DLGFRAME | WS_THICKFRAME)))) - dwExStyle |= WS_EX_WINDOWEDGE; - else - dwExStyle &= ~WS_EX_WINDOWEDGE; - - dwExStyle &= ~WS_EX_SETANSICREATOR; - - Wnd->style = dwStyle & ~WS_VISIBLE; - /* Correct the window style. */ if ((Wnd->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) { Wnd->style |= WS_CLIPSIBLINGS; - DPRINT("3: Style is now %lx\n", dwStyle); if (!(Wnd->style & WS_POPUP)) { Wnd->style |= WS_CAPTION; Window->state |= WINDOWOBJECT_NEED_SIZE; - DPRINT("4: Style is now %lx\n", dwStyle); } } + if ((Wnd->ExStyle & WS_EX_DLGMODALFRAME) || + (Wnd->style & (WS_DLGFRAME | WS_THICKFRAME))) + Wnd->ExStyle |= WS_EX_WINDOWEDGE; + else + Wnd->ExStyle &= ~WS_EX_WINDOWEDGE; + /* create system menu */ - if((dwStyle & WS_SYSMENU) )//&& (dwStyle & WS_CAPTION) == WS_CAPTION) + if((Cs->style & WS_SYSMENU) )//&& (dwStyle & WS_CAPTION) == WS_CAPTION) { SystemMenu = IntGetSystemMenu(Window, TRUE, TRUE); if(SystemMenu) @@ -2027,13 +1840,15 @@ AllocErr: } /* Set the window menu */ - if ((dwStyle & (WS_CHILD | WS_POPUP)) != WS_CHILD) + if ((Cs->style & (WS_CHILD | WS_POPUP)) != WS_CHILD) { - if (hMenu) - IntSetMenu(Window, hMenu, &MenuChanged); + if (Cs->hMenu) + IntSetMenu(Window, Cs->hMenu, &MenuChanged); else if (Wnd->pcls->lpszMenuName) // Take it from the parent. { UNICODE_STRING MenuName; + HMENU hMenu; + if (IS_INTRESOURCE(Wnd->pcls->lpszMenuName)) { MenuName.Length = 0; @@ -2049,7 +1864,7 @@ AllocErr: } } else // Not a child - Wnd->IDMenu = (UINT) hMenu; + Wnd->IDMenu = (UINT) Cs->hMenu; /* Insert the window into the thread's window list. */ InsertTailList (&pti->WindowListHead, &Window->ThreadListEntry); @@ -2064,163 +1879,138 @@ AllocErr: DceAllocDCE(Window, DCE_WINDOW_DC); } - Pos.x = x; - Pos.y = y; - Size.cx = nWidth; - Size.cy = nHeight; + return Window; - Wnd->ExStyle = dwExStyle; +AllocError: - /* call hook */ - Cs.lpCreateParams = lpParam; - Cs.hInstance = hInstance; - Cs.hMenu = hMenu; - Cs.hwndParent = hWndParent; //Pass the original Parent handle! - Cs.cx = Size.cx; - Cs.cy = Size.cy; - Cs.x = Pos.x; - Cs.y = Pos.y; - Cs.style = Wnd->style; -// Cs.lpszName = (LPCWSTR) WindowName->Buffer; -// Cs.lpszClass = (LPCWSTR) ClassName->Buffer; - Cs.lpszName = (LPCWSTR) WindowName; - Cs.lpszClass = (LPCWSTR) ClassName; - Cs.dwExStyle = dwExStyle; - CbtCreate.lpcs = &Cs; + if(Window) + UserDereferenceObject(Window); + + if(Wnd) + DesktopHeapFree(Wnd->head.rpdesk, Wnd); + + SetLastNtError(STATUS_INSUFFICIENT_RESOURCES); + return NULL; +} + +/* + * @implemented + */ +PWND FASTCALL +co_UserCreateWindowEx(CREATESTRUCTW* Cs, + PUNICODE_STRING ClassName, + PLARGE_STRING WindowName) +{ + PWINDOW_OBJECT Window = NULL, ParentWindow = NULL, OwnerWindow; + HWND hWnd, hWndParent, hWndOwner; + DWORD dwStyle; + PWINSTATION_OBJECT WinSta; + PWND Wnd = NULL; + PCLS Class = NULL; + SIZE Size; + POINT MaxPos; + CBT_CREATEWNDW CbtCreate; + LRESULT Result; + USER_REFERENCE_ENTRY ParentRef, Ref; + PTHREADINFO pti; + DWORD dwShowMode = SW_SHOW; + DECLARE_RETURN(PWND); + + /* Get the current window station and reference it */ + pti = GetW32ThreadInfo(); + if (pti == NULL || pti->rpdesk == NULL) + { + DPRINT1("Thread is not attached to a desktop! Cannot create window!\n"); + return NULL; //There is nothing to cleanup + } + WinSta = pti->rpdesk->rpwinstaParent; + ObReferenceObjectByPointer(WinSta, KernelMode, ExWindowStationObjectType, 0); + + /* Get the class and reference it*/ + Class = IntGetAndReferenceClass(ClassName, Cs->hInstance); + if(!Class) + { + DPRINT1("Failed to find class %wZ\n", ClassName); + RETURN(NULL); + } + + /* Now find the parent and the owner window */ + hWndParent = IntGetDesktopWindow(); + hWndOwner = NULL; + + if (Cs->hwndParent == HWND_MESSAGE) + { + Cs->hwndParent = hWndParent = IntGetMessageWindow(); + } + else if (Cs->hwndParent) + { + if ((Cs->style & (WS_CHILD|WS_POPUP)) != WS_CHILD) + hWndOwner = Cs->hwndParent; + else + hWndParent = Cs->hwndParent; + } + else if ((Cs->style & (WS_CHILD|WS_POPUP)) == WS_CHILD) + { + DPRINT1("Cannot create a child window without a parrent!\n"); + SetLastWin32Error(ERROR_TLW_WITH_WSCHILD); + RETURN(NULL); /* WS_CHILD needs a parent, but WS_POPUP doesn't */ + } + + ParentWindow = hWndParent ? UserGetWindowObject(hWndParent): NULL; + OwnerWindow = hWndOwner ? UserGetWindowObject(hWndOwner): NULL; + + /* FIXME: is this correct?*/ + if(OwnerWindow) + OwnerWindow = UserGetAncestor(OwnerWindow, GA_ROOT); + + /* Fix the position and the size of the window */ + if (ParentWindow) + { + UserRefObjectCo(ParentWindow, &ParentRef); + IntFixWindowCoordinates(Cs, ParentWindow, &dwShowMode); + } + + /* Allocate and initialize the new window */ + Window = IntCreateWindow(Cs, + WindowName, + Class, + ParentWindow, + OwnerWindow); + if(!Window) + { + DPRINT1("IntCreateWindow failed!\n"); + RETURN(0); + } + + Wnd = Window->Wnd; + hWnd = Window->hSelf; + + UserRefObjectCo(Window, &Ref); + ObDereferenceObject(WinSta); + + /* Call the WH_CBT hook */ + dwStyle = Cs->style; + Cs->style = Wnd->style; /* HCBT_CREATEWND needs the real window style */ + CbtCreate.lpcs = Cs; CbtCreate.hwndInsertAfter = HWND_TOP; if (ISITHOOKED(WH_CBT)) { if (co_HOOK_CallHooks(WH_CBT, HCBT_CREATEWND, (WPARAM) hWnd, (LPARAM) &CbtCreate)) { - /* FIXME - Delete window object and remove it from the thread windows list */ - /* FIXME - delete allocated DCE */ - DPRINT1("CBT-hook returned !0\n"); + DPRINT1("HCBT_CREATEWND hook failed!\n"); RETURN( (PWND) NULL); } } - x = Cs.x; - y = Cs.y; - nWidth = Cs.cx; - nHeight = Cs.cy; + Cs->style = dwStyle; /* NCCREATE and WM_NCCALCSIZE need the original values*/ - Cs.style = dwStyle; -// FIXME: Need to set the Z order in the window link list if the hook callback changed it! -// hwndInsertAfter = CbtCreate.hwndInsertAfter; + /* Send the WM_GETMINMAXINFO message*/ + Size.cx = Cs->cx; + Size.cy = Cs->cy; - /* default positioning for overlapped windows */ - if(!(Wnd->style & (WS_POPUP | WS_CHILD))) - { - RECTL rc, WorkArea; - PRTL_USER_PROCESS_PARAMETERS ProcessParams; - BOOL CalculatedDefPosSize = FALSE; - - UserSystemParametersInfo(SPI_GETWORKAREA, 0, &WorkArea, 0); - - rc = WorkArea; - ProcessParams = PsGetCurrentProcess()->Peb->ProcessParameters; - - if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16) - { - CalculatedDefPosSize = IntCalcDefPosSize(ParentWindow, &rc, TRUE); - - if(ProcessParams->WindowFlags & STARTF_USEPOSITION) - { - ProcessParams->WindowFlags &= ~STARTF_USEPOSITION; - Pos.x = WorkArea.left + ProcessParams->StartingX; - Pos.y = WorkArea.top + ProcessParams->StartingY; - } - else - { - Pos.x = rc.left; - Pos.y = rc.top; - } - -/* - According to wine, the ShowMode is set to y if x == CW_USEDEFAULT(16) and - y is something else. and Quote! - */ - -/* Never believe Microsoft's documentation... CreateWindowEx doc says - * that if an overlapped window is created with WS_VISIBLE style bit - * set and the x parameter is set to CW_USEDEFAULT, the system ignores - * the y parameter. However, disassembling NT implementation (WIN32K.SYS) - * reveals that - * - * 1) not only it checks for CW_USEDEFAULT but also for CW_USEDEFAULT16 - * 2) it does not ignore the y parameter as the docs claim; instead, it - * uses it as second parameter to ShowWindow() unless y is either - * CW_USEDEFAULT or CW_USEDEFAULT16. - * - * The fact that we didn't do 2) caused bogus windows pop up when wine - * was running apps that were using this obscure feature. Example - - * calc.exe that comes with Win98 (only Win98, it's different from - * the one that comes with Win95 and NT) - */ - if(y != CW_USEDEFAULT && y != CW_USEDEFAULT16) - { - dwShowMode = y; - } - } - if(nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16) - { - if(!CalculatedDefPosSize) - { - IntCalcDefPosSize(ParentWindow, &rc, FALSE); - } - if(ProcessParams->WindowFlags & STARTF_USESIZE) - { - ProcessParams->WindowFlags &= ~STARTF_USESIZE; - Size.cx = ProcessParams->CountX; - Size.cy = ProcessParams->CountY; - } - else - { - Size.cx = rc.right - rc.left; - Size.cy = rc.bottom - rc.top; - } - - /* move the window if necessary */ - if(Pos.x > rc.left) - Pos.x = max(rc.left, 0); - if(Pos.y > rc.top) - Pos.y = max(rc.top, 0); - } - } - else - { - /* if CW_USEDEFAULT(16) is set for non-overlapped windows, both values are set to zero) */ - if(x == CW_USEDEFAULT || x == CW_USEDEFAULT16) - { - Pos.x = 0; - Pos.y = 0; - } - if(nWidth == CW_USEDEFAULT || nWidth == CW_USEDEFAULT16) - { - Size.cx = 0; - Size.cy = 0; - } - } - - /* Initialize the window dimensions. */ - Wnd->rcWindow.left = Pos.x; - Wnd->rcWindow.top = Pos.y; - Wnd->rcWindow.right = Pos.x + Size.cx; - Wnd->rcWindow.bottom = Pos.y + Size.cy; - if (0 != (Wnd->style & WS_CHILD) && ParentWindow) - { - RECTL_vOffsetRect(&(Wnd->rcWindow), ParentWindow->Wnd->rcClient.left, - ParentWindow->Wnd->rcClient.top); - } - Wnd->rcClient = Wnd->rcWindow; - - /* - * Get the size and position of the window. - */ if ((dwStyle & WS_THICKFRAME) || !(dwStyle & (WS_POPUP | WS_CHILD))) { POINT MaxSize, MaxPos, MinTrack, MaxTrack; - /* WinPosGetMinMaxInfo sends the WM_GETMINMAXINFO message */ co_WinPosGetMinMaxInfo(Window, &MaxSize, &MaxPos, &MinTrack, &MaxTrack); if (Size.cx > MaxTrack.x) Size.cx = MaxTrack.x; if (Size.cy > MaxTrack.y) Size.cy = MaxTrack.y; @@ -2228,47 +2018,20 @@ AllocErr: if (Size.cy < MinTrack.y) Size.cy = MinTrack.y; } - Wnd->rcWindow.left = Pos.x; - Wnd->rcWindow.top = Pos.y; - Wnd->rcWindow.right = Pos.x + Size.cx; - Wnd->rcWindow.bottom = Pos.y + Size.cy; + Wnd->rcWindow.left = Cs->x; + Wnd->rcWindow.top = Cs->y; + Wnd->rcWindow.right = Cs->x + Size.cx; + Wnd->rcWindow.bottom = Cs->y + Size.cy; if (0 != (Wnd->style & WS_CHILD) && ParentWindow) { - RECTL_vOffsetRect(&(Wnd->rcWindow), ParentWindow->Wnd->rcClient.left, - ParentWindow->Wnd->rcClient.top); + RECTL_vOffsetRect(&Wnd->rcWindow, + ParentWindow->Wnd->rcClient.left, + ParentWindow->Wnd->rcClient.top); } Wnd->rcClient = Wnd->rcWindow; - /* FIXME: Initialize the window menu. */ - - /* Send a NCCREATE message. */ - DPRINT("[win32k.window] IntCreateWindowEx style %d, exstyle %d, parent %d\n", Cs.style, Cs.dwExStyle, Cs.hwndParent); - DPRINT("IntCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, Size.cx, Size.cy); - DPRINT("IntCreateWindowEx(): About to send NCCREATE message.\n"); - Result = co_IntSendMessage(Window->hSelf, WM_NCCREATE, 0, (LPARAM) &Cs); - if (!Result) - { - /* FIXME: Cleanup. */ - DPRINT1("IntCreateWindowEx(): NCCREATE message failed. No cleanup performed!\n"); - RETURN((PWND)0); - } - - /* Calculate the non-client size. */ - MaxPos.x = Window->Wnd->rcWindow.left; - MaxPos.y = Window->Wnd->rcWindow.top; - - - DPRINT("IntCreateWindowEx(): About to get non-client size.\n"); - /* WinPosGetNonClientSize SENDS THE WM_NCCALCSIZE message */ - Result = co_WinPosGetNonClientSize(Window, - &Window->Wnd->rcWindow, - &Window->Wnd->rcClient); - - RECTL_vOffsetRect(&Window->Wnd->rcWindow, - MaxPos.x - Window->Wnd->rcWindow.left, - MaxPos.y - Window->Wnd->rcWindow.top); - + /* Link the window*/ if (NULL != ParentWindow) { /* link the window into the parent's child list */ @@ -2291,7 +2054,7 @@ AllocErr: { /* link window as top sibling (but after topmost siblings) */ PWINDOW_OBJECT InsertAfter, Sibling; - if (!(dwExStyle & WS_EX_TOPMOST)) + if (!(Cs->dwExStyle & WS_EX_TOPMOST)) { InsertAfter = NULL; Sibling = ParentWindow->spwndChild; @@ -2309,19 +2072,35 @@ AllocErr: IntLinkWindow(Window, ParentWindow, InsertAfter /* prev sibling */); } } + + /* Send the NCCREATE message */ + Result = co_IntSendMessage(Window->hSelf, WM_NCCREATE, 0, (LPARAM) Cs); + if (!Result) + { + DPRINT1("co_UserCreateWindowEx(): NCCREATE message failed\n"); + RETURN((PWND)0); + } + + /* Send the WM_NCCALCSIZE message */ + MaxPos.x = Window->Wnd->rcWindow.left; + MaxPos.y = Window->Wnd->rcWindow.top; + + Result = co_WinPosGetNonClientSize(Window, &Wnd->rcWindow, &Wnd->rcClient); + + RECTL_vOffsetRect(&Wnd->rcWindow, MaxPos.x - Wnd->rcWindow.left, + MaxPos.y - Wnd->rcWindow.top); + /* Send the WM_CREATE message. */ - DPRINT("IntCreateWindowEx(): about to send CREATE message.\n"); - Result = co_IntSendMessage(Window->hSelf, WM_CREATE, 0, (LPARAM) &Cs); - + Result = co_IntSendMessage(Window->hSelf, WM_CREATE, 0, (LPARAM) Cs); if (Result == (LRESULT)-1) { - /* FIXME: Cleanup. */ - DPRINT1("IntCreateWindowEx(): send CREATE message failed. No cleanup performed!\n"); + DPRINT1("co_UserCreateWindowEx(): WM_CREATE message failed\n"); IntUnlinkWindow(Window); RETURN((PWND)0); } + /* Send the EVENT_OBJECT_CREATE event*/ IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0); /* By setting the flag below it can be examined to determine if the window @@ -2329,43 +2108,10 @@ AllocErr: from here the function has to succeed. */ Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED; - /* Send move and size messages. */ + /* Send the WM_SIZE and WM_MOVE messages. */ if (!(Window->state & WINDOWOBJECT_NEED_SIZE)) { - LONG lParam; - - DPRINT("IntCreateWindow(): About to send WM_SIZE\n"); - - if ((Window->Wnd->rcClient.right - Window->Wnd->rcClient.left) < 0 || - (Window->Wnd->rcClient.bottom - Window->Wnd->rcClient.top) < 0) - { - DPRINT("Sending bogus WM_SIZE\n"); - } - - lParam = MAKE_LONG(Window->Wnd->rcClient.right - - Window->Wnd->rcClient.left, - Window->Wnd->rcClient.bottom - - Window->Wnd->rcClient.top); - co_IntSendMessage(Window->hSelf, WM_SIZE, SIZE_RESTORED, - lParam); - - DPRINT("IntCreateWindow(): About to send WM_MOVE\n"); - - if (0 != (Wnd->style & WS_CHILD) && ParentWindow) - { - lParam = MAKE_LONG(Wnd->rcClient.left - ParentWindow->Wnd->rcClient.left, - Wnd->rcClient.top - ParentWindow->Wnd->rcClient.top); - } - else - { - lParam = MAKE_LONG(Wnd->rcClient.left, - Wnd->rcClient.top); - } - - co_IntSendMessage(Window->hSelf, WM_MOVE, 0, lParam); - - /* Call WNDOBJ change procs */ - IntEngWindowChanged(Window, WOC_RGN_CLIENT); + co_WinPosSendSizeMove(Window); } /* Show or maybe minimize or maximize the window. */ @@ -2374,8 +2120,7 @@ AllocErr: RECTL NewPos; UINT16 SwFlag; - SwFlag = (Wnd->style & WS_MINIMIZE) ? SW_MINIMIZE : - SW_MAXIMIZE; + SwFlag = (Wnd->style & WS_MINIMIZE) ? SW_MINIMIZE : SW_MAXIMIZE; co_WinPosMinMaximize(Window, SwFlag, &NewPos); @@ -2383,32 +2128,25 @@ AllocErr: SWP_NOACTIVATE | SWP_NOZORDER | SWP_FRAMECHANGED : SWP_NOZORDER | SWP_FRAMECHANGED; - DPRINT("IntCreateWindow(): About to minimize/maximize\n"); - DPRINT("%d,%d %dx%d\n", NewPos.left, NewPos.top, NewPos.right, NewPos.bottom); co_WinPosSetWindowPos(Window, 0, NewPos.left, NewPos.top, NewPos.right, NewPos.bottom, SwFlag); } - /* Notify the parent window of a new child. */ + /* Send the WM_PARENTNOTIFY message */ if ((Wnd->style & WS_CHILD) && (!(Wnd->ExStyle & WS_EX_NOPARENTNOTIFY)) && ParentWindow) { - DPRINT("IntCreateWindow(): About to notify parent\n"); co_IntSendMessage(ParentWindow->hSelf, WM_PARENTNOTIFY, MAKEWPARAM(WM_CREATE, Wnd->IDMenu), (LPARAM)Window->hSelf); } - if ((!hWndParent) && (!HasOwner)) + /* Notify the shell that a new window was created */ + if ((!hWndParent) && (!hWndOwner)) { - DPRINT("Sending CREATED notify\n"); co_IntShellHookNotify(HSHELL_WINDOWCREATED, (LPARAM)hWnd); } - else - { - DPRINT("Not sending CREATED notify, %x %d\n", ParentWindow, HasOwner); - } /* Initialize and show the window's scrollbars */ if (Wnd->style & WS_VSCROLL) @@ -2420,14 +2158,14 @@ AllocErr: co_UserShowScrollBar(Window, SB_HORZ, TRUE); } - if (dwStyle & WS_VISIBLE) + /* Show the new window */ + if (Cs->style & WS_VISIBLE) { if (Wnd->style & WS_MAXIMIZE) dwShowMode = SW_SHOW; else if (Wnd->style & WS_MINIMIZE) dwShowMode = SW_SHOWMINIMIZED; - DPRINT("IntCreateWindow(): About to show window\n"); co_WinPosShowWindow(Window, dwShowMode); if (Wnd->ExStyle & WS_EX_MDICHILD) @@ -2438,49 +2176,26 @@ AllocErr: } } - /* BugBoy Comments: if the window being created is a edit control, ATOM 0xCxxx, - then my testing shows that windows (2k and XP) creates a CallProc for it immediately - Dont understand why it does this. */ - if (ClassAtom == gpsi->atomSysClass[ICLS_EDIT]) - { - PCALLPROCDATA CallProc; - //CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, bUnicodeWindow, Wnd->ti->ppi); - CallProc = CreateCallProc(NULL, Wnd->lpfnWndProc, Wnd->Unicode , Wnd->head.pti->ppi); - - if (!CallProc) - { - SetLastWin32Error(ERROR_NOT_ENOUGH_MEMORY); - DPRINT1("Warning: Unable to create CallProc for edit control. Control may not operate correctly! hwnd %x\n",hWnd); - } - else - { - UserAddCallProcToClass(Wnd->pcls, CallProc); - } - } - - DPRINT("IntCreateWindow(): = %X\n", hWnd); - DPRINT("WindowObject->SystemMenu = 0x%x\n", Window->SystemMenu); + DPRINT("co_UserCreateWindowEx(): Created window %X\n", hWnd); RETURN( Wnd); CLEANUP: - if (!_ret_ && Window && Window->Wnd && ti) - co_UserDestroyWindow(Window); -// UserFreeWindowInfo(ti, Window); + if (!_ret_) + { + /* If the window was created, the class will be dereferenced by co_UserDestroyWindow */ + if (Window) + co_UserDestroyWindow(Window); + else + IntDereferenceClass(Class, pti->pDeskInfo, pti->ppi); + } + if (Window) { UserDerefObjectCo(Window); UserDereferenceObject(Window); } if (ParentWindow) UserDerefObjectCo(ParentWindow); - if (!_ret_ && ti != NULL) - { - if (Class != NULL) - { - IntDereferenceClass(Class, - ti->pDeskInfo, - ti->ppi); - } - } + END_CLEANUP; } @@ -2564,12 +2279,10 @@ NtUserCreateWindowEx( LARGE_STRING lstrWindowName; LARGE_STRING lstrClassName; UNICODE_STRING ustrClassName; + CREATESTRUCTW Cs; HWND hwnd = NULL; PWND pwnd; - DPRINT("Enter NtUserCreateWindowEx(): (%d,%d-%d,%d)\n", x, y, nWidth, nHeight); - UserEnterExclusive(); - lstrWindowName.Buffer = NULL; lstrClassName.Buffer = NULL; @@ -2580,8 +2293,9 @@ NtUserCreateWindowEx( Status = ProbeAndCaptureLargeString(&lstrWindowName, plstrWindowName); if (!NT_SUCCESS(Status)) { + DPRINT1("NtUserCreateWindowEx: failed to capture plstrWindowName\n"); SetLastNtError(Status); - goto leave; + return NULL; } plstrWindowName = &lstrWindowName; } @@ -2600,6 +2314,7 @@ NtUserCreateWindowEx( Status = ProbeAndCaptureLargeString(&lstrClassName, plstrClassName); if (!NT_SUCCESS(Status)) { + DPRINT1("NtUserCreateWindowEx: failed to capture plstrClassName\n"); /* Set last error, cleanup and return */ SetLastNtError(Status); goto cleanup; @@ -2611,24 +2326,36 @@ NtUserCreateWindowEx( ustrClassName.MaximumLength = lstrClassName.MaximumLength; } - /* Call the internal function */ - pwnd = co_IntCreateWindowEx(dwExStyle, - &ustrClassName, - plstrWindowName, - dwStyle, - x, - y, - nWidth, - nHeight, - hWndParent, - hMenu, - hInstance, - lpParam, - SW_SHOW, - !(dwExStyle & WS_EX_SETANSICREATOR)); + /* Fill the CREATESTRUCTW */ + /* we will keep here the original parameters */ + Cs.style = dwStyle; + Cs.lpCreateParams = lpParam; + Cs.hInstance = hInstance; + Cs.hMenu = hMenu; + Cs.hwndParent = hWndParent; + Cs.cx = nWidth; + Cs.cy = nHeight; + Cs.x = x; + Cs.y = y; +// Cs.lpszName = (LPCWSTR) WindowName->Buffer; +// Cs.lpszClass = (LPCWSTR) ClassName->Buffer; + Cs.lpszName = (LPCWSTR) plstrWindowName; + Cs.lpszClass = (LPCWSTR) &ustrClassName; + Cs.dwExStyle = dwExStyle; + UserEnterExclusive(); + + /* Call the internal function */ + pwnd = co_UserCreateWindowEx(&Cs, &ustrClassName, plstrWindowName); + + if(!pwnd) + { + DPRINT1("co_UserCreateWindowEx failed!\n"); + } hwnd = pwnd ? UserHMGetHandle(pwnd) : NULL; + UserLeave(); + cleanup: if (lstrWindowName.Buffer) { @@ -2639,10 +2366,6 @@ cleanup: ExFreePoolWithTag(lstrClassName.Buffer, TAG_STRING); } -leave: - DPRINT("Leave NtUserCreateWindowEx, hwnd=%i\n", hwnd); - UserLeave(); - return hwnd; } @@ -2777,7 +2500,7 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) Child = UserGetWindowObject(*ChildHandle); if (Child == NULL) continue; - if (Child->hOwner != Window->hSelf) + if (Child->spwndOwner != Window) { continue; } @@ -2793,9 +2516,9 @@ BOOLEAN FASTCALL co_UserDestroyWindow(PWINDOW_OBJECT Window) continue; } - if (Child->hOwner != NULL) + if (Child->spwndOwner != NULL) { - Child->hOwner = NULL; + Child->spwndOwner = NULL; Child->Wnd->spwndOwner = NULL; } @@ -2957,11 +2680,11 @@ IntFindWindow(PWINDOW_OBJECT Parent, (Child->Wnd->strName.Length < 0xFFFF && !RtlCompareUnicodeString(WindowName, &CurrentWindowName, TRUE))) { - Ret = Child->hSelf; - break; - } + Ret = Child->hSelf; + break; } } + } ExFreePool(List); } @@ -3258,9 +2981,6 @@ PWINDOW_OBJECT FASTCALL UserGetAncestor(PWINDOW_OBJECT Wnd, UINT Type) break; } - //temp hack -// UserDereferenceObject(Parent); - WndAncestor = Parent; } break; @@ -3591,7 +3311,7 @@ BOOL APIENTRY NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView) { PWINSTATION_OBJECT WinStaObject; - PWINDOW_OBJECT WndShell; + PWINDOW_OBJECT WndShell, WndListView; DECLARE_RETURN(BOOL); USER_REFERENCE_ENTRY Ref; NTSTATUS Status; @@ -3605,6 +3325,11 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView) RETURN(FALSE); } + if(!(WndListView = UserGetWindowObject(hwndListView))) + { + RETURN(FALSE); + } + Status = IntValidateWindowStationHandle(PsGetCurrentProcess()->Win32WindowStation, KernelMode, 0, @@ -3638,14 +3363,14 @@ NtUserSetShellWindowEx(HWND hwndShell, HWND hwndListView) co_WinPosSetWindowPos(hwndListView, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE); #endif - if (UserGetWindowLong(hwndListView, GWL_EXSTYLE, FALSE) & WS_EX_TOPMOST) + if (WndListView->Wnd->ExStyle & WS_EX_TOPMOST) { ObDereferenceObject(WinStaObject); RETURN( FALSE); } } - if (UserGetWindowLong(hwndShell, GWL_EXSTYLE, FALSE) & WS_EX_TOPMOST) + if (WndShell->Wnd->ExStyle & WS_EX_TOPMOST) { ObDereferenceObject(WinStaObject); RETURN( FALSE); @@ -3770,162 +3495,6 @@ CLEANUP: END_CLEANUP; } -HWND FASTCALL -UserGetWindow(HWND hWnd, UINT Relationship) -{ - PWINDOW_OBJECT Parent, Window; - HWND hWndResult = NULL; - - if (!(Window = UserGetWindowObject(hWnd))) - return NULL; - - switch (Relationship) - { - case GW_HWNDFIRST: - if((Parent = Window->spwndParent)) - { - if (Parent->spwndChild) - hWndResult = Parent->spwndChild->hSelf; - } - break; - - case GW_HWNDLAST: - if((Parent = Window->spwndParent)) - { - if (Parent->spwndChild) - { - Window = Parent->spwndChild; - if(Window) - { - while(Window->spwndNext) - Window = Window->spwndNext; - } - hWndResult = Window->hSelf; - } - } - break; - - case GW_HWNDNEXT: - if (Window->spwndNext) - hWndResult = Window->spwndNext->hSelf; - break; - - case GW_HWNDPREV: - if (Window->spwndPrev) - hWndResult = Window->spwndPrev->hSelf; - break; - - case GW_OWNER: - if((Parent = UserGetWindowObject(Window->hOwner))) - { - hWndResult = Parent->hSelf; - } - break; - case GW_CHILD: - if (Window->spwndChild) - hWndResult = Window->spwndChild->hSelf; - break; - } - - return hWndResult; -} - -/* - * NtUserGetWindowLong - * - * The NtUserGetWindowLong function retrieves information about the specified - * window. The function also retrieves the 32-bit (long) value at the - * specified offset into the extra window memory. - * - * Status - * @implemented - */ - -LONG FASTCALL -UserGetWindowLong(HWND hWnd, DWORD Index, BOOL Ansi) -{ - PWINDOW_OBJECT Window, Parent; - PWND Wnd; - LONG Result = 0; - - DPRINT("NtUserGetWindowLong(%x,%d,%d)\n", hWnd, (INT)Index, Ansi); - - if (!(Window = UserGetWindowObject(hWnd)) || !Window->Wnd) - { - return 0; - } - - Wnd = Window->Wnd; - - /* - * WndProc is only available to the owner process - */ - if (GWL_WNDPROC == Index - && Window->pti->pEThread->ThreadsProcess != PsGetCurrentProcess()) - { - SetLastWin32Error(ERROR_ACCESS_DENIED); - return 0; - } - - if ((INT)Index >= 0) - { - if ((Index + sizeof(LONG)) > Window->Wnd->cbwndExtra) - { - SetLastWin32Error(ERROR_INVALID_PARAMETER); - return 0; - } - Result = *((LONG *)((PCHAR)(Window->Wnd + 1) + Index)); - } - else - { - switch (Index) - { - case GWL_EXSTYLE: - Result = Wnd->ExStyle; - break; - - case GWL_STYLE: - Result = Wnd->style; - break; - - case GWL_WNDPROC: - Result = (LONG)IntGetWindowProc(Wnd, Ansi); - break; - - case GWL_HINSTANCE: - Result = (LONG) Wnd->hModule; - break; - - case GWL_HWNDPARENT: - Parent = Window->spwndParent; - if(Parent) - { - if (Parent && Parent->hSelf == IntGetDesktopWindow()) - Result = (LONG) UserGetWindow(Window->hSelf, GW_OWNER); - else - Result = (LONG) Parent->hSelf; - } - break; - - case GWL_ID: - Result = (LONG) Wnd->IDMenu; - break; - - case GWL_USERDATA: - Result = Wnd->dwUserData; - break; - - default: - DPRINT1("NtUserGetWindowLong(): Unsupported index %d\n", Index); - SetLastWin32Error(ERROR_INVALID_PARAMETER); - Result = 0; - break; - } - } - - return Result; -} - LONG FASTCALL co_UserSetWindowLong(HWND hWnd, DWORD Index, LONG NewValue, BOOL Ansi) { @@ -5024,7 +4593,7 @@ NtUserDefSetText(HWND hWnd, PLARGE_STRING WindowText) // In User32, these are called after: NotifyWinEvent EVENT_OBJECT_NAMECHANGE than // RepaintButton, StaticRepaint, NtUserCallHwndLock HWNDLOCK_ROUTINE_REDRAWFRAMEANDHOOK, etc. /* Send shell notifications */ - if (!IntGetOwner(Window) && !IntGetParent(Window)) + if (!Window->spwndOwner && !IntGetParent(Window)) { co_IntShellHookNotify(HSHELL_REDRAW, (LPARAM) hWnd); } @@ -5125,11 +4694,10 @@ IntShowOwnedPopups(PWINDOW_OBJECT OwnerWnd, BOOL fShow ) count++; while (--count >= 0) { - if (UserGetWindow( win_array[count], GW_OWNER ) != OwnerWnd->hSelf) - continue; if (!(pWnd = UserGetWindowObject( win_array[count] ))) continue; - // if (pWnd == WND_OTHER_PROCESS) continue; + if (pWnd->spwndOwner != OwnerWnd) + continue; if (fShow) { diff --git a/subsystems/win32/win32k/ntuser/winpos.c b/subsystems/win32/win32k/ntuser/winpos.c index 67e5eadc92f..8bdd29969a3 100644 --- a/subsystems/win32/win32k/ntuser/winpos.c +++ b/subsystems/win32/win32k/ntuser/winpos.c @@ -151,7 +151,7 @@ co_WinPosActivateOtherWindow(PWINDOW_OBJECT Window) } /* If this is popup window, try to activate the owner first. */ - if ((Wnd->style & WS_POPUP) && (WndTo = IntGetOwner(Window))) + if ((Wnd->style & WS_POPUP) && (WndTo = Window->spwndOwner)) { WndTo = UserGetAncestor( WndTo, GA_ROOT ); if (can_activate_window(WndTo)) goto done; @@ -741,11 +741,15 @@ HWND FASTCALL WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) { HWND *List = NULL; - HWND Owner = UserGetWindow(hWnd, GW_OWNER); - LONG Style = UserGetWindowLong(hWnd, GWL_STYLE, FALSE); - PWINDOW_OBJECT DesktopWindow, ChildObject; + HWND Owner; + LONG Style; + PWINDOW_OBJECT Window ,DesktopWindow, ChildObject; int i; + Window = UserGetWindowObject(hWnd); + Owner = Window->spwndOwner ? Window->spwndOwner->hSelf : NULL; + Style = Window->Wnd->style; + if ((Style & WS_POPUP) && Owner) { /* Make sure this popup stays above the owner */ @@ -804,8 +808,7 @@ WinPosDoOwnedPopups(HWND hWnd, HWND hWndInsertAfter) if (!(Wnd = UserGetWindowObject(List[i]))) continue; - if ((Wnd->Wnd->style & WS_POPUP) && - UserGetWindow(List[i], GW_OWNER) == hWnd) + if (Wnd->Wnd->style & WS_POPUP && Wnd->spwndOwner == Window) { USER_REFERENCE_ENTRY Ref; UserRefObjectCo(Wnd, &Ref); @@ -958,7 +961,7 @@ WinPosFixupFlags(WINDOWPOS *WinPos, PWINDOW_OBJECT Window) * itself. */ if ((WinPos->hwnd == WinPos->hwndInsertAfter) || - (WinPos->hwnd == UserGetWindow(WinPos->hwndInsertAfter, GW_HWNDNEXT))) + (WinPos->hwnd == InsAfterWnd->spwndNext->hSelf)) { WinPos->flags |= SWP_NOZORDER; } @@ -1463,6 +1466,33 @@ co_WinPosGetNonClientSize(PWINDOW_OBJECT Window, RECT* WindowRect, RECT* ClientR return Result; } +void FASTCALL +co_WinPosSendSizeMove(PWINDOW_OBJECT Window) +{ + WPARAM wParam = SIZE_RESTORED; + PWND Wnd = Window->Wnd; + + Window->state &= ~WINDOWOBJECT_NEED_SIZE; + if (Wnd->style & WS_MAXIMIZE) + { + wParam = SIZE_MAXIMIZED; + } + else if (Wnd->style & WS_MINIMIZE) + { + wParam = SIZE_MINIMIZED; + } + + co_IntSendMessageNoWait(Window->hSelf, WM_SIZE, wParam, + MAKELONG(Wnd->rcClient.right - + Wnd->rcClient.left, + Wnd->rcClient.bottom - + Wnd->rcClient.top)); + co_IntSendMessageNoWait(Window->hSelf, WM_MOVE, 0, + MAKELONG(Wnd->rcClient.left, + Wnd->rcClient.top)); + IntEngWindowChanged(Window, WOC_RGN_CLIENT); +} + BOOLEAN FASTCALL co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) { @@ -1621,28 +1651,7 @@ co_WinPosShowWindow(PWINDOW_OBJECT Window, INT Cmd) if ((Window->state & WINDOWOBJECT_NEED_SIZE) && !(Window->state & WINDOWSTATUS_DESTROYING)) { - WPARAM wParam = SIZE_RESTORED; - - Window->state &= ~WINDOWOBJECT_NEED_SIZE; - if (Wnd->style & WS_MAXIMIZE) - { - wParam = SIZE_MAXIMIZED; - } - else if (Wnd->style & WS_MINIMIZE) - { - wParam = SIZE_MINIMIZED; - } - - co_IntSendMessageNoWait(Window->hSelf, WM_SIZE, wParam, - MAKELONG(Wnd->rcClient.right - - Wnd->rcClient.left, - Wnd->rcClient.bottom - - Wnd->rcClient.top)); - co_IntSendMessageNoWait(Window->hSelf, WM_MOVE, 0, - MAKELONG(Wnd->rcClient.left, - Wnd->rcClient.top)); - IntEngWindowChanged(Window, WOC_RGN_CLIENT); - + co_WinPosSendSizeMove(Window); } /* Activate the window if activation is not requested and the window is not minimized */ diff --git a/subsystems/win32/win32k/objects/icm.c b/subsystems/win32/win32k/objects/icm.c index dd99ea3d89d..f0d7ef72e7a 100644 --- a/subsystems/win32/win32k/objects/icm.c +++ b/subsystems/win32/win32k/objects/icm.c @@ -146,7 +146,7 @@ NtGdiGetDeviceGammaRamp(HDC hDC, return FALSE; } - SafeRamp = ExAllocatePool(PagedPool, sizeof(GAMMARAMP)); + SafeRamp = ExAllocatePoolWithTag(PagedPool, sizeof(GAMMARAMP), TAG_GDIICM); if (!SafeRamp) { DC_UnlockDc(dc); @@ -174,7 +174,7 @@ NtGdiGetDeviceGammaRamp(HDC hDC, _SEH2_END; DC_UnlockDc(dc); - ExFreePool(SafeRamp); + ExFreePoolWithTag(SafeRamp, TAG_GDIICM); if (!NT_SUCCESS(Status)) { @@ -377,7 +377,7 @@ NtGdiSetDeviceGammaRamp(HDC hDC, return FALSE; } - SafeRamp = ExAllocatePool(PagedPool, sizeof(GAMMARAMP)); + SafeRamp = ExAllocatePoolWithTag(PagedPool, sizeof(GAMMARAMP), TAG_GDIICM); if (!SafeRamp) { DC_UnlockDc(dc); @@ -402,14 +402,14 @@ NtGdiSetDeviceGammaRamp(HDC hDC, if (!NT_SUCCESS(Status)) { DC_UnlockDc(dc); - ExFreePool(SafeRamp); + ExFreePoolWithTag(SafeRamp, TAG_GDIICM); SetLastNtError(Status); return FALSE; } Ret = IntSetDeviceGammaRamp((HDEV)dc->ppdev, SafeRamp, TRUE); DC_UnlockDc(dc); - ExFreePool(SafeRamp); + ExFreePoolWithTag(SafeRamp, TAG_GDIICM); return Ret; } diff --git a/subsystems/win32/win32k/objects/palette.c b/subsystems/win32/win32k/objects/palette.c index 40cd2615450..37ed607ef0d 100644 --- a/subsystems/win32/win32k/objects/palette.c +++ b/subsystems/win32/win32k/objects/palette.c @@ -62,9 +62,6 @@ HPALETTE FASTCALL PALETTE_Init(VOID) int i; HPALETTE hpalette; PLOGPALETTE palPtr; -#ifndef NO_MAPPING - PALOBJ *palObj; -#endif // create default palette (20 system colors) palPtr = ExAllocatePoolWithTag(PagedPool, @@ -86,19 +83,6 @@ HPALETTE FASTCALL PALETTE_Init(VOID) hpalette = NtGdiCreatePaletteInternal(palPtr,NB_RESERVED_COLORS); ExFreePoolWithTag(palPtr, TAG_PALETTE); -#ifndef NO_MAPPING - palObj = (PALOBJ*)PALETTE_LockPalette(hpalette); - if (palObj) - { - if (!(palObj->mapping = ExAllocatePool(PagedPool, sizeof(int) * 20))) - { - DbgPrint("Win32k: Can not create palette mapping -- out of memory!"); - return FALSE; - } - PALETTE_UnlockPalette(palObj); - } -#endif - /* palette_size = visual->map_entries; */ gpalRGB.Mode = PAL_RGB; @@ -266,7 +250,7 @@ PALETTE_Cleanup(PVOID ObjectBody) PPALETTE pPal = (PPALETTE)ObjectBody; if (NULL != pPal->IndexedColors) { - ExFreePool(pPal->IndexedColors); + ExFreePoolWithTag(pPal->IndexedColors, TAG_PALETTE); } return TRUE; @@ -487,7 +471,7 @@ NtGdiCreatePaletteInternal ( IN LPLOGPALETTE pLogPal, IN UINT cEntries ) else { /* FIXME - Handle PalGDI == NULL!!!! */ - DPRINT1("waring PalGDI is NULL \n"); + DPRINT1("PalGDI is NULL\n"); } return NewPalette; } @@ -1015,7 +999,7 @@ NtGdiDoPalette( if (pUnsafeEntries) { - pEntries = ExAllocatePool(PagedPool, cEntries * sizeof(PALETTEENTRY)); + pEntries = ExAllocatePoolWithTag(PagedPool, cEntries * sizeof(PALETTEENTRY), TAG_PALETTE); if (!pEntries) return 0; if (bInbound) @@ -1027,7 +1011,7 @@ NtGdiDoPalette( } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { - ExFreePool(pEntries); + ExFreePoolWithTag(pEntries, TAG_PALETTE); _SEH2_YIELD(return 0); } _SEH2_END @@ -1081,7 +1065,7 @@ NtGdiDoPalette( } _SEH2_END } - ExFreePool(pEntries); + ExFreePoolWithTag(pEntries, TAG_PALETTE); } return ret; diff --git a/subsystems/win32/win32k/w32ksvc.db b/subsystems/win32/win32k/w32ksvc.db index acce60122d2..0b90145a90f 100644 --- a/subsystems/win32/win32k/w32ksvc.db +++ b/subsystems/win32/win32k/w32ksvc.db @@ -684,7 +684,6 @@ NtGdiOffsetWindowOrgEx 4 # NtUserBuildMenuItemList 4 NtUserCreateCursorIconHandle 2 -NtUserGetClassLong 3 NtUserGetMenuDefaultItem 3 NtUserGetLastInputInfo 1 NtUserGetMinMaxInfo 3