Author: hbelusca
Date: Tue Jul 7 00:33:53 2015
New Revision: 68363
URL:
http://svn.reactos.org/svn/reactos?rev=68363&view=rev
Log:
[NTVDM]
Implement basic DOS country info (some stuff is not implemented yet, but the basic
functionality is there). This is needed by Microsoft Diagnostics 2.0+ (amongst others)...
See also r66039.
CORE-9903 #resolve
Added:
trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.c (with props)
trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.h (with props)
Modified:
trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt
trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c
trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.h
Modified: trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/CMak…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/CMakeLists.txt [iso-8859-1] Tue Jul 7 00:33:53
2015
@@ -30,6 +30,7 @@
hardware/video/svga.c
dos/dos32krnl/bios.c
dos/dos32krnl/condrv.c
+ dos/dos32krnl/country.c
dos/dos32krnl/device.c
dos/dos32krnl/dos.c
dos/dos32krnl/dosfiles.c
Added: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.c (added)
+++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.c [iso-8859-1] Tue Jul 7
00:33:53 2015
@@ -0,0 +1,289 @@
+/*
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS Virtual DOS Machine
+ * FILE: dos/dos32krnl/country.c
+ * PURPOSE: DOS32 Country support
+ * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca(a)sfr.fr)
+ *
+ * NOTE: Support for default (english) language only.
+ * For other languages, please use COUNTRY.SYS
+ */
+
+/* INCLUDES *******************************************************************/
+
+#define NDEBUG
+
+#include "ntvdm.h"
+#include "emulator.h"
+
+#include "country.h"
+#include "memory.h"
+
+/* PRIVATE VARIABLES **********************************************************/
+
+/* CaseMap routine: should call INT 65h, AL=20h */
+// ATM, just do nothing.
+static const BYTE CaseMapRoutine[] =
+{
+ 0xCB // retf
+};
+
+#pragma pack(push, 1)
+
+#define DATATABLE(name, type, len) \
+ typedef struct _##name \
+ { \
+ WORD Size; \
+ type Data[(len)]; \
+ } name
+
+DATATABLE(UPPERCASE, CHAR, 0xFF-0x80+1);
+DATATABLE(LOWERCASE, CHAR, 0xFF-0x00+1);
+DATATABLE(FNAMETERM, BYTE, 22);
+DATATABLE(COLLATE , BYTE, 0xFF-0x00+1);
+DATATABLE(DBCSLEAD , WORD, 0x00+1);
+
+typedef struct _COUNTRY_DATA
+{
+ BYTE CaseMapRoutine[sizeof(CaseMapRoutine)];
+ UPPERCASE UpCaseTbl; // Used also for filename uppercase
+ LOWERCASE LoCaseTbl;
+ FNAMETERM FNameTermTbl;
+ COLLATE CollateTbl;
+ DBCSLEAD DBCSLeadTbl;
+} COUNTRY_DATA, *PCOUNTRY_DATA;
+
+#pragma pack(pop)
+
+/* Global data contained in guest memory */
+static WORD CountryDataSegment;
+static PCOUNTRY_DATA CountryData;
+
+WORD YesNoTable[2] = { MAKEWORD('Y', 0), MAKEWORD('N', 0) };
+
+/*
+ * See:
http://www.ctyme.com/intr/rb-3163.htm#Table1754
+ *
http://www.ctyme.com/intr/rb-3164.htm
+ *
http://www.ctyme.com/intr/rb-3166.htm
+ */
+
+/* PRIVATE FUNCTIONS **********************************************************/
+
+/* PUBLIC FUNCTIONS ***********************************************************/
+
+WORD
+DosGetCountryInfo(IN OUT PWORD CountryId,
+ OUT PDOS_COUNTRY_INFO CountryInfo)
+{
+ INT Return;
+ DWORD NumVal;
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDATE | LOCALE_RETURN_NUMBER, //
LOCALE_ILDATE | LOCALE_RETURN_NUMBER
+ (LPSTR)&NumVal,
+ sizeof(NumVal));
+ if (Return == 0) return LOWORD(GetLastError());
+ CountryInfo->DateTimeFormat = (WORD)NumVal;
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY,
+ (LPSTR)&CountryInfo->CurrencySymbol,
+ sizeof(CountryInfo->CurrencySymbol));
+ if (Return == 0) return LOWORD(GetLastError());
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND,
+ (LPSTR)&CountryInfo->ThousandSep,
+ sizeof(CountryInfo->ThousandSep));
+ if (Return == 0) return LOWORD(GetLastError());
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL,
+ (LPSTR)&CountryInfo->DecimalSep,
+ sizeof(CountryInfo->DecimalSep));
+ if (Return == 0) return LOWORD(GetLastError());
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDATE,
+ (LPSTR)&CountryInfo->DateSep,
+ sizeof(CountryInfo->DateSep));
+ if (Return == 0) return LOWORD(GetLastError());
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STIME,
+ (LPSTR)&CountryInfo->TimeSep,
+ sizeof(CountryInfo->TimeSep));
+ if (Return == 0) return LOWORD(GetLastError());
+
+ // NOTE: '4: Symbol replace decimal separator' is unsupported.
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICURRENCY |
LOCALE_RETURN_NUMBER,
+ (LPSTR)&NumVal,
+ sizeof(NumVal));
+ if (Return == 0) return LOWORD(GetLastError());
+ CountryInfo->CurrencyFormat = (BYTE)NumVal;
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ICURRDIGITS |
LOCALE_RETURN_NUMBER, // LOCALE_IDIGITS | LOCALE_RETURN_NUMBER
+ (LPSTR)&NumVal,
+ sizeof(NumVal));
+ if (Return == 0) return LOWORD(GetLastError());
+ CountryInfo->CurrencyDigitsNum = (BYTE)NumVal;
+
+ Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_ITIME | LOCALE_RETURN_NUMBER,
+ (LPSTR)&NumVal,
+ sizeof(NumVal));
+ if (Return == 0) return LOWORD(GetLastError());
+ CountryInfo->TimeFormat = (BYTE)NumVal;
+
+ CountryInfo->CaseMapPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA, CaseMapRoutine),
CountryDataSegment);
+
+ // CountryInfo->DataListSep;
+
+ return ERROR_SUCCESS;
+}
+
+WORD
+DosGetCountryInfoEx(IN BYTE InfoId,
+ IN WORD CodePage,
+ IN WORD CountryId,
+ OUT PDOS_COUNTRY_INFO_2 CountryInfo,
+ IN OUT PWORD BufferSize)
+{
+ // FIXME: use: CodePage; CountryId
+ // FIXME: Check BufferSize
+ // FIXME: Use NLSFUNC resident?
+
+ switch (InfoId)
+ {
+ /* Get General Internationalization Info (similar to AX=3800h) */
+ case 0x01:
+ {
+ WORD ErrorCode;
+ ErrorCode = DosGetCountryInfo(&CountryId,
+
&CountryInfo->CountryInfoEx.CountryInfo);
+ if (ErrorCode != ERROR_SUCCESS) return ErrorCode;
+ CountryInfo->CountryInfoEx.Size = sizeof(CountryInfo->CountryInfoEx);
+ CountryInfo->CountryInfoEx.CountryId = CountryId;
+ // CountryInfo->CodePage;
+ break;
+ }
+
+ /* Get Pointer to Uppercase Table */
+ case 0x02:
+ CountryInfo->UpCaseTblPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA,
UpCaseTbl), CountryDataSegment);
+ break;
+
+ /* Get Pointer to Lowercase Table */
+ case 0x03:
+ CountryInfo->LoCaseTblPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA,
LoCaseTbl), CountryDataSegment);
+ break;
+
+ /* Get Pointer to Filename Uppercase Table */
+ case 0x04:
+ CountryInfo->FNameUpCaseTblPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA,
UpCaseTbl), CountryDataSegment);
+ break;
+
+ /* Get Pointer to Filename Terminator Table */
+ case 0x05:
+ CountryInfo->FNameTermTblPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA,
FNameTermTbl), CountryDataSegment);
+ break;
+
+ /* Get Pointer to Collating Sequence Table */
+ case 0x06:
+ CountryInfo->CollateTblPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA,
CollateTbl), CountryDataSegment);
+ break;
+
+ /* Get Pointer to Double-Byte Character Set Table */
+ case 0x07:
+ CountryInfo->DBCSLeadTblPtr = MAKELONG(FIELD_OFFSET(COUNTRY_DATA,
DBCSLeadTbl), CountryDataSegment);
+ break;
+
+ default:
+ return ERROR_CALL_NOT_IMPLEMENTED;
+ }
+ CountryInfo->InfoId = InfoId;
+
+ return ERROR_SUCCESS;
+}
+
+WORD DosIfCharYesNo(WORD Char)
+{
+ Char = toupper(Char);
+
+ /* NO-type */
+ if (Char == YesNoTable[1])
+ return 0x0000;
+ /* YES-type */
+ if (Char == YesNoTable[0])
+ return 0x0001;
+ /* Unknown type */
+ return 0x0002;
+}
+
+CHAR DosToUpper(CHAR Char)
+{
+ // FIXME: Use the current locale
+ return toupper(Char);
+}
+
+VOID DosToUpperStrN(PCHAR DestStr, PCHAR SrcStr, WORD Length)
+{
+ while (Length-- > 0)
+ *DestStr++ = toupper(*SrcStr++);
+}
+
+VOID DosToUpperStrZ(PSTR DestStr, PSTR SrcStr)
+{
+ while (*SrcStr)
+ *DestStr++ = toupper(*SrcStr++);
+}
+
+BOOLEAN DosCountryInitialize(VOID)
+{
+ UINT i;
+
+ /* Initialize some memory to store country information */
+ // FIXME: Can we use instead some static area from the DOS data structure??
+ CountryDataSegment = DosAllocateMemory(sizeof(COUNTRY_DATA), NULL);
+ if (CountryDataSegment == 0) return FALSE;
+ CountryData = (PCOUNTRY_DATA)SEG_OFF_TO_PTR(CountryDataSegment, 0x0000);
+
+ RtlMoveMemory(CountryData->CaseMapRoutine,
+ CaseMapRoutine,
+ sizeof(CaseMapRoutine));
+
+ CountryData->UpCaseTbl.Size = ARRAYSIZE(CountryData->UpCaseTbl.Data);
+ for (i = 0; i < CountryData->UpCaseTbl.Size; ++i)
+ CountryData->UpCaseTbl.Data[i] = 0x80 + i;
+
+ CountryData->LoCaseTbl.Size = ARRAYSIZE(CountryData->LoCaseTbl.Data);
+ for (i = 0; i < CountryData->LoCaseTbl.Size; ++i)
+ CountryData->LoCaseTbl.Data[i] = i;
+
+ CountryData->FNameTermTbl.Size = ARRAYSIZE(CountryData->FNameTermTbl.Data);
+ CountryData->FNameTermTbl.Data[ 0] = 0x01; // Dummy Byte
+ CountryData->FNameTermTbl.Data[ 1] = 0x00; // Lowest permissible Character Value
for Filename
+ CountryData->FNameTermTbl.Data[ 2] = 0xFF; // Highest permissible Character Value
for Filename
+ CountryData->FNameTermTbl.Data[ 3] = 0x00; // Dummy Byte
+ CountryData->FNameTermTbl.Data[ 4] = 0x00; // First excluded Character in Range \
all characters in this
+ CountryData->FNameTermTbl.Data[ 5] = 0x20; // Last excluded Character in Range /
range are illegal
+ CountryData->FNameTermTbl.Data[ 6] = 0x02; // Dummy Byte
+ CountryData->FNameTermTbl.Data[ 7] = 14; // Number of illegal (terminator)
Characters
+// CountryData->FNameTermTbl.Data[ 8] = ".\"/\\[]:|<>+=;,"; //
Characters which terminate a Filename
+ CountryData->FNameTermTbl.Data[ 8] = '.';
+ CountryData->FNameTermTbl.Data[ 9] = '\"';
+ CountryData->FNameTermTbl.Data[10] = '/';
+ CountryData->FNameTermTbl.Data[11] = '\\';
+ CountryData->FNameTermTbl.Data[12] = '[';
+ CountryData->FNameTermTbl.Data[13] = ']';
+ CountryData->FNameTermTbl.Data[14] = ':';
+ CountryData->FNameTermTbl.Data[15] = '|';
+ CountryData->FNameTermTbl.Data[16] = '<';
+ CountryData->FNameTermTbl.Data[17] = '>';
+ CountryData->FNameTermTbl.Data[18] = '+';
+ CountryData->FNameTermTbl.Data[19] = '=';
+ CountryData->FNameTermTbl.Data[20] = ';';
+ CountryData->FNameTermTbl.Data[21] = ',';
+
+ CountryData->CollateTbl.Size = ARRAYSIZE(CountryData->CollateTbl.Data);
+ for (i = 0; i < CountryData->LoCaseTbl.Size; ++i)
+ CountryData->LoCaseTbl.Data[i] = i;
+
+ CountryData->DBCSLeadTbl.Size = 0; // Empty DBCS table
+ CountryData->DBCSLeadTbl.Data[0] = 0x0000;
+
+ return TRUE;
+}
Propchange: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.c
------------------------------------------------------------------------------
svn:eol-style = native
Added: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.h (added)
+++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.h [iso-8859-1] Tue Jul 7
00:33:53 2015
@@ -0,0 +1,99 @@
+/*
+ * COPYRIGHT: GPL - See COPYING in the top level directory
+ * PROJECT: ReactOS Virtual DOS Machine
+ * FILE: dos/dos32krnl/country.h
+ * PURPOSE: DOS32 Country support
+ * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca(a)sfr.fr)
+ *
+ * NOTE: Support for default (english) language only.
+ * For other languages, please use COUNTRY.SYS
+ */
+
+#ifndef _COUNTRY_H_
+#define _COUNTRY_H_
+
+/* DEFINITIONS ****************************************************************/
+
+#pragma pack(push, 1)
+
+#if 0 // Keep here for information purposes only
+// DOS 2.00-2.10 country info structure
+typedef struct _DOS_COUNTRY_INFO_OLD
+{
+ WORD DateTimeFormat;
+ CHAR CurrencySymbol[2];
+ CHAR ThousandSep[2];
+ CHAR DecimalSep[2];
+ BYTE Reserved[24];
+} DOS_COUNTRY_INFO_OLD, *PDOS_COUNTRY_INFO_OLD;
+C_ASSERT(sizeof(DOS_COUNTRY_INFO_OLD) == 0x20);
+#endif
+
+// DOS 2.11+ compatible country info structure
+typedef struct _DOS_COUNTRY_INFO
+{
+ WORD DateTimeFormat;
+ CHAR CurrencySymbol[5];
+ CHAR ThousandSep[2];
+ CHAR DecimalSep[2];
+ CHAR DateSep[2];
+ CHAR TimeSep[2];
+ BYTE CurrencyFormat;
+ BYTE CurrencyDigitsNum;
+ BYTE TimeFormat;
+ DWORD CaseMapPtr;
+ CHAR DataListSep[2];
+ BYTE Reserved[10];
+} DOS_COUNTRY_INFO, *PDOS_COUNTRY_INFO;
+C_ASSERT(sizeof(DOS_COUNTRY_INFO) == 0x22);
+
+typedef struct _DOS_COUNTRY_INFO_EX
+{
+ WORD Size;
+ WORD CountryId;
+ WORD CodePage;
+ DOS_COUNTRY_INFO CountryInfo;
+} DOS_COUNTRY_INFO_EX, *PDOS_COUNTRY_INFO_EX;
+C_ASSERT(sizeof(DOS_COUNTRY_INFO_EX) == 0x28);
+
+typedef struct _DOS_COUNTRY_INFO_2
+{
+ BYTE InfoId;
+ union
+ {
+ DOS_COUNTRY_INFO_EX CountryInfoEx;
+
+ DWORD UpCaseTblPtr;
+ DWORD LoCaseTblPtr;
+
+ DWORD FNameUpCaseTblPtr;
+ DWORD FNameTermTblPtr;
+
+ DWORD CollateTblPtr;
+ DWORD DBCSLeadTblPtr;
+ };
+} DOS_COUNTRY_INFO_2, *PDOS_COUNTRY_INFO_2;
+
+#pragma pack(pop)
+
+/* FUNCTIONS ******************************************************************/
+
+WORD
+DosGetCountryInfo(IN OUT PWORD CountryId,
+ OUT PDOS_COUNTRY_INFO CountryInfo);
+
+WORD
+DosGetCountryInfoEx(IN BYTE InfoId,
+ IN WORD CodePage,
+ IN WORD CountryId,
+ OUT PDOS_COUNTRY_INFO_2 CountryInfo,
+ IN OUT PWORD BufferSize);
+
+WORD DosIfCharYesNo(WORD Char);
+CHAR DosToUpper(CHAR Char);
+VOID DosToUpperStrN(PCHAR DestStr, PCHAR SrcStr, WORD Length);
+VOID DosToUpperStrZ(PSTR DestStr, PSTR SrcStr);
+
+BOOLEAN DosCountryInitialize(VOID);
+
+#endif
Propchange: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/country.h
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.c [iso-8859-1] Tue Jul 7
00:33:53 2015
@@ -18,6 +18,7 @@
#include "dos.h"
#include "dos/dem.h"
+#include "country.h"
#include "device.h"
#include "handle.h"
#include "dosfiles.h"
@@ -895,59 +896,21 @@
/* Get/Set Country-dependent Information */
case 0x38:
{
- INT Return;
- PDOS_COUNTRY_CODE_BUFFER CountryCodeBuffer =
- (PDOS_COUNTRY_CODE_BUFFER)SEG_OFF_TO_PTR(getDS(), getDX());
-
- if (getAL() == 0x00)
- {
- /* Get */
- Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_IDATE,
- (LPSTR)&CountryCodeBuffer->TimeFormat,
- sizeof(CountryCodeBuffer->TimeFormat));
- if (Return == 0)
- {
- Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
- setAX(LOWORD(GetLastError()));
- break;
- }
-
- Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SCURRENCY,
-
(LPSTR)&CountryCodeBuffer->CurrencySymbol,
- sizeof(CountryCodeBuffer->CurrencySymbol));
- if (Return == 0)
- {
- Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
- setAX(LOWORD(GetLastError()));
- break;
- }
-
- Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND,
- (LPSTR)&CountryCodeBuffer->ThousandSep,
- sizeof(CountryCodeBuffer->ThousandSep));
- if (Return == 0)
- {
- Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
- setAX(LOWORD(GetLastError()));
- break;
- }
-
- Return = GetLocaleInfoA(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL,
- (LPSTR)&CountryCodeBuffer->DecimalSep,
- sizeof(CountryCodeBuffer->DecimalSep));
- if (Return == 0)
- {
- Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
- setAX(LOWORD(GetLastError()));
- break;
- }
-
- Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
- }
- else
- {
- // TODO: NOT IMPLEMENTED
- UNIMPLEMENTED;
+ WORD CountryId = getAL() < 0xFF ? getAL() : getBX();
+ WORD ErrorCode;
+
+ ErrorCode = DosGetCountryInfo(&CountryId,
+ (PDOS_COUNTRY_INFO)SEG_OFF_TO_PTR(getDS(),
getDX()));
+
+ if (ErrorCode == ERROR_SUCCESS)
+ {
+ Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+ setBX(CountryId);
+ }
+ else
+ {
+ Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
+ setAX(ErrorCode);
}
break;
@@ -1616,7 +1579,7 @@
*/
// FIXME: Check for buffer validity?
- // It should be a ASCIZ path ending with a '\' + 13 zero bytes
+ // It should be a ASCIIZ path ending with a '\' + 13 zero bytes
// to receive the generated filename.
/* First create the temporary file */
@@ -1762,6 +1725,91 @@
default:
{
DPRINT1("INT 21h, AH = 5Dh, subfunction AL = %Xh NOT
IMPLEMENTED\n",
+ getAL());
+ }
+ }
+
+ break;
+ }
+
+ /* Extended Country Information */
+ case 0x65:
+ {
+ switch (getAL())
+ {
+ case 0x01: case 0x02: case 0x03:
+ case 0x04: case 0x05: case 0x06:
+ case 0x07:
+ {
+ WORD BufferSize = getCX();
+ WORD ErrorCode;
+ ErrorCode = DosGetCountryInfoEx(getAL(),
+ getBX(),
+ getDX(),
+
(PDOS_COUNTRY_INFO_2)SEG_OFF_TO_PTR(getES(), getDI()),
+ &BufferSize);
+ if (ErrorCode == ERROR_SUCCESS)
+ {
+ Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+ setCX(BufferSize);
+ }
+ else
+ {
+ Stack[STACK_FLAGS] |= EMULATOR_FLAG_CF;
+ setAX(ErrorCode);
+ }
+
+ break;
+ }
+
+ /* Country-dependent Character Capitalization -- Character */
+ case 0x20:
+ /* Country-dependent Filename Capitalization -- Character */
+ case 0xA0:
+ {
+ setDL(DosToUpper(getDL()));
+ Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+ // setAX(ERROR_SUCCESS);
+ break;
+ }
+
+ /* Country-dependent Character Capitalization -- Counted ASCII String */
+ case 0x21:
+ /* Country-dependent Filename Capitalization -- Counted ASCII String */
+ case 0xA1:
+ {
+ PCHAR Str = (PCHAR)SEG_OFF_TO_PTR(getDS(), getDX());
+ // FIXME: Check for NULL ptr!!
+ DosToUpperStrN(Str, Str, getCX());
+ Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+ // setAX(ERROR_SUCCESS);
+ break;
+ }
+
+ /* Country-dependent Character Capitalization -- ASCIIZ String */
+ case 0x22:
+ /* Country-dependent Filename Capitalization -- ASCIIZ String */
+ case 0xA2:
+ {
+ PSTR Str = (PSTR)SEG_OFF_TO_PTR(getDS(), getDX());
+ // FIXME: Check for NULL ptr!!
+ DosToUpperStrZ(Str, Str);
+ Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+ // setAX(ERROR_SUCCESS);
+ break;
+ }
+
+ /* Determine if Character represents YES/NO Response */
+ case 0x23:
+ {
+ setAX(DosIfCharYesNo(MAKEWORD(getDL(), getDH())));
+ Stack[STACK_FLAGS] &= ~EMULATOR_FLAG_CF;
+ break;
+ }
+
+ default:
+ {
+ DPRINT1("INT 21h, AH = 65h, subfunction AL = %Xh NOT
IMPLEMENTED\n",
getAL());
}
}
@@ -2139,6 +2187,9 @@
/* Unimplemented DOS interrupts */
RegisterDosInt32(0x2A, NULL); // Network - Installation Check
+ /* Initialize country data */
+ DosCountryInitialize();
+
/* Load the CON driver */
ConDrvInitialize();
Modified: trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/mvdm/ntvdm/dos/…
==============================================================================
--- trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.h [iso-8859-1] (original)
+++ trunk/reactos/subsystems/mvdm/ntvdm/dos/dos32krnl/dos.h [iso-8859-1] Tue Jul 7
00:33:53 2015
@@ -124,14 +124,6 @@
DWORD FileSize;
CHAR FileName[13];
} DOS_FIND_FILE_BLOCK, *PDOS_FIND_FILE_BLOCK;
-
-typedef struct _DOS_COUNTRY_CODE_BUFFER
-{
- WORD TimeFormat;
- WORD CurrencySymbol;
- WORD ThousandSep;
- WORD DecimalSep;
-} DOS_COUNTRY_CODE_BUFFER, *PDOS_COUNTRY_CODE_BUFFER;
typedef struct _DOS_SDA
{