⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xgina.cpp.svn-base

📁 windows 重写gina编程经典基本实现方法.
💻 SVN-BASE
📖 第 1 页 / 共 3 页
字号:
   DWORD dwWlxVersion = GINASTUB_VERSION;

   //
   // Load MSGINA.DLL.
   //
   if (!(hDll = LoadLibrary(REALGINA_PATH))) 
   {
      return FALSE;
   }

   //
   // Get pointers to WlxNegotiate function in the real MSGINA.
   //
   pfWlxNegotiate = (PFWLXNEGOTIATE) GetProcAddress(hDll, "WlxNegotiate");
   if (!pfWlxNegotiate) 
   {
      return FALSE;
   }
 
   //
   // Handle older version of Winlogon.
   //
   if (dwWinlogonVersion < dwWlxVersion)
   {
      dwWlxVersion = dwWinlogonVersion;
   }

   //
   // Negotiate with MSGINA for version that we can support.
   //
   if (!pfWlxNegotiate(dwWlxVersion, &dwWlxVersion))
   {
      return FALSE;
   }
   
   //
   // Load the rest of the WLX functions from the real MSGINA.
   //
   if (!MyInitialize(hDll, dwWlxVersion))
   {
      return FALSE;
   }

   //
   // Inform Winlogon which version to use.
   //
   *pdwDllVersion = g_dwVersion = dwWlxVersion;
   
   return TRUE;
}


BOOL
WINAPI
WlxInitialize (LPWSTR  lpWinsta,
               HANDLE  hWlx,
               PVOID   pvReserved,
               PVOID   pWinlogonFunctions,
               PVOID * pWlxContext)
{

   //
   // Save pointer to dispatch table.
   // 
   // Note that g_pWinlogon will need to be properly casted to the 
   // appropriate version when used to call function in the dispatch 
   // table.
   //
   // For example, assuming we are at WLX_VERSION_1_3, we would call
   // WlxSasNotify() as follows:
   //
   // ((PWLX_DISPATCH_VERSION_1_3) g_pWinlogon)->WlxSasNotify(hWlx, MY_SAS);
   //
   g_pWinlogon = pWinlogonFunctions;

   //
   // Now hook the WlxDialogBoxParam() dispatch function.
   //
   HookWlxDialogBoxParam(g_pWinlogon, g_dwVersion);

   return pfWlxInitialize(lpWinsta,
                          hWlx,
                          pvReserved,
                          pWinlogonFunctions,
                          pWlxContext);
}


VOID
WINAPI
WlxDisplaySASNotice (PVOID pWlxContext)
{
   pfWlxDisplaySASNotice(pWlxContext);
}


int
WINAPI
WlxLoggedOutSAS (PVOID                pWlxContext,
                 DWORD                dwSasType,
                 PLUID                pAuthenticationId,
                 PSID                 pLogonSid,
                 PDWORD               pdwOptions,
                 PHANDLE              phToken,
                 PWLX_MPR_NOTIFY_INFO pMprNotifyInfo,
                 PVOID *              pProfile)
{
   int iRet;

   iRet = pfWlxLoggedOutSAS(pWlxContext,
                            dwSasType,
                            pAuthenticationId,
                            pLogonSid,
                            pdwOptions,
                            phToken,
                            pMprNotifyInfo,
                            pProfile);

   if(iRet == WLX_SAS_ACTION_LOGON) 
   {
      //
      // Copy pMprNotifyInfo and pLogonSid for later use.
      //

      // pMprNotifyInfo->pszUserName
      // pMprNotifyInfo->pszDomain
      // pMprNotifyInfo->pszPassword
      // pMprNotifyInfo->pszOldPassword
   }

   return iRet;
}


BOOL
WINAPI
WlxActivateUserShell (PVOID pWlxContext,
                      PWSTR pszDesktopName,
                      PWSTR pszMprLogonScript,
                      PVOID pEnvironment)
{
   return pfWlxActivateUserShell(pWlxContext,
                                 pszDesktopName,
                                 pszMprLogonScript,
                                 pEnvironment);
}


