typedef struct _NLS_USER_INFO
{
+ WCHAR sLanguage[80];
WCHAR iCountry[80];
WCHAR sCountry[80];
WCHAR sList[80];
WCHAR iLZero[80];
WCHAR iNegNumber[80];
WCHAR sNativeDigits[80];
- WCHAR iDigitSubstitution[80];
+ WCHAR NumShape[80];
WCHAR sCurrency[80];
WCHAR sMonDecSep[80];
WCHAR sMonThouSep[80];
WCHAR iCurrDigits[80];
WCHAR iCurrency[80];
WCHAR iNegCurr[80];
- WCHAR sPosSign[80];
- WCHAR sNegSign[80];
+ WCHAR sPositiveSign[80];
+ WCHAR sNegativeSign[80];
WCHAR sTimeFormat[80];
+ WCHAR sTime[80];
+ WCHAR iTime[80];
+ WCHAR iTLZero[80];
+ WCHAR iTimePrefix[80];
WCHAR s1159[80];
WCHAR s2359[80];
WCHAR sShortDate[80];
+ WCHAR sDate[80];
+ WCHAR iDate[80];
WCHAR sYearMonth[80];
WCHAR sLongDate[80];
WCHAR iCalType[80];
- WCHAR iFirstDay[80];
- WCHAR iFirstWeek[80];
- WCHAR sLocale[80];
- WCHAR sLocaleName[85];
+ WCHAR iFirstDayOfWeek[80];
+ WCHAR iFirstWeekOfYear[80];
+ WCHAR Locale[80];
LCID UserLocaleId;
LUID InteractiveUserLuid;
- CHAR InteractiveUserSid[68]; // SECURITY_MAX_SID_SIZE to make ROS happy
ULONG ulCacheUpdateCount;
} NLS_USER_INFO, *PNLS_USER_INFO;
-
+C_ASSERT(sizeof(NLS_USER_INFO) == 0x1870);
typedef struct _BASE_STATIC_SERVER_DATA
{
BOOLEAN LUIDDeviceMapsEnabled;
ULONG TermsrvClientTimeZoneChangeNum;
} BASE_STATIC_SERVER_DATA, *PBASE_STATIC_SERVER_DATA;
+C_ASSERT(sizeof(BASE_STATIC_SERVER_DATA) == 0x1AC8);
+
+VOID WINAPI BaseSrvNLSInit(IN PBASE_STATIC_SERVER_DATA StaticData);
#endif // _BASE_H
ULONG LocaleId;
} BASE_NLS_CREATE_SECTION, *PBASE_NLS_CREATE_SECTION;
+typedef struct
+{
+ PVOID /*PNLS_USER_INFO*/ NlsUserInfo;
+ ULONG Size;
+} BASE_NLS_GET_USER_INFO, *PBASE_NLS_GET_USER_INFO;
+
typedef struct _BASE_API_MESSAGE
{
PORT_MESSAGE Header;
BASE_REFRESH_INIFILE_MAPPING RefreshIniFileMappingRequest;
BASE_DEFINE_DOS_DEVICE DefineDosDeviceRequest;
BASE_NLS_CREATE_SECTION NlsCreateSection;
+ BASE_NLS_GET_USER_INFO NlsGetUserInfo;
} Data;
} BASE_API_MESSAGE, *PBASE_API_MESSAGE;
/* GLOBALS ********************************************************************/
+RTL_CRITICAL_SECTION NlsCacheCriticalSection;
+PNLS_USER_INFO pNlsRegUserInfo;
+
BOOLEAN BaseSrvKernel32DelayLoadComplete;
HANDLE BaseSrvKernel32DllHandle;
UNICODE_STRING BaseSrvKernel32DllPath;
return Status;
}
+VOID
+WINAPI
+BaseSrvNLSInit(IN PBASE_STATIC_SERVER_DATA StaticData)
+{
+ /* Initialize the lock */
+ RtlInitializeCriticalSection(&NlsCacheCriticalSection);
+
+ /* Initialize the data with all F's */
+ pNlsRegUserInfo = &StaticData->NlsUserInfo;
+ RtlFillMemory(&StaticData->NlsUserInfo, 0xFF, sizeof(StaticData->NlsUserInfo));
+
+ /* Set empty LCID */
+ pNlsRegUserInfo->UserLocaleId = 0;
+
+ /* Reset the cache update counter */
+ RtlEnterCriticalSection(&NlsCacheCriticalSection);
+ pNlsRegUserInfo->ulCacheUpdateCount = 0;
+ RtlLeaveCriticalSection(&NlsCacheCriticalSection);
+
+ /* Get the LCID */
+ NtQueryDefaultLocale(0, &pNlsRegUserInfo->UserLocaleId);
+}
+
/* PUBLIC SERVER APIS *********************************************************/
CSR_API(BaseSrvNlsSetUserInfo)
CSR_API(BaseSrvNlsGetUserInfo)
{
- DPRINT1("%s not yet implemented\n", __FUNCTION__);
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status;
+ PBASE_NLS_GET_USER_INFO NlsMsg = &((PBASE_API_MESSAGE)ApiMessage)->Data.NlsGetUserInfo;
+
+ /* Make sure the buffer is valid and of the right size */
+ if ((CsrValidateMessageBuffer(ApiMessage, &NlsMsg->NlsUserInfo, NlsMsg->Size, TRUE)) &&
+ (NlsMsg->Size == sizeof(NLS_USER_INFO)))
+ {
+ /* Acquire the lock to prevent updates while we copy */
+ Status = RtlEnterCriticalSection(&NlsCacheCriticalSection);
+ if (NT_SUCCESS(Status))
+ {
+ /* Do the copy now, then drop the lock */
+ RtlCopyMemory(&NlsMsg->NlsUserInfo, pNlsRegUserInfo, NlsMsg->Size);
+ DPRINT1("NLS Data copy complete\n");
+ RtlLeaveCriticalSection(&NlsCacheCriticalSection);
+ }
+ }
+ else
+ {
+ /* The data was invalid, bail out */
+ DPRINT1("NLS: Size of info is invalid: %lx vs %lx\n", NlsMsg->Size, sizeof(NLS_USER_INFO));
+ Status = STATUS_INVALID_PARAMETER;
+ }
+
+ /* All done */
+ return Status;
}
/* EOF */