Implemented "pass"able 'data' type symbols
[captive.git] / src / libcaptive / ldr / loader.c
index 34d00b5..863c0f1 100644 (file)
@@ -543,7 +543,7 @@ CHAR *funcname=MODULEOBJECT_BASE_OFFSET_PLUS(NameList[Idx]);
        va_start(ap,FullName_utf8);
        while (captive_va_arg(sym_name,ap)) {
                captive_va_arg(sym_val ,ap);
-               g_assert(sym_val!=NULL);
+               /* 'sym_val' may be NULL if 'data' type && "pass"ed */
                captive_va_arg(patchpoint,ap);  /* 'data' type if ==NULL */
                ExportAddressp=g_hash_table_lookup(exportdir_hash,sym_name);
                if (ExportAddressp==NULL) {
@@ -552,12 +552,16 @@ CHAR *funcname=MODULEOBJECT_BASE_OFFSET_PLUS(NameList[Idx]);
                        }
                errbool=g_hash_table_remove(exportdir_hash,sym_name);
                g_assert(errbool==TRUE);
+               if (!sym_val) { /* 'data' type && "pass"ed => do not corrupt it by 0xF4 */
+                       g_assert(!patchpoint);
+                       continue;
+                       }
                ExportAddress=(PVOID)MODULEOBJECT_BASE_OFFSET_PLUS(*ExportAddressp);
                *ExportAddressp=(PVOID)MODULEOBJECT_BASE_OFFSET_MINUS(sym_val);
                if (((ULONG)ExportAddress >= (ULONG)ExportDir) &&
                                ((ULONG)ExportAddress <  (ULONG)ExportDir + ExportDirSize))
                        g_assert_not_reached(); /* LdrPEFixupForward() needed */
-               if (!patchpoint) /* 'data' type */
+               if (!patchpoint) /* 'data' type && !"pass"ed => do not corrupt it by 0xF4 */
                        continue;
                patchpoint->orig_w32_func=ExportAddress;
                if (0xF4 /* hlt */ ==*patchpoint->orig_w32_func)        /* Already patched by name-aliased function? */