/********************************************************************** * _CallProcEx32W (KERNEL.518) */ DWORD WINAPIV CallProcEx32W16( DWORD nrofargs, DWORD argconvmask, FARPROC proc32, VA_LIST16 valist ) { DWORD args[32]; unsigned int i; TRACE("(%ld,%ld,%p args[",nrofargs,argconvmask,proc32); for (i=0;i<nrofargs;i++) { if (argconvmask & (1<<i)) { SEGPTR ptr = VA_ARG16( valist, SEGPTR ); args[i] = (DWORD)MapSL(ptr); TRACE("%08lx(%p),",ptr,MapSL(ptr)); } else { DWORD arg = VA_ARG16( valist, DWORD ); args[i] = arg; TRACE("%ld,", arg); } } TRACE("])\n"); return WOW_CallProc32W16( proc32, nrofargs, args ); }
/********************************************************************** * CallProc32W (KERNEL.517) */ DWORD WINAPIV CallProc32W16( DWORD nrofargs, DWORD argconvmask, FARPROC proc32, VA_LIST16 valist ) { DWORD args[32]; unsigned int i; TRACE("(%ld,%ld,%p args[",nrofargs,argconvmask,proc32); for (i=0;i<nrofargs;i++) { if (argconvmask & (1<<i)) { SEGPTR ptr = VA_ARG16( valist, SEGPTR ); /* pascal convention, have to reverse the arguments order */ args[nrofargs - i - 1] = (DWORD)MapSL(ptr); TRACE("%08lx(%p),",ptr,MapSL(ptr)); } else { DWORD arg = VA_ARG16( valist, DWORD ); /* pascal convention, have to reverse the arguments order */ args[nrofargs - i - 1] = arg; TRACE("%ld,", arg); } } TRACE("])\n"); /* POP nrofargs DWORD arguments and 3 DWORD parameters */ stack16_pop( (3 + nrofargs) * sizeof(DWORD) ); return WOW_CallProc32W16( proc32, nrofargs, args ); }
/********************************************************************** * WOW16Call (KERNEL.500) * * FIXME!!! * */ DWORD WINAPIV WOW16Call(WORD x, WORD y, WORD z, VA_LIST16 args) { int i; DWORD calladdr; FIXME("(0x%04x,0x%04x,%d),calling (",x,y,z); for (i=0;i<x/2;i++) { WORD a = VA_ARG16(args,WORD); DPRINTF("%04x ",a); } calladdr = VA_ARG16(args,DWORD); stack16_pop( 3*sizeof(WORD) + x + sizeof(DWORD) ); DPRINTF(") calling address was 0x%08lx\n",calladdr); return 0; }
/*********************************************************************** * _ICMessage [MSVIDEO.207] */ LRESULT VFWAPIV ICMessage16( HIC16 hic, UINT16 msg, UINT16 cb, VA_LIST16 valist ) { LPWORD lpData; SEGPTR segData; LRESULT ret; UINT16 i; lpData = HeapAlloc(GetProcessHeap(), 0, cb); TRACE("0x%08x, %u, %u, ...)\n", (DWORD) hic, msg, cb); for (i = 0; i < cb / sizeof(WORD); i++) { lpData[i] = VA_ARG16(valist, WORD); } segData = MapLS(lpData); ret = ICSendMessage16(hic, msg, segData, (DWORD) cb); UnMapLS(segData); HeapFree(GetProcessHeap(), 0, lpData); return ret; }
/*********************************************************************** * wvsnprintf16 (Not a Windows API) */ static INT16 wvsnprintf16( LPSTR buffer, UINT16 maxlen, LPCSTR spec, VA_LIST16 args ) { WPRINTF_FORMAT format; LPSTR p = buffer; UINT i, len, sign; CHAR number[20]; WPRINTF_DATA cur_arg; SEGPTR seg_str; while (*spec && (maxlen > 1)) { if (*spec != '%') { *p++ = *spec++; maxlen--; continue; } spec++; if (*spec == '%') { *p++ = *spec++; maxlen--; continue; } spec += WPRINTF_ParseFormatA( spec, &format ); switch(format.type) { case WPR_WCHAR: /* No Unicode in Win16 */ case WPR_CHAR: cur_arg.char_view = VA_ARG16( args, CHAR ); break; case WPR_WSTRING: /* No Unicode in Win16 */ case WPR_STRING: seg_str = VA_ARG16( args, SEGPTR ); if (IsBadReadPtr16(seg_str, 1 )) cur_arg.lpcstr_view = ""; else cur_arg.lpcstr_view = MapSL( seg_str ); break; case WPR_SIGNED: if (!(format.flags & WPRINTF_LONG)) { cur_arg.int_view = VA_ARG16( args, INT16 ); break; } /* fall through */ case WPR_HEXA: case WPR_UNSIGNED: if (format.flags & WPRINTF_LONG) cur_arg.int_view = VA_ARG16( args, UINT ); else cur_arg.int_view = VA_ARG16( args, UINT16 ); break; case WPR_UNKNOWN: continue; } len = WPRINTF_GetLen( &format, &cur_arg, number, maxlen - 1 ); sign = 0; if (!(format.flags & WPRINTF_LEFTALIGN)) for (i = format.precision; i < format.width; i++, maxlen--) *p++ = ' '; switch(format.type) { case WPR_WCHAR: /* No Unicode in Win16 */ case WPR_CHAR: *p= cur_arg.char_view; /* wsprintf16 (unlike wsprintf) ignores null characters */ if (*p != '\0') p++; else if (format.width > 1) *p++ = ' '; else len = 0; break; case WPR_WSTRING: /* No Unicode in Win16 */ case WPR_STRING: if (len) memcpy( p, cur_arg.lpcstr_view, len ); p += len; break; case WPR_HEXA: if ((format.flags & WPRINTF_PREFIX_HEX) && (maxlen > 3)) { *p++ = '0'; *p++ = (format.flags & WPRINTF_UPPER_HEX) ? 'X' : 'x'; maxlen -= 2; len -= 2; } /* fall through */ case WPR_SIGNED: /* Transfer the sign now, just in case it will be zero-padded*/ if (number[0] == '-') { *p++ = '-'; sign = 1; } /* fall through */ case WPR_UNSIGNED: for (i = len; i < format.precision; i++, maxlen--) *p++ = '0'; if (len > sign) memcpy( p, number + sign, len - sign ); p += len-sign; break; case WPR_UNKNOWN: continue; } if (format.flags & WPRINTF_LEFTALIGN) for (i = format.precision; i < format.width; i++, maxlen--) *p++ = ' '; maxlen -= len; } *p = 0; return (maxlen > 1) ? (INT)(p - buffer) : -1; }