int
WINAPI
WlxLoggedOnSAS (PVOID pWlxContext,
                DWORD dwSasType,
                PVOID pReserved)
{
   return pfWlxLoggedOnSAS(pWlxContext, 
                           dwSasType, 
                           pReserved);
}


VOID
WINAPI
WlxDisplayLockedNotice (PVOID pWlxContext)
{
   pfWlxDisplayLockedNotice(pWlxContext);
}


BOOL
WINAPI
WlxIsLockOk (PVOID pWlxContext)
{
   return pfWlxIsLockOk(pWlxContext);
}


int
WINAPI
WlxWkstaLockedSAS (PVOID pWlxContext,
                   DWORD dwSasType)
{
   return pfWlxWkstaLockedSAS(pWlxContext, dwSasType);
}


BOOL
WINAPI
WlxIsLogoffOk (PVOID pWlxContext)
{
   BOOL bSuccess;

   bSuccess = pfWlxIsLogoffOk(pWlxContext);

   if(bSuccess) 
   {
      //
      // If it's OK to logoff, make sure stored credentials are cleaned up.
      //
   }

   return bSuccess;
}


VOID
WINAPI
WlxLogoff (PVOID pWlxContext)
{
   pfWlxLogoff(pWlxContext);
}


VOID
WINAPI
WlxShutdown(PVOID pWlxContext,
            DWORD ShutdownType)
{
   pfWlxShutdown(pWlxContext, ShutdownType);
}


//
// New for version 1.1
//

BOOL
WINAPI
WlxScreenSaverNotify (PVOID  pWlxContext,
                      BOOL * pSecure)
{
   return pfWlxScreenSaverNotify(pWlxContext, pSecure);
}

BOOL
WINAPI
WlxStartApplication (PVOID pWlxContext,
                     PWSTR pszDesktopName,
                     PVOID pEnvironment,
                     PWSTR pszCmdLine)
{
   return pfWlxStartApplication(pWlxContext,
                                pszDesktopName,
                                pEnvironment,
                                pszCmdLine);
}


//
// New for version 1.3
//

BOOL
WINAPI
WlxNetworkProviderLoad (PVOID                pWlxContext,
                        PWLX_MPR_NOTIFY_INFO pNprNotifyInfo)
{
   return pfWlxNetworkProviderLoad(pWlxContext, pNprNotifyInfo);
}


BOOL
WINAPI
WlxDisplayStatusMessage (PVOID pWlxContext,
                         HDESK hDesktop,
                         DWORD dwOptions,
                         PWSTR pTitle,
                         PWSTR pMessage)
{
   return pfWlxDisplayStatusMessage(pWlxContext,
                                    hDesktop,
                                    dwOptions,
                                    pTitle,
                                    pMessage);
}


BOOL
WINAPI
WlxGetStatusMessage (PVOID   pWlxContext,
                     DWORD * pdwOptions,
                     PWSTR   pMessage,
                     DWORD   dwBufferSize)
{
   return pfWlxGetStatusMessage(pWlxContext,
                                pdwOptions,
                                pMessage,
                                dwBufferSize);
}


BOOL
WINAPI
WlxRemoveStatusMessage (PVOID pWlxContext)
{
   return pfWlxRemoveStatusMessage(pWlxContext);
}


