#include "reactos/internal/debug.h" /* for assert() */
#include <glib/gutils.h> /* for g_path_get_basename() */
#include <gmodule.h>
+#include "captive/options-module.h"
/* map: ExportAddress -> (struct captive_ModuleList_patchpoint *) */
/**
- * LdrLoadModule:
+ * captive_LdrLoadModule:
* @Filename: Filename of module to load based on host OS disk.
* Loading of already loaded module is forbidden.
* @ModuleObject: Returns initialized module object.
*
* Returns: STATUS_SUCCESS if the module was loaded successfuly during the call.
*/
-NTSTATUS LdrLoadModule(PUNICODE_STRING Filename,PMODULE_OBJECT *ModuleObjectp)
+NTSTATUS captive_LdrLoadModule(struct captive_options_module *options_module,PMODULE_OBJECT *ModuleObjectp)
{
-PVOID ModuleLoadBase;
PMODULE_OBJECT Module;
NTSTATUS err;
-gchar *Filename_utf8=(/* de-const */ gchar *)captive_UnicodeString_to_utf8_alloca(Filename);
+gchar *Filename_utf8=options_module->pathname_utf8;
gchar *Filename_bslash_utf8,*s;
UNICODE_STRING *Filename_bslash;
*ModuleObjectp=NULL;
- /* Open the Module */
- ModuleLoadBase=captive_rtl_file_mmap(
- NULL, /* lenp */
- Filename_utf8, /* path */
- O_RDONLY, /* open_flags */
- PROT_READ, /* mmap_prot */
- MAP_SHARED); /* mmap_flags */
- /* FIXME: convert errno instead of STATUS_INSUFFICIENT_RESOURCES */
- g_return_val_if_fail(ModuleLoadBase!=NULL,STATUS_INSUFFICIENT_RESOURCES);
-
/* Filename=~s#/#\\#g -> Filename_bslash to satisfy basename-derivations by reactos. */
- Filename_bslash_utf8=g_strdup(Filename_utf8);
+ Filename_bslash_utf8=(/* de-const as we do not change the length */ gchar *)captive_strdup_alloca(Filename_utf8);
for (s=Filename_bslash_utf8;(s=strchr(s,'/'));s++)
*s='\\';
Filename_bslash=captive_utf8_to_UnicodeString_alloca(Filename_bslash_utf8);
- if ((('M'<<8U)|('Z'<<0U))==GUINT16_FROM_BE(*(const guint16 *)ModuleLoadBase)) {
- g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: Loading module format: %s",G_STRLOC,"MZ/PE-32");
- /* examine/relocate the module */
- err=LdrProcessModule(ModuleLoadBase,Filename_bslash,&Module);
- if (!NT_SUCCESS(err)) {
- g_error("LdrLoadModule(): LdrProcessModule()=0x%08lX",(gulong)err);
- goto err_captive_rtl_file_munmap;
- }
- }
- else {
- g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: Loading module format: %s",G_STRLOC,"native .so");
- Module=captive_LdrLoadModule_gmodule(Filename_utf8,Filename_bslash_utf8);
- g_assert(Module!=NULL);
+ switch (options_module->type) {
+ case CAPTIVE_OPTIONS_MODULE_TYPE_EMPTY: g_assert_not_reached();
+
+ case CAPTIVE_OPTIONS_MODULE_TYPE_PE32:
+ g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: Loading module format: %s",G_STRLOC,"MZ/PE-32");
+ /* examine/relocate the module */
+ err=LdrProcessModule(options_module->u.pe32.base,Filename_bslash,&Module);
+ if (!NT_SUCCESS(err)) {
+ g_error("LdrLoadModule(): LdrProcessModule()=0x%08lX",(gulong)err);
+ goto err;
+ }
+ break;
+
+ case CAPTIVE_OPTIONS_MODULE_TYPE_GMODULE:
+ g_log(G_LOG_DOMAIN,G_LOG_LEVEL_DEBUG,"%s: Loading module format: %s",G_STRLOC,"native .so");
+ Module=captive_LdrLoadModule_gmodule(Filename_utf8,Filename_bslash_utf8);
+ g_assert(Module!=NULL);
}
/* we were successful */
- captive_rtl_file_munmap(ModuleLoadBase);
*ModuleObjectp=Module;
/* Hook for KDB on loading a driver. */
return STATUS_SUCCESS;
- /* Error recoveries */
-err_captive_rtl_file_munmap:
- captive_rtl_file_munmap(ModuleLoadBase);
-
+err:
g_return_val_if_reached(err);
}
+NTSTATUS LdrLoadModule(PUNICODE_STRING Filename,PMODULE_OBJECT *ModuleObject)
+{
+ return STATUS_OBJECT_NAME_NOT_FOUND;
+}
+
+
/**
* captive_LdrpLoadAndCallImage:
* @ModuleObjectp: Returns PMODULE_OBJECT successfuly loaded.
* Returns: STATUS_SUCCESS if the driver module was loaded and initialized
* successfuly during this call. Ignore returned @ModuleObjectp if function failed.
*/
-NTSTATUS captive_LdrpLoadAndCallImage(PMODULE_OBJECT *ModuleObjectp,PUNICODE_STRING ModuleName,
+NTSTATUS captive_LdrpLoadAndCallImage(PMODULE_OBJECT *ModuleObjectp,struct captive_options_module *options_module,
PDRIVER_OBJECT DriverEntry_DriverObject,PUNICODE_STRING DriverEntry_RegistryPath)
{
PDRIVER_INITIALIZE DriverEntry;
PMODULE_OBJECT ModuleObject_tmp;
NTSTATUS err;
+#if 0 /* TODO */
/* check for duplicity */
g_return_val_if_fail(LdrGetModuleObject(ModuleName)==NULL,STATUS_IMAGE_ALREADY_LOADED);
+#endif
/* provide our temporary storage if the caller doesn't want to know ModuleObject address */
if (!ModuleObjectp)
ModuleObjectp=&ModuleObject_tmp;
/* load the module */
- err=LdrLoadModule(ModuleName,ModuleObjectp);
+ err=captive_LdrLoadModule(options_module,ModuleObjectp);
g_return_val_if_fail(NT_SUCCESS(err),err);
/* initialize the module */