Contiki 2.6

dll-loader.c

00001 /*
00002  * Copyright (c) 2006, Swedish Institute of Computer Science.
00003  * All rights reserved. 
00004  *
00005  * Redistribution and use in source and binary forms, with or without 
00006  * modification, are permitted provided that the following conditions 
00007  * are met: 
00008  * 1. Redistributions of source code must retain the above copyright 
00009  *    notice, this list of conditions and the following disclaimer. 
00010  * 2. Redistributions in binary form must reproduce the above copyright 
00011  *    notice, this list of conditions and the following disclaimer in the 
00012  *    documentation and/or other materials provided with the distribution. 
00013  * 3. Neither the name of the Institute nor the names of its contributors 
00014  *    may be used to endorse or promote products derived from this software 
00015  *    without specific prior written permission. 
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 
00018  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
00020  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 
00021  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
00022  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 
00023  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
00024  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
00025  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 
00026  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
00027  * SUCH DAMAGE. 
00028  *
00029  * This file is part of the Contiki operating system.
00030  * 
00031  * Author: Oliver Schmidt <ol.sc@web.de>
00032  *
00033  * $Id: dll-loader.c,v 1.4 2008/02/07 15:54:50 oliverschmidt Exp $
00034  */
00035 
00036 #define WIN32_LEAN_AND_MEAN
00037 #define _WIN32_WINNT 0x0501
00038 #include <windows.h>
00039 
00040 #include "contiki.h"
00041 
00042 /*---------------------------------------------------------------------------*/
00043 int
00044 dll_loader_load(char *name, char *arg)
00045 {
00046   HMODULE handle;
00047   FARPROC p;
00048 
00049   /* Load and link the program. */
00050   handle = LoadLibrary(name);
00051 
00052   if(handle == NULL) {
00053     debug_printf("dll_loader_load: loading failed: %d\n", GetLastError());
00054     return LOADER_ERR_OPEN;
00055   } 
00056 
00057   /* Find the processes to be started from the loaded program. */
00058   p = GetProcAddress(handle, "autostart_processes");
00059   if(p == NULL) {
00060     debug_printf("dll_loader_load: could not find symbol 'autostart_processes'\n");
00061     return LOADER_ERR_READ;
00062   }
00063 
00064   /* Start the process. */
00065   debug_printf("Starting '%s'\n", (**(struct process ***)&p)->name);
00066   process_start(**(struct process ***)&p, arg);
00067 
00068   return LOADER_OK;
00069 }
00070 /*---------------------------------------------------------------------------*/
00071 void
00072 dll_loader_unload(void *addr)
00073 {
00074   /* Avoid Access Violation Exception due to unloading code still being executed. */
00075   QueueUserAPC((PAPCFUNC)dll_loader_unload_dsc, GetCurrentThread(), (ULONG_PTR)addr);
00076 }
00077 /*---------------------------------------------------------------------------*/
00078 struct dsc *
00079 dll_loader_load_dsc(char *name)
00080 {
00081   HMODULE handle;
00082   FARPROC d;
00083   char symbol[24];
00084 
00085   handle = LoadLibrary(name);
00086 
00087   if(handle == NULL) {
00088     debug_printf("dll_loader_load_dsc: loading failed: %d\n", GetLastError());
00089     return NULL;
00090   } 
00091 
00092   strcpy(symbol, name);
00093   *strchr(symbol, '.') = '_';
00094 
00095   d = GetProcAddress(handle, symbol);
00096   if(d == NULL) {
00097     debug_printf("dll_loader_load_dsc: could not find symbol '%s'\n", symbol);
00098     return NULL;
00099   }
00100 
00101   return *(struct dsc **)&d;
00102 }
00103 /*---------------------------------------------------------------------------*/
00104 void __stdcall
00105 dll_loader_unload_dsc(void *addr)
00106 {
00107   HMODULE handle;
00108 
00109   GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | 
00110                     GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, addr, &handle);
00111   FreeLibrary(handle);
00112 }
00113 /*---------------------------------------------------------------------------*/