Windows NT, 2000 and XP rely on a GINA DLL for Graphical Identification and Authentication. The Microsoft GINA DLL is called MSGINA.DLL. There are also many third party GINA DLLs including NWGINA.DLL (Novell NetWare Client) and AWGINA.DLL (pcAnywhere). The Password Policy Client for Windows NT, 2000 and XP is also a GINA DLL (PPEc32.DLL).
Some applications (such as those listed above) require their own GINA DLL, but Windows can only load one GINA DLL. The solution to this problem is to have GINA DLLs loading and calling one another in a "chain". For example, a base install of Windows NT/2000/XP is configured to load the Microsoft GINA DLL:
MSGINA.DLL
When the Password Policy Client is installed, the PPC setup program installs its own GINA DLL (PPEc32.DLL) and instructs PPEc32.DLL to load and pass calls to the original GINA DLL (MSGINA.DLL). The GINA DLL chain is now:
PPEc32.DLL
MSGINA.DLL
If pcAnywhere is also installed, the pcAnywhere setup program will install its GINA DLL (AWGINA.DLL) and instruct AWGINA.DLL to load and pass calls to the previous GINA DLL (PPEc32.DLL). The GINA DLL chain is now:
AWGINA.DLL
PPEc32.DLL
MSGINA.DLL
In this configuration, Windows will load AWGINA.DLL. AWGINA.DLL will load PPEc32.DLL and PPEc32.DLL will load MSGINA.DLL. Function calls also travel down the chain of GINA.DLLs.
A GINA DLL chain "breaks" when one of the GINA DLLs in the middle of the chain is uninstalled. A broken GINA DLL chain will most likely cause the computer to BSOD before the logon prompt is displayed. To avoid a broken GINA DLL chain, always ensure that programs that implement a replacement GINA DLL are uninstalled in the reverse order of installation.
Another problem with GINA DLL chains occurs when the chain forms a loop. This can happen when a program is reinstalled or repaired. For example, if the PPC was reinstalled onto this computer, the PPC setup program would detect that PPEc32.DLL is not at the top of the GINA DLL chain, and would make the necessary registry changes so that PPEc32.DLL was at the top of the chain. The GINA DLL chain would now look like this:
PPEc32.DLL
AWGINA.DLL
PPEc32.DLL
MSGINA.DLL
The result is a recursive GINA DLL load that causes the computer to crash (BSOD). Windows will load PPEc32.DLL. PPEc32.DLL will load AWGINA.DLL. AWGINA.DLL will load PPEc32.DLL. PPEc32.DLL will load AWGINA.DLL. AWGINA.DLL will load PPEc32.DLL and so on until the computer crashes. MSGINA.DLL is never loaded because the configuration setting instructing PPEc32.DLL to load MSGINA.DLL is overwritten when PPEc32.DLL is installed the second time.
The PPC V3.0 setup program cannot predict that this will happen because there is no standard location for storing the GINA DLL chain. Each GINA DLL is only responsible for calling the next GINA DLL in the chain. The correct procedure in this case would have been to uninstall the program at the top of the chain (pcAnywhere) and then reinstall the PPC. pcAnywhere could be reinstalled after the PPC, thereby maintaining the integrity of the chain (uninstall in reverse order of installation).
Repairing a computer that is loading GINA DLLs recursively is a two-step process.
Step 1: Work around chaining problem
This step requires access to the computer's file system (without starting Windows). If the computer is using the NTFS file system, you may need to ue the Windows 2000/XP recovery console.
GINA DLLs are normally installed into the %SystemRoot%\system32 folder.
Copy MSGINA.DLL over the next chained GINA application. (MSGINA.DLL is also in the %SystemRoot%\system32 folder.)
Restart the computer to proceed to the next step.
Step 2: Fix GINA DLL chain
To fix the GINA DLL chain, you will need to step through the chain until the problem is identified. The name of the GINA DLL at the top of the chain is stored in this registry value:
HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ GinaDLL
This application stores the filename of the next GINA DLL in this registry value:
HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Winlogon \ REM_GinaDLL
Continue stepping through the chain until you find the problem (a GINA DLL that loads another GINA again). You may need to contact the developers of the other GINA DLLs in order to identify the registry value that they use to store the next DLL in the chain.
When the problem is found, modify the registry so that each GINA DLL is only loaded once. Double-check the complete GINA DLL chain and restart the computer.