266 lines
4.7 KiB
C
266 lines
4.7 KiB
C
|
|
||
|
/*++
|
||
|
|
||
|
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 <seccom.h>
|
||
|
|
||
|
#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 );
|
||
|
}
|