#include "pch.h" const WCHAR cp1252[256] = { /*0x00*/ 0x0000, //Null /*0x01*/ 0x0001, //Start Of Heading /*0x02*/ 0x0002, //Start Of Text /*0x03*/ 0x0003, //End Of Text /*0x04*/ 0x0004, //End Of Transmission /*0x05*/ 0x0005, //Enquiry /*0x06*/ 0x0006, //Acknowledge /*0x07*/ 0x0007, //Bell /*0x08*/ 0x0008, //Backspace /*0x09*/ 0x0009, //Horizontal Tabulation /*0x0a*/ 0x000a, //Line Feed /*0x0b*/ 0x000b, //Vertical Tabulation /*0x0c*/ 0x000c, //Form Feed /*0x0d*/ 0x000d, //Carriage Return /*0x0e*/ 0x000e, //Shift Out /*0x0f*/ 0x000f, //Shift In /*0x10*/ 0x0010, //Data Link Escape /*0x11*/ 0x0011, //Device Control One /*0x12*/ 0x0012, //Device Control Two /*0x13*/ 0x0013, //Device Control Three /*0x14*/ 0x0014, //Device Control Four /*0x15*/ 0x0015, //Negative Acknowledge /*0x16*/ 0x0016, //Synchronous Idle /*0x17*/ 0x0017, //End Of Transmission Block /*0x18*/ 0x0018, //Cancel /*0x19*/ 0x0019, //End Of Medium /*0x1a*/ 0x001a, //Substitute /*0x1b*/ 0x001b, //Escape /*0x1c*/ 0x001c, //File Separator /*0x1d*/ 0x001d, //Group Separator /*0x1e*/ 0x001e, //Record Separator /*0x1f*/ 0x001f, //Unit Separator /*0x20*/ 0x0020, //Space /*0x21*/ 0x0021, //Exclamation Mark /*0x22*/ 0x0022, //Quotation Mark /*0x23*/ 0x0023, //Number Sign /*0x24*/ 0x0024, //Dollar Sign /*0x25*/ 0x0025, //Percent Sign /*0x26*/ 0x0026, //Ampersand /*0x27*/ 0x0027, //Apostrophe /*0x28*/ 0x0028, //Left Parenthesis /*0x29*/ 0x0029, //Right Parenthesis /*0x2a*/ 0x002a, //Asterisk /*0x2b*/ 0x002b, //Plus Sign /*0x2c*/ 0x002c, //Comma /*0x2d*/ 0x002d, //Hyphen-Minus /*0x2e*/ 0x002e, //Full Stop /*0x2f*/ 0x002f, //Solidus /*0x30*/ 0x0030, //Digit Zero /*0x31*/ 0x0031, //Digit One /*0x32*/ 0x0032, //Digit Two /*0x33*/ 0x0033, //Digit Three /*0x34*/ 0x0034, //Digit Four /*0x35*/ 0x0035, //Digit Five /*0x36*/ 0x0036, //Digit Six /*0x37*/ 0x0037, //Digit Seven /*0x38*/ 0x0038, //Digit Eight /*0x39*/ 0x0039, //Digit Nine /*0x3a*/ 0x003a, //Colon /*0x3b*/ 0x003b, //Semicolon /*0x3c*/ 0x003c, //Less-Than Sign /*0x3d*/ 0x003d, //Equals Sign /*0x3e*/ 0x003e, //Greater-Than Sign /*0x3f*/ 0x003f, //Question Mark /*0x40*/ 0x0040, //Commercial At /*0x41*/ 0x0041, //Latin Capital Letter A /*0x42*/ 0x0042, //Latin Capital Letter B /*0x43*/ 0x0043, //Latin Capital Letter C /*0x44*/ 0x0044, //Latin Capital Letter D /*0x45*/ 0x0045, //Latin Capital Letter E /*0x46*/ 0x0046, //Latin Capital Letter F /*0x47*/ 0x0047, //Latin Capital Letter G /*0x48*/ 0x0048, //Latin Capital Letter H /*0x49*/ 0x0049, //Latin Capital Letter I /*0x4a*/ 0x004a, //Latin Capital Letter J /*0x4b*/ 0x004b, //Latin Capital Letter K /*0x4c*/ 0x004c, //Latin Capital Letter L /*0x4d*/ 0x004d, //Latin Capital Letter M /*0x4e*/ 0x004e, //Latin Capital Letter N /*0x4f*/ 0x004f, //Latin Capital Letter O /*0x50*/ 0x0050, //Latin Capital Letter P /*0x51*/ 0x0051, //Latin Capital Letter Q /*0x52*/ 0x0052, //Latin Capital Letter R /*0x53*/ 0x0053, //Latin Capital Letter S /*0x54*/ 0x0054, //Latin Capital Letter T /*0x55*/ 0x0055, //Latin Capital Letter U /*0x56*/ 0x0056, //Latin Capital Letter V /*0x57*/ 0x0057, //Latin Capital Letter W /*0x58*/ 0x0058, //Latin Capital Letter X /*0x59*/ 0x0059, //Latin Capital Letter Y /*0x5a*/ 0x005a, //Latin Capital Letter Z /*0x5b*/ 0x005b, //Left Square Bracket /*0x5c*/ 0x005c, //Reverse Solidus /*0x5d*/ 0x005d, //Right Square Bracket /*0x5e*/ 0x005e, //Circumflex Accent /*0x5f*/ 0x005f, //Low Line /*0x60*/ 0x0060, //Grave Accent /*0x61*/ 0x0061, //Latin Small Letter A /*0x62*/ 0x0062, //Latin Small Letter B /*0x63*/ 0x0063, //Latin Small Letter C /*0x64*/ 0x0064, //Latin Small Letter D /*0x65*/ 0x0065, //Latin Small Letter E /*0x66*/ 0x0066, //Latin Small Letter F /*0x67*/ 0x0067, //Latin Small Letter G /*0x68*/ 0x0068, //Latin Small Letter H /*0x69*/ 0x0069, //Latin Small Letter I /*0x6a*/ 0x006a, //Latin Small Letter J /*0x6b*/ 0x006b, //Latin Small Letter K /*0x6c*/ 0x006c, //Latin Small Letter L /*0x6d*/ 0x006d, //Latin Small Letter M /*0x6e*/ 0x006e, //Latin Small Letter N /*0x6f*/ 0x006f, //Latin Small Letter O /*0x70*/ 0x0070, //Latin Small Letter P /*0x71*/ 0x0071, //Latin Small Letter Q /*0x72*/ 0x0072, //Latin Small Letter R /*0x73*/ 0x0073, //Latin Small Letter S /*0x74*/ 0x0074, //Latin Small Letter T /*0x75*/ 0x0075, //Latin Small Letter U /*0x76*/ 0x0076, //Latin Small Letter V /*0x77*/ 0x0077, //Latin Small Letter W /*0x78*/ 0x0078, //Latin Small Letter X /*0x79*/ 0x0079, //Latin Small Letter Y /*0x7a*/ 0x007a, //Latin Small Letter Z /*0x7b*/ 0x007b, //Left Curly Bracket /*0x7c*/ 0x007c, //Vertical Line /*0x7d*/ 0x007d, //Right Curly Bracket /*0x7e*/ 0x007e, //Tilde /*0x7f*/ 0x007f, //Delete /*0x80*/ 0x20ac, //Euro Sign /*0x81*/ 0x0081, /*0x82*/ 0x201a, //Single Low-9 Quotation Mark /*0x83*/ 0x0192, //Latin Small Letter F With Hook /*0x84*/ 0x201e, //Double Low-9 Quotation Mark /*0x85*/ 0x2026, //Horizontal Ellipsis /*0x86*/ 0x2020, //Dagger /*0x87*/ 0x2021, //Double Dagger /*0x88*/ 0x02c6, //Modifier Letter Circumflex Accent /*0x89*/ 0x2030, //Per Mille Sign /*0x8a*/ 0x0160, //Latin Capital Letter S With Caron /*0x8b*/ 0x2039, //Single Left-Pointing Angle Quotation Mark /*0x8c*/ 0x0152, //Latin Capital Ligature Oe /*0x8d*/ 0x008d, /*0x8e*/ 0x017d, //Latin Capital Letter Z With Caron /*0x8f*/ 0x008f, /*0x90*/ 0x0090, /*0x91*/ 0x2018, //Left Single Quotation Mark /*0x92*/ 0x2019, //Right Single Quotation Mark /*0x93*/ 0x201c, //Left Double Quotation Mark /*0x94*/ 0x201d, //Right Double Quotation Mark /*0x95*/ 0x2022, //Bullet /*0x96*/ 0x2013, //En Dash /*0x97*/ 0x2014, //Em Dash /*0x98*/ 0x02dc, //Small Tilde /*0x99*/ 0x2122, //Trade Mark Sign /*0x9a*/ 0x0161, //Latin Small Letter S With Caron /*0x9b*/ 0x203a, //Single Right-Pointing Angle Quotation Mark /*0x9c*/ 0x0153, //Latin Small Ligature Oe /*0x9d*/ 0x009d, /*0x9e*/ 0x017e, //Latin Small Letter Z With Caron /*0x9f*/ 0x0178, //Latin Capital Letter Y With Diaeresis /*0xa0*/ 0x00a0, //No-Break Space /*0xa1*/ 0x00a1, //Inverted Exclamation Mark /*0xa2*/ 0x00a2, //Cent Sign /*0xa3*/ 0x00a3, //Pound Sign /*0xa4*/ 0x00a4, //Currency Sign /*0xa5*/ 0x00a5, //Yen Sign /*0xa6*/ 0x00a6, //Broken Bar /*0xa7*/ 0x00a7, //Section Sign /*0xa8*/ 0x00a8, //Diaeresis /*0xa9*/ 0x00a9, //Copyright Sign /*0xaa*/ 0x00aa, //Feminine Ordinal Indicator /*0xab*/ 0x00ab, //Left-Pointing Double Angle Quotation Mark /*0xac*/ 0x00ac, //Not Sign /*0xad*/ 0x00ad, //Soft Hyphen /*0xae*/ 0x00ae, //Registered Sign /*0xaf*/ 0x00af, //Macron /*0xb0*/ 0x00b0, //Degree Sign /*0xb1*/ 0x00b1, //Plus-Minus Sign /*0xb2*/ 0x00b2, //Superscript Two /*0xb3*/ 0x00b3, //Superscript Three /*0xb4*/ 0x00b4, //Acute Accent /*0xb5*/ 0x00b5, //Micro Sign /*0xb6*/ 0x00b6, //Pilcrow Sign /*0xb7*/ 0x00b7, //Middle Dot /*0xb8*/ 0x00b8, //Cedilla /*0xb9*/ 0x00b9, //Superscript One /*0xba*/ 0x00ba, //Masculine Ordinal Indicator /*0xbb*/ 0x00bb, //Right-Pointing Double Angle Quotation Mark /*0xbc*/ 0x00bc, //Vulgar Fraction One Quarter /*0xbd*/ 0x00bd, //Vulgar Fraction One Half /*0xbe*/ 0x00be, //Vulgar Fraction Three Quarters /*0xbf*/ 0x00bf, //Inverted Question Mark /*0xc0*/ 0x00c0, //Latin Capital Letter A With Grave /*0xc1*/ 0x00c1, //Latin Capital Letter A With Acute /*0xc2*/ 0x00c2, //Latin Capital Letter A With Circumflex /*0xc3*/ 0x00c3, //Latin Capital Letter A With Tilde /*0xc4*/ 0x00c4, //Latin Capital Letter A With Diaeresis /*0xc5*/ 0x00c5, //Latin Capital Letter A With Ring Above /*0xc6*/ 0x00c6, //Latin Capital Ligature Ae /*0xc7*/ 0x00c7, //Latin Capital Letter C With Cedilla /*0xc8*/ 0x00c8, //Latin Capital Letter E With Grave /*0xc9*/ 0x00c9, //Latin Capital Letter E With Acute /*0xca*/ 0x00ca, //Latin Capital Letter E With Circumflex /*0xcb*/ 0x00cb, //Latin Capital Letter E With Diaeresis /*0xcc*/ 0x00cc, //Latin Capital Letter I With Grave /*0xcd*/ 0x00cd, //Latin Capital Letter I With Acute /*0xce*/ 0x00ce, //Latin Capital Letter I With Circumflex /*0xcf*/ 0x00cf, //Latin Capital Letter I With Diaeresis /*0xd0*/ 0x00d0, //Latin Capital Letter Eth /*0xd1*/ 0x00d1, //Latin Capital Letter N With Tilde /*0xd2*/ 0x00d2, //Latin Capital Letter O With Grave /*0xd3*/ 0x00d3, //Latin Capital Letter O With Acute /*0xd4*/ 0x00d4, //Latin Capital Letter O With Circumflex /*0xd5*/ 0x00d5, //Latin Capital Letter O With Tilde /*0xd6*/ 0x00d6, //Latin Capital Letter O With Diaeresis /*0xd7*/ 0x00d7, //Multiplication Sign /*0xd8*/ 0x00d8, //Latin Capital Letter O With Stroke /*0xd9*/ 0x00d9, //Latin Capital Letter U With Grave /*0xda*/ 0x00da, //Latin Capital Letter U With Acute /*0xdb*/ 0x00db, //Latin Capital Letter U With Circumflex /*0xdc*/ 0x00dc, //Latin Capital Letter U With Diaeresis /*0xdd*/ 0x00dd, //Latin Capital Letter Y With Acute /*0xde*/ 0x00de, //Latin Capital Letter Thorn /*0xdf*/ 0x00df, //Latin Small Letter Sharp S /*0xe0*/ 0x00e0, //Latin Small Letter A With Grave /*0xe1*/ 0x00e1, //Latin Small Letter A With Acute /*0xe2*/ 0x00e2, //Latin Small Letter A With Circumflex /*0xe3*/ 0x00e3, //Latin Small Letter A With Tilde /*0xe4*/ 0x00e4, //Latin Small Letter A With Diaeresis /*0xe5*/ 0x00e5, //Latin Small Letter A With Ring Above /*0xe6*/ 0x00e6, //Latin Small Ligature Ae /*0xe7*/ 0x00e7, //Latin Small Letter C With Cedilla /*0xe8*/ 0x00e8, //Latin Small Letter E With Grave /*0xe9*/ 0x00e9, //Latin Small Letter E With Acute /*0xea*/ 0x00ea, //Latin Small Letter E With Circumflex /*0xeb*/ 0x00eb, //Latin Small Letter E With Diaeresis /*0xec*/ 0x00ec, //Latin Small Letter I With Grave /*0xed*/ 0x00ed, //Latin Small Letter I With Acute /*0xee*/ 0x00ee, //Latin Small Letter I With Circumflex /*0xef*/ 0x00ef, //Latin Small Letter I With Diaeresis /*0xf0*/ 0x00f0, //Latin Small Letter Eth /*0xf1*/ 0x00f1, //Latin Small Letter N With Tilde /*0xf2*/ 0x00f2, //Latin Small Letter O With Grave /*0xf3*/ 0x00f3, //Latin Small Letter O With Acute /*0xf4*/ 0x00f4, //Latin Small Letter O With Circumflex /*0xf5*/ 0x00f5, //Latin Small Letter O With Tilde /*0xf6*/ 0x00f6, //Latin Small Letter O With Diaeresis /*0xf7*/ 0x00f7, //Division Sign /*0xf8*/ 0x00f8, //Latin Small Letter O With Stroke /*0xf9*/ 0x00f9, //Latin Small Letter U With Grave /*0xfa*/ 0x00fa, //Latin Small Letter U With Acute /*0xfb*/ 0x00fb, //Latin Small Letter U With Circumflex /*0xfc*/ 0x00fc, //Latin Small Letter U With Diaeresis /*0xfd*/ 0x00fd, //Latin Small Letter Y With Acute /*0xfe*/ 0x00fe, //Latin Small Letter Thorn /*0xff*/ 0x00ff };//Latin Small Letter Y With Diaeresis void InplaceUnicode(PWSTR p) { while(p && *p) { if(*p != UC_SENTINEL) { if(*p <= 0xFF) { *p = cp1252[*p]; } } p = incxstr(p); } } BOOL ConvertKeyboardToUnicode(LPKEYBOARD kbd) { LPGROUP gp; LPSTORE sp; LPKEY kp; DWORD i, j; if(kbd->StartGroup[BEGIN_UNICODE] < kbd->cxGroupArray) { // Keyboard is already Unicode return TRUE; } for(sp = kbd->dpStoreArray, i = 0; i < kbd->cxStoreArray; i++, sp++) { InplaceUnicode(sp->dpName); InplaceUnicode(sp->dpString); } for(gp = kbd->dpGroupArray, i = 0; i < kbd->cxGroupArray; i++, gp++) { for(kp = gp->dpKeyArray, j = 0; j < gp->cxKeyArray; j++, kp++) { InplaceUnicode(kp->dpContext); InplaceUnicode(kp->dpOutput); } InplaceUnicode(gp->dpName); InplaceUnicode(gp->dpMatch); InplaceUnicode(gp->dpNoMatch); } kbd->StartGroup[BEGIN_UNICODE] = kbd->StartGroup[BEGIN_ANSI]; kbd->StartGroup[BEGIN_ANSI] = 0xFFFFFFFF; return TRUE; }