1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC src/core/sys/windows/_winnls.d)
9  */
10 module core.sys.windows.winnls;
version(Windows)11 version (Windows):
12 @system:
13 
14 version (ANSI) {} else version = Unicode;
15 pragma(lib, "kernel32");
16 
17 import core.sys.windows.basetsd, core.sys.windows.w32api, core.sys.windows.winbase, core.sys.windows.windef;
18 
19 alias DWORD LCTYPE, CALTYPE, CALID, LGRPID, GEOID, GEOTYPE, GEOCLASS;
20 
21 enum size_t
22     MAX_DEFAULTCHAR =  2,
23     MAX_LEADBYTES   = 12;
24 
25 enum LCTYPE
26     LOCALE_USE_CP_ACP    = 0x40000000,
27     LOCALE_RETURN_NUMBER = 0x20000000;
28 
29 enum : LCTYPE {
30     LOCALE_ILANGUAGE = 1,
31     LOCALE_SLANGUAGE,
32     LOCALE_SABBREVLANGNAME,
33     LOCALE_SNATIVELANGNAME,
34     LOCALE_ICOUNTRY,
35     LOCALE_SCOUNTRY,
36     LOCALE_SABBREVCTRYNAME,
37     LOCALE_SNATIVECTRYNAME,
38     LOCALE_IDEFAULTLANGUAGE,
39     LOCALE_IDEFAULTCOUNTRY,
40     LOCALE_IDEFAULTCODEPAGE,
41     LOCALE_SLIST,
42     LOCALE_IMEASURE,
43     LOCALE_SDECIMAL,
44     LOCALE_STHOUSAND,
45     LOCALE_SGROUPING,
46     LOCALE_IDIGITS,
47     LOCALE_ILZERO,
48     LOCALE_SNATIVEDIGITS,
49     LOCALE_SCURRENCY,
50     LOCALE_SINTLSYMBOL,
51     LOCALE_SMONDECIMALSEP,
52     LOCALE_SMONTHOUSANDSEP,
53     LOCALE_SMONGROUPING,
54     LOCALE_ICURRDIGITS,
55     LOCALE_IINTLCURRDIGITS,
56     LOCALE_ICURRENCY,
57     LOCALE_INEGCURR,
58     LOCALE_SDATE,
59     LOCALE_STIME,
60     LOCALE_SSHORTDATE,
61     LOCALE_SLONGDATE,
62     LOCALE_IDATE,
63     LOCALE_ILDATE,
64     LOCALE_ITIME,
65     LOCALE_ICENTURY,
66     LOCALE_ITLZERO,
67     LOCALE_IDAYLZERO,
68     LOCALE_IMONLZERO,
69     LOCALE_S1159,
70     LOCALE_S2359,
71     LOCALE_SDAYNAME1,
72     LOCALE_SDAYNAME2,
73     LOCALE_SDAYNAME3,
74     LOCALE_SDAYNAME4,
75     LOCALE_SDAYNAME5,
76     LOCALE_SDAYNAME6,
77     LOCALE_SDAYNAME7,
78     LOCALE_SABBREVDAYNAME1,
79     LOCALE_SABBREVDAYNAME2,
80     LOCALE_SABBREVDAYNAME3,
81     LOCALE_SABBREVDAYNAME4,
82     LOCALE_SABBREVDAYNAME5,
83     LOCALE_SABBREVDAYNAME6,
84     LOCALE_SABBREVDAYNAME7,
85     LOCALE_SMONTHNAME1,
86     LOCALE_SMONTHNAME2,
87     LOCALE_SMONTHNAME3,
88     LOCALE_SMONTHNAME4,
89     LOCALE_SMONTHNAME5,
90     LOCALE_SMONTHNAME6,
91     LOCALE_SMONTHNAME7,
92     LOCALE_SMONTHNAME8,
93     LOCALE_SMONTHNAME9,
94     LOCALE_SMONTHNAME10,
95     LOCALE_SMONTHNAME11,
96     LOCALE_SMONTHNAME12,
97     LOCALE_SABBREVMONTHNAME1,
98     LOCALE_SABBREVMONTHNAME2,
99     LOCALE_SABBREVMONTHNAME3,
100     LOCALE_SABBREVMONTHNAME4,
101     LOCALE_SABBREVMONTHNAME5,
102     LOCALE_SABBREVMONTHNAME6,
103     LOCALE_SABBREVMONTHNAME7,
104     LOCALE_SABBREVMONTHNAME8,
105     LOCALE_SABBREVMONTHNAME9,
106     LOCALE_SABBREVMONTHNAME10,
107     LOCALE_SABBREVMONTHNAME11,
108     LOCALE_SABBREVMONTHNAME12,
109     LOCALE_SPOSITIVESIGN,
110     LOCALE_SNEGATIVESIGN,
111     LOCALE_IPOSSIGNPOSN,
112     LOCALE_INEGSIGNPOSN,
113     LOCALE_IPOSSYMPRECEDES,
114     LOCALE_IPOSSEPBYSPACE,
115     LOCALE_INEGSYMPRECEDES,
116     LOCALE_INEGSEPBYSPACE,
117     LOCALE_FONTSIGNATURE,
118     LOCALE_SISO639LANGNAME,
119     LOCALE_SISO3166CTRYNAME, // = 90
120     LOCALE_SENGLANGUAGE         = 0x1001,
121     LOCALE_SENGCOUNTRY          = 0x1002,
122     LOCALE_IDEFAULTANSICODEPAGE = 0x1004,
123     LOCALE_INEGNUMBER           = 0x1010,
124     LOCALE_STIMEFORMAT          = 0x1003,
125     LOCALE_ITIMEMARKPOSN        = 0x1005,
126     LOCALE_ICALENDARTYPE        = 0x1009,
127     LOCALE_IOPTIONALCALENDAR    = 0x100B,
128     LOCALE_IFIRSTDAYOFWEEK      = 0x100C,
129     LOCALE_IFIRSTWEEKOFYEAR     = 0x100D,
130     LOCALE_SMONTHNAME13         = 0x100E,
131     LOCALE_SABBREVMONTHNAME13   = 0x100F
132 }
133 
134 enum : LCID {
135     LOCALE_USER_DEFAULT   = 0x400,
136     LOCALE_SYSTEM_DEFAULT = 0x800
137 }
138 
139 enum DWORD
140     NORM_IGNORECASE     =       1,
141     NORM_IGNORENONSPACE =       2,
142     NORM_IGNORESYMBOLS  =       4,
143     SORT_STRINGSORT     = 0x01000,
144     NORM_IGNOREKANATYPE = 0x10000,
145     NORM_IGNOREWIDTH    = 0x20000;
146 
147 enum DWORD
148     LCMAP_LOWERCASE           = 0x00000100,
149     LCMAP_UPPERCASE           = 0x00000200,
150     LCMAP_SORTKEY             = 0x00000400,
151     LCMAP_BYTEREV             = 0x00000800,
152     LCMAP_HIRAGANA            = 0x00100000,
153     LCMAP_KATAKANA            = 0x00200000,
154     LCMAP_HALFWIDTH           = 0x00400000,
155     LCMAP_FULLWIDTH           = 0x00800000,
156     LCMAP_LINGUISTIC_CASING   = 0x01000000,
157     LCMAP_SIMPLIFIED_CHINESE  = 0x02000000,
158     LCMAP_TRADITIONAL_CHINESE = 0x04000000;
159 
160 enum CALID ENUM_ALL_CALENDARS = -1;
161 
162 enum DWORD
163     DATE_SHORTDATE        =          1,
164     DATE_LONGDATE         =          2,
165     DATE_USE_ALT_CALENDAR =          4,
166     LOCALE_NOUSEROVERRIDE = 0x80000000;
167 
168 enum : DWORD {
169     CP_INSTALLED = 1,
170     CP_SUPPORTED
171 }
172 
173 enum : DWORD {
174     LCID_INSTALLED       = 1,
175     LCID_SUPPORTED       = 2,
176     LCID_ALTERNATE_SORTS = 4
177 }
178 
179 enum DWORD
180     MAP_FOLDCZONE   =  16,
181     MAP_PRECOMPOSED =  32,
182     MAP_COMPOSITE   =  64,
183     MAP_FOLDDIGITS  = 128;
184 
185 enum : UINT {
186     CP_ACP,
187     CP_OEMCP,
188     CP_MACCP,
189     CP_THREAD_ACP, // =     3
190     CP_SYMBOL         =    42,
191     CP_UTF7           = 65000,
192     CP_UTF8           = 65001
193 }
194 
195 enum : DWORD {
196     CT_CTYPE1 = 1,
197     CT_CTYPE2 = 2,
198     CT_CTYPE3 = 4
199 }
200 
201 enum WORD
202     C1_UPPER  =   1,
203     C1_LOWER  =   2,
204     C1_DIGIT  =   4,
205     C1_SPACE  =   8,
206     C1_PUNCT  =  16,
207     C1_CNTRL  =  32,
208     C1_BLANK  =  64,
209     C1_XDIGIT = 128,
210     C1_ALPHA  = 256;
211 
212 enum : WORD {
213     C2_NOTAPPLICABLE,
214     C2_LEFTTORIGHT,
215     C2_RIGHTTOLEFT,
216     C2_EUROPENUMBER,
217     C2_EUROPESEPARATOR,
218     C2_EUROPETERMINATOR,
219     C2_ARABICNUMBER,
220     C2_COMMONSEPARATOR,
221     C2_BLOCKSEPARATOR,
222     C2_SEGMENTSEPARATOR,
223     C2_WHITESPACE,
224     C2_OTHERNEUTRAL  // = 11
225 }
226 
227 enum WORD
228     C3_NOTAPPLICABLE =      0,
229     C3_NONSPACING    =      1,
230     C3_DIACRITIC     =      2,
231     C3_VOWELMARK     =      4,
232     C3_SYMBOL        =      8,
233     C3_KATAKANA      = 0x0010,
234     C3_HIRAGANA      = 0x0020,
235     C3_HALFWIDTH     = 0x0040,
236     C3_FULLWIDTH     = 0x0080,
237     C3_IDEOGRAPH     = 0x0100,
238     C3_KASHIDA       = 0x0200,
239     C3_LEXICAL       = 0x0400,
240     C3_ALPHA         = 0x8000;
241 
242 enum DWORD
243     TIME_NOMINUTESORSECONDS = 1,
244     TIME_NOSECONDS          = 2,
245     TIME_NOTIMEMARKER       = 4,
246     TIME_FORCE24HOURFORMAT  = 8;
247 
248 enum DWORD
249     MB_PRECOMPOSED       = 1,
250     MB_COMPOSITE         = 2,
251     MB_USEGLYPHCHARS     = 4,
252     MB_ERR_INVALID_CHARS = 8;
253 
254 enum DWORD
255     WC_DISCARDNS      =  16,
256     WC_SEPCHARS       =  32,
257     WC_DEFAULTCHAR    =  64,
258     WC_COMPOSITECHECK = 512;
259 
260 enum : LONG {
261     CTRY_DEFAULT            =   0,
262     CTRY_DOMINICAN_REPUBLIC =   1,
263     CTRY_PUERTO_RICO        =   1,
264     CTRY_CARIBBEAN          =   1,
265     CTRY_JAMAICA            =   1,
266     CTRY_UNITED_STATES      =   1,
267     CTRY_TRINIDAD_Y_TOBAGO  =   1,
268     CTRY_CANADA             =   2,
269     CTRY_RUSSIA             =   7,
270     CTRY_UZBEKISTAN         =   7,
271     CTRY_KAZAKSTAN          =   7,
272     CTRY_TATARSTAN          =   7,
273     CTRY_EGYPT              =  20,
274     CTRY_SOUTH_AFRICA       =  27,
275     CTRY_GREECE             =  30,
276     CTRY_NETHERLANDS        =  31,
277     CTRY_BELGIUM            =  32,
278     CTRY_FRANCE             =  33,
279     CTRY_MONACO             =  33,
280     CTRY_SPAIN              =  34,
281     CTRY_HUNGARY            =  36,
282     CTRY_ITALY              =  39,
283     CTRY_ROMANIA            =  40,
284     CTRY_SWITZERLAND        =  41,
285     CTRY_LIECHTENSTEIN      =  41,
286     CTRY_AUSTRIA            =  43,
287     CTRY_UNITED_KINGDOM     =  44,
288     CTRY_DENMARK            =  45,
289     CTRY_SWEDEN             =  46,
290     CTRY_NORWAY             =  47,
291     CTRY_POLAND             =  48,
292     CTRY_GERMANY            =  49,
293     CTRY_PERU               =  51,
294     CTRY_MEXICO             =  52,
295     CTRY_ARGENTINA          =  54,
296     CTRY_BRAZIL             =  55,
297     CTRY_CHILE              =  56,
298     CTRY_COLOMBIA           =  57,
299     CTRY_VENEZUELA          =  58,
300     CTRY_MALAYSIA           =  60,
301     CTRY_AUSTRALIA          =  61,
302     CTRY_INDONESIA          =  62,
303     CTRY_PHILIPPINES        =  63,
304     CTRY_NEW_ZEALAND        =  64,
305     CTRY_SINGAPORE          =  65,
306     CTRY_THAILAND           =  66,
307     CTRY_JAPAN              =  81,
308     CTRY_SOUTH_KOREA        =  82,
309     CTRY_VIET_NAM           =  84,
310     CTRY_PRCHINA            =  86,
311     CTRY_TURKEY             =  90,
312     CTRY_INDIA              =  91,
313     CTRY_PAKISTAN           =  92,
314     CTRY_MOROCCO            = 212,
315     CTRY_ALGERIA            = 213,
316     CTRY_TUNISIA            = 216,
317     CTRY_LIBYA              = 218,
318     CTRY_KENYA              = 254,
319     CTRY_ZIMBABWE           = 263,
320     CTRY_FAEROE_ISLANDS     = 298,
321     CTRY_PORTUGAL           = 351,
322     CTRY_LUXEMBOURG         = 352,
323     CTRY_IRELAND            = 353,
324     CTRY_ICELAND            = 354,
325     CTRY_ALBANIA            = 355,
326     CTRY_FINLAND            = 358,
327     CTRY_BULGARIA           = 359,
328     CTRY_LITHUANIA          = 370,
329     CTRY_LATVIA             = 371,
330     CTRY_ESTONIA            = 372,
331     CTRY_ARMENIA            = 374,
332     CTRY_BELARUS            = 375,
333     CTRY_UKRAINE            = 380,
334     CTRY_SERBIA             = 381,
335     CTRY_CROATIA            = 385,
336     CTRY_SLOVENIA           = 386,
337     CTRY_MACEDONIA          = 389,
338     CTRY_CZECH              = 420,
339     CTRY_SLOVAK             = 421,
340     CTRY_BELIZE             = 501,
341     CTRY_GUATEMALA          = 502,
342     CTRY_EL_SALVADOR        = 503,
343     CTRY_HONDURAS           = 504,
344     CTRY_NICARAGUA          = 505,
345     CTRY_COSTA_RICA         = 506,
346     CTRY_PANAMA             = 507,
347     CTRY_BOLIVIA            = 591,
348     CTRY_ECUADOR            = 593,
349     CTRY_PARAGUAY           = 595,
350     CTRY_URUGUAY            = 598,
351     CTRY_BRUNEI_DARUSSALAM  = 673,
352     CTRY_HONG_KONG          = 852,
353     CTRY_MACAU              = 853,
354     CTRY_TAIWAN             = 886,
355     CTRY_MALDIVES           = 960,
356     CTRY_LEBANON            = 961,
357     CTRY_JORDAN             = 962,
358     CTRY_SYRIA              = 963,
359     CTRY_IRAQ               = 964,
360     CTRY_KUWAIT             = 965,
361     CTRY_SAUDI_ARABIA       = 966,
362     CTRY_YEMEN              = 967,
363     CTRY_OMAN               = 968,
364     CTRY_UAE                = 971,
365     CTRY_ISRAEL             = 972,
366     CTRY_BAHRAIN            = 973,
367     CTRY_QATAR              = 974,
368     CTRY_MONGOLIA           = 976,
369     CTRY_IRAN               = 981,
370     CTRY_AZERBAIJAN         = 994,
371     CTRY_GEORGIA            = 995,
372     CTRY_KYRGYZSTAN         = 996
373 }
374 
375 enum : CALTYPE {
376     CAL_ICALINTVALUE          = 1,
377     CAL_SCALNAME,
378     CAL_IYEAROFFSETRANGE,
379     CAL_SERASTRING,
380     CAL_SSHORTDATE,
381     CAL_SLONGDATE,
382     CAL_SDAYNAME1,
383     CAL_SDAYNAME2,
384     CAL_SDAYNAME3,
385     CAL_SDAYNAME4,
386     CAL_SDAYNAME5,
387     CAL_SDAYNAME6,
388     CAL_SDAYNAME7,
389     CAL_SABBREVDAYNAME1,
390     CAL_SABBREVDAYNAME2,
391     CAL_SABBREVDAYNAME3,
392     CAL_SABBREVDAYNAME4,
393     CAL_SABBREVDAYNAME5,
394     CAL_SABBREVDAYNAME6,
395     CAL_SABBREVDAYNAME7,
396     CAL_SMONTHNAME1,
397     CAL_SMONTHNAME2,
398     CAL_SMONTHNAME3,
399     CAL_SMONTHNAME4,
400     CAL_SMONTHNAME5,
401     CAL_SMONTHNAME6,
402     CAL_SMONTHNAME7,
403     CAL_SMONTHNAME8,
404     CAL_SMONTHNAME9,
405     CAL_SMONTHNAME10,
406     CAL_SMONTHNAME11,
407     CAL_SMONTHNAME12,
408     CAL_SMONTHNAME13,
409     CAL_SABBREVMONTHNAME1,
410     CAL_SABBREVMONTHNAME2,
411     CAL_SABBREVMONTHNAME3,
412     CAL_SABBREVMONTHNAME4,
413     CAL_SABBREVMONTHNAME5,
414     CAL_SABBREVMONTHNAME6,
415     CAL_SABBREVMONTHNAME7,
416     CAL_SABBREVMONTHNAME8,
417     CAL_SABBREVMONTHNAME9,
418     CAL_SABBREVMONTHNAME10,
419     CAL_SABBREVMONTHNAME11,
420     CAL_SABBREVMONTHNAME12,
421     CAL_SABBREVMONTHNAME13 // = 46
422 }
423 
424 
425 enum : CALTYPE {
426     CAL_GREGORIAN                =  1,
427     CAL_GREGORIAN_US,
428     CAL_JAPAN,
429     CAL_TAIWAN,
430     CAL_KOREA,
431     CAL_HIJRI,
432     CAL_THAI,
433     CAL_HEBREW,
434     CAL_GREGORIAN_ME_FRENCH,
435     CAL_GREGORIAN_ARABIC,
436     CAL_GREGORIAN_XLIT_ENGLISH,
437     CAL_GREGORIAN_XLIT_FRENCH // = 12
438 }
439 
440 enum : int {
441     CSTR_LESS_THAN    = 1,
442     CSTR_EQUAL,
443     CSTR_GREATER_THAN
444 }
445 
446 enum : DWORD {
447     LGRPID_INSTALLED = 1,
448     LGRPID_SUPPORTED
449 }
450 
451 enum : LGRPID {
452     LGRPID_WESTERN_EUROPE = 1,
453     LGRPID_CENTRAL_EUROPE,
454     LGRPID_BALTIC,
455     LGRPID_GREEK,
456     LGRPID_CYRILLIC,
457     LGRPID_TURKISH,
458     LGRPID_JAPANESE,
459     LGRPID_KOREAN,
460     LGRPID_TRADITIONAL_CHINESE,
461     LGRPID_SIMPLIFIED_CHINESE,
462     LGRPID_THAI,
463     LGRPID_HEBREW,
464     LGRPID_ARABIC,
465     LGRPID_VIETNAMESE,
466     LGRPID_INDIC,
467     LGRPID_GEORGIAN,
468     LGRPID_ARMENIAN // = 17
469 }
470 
471 static if (_WIN32_WINNT >= 0x500) {
472     enum : LCTYPE {
473         LOCALE_SYEARMONTH             = 0x1006,
474         LOCALE_SENGCURRNAME           = 0x1007,
475         LOCALE_SNATIVECURRNAME        = 0x1008,
476         LOCALE_IDEFAULTEBCDICCODEPAGE = 0x1012,
477         LOCALE_SSORTNAME              = 0x1013,
478         LOCALE_IDIGITSUBSTITUTION     = 0x1014,
479         LOCALE_IPAPERSIZE             = 0x100A
480     }
481 
482 enum DWORD
483         DATE_YEARMONTH  =  8,
484         DATE_LTRREADING = 16,
485         DATE_RTLREADING = 32;
486 
487 enum DWORD MAP_EXPAND_LIGATURES = 0x2000;
488 enum DWORD WC_NO_BEST_FIT_CHARS = 1024;
489 
490     enum : CALTYPE {
491         CAL_SYEARMONTH       = 47,
492         CAL_ITWODIGITYEARMAX = 48,
493         CAL_NOUSEROVERRIDE   = LOCALE_NOUSEROVERRIDE,
494         CAL_RETURN_NUMBER    = LOCALE_RETURN_NUMBER,
495         CAL_USE_CP_ACP       = LOCALE_USE_CP_ACP
496     }
497 } // (_WIN32_WINNT >= 0x500)
498 
499 extern (Windows) {
500     alias BOOL function(LPSTR) CALINFO_ENUMPROCA;
501     alias BOOL function(LPWSTR) CALINFO_ENUMPROCW;
502     alias BOOL function(LPSTR, CALID) CALINFO_ENUMPROCEXA;
503     alias BOOL function(LPWSTR, CALID) CALINFO_ENUMPROCEXW;
504     alias BOOL function(LGRPID, LPSTR, LPSTR, DWORD, LONG_PTR)
505       LANGUAGEGROUP_ENUMPROCA;
506     alias BOOL function(LGRPID, LPWSTR, LPWSTR, DWORD, LONG_PTR)
507       LANGUAGEGROUP_ENUMPROCW;
508     alias BOOL function(LGRPID, LCID, LPSTR, LONG_PTR)
509       LANGGROUPLOCALE_ENUMPROCA;
510     alias BOOL function(LGRPID, LCID, LPWSTR, LONG_PTR)
511       LANGGROUPLOCALE_ENUMPROCW;
512     alias BOOL function(LPWSTR, LONG_PTR) UILANGUAGE_ENUMPROCW;
513     alias BOOL function(LPSTR, LONG_PTR) UILANGUAGE_ENUMPROCA;
514     alias BOOL function(LPSTR) LOCALE_ENUMPROCA;
515     alias BOOL function(LPWSTR) LOCALE_ENUMPROCW;
516     alias BOOL function(LPSTR) CODEPAGE_ENUMPROCA;
517     alias BOOL function(LPWSTR) CODEPAGE_ENUMPROCW;
518     alias BOOL function(LPSTR) DATEFMT_ENUMPROCA;
519     alias BOOL function(LPWSTR) DATEFMT_ENUMPROCW;
520     alias BOOL function(LPSTR, CALID) DATEFMT_ENUMPROCEXA;
521     alias BOOL function(LPWSTR, CALID) DATEFMT_ENUMPROCEXW;
522     alias BOOL function(LPSTR) TIMEFMT_ENUMPROCA;
523     alias BOOL function(LPWSTR) TIMEFMT_ENUMPROCW;
524     alias BOOL function(GEOID) GEO_ENUMPROC;
525 }
526 
527 enum NLS_FUNCTION {
528     COMPARE_STRING = 0x0001
529 }
530 
531 enum SYSGEOCLASS {
532     GEOCLASS_NATION = 16,
533     GEOCLASS_REGION = 14
534 }
535 
536 enum SYSGEOTYPE {
537     GEO_NATION            = 0x0001,
538     GEO_LATITUDE          = 0x0002,
539     GEO_LONGITUDE         = 0x0003,
540     GEO_ISO2              = 0x0004,
541     GEO_ISO3              = 0x0005,
542     GEO_RFC1766           = 0x0006,
543     GEO_LCID              = 0x0007,
544     GEO_FRIENDLYNAME      = 0x0008,
545     GEO_OFFICIALNAME      = 0x0009,
546     GEO_TIMEZONES         = 0x000a,
547     GEO_OFFICIALLANGUAGES = 0x000a
548 }
549 
550 struct CPINFO {
551     UINT                  MaxCharSize;
552     BYTE[MAX_DEFAULTCHAR] DefaultChar;
553     BYTE[MAX_LEADBYTES]   LeadByte;
554 }
555 alias CPINFO* LPCPINFO;
556 
557 struct CPINFOEXA {
558     UINT                  MaxCharSize;
559     BYTE[MAX_DEFAULTCHAR] DefaultChar;
560     BYTE[MAX_LEADBYTES]   LeadByte;
561     WCHAR                 UnicodeDefaultChar = 0;
562     UINT                  CodePage;
563     CHAR[MAX_PATH]        CodePageName = 0;
564 }
565 alias CPINFOEXA* LPCPINFOEXA;
566 
567 struct CPINFOEXW {
568     UINT                  MaxCharSize;
569     BYTE[MAX_DEFAULTCHAR] DefaultChar;
570     BYTE[MAX_LEADBYTES]   LeadByte;
571     WCHAR                 UnicodeDefaultChar = 0;
572     UINT                  CodePage;
573     WCHAR[MAX_PATH]       CodePageName = 0;
574 }
575 alias CPINFOEXW* LPCPINFOEXW;
576 
577 struct CURRENCYFMTA {
578     UINT  NumDigits;
579     UINT  LeadingZero;
580     UINT  Grouping;
581     LPSTR lpDecimalSep;
582     LPSTR lpThousandSep;
583     UINT  NegativeOrder;
584     UINT  PositiveOrder;
585     LPSTR lpCurrencySymbol;
586 }
587 alias CURRENCYFMTA* LPCURRENCYFMTA;
588 
589 struct CURRENCYFMTW {
590     UINT   NumDigits;
591     UINT   LeadingZero;
592     UINT   Grouping;
593     LPWSTR lpDecimalSep;
594     LPWSTR lpThousandSep;
595     UINT   NegativeOrder;
596     UINT   PositiveOrder;
597     LPWSTR lpCurrencySymbol;
598 }
599 alias CURRENCYFMTW* LPCURRENCYFMTW;
600 
601 struct NLSVERSIONINFO {
602     DWORD dwNLSVersionInfoSize;
603     DWORD dwNLSVersion;
604     DWORD dwDefinedVersion;
605 }
606 alias NLSVERSIONINFO* LPNLSVERSIONINFO;
607 
608 struct NUMBERFMTA {
609     UINT  NumDigits;
610     UINT  LeadingZero;
611     UINT  Grouping;
612     LPSTR lpDecimalSep;
613     LPSTR lpThousandSep;
614     UINT  NegativeOrder;
615 }
616 alias NUMBERFMTA* LPNUMBERFMTA;
617 
618 struct NUMBERFMTW {
619     UINT   NumDigits;
620     UINT   LeadingZero;
621     UINT   Grouping;
622     LPWSTR lpDecimalSep;
623     LPWSTR lpThousandSep;
624     UINT   NegativeOrder;
625 }
626 alias NUMBERFMTW* LPNUMBERFMTW;
627 
628 extern (Windows) nothrow @nogc {
629     int CompareStringA(LCID, DWORD, LPCSTR, int, LPCSTR, int);
630     int CompareStringW(LCID, DWORD, LPCWSTR, int, LPCWSTR, int);
631     LCID ConvertDefaultLocale(LCID);
632     BOOL EnumCalendarInfoA(CALINFO_ENUMPROCA, LCID, CALID, CALTYPE);
633     BOOL EnumCalendarInfoW(CALINFO_ENUMPROCW, LCID, CALID, CALTYPE);
634     BOOL EnumDateFormatsA(DATEFMT_ENUMPROCA, LCID, DWORD);
635     BOOL EnumDateFormatsW(DATEFMT_ENUMPROCW, LCID, DWORD);
636     BOOL EnumSystemCodePagesA(CODEPAGE_ENUMPROCA, DWORD);
637     BOOL EnumSystemCodePagesW(CODEPAGE_ENUMPROCW, DWORD);
638     BOOL EnumSystemGeoID(GEOCLASS, GEOID, GEO_ENUMPROC);
639     BOOL EnumSystemLocalesA(LOCALE_ENUMPROCA, DWORD);
640     BOOL EnumSystemLocalesW(LOCALE_ENUMPROCW, DWORD);
641     BOOL EnumTimeFormatsA(TIMEFMT_ENUMPROCA, LCID, DWORD);
642     BOOL EnumTimeFormatsW(TIMEFMT_ENUMPROCW, LCID, DWORD);
643     int FoldStringA(DWORD, LPCSTR, int, LPSTR, int);
644     int FoldStringW(DWORD, LPCWSTR, int, LPWSTR, int);
645     UINT GetACP();
646     int GetCalendarInfoA(LCID, CALID, CALTYPE, LPSTR, int, LPDWORD);
647     int GetCalendarInfoW(LCID, CALID, CALTYPE, LPWSTR, int, LPDWORD);
648     BOOL GetCPInfo(UINT, LPCPINFO);
649     BOOL GetCPInfoExA(UINT, DWORD, LPCPINFOEXA);
650     BOOL GetCPInfoExW(UINT, DWORD, LPCPINFOEXW);
651     int GetCurrencyFormatA(LCID, DWORD, LPCSTR,  const(CURRENCYFMTA)*, LPSTR, int);
652     int GetCurrencyFormatW(LCID, DWORD, LPCWSTR,  const(CURRENCYFMTW)*, LPWSTR,
653       int);
654     int GetDateFormatA(LCID, DWORD,  const(SYSTEMTIME)*, LPCSTR, LPSTR, int);
655     int GetDateFormatW(LCID, DWORD,  const(SYSTEMTIME)*, LPCWSTR, LPWSTR, int);
656     int GetGeoInfoA(GEOID, GEOTYPE, LPSTR, int, LANGID);
657     int GetGeoInfoW(GEOID, GEOTYPE, LPWSTR, int, LANGID);
658     int GetLocaleInfoA(LCID, LCTYPE, LPSTR, int);
659     int GetLocaleInfoW(LCID, LCTYPE, LPWSTR, int);
660     BOOL GetNLSVersion(NLS_FUNCTION, LCID, LPNLSVERSIONINFO);
661     int GetNumberFormatA(LCID, DWORD, LPCSTR,  const(NUMBERFMTA)*, LPSTR, int);
662     int GetNumberFormatW(LCID, DWORD, LPCWSTR,  const(NUMBERFMTW)*, LPWSTR, int);
663     UINT GetOEMCP();
664     BOOL GetStringTypeA(LCID, DWORD, LPCSTR, int, LPWORD);
665     BOOL GetStringTypeW(DWORD, LPCWSTR, int, LPWORD);
666     BOOL GetStringTypeExA(LCID, DWORD, LPCSTR, int, LPWORD);
667     BOOL GetStringTypeExW(LCID, DWORD, LPCWSTR, int, LPWORD);
668     LANGID GetSystemDefaultLangID();
669     LCID GetSystemDefaultLCID();
670     LCID GetThreadLocale();
671     int GetTimeFormatA(LCID, DWORD,  const(SYSTEMTIME)*, LPCSTR, LPSTR, int);
672     int GetTimeFormatW(LCID, DWORD,  const(SYSTEMTIME)*, LPCWSTR, LPWSTR, int);
673     LANGID GetUserDefaultLangID();
674     LCID GetUserDefaultLCID();
675     GEOID GetUserGeoID(GEOCLASS);
676     BOOL IsDBCSLeadByte(BYTE);
677     BOOL IsDBCSLeadByteEx(UINT, BYTE);
678     BOOL IsNLSDefinedString(NLS_FUNCTION, DWORD, LPNLSVERSIONINFO, LPCWSTR,
679       int);
680     BOOL IsValidCodePage(UINT);
681     BOOL IsValidLocale(LCID, DWORD);
682     int LCMapStringA(LCID, DWORD, LPCSTR, int, LPSTR, int);
683     int LCMapStringW(LCID, DWORD, LPCWSTR, int, LPWSTR, int);
684     int MultiByteToWideChar(UINT, DWORD, LPCSTR, int, LPWSTR, int);
685     int SetCalendarInfoA(LCID, CALID, CALTYPE, LPCSTR);
686     int SetCalendarInfoW(LCID, CALID, CALTYPE, LPCWSTR);
687     BOOL SetLocaleInfoA(LCID, LCTYPE, LPCSTR);
688     BOOL SetLocaleInfoW(LCID, LCTYPE, LPCWSTR);
689     BOOL SetThreadLocale(LCID);
690     BOOL SetUserGeoID(GEOID);
691     int WideCharToMultiByte(UINT, DWORD, LPCWSTR, int, LPSTR, int, LPCSTR,
692       LPBOOL);
693 
694     static if (_WIN32_WINNT >= 0x410) {
695         BOOL EnumCalendarInfoExA(CALINFO_ENUMPROCEXA, LCID, CALID, CALTYPE);
696         BOOL EnumCalendarInfoExW(CALINFO_ENUMPROCEXW, LCID, CALID, CALTYPE);
697         BOOL EnumDateFormatsExA(DATEFMT_ENUMPROCEXA, LCID, DWORD);
698         BOOL EnumDateFormatsExW(DATEFMT_ENUMPROCEXW, LCID, DWORD);
699         BOOL IsValidLanguageGroup(LGRPID, DWORD);
700     }
701 
702     static if (_WIN32_WINNT >= 0x500) {
703         LANGID GetSystemDefaultUILanguage();
704         LANGID GetUserDefaultUILanguage();
705 
706         BOOL EnumSystemLanguageGroupsA(LANGUAGEGROUP_ENUMPROCA, DWORD,
707           LONG_PTR);
708         BOOL EnumSystemLanguageGroupsW(LANGUAGEGROUP_ENUMPROCW, DWORD,
709           LONG_PTR);
710         BOOL EnumLanguageGroupLocalesA(LANGGROUPLOCALE_ENUMPROCA, LGRPID,
711           DWORD, LONG_PTR);
712         BOOL EnumLanguageGroupLocalesW(LANGGROUPLOCALE_ENUMPROCW, LGRPID,
713           DWORD, LONG_PTR);
714         BOOL EnumUILanguagesA(UILANGUAGE_ENUMPROCA, DWORD, LONG_PTR);
715         BOOL EnumUILanguagesW(UILANGUAGE_ENUMPROCW, DWORD, LONG_PTR);
716     }
717 }
718 
719 version (Unicode) {
720     alias CALINFO_ENUMPROCW CALINFO_ENUMPROC;
721     alias CALINFO_ENUMPROCEXW CALINFO_ENUMPROCEX;
722     alias LOCALE_ENUMPROCW LOCALE_ENUMPROC;
723     alias CODEPAGE_ENUMPROCW CODEPAGE_ENUMPROC;
724     alias DATEFMT_ENUMPROCW DATEFMT_ENUMPROC;
725     alias DATEFMT_ENUMPROCEXW DATEFMT_ENUMPROCEX;
726     alias TIMEFMT_ENUMPROCW TIMEFMT_ENUMPROC;
727     alias LANGUAGEGROUP_ENUMPROCW LANGUAGEGROUP_ENUMPROC;
728     alias LANGGROUPLOCALE_ENUMPROCW LANGGROUPLOCALE_ENUMPROC;
729     alias UILANGUAGE_ENUMPROCW UILANGUAGE_ENUMPROC;
730     alias CPINFOEXW CPINFOEX;
731     alias LPCPINFOEXW LPCPINFOEX;
732     alias CURRENCYFMTW CURRENCYFMT;
733     alias LPCURRENCYFMTW LPCURRENCYFMT;
734     alias NUMBERFMTW NUMBERFMT;
735     alias LPNUMBERFMTW LPNUMBERFMT;
736     alias CompareStringW CompareString;
737     alias EnumCalendarInfoW EnumCalendarInfo;
738     alias EnumSystemCodePagesW EnumSystemCodePages;
739     alias EnumSystemLocalesW EnumSystemLocales;
740     alias EnumTimeFormatsW EnumTimeFormats;
741     alias FoldStringW FoldString;
742     alias GetCalendarInfoW GetCalendarInfo;
743     alias GetCPInfoExW GetCPInfoEx;
744     alias GetCurrencyFormatW GetCurrencyFormat;
745     alias GetDateFormatW GetDateFormat;
746     alias GetGeoInfoW GetGeoInfo;
747     alias GetLocaleInfoW GetLocaleInfo;
748     alias GetNumberFormatW GetNumberFormat;
749     alias GetStringTypeExW GetStringTypeEx;
750     alias GetTimeFormatW GetTimeFormat;
751     alias LCMapStringW LCMapString;
752     alias SetCalendarInfoW SetCalendarInfo;
753     alias SetLocaleInfoW SetLocaleInfo;
754 
755     static if (_WIN32_WINNT >= 0x410) {
756         alias EnumCalendarInfoExW EnumCalendarInfoEx;
757         alias EnumDateFormatsExW EnumDateFormatsEx;
758     }
759 
760     static if (_WIN32_WINNT >= 0x500) {
761         alias EnumSystemLanguageGroupsW EnumSystemLanguageGroups;
762         alias EnumLanguageGroupLocalesW EnumLanguageGroupLocales;
763         alias EnumUILanguagesW EnumUILanguages;
764     }
765 
766 } else {
767     alias CALINFO_ENUMPROCA CALINFO_ENUMPROC;
768     alias CALINFO_ENUMPROCEXA CALINFO_ENUMPROCEX;
769     alias LOCALE_ENUMPROCA LOCALE_ENUMPROC;
770     alias CODEPAGE_ENUMPROCA CODEPAGE_ENUMPROC;
771     alias DATEFMT_ENUMPROCA DATEFMT_ENUMPROC;
772     alias DATEFMT_ENUMPROCEXA DATEFMT_ENUMPROCEX;
773     alias TIMEFMT_ENUMPROCA TIMEFMT_ENUMPROC;
774     alias LANGUAGEGROUP_ENUMPROCA LANGUAGEGROUP_ENUMPROC;
775     alias LANGGROUPLOCALE_ENUMPROCA LANGGROUPLOCALE_ENUMPROC;
776     alias UILANGUAGE_ENUMPROCA UILANGUAGE_ENUMPROC;
777     alias CPINFOEXA CPINFOEX;
778     alias LPCPINFOEXA LPCPINFOEX;
779     alias CURRENCYFMTA CURRENCYFMT;
780     alias LPCURRENCYFMTA LPCURRENCYFMT;
781     alias NUMBERFMTA NUMBERFMT;
782     alias LPNUMBERFMTA LPNUMBERFMT;
783     alias CompareStringA CompareString;
784     alias EnumCalendarInfoA EnumCalendarInfo;
785     alias EnumSystemCodePagesA EnumSystemCodePages;
786     alias EnumSystemLocalesA EnumSystemLocales;
787     alias EnumTimeFormatsA EnumTimeFormats;
788     alias FoldStringA FoldString;
789     alias GetCalendarInfoA GetCalendarInfo;
790     alias GetCPInfoExA GetCPInfoEx;
791     alias GetCurrencyFormatA GetCurrencyFormat;
792     alias GetDateFormatA GetDateFormat;
793     alias GetGeoInfoA GetGeoInfo;
794     alias GetLocaleInfoA GetLocaleInfo;
795     alias GetNumberFormatA GetNumberFormat;
796     alias GetStringTypeExA GetStringTypeEx;
797     alias GetTimeFormatA GetTimeFormat;
798     alias LCMapStringA LCMapString;
799     alias SetCalendarInfoA SetCalendarInfo;
800     alias SetLocaleInfoA SetLocaleInfo;
801 
802     static if (_WIN32_WINNT >= 0x410) {
803         alias EnumCalendarInfoExA EnumCalendarInfoEx;
804         alias EnumDateFormatsExA EnumDateFormatsEx;
805     }
806 
807     static if (_WIN32_WINNT >= 0x500) {
808         alias EnumSystemLanguageGroupsA EnumSystemLanguageGroups;
809         alias EnumLanguageGroupLocalesA EnumLanguageGroupLocales;
810         alias EnumUILanguagesA EnumUILanguages;
811     }
812 }
813