WCHARProfilePath[WLX_DIRECTORY_LENGTH+1]; WCHARHomeDir[WLX_DIRECTORY_LENGTH+1]; WCHARHomeDirDrive[4];
}WLX_TERMINAL_SERVICES_DATA,*PWLX_TERMINAL_SERVICES_DATA; typedefDWORD(WINAPI*PWLX_QUERY_TERMINAL_SERVICES_DATA) (
HANDLEhWlx,
PWLX_TERMINAL_SERVICES_DATApTSData, WCHAR*UserName, WCHAR*Domain );
typedefstruct__win32_DISPATCH_VERSION_1_3 {
PWLX_USE_CTRL_ALT_DELWlxUseCtrlAltDel;
PWLX_SET_CONTEXT_POINTERWlxSetContextPointer; PWLX_SAS_NOTIFYWlxSasNotify; PWLX_SET_TIMEOUTWlxSetTimeout;
PWLX_ASSIGN_SHELL_PROTECTIONWlxAssignShellProtection; PWLX_MESSAGE_BOXWlxMessageBox; PWLX_DIALOG_BOXWlxDialogBox;
PWLX_DIALOG_BOX_PARAMWlxDialogBoxParam; PWLX_DIALOG_BOX_INDIRECTWlxDialogBoxIndirect;
PWLX_DIALOG_BOX_INDIRECT_PARAMWlxDialogBoxIndirectParam; PWLX_SWITCH_DESKTOP_TO_USERWlxSwitchDesktopToUser;
PWLX_SWITCH_DESKTOP_TO_WINLOGONWlxSwitchDesktopToWinLogon; PWLX_CHANGE_PASSWORD_NOTIFYWlxChangePasswordNotify; PWLX_GET_SOURCE_DESKTOPWlxGetSourceDesktop; PWLX_SET_RETURN_DESKTOPWlxSetReturnDesktop; PWLX_CREATE_USER_DESKTOPWlxCreateUserDesktop;
PWLX_CHANGE_PASSWORD_NOTIFY_EXWlxChangePasswordNotifyEx; PWLX_CLOSE_USER_DESKTOPWlxCloseUserDesktop; PWLX_SET_OPTIONWlxSetOption; PWLX_GET_OPTIONWlxGetOption;
PWLX_WIN31_MIGRATEWlxWin31Migrate;
PWLX_QUERY_CLIENT_CREDENTIALSWlxQueryClientCredentials; PWLX_QUERY_IC_CREDENTIALSWlxQueryInetConnectorCredentials; PWLX_DISCONNECTWlxDisconnect;
PWLX_QUERY_TERMINAL_SERVICES_DATAWlxQueryTerminalServicesData; }WLX_DISPATCH_VERSION_1_3,*PWLX_DISPATCH_VERSION_1_3; typedefstruct {
HANDLEhWlx; LPWSTRstation;
PWLX_DISPATCH_VERSION_1_3pWlxFuncs;
HANDLEhDllInstance; HANDLEUserToken;
}GINA_CONTEXT,*PGINA_CONTEXT; //GINAfunctiondefine
typedefBOOL(WINAPI*F_WlxNegotiate)(
DWORDdwWinLogonVersion,PDWORDpdwDllVersion);
typedefBOOL(WINAPI*F_WlxInitialize),(LPWSTRlpWinsta,HANDLE hWlx,PVOIDpvReserved,PVOIDpWinLogonFunctions,PVOID *pWlxContext);
typedefVOID(WINAPI*F_WlxDisplaySASNotice)(PVOIDpWlxContext); typedefint(WINAPI*F_WlxLoggedOutSAS)(
PVOIDpWlxContext,DWORDdwSasType,PLUIDpAuthenticationId, PSIDpLogonSid,PDWORDpdwOptions,PHANDLEphToken, PWLX_MPR_NOTIFY_INFOpNprNotifyInfo,PVOID*pProfile); typedefBOOL(WINAPI*F_WlxActivateUserShell)( PVOIDpWlxContext,PWSTRpszDesktopName, PWSTRpszMprLogonScript,PVOIDpEnvironment);
typedefint(WINAPI*F_WlxLoggedOnSAS)(PVOIDpWlxContext,DWORD dwSasType,PVOIDpReserved);
typedefVOID(WINAPI*F_WlxDisplayLockedNotice)(PVOID pWlxContext);
typedefint(WINAPI*F_WlxWkstaLockedSAS)(PVOIDpWlxContext, DWORDdwSasType);
//version1.1
typedefBOOL(WINAPI*F_WlxScreenSaverNotify)(PVOIDpWlxContext, BOOL*pSecure);
typedefBOOL(WINAPI*F_WlxStartApplication)( PVOIDpWlxContext,PWSTRpszDesktopName,PVOID pEnvironment,
PWSTRpszCmdLine); //version1.3
typedefBOOL(WINAPI*F_WlxNetworkProviderLoad)(
PVOIDpWlxContext,PWLX_MPR_NOTIFY_INFOpNprNotifyInfo); typedefBOOL(WINAPI*F_WlxDisplayStatusMessage)( PVOIDpWlxContext,HDESKhDesktop,DWORDdwOptions, PWSTRpTitle,PWSTRpMessage);
typedefBOOL(WINAPI*F_WlxGetStatusMessage)(PVOIDpWlxContext, DWORD*pdwOptions,PWSTRpMessage,DWORDdwBufferSize); typedefBOOL(WINAPI*F_WlxRemoveStatusMessage)(PVOID pWlxContext);
//function
F_WlxNegotiatep_WlxNegotiate=NULL; F_WlxInitializep_WlxInitialize=NULL;
F_WlxDisplaySASNoticep_WlxDisplaySASNotice=NULL; F_WlxLoggedOutSASp_WlxLoggedOutSAS=NULL;
F_WlxActivateUserShellp_WlxActivateUserShell=NULL; F_WlxLoggedOnSASp_WlxLoggedOnSAS=NULL;
F_WlxDisplayLockedNoticep_WlxDisplayLockedNotice=NULL; F_WlxWkstaLockedSASp_WlxWkstaLockedSAS=NULL; F_WlxIsLockOkp_WlxIsLockOk=NULL; F_WlxIsLogoffOkp_WlxIsLogoffOk=NULL; F_WlxLogoffp_WlxLogoff=NULL;
F_WlxShutdownp_WlxShutdown=NULL;
F_WlxScreenSaverNotifyp_WlxScreenSaverNotify=NULL; F_WlxStartApplicationp_WlxStartApplication=NULL;
F_WlxNetworkProviderLoadp_WlxNetworkProviderLoad=NULL; F_WlxDisplayStatusMessagep_WlxDisplayStatusMessage=NULL; F_WlxGetStatusMessagep_WlxGetStatusMessage=NULL;
F_WlxRemoveStatusMessagep_WlxRemoveStatusMessage=NULL; //initGINAfunction
staticHINSTANCEg_hGinaDll=NULL;
#defineGINA_DLLNAME_T(\BOOLLoadGinaDll() {
g_hGinaDll=LoadLibrary(GINA_DLLNAME); if(g_hGinaDll!=NULL) {
p_WlxNegotiate=(F_WlxNegotiate)GetProcAddress(g_hGinaDll, _T(\
p_WlxInitialize=(F_WlxInitialize)GetProcAddress(g_hGinaDll,
(g_hGinaDll,_T(\
p_WlxLoggedOutSAS=(F_WlxLoggedOutSAS)GetProcAddress(g_hGinaDll, _T(\p_WlxActivateUserShell=
(F_WlxActivateUserShell)GetProcAddress (g_hGinaDll,_T(\
p_WlxLoggedOnSAS=(F_WlxLoggedOnSAS)GetProcAddress(g_hGinaDll, _T(\p_WlxDisplayLockedNotice=
(F_WlxDisplayLockedNotice)GetProcAddress (g_hGinaDll,_T(\
p_WlxWkstaLockedSAS=
(F_WlxWkstaLockedSAS)GetProcAddress(g_hGinaDll, _T(\
p_WlxIsLockOk=(F_WlxIsLockOk)GetProcAddress(g_hGinaDll, _T(\
p_WlxIsLogoffOk=(F_WlxIsLogoffOk)GetProcAddress(g_hGinaDll, _T(\
p_WlxLogoff=(F_WlxLogoff)GetProcAddress(g_hGinaDll, _T(\
p_WlxShutdown=(F_WlxShutdown)GetProcAddress(g_hGinaDll, _T(\p_WlxScreenSaverNotify=
(F_WlxScreenSaverNotify)GetProcAddress (g_hGinaDll,_T(\p_WlxStartApplication=
(F_WlxStartApplication)GetProcAddress (g_hGinaDll,_T(\p_WlxNetworkProviderLoad=
(F_WlxNetworkProviderLoad)GetProcAddress (g_hGinaDll,_T(\p_WlxDisplayStatusMessage=
(F_WlxDisplayStatusMessage)GetProcAddress (g_hGinaDll,_T(\p_WlxGetStatusMessage=
(F_WlxGetStatusMessage)GetProcAddress(g_hGinaDll, _T(\p_WlxRemoveStatusMessage=
(F_WlxRemoveStatusMessage)GetProcAddress (g_hGinaDll,_T(\}
returnp_WlxNegotiate&&p_WlxInitialize&&p_WlxDisplaySASNotice&& p_WlxLoggedOutSAS&&p_WlxActivateUserShell&&p_WlxLoggedOnSAS&& p_WlxDisplayLockedNotice&&p_WlxWkstaLockedSAS&&p_WlxIsLockOk&& p_WlxIsLogoffOk&&p_WlxLogoff&&p_WlxShutdown &&p_WlxScreenSaverNotify&&
p_WlxStartApplication&&p_WlxNetworkProviderLoad&& p_WlxDisplayStatusMessage&&p_WlxGetStatusMessage
voidReleaseGinaDll() {
if(g_hGinaDll!=NULL){ FreeLibrary(g_hGinaDll); }
}
staticAFX_EXTENSION_MODULEGinaDLL={NULL,NULL}; staticHINSTANCEg_hdfginadll=NULL;
staticPGINA_CONTEXTg_pgContext=NULL; extern\
DllMain(HINSTANCEhInstance,DWORDdwReason,LPVOIDlpReserved) {
if(dwReason==DLL_PROCESS_ATTACH){ g_hdfginadll=hInstance; BOOLbRet=LoadGinaDll(); }
elseif(dwReason==DLL_PROCESS_DETACH){ ReleaseGinaDll(); }
return1; }
//GINAfunctiondefine
BOOLWINAPIWlxNegotiate(DWORDdwWinLogonVersion,PDWORDpdwDllVersion) {
returnp_WlxNegotiate(dwWinLogonVersion,pdwDllVersion); }
BOOLWINAPIWlxInitialize(LPWSTRlpWinsta,HANDLEhWlx,PVOID pvReserved,
PVOIDpWinLogonFunctions,PVOID*pWlxContext) {
BOOLbRet=p_WlxInitialize(lpWinsta,hWlx,pvReserved, pWinLogonFunctions,pWlxContext);
g_pgContext=(PGINA_CONTEXT)LocalAlloc(LMEM_FIXED|LMEM_ZEROINIT, sizeof(GINA_CONTEXT)); if(!g_pgContext)returnFALSE;
g_pgContext->hDllInstance=g_hdfginadll; g_pgContext->pWlxFuncs=
(PWLX_DISPATCH_VERSION_1_3)pWinLogonFunctions; g_pgContext->hWlx=hWlx;
g_pgContext->station=lpWinsta; returnbRet; }
VOIDWINAPIWlxDisplaySASNotice(PVOIDpWlxContext) {
p_WlxDisplaySASNotice(pWlxContext); }
intWINAPIWlxLoggedOutSAS(PVOIDpWlxContext,DWORDdwSasType, PLUIDpAuthenticationId,PSIDpLogonSid, PDWORDpdwOptions,PHANDLEphToken,