Иллюстрированный самоучитель по программированию систем защиты

Протокол взаимодействия процесса 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");
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.