int count;
bool has_dtors;
dll_type type;
+ long ndeps;
+ dll** deps;
+ PWCHAR modname;
+ DWORD image_size;
+ void* preferred_base;
WCHAR name[1];
void detach ();
int init ();
dll *end;
dll *hold;
dll_type hold_type;
+ static muto protect;
public:
dll start;
- int tot;
int loaded_dlls;
int reload_on_fork;
dll *operator [] (const PWCHAR name);
void detach (void *);
void init ();
void load_after_fork (HANDLE);
+ void reserve_space ();
+ void load_after_fork_impl (HANDLE, dll* which, int retries);
+ dll *find_by_modname (const PWCHAR name);
+ void populate_deps (dll* d);
+ void topsort ();
+ void topsort_visit (dll* d, bool goto_tail);
+ void append (dll* d);
+
dll *inext ()
{
while ((hold = hold->next))
break;
return hold;
}
+
dll *istart (dll_type t)
{
hold_type = t;
hold = &start;
return inext ();
}
+ void guard(bool lockit)
+ {
+ if (lockit)
+ protect.acquire ();
+ else
+ protect.release ();
+ }
friend void dll_global_dtors ();
+ dll_list () { protect.init ("dll_list"); }
+};
+
+/* References:
+ http://msdn.microsoft.com/en-us/windows/hardware/gg463125
+ http://msdn.microsoft.com/en-us/library/ms809762.aspx
+*/
+struct pefile
+{
+ IMAGE_DOS_HEADER dos_hdr;
+
+ char* rva (long offset) { return (char*) this + offset; }
+ PIMAGE_NT_HEADERS32 pe_hdr () { return (PIMAGE_NT_HEADERS32) rva (dos_hdr.e_lfanew); }
+ PIMAGE_OPTIONAL_HEADER32 optional_hdr () { return &pe_hdr ()->OptionalHeader; }
+ PIMAGE_DATA_DIRECTORY idata_dir (DWORD which)
+ {
+ PIMAGE_OPTIONAL_HEADER32 oh = optional_hdr ();
+ return (which < oh->NumberOfRvaAndSizes)? oh->DataDirectory + which : 0;
+ }
};
extern dll_list dlls;