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

Windows编程

开发平台:

Visual C++

  1. /*+==========================================================================
  2.   File:      DLLSKEL.CPP
  3.   Summary:   Implementation file for the general DLL skeleton
  4.              that can be used as a point of departure for more complex
  5.              COM Win32 DLLs.  It is used as a skeletal base for
  6.              the COM Tutorial series of code samples.
  7.              DLLSKEL.CPP contains the DllMain entry function for the DLL.
  8.              As a simple skeleton, this DLL contains only two
  9.              representative exported function calls: DllHelloBox and
  10.              DllAboutBox.
  11.              For a comprehensive tutorial code tour of DLLSKEL's
  12.              contents and offerings see the tutorial DLLSKEL.HTM file.
  13.              For more specific technical details on the internal workings
  14.              see the comments dispersed throughout the DLLSKEL source code.
  15.   Classes:   none.
  16.   Functions: DllMain, DllHelloBox, DllAboutBox
  17.   Origin:    12-9-96: atrent - Created and revised via editor-inheritance
  18.                of DLLSKEL.C in the Win32 SDK FRMWORK code samples.
  19. ----------------------------------------------------------------------------
  20.   This file is part of the Microsoft COM Tutorial Code Samples.
  21.   Copyright (C) Microsoft Corporation, 1997.  All rights reserved.
  22.   This source code is intended only as a supplement to Microsoft
  23.   Development Tools and/or on-line documentation.  See these other
  24.   materials for detailed information regarding Microsoft code samples.
  25.   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  26.   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  27.   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  28.   PARTICULAR PURPOSE.
  29. ==========================================================================+*/
  30. /*---------------------------------------------------------------------------
  31.   We include WINDOWS.H for all Win32 applications.
  32.   We include OLE2.H because we will be calling the COM/OLE Libraries
  33.     in future exploitation of this DLL skeleton.
  34.   We include APPUTIL.H because we will be building this DLL using
  35.     the convenient Virtual Window and Dialog classes and other
  36.     utility functions in the APPUTIL Library (ie, APPUTIL.LIB).
  37.   We include DLLSKELI.H because it has internal class declarations and
  38.     resource ID definitions specific for this DLL.
  39.   We include DLLSKEL.H because it has the necessary STDENTRY function
  40.     prototypes.  The _DLLEXPORT_ #define is used to tell DLLSKEL.H to
  41.     define the appropriate functions as exported from this DLL.
  42.     Otherwise, DLLSKEL.H is included by users of this DLL who do not
  43.     define _DLLEXPORT_ so that the appropriate functions are then
  44.     declared as imports rather than defined as exports.
  45. ---------------------------------------------------------------------------*/
  46. #include <windows.h>
  47. #include <ole2.h>
  48. #include <apputil.h>
  49. #include "dllskeli.h"
  50. #define _DLLEXPORT_
  51. #include "dllskel.h"
  52. // Global variable definitions. Some Initialized in DllMain() below.
  53. // We define a static global variable to point to file-mapped shared memory.
  54. // This memory is shared by all loaded instances of this DLL.
  55. static void* g_pvShared = NULL;
  56. // Handle to file mapping object.
  57. static HANDLE g_hMapObj = NULL;
  58. // We encapsulate some of the global instance data for clarity.  Here is a
  59. // pointer to the DllData object.
  60. CDllData* g_pDll;
  61. /*F+F++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  62.   Function: UnicodeOk
  63.   Summary:  Checks if the platform will handle unicode versions of
  64.             Win32 string API calls.
  65.   Args:     void
  66.   Returns:  BOOL
  67.               TRUE if unicode support; FALSE if not.
  68. ------------------------------------------------------------------------F-F*/
  69. BOOL UnicodeOk(void)
  70. {
  71.   BOOL bOk = TRUE;
  72.   TCHAR szUserName[MAX_STRING_LENGTH];
  73.   DWORD dwSize = MAX_STRING_LENGTH;
  74.   if (!GetUserName(szUserName, &dwSize))
  75.     bOk = ERROR_CALL_NOT_IMPLEMENTED == GetLastError() ? FALSE : TRUE;
  76.   return bOk;
  77. }
  78. #if defined(UNICODE)
  79. #define DLLSKELSHARED_STR L"DLLSkelShared"
  80. #else
  81. #define DLLSKELSHARED_STR "DLLSkelShared"
  82. #endif
  83. /*F+F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F
  84.   Function: DllMain
  85.   Summary:  Like WinMain is for an EXE application, this DllMain function
  86.             is the main entry point for this DLL.  It is called when the
  87.             DLL is loaded by a process, and when new threads are created
  88.             by a process that has already loaded this DLL.  DllMain is also
  89.             called when threads of a process that has loaded the DLL exit
  90.             cleanly and when the process itself unloads the DLL.
  91.             If you want to use C runtime libraries, keep this function
  92.             named "DllMain" and you won't have to do anything special to
  93.             initialize the runtime libraries.
  94.             When fdwReason == DLL_PROCESS_ATTACH, the return value is used
  95.             to determine if the DLL should remain loaded, or should be
  96.             immediately unloaded depending upon whether the DLL could be
  97.             initialized properly.  For all other values of fdwReason,
  98.             the return value is ignored.
  99.   Args:     HINSTANCE hDllInst,
  100.               Instance handle of the DLL.
  101.             DWORD fdwReason,
  102.               Process attach/detach or thread attach/detach.
  103.               Reason for calling.
  104.             LPVOID lpvReserved)
  105.               Reserved and not used.
  106.   Returns:  BOOL,
  107.               Return value is used only when fdwReason == DLL_PROCESS_ATTACH.
  108.               TRUE  -  Used to signify that the DLL should remain loaded.
  109.               FALSE -  Used to signify that the DLL should be
  110.                 immediately unloaded.
  111. F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F-F*/
  112. BOOL WINAPI DllMain(
  113.               HINSTANCE hDllInst,
  114.               DWORD fdwReason,
  115.               LPVOID lpvReserved)
  116. {
  117.   BOOL bResult = TRUE;
  118.   // Dispatch this call based on the reason it was called.
  119.   switch (fdwReason)
  120.   {
  121.     case DLL_PROCESS_ATTACH:
  122.       // The DLL is being loaded for the first time by a given process.
  123.       // Perform per-process initialization here.  If the initialization
  124.       // is successful, return TRUE; if unsuccessful, return FALSE.
  125.       bResult = FALSE;
  126.       if (UnicodeOk())
  127.       {
  128.         // Instantiate a DLL global data encapsulator class.
  129.         g_pDll = new CDllData;
  130.         if (NULL != g_pDll)
  131.         {
  132.           // Remember the DLL Instance handle.
  133.           g_pDll->hDllInst = hDllInst;
  134.           // Create a MsgBox object.
  135.           g_pDll->pMsgBox = new CMsgBox;
  136.           if (NULL != g_pDll->pMsgBox)
  137.           {
  138.             BOOL fFirst;
  139.             int iSharedSize = sizeof(CDllShared);
  140.             // Create a named file mapping object.
  141.             g_hMapObj = CreateFileMapping(
  142.                           (HANDLE) 0xFFFFFFFF,     // Use paging file
  143.                           NULL,                    // No security attributes
  144.                           PAGE_READWRITE,          // Read/Write access
  145.                           0,                       // Mem Size: high 32 bits
  146.                           iSharedSize,             // Mem Size: low 32 bits
  147.                           DLLSKELSHARED_STR);      // Name of map object
  148.             if (NULL != g_hMapObj)
  149.             {
  150.               // Determine if this is the first create of the file mapping.
  151.               fFirst = (ERROR_ALREADY_EXISTS != GetLastError());
  152.               // Now get a pointer to the file-mapped shared memory.
  153.               g_pvShared = MapViewOfFile(
  154.                              g_hMapObj,        // File Map obj to view
  155.                              FILE_MAP_WRITE,   // Read/Write access
  156.                              0,                // high: map from beginning
  157.                              0,                // low:
  158.                              0);               // default: map entire file
  159.               if (NULL != g_pvShared)
  160.               {
  161.                 CDllShared* pShared = (CDllShared*) g_pvShared;
  162.                 if (fFirst)
  163.                 {
  164.                   // If this is the first attaching process, init the
  165.                   // shared memory.
  166.                   memset(g_pvShared, 0, iSharedSize);
  167.                   pShared->iUserCount = 1;
  168.                 }
  169.                 else
  170.                 {
  171.                   // Increment the cummulative global count of all
  172.                   // attached processes (ie, the count of DLL users).
  173.                   InterlockedIncrement((LONG*) &pShared->iUserCount);
  174.                 }
  175.                 // Save a local instance copy of this user instance
  176.                 // count. Each user process has its own g_pDll instance
  177.                 // data and can thus remember it's user instance count.
  178.                 g_pDll->iUserCount = pShared->iUserCount;
  179.                 bResult = TRUE;
  180.               }
  181.             }
  182.           }
  183.         }
  184.       }
  185.       break;
  186.     case DLL_PROCESS_DETACH:
  187.       // The DLL is being unloaded by a given process.  Do any
  188.       // per-process clean up here, such as undoing what was done in
  189.       // DLL_PROCESS_ATTACH.  The return value is ignored.
  190.       // Unmap any shared memory from the process's address space.
  191.       UnmapViewOfFile(g_pvShared);
  192.       // Close the process's handle to the file-mapping object.
  193.       CloseHandle(g_hMapObj);
  194.       if (NULL != g_pDll)
  195.       {
  196.         // Delete the message box and global DLL instance data.
  197.         DELETE_POINTER(g_pDll->pMsgBox);
  198.         DELETE_POINTER(g_pDll);
  199.       }
  200.       break;
  201.     case DLL_THREAD_ATTACH:
  202.       // A thread is being created in a process that has already loaded
  203.       // this DLL.  Perform any per-thread initialization here.  The
  204.       // return value is ignored.
  205.       break;
  206.     case DLL_THREAD_DETACH:
  207.       // A thread is exiting cleanly in a process that has already
  208.       // loaded this DLL.  Perform any per-thread clean up here.  The
  209.       // return value is ignored.
  210.       break;
  211.     default:
  212.       break;
  213.   }
  214.   return (bResult);
  215. }
  216. /*F+F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F
  217.   Function: DllHelloBox
  218.   Summary:  One of the exported service functions of this DLL.  In this
  219.             simple code sample, DllHelloBox uses a special
  220.             InterlockedIncrement Win32 function call to provide mutually
  221.             exclusive access to incrementing a global count of the number
  222.             of times this function was called.  A message box is shown to
  223.             display the instance handle of this DLL and the number of
  224.             times this DllHelloBox has been called.  See DLLSKEL.HTM for
  225.             more details.
  226.   Args:     HWND hWnd)
  227.               Handle of the window that is to be parent of message box.
  228.   Returns:  BOOL,
  229.               Always returns TRUE.
  230. F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F-F*/
  231. STDENTRY_(BOOL) DllHelloBox(
  232.                   HWND hWnd)
  233. {
  234.   int iHelloCount;
  235.   CDllShared* pShared = (CDllShared*) g_pvShared;
  236.   // Increment the cummulative global count of all Hellos.
  237.   InterlockedIncrement((LONG*) &pShared->iHelloCount);
  238.   iHelloCount = pShared->iHelloCount;
  239.   // Now show the user a -Notice- message box and load the display strings
  240.   // out of this DLL's resources.  Use the format string to show the
  241.   // user instance count of this loaded DLL and the shared hello count.
  242.   g_pDll->pMsgBox->Init(g_pDll->hDllInst, hWnd);
  243.   g_pDll->pMsgBox->NoteFmtID(
  244.             IDS_HELLOCOUNTFMT,
  245.             g_pDll->iUserCount,
  246.             iHelloCount);
  247.   return TRUE;
  248. }
  249. /*F+F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F+++F
  250.   Function: DllAboutBox
  251.   Summary:  One of the exported service functions of this DLL.  In this
  252.             simple code sample, DllAboutBox showcases use of the
  253.             CAboutBox class (from the APPUTIL utility library).  It also
  254.             illustrates how to implement this dialog using resources
  255.             stored in this DLL itself.  See DLLSKEL.HTM for details on
  256.             how this DLLSKEL.DLL is exploited by the DLLUSER.EXE
  257.             application.
  258.   Args:     HWND hWnd)
  259.               Handle of window that is to be parent of the dialog window.
  260.   Returns:  BOOL,
  261.               Always returns TRUE.
  262. F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F---F-F*/
  263. STDENTRY_(BOOL) DllAboutBox(
  264.                   HWND hWnd)
  265. {
  266.   // Define one of those nifty APPUTIL CAboutBox modal dialog objects.
  267.   CAboutBox dlgAboutBox;
  268.   // Show the standard About Box dialog for this DLL by telling the dialog
  269.   // C++ object to show itself by invoking its ShowDialog method.
  270.   // Pass it this DLL instance and the parent window handle.  Use a dialog
  271.   // resource ID for the dialog stored in this DLL module's resources.
  272.   dlgAboutBox.ShowDialog(
  273.     g_pDll->hDllInst,
  274.     MAKEINTRESOURCE(IDD_ABOUTBOX),
  275.     hWnd);
  276.   return TRUE;
  277. }