Протокол взаимодействия процесса Winlogon и библиотеки GINA
Для изучения процесса идентификации и аутентификации можно использовать приводимый ниже модуль (DLL), который является "переходником" между WinLogon и стандартной MSGINA. Прототипы экспортируемых MSGINA.DLL описаны в файле winwlx.h стандартной поставки MS SDK.
#include <tchar.h> #include <windows.h> finclude <winioctl.h> finclude "winwlx.h" tinclude <lm.h> #include <io.h> tinclude <stdio.h> tfinclude <fcntl.h> #include "xgina,h" int glob_lock; HINSTANCE hMSGinaDLL HINSTANCE hDllInstance; HANDLE hGlobalWlxPWLX_DISPATCH_VERSION_l_0 pWlxFuncs typedef BOOL (WINAPI *WLXNEGOTIATE)(DWORD, DWORD*); typedef BOOL (WINAPI *WLXINITIALIZE)(LPWSTR, HANDLE, PVOID, PVOID, PVOID); typedef VOID (WINAPI *WLXDISPLAYSASNOTICE)(PVOID); typedef int (WINAPI *WLXLOGGEDOUTSAS)(PVOID, DWORD, PLUID, PSID, PDWORD, PHANDLE, PWLX_MPR_NOTIFY_INFO, PVOID*); typedef BOOL (WINAPI *WLXACTIVATEUSERSHELL) (PVOID, PWSTR, PWSTR, PVOID); typedef int (WINAPI *WLXLOGGEDONSAS)(PVOID, DWORD, PVOID); typedef BOOL (WINAPI *WLXISLOCKOK)(PVOID); typedef VOID (WINAPI *WLXDISPLAYLOCKEDNOTICE) (PVOID); typedef int (WINAPI *WLXWKSTALOCKEDSAS)(PVOID, DWORD); typedef BOOL (WINAPI *WLXISLOGOFFOK) (PVOID); typedef VOID (WINAPI *WLXLOGOFF) (PVOID); typedef VOID (WINAPI *WLXSHUTDOWN)(PVOID, DWORD);
WLXNEGOTIATE g^lpWlxNegotiate = NULL; WLXINITIALIZE g_lpWlxInitialize = NULL; WLXDISPLAYSASNOTICE g_lpWlxDisplaySASNotice = NULL; WLXLOGGEDOUTSAS g_lpWlxLoggedOutSAS = NULL; WLXACTIVATEUSERSHELL g_lpWlxActivateUserShell = NULL; WLXLOGGEDONSAS g_lpWlxLoggedOnSAS = NULL; WLXISLOCKOK g_lpWlx!sLockOk = NULL; WLXDISPLAYLOCKEDNOTICE g_lpWlxDisplayLockedNotice = NULL;
WLXWKSTALOCKEDSAS g_lpWlxWkstaLockedSAS = NULL; WLXISLOGOFFOK g_lpWlx!sLogoffOk = NULL; WLXLOGOFF g_lpWlxLogoff = NULL; WLXSHUTDOWN g_lpWlxShutdown = NULL; BOOL InitMSGinaDll()
I hMSGinaDLL = LoadLibrary(_T("MSGINA.DLL")); I if (hMSGinaDLL == NULL) I { return FALSE; ' } MessageBox(NULL,_T("Load Original Library MSGINA"),_T("GinaDebug"),MB_OK); g_lpWlxNegotiate = (WLXNEGOTIATE)GetProcAddress(, hMSGinaDLL, "WlxNegotiate"); g_lpWlx!nitialize = (WLXINITIALIZE)GetProcAddress( hMSGinaDLL, "Wlxlnitialize"); k g_lpWlxDisplaySASNotice = (WLXDISPLAYSASNOTICE)GetProcAddress( hMSGinaDLL, "WlxDisplaySASNotice"); g_lpWlxLoggedOutSAS = (WLXLOGGEDOUTSAS)GetProcAddress ( hMSGinaDLL, "WlxLoggedOutSAS"); g_lpWlxActivateUserShell = (WLXACTIVATEUSERSHELL)GetProcAddress( hMSGinaDLL, "WlxActivateUserShell"); i g_lpWlxLoggedOnSAS = (WLXLOGGEDONSAS)GetProcAddress( hMSGinaDLL, "WlxLoggedOnSAS");; g_lpWlx!sLockOk = (WLXISLOCKOK)GetProcAddress( hMSGinaDLL, "WlxIsLockOk"); ' g_lpWlxDisplayLockedNotice = (WLXDISPLAYLOCKEDNOTICE)GetProcAddress( hMSGinaDLL, "WlxDisplayLockedNotice"); g_lpWlxWkstaLockedSAS = (WLXWKSTALOCKEDSAS)GetProcAddress ( hMSGinaDLL, "WlxWkstaLockedSAS"); g_lpWlx!sLogoffOk = (WLXISLOGOFFOK)GetProcAddress ( hMSGinaDLL, "WlxIsLogoffOk"); g_lpWlxLogoff = (WLXLOGOFF)GetProcAddress( hMSGinaDLL, "WlxLogoff"); g_lpWlxShutdown = (WLXSHUTDOWN)GetProcAddress( hMSGinaDLL, "WlxShutdown");