Annotation of mstools/win32s/ut/samples/utsample/utsamp32.c, revision 1.1.1.1

1.1       root        1: /*++
                      2: 
                      3: Copyright (c) 1985-92, Microsoft Corporation
                      4: 
                      5: Module Name:
                      6: 
                      7:     UTSamp32.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     Win32s sample code of Universal Thunk (UT) -
                     12:     This is the main source file of UTSamp32.DLL
                     13: 
                     14: --*/
                     15: 
                     16: 
                     17: #define W32SUT_32
                     18: 
                     19: #include <windows.h>
                     20: #include <w32sut.h>
                     21: #include "utsamp.h"
                     22: 
                     23: typedef BOOL (WINAPI * PUTREGISTER) ( HANDLE     hModule,
                     24:                                       LPCSTR     lpsz16BitDLL,
                     25:                                       LPCSTR     lpszInitName,
                     26:                                       LPCSTR     lpszProcName,
                     27:                                       UT32PROC * ppfn32Thunk,
                     28:                                       FARPROC    pfnUT32Callback,
                     29:                                       LPVOID     lpBuff
                     30:                                     );
                     31: 
                     32: 
                     33: typedef VOID (WINAPI * PUTUNREGISTER) (HANDLE hModule);
                     34: 
                     35: UT32PROC      pfnUTProc = NULL;
                     36: PUTREGISTER   pUTRegister = NULL;
                     37: PUTUNREGISTER pUTUnRegister = NULL;
                     38: int           cProcessesAttached = 0;
                     39: BOOL          fWin32s = FALSE;
                     40: HANDLE        hKernel32 = 0;
                     41: 
                     42: 
                     43: BOOL
                     44: APIENTRY
                     45: DllInit(HANDLE hInst, DWORD fdwReason, LPVOID lpReserved)
                     46:  {
                     47:   if ( fdwReason == DLL_PROCESS_ATTACH )
                     48:    {
                     49: 
                     50:     /*
                     51:      * Registration of UT need to be done only once for first
                     52:      * attaching process.  At that time set the fWin32s flag
                     53:      * to indicate if the DLL is executing under Win32s or not.
                     54:      * If we are running under WIn32s, we need to get the
                     55:      * address of the entrypoints for UTRegister & UTUnRegister
                     56:      *
                     57:      */
                     58: 
                     59:     if ( cProcessesAttached++ )
                     60:      {
                     61:       return(TRUE);         // Not the first initialization.
                     62:      }
                     63: 
                     64:     fWin32s = (BOOL) (GetVersion() & 0x80000000);
                     65: 
                     66:     if ( !fWin32s )
                     67:       return(TRUE);         // Not on Win32s - no further initialization needed
                     68: 
                     69:     hKernel32 = LoadLibrary( "Kernel32.Dll" ); // Get Handle to Kernel32.Dll
                     70: 
                     71:     pUTRegister = (PUTREGISTER) GetProcAddress( hKernel32, "UTRegister" );
                     72: 
                     73:     if ( !pUTRegister )
                     74:       return(FALSE);        // Error - On Win32s, can't find UTRegister
                     75: 
                     76:     pUTUnRegister = (PUTUNREGISTER) GetProcAddress( hKernel32, "UTUnRegister" );
                     77: 
                     78:     if ( !pUTUnRegister )
                     79:       return(FALSE);        // Error - On Win32s, can't find UTUnRegister
                     80: 
                     81:     return (*pUTRegister)( hInst,           // UTSamp32.DLL module handle
                     82:                            "UTSAMP16.DLL",  // name of 16bit thunk dll
                     83:                            NULL,            // no init routine
                     84:                            "UTProc",        // name of 16bit dispatch routine
                     85:                                             // exported from UTSamp16.DLL
                     86:                            &pfnUTProc,      // Global variable to receive thunk address
                     87:                            NULL,            // no callback function
                     88:                            NULL );          // no shared memroy
                     89: 
                     90:    }
                     91:   else
                     92:     if (   (fdwReason == DLL_PROCESS_DETACH)
                     93:         && (0 == --cProcessesAttached)
                     94:         && fWin32s )
                     95:      {
                     96:       (*pUTUnRegister) ( hInst );
                     97:       FreeLibrary( hKernel32 );
                     98:      }
                     99: 
                    100:  }
                    101: 
                    102: 
                    103: DWORD
                    104: APIENTRY
                    105: MyGetFreeSpace(void)
                    106:  {
                    107:   MEMORYSTATUS MemoryStatus;
                    108: 
                    109:   /*
                    110:    * Call GlobalMemoryStatus to get the amount of free physical memory.  Since
                    111:    * GlobalMemoryStatus does not have a return value, the way to check for
                    112:    * failure is to SetLastError to NO_ERROR, call GlobalMemoryStatus, and then
                    113:    * GetLastError to see if ERROR_CALL_NOT_IMPLEMENTED was returned.  If so,
                    114:    * and if Win32s is loaded, call the UT entrypoint passing MYGETFREESPACE
                    115:    * as the parameter.
                    116:    *
                    117:    */
                    118: 
                    119:   memset( &MemoryStatus, sizeof(MEMORYSTATUS), 0);
                    120:   SetLastError( NO_ERROR );
                    121:   GlobalMemoryStatus( &MemoryStatus );
                    122:   if (ERROR_CALL_NOT_IMPLEMENTED == GetLastError() && fWin32s)
                    123:     return( (* pfnUTProc)( NULL, MYGETFREESPACE, NULL ) );
                    124:   else
                    125:     return( MemoryStatus.dwAvailPhys );
                    126:  }
                    127: 
                    128: DWORD
                    129: APIENTRY
                    130: MyWNetGetUser(LPTSTR lpszLocalName, LPTSTR lpszUserName, LPDWORD lpcchBuffer)
                    131:  {
                    132: 
                    133:   DWORD Args[2];
                    134:   PVOID TransList[3];
                    135:   DWORD retval;
                    136: 
                    137:   /*
                    138:    * Since the Win16 WNetGetUser does not support the lpszLocalName,
                    139:    * this parameter is ignored by this function when called under Win32s.
                    140:    * It is accepted for compatibility with the Win32 API.
                    141:    *
                    142:    * The error return method for the this API changed between Win16 and Win32.
                    143:    * Win16 uses several different return codes to indicate different errors,
                    144:    * while Win32 uses only a few return codes to indicate error, one of which
                    145:    * indicates that WNetGetLastError should be called for more detailed error
                    146:    * information.
                    147:    *
                    148:    * This function just maps all Win16 error codes into the Win32 error
                    149:    * ERROR_NO_NETWORK. A more complete solution would be to switch on the
                    150:    * various return codes possible from WNetGetUser (both Win16 & Win32) and
                    151:    * to set appropriate SetLastError values.
                    152:    *
                    153:    */
                    154: 
                    155: 
                    156:   if (ERROR_CALL_NOT_IMPLEMENTED ==
                    157:       (retval = WNetGetUser( lpszLocalName, lpszUserName, lpcchBuffer )))
                    158:    {
                    159: 
                    160:     /*
                    161:      * call the 16bit WNetGetUser via the UT entrypoint.
                    162:      * Since the parameters being passed include pointers that need to be
                    163:      * translated, we need to use the Translation List.
                    164:      *
                    165:      */
                    166: 
                    167:     Args[0] = (DWORD)lpszUserName; // Buffer to receive UserName
                    168:     Args[1] = (DWORD)lpcchBuffer;  // Pointer to a DWord containing the size
                    169:                                    // of this buffer on entry.  On return it will
                    170:                                    // have been replaced with the size of the
                    171:                                    // returned text.  Since the Win16 API only
                    172:                                    // changes the low 16 bits, we need to zero out
                    173:                                    // the high 16 bits before calling the API.
                    174: 
                    175:     if ((*lpcchBuffer) > 0xFFFF)   // The buffer could be 64K or larger, but
                    176:      {                             // since the API only looks at the lower
                    177:       *lpcchBuffer = 0xFFFF;       // 16 bits passed, we need to make sure the
                    178:      }                             // buffer is not too large.
                    179: 
                    180:     TransList[0] = & Args[0];      // Translate the two pointes passed in Args[]
                    181:     TransList[1] = & Args[1];      // from 0:32 to 16:16.
                    182:     TransList[2] =   NULL;         // End of list of pointers to translate
                    183: 
                    184:     retval = (* pfnUTProc)(Args, MYWNETGETUSER, TransList);
                    185: 
                    186:     if (retval)                    // WN_SUCCESS == NO_ERROR == 0.  All others
                    187:       retval = ERROR_NO_NETWORK;   // return codes are Win16 error codes that
                    188:                                    // we map to ERROR_NO_NETWORK.
                    189:    }
                    190: 
                    191:   return (retval);
                    192: 
                    193:  }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.