Протокол взаимодействия процесса 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");
