/*++ Copyright (c) 1994-1998 Microsoft Corporation Module Name: encrypt.c Abstract: Contains functions that detect the run system is french locale. Author: Madan Appiah (madana) 16-May-1998 Environment: User Mode - Win32 Revision History: --*/ #include #ifdef OS_WIN32 BOOL IsFrenchSystem( VOID ) /*++ Routine Description: French laws are strict with respect to the import of software products which contain cryptography. Therefore many Microsoft products must check for a locale of France and disable cryptographic services if this is the case. There is the possibility that forms of cryptography currently restricted may eventually be allowed in France. For this reason it is valuable to implement a check for a crypto approval indicator which could easily be installed on a Windows system in the future. The indicator tells the software that it is OK to enable specific cryptographic services which may not have been approved for import to France when the software was released, but have been subsequently allowed. Below are two code fragments, the first indicates how to check for the locale of France. The second code fragment is a simple example of how a check for a cryptographic approval indicator might be implemented. This function implements France Locale detection. Arguments: None. Return Value: TURE - if the system is French. FALSE - if not. --*/ { #define MAX_INT_SIZE 16 LCID dwDefaultSystemLCID; LANGID wCurrentLangID; DWORD dwLen; TCHAR achCountryCode[MAX_INT_SIZE]; DWORD dwCountryCode; // // Get system default locale ID. // dwDefaultSystemLCID = GetSystemDefaultLCID(); // // get language ID from locale ID. // wCurrentLangID = LANGIDFROMLCID(dwDefaultSystemLCID); // // check to see the system is running with french locale. // if( ( PRIMARYLANGID(wCurrentLangID) == LANG_FRENCH) && ( SUBLANGID(wCurrentLangID) == SUBLANG_FRENCH) ) { return( TRUE ); } // // check to see the user's country code is set to CTRY_FRENCH. // dwLen = GetLocaleInfo( dwDefaultSystemLCID, LOCALE_ICOUNTRY, achCountryCode, sizeof(achCountryCode) / sizeof(TCHAR)); if( dwLen == 0 ) { // // we could not read the country code .. // return( FALSE ); } // // convert the country code string to integer. // dwCountryCode = (DWORD)_ttol(achCountryCode); if( dwCountryCode != CTRY_FRANCE ) { return( FALSE ); } // // if we are here, then the system is french locale system. // return( TRUE ); } #else // OS_WIN32 BOOL IsFrenchSystem( VOID ) /*++ Routine Description: This function implements France Locale detection for win3.1. Arguments: None. Return Value: TURE - if the system is French. FALSE - if not. --*/ { #define MAX_LANG_STRING_SIZE 16 DWORD dwLen; CHAR achLangStr[MAX_LANG_STRING_SIZE]; // // read [intl] section in the win.ini to determine the // system locale. // dwLen = GetProfileString( "intl", "sLanguage", "", achLangStr, sizeof(achLangStr)); if( (dwLen == 3) && (_stricmp(achLangStr, "fra") == 0) ) { // // french system. // return( TRUE ); } // // now read country code. // dwLen = GetProfileString( "intl", "iCountry", "", achLangStr, sizeof(achLangStr)); if( (dwLen == 2) && (_stricmp(achLangStr, "33") == 0) ) { // // french system. // return( TRUE ); } // // not a french system. // return( FALSE ); } #endif // OS_WIN32 BOOL FindIsFrenchSystem( VOID ) /*++ Routine Description: The function implements a check for the locale of France. Note : it makes system calls to determine the system locale once and remembers it for later calls. Arguments: None. Return Value: TURE - if the system is French. FALSE - if not. --*/ { typedef enum { Uninitialized = 0, FrenchSystem = 1, NotFrenchSystem = 2 } FrenchSystemType; static FrenchSystemType g_dwIsFrenchSystem = Uninitialized; if( g_dwIsFrenchSystem == Uninitialized ) { if( IsFrenchSystem() ) { g_dwIsFrenchSystem = FrenchSystem; } else { g_dwIsFrenchSystem = NotFrenchSystem; } } if( g_dwIsFrenchSystem == FrenchSystem ) { return( TRUE ); } return( FALSE ); }