GINASTUB.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:9k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*++
  2. Copyright 1996 - 1997 Microsoft Corporation
  3. Module Name:
  4.     ginastub.c
  5. Abstract:
  6.     This sample illustrates a pass-thru "stub" gina which can be used
  7.     in some cases to simplify gina development.
  8.     A common use for a gina is to implement code which requires the
  9.     credentials of the user logging onto the workstation.  The credentials
  10.     may be required for syncronization with foreign account databases
  11.     or custom authentication activities.
  12.     In this example case, it is possible to implement a simple gina
  13.     stub layer which simply passes control for the required functions
  14.     to the previously installed gina, and captures the interesting
  15.     parameters from that gina.  In this scenario, the existing functionality
  16.     in the existent gina is retained.  In addition, the development time
  17.     is reduced drastically, as existing functionality does not need to
  18.     be duplicated.
  19.     When dealing with credentials, take steps to maintain the security
  20.     of the credentials.  For instance, if transporting credentials over
  21.     a network, be sure to encrypt the credentials.
  22. Author:
  23.     Scott Field (sfield)    18-Jul-96
  24. --*/
  25. #include <windows.h>
  26. #include <stdio.h>
  27. #include <winwlx.h>
  28. #include "ginastub.h"
  29. //
  30. // Location of the real msgina.
  31. //
  32. #define REALGINA_PATH   TEXT("MSGINA.DLL")
  33. //
  34. // winlogon function dispatch table
  35. //
  36. PWLX_DISPATCH_VERSION_1_0 g_pWinlogon;
  37. //
  38. // Functions pointers to the real msgina which we will call.
  39. //
  40. PGWLXNEGOTIATE GWlxNegotiate;
  41. PGWLXINITIALIZE GWlxInitialize;
  42. PGWLXDISPLAYSASNOTICE GWlxDisplaySASNotice;
  43. PGWLXLOGGEDOUTSAS GWlxLoggedOutSAS;
  44. PGWLXACTIVATEUSERSHELL GWlxActivateUserShell;
  45. PGWLXLOGGEDONSAS GWlxLoggedOnSAS;
  46. PGWLXDISPLAYLOCKEDNOTICE GWlxDisplayLockedNotice;
  47. PGWLXWKSTALOCKEDSAS GWlxWkstaLockedSAS;
  48. PGWLXISLOCKOK GWlxIsLockOk;
  49. PGWLXISLOGOFFOK GWlxIsLogoffOk;
  50. PGWLXLOGOFF GWlxLogoff;
  51. PGWLXSHUTDOWN GWlxShutdown;
  52. //
  53. // NEW for version 1.1
  54. //
  55. PGWLXSTARTAPPLICATION GWlxStartApplication;
  56. PGWLXSCREENSAVERNOTIFY GWlxScreenSaverNotify;
  57. //
  58. // hook into the real GINA.
  59. //
  60. BOOL
  61. MyInitialize( void )
  62. {
  63.     HINSTANCE hDll;
  64.     //
  65.     // Load MSGINA.DLL.
  66.     //
  67.     if( !(hDll = LoadLibrary( REALGINA_PATH )) ) {
  68.         return FALSE;
  69.     }
  70.     //
  71.     // Get pointers to all of the WLX functions in the real MSGINA.
  72.     //
  73.     GWlxNegotiate = (PGWLXNEGOTIATE)GetProcAddress( hDll, "WlxNegotiate" );
  74.     if( !GWlxNegotiate ) {
  75.         return FALSE;
  76.     }
  77.     GWlxInitialize = (PGWLXINITIALIZE)GetProcAddress( hDll, "WlxInitialize" );
  78.     if( !GWlxInitialize ) {
  79.         return FALSE;
  80.     }
  81.     GWlxDisplaySASNotice =
  82.         (PGWLXDISPLAYSASNOTICE)GetProcAddress( hDll, "WlxDisplaySASNotice" );
  83.     if( !GWlxDisplaySASNotice ) {
  84.         return FALSE;
  85.     }
  86.     GWlxLoggedOutSAS =
  87.         (PGWLXLOGGEDOUTSAS)GetProcAddress( hDll, "WlxLoggedOutSAS" );
  88.     if( !GWlxLoggedOutSAS ) {
  89.         return FALSE;
  90.     }
  91.     GWlxActivateUserShell =
  92.         (PGWLXACTIVATEUSERSHELL)GetProcAddress( hDll, "WlxActivateUserShell" );
  93.     if( !GWlxActivateUserShell ) {
  94.         return FALSE;
  95.     }
  96.     GWlxLoggedOnSAS =
  97.         (PGWLXLOGGEDONSAS)GetProcAddress( hDll, "WlxLoggedOnSAS" );
  98.     if( !GWlxLoggedOnSAS ) {
  99.         return FALSE;
  100.     }
  101.     GWlxDisplayLockedNotice =
  102.         (PGWLXDISPLAYLOCKEDNOTICE)GetProcAddress(
  103.                                         hDll,
  104.                                         "WlxDisplayLockedNotice" );
  105.     if( !GWlxDisplayLockedNotice ) {
  106.         return FALSE;
  107.     }
  108.     GWlxIsLockOk = (PGWLXISLOCKOK)GetProcAddress( hDll, "WlxIsLockOk" );
  109.     if( !GWlxIsLockOk ) {
  110.         return FALSE;
  111.     }
  112.     GWlxWkstaLockedSAS =
  113.         (PGWLXWKSTALOCKEDSAS)GetProcAddress( hDll, "WlxWkstaLockedSAS" );
  114.     if( !GWlxWkstaLockedSAS ) {
  115.         return FALSE;
  116.     }
  117.     GWlxIsLogoffOk = (PGWLXISLOGOFFOK)GetProcAddress( hDll, "WlxIsLogoffOk" );
  118.     if( !GWlxIsLogoffOk ) {
  119.         return FALSE;
  120.     }
  121.     GWlxLogoff = (PGWLXLOGOFF)GetProcAddress( hDll, "WlxLogoff" );
  122.     if( !GWlxLogoff ) {
  123.         return FALSE;
  124.     }
  125.     GWlxShutdown = (PGWLXSHUTDOWN)GetProcAddress( hDll, "WlxShutdown" );
  126.     if( !GWlxShutdown ) {
  127.         return FALSE;
  128.     }
  129.     //
  130.     // we don't check for failure here because these don't exist for
  131.     // gina's implemented prior to Windows NT 4.0
  132.     //
  133.     GWlxStartApplication = (PGWLXSTARTAPPLICATION) GetProcAddress( hDll, "WlxStartApplication" );
  134.     GWlxScreenSaverNotify = (PGWLXSCREENSAVERNOTIFY) GetProcAddress( hDll, "WlxScreenSaverNotify" );
  135.     //
  136.     // Everything loaded ok.  Return success.
  137.     //
  138.     return TRUE;
  139. }
  140. BOOL
  141. WINAPI
  142. WlxNegotiate(
  143.     DWORD       dwWinlogonVersion,
  144.     DWORD       *pdwDllVersion)
  145. {
  146.     if( !MyInitialize() )
  147.         return FALSE;
  148.     return GWlxNegotiate( dwWinlogonVersion, pdwDllVersion );
  149. }
  150. BOOL
  151. WINAPI
  152. WlxInitialize(
  153.     LPWSTR      lpWinsta,
  154.     HANDLE      hWlx,
  155.     PVOID       pvReserved,
  156.     PVOID       pWinlogonFunctions,
  157.     PVOID       *pWlxContext)
  158. {
  159.     return GWlxInitialize(
  160.                 lpWinsta,
  161.                 hWlx,
  162.                 pvReserved,
  163.                 pWinlogonFunctions,
  164.                 pWlxContext
  165.                 );
  166. }
  167. VOID
  168. WINAPI
  169. WlxDisplaySASNotice(
  170.     PVOID   pWlxContext)
  171. {
  172.     GWlxDisplaySASNotice( pWlxContext );
  173. }
  174. int
  175. WINAPI
  176. WlxLoggedOutSAS(
  177.     PVOID           pWlxContext,
  178.     DWORD           dwSasType,
  179.     PLUID           pAuthenticationId,
  180.     PSID            pLogonSid,
  181.     PDWORD          pdwOptions,
  182.     PHANDLE         phToken,
  183.     PWLX_MPR_NOTIFY_INFO    pMprNotifyInfo,
  184.     PVOID           *pProfile)
  185. {
  186.     int iRet;
  187.     iRet = GWlxLoggedOutSAS(
  188.                 pWlxContext,
  189.                 dwSasType,
  190.                 pAuthenticationId,
  191.                 pLogonSid,
  192.                 pdwOptions,
  193.                 phToken,
  194.                 pMprNotifyInfo,
  195.                 pProfile
  196.                 );
  197.     if(iRet == WLX_SAS_ACTION_LOGON) {
  198.         //
  199.         // copy pMprNotifyInfo and pLogonSid for later use
  200.         //
  201.         // pMprNotifyInfo->pszUserName
  202.         // pMprNotifyInfo->pszDomain
  203.         // pMprNotifyInfo->pszPassword
  204.         // pMprNotifyInfo->pszOldPassword
  205.     }
  206.     return iRet;
  207. }
  208. BOOL
  209. WINAPI
  210. WlxActivateUserShell(
  211.     PVOID           pWlxContext,
  212.     PWSTR           pszDesktopName,
  213.     PWSTR           pszMprLogonScript,
  214.     PVOID           pEnvironment)
  215. {
  216.     return GWlxActivateUserShell(
  217.                 pWlxContext,
  218.                 pszDesktopName,
  219.                 pszMprLogonScript,
  220.                 pEnvironment
  221.                 );
  222. }
  223. int
  224. WINAPI
  225. WlxLoggedOnSAS(
  226.     PVOID           pWlxContext,
  227.     DWORD           dwSasType,
  228.     PVOID           pReserved)
  229. {
  230.     return GWlxLoggedOnSAS( pWlxContext, dwSasType, pReserved );
  231. }
  232. VOID
  233. WINAPI
  234. WlxDisplayLockedNotice(
  235.     PVOID           pWlxContext )
  236. {
  237.     GWlxDisplayLockedNotice( pWlxContext );
  238. }
  239. BOOL
  240. WINAPI
  241. WlxIsLockOk(
  242.     PVOID           pWlxContext)
  243. {
  244.     return GWlxIsLockOk( pWlxContext );
  245. }
  246. int
  247. WINAPI
  248. WlxWkstaLockedSAS(
  249.     PVOID           pWlxContext,
  250.     DWORD           dwSasType )
  251. {
  252.     return GWlxWkstaLockedSAS( pWlxContext, dwSasType );
  253. }
  254. BOOL
  255. WINAPI
  256. WlxIsLogoffOk(
  257.     PVOID pWlxContext
  258.     )
  259. {
  260.     BOOL bSuccess;
  261.     bSuccess = GWlxIsLogoffOk( pWlxContext );
  262.     if(bSuccess) {
  263.         //
  264.         // if it's ok to logoff, finish with the stored credentials
  265.         // and scrub the buffers
  266.         //
  267.     }
  268.     return bSuccess;
  269. }
  270. VOID
  271. WINAPI
  272. WlxLogoff(
  273.     PVOID pWlxContext
  274.     )
  275. {
  276.     GWlxLogoff( pWlxContext );
  277. }
  278. VOID
  279. WINAPI
  280. WlxShutdown(
  281.     PVOID pWlxContext,
  282.     DWORD ShutdownType
  283.     )
  284. {
  285.     GWlxShutdown( pWlxContext, ShutdownType );
  286. }
  287. //
  288. // NEW for version 1.1
  289. //
  290. BOOL
  291. WINAPI
  292. WlxScreenSaverNotify(
  293.     PVOID                   pWlxContext,
  294.     BOOL *                  pSecure
  295.     )
  296. {
  297.     if(GWlxScreenSaverNotify != NULL)
  298.         return GWlxScreenSaverNotify( pWlxContext, pSecure );
  299.     //
  300.     // if not exported, return something intelligent
  301.     //
  302.     *pSecure = TRUE;
  303.     return TRUE;
  304. }
  305. BOOL
  306. WINAPI
  307. WlxStartApplication(
  308.     PVOID                   pWlxContext,
  309.     PWSTR                   pszDesktopName,
  310.     PVOID                   pEnvironment,
  311.     PWSTR                   pszCmdLine
  312.     )
  313. {
  314.     if(GWlxStartApplication != NULL)
  315.         return GWlxStartApplication(
  316.             pWlxContext,
  317.             pszDesktopName,
  318.             pEnvironment,
  319.             pszCmdLine
  320.             );
  321.     //
  322.     // if not exported, return something intelligent
  323.     //
  324. }