home *** CD-ROM | disk | FTP | other *** search
/ Power GUI Programming with VisualAge C++ / powergui.iso / trialva / ibmcppw / sdk / win32s / ut / samples / ut_def / db32.c < prev   
Encoding:
C/C++ Source or Header  |  1995-07-11  |  3.6 KB  |  157 lines

  1. /*++
  2.  
  3. Copyright (c) 1985-92, Microsoft Corporation
  4.  
  5. Module Name:
  6.  
  7.     db32.c
  8.  
  9. Abstract:
  10.  
  11.     Win32s sample code of Universal Thunk (UT) -
  12.     32bit code that provides the same services as DB.DLL by means
  13.     of thunking to 16bit dll.
  14.     This is the main source file of DB32.DLL
  15.  
  16. --*/
  17.  
  18.  
  19. #define W32SUT_32
  20.  
  21. #include <windows.h>
  22. #include <w32sut.h>
  23. #include <db.h>
  24.  
  25. UT32PROC  pfnUTProc=NULL;
  26. int       cProcessesAttached = 0;
  27.  
  28.  
  29. BOOL
  30. DllInit(HANDLE hInst, DWORD fdwReason, LPVOID lpReserved)
  31. {
  32.  
  33.   if ( fdwReason == DLL_PROCESS_ATTACH ) {
  34.  
  35.     /*
  36.      * Registration of UT need to be done only once for first
  37.      * attaching process.
  38.      */
  39.  
  40.     if ( cProcessesAttached++ ) {
  41.         return(TRUE);
  42.     }
  43.  
  44.     return UTRegister( hInst,        // DB32.DLL module handle
  45.                        "DB16.DLL",   // name of 16bit thunk dll
  46.                        NULL,         // no init routine
  47.                        "UTProc",     // name of 16bit dispatch routine
  48.                                      // exported from DB16.DLL
  49.                        &pfnUTProc,   // Global variable to receive thunk address
  50.                        NULL,         // no call back function
  51.                        NULL          // no shared memroy
  52.                      );
  53.   } else if ( fdwReason == DLL_PROCESS_DETACH ) {
  54.  
  55.       if ( --cProcessesAttached == 0 ) {
  56.           UTUnRegister( hInst );
  57.       }
  58.   }
  59.  
  60. }
  61.  
  62. /*
  63.  * constants for dispatcher in 16bit side
  64.  */
  65.  
  66. #define DB_SRV_GETVERSION   0
  67. #define DB_SRV_SETTIME      1
  68. #define DB_SRV_ADDUSER      2
  69.  
  70.  
  71. int
  72. DbGetVersion(void)
  73. {
  74.  
  75.     /*
  76.      * call the 16bit dispatch thru the 32bit thunk. no parameters
  77.      * are passed.
  78.      * returned value is the service result.
  79.      */
  80.  
  81.     return( (int) (* pfnUTProc)(NULL, DB_SRV_GETVERSION, NULL) );
  82.  
  83. }
  84.  
  85. void
  86. DbSetTime(LPDB_TIME pTime)
  87. {
  88.  
  89.     /*
  90.      * call the 16bit dispatch thru the 32bit thunk.
  91.      * pass one pointer to a buffer which will be translated
  92.      * to 16:16 address before passed to 16bit side.
  93.      *
  94.      */
  95.  
  96.     (* pfnUTProc)(pTime, DB_SRV_SETTIME, NULL);
  97.  
  98. }
  99.  
  100. short
  101. DbAddUser(LPDB_NAME pName, DWORD Permission, LPDWORD pId)
  102. {
  103.  
  104.     DWORD    Args[3];           // function has three arguments
  105.     PVOID    TransList[4];      // Three pointers need translation:
  106.                                 //     pName
  107.                                 //     pName->str
  108.                                 //     pId
  109.                                 // plus null to indicate end of list
  110.     char    *pSaveStr;
  111.     int     Ret;
  112.  
  113.     /*
  114.      * put arguments in buffer
  115.      */
  116.  
  117.     Args[0] = (DWORD) pName;
  118.     Args[1] = Permission;
  119.     Args[2] = (DWORD) pId;
  120.  
  121.     /*
  122.      * build translation list for all the flat pointers that need to
  123.      * be translated to segmented form.
  124.      */
  125.     TransList[0] = & Args[0];
  126.     TransList[1] = & pName->str;
  127.     TransList[2] = & Args[2];
  128.     TransList[3] = 0;
  129.  
  130.     /*
  131.      * save the original pointer in the NAME struct so it can be restored
  132.      * after the call to the thunk.
  133.      * This is required only if the caller of the service expects the
  134.      * structure to be left unmodified.
  135.      */
  136.  
  137.     pSaveStr = pName->str;
  138.  
  139.     /*
  140.      * call the 16bit dispatch thru the 32bit thunk.
  141.      * pass arguments in buffer along with list of addresses
  142.      * that need to be translated equivalent segmented format.
  143.      *
  144.      */
  145.  
  146.     Ret = (int) (* pfnUTProc)(Args, DB_SRV_ADDUSER, TransList);
  147.  
  148.     /*
  149.      * restore flat pointer
  150.      */
  151.     pName->str = pSaveStr;
  152.  
  153.     return(Ret);
  154. }
  155.  
  156.  
  157.