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) {
}
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? */