API.C
上传用户:guoxiu1214
上传日期:2019-02-27
资源大小:876k
文件大小:6k
源码类别:

多显示器编程

开发平台:

Visual C++

  1. /*******************************************************************************
  2. Copyright Datapath Ltd. 1997, 2006.
  3. File:    api.c
  4. Purpose: Implementation of functions to help with loading DLLs and obtaining
  5.          pointers to functions within those DLLs.
  6. History:
  7.          20 MAY 97    JH   Created.
  8.          05 FEB 98    JH   Prevented MessageBox being called.
  9.          05 DEC 01    JH   Added APILoadLibrary, APIFreeLibrary and
  10.                            APILoadInterface.
  11.          23 JUN 04    JH   In Win32 user mode, if APILoadLibrary fails to load
  12.                            the DLL, it returns the value from GetLastError.
  13.          30 MAY 06    JH   Ported to Unicode.
  14. *******************************************************************************/
  15. #include <windows.h>
  16. #ifdef KERNEL_MODE
  17. #if (defined WIN32) && (WINVER >= 0x400)
  18. #include "twntkrnl.h"
  19. #endif
  20. #endif
  21. #include "api.h"
  22. /******************************************************************************/
  23. int
  24. APILoadFunctions (
  25.    HINSTANCE   hInstance,
  26.    LPAPIFNLIST lpFnList,
  27.    void        *pReserved )
  28. /*
  29.  * Summary: Loads a set of API functions from a DLL.
  30.  *
  31.  * Purpose:
  32.  *
  33.  * Return:  If successful, TRUE is returned; otherwise, FALSE is returned.
  34.  */
  35. {
  36.    int   i = 0;
  37.    while ( lpFnList[i].PFnPtr )
  38.    {
  39.       *lpFnList[i].PFnPtr = GetProcAddress ( hInstance, lpFnList[i].FnName );
  40.       if ( *lpFnList[i].PFnPtr == NULL )
  41.       {
  42.          return FALSE;
  43.       }
  44.       i++;
  45.    }
  46.    return TRUE;
  47. }
  48. /******************************************************************************/
  49. unsigned long
  50. APILoadLibrary (
  51.    LPCAPICHAR  pDriverName,
  52.    HINSTANCE   FAR *pHInstance )
  53. /*
  54.  * Summary: Loads a DLL.
  55.  *
  56.  * Purpose:
  57.  *
  58.  * Return:  If successful, zero is returned and the instance handle of the DLL
  59.  *          is stored in *pHInstance; otherwise, one of the API_ERROR values
  60.  *          defined in API.H is returned.
  61.  */
  62. {
  63.    HINSTANCE   hInstance;
  64. #if ( defined WIN32 ) && ( defined KERNEL_MODE )
  65.    hInstance = EngLoadImage ( (LPWSTR)pDriverName );
  66. #else
  67.    hInstance = LoadLibrary ( pDriverName );
  68. #endif
  69. #if ( defined WIN32 )
  70.    if ( hInstance )
  71. #else
  72.    if ( hInstance > HINSTANCE_ERROR )
  73. #endif
  74.    {
  75.       *pHInstance = hInstance;
  76.       return 0;
  77.    }
  78. #if ( defined WIN32 ) && ( !defined KERNEL_MODE )
  79.    return GetLastError ( );
  80. #else
  81.    return API_ERROR_UNABLE_TO_LOAD_DLL;
  82. #endif
  83. }
  84. /******************************************************************************/
  85. unsigned long
  86. APIFreeLibrary (
  87.    HINSTANCE   hInstance )
  88. /*
  89.  * Summary: Frees a DLL.
  90.  *
  91.  * Purpose: Frees a DLL loaded with APILoadDLL or APILoadInterface.
  92.  *
  93.  * Return:  N/A.
  94.  */
  95. {
  96. #ifndef KERNEL_MODE
  97.    FreeLibrary ( hInstance );
  98. #else
  99.    EngUnloadImage ( hInstance );
  100. #endif
  101.    return 0;
  102. }
  103. /******************************************************************************/
  104. unsigned long
  105. APILoadInterface (
  106.    LPCAPICHAR  lpSectionName,
  107.    LPCAPICHAR  lpValueName,
  108.    LPAPIFNLIST lpFnList,
  109.    HINSTANCE   *pHInstance )
  110. /*
  111.  * Summary: Loads an interface DLL.
  112.  *
  113.  * Purpose: Reads the Registry entry specifying the path of a DLL with a
  114.  *          standard interface. The DLL is loaded and the functions of the
  115.  *          interface are located.
  116.  *
  117.  *          lpSectionName
  118.  *             The name of the Registry key in which to find the value
  119.  *             specified below. For example "SOFTWARE\Datapath\I2C".
  120.  *
  121.  *          lpValueName
  122.  *             The name of the REG_SZ entry that contains the interface
  123.  *             DLL name. For example "I2CDLL".
  124.  *
  125.  *          lpFnList
  126.  *             A pointer to an APIFNLIST, a list of function names and
  127.  *             pointers to locations where the addresses of the functions
  128.  *             loaded from the DLL may be stored.
  129.  *
  130.  *          pHInstance
  131.  *             A pointer to the location where the HINSTANCE of the loaded
  132.  *             interface DLL is to be stored.
  133.  *
  134.  * Return:  If successful, zero is returned and the instance handle of the DLL
  135.  *          is stored in *pHInstance; otherwise, one of the API_ERROR values
  136.  *          defined in API.H is returned.
  137.  */
  138. {
  139. #ifndef KERNEL_MODE
  140.    unsigned long  error = 0;
  141.    HKEY           hKey;
  142.    /* Open the Registry key. */
  143.    if ( RegOpenKeyEx ( HKEY_LOCAL_MACHINE,
  144.          lpSectionName, 0, KEY_READ, &hKey ) == ERROR_SUCCESS )
  145.    {
  146.       DWORD dwSize, dwType;
  147.       TCHAR driverName[MAX_PATH];
  148.       LONG  lError;
  149.       /* Read the name of the interface DLL. */
  150.       dwSize = sizeof ( driverName );
  151.       lError = RegQueryValueEx ( hKey, lpValueName, 0,
  152.             &dwType, (LPBYTE)driverName, &dwSize );
  153.       RegCloseKey ( hKey );
  154.       if (  ( lError == ERROR_SUCCESS ) &&
  155.             ( dwType == REG_SZ ) &&
  156.             ( dwSize > sizeof ( TCHAR )))
  157.       {
  158.          HINSTANCE   hInstance;
  159.          /* Load the interface DLL. */
  160.          error = APILoadLibrary ( driverName, &hInstance );
  161.          if ( error == 0 )
  162.          {
  163.             /* Find each of the functions exported by the interface. */
  164.             if ( APILoadFunctions ( hInstance, lpFnList, NULL ))
  165.             {
  166.                *pHInstance = hInstance;
  167.             }
  168.             else
  169.             {
  170.                APIFreeLibrary ( hInstance );
  171.                error = API_ERROR_INCOMPATIBLE_API;
  172.             }
  173.          }
  174.       }
  175.       else 
  176.       {
  177.          error = API_ERROR_UNABLE_TO_READ_VALUE;
  178.       }
  179.    }
  180.    else
  181.    {
  182.       error = API_ERROR_UNABLE_TO_OPEN_KEY;
  183.    }
  184.    return error;
  185. #else
  186.    /* TODO: Implement kernel mode version. */
  187.    return -1;
  188. #endif
  189. }
  190. /******************************************************************************/