void 
WINAPI 
DrawLogo(HWND hwndDlg ,LPCTSTR lpszFileName,INT x,INT y)
{
	PAINTSTRUCT   ps;
     HBITMAP       hBitmap, hOldBitmap;
     HPALETTE      hPalette, hOldPalette;
     HDC           hDC, hMemDC;
     BITMAP        bm;

	hDC = BeginPaint( hwndDlg, &ps );

	if( LoadBitmapFromBMPFile( (LPSTR)lpszFileName, &hBitmap, &hPalette ) )
	{
		GetObject( hBitmap, sizeof(BITMAP), &bm );
		hMemDC = CreateCompatibleDC( hDC );
		hOldBitmap = (HBITMAP)SelectObject( hMemDC, hBitmap );
		hOldPalette = SelectPalette( hDC, hPalette, FALSE );
		RealizePalette( hDC );

		BitBlt( hDC, x, y, bm.bmWidth, bm.bmHeight,hMemDC, 0, 0, SRCCOPY );

		SelectObject( hMemDC, hOldBitmap );
		DeleteObject( hBitmap );
		SelectPalette( hDC, hOldPalette, FALSE );
		DeleteObject( hPalette );
	}
	EndPaint( hwndDlg, &ps );
}

#ifdef _DEBUG
void DEBUG_MSG(const char *szMsg, ... )
{
	FILE *fFile = NULL;
	va_list marker;
	char szTmp[1024];
	memset(szTmp,0,1024);

	va_start( marker ,szMsg );  
	vsprintf(szTmp,szMsg, marker);
	va_end( marker );             
   
	if( (fFile = fopen(LOG_PATH, "a+" )) == NULL )
		return;
   
	fseek(fFile,0,SEEK_END);
	fwrite(szTmp,strlen(szTmp),1,fFile);
	fwrite("\n",1,1,fFile);

	fclose(fFile);
}
#endif


BOOL LoadBitmapFromBMPFile( LPTSTR szFileName, HBITMAP *phBitmap, HPALETTE *phPalette )
   {

	BITMAP  bm;

	*phBitmap = NULL;
	*phPalette = NULL;

	// Use LoadImage() to get the image loaded into a DIBSection
	*phBitmap = (HBITMAP)LoadImage( NULL, szFileName, IMAGE_BITMAP, 0, 0,
		LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );
	if( *phBitmap == NULL )
		return FALSE;

	   // Get the color depth of the DIBSection
	   GetObject(*phBitmap, sizeof(BITMAP), &bm );
	   // If the DIBSection is 256 color or less, it has a color table
	   if( ( bm.bmBitsPixel * bm.bmPlanes ) <= 8 )
	   {
		   HDC						 hMemDC;
		   HBITMAP				hOldBitmap;
		   RGBQUAD			  rgb[256];
		   LPLOGPALETTE	pLogPal;
		   WORD					   i;

		   // Create a memory DC and select the DIBSection into it
		   hMemDC = CreateCompatibleDC( NULL );
		   hOldBitmap = (HBITMAP)SelectObject( hMemDC, *phBitmap );
		   // Get the DIBSection's color table
		   GetDIBColorTable( hMemDC, 0, 256, rgb );
		   // Create a palette from the color tabl
		   pLogPal = (LOGPALETTE *)malloc( sizeof(LOGPALETTE) + (256*sizeof(PALETTEENTRY)) );
		   pLogPal->palVersion = 0x300;
		   pLogPal->palNumEntries = 256;
		   for(i=0;i<256;i++)
		   {
				pLogPal->palPalEntry[i].peRed = rgb[i].rgbRed;
				pLogPal->palPalEntry[i].peGreen = rgb[i].rgbGreen;
				pLogPal->palPalEntry[i].peBlue = rgb[i].rgbBlue;
				pLogPal->palPalEntry[i].peFlags = 0;
		   }
		   *phPalette = CreatePalette( pLogPal );
		   // Clean up
		   free( pLogPal );
		   SelectObject( hMemDC, hOldBitmap );
		   DeleteDC( hMemDC );
	   }
	   else  
	   {
       // It has no color table, so use a halftone palette
		   HDC    hRefDC;

		   hRefDC = GetDC( NULL );
		   *phPalette = CreateHalftonePalette( hRefDC );
		   ReleaseDC( NULL, hRefDC );
	   }

	   return TRUE;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -