idn wrapper - Client Side IDN Conversion Software for Windows
Copyright (c) 2000,2001,2002 Japan Network Information Center.
All rights reserved.
*** NOTICE ******************************************************
If you have installed mDN Wrapper (former version of idn wrapper)
on your system, you should unwrap all the programs before
installing idn wrapper.
*****************************************************************
1. Introduction
For supporting internationalized domain names, each client
application should convert domain names (their encodings) to that
DNS server accepts. This requires applications to handle
internationalized domain names in its core, and it is the vendor's
responsibility to make their programs IDN-compatible.
Although there are ongoing efforts in IETF to standardize IDN
framework (architecture, encoding etc.) and several RFCs are
expected to be published soon as the result, not many applications
support IDN to this date.
So, there are needs for some helper application which makes legacy
applications IDN-aware. `runidn' in idnkit is one of such
solutions for Unix-like operating systems, and this software, `idn
wrapper' is the one for Windows.
On windows, name resolving request is passed to WINSOCK DLL. idn
wrapper replaces WINSOCK DLL with the one that can handle IDN,
which makes legacy windows applications compatible with IDN.
2. Architecture
2.1. Wrapper DLL
Wrapper DLL resides between application and original DLL. It
intercept application's calls to original DLL, and preforms some
additional processing on those calls.
+------------+ Call +------------+ Call +------------+
| |------->| |------->| |
|Application | |Wrapper DLL | |Original DLL|
| |<-------| |<-------| |
+------------+ Return +------------+ Return +------------+
additional
processing
here
DLL call from apllication is passed to wrapper DLL. Wrapper DLL
then performs some additional processing on that call, and then
calls original DLL. Also, result from original DLL will once passed
to wrapper DLL and wrapper does additional process on that result,
and finally result will passed to the application.
idn wrapper provides wrapper DLLs for WINSOCK,
WSOCK32.DLL WINSOCK V1.1
WS2_32.DLL WINSOCK V2.0
to resolve multi-lingual domain names.
2.2. Wrapping APIs
idn wrapper performs additional processing on name resolving APIs in
WINSOCK, listed below.
both WINSOCK 1.1, WINSOCK 2.0
gethostbyaddr
gethostbyname
WSAAsyncGetHostByAddr
WSAAsyncGetHostByName
only in WINSOCK 2.0
getaddrinfo
freeaddrinfo
getnameinfo
WSALookupServiceBeginA
WSALookupServiceNextA
WSALookupServiceEnd
Some applications do not use these APIs to resolve domain names.
`nslookup' is one of those programs. `nslookup' builds and parse DNS
messages internally and does not use WINSOCK's name resolver APIs.
idn wrapper cannot make those programs IDN-aware.
NOTE:
WINSOCK 2.0 also contains WIDE-CHARACTER based name resolution
APIs,
WSALookupServiceBeginW
WSALookupServiceNextW
idn wrapper does not wrap these APIs. These APIs are used in
Microsoft's own internationalization framework. It is dangerous
to convert to another internationalization framework.
2.3. Other APIs in WINSOCK
For other APIs in WINSOCK, idn wrapper does nothing, only calls
original DLL's entries.
idn wrapper copies original WINSOCK DLLs with renaming
as below, and forward requests to them.
wsock32.dll -> wsock32o.dll
ws2_32.dll -> ws2_32o.dll
Wrappper DLL will be installed with original DLL names. So after
installation of idn wrapper, WINSOCK DLLs should be
wsock32.dll idn wrapper for WINSOCK V1.1
ws2_32.dll idn wrapper for WINSOCK V2.0
wsock32o.dll Original WINSOCK V1.1 DLL
ws2_32o.dll Original WINSOCK V2.0 DLL
2.4. Asynchronous API
Domain name conversion take place on
request to DNS
convert from local encoding to DNS compatible encoding
response from DNS
convert from DNS encoding to local encoding
For synchronous APIs, local to DNS conversion is done before calling
original API, and after return from original API, name should be
converted from DNS encoding to local encoding.
But WINSOCK having some asynchronous APIs, such as
WSAAsyncGetHostByAddr
WSAAsyncGetHostByName
In these APIs, completion is notified with windows message. To
perform DNS to local conversion, wrapper should hook target window
procedure to capture those completion messages.
So, if asynchronous API was called, idn wrapper set hook to target
window procedure (passed with API parameter). If hook found
notify message (also given with API parameter), then convert
resulting name (in DNS encoding) to local encoding.
2.5. Installing Wrapper DLLs
WINSOCK DLLs are placed at Windows's system directory. To wrap
WINSOCK DLLs, one could do following sequence at system directory.
+ Rename Original WINSOCK DLLs
ren wsock32.dll wsock32o.dll
ren ws2_32.dll ws2_32o.dll
+ Install (copy in) Wrapper DLLs
copy somewhere\wsock32.dll wsock32.dll
copy somewhere\ws2_32.dll ws2_32.dll
copy another DLLs also
However, replacing DLLs in Window's system directory is very
dangerous:
a) If you re-install idn wrapper again, original WINSOCK DLLs
may be lost.
b) Some application or service pack will replace WINSOCK DLLs. It
may corrupt WINSOCK environment.
If these happen, at least networking does not work, and worse,
Windows never startup again.
So, idn wrapper usually does not wrap in the system directory, but wrap in
each indivisual application's directory.
In Windows, DLL will be searched in the following places:
Application's Load Directory
%SystemRoot%\System32
%SystemRoot%
Directories in PATH
and loaded & linked first found one. So if installed wrapper DLLs is
found on application's load directory, the application's call to
WINSOCK will wrapped.
But some applications or DLLs are binded to specific DLL, they do
not rely on above DLL's search path. For those applcaitons or DLLs,
idn wrapper (in standard installation) cannot wrap them.
NOTE: Netscape is one of those program. It cannot be wrapped if
installed to applications directory. Also WINSOCK DLLs are
also binded to related DLLs in system directory. On the
other hand, Internet Explore or Window Media Player relys on
standard DLL search path, and well wrapped with idn wrapper.
2.6. At which point conversion applied
If windows supporting WINSOCK 2.0, there are DLLs one for 1.1 and
another for 2.0, and call to WINSOCK 1.1 will redirected to 2.0 DLL.
+------------+ Call +------------+ Call +------------+
| |------->| |------->| |
|Application | |WINSOCK 1.1 | |WINSOCK 2.0 |
| |<-------| |<-------| |
+------------+ Return +------------+ Return +------------+
In this case, calls to 1.1 and 2.0 are both passed to 2.0 DLL. So
conversion will done in WINSOCK 2.0 DLL side.
If windows only supports WINSOCK 1.1, there's 1.1 DLL only.
+------------+ Call +------------+
| |------->| |
|Application | |WINSOCK 1.1 |
| |<-------| |
+------------+ Return +------------+
In this case, conversion must done in 1.1 DLL.
If idn wrapper was installed on system directory, DLLs will work as
described above. But if wrapper was installed on application's
directory, call/return sequence changes. Original WINSOCK 1.1 DLL
in windows seems binded to specific WINSOCK 2.0 DLL, placed at
window's system diretory. So call from WINSOCK 1.1 to WINSOCK 2.0
will passed to original DLL (in system directory) and never passed
to wrapper DLL in application's directory. So in this case, both
1.1 and 2.0 DLLs should coonvert domain name encodings.
These DLL binding is not documented. It may be change on OS
versions or DLL versions. So, mDn wrapper determines place of
conversion on registry value. With this registry value, idn
wrappper absolb OS/DLL variations.
Registry values for idn wrapper will placed under
HKEY_LOCAL_MACHINE\SOFTWARE\JPNIC\IDN
HKEY_CURRENT_USER\SOFTWARE\JPNIC\IDN
Place of conversion is determined with registry value "Where",
Registry Value "Where" REG_DWORD
0 both on WINSOCK 1.1 and WINSOCK 2.0
1 if WINSOCK 2.0 exist, only in WINSOCK 2.0
otherwise, convert on WINSOCK 1.1
2 only in WINSOCK 1.1
3 only in WINSOCK 2.0
If you install idn wrapper into application's directory, use "0".
If you install idn wrapper into system directory, use "1". If there
are no "Where" value, idn wrapper uses "0" as default, it is suited
to installation into application's directory (default installation).
2.7. Converting From/To
Wrapper DLL convert resolving domain name encoded with local code to
DNS server's encoding. Also, wrapper DLL convert resulting name (
encoded with DNS's encoding) back to local encoding.
There are several proposals for DNS encodings to handle multi-lingual
domain names. Wrapper DLL should be configured to convert to one of
those encodings. This DNS side encoding will specified with
registry. When installing idn wrapper, this registry will set to
some (yet undefined) DNS encoding.
Registry values for idn wrapper will placed under
HKEY_LOCAL_MACHINE\SOFTWARE\JPNIC\IDN
HKEY_CURRENT_USER\SOFTWARE\JPNIC\IDN
DNS encoding name will given with registry value (REG_SZ) of "Encoding",
this name must be one of encoding names which 'libmdn' recognize.
Registry Value "Encoding" REG_SZ
Encoding name of DNS server accepts.
Local encodings (Windows Apllication Encodings) is generally
acquired from process's code page. 'iconv' library, used for idn
wrapper, generally accepts MS's codepage names.
Some windows apllication encode domain name with some specific multi-
lingual encoding. For example, if you configured IE to use UTF-8,
then domain names are encoded with UTF-8. UTF-8 is one of proposed
DNS encoding, but DNS server may expect another encoding.
For those cases, idn wrapper accept program specific encoding as
local encoding. These program specific local encoding should be
marked in registry.
Program specific registry setting will placed under
HKEY_LOCAL_MACHINE\SOFTWARE\JPNIC\IDN\PerProg
HKEY_CURRENT_USER\SOFTWARE\JPNIC\IDN\PerProg
using program name (executable file name) as key. For example,
setting specific to Internet Explore, it executable name is
"IEXPLORE", will plcaed at
HKEY_LOCAL_MACHINE\SOFTWARE\JPNIC\IDN\PerProg\IEXPLORE
Local encoding name will specified with registry value (REG_SZ) of
"Encoding". This name must be one of encoding names which '
recognize.libmdn'
Registry Value "Encoding" REG_SZ
Encoding name of application program encodes, if it is not
system's default encoding.
3. Setup and Configuration
idn wrapper wraps WINSOCK DLL by placing wrapper (fake) DLLs in
the application's directory. For the installation, idn wrapper
comes with a setup program and a configuration program.
NOTE: You can also install idn wrapper DLLs in the Windows
system directory. But this installation is very dangerous
and may cause severe problems in your system.
You should try it at your own risk.
3.1. Setup Program
To install idn wrapper, run "setup.exe". Setup program will do:
Installing Files
Copy idn wrapper files (DLL, Program EXE, etc) into diretory
"\Program Files\JPNIC\idn wrapper"
This directory may be changed on setup sequence.
Setting registry entries
Setup program will create keys and values under registry:
"HKEY_LOCAL_MACHINES\Software\JPNIC\IDN"
InstallDir REG_SZ "<installation directory>"
Pathname of the idn wrapper's installation directory.
The installer makes copies of the original WINSOCK DLLs
in that directory, which is referenced by the idn wrapper's
fake DLLs.
ConfFile REG_SZ "<installation directory>\idn.conf"
Name of the idnkit's configuration file, which defines
various parameter regarding multilingual domain name
handling. See the contents of the file for details.
This value can be changed with the Configuration Program
or the registry editor.
LogFile REG_SZ "<installation directory>\idn_wrapper.log"
Name of the idn wrapper's log file.
This value can be changed with the Configuration Program
or the registry editor.
LogLevel DWORD -1
Logging level. Default is -1, which indicates no logging
is made. This value can be changed with the Configuration
Program or the registry editor.
PerProg KEY
Under this key, idn wrapper set program specific values. idn
wrapper uses program's executable name as key, and put
values under that key.
PerProg\<progname>\Where REG_DWORD Encoding Position
PerProg\>progname>\Encoding REG_SZ Local Encoding Name
Configuration program set local encpoding name. "Where"
value is usually not required in standard installation. If
you installed idn wrapper in system directory, chanage
"Where" values to fit your environment.
Creating ICON
Setup program will create program icon for idn wrapper's
configuration program, and put it into "Start Menu". You can
start configuration program with it.
3.2. Configuration Program
Configuration program is a tool for wrap specific program, or unwrap
programs. If you start "Configuration Program", you'll get window
like this.
+---+-------------------------------------------------+---+---+---+
| | idn wrapper - Configuration | _ | O | X |
+---+-------------------------------------------------+---+---+---+
| idn wrapper Configuration Program version X.X |
+-----------------------------------------------------------------+
| Wrapped Program +---------+ |
| +---------------------------------------------+---+ | Wrap.. | |
| | | A | +---------+ |
| | +---+ +---------+ |
| | | | | Unwrap..| |
| | | | +---------+ |
| | | | +---------+ |
| | | | |UnwrapAll| |
| | | | +---------+ |
| | | | +---------+ |
| | | | |RewrapAll| |
| | | | +---------+ |
| | | | +---------+ |
| | | | | Log.. | |
| | | | +---------+ |
| | | | +---------+ |
| | +---+ |Advanced.| |
| | | V | +---------+ |
| +---+-------------------------------------+---+---+ +---------+ |
| | < | | > | | Exit | |
| +---+-------------------------------------+---+ +---------+ |
+-----------------------------------------------------------------+
Listbox contains list of current wrapped programs. Initially it is
empty.
To wrap a program, press button "wrap". You'll get following dialog.
+---+-------------------------------------------------+---+---+---+
| | idn wrapper - Wrap Executable | _ | O | X |
+---+-------------------------------------------------+---+---+---+
| +----------------------------------------+ +--------+ |
| Program: | | |Browse..| |
| +----------------------------------------+ +--------+ |
| +----------+ |
| Encoding: | | o Default o UTF-8 |
| +----------+ |
| [] Force local DLL reference |
+-----------------------------------------------------------------+
| +--------+ +--------+ |
| | Wrap | | Cancel | |
| +--------+ +--------+ |
+-----------------------------------------------------------------+
First, enter program (executable name with full path) or browse
wrapping exectable from file browser. Then set local encoding of
that program. Usually use "Default" as local encoding. If target
program uses internationalized encoding, then specify "UFT-8".
The "Force local DLL reference" button controls the DLL search
order of the program to be wrapped (Windows95 does not have this
capability, hence this button does not appear). If it is checked,
DLLs in the local directory (the directory which the executable
file is in) are always preferred, even if the executable specifies
otherwise. If you have problem with wrapping, checking this
button may solve the problem, but it is also possible that it
causes other problem.
Finally, put "wrap" button to wrap specified program with given
encoding. Wrapped program will be listed in listbox of the first
window.
When you install a new version of idn wrapper, you have to re-wrap
your programs in order to update DLLs used for wrapping. "Rewrap
all" button is provided for this purpose. Just press the button,
and all the currently wrapped programs will be re-wrapped.
To unwrap a program, press button "unwrap". You'll get following
confirmating dialog.
+---+-------------------------------------------------+---+---+---+
| | idn wrapper - Unwrap Executable | _ | O | X |
+---+-------------------------------------------------+---+---+---+
| +---------------------------------------------------+ |
| Program: | | |
| +---------------------------------------------------+ |
+-----------------------------------------------------------------+
| +--------+ +--------+ |
| | Unwrap | | Cancel | |
| +--------+ +--------+ |
+-----------------------------------------------------------------+
If you unwrap a program, the program will be vanished from listbox
of the first window.
Also "Unwrap all" button is provided to unwrap all the programs
that are currently wrapped.
To configure logging, press button "log". You'll get the following
dialog.
+---+-------------------------------------------------+---+---+---+
| | idn wrapper - Log Configuration | _ | O | X |
+---+-------------------------------------------------+---+---+---+
| Log Level: o None o Fatal o Error o Warning o Info o Trace |
| |
| +------------------------------------+ +---------+ |
| Log File:| | | Browse..| |
| +------------------------------------+ +---------+ |
| +------+ +--------+ |
|Log Operation: | View | | Delete | |
| +------+ +--------+ |
+-----------------------------------------------------------------+
| +--------+ +--------+ |
| | OK | | Cancel | |
| +--------+ +--------+ |
+-----------------------------------------------------------------+
Logging level can be selected from the followings.
None no logging at all
Fatal only records fatal errors
Error also records non-fatal errors
Warning also records warning mssages
Info also records informational messages
Trace also records trace information
Note that these levels are for log output from IDN library (idnkit.dll).
idn wrapper itself supports only off (None) and on (the rest).
Pathname of the log file can also be specified with this dialog.
You can view the current log file contents by pressing "View" button,
or delete it by "Delete" button.
Note that log level and log file configuration doesn't affect already
running processes.
Press "advanced" button to invoke the advanced configuration dialog.
This dialog is for advanced users and enables customization for
some basic parameters which normal users need not change, since
appropriate defaults are provided.
+---+-------------------------------------------------+---+---+---+
| | idn wrapper - Advanced Configuration | _ | O | X |
+---+-------------------------------------------------+---+---+---+
| IDN Wrapping Mode |
| o Wrap both WINSOCK 1.1 and WINSOCK 2.0 |
| o Wrap only WINSOCK 1.1 |
| o Wrap only WINSOCK 2.0 |
| o Wrap only WINSOCK 2.0 if it exists. |
| Otherwise wrap only WINSOCK 1.1 |
+-----------------------------------------------------------------+
| IDN Configuration |
| +--------------------------------+ +----------+ |
| Config File: | | | Browse.. | |
| +--------------------------------+ +----------+ |
| +------+ |
| | Edit | |
| +------+ |
+-----------------------------------------------------------------+
| +--------+ +--------+ |
| | OK | | Cancel | |
| +--------+ +--------+ |
+-----------------------------------------------------------------+
With the dialog users can do the following configuration.
Wrapping Mode
Customize wrapping mode. Normally the default item should be
appropriate. Changing it to other item may help when you
have problems.
IDN Configuration
Set the configuration file for multilingual domain name handling.
By pressing "Edit" button, you can edit then contents of the file.
4. Limitations
4.1. DLL Versions
Wrapper DLL is tightly coupled with specific DLL version, because
it must export all the entries including un-documented ones.
If WINSOCK DLL version changed, idn wrapper may not work correctly.
Current idn wrapper is tested on
Win2000 (WINSOCK 1.1 + 2.0)
WinME (WINSOCK 1.1 + 2.0)
But there are no assuarance for future versions of Windows.
4.2. DNS, WINS, LMHOSTS
There are three name resolving methods in windows, DNS, WINS and
LMHOSTS. Using idn wrapper, domain name conversion will performed
on all of thoses methods. It may cause some trouble if windows
using WINS or LMHOSTS. We recommend use DNS oly if you want to use
idn wrapper.
4.3. Converting Names other than Domain Name
In WINSOCK 2.0, there are generic name resolution APIs are
introduced.
WSALookupServiceBeginA
WSALookupServiceNextA
WSALookupServiceEnd
They are use mainly domain name conversion now, but not limited to
resolving domain name. idn wrapper hooks this API and convert
given name anyway. This causes some trouble if conversion name is
not domain name.
4.4. Applications don't use these APIa
Some applications don't use these APIs to resolving domain names.
For example, 'nslookup' issue DNS request locally. For these
applications, idn wrapper does not work.
4.5. Applications bound to specific WINSOCK DLL
Some applications are bound to specific DLL, not relying on
standard DLL search path. Netscape Communicator seems to be one of
such programs. idn wrapper in standard installation cannot wrap
such programs.
If you want to wrap those programs, you may use installation into
system directory. But this installation is very dangerous, for
it is possible that your system cannot boot again.
5. Registry Setting - Summary
5.1. Priority of Setting
Settings of idn wrapper is placed on registry
Software\JPNIC\IDN
under HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. idn wrapper first
read HKEY_LOCAL_MACHINE, and if HKEY_CURRENT_USER exist, overwrite
with this one. Usually set HKEY_LOCAL_MACHINE only. But if you
need per user setting, then set HKEY_CURRENT_USER.
Note that the configuration program reads/writes only
HKEY_LOCAL_MACHINE.
5.2. Registry Key
There's common settings and per program settings.
_Common Settings
Software\JPNIC\IDN\InstallDir Installation directory
Software\JPNIC\IDN\Where Where to convert encoding
0: both WINSOCK 1.1 and WINSOCK 2.0
1: if WINSOCK 2.0 exist, convert at 2.0 DLL
if WINSOCK 1.1 only, convert at 1.1 DLL
2: only in WINSOCK1.1
3: only in WINSOCK2.0
Software\JPNIC\IDN\ConfFile idnkit Configuration File
Software\JPNIC\IDN\LogFile Log File
Software\JPNIC\IDN\LogLevel Log Level
_Per Program Settings
Converting position and program's local encoding may be set per
program bases.
Software\JPNIC\IDN\PerProg\<name>\Where
Software\JPNIC\IDN\PerProg\<name>\Encoding
If not specified, the following values are assumed.
Where 0 (both 1.1 DLL and 2.0 DLL)
Encoding [process's code page]