diff options
author | komh <komh@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-02-12 01:38:14 +0000 |
---|---|---|
committer | komh <komh@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2010-02-12 01:38:14 +0000 |
commit | 47f78d28f1298c9feccd2424ffdb211dab6aaf53 (patch) | |
tree | 312dbfda924627b0ff60dd1ee82430716733687b /loader/module.c | |
parent | 592d2e3edfe483d2fac4a7f53955c91cb91b946b (diff) | |
download | mpv-47f78d28f1298c9feccd2424ffdb211dab6aaf53.tar.bz2 mpv-47f78d28f1298c9feccd2424ffdb211dab6aaf53.tar.xz |
Add win32 loader support for OS/2
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@30541 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'loader/module.c')
-rw-r--r-- | loader/module.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/loader/module.c b/loader/module.c index 2bce928544..feaab14605 100644 --- a/loader/module.c +++ b/loader/module.c @@ -744,6 +744,31 @@ static int dump_component(char* name, int type, void* orig, ComponentParameters #ifdef EMU_QTX_API +#ifdef __OS2__ +uint32_t _System DosQueryMem(void *, uint32_t *, uint32_t *); +#endif + +static int is_invalid_ptr_handle(void *p) +{ +#ifdef __OS2__ + uint32_t cb = 1; + uint32_t fl; + + if(DosQueryMem(p, &cb, &fl)) + return 1; + + // Occasionally, ptr with 'EXEC' attr is passed. + // On OS/2, however, malloc() never sets 'EXEC' attr. + // So ptr with 'EXEC' attr is invalid. + if(fl & 0x04) + return 1; + + return 0; +#else + return (uint32_t)p >= 0x60000000; +#endif +} + static uint32_t ret_array[4096]; static int ret_i=0; @@ -844,10 +869,10 @@ static int report_func(void *stack_base, int stack_size, reg386_t *reg, uint32_t #endif return 1; case 0x15002f: //DisposePtr - if(((uint32_t *)stack_base)[1]>=0x60000000) + if(is_invalid_ptr_handle(((void **)stack_base)[1])) printf("WARNING! Invalid Ptr handle!\n"); else - free((void *)((uint32_t *)stack_base)[1]); + free(((void **)stack_base)[1]); reg->eax=0; #ifdef DEBUG_QTX_API printf("%*sLEAVE(%d): EMULATED! 0x%X\n",ret_i*2,"",ret_i, reg->eax); |