summaryrefslogtreecommitdiff
path: root/src/pal/tests/palsuite/loader/LoadLibraryA/test8/loadlibrarya.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pal/tests/palsuite/loader/LoadLibraryA/test8/loadlibrarya.c')
-rw-r--r--src/pal/tests/palsuite/loader/LoadLibraryA/test8/loadlibrarya.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/pal/tests/palsuite/loader/LoadLibraryA/test8/loadlibrarya.c b/src/pal/tests/palsuite/loader/LoadLibraryA/test8/loadlibrarya.c
new file mode 100644
index 0000000000..6556e9c896
--- /dev/null
+++ b/src/pal/tests/palsuite/loader/LoadLibraryA/test8/loadlibrarya.c
@@ -0,0 +1,235 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+/*=============================================================
+**
+** Source: loadlibrary.c (test 8)
+**
+** Purpose: Positive test the LoadLibrary API. Test will verify
+** that it is unable to load the library twice. Once by
+** using the full path name and secondly by using the
+** short name.
+**
+
+**
+**============================================================*/
+#include <palsuite.h>
+
+/*Define platform specific information*/
+#if defined(SHLEXT)
+#define LibraryName "dlltest"SHLEXT
+#define GETATTACHCOUNTNAME "GetAttachCount"
+#else
+typedef int (*dllfunct)();
+#define LibraryName "dlltest.dll"
+#define GETATTACHCOUNTNAME "_GetAttachCount@0"
+#endif
+
+
+/* Helper function to test the loaded library.
+ */
+BOOL PALAPI TestDll(HMODULE hLib)
+{
+ int RetVal;
+ char FunctName[] = GETATTACHCOUNTNAME;
+ FARPROC DllFunc;
+
+ /* Access a function from the loaded library.
+ */
+ DllFunc = GetProcAddress(hLib, FunctName);
+ if(DllFunc == NULL)
+ {
+ Trace("ERROR: Unable to load function \"%s\" from library \"%s\"\n",
+ FunctName,
+ LibraryName);
+ return (FALSE);
+ }
+
+ /* Verify that the DLL_PROCESS_ATTACH is only
+ * accessed once.*/
+ RetVal = DllFunc();
+ if (RetVal != 1)
+ {
+ Trace("ERROR: Unable to receive correct information from DLL! "
+ ":expected \"1\", returned \"%d\"\n",
+ RetVal);
+ return (FALSE);
+ }
+
+ return (TRUE);
+}
+
+int __cdecl main(int argc, char *argv[])
+{
+ HANDLE hFullLib;
+ HANDLE hShortLib;
+ HANDLE hRelLib;
+
+ int iRetVal = FAIL;
+ char fullPath[_MAX_DIR];
+ char drive[_MAX_DRIVE];
+ char dir[_MAX_DIR];
+ char relTestDir[_MAX_DIR];
+ char fname[_MAX_FNAME];
+ char ext[_MAX_EXT];
+
+ BOOL bRc = FALSE;
+ char relLibPath[_MAX_DIR];
+
+
+ /* Initialize the PAL. */
+ if ((PAL_Initialize(argc, argv)) != 0)
+ {
+ return (FAIL);
+ }
+
+ /* Initalize the buffer.
+ */
+ memset(fullPath, 0, _MAX_DIR);
+
+ /* Get the full path to the library (DLL).
+ */
+
+ if (NULL != _fullpath(fullPath,argv[0],_MAX_DIR)) {
+
+ _splitpath(fullPath,drive,dir,fname,ext);
+ _makepath(fullPath,drive,dir,LibraryName,"");
+
+
+ } else {
+ Fail("ERROR: conversion from relative path \" %s \" to absolute path failed. _fullpath returned NULL\n",argv[0]);
+ }
+
+ /* Get relative path to the library
+ */
+ _splitpath(argv[0], drive, relTestDir, fname, ext);
+ _makepath(relLibPath,drive,relTestDir,LibraryName,"");
+
+
+ /* Call Load library with the short name of
+ * the dll.
+ */
+ hShortLib = LoadLibrary(LibraryName);
+ if(hShortLib == NULL)
+ {
+ Fail("ERROR:%u:Short:Unable to load library %s\n",
+ GetLastError(),
+ LibraryName);
+ }
+
+ /* Test the loaded library.
+ */
+ if (!TestDll(hShortLib))
+ {
+ iRetVal = FAIL;
+ goto cleanUpOne;
+ }
+
+ /* Call Load library with the full name of
+ * the dll.
+ */
+ hFullLib = LoadLibrary(fullPath);
+ if(hFullLib == NULL)
+ {
+ Trace("ERROR:%u:Full:Unable to load library %s\n",
+ GetLastError(),
+ fullPath);
+ iRetVal = FAIL;
+ goto cleanUpTwo;
+ }
+
+ /* Test the loaded library.
+ */
+ if (!TestDll(hFullLib))
+ {
+ iRetVal = FAIL;
+ goto cleanUpTwo;
+ }
+
+ /*
+ ** Call the load library with the relative path
+ ** wrt to the directory ./testloadlibrary/..
+ ** since we don't want to make any assumptions
+ ** regarding the type of build
+ */
+ hRelLib = LoadLibrary(relLibPath);
+ if(hRelLib == NULL)
+ {
+ Trace("ERROR:%u:Rel:Unable to load library at %s\n",
+ GetLastError(), relLibPath);
+ iRetVal = FAIL;
+ goto cleanUpTwo;
+ }
+
+ /* Test the loaded library.
+ */
+ if (!TestDll(hRelLib))
+ {
+ iRetVal = FAIL;
+ goto cleanUpThree;
+ }
+
+ if( hRelLib != hFullLib )
+ {
+ Trace("Relative and Absolute Paths to libraries don't have same handle\n");
+ iRetVal = FAIL;
+ goto cleanUpThree;
+ }
+
+ if( hRelLib != hShortLib )
+ {
+ Trace("Relative and Short Paths to libraries don't have same handle\n");
+ iRetVal = FAIL;
+ goto cleanUpThree;
+ }
+
+
+ /* Test Succeeded.
+ */
+ iRetVal = PASS;
+
+cleanUpThree:
+
+ /* Call the FreeLibrary API.
+ */
+
+ if (!FreeLibrary(hRelLib))
+ {
+ Trace("ERROR:%u: Unable to free library \"%s\"\n",
+ GetLastError(),
+ relLibPath);
+ iRetVal = FAIL;
+ }
+
+cleanUpTwo:
+
+ /* Call the FreeLibrary API.
+ */
+ if (!FreeLibrary(hFullLib))
+ {
+ Trace("ERROR:%u: Unable to free library \"%s\"\n",
+ GetLastError(),
+ fullPath);
+ iRetVal = FAIL;
+ }
+
+cleanUpOne:
+
+ /* Call the FreeLibrary API.
+ */
+ if (!FreeLibrary(hShortLib))
+ {
+ Trace("ERROR:%u: Unable to free library \"%s\"\n",
+ GetLastError(),
+ LibraryName);
+ iRetVal = FAIL;
+ }
+
+
+ /* Terminate the PAL.
+ */
+ PAL_TerminateEx(iRetVal);
+ return iRetVal;
+
+}