Subversion Repositories Kolibri OS

Rev

Rev 890 | Rev 897 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #include <types.h>
  3. #include <core.h>
  4. #include <spinlock.h>
  5. #include <link.h>
  6. #include <mm.h>
  7. #include <slab.h>
  8. #include <pe.h>
  9.  
  10. int __stdcall strncmp(const char *s1, const char *s2, size_t n);
  11.  
  12. static dll_t core_dll;
  13.  
  14. static char* strupr(char *str )
  15. {
  16.     char *p;
  17.     unsigned char c;
  18.  
  19.     p = str;
  20.     while( (c = *p) )
  21.     {
  22.         if( c >= 'a' && c <= 'z' )
  23.             *p = c - 'a' + 'A';
  24.         ++p;
  25.     }
  26.  
  27.     return( str );
  28. }
  29.  
  30. void init_core_dll()
  31. {
  32.     PIMAGE_DOS_HEADER        dos;
  33.     PIMAGE_NT_HEADERS32      nt;
  34.     PIMAGE_EXPORT_DIRECTORY  exp;
  35.  
  36.     dos =  (PIMAGE_DOS_HEADER)LOAD_BASE;
  37.     nt  =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
  38.     exp =  MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
  39.                    nt->OptionalHeader.DataDirectory[0].VirtualAddress);
  40.  
  41.     list_initialize(&core_dll.link);
  42.  
  43.     core_dll.img_base = LOAD_BASE;
  44.     core_dll.img_size = nt->OptionalHeader.SizeOfImage;
  45.     core_dll.img_md   = NULL;
  46.  
  47.     core_dll.img_hdr  = nt;
  48.     core_dll.img_sec  = MakePtr(PIMAGE_SECTION_HEADER,nt, sizeof(IMAGE_NT_HEADERS32));
  49.     core_dll.img_exp  = MakePtr(PIMAGE_EXPORT_DIRECTORY,LOAD_BASE,
  50.                         nt->OptionalHeader.DataDirectory[0].VirtualAddress);
  51.     core_dll.img_name = strupr(MakePtr(char*, LOAD_BASE, exp->Name));
  52.  
  53.     DBG("%s base %x size %x sections %d exports %x\n",
  54.         core_dll.img_name, core_dll.img_base,
  55.         core_dll.img_size, nt->FileHeader.NumberOfSections,
  56.         core_dll.img_exp );
  57. };
  58.  
  59.  
  60. dll_t * find_dll(const char *name)
  61. {
  62.     dll_t* dll = &core_dll;
  63.  
  64.     do
  65.     {
  66.         if( !strncmp(name,dll->img_name,16))
  67.             return dll;
  68.  
  69.         dll = (dll_t*)dll->link.next;
  70.  
  71.     }while(&dll->link !=  &core_dll.link);
  72.  
  73.     return NULL;
  74. };
  75.  
  76.  
  77. typedef struct
  78. {
  79.   char         srv_name[16];  //        ASCIIZ string
  80.   u32_t        magic;         // +0x10  'SRV '
  81.   size_t       size;          // +0x14  size of structure SRV
  82.   void        *fd;            // +0x18  next SRV descriptor
  83.   void        *bk;            // +0x1C  prev SRV descriptor
  84.   addr_t       base;          // +0x20  service base address
  85.   addr_t       entry;         // +0x24  service START function
  86.   void        *srv_proc;      // +0x28  main service handler
  87. }srv_t;
  88.  
  89. typedef srv_t* __stdcall  drv_entry_t(int);
  90.  
  91. srv_t* __fastcall load_pe_driver(const char *path)
  92. {
  93.     PIMAGE_DOS_HEADER     dos;
  94.     PIMAGE_NT_HEADERS32   nt;
  95.  
  96.     drv_entry_t   *drv_entry;
  97.     md_t          *md;
  98.     srv_t         *srv;
  99.  
  100.     md = load_image(path);
  101.  
  102.     if( ! md )
  103.         return 0;
  104.  
  105.     if( link_image( md->base ) )
  106.     {
  107.         dos = (PIMAGE_DOS_HEADER)md->base;
  108.         nt =  MakePtr( PIMAGE_NT_HEADERS32, dos, dos->e_lfanew);
  109.  
  110.         drv_entry = MakePtr(drv_entry_t*, md->base,
  111.                             nt->OptionalHeader.AddressOfEntryPoint);
  112.  
  113.         srv = drv_entry(1);
  114.  
  115.         if(srv != NULL)
  116.             srv->entry = nt->OptionalHeader.AddressOfEntryPoint + md->base;
  117.  
  118.         return srv;
  119.     }
  120.     else
  121.     {
  122.         md_free( md );
  123.         return NULL;
  124.     }
  125. }
  126.  
  